mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	Add copy output platform (#472)
This commit is contained in:
		
							
								
								
									
										58
									
								
								esphome/components/output/copy.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								esphome/components/output/copy.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | |||||||
|  | import voluptuous as vol | ||||||
|  |  | ||||||
|  | from esphome.components import output | ||||||
|  | import esphome.config_validation as cv | ||||||
|  | from esphome.const import CONF_ID, CONF_OUTPUTS, CONF_TYPE | ||||||
|  | from esphome.cpp_generator import Pvariable, get_variable | ||||||
|  | from esphome.cpp_helpers import setup_component | ||||||
|  |  | ||||||
|  | BinaryCopyOutput = output.output_ns.class_('BinaryCopyOutput', output.BinaryOutput) | ||||||
|  | FloatCopyOutput = output.output_ns.class_('FloatCopyOutput', output.FloatOutput) | ||||||
|  |  | ||||||
|  | BINARY_SCHEMA = output.PLATFORM_SCHEMA.extend({ | ||||||
|  |     vol.Required(CONF_ID): cv.declare_variable_id(BinaryCopyOutput), | ||||||
|  |     vol.Required(CONF_TYPE): 'binary', | ||||||
|  |     vol.Required(CONF_OUTPUTS): cv.ensure_list(cv.use_variable_id(output.BinaryOutput)), | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | FLOAT_SCHEMA = output.PLATFORM_SCHEMA.extend({ | ||||||
|  |     vol.Required(CONF_ID): cv.declare_variable_id(FloatCopyOutput), | ||||||
|  |     vol.Required(CONF_TYPE): 'float', | ||||||
|  |     vol.Required(CONF_OUTPUTS): cv.ensure_list(cv.use_variable_id(output.FloatOutput)), | ||||||
|  | }) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def validate_copy_output(value): | ||||||
|  |     if not isinstance(value, dict): | ||||||
|  |         raise vol.Invalid("Value must be dict") | ||||||
|  |     type = cv.string_strict(value.get(CONF_TYPE, 'float')).lower() | ||||||
|  |     value[CONF_TYPE] = type | ||||||
|  |     if type == 'binary': | ||||||
|  |         return BINARY_SCHEMA(value) | ||||||
|  |     if type == 'float': | ||||||
|  |         return FLOAT_SCHEMA(value) | ||||||
|  |     raise vol.Invalid("type must either be binary or float, not {}!".format(type)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | PLATFORM_SCHEMA = validate_copy_output | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def to_code(config): | ||||||
|  |     outputs = [] | ||||||
|  |     for out in config[CONF_OUTPUTS]: | ||||||
|  |         for var in get_variable(out): | ||||||
|  |             yield | ||||||
|  |         outputs.append(var) | ||||||
|  |  | ||||||
|  |     klass = { | ||||||
|  |         'binary': BinaryCopyOutput, | ||||||
|  |         'float': FloatCopyOutput, | ||||||
|  |     }[config[CONF_TYPE]] | ||||||
|  |     rhs = klass.new(outputs) | ||||||
|  |     gpio = Pvariable(config[CONF_ID], rhs) | ||||||
|  |  | ||||||
|  |     output.setup_output_platform(gpio, config) | ||||||
|  |     setup_component(gpio, config) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | BUILD_FLAGS = '-DUSE_COPY_OUTPUT' | ||||||
| @@ -701,6 +701,18 @@ output: | |||||||
|   - platform: my9231 |   - platform: my9231 | ||||||
|     id: my_5 |     id: my_5 | ||||||
|     channel: 5 |     channel: 5 | ||||||
|  |   - platform: copy | ||||||
|  |     id: my_copy1 | ||||||
|  |     outputs: | ||||||
|  |       - my_1 | ||||||
|  |       - my_2 | ||||||
|  |       - my_3 | ||||||
|  |   - platform: copy | ||||||
|  |     id: my_copy2 | ||||||
|  |     type: binary | ||||||
|  |     outputs: | ||||||
|  |       - id22 | ||||||
|  |       - id2 | ||||||
|  |  | ||||||
| light: | light: | ||||||
|   - platform: binary |   - platform: binary | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user