From 75f566a7ab72e54e3afece2e6fdec1dbbdf44a33 Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Sat, 10 Nov 2018 23:35:37 +0100 Subject: [PATCH] Add inheritance tree --- esphomeyaml/automation.py | 35 +++++----- esphomeyaml/components/ads1115.py | 6 +- .../components/binary_sensor/__init__.py | 36 +++++----- .../binary_sensor/esp32_ble_tracker.py | 2 +- .../components/binary_sensor/esp32_touch.py | 3 +- esphomeyaml/components/binary_sensor/gpio.py | 8 ++- .../components/binary_sensor/nextion.py | 3 +- esphomeyaml/components/binary_sensor/pn532.py | 4 +- .../components/binary_sensor/rdm6300.py | 4 +- .../binary_sensor/remote_receiver.py | 25 ++++--- .../components/binary_sensor/status.py | 8 ++- .../components/binary_sensor/template.py | 8 ++- esphomeyaml/components/cover/__init__.py | 24 ++++--- esphomeyaml/components/cover/template.py | 5 +- esphomeyaml/components/dallas.py | 4 +- esphomeyaml/components/deep_sleep.py | 17 ++--- esphomeyaml/components/display/__init__.py | 2 +- esphomeyaml/components/display/lcd_gpio.py | 6 +- esphomeyaml/components/display/lcd_pcf8574.py | 7 +- esphomeyaml/components/display/max7219.py | 6 +- esphomeyaml/components/display/nextion.py | 7 +- esphomeyaml/components/display/ssd1306_i2c.py | 2 +- esphomeyaml/components/display/ssd1306_spi.py | 24 +++---- .../components/display/waveshare_epaper.py | 25 ++++--- esphomeyaml/components/esp32_ble_beacon.py | 4 +- esphomeyaml/components/esp32_ble_tracker.py | 10 ++- esphomeyaml/components/esp32_touch.py | 4 +- esphomeyaml/components/fan/__init__.py | 33 +++++----- esphomeyaml/components/fan/binary.py | 8 +-- esphomeyaml/components/fan/speed.py | 8 +-- esphomeyaml/components/font.py | 4 +- esphomeyaml/components/i2c.py | 5 +- esphomeyaml/components/image.py | 2 +- esphomeyaml/components/light/__init__.py | 66 +++++++++++-------- esphomeyaml/components/light/binary.py | 5 +- esphomeyaml/components/light/cwww.py | 6 +- .../components/light/fastled_clockless.py | 3 +- esphomeyaml/components/light/fastled_spi.py | 3 +- esphomeyaml/components/light/monochromatic.py | 5 +- esphomeyaml/components/light/rgb.py | 11 ++-- esphomeyaml/components/light/rgbw.py | 14 ++-- esphomeyaml/components/light/rgbww.py | 12 ++-- esphomeyaml/components/logger.py | 4 +- esphomeyaml/components/mqtt.py | 16 +++-- esphomeyaml/components/ota.py | 5 +- esphomeyaml/components/output/__init__.py | 18 +++-- esphomeyaml/components/output/esp8266_pwm.py | 5 +- esphomeyaml/components/output/gpio.py | 6 +- esphomeyaml/components/output/ledc.py | 4 +- esphomeyaml/components/output/pca9685.py | 2 +- esphomeyaml/components/pca9685.py | 7 +- esphomeyaml/components/pcf8574.py | 18 +++-- esphomeyaml/components/pn532.py | 9 +-- esphomeyaml/components/power_supply.py | 4 +- esphomeyaml/components/rdm6300.py | 10 +-- esphomeyaml/components/remote_receiver.py | 23 ++++--- esphomeyaml/components/remote_transmitter.py | 12 ++-- esphomeyaml/components/script.py | 7 +- esphomeyaml/components/sensor/__init__.py | 52 +++++++++------ esphomeyaml/components/sensor/adc.py | 4 +- esphomeyaml/components/sensor/ads1115.py | 32 ++++----- esphomeyaml/components/sensor/bh1750.py | 14 ++-- esphomeyaml/components/sensor/ble_rssi.py | 3 +- esphomeyaml/components/sensor/bme280.py | 44 ++++++++----- esphomeyaml/components/sensor/bme680.py | 56 ++++++++++------ esphomeyaml/components/sensor/bmp085.py | 14 +++- esphomeyaml/components/sensor/bmp280.py | 38 +++++++---- esphomeyaml/components/sensor/cse7766.py | 24 +++++-- esphomeyaml/components/sensor/dallas.py | 3 +- esphomeyaml/components/sensor/dht.py | 48 +++++++++----- esphomeyaml/components/sensor/dht12.py | 33 +++++++--- esphomeyaml/components/sensor/duty_cycle.py | 4 +- esphomeyaml/components/sensor/esp32_hall.py | 4 +- esphomeyaml/components/sensor/hdc1080.py | 24 +++++-- esphomeyaml/components/sensor/hlw8012.py | 25 ++++--- esphomeyaml/components/sensor/hmc5883l.py | 46 ++++++++----- esphomeyaml/components/sensor/htu21d.py | 25 +++++-- esphomeyaml/components/sensor/hx711.py | 13 ++-- esphomeyaml/components/sensor/ina219.py | 36 ++++++---- esphomeyaml/components/sensor/ina3221.py | 30 ++++++--- esphomeyaml/components/sensor/max6675.py | 9 ++- esphomeyaml/components/sensor/mhz19.py | 26 +++++--- esphomeyaml/components/sensor/mpu6050.py | 41 ++++++++---- .../components/sensor/mqtt_subscribe.py | 6 +- esphomeyaml/components/sensor/ms5611.py | 24 +++++-- esphomeyaml/components/sensor/pmsx003.py | 31 +++++---- .../components/sensor/pulse_counter.py | 14 ++-- .../components/sensor/rotary_encoder.py | 13 ++-- esphomeyaml/components/sensor/sht3xd.py | 26 ++++++-- esphomeyaml/components/sensor/tcs34725.py | 56 ++++++++++------ esphomeyaml/components/sensor/template.py | 4 +- .../components/sensor/total_daily_energy.py | 13 ++-- esphomeyaml/components/sensor/tsl2561.py | 21 +++--- esphomeyaml/components/sensor/ultrasonic.py | 5 +- esphomeyaml/components/sensor/uptime.py | 4 +- esphomeyaml/components/sensor/wifi_signal.py | 4 +- .../components/sensor/xiaomi_miflora.py | 26 ++++---- esphomeyaml/components/sensor/xiaomi_mijia.py | 16 ++--- esphomeyaml/components/spi.py | 5 +- esphomeyaml/components/status_led.py | 4 +- esphomeyaml/components/stepper/__init__.py | 13 ++-- esphomeyaml/components/stepper/a4988.py | 5 +- esphomeyaml/components/switch/__init__.py | 20 +++--- esphomeyaml/components/switch/gpio.py | 6 +- esphomeyaml/components/switch/output.py | 10 +-- .../components/switch/remote_transmitter.py | 28 ++++---- esphomeyaml/components/switch/restart.py | 4 +- esphomeyaml/components/switch/shutdown.py | 4 +- esphomeyaml/components/switch/template.py | 6 +- esphomeyaml/components/switch/uart.py | 11 ++-- .../components/text_sensor/__init__.py | 10 +-- .../components/text_sensor/mqtt_subscribe.py | 7 +- .../components/text_sensor/template.py | 7 +- esphomeyaml/components/text_sensor/version.py | 7 +- esphomeyaml/components/time/__init__.py | 7 +- esphomeyaml/components/time/sntp.py | 2 +- esphomeyaml/components/uart.py | 5 +- esphomeyaml/components/web_server.py | 7 +- esphomeyaml/components/wifi.py | 19 +++--- esphomeyaml/config.py | 28 ++++++-- esphomeyaml/helpers.py | 63 ++++++++++++++++-- esphomeyaml/pins.py | 9 ++- tests/test1.yaml | 6 +- 123 files changed, 1107 insertions(+), 721 deletions(-) diff --git a/esphomeyaml/automation.py b/esphomeyaml/automation.py index c8dd9dab54..43cc6fdf94 100644 --- a/esphomeyaml/automation.py +++ b/esphomeyaml/automation.py @@ -10,7 +10,8 @@ from esphomeyaml.const import CONF_ABOVE, CONF_ACTION_ID, CONF_AND, CONF_AUTOMAT CONF_OR, CONF_RANGE, CONF_THEN, CONF_TRIGGER_ID from esphomeyaml.core import ESPHomeYAMLError from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, TemplateArguments, add, add_job, \ - esphomelib_ns, float_, process_lambda, templatable, uint32, get_variable + esphomelib_ns, float_, process_lambda, templatable, uint32, get_variable, PollingComponent, \ + Action, Component, Trigger from esphomeyaml.util import ServiceRegistry @@ -48,7 +49,7 @@ def validate_recursive_action(value): u"".format(key, key2)) validator = ACTION_REGISTRY[key][0] value[i] = { - CONF_ACTION_ID: cv.declare_variable_id(None)(item[CONF_ACTION_ID]), + CONF_ACTION_ID: cv.declare_variable_id(Action)(item[CONF_ACTION_ID]), key: validator(item[key]) } return value @@ -57,14 +58,20 @@ def validate_recursive_action(value): ACTION_REGISTRY = ServiceRegistry() # pylint: disable=invalid-name -DelayAction = esphomelib_ns.DelayAction -LambdaAction = esphomelib_ns.LambdaAction -IfAction = esphomelib_ns.IfAction -UpdateComponentAction = esphomelib_ns.UpdateComponentAction -Automation = esphomelib_ns.Automation +DelayAction = esphomelib_ns.class_('DelayAction', Action, Component) +LambdaAction = esphomelib_ns.class_('LambdaAction', Action) +IfAction = esphomelib_ns.class_('IfAction', Action) +UpdateComponentAction = esphomelib_ns.class_('UpdateComponentAction', Action) +Automation = esphomelib_ns.class_('Automation') + +Condition = esphomelib_ns.class_('Condition') +AndCondition = esphomelib_ns.class_('AndCondition', Condition) +OrCondition = esphomelib_ns.class_('OrCondition', Condition) +RangeCondition = esphomelib_ns.class_('RangeCondition', Condition) +LambdaCondition = esphomelib_ns.class_('LambdaCondition', Condition) CONDITIONS_SCHEMA = vol.All(cv.ensure_list, [cv.templatable({ - cv.GenerateID(CONF_CONDITION_ID): cv.declare_variable_id(None), + cv.GenerateID(CONF_CONDITION_ID): cv.declare_variable_id(Condition), vol.Optional(CONF_AND): validate_recursive_condition, vol.Optional(CONF_OR): validate_recursive_condition, vol.Optional(CONF_RANGE): vol.All(vol.Schema({ @@ -74,12 +81,6 @@ CONDITIONS_SCHEMA = vol.All(cv.ensure_list, [cv.templatable({ vol.Optional(CONF_LAMBDA): cv.lambda_, })]) -# pylint: disable=invalid-name -AndCondition = esphomelib_ns.AndCondition -OrCondition = esphomelib_ns.OrCondition -RangeCondition = esphomelib_ns.RangeCondition -LambdaCondition = esphomelib_ns.LambdaCondition - def validate_automation(extra_schema=None, extra_validators=None, single=False): schema = AUTOMATION_SCHEMA.extend(extra_schema or {}) @@ -116,8 +117,8 @@ def validate_automation(extra_schema=None, extra_validators=None, single=False): AUTOMATION_SCHEMA = vol.Schema({ - cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(None), - cv.GenerateID(CONF_AUTOMATION_ID): cv.declare_variable_id(None), + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(Trigger), + cv.GenerateID(CONF_AUTOMATION_ID): cv.declare_variable_id(Automation), vol.Optional(CONF_IF): CONDITIONS_SCHEMA, vol.Required(CONF_THEN): validate_recursive_action, }) @@ -225,7 +226,7 @@ def lambda_action_to_code(config, action_id, arg_type): CONF_COMPONENT_UPDATE = 'component.update' COMPONENT_UPDATE_ACTION_SCHEMA = maybe_simple_id({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(PollingComponent), }) diff --git a/esphomeyaml/components/ads1115.py b/esphomeyaml/components/ads1115.py index 1423434fec..d8d1d9b7cd 100644 --- a/esphomeyaml/components/ads1115.py +++ b/esphomeyaml/components/ads1115.py @@ -1,13 +1,13 @@ import voluptuous as vol -from esphomeyaml.components import sensor +from esphomeyaml.components import sensor, i2c import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_ADDRESS, CONF_ID -from esphomeyaml.helpers import App, Pvariable, setup_component +from esphomeyaml.helpers import App, Pvariable, setup_component, Component DEPENDENCIES = ['i2c'] -ADS1115Component = sensor.sensor_ns.ADS1115Component +ADS1115Component = sensor.sensor_ns.class_('ADS1115Component', Component, i2c.I2CDevice) ADS1115_SCHEMA = vol.Schema({ cv.GenerateID(): cv.declare_variable_id(ADS1115Component), diff --git a/esphomeyaml/components/binary_sensor/__init__.py b/esphomeyaml/components/binary_sensor/__init__.py index 232f6a8dbc..417a069726 100644 --- a/esphomeyaml/components/binary_sensor/__init__.py +++ b/esphomeyaml/components/binary_sensor/__init__.py @@ -9,7 +9,8 @@ from esphomeyaml.const import CONF_DELAYED_OFF, CONF_DELAYED_ON, CONF_DEVICE_CLA CONF_ON_DOUBLE_CLICK, CONF_ON_MULTI_CLICK, CONF_ON_PRESS, CONF_ON_RELEASE, CONF_STATE, \ CONF_TIMING, CONF_TRIGGER_ID from esphomeyaml.helpers import App, ArrayInitializer, NoArg, Pvariable, StructInitializer, add, \ - add_job, bool_, esphomelib_ns, process_lambda, setup_mqtt_component + add_job, bool_, esphomelib_ns, process_lambda, setup_mqtt_component, Nameable, Trigger, \ + Component DEVICE_CLASSES = [ '', 'battery', 'cold', 'connectivity', 'door', 'garage_door', 'gas', @@ -23,19 +24,25 @@ PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ }) binary_sensor_ns = esphomelib_ns.namespace('binary_sensor') -PressTrigger = binary_sensor_ns.PressTrigger -ReleaseTrigger = binary_sensor_ns.ReleaseTrigger -ClickTrigger = binary_sensor_ns.ClickTrigger -DoubleClickTrigger = binary_sensor_ns.DoubleClickTrigger -MultiClickTrigger = binary_sensor_ns.MultiClickTrigger -MultiClickTriggerEvent = binary_sensor_ns.MultiClickTriggerEvent -BinarySensor = binary_sensor_ns.BinarySensor -InvertFilter = binary_sensor_ns.InvertFilter -LambdaFilter = binary_sensor_ns.LambdaFilter -DelayedOnFilter = binary_sensor_ns.DelayedOnFilter -DelayedOffFilter = binary_sensor_ns.DelayedOffFilter -HeartbeatFilter = binary_sensor_ns.HeartbeatFilter -MQTTBinarySensorComponent = binary_sensor_ns.MQTTBinarySensorComponent +BinarySensor = binary_sensor_ns.class_('BinarySensor', Nameable) +MQTTBinarySensorComponent = binary_sensor_ns.class_('MQTTBinarySensorComponent', mqtt.MQTTComponent) + +# Triggers +PressTrigger = binary_sensor_ns.class_('PressTrigger', Trigger.template(NoArg)) +ReleaseTrigger = binary_sensor_ns.class_('ReleaseTrigger', Trigger.template(NoArg)) +ClickTrigger = binary_sensor_ns.class_('ClickTrigger', Trigger.template(NoArg)) +DoubleClickTrigger = binary_sensor_ns.class_('DoubleClickTrigger', Trigger.template(NoArg)) +MultiClickTrigger = binary_sensor_ns.class_('MultiClickTrigger', Trigger.template(NoArg), Component) +MultiClickTriggerEvent = binary_sensor_ns.struct('MultiClickTriggerEvent') + +# Filters +Filter = binary_sensor_ns.class_('Filter') +DelayedOnFilter = binary_sensor_ns.class_('DelayedOnFilter', Filter, Component) +DelayedOffFilter = binary_sensor_ns.class_('DelayedOffFilter', Filter, Component) +HeartbeatFilter = binary_sensor_ns.class_('HeartbeatFilter', Filter, Component) +InvertFilter = binary_sensor_ns.class_('InvertFilter', Filter) +LambdaFilter = binary_sensor_ns.class_('LambdaFilter') + FILTER_KEYS = [CONF_INVERT, CONF_DELAYED_ON, CONF_DELAYED_OFF, CONF_LAMBDA, CONF_HEARTBEAT] @@ -142,7 +149,6 @@ def validate_multi_click_timing(value): BINARY_SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend({ cv.GenerateID(CONF_MQTT_ID): cv.declare_variable_id(MQTTBinarySensorComponent), - cv.GenerateID(): cv.declare_variable_id(BinarySensor), vol.Optional(CONF_DEVICE_CLASS): vol.All(vol.Lower, cv.one_of(*DEVICE_CLASSES)), vol.Optional(CONF_FILTERS): FILTERS_SCHEMA, diff --git a/esphomeyaml/components/binary_sensor/esp32_ble_tracker.py b/esphomeyaml/components/binary_sensor/esp32_ble_tracker.py index 7208afabc6..63e08a0baf 100644 --- a/esphomeyaml/components/binary_sensor/esp32_ble_tracker.py +++ b/esphomeyaml/components/binary_sensor/esp32_ble_tracker.py @@ -8,7 +8,7 @@ from esphomeyaml.const import CONF_MAC_ADDRESS, CONF_NAME from esphomeyaml.helpers import esphomelib_ns, get_variable DEPENDENCIES = ['esp32_ble_tracker'] -ESP32BLEPresenceDevice = esphomelib_ns.ESP32BLEPresenceDevice +ESP32BLEPresenceDevice = esphomelib_ns.class_('ESP32BLEPresenceDevice', binary_sensor.BinarySensor) PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(ESP32BLEPresenceDevice), diff --git a/esphomeyaml/components/binary_sensor/esp32_touch.py b/esphomeyaml/components/binary_sensor/esp32_touch.py index 7ebde4e93b..fcf01e664c 100644 --- a/esphomeyaml/components/binary_sensor/esp32_touch.py +++ b/esphomeyaml/components/binary_sensor/esp32_touch.py @@ -34,7 +34,8 @@ def validate_touch_pad(value): return value -ESP32TouchBinarySensor = binary_sensor.binary_sensor_ns.ESP32TouchBinarySensor +ESP32TouchBinarySensor = binary_sensor.binary_sensor_ns.class_('ESP32TouchBinarySensor', + binary_sensor.BinarySensor) PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(ESP32TouchBinarySensor), diff --git a/esphomeyaml/components/binary_sensor/gpio.py b/esphomeyaml/components/binary_sensor/gpio.py index ede67296c3..80a6d2b487 100644 --- a/esphomeyaml/components/binary_sensor/gpio.py +++ b/esphomeyaml/components/binary_sensor/gpio.py @@ -5,10 +5,12 @@ from esphomeyaml import pins from esphomeyaml.components import binary_sensor from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_PIN from esphomeyaml.helpers import App, gpio_input_pin_expression, variable, Application, \ - setup_component + setup_component, Component -MakeGPIOBinarySensor = Application.MakeGPIOBinarySensor -GPIOBinarySensorComponent = binary_sensor.binary_sensor_ns.GPIOBinarySensorComponent +MakeGPIOBinarySensor = Application.struct('MakeGPIOBinarySensor') +GPIOBinarySensorComponent = binary_sensor.binary_sensor_ns.class_('GPIOBinarySensorComponent', + binary_sensor.BinarySensor, + Component) PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(GPIOBinarySensorComponent), diff --git a/esphomeyaml/components/binary_sensor/nextion.py b/esphomeyaml/components/binary_sensor/nextion.py index 981e85dbb0..162392d223 100644 --- a/esphomeyaml/components/binary_sensor/nextion.py +++ b/esphomeyaml/components/binary_sensor/nextion.py @@ -10,7 +10,8 @@ DEPENDENCIES = ['display'] CONF_NEXTION_ID = 'nextion_id' -NextionTouchComponent = display.display_ns.NextionTouchComponent +NextionTouchComponent = display.display_ns.class_('NextionTouchComponent', + binary_sensor.BinarySensor) PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(NextionTouchComponent), diff --git a/esphomeyaml/components/binary_sensor/pn532.py b/esphomeyaml/components/binary_sensor/pn532.py index fab8482391..38031b650c 100644 --- a/esphomeyaml/components/binary_sensor/pn532.py +++ b/esphomeyaml/components/binary_sensor/pn532.py @@ -27,7 +27,8 @@ def validate_uid(value): return value -PN532BinarySensor = binary_sensor.binary_sensor_ns.PN532BinarySensor +PN532BinarySensor = binary_sensor.binary_sensor_ns.class_('PN532BinarySensor', + binary_sensor.BinarySensor) PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(PN532BinarySensor), @@ -37,7 +38,6 @@ PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend def to_code(config): - hub = None for hub in get_variable(config[CONF_PN532_ID]): yield addr = [HexInt(int(x, 16)) for x in config[CONF_UID].split('-')] diff --git a/esphomeyaml/components/binary_sensor/rdm6300.py b/esphomeyaml/components/binary_sensor/rdm6300.py index ff51f973db..c4a11e4f31 100644 --- a/esphomeyaml/components/binary_sensor/rdm6300.py +++ b/esphomeyaml/components/binary_sensor/rdm6300.py @@ -9,7 +9,8 @@ DEPENDENCIES = ['rdm6300'] CONF_RDM6300_ID = 'rdm6300_id' -RDM6300BinarySensor = binary_sensor.binary_sensor_ns.RDM6300BinarySensor +RDM6300BinarySensor = binary_sensor.binary_sensor_ns.class_('RDM6300BinarySensor', + binary_sensor.BinarySensor) PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(RDM6300BinarySensor), @@ -19,7 +20,6 @@ PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend def to_code(config): - hub = None for hub in get_variable(config[CONF_RDM6300_ID]): yield rhs = hub.make_card(config[CONF_NAME], config[CONF_UID]) diff --git a/esphomeyaml/components/binary_sensor/remote_receiver.py b/esphomeyaml/components/binary_sensor/remote_receiver.py index e2ef0f43c5..4d66caca44 100644 --- a/esphomeyaml/components/binary_sensor/remote_receiver.py +++ b/esphomeyaml/components/binary_sensor/remote_receiver.py @@ -22,18 +22,18 @@ REMOTE_KEYS = [CONF_NEC, CONF_LG, CONF_SONY, CONF_PANASONIC, CONF_SAMSUNG, CONF_ CONF_REMOTE_RECEIVER_ID = 'remote_receiver_id' CONF_RECEIVER_ID = 'receiver_id' -RemoteReceiver = remote_ns.RemoteReceiver -LGReceiver = remote_ns.LGReceiver -NECReceiver = remote_ns.NECReceiver -PanasonicReceiver = remote_ns.PanasonicReceiver -RawReceiver = remote_ns.RawReceiver -SamsungReceiver = remote_ns.SamsungReceiver -SonyReceiver = remote_ns.SonyReceiver -RCSwitchRawReceiver = remote_ns.RCSwitchRawReceiver -RCSwitchTypeAReceiver = remote_ns.RCSwitchTypeAReceiver -RCSwitchTypeBReceiver = remote_ns.RCSwitchTypeBReceiver -RCSwitchTypeCReceiver = remote_ns.RCSwitchTypeCReceiver -RCSwitchTypeDReceiver = remote_ns.RCSwitchTypeDReceiver +RemoteReceiver = remote_ns.class_('RemoteReceiver', binary_sensor.BinarySensor) +LGReceiver = remote_ns.class_('LGReceiver', RemoteReceiver) +NECReceiver = remote_ns.class_('NECReceiver', RemoteReceiver) +PanasonicReceiver = remote_ns.class_('PanasonicReceiver', RemoteReceiver) +RawReceiver = remote_ns.class_('RawReceiver', RemoteReceiver) +SamsungReceiver = remote_ns.class_('SamsungReceiver', RemoteReceiver) +SonyReceiver = remote_ns.class_('SonyReceiver', RemoteReceiver) +RCSwitchRawReceiver = remote_ns.class_('RCSwitchRawReceiver', RemoteReceiver) +RCSwitchTypeAReceiver = remote_ns.class_('RCSwitchTypeAReceiver', RCSwitchRawReceiver) +RCSwitchTypeBReceiver = remote_ns.class_('RCSwitchTypeBReceiver', RCSwitchRawReceiver) +RCSwitchTypeCReceiver = remote_ns.class_('RCSwitchTypeCReceiver', RCSwitchRawReceiver) +RCSwitchTypeDReceiver = remote_ns.class_('RCSwitchTypeDReceiver', RCSwitchRawReceiver) PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(RemoteReceiver), @@ -110,7 +110,6 @@ def receiver_base(full_config): def to_code(config): - remote = None for remote in get_variable(config[CONF_REMOTE_RECEIVER_ID]): yield rhs = receiver_base(config) diff --git a/esphomeyaml/components/binary_sensor/status.py b/esphomeyaml/components/binary_sensor/status.py index 10ff7960c7..5fca06cf93 100644 --- a/esphomeyaml/components/binary_sensor/status.py +++ b/esphomeyaml/components/binary_sensor/status.py @@ -1,12 +1,14 @@ import esphomeyaml.config_validation as cv from esphomeyaml.components import binary_sensor from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME -from esphomeyaml.helpers import App, Application, variable, setup_component +from esphomeyaml.helpers import App, Application, variable, setup_component, Component DEPENDENCIES = ['mqtt'] -MakeStatusBinarySensor = Application.MakeStatusBinarySensor -StatusBinarySensor = binary_sensor.binary_sensor_ns.StatusBinarySensor +MakeStatusBinarySensor = Application.struct('MakeStatusBinarySensor') +StatusBinarySensor = binary_sensor.binary_sensor_ns.class_('StatusBinarySensor', + binary_sensor.BinarySensor, + Component) PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeStatusBinarySensor), diff --git a/esphomeyaml/components/binary_sensor/template.py b/esphomeyaml/components/binary_sensor/template.py index c86d053e7b..3369b50aab 100644 --- a/esphomeyaml/components/binary_sensor/template.py +++ b/esphomeyaml/components/binary_sensor/template.py @@ -4,10 +4,12 @@ from esphomeyaml.components import binary_sensor import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_LAMBDA, CONF_MAKE_ID, CONF_NAME from esphomeyaml.helpers import App, Application, add, bool_, optional, process_lambda, variable, \ - setup_component + setup_component, Component -MakeTemplateBinarySensor = Application.MakeTemplateBinarySensor -TemplateBinarySensor = binary_sensor.binary_sensor_ns.TemplateBinarySensor +MakeTemplateBinarySensor = Application.struct('MakeTemplateBinarySensor') +TemplateBinarySensor = binary_sensor.binary_sensor_ns.class_('TemplateBinarySensor', + binary_sensor.BinarySensor, + Component) PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(TemplateBinarySensor), diff --git a/esphomeyaml/components/cover/__init__.py b/esphomeyaml/components/cover/__init__.py index b768804d60..a121ce9b08 100644 --- a/esphomeyaml/components/cover/__init__.py +++ b/esphomeyaml/components/cover/__init__.py @@ -5,21 +5,25 @@ from esphomeyaml.components import mqtt import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_ID, CONF_MQTT_ID, CONF_INTERNAL from esphomeyaml.helpers import Pvariable, esphomelib_ns, setup_mqtt_component, add, \ - TemplateArguments, get_variable + TemplateArguments, get_variable, Action, Nameable PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ }) cover_ns = esphomelib_ns.namespace('cover') -Cover = cover_ns.Cover -MQTTCoverComponent = cover_ns.MQTTCoverComponent -CoverState = cover_ns.CoverState + +Cover = cover_ns.class_('Cover', Nameable) +MQTTCoverComponent = cover_ns.class_('MQTTCoverComponent', mqtt.MQTTComponent) + +CoverState = cover_ns.class_('CoverState') COVER_OPEN = cover_ns.COVER_OPEN COVER_CLOSED = cover_ns.COVER_CLOSED -OpenAction = cover_ns.OpenAction -CloseAction = cover_ns.CloseAction -StopAction = cover_ns.StopAction + +# Actions +OpenAction = cover_ns.class_('OpenAction', Action) +CloseAction = cover_ns.class_('CloseAction', Action) +StopAction = cover_ns.class_('StopAction', Action) COVER_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(Cover), @@ -45,7 +49,7 @@ BUILD_FLAGS = '-DUSE_COVER' CONF_COVER_OPEN = 'cover.open' COVER_OPEN_ACTION_SCHEMA = maybe_simple_id({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(Cover), }) @@ -61,7 +65,7 @@ def cover_open_to_code(config, action_id, arg_type): CONF_COVER_CLOSE = 'cover.close' COVER_CLOSE_ACTION_SCHEMA = maybe_simple_id({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(Cover), }) @@ -77,7 +81,7 @@ def cover_close_to_code(config, action_id, arg_type): CONF_COVER_STOP = 'cover.stop' COVER_STOP_ACTION_SCHEMA = maybe_simple_id({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(Cover), }) diff --git a/esphomeyaml/components/cover/template.py b/esphomeyaml/components/cover/template.py index 7c4c1b2d0f..564c13ceb4 100644 --- a/esphomeyaml/components/cover/template.py +++ b/esphomeyaml/components/cover/template.py @@ -8,10 +8,12 @@ from esphomeyaml.const import CONF_CLOSE_ACTION, CONF_LAMBDA, CONF_MAKE_ID, CONF from esphomeyaml.helpers import App, Application, NoArg, add, process_lambda, variable, optional, \ setup_component -MakeTemplateCover = Application.MakeTemplateCover +MakeTemplateCover = Application.struct('MakeTemplateCover') +TemplateCover = cover.cover_ns.class_('TemplateCover', cover.Cover) PLATFORM_SCHEMA = cv.nameable(cover.COVER_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTemplateCover), + cv.GenerateID(): cv.declare_variable_id(TemplateCover), vol.Optional(CONF_LAMBDA): cv.lambda_, vol.Optional(CONF_OPTIMISTIC): cv.boolean, vol.Optional(CONF_OPEN_ACTION): automation.validate_automation(single=True), @@ -28,7 +30,6 @@ def to_code(config): setup_component(make.Ptemplate_, config) if CONF_LAMBDA in config: - template_ = None for template_ in process_lambda(config[CONF_LAMBDA], [], return_type=optional.template(cover.CoverState)): yield diff --git a/esphomeyaml/components/dallas.py b/esphomeyaml/components/dallas.py index 9ebf60b167..eae9fa9c82 100644 --- a/esphomeyaml/components/dallas.py +++ b/esphomeyaml/components/dallas.py @@ -4,9 +4,9 @@ import esphomeyaml.config_validation as cv from esphomeyaml import pins from esphomeyaml.components import sensor from esphomeyaml.const import CONF_ID, CONF_PIN, CONF_UPDATE_INTERVAL -from esphomeyaml.helpers import App, Pvariable, setup_component +from esphomeyaml.helpers import App, Pvariable, setup_component, PollingComponent -DallasComponent = sensor.sensor_ns.DallasComponent +DallasComponent = sensor.sensor_ns.class_('DallasComponent', PollingComponent) CONFIG_SCHEMA = vol.All(cv.ensure_list, [vol.Schema({ cv.GenerateID(): cv.declare_variable_id(DallasComponent), diff --git a/esphomeyaml/components/deep_sleep.py b/esphomeyaml/components/deep_sleep.py index 116cdf7400..cef05fce51 100644 --- a/esphomeyaml/components/deep_sleep.py +++ b/esphomeyaml/components/deep_sleep.py @@ -3,9 +3,9 @@ import voluptuous as vol from esphomeyaml import config_validation as cv, pins from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY from esphomeyaml.const import CONF_ID, CONF_NUMBER, CONF_RUN_CYCLES, CONF_RUN_DURATION, \ - CONF_SLEEP_DURATION, CONF_WAKEUP_PIN + CONF_SLEEP_DURATION, CONF_WAKEUP_PIN, CONF_ACTION_ID from esphomeyaml.helpers import App, Pvariable, add, gpio_input_pin_expression, esphomelib_ns, \ - TemplateArguments, get_variable, setup_component + TemplateArguments, get_variable, setup_component, Component, Action def validate_pin_number(value): @@ -16,14 +16,15 @@ def validate_pin_number(value): return value -DeepSleepComponent = esphomelib_ns.DeepSleepComponent -EnterDeepSleepAction = esphomelib_ns.EnterDeepSleepAction -PreventDeepSleepAction = esphomelib_ns.PreventDeepSleepAction +DeepSleepComponent = esphomelib_ns.class_('DeepSleepComponent', Component) +EnterDeepSleepAction = esphomelib_ns.class_('EnterDeepSleepAction', Action) +PreventDeepSleepAction = esphomelib_ns.class_('PreventDeepSleepAction', Action) +WakeupPinMode = esphomelib_ns.enum('WakeupPinMode') WAKEUP_PIN_MODES = { - 'IGNORE': esphomelib_ns.WAKEUP_PIN_MODE_IGNORE, - 'KEEP_AWAKE': esphomelib_ns.WAKEUP_PIN_MODE_KEEP_AWAKE, - 'INVERT_WAKEUP': esphomelib_ns.WAKEUP_PIN_MODE_INVERT_WAKEUP, + 'IGNORE': WakeupPinMode.WAKEUP_PIN_MODE_IGNORE, + 'KEEP_AWAKE': WakeupPinMode.WAKEUP_PIN_MODE_KEEP_AWAKE, + 'INVERT_WAKEUP': WakeupPinMode.WAKEUP_PIN_MODE_INVERT_WAKEUP, } CONF_WAKEUP_PIN_MODE = 'wakeup_pin_mode' diff --git a/esphomeyaml/components/display/__init__.py b/esphomeyaml/components/display/__init__.py index cada701f87..ffcaabecb6 100644 --- a/esphomeyaml/components/display/__init__.py +++ b/esphomeyaml/components/display/__init__.py @@ -10,7 +10,7 @@ PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ }) display_ns = esphomelib_ns.namespace('display') -DisplayBuffer = display_ns.DisplayBuffer +DisplayBuffer = display_ns.class_('DisplayBuffer') DisplayBufferRef = DisplayBuffer.operator('ref') DISPLAY_ROTATIONS = { diff --git a/esphomeyaml/components/display/lcd_gpio.py b/esphomeyaml/components/display/lcd_gpio.py index 989187bf59..d36ac780e8 100644 --- a/esphomeyaml/components/display/lcd_gpio.py +++ b/esphomeyaml/components/display/lcd_gpio.py @@ -6,11 +6,11 @@ from esphomeyaml.components import display from esphomeyaml.const import CONF_DATA_PINS, CONF_DIMENSIONS, CONF_ENABLE_PIN, CONF_ID, \ CONF_LAMBDA, CONF_RS_PIN, CONF_RW_PIN from esphomeyaml.helpers import App, Pvariable, add, gpio_output_pin_expression, process_lambda, \ - setup_component + setup_component, PollingComponent -GPIOLCDDisplay = display.display_ns.GPIOLCDDisplay -LCDDisplay = display.display_ns.LCDDisplay +LCDDisplay = display.display_ns.class_('LCDDisplay', PollingComponent) LCDDisplayRef = LCDDisplay.operator('ref') +GPIOLCDDisplay = display.display_ns.class_('GPIOLCDDisplay', LCDDisplay) def validate_lcd_dimensions(value): diff --git a/esphomeyaml/components/display/lcd_pcf8574.py b/esphomeyaml/components/display/lcd_pcf8574.py index 49f8b6d87d..761203c212 100644 --- a/esphomeyaml/components/display/lcd_pcf8574.py +++ b/esphomeyaml/components/display/lcd_pcf8574.py @@ -1,14 +1,15 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import display -from esphomeyaml.components.display.lcd_gpio import LCDDisplayRef, validate_lcd_dimensions +from esphomeyaml.components import display, i2c +from esphomeyaml.components.display.lcd_gpio import LCDDisplayRef, validate_lcd_dimensions, \ + LCDDisplay from esphomeyaml.const import CONF_ADDRESS, CONF_DIMENSIONS, CONF_ID, CONF_LAMBDA from esphomeyaml.helpers import App, Pvariable, add, process_lambda, setup_component DEPENDENCIES = ['i2c'] -PCF8574LCDDisplay = display.display_ns.PCF8574LCDDisplay +PCF8574LCDDisplay = display.display_ns.class_('PCF8574LCDDisplay', LCDDisplay, i2c.I2CDevice) PLATFORM_SCHEMA = display.BASIC_DISPLAY_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(PCF8574LCDDisplay), diff --git a/esphomeyaml/components/display/max7219.py b/esphomeyaml/components/display/max7219.py index 7f5973892d..297f952085 100644 --- a/esphomeyaml/components/display/max7219.py +++ b/esphomeyaml/components/display/max7219.py @@ -2,16 +2,16 @@ import voluptuous as vol import esphomeyaml.config_validation as cv from esphomeyaml import pins -from esphomeyaml.components import display +from esphomeyaml.components import display, spi from esphomeyaml.components.spi import SPIComponent from esphomeyaml.const import CONF_CS_PIN, CONF_ID, CONF_INTENSITY, CONF_LAMBDA, CONF_NUM_CHIPS, \ CONF_SPI_ID from esphomeyaml.helpers import App, Pvariable, add, get_variable, gpio_output_pin_expression, \ - process_lambda, setup_component + process_lambda, setup_component, PollingComponent DEPENDENCIES = ['spi'] -MAX7219Component = display.display_ns.MAX7219Component +MAX7219Component = display.display_ns.class_('MAX7219Component', PollingComponent, spi.SPIDevice) MAX7219ComponentRef = MAX7219Component.operator('ref') PLATFORM_SCHEMA = display.BASIC_DISPLAY_PLATFORM_SCHEMA.extend({ diff --git a/esphomeyaml/components/display/nextion.py b/esphomeyaml/components/display/nextion.py index b9e4da78cb..17527ec8ce 100644 --- a/esphomeyaml/components/display/nextion.py +++ b/esphomeyaml/components/display/nextion.py @@ -1,12 +1,13 @@ import esphomeyaml.config_validation as cv -from esphomeyaml.components import display +from esphomeyaml.components import display, uart from esphomeyaml.components.uart import UARTComponent from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_UART_ID -from esphomeyaml.helpers import App, Pvariable, add, get_variable, process_lambda, setup_component +from esphomeyaml.helpers import App, Pvariable, add, get_variable, process_lambda, setup_component, \ + PollingComponent DEPENDENCIES = ['uart'] -Nextion = display.display_ns.Nextion +Nextion = display.display_ns.class_('Nextion', PollingComponent, uart.UARTDevice) NextionRef = Nextion.operator('ref') PLATFORM_SCHEMA = display.BASIC_DISPLAY_PLATFORM_SCHEMA.extend({ diff --git a/esphomeyaml/components/display/ssd1306_i2c.py b/esphomeyaml/components/display/ssd1306_i2c.py index 7ad66ae925..a80ba8d5b5 100644 --- a/esphomeyaml/components/display/ssd1306_i2c.py +++ b/esphomeyaml/components/display/ssd1306_i2c.py @@ -11,7 +11,7 @@ from esphomeyaml.helpers import App, Pvariable, add, \ DEPENDENCIES = ['i2c'] -I2CSSD1306 = display.display_ns.I2CSSD1306 +I2CSSD1306 = display.display_ns.class_('I2CSSD1306', ssd1306_spi.SSD1306) PLATFORM_SCHEMA = display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(I2CSSD1306), diff --git a/esphomeyaml/components/display/ssd1306_spi.py b/esphomeyaml/components/display/ssd1306_spi.py index fa1102cfac..e4dbb6a8f9 100644 --- a/esphomeyaml/components/display/ssd1306_spi.py +++ b/esphomeyaml/components/display/ssd1306_spi.py @@ -2,27 +2,29 @@ import voluptuous as vol import esphomeyaml.config_validation as cv from esphomeyaml import pins -from esphomeyaml.components import display +from esphomeyaml.components import display, spi from esphomeyaml.components.spi import SPIComponent from esphomeyaml.const import CONF_CS_PIN, CONF_DC_PIN, CONF_EXTERNAL_VCC, \ CONF_ID, CONF_MODEL, \ CONF_RESET_PIN, CONF_SPI_ID, CONF_LAMBDA from esphomeyaml.helpers import App, Pvariable, add, get_variable, \ - gpio_output_pin_expression, process_lambda, setup_component + gpio_output_pin_expression, process_lambda, setup_component, PollingComponent DEPENDENCIES = ['spi'] -SPISSD1306 = display.display_ns.SPISSD1306 +SSD1306 = display.display_ns.class_('SSD1306', PollingComponent, display.DisplayBuffer) +SPISSD1306 = display.display_ns.class_('SPISSD1306', SSD1306, spi.SPIDevice) +SSD1306Model = display.display_ns.enum('SSD1306Model') MODELS = { - 'SSD1306_128X32': display.display_ns.SSD1306_MODEL_128_32, - 'SSD1306_128X64': display.display_ns.SSD1306_MODEL_128_64, - 'SSD1306_96X16': display.display_ns.SSD1306_MODEL_96_16, - 'SSD1306_64X48': display.display_ns.SSD1306_MODEL_64_48, - 'SH1106_128X32': display.display_ns.SH1106_MODEL_128_32, - 'SH1106_128X64': display.display_ns.SH1106_MODEL_128_64, - 'SH1106_96X16': display.display_ns.SH1106_MODEL_96_16, - 'SH1106_64X48': display.display_ns.SH1106_MODEL_64_48, + 'SSD1306_128X32': SSD1306Model.SSD1306_MODEL_128_32, + 'SSD1306_128X64': SSD1306Model.SSD1306_MODEL_128_64, + 'SSD1306_96X16': SSD1306Model.SSD1306_MODEL_96_16, + 'SSD1306_64X48': SSD1306Model.SSD1306_MODEL_64_48, + 'SH1106_128X32': SSD1306Model.SH1106_MODEL_128_32, + 'SH1106_128X64': SSD1306Model.SH1106_MODEL_128_64, + 'SH1106_96X16': SSD1306Model.SH1106_MODEL_96_16, + 'SH1106_64X48': SSD1306Model.SH1106_MODEL_64_48, } SSD1306_MODEL = vol.All(vol.Upper, vol.Replace(' ', '_'), cv.one_of(*MODELS)) diff --git a/esphomeyaml/components/display/waveshare_epaper.py b/esphomeyaml/components/display/waveshare_epaper.py index 2507cabfb5..b3c9ceb0b3 100644 --- a/esphomeyaml/components/display/waveshare_epaper.py +++ b/esphomeyaml/components/display/waveshare_epaper.py @@ -2,25 +2,30 @@ import voluptuous as vol import esphomeyaml.config_validation as cv from esphomeyaml import pins -from esphomeyaml.components import display +from esphomeyaml.components import display, spi from esphomeyaml.components.spi import SPIComponent from esphomeyaml.const import CONF_BUSY_PIN, CONF_CS_PIN, CONF_DC_PIN, CONF_FULL_UPDATE_EVERY, \ CONF_ID, CONF_LAMBDA, CONF_MODEL, CONF_RESET_PIN, CONF_SPI_ID from esphomeyaml.helpers import App, Pvariable, add, get_variable, gpio_input_pin_expression, \ - gpio_output_pin_expression, process_lambda, setup_component + gpio_output_pin_expression, process_lambda, setup_component, PollingComponent DEPENDENCIES = ['spi'] WaveshareEPaperTypeA = display.display_ns.WaveshareEPaperTypeA -WaveshareEPaper = display.display_ns.WaveshareEPaper +WaveshareEPaper = display.display_ns.class_('WaveshareEPaper', + PollingComponent, spi.SPIDevice, display.DisplayBuffer) + + +WaveshareEPaperTypeAModel = display.display_ns.enum('WaveshareEPaperTypeAModel') +WaveshareEPaperTypeBModel = display.display_ns.enum('WaveshareEPaperTypeBModel') MODELS = { - '1.54in': ('a', display.display_ns.WAVESHARE_EPAPER_1_54_IN), - '2.13in': ('a', display.display_ns.WAVESHARE_EPAPER_2_13_IN), - '2.90in': ('a', display.display_ns.WAVESHARE_EPAPER_2_9_IN), - '2.70in': ('b', display.display_ns.WAVESHARE_EPAPER_2_7_IN), - '4.20in': ('b', display.display_ns.WAVESHARE_EPAPER_4_2_IN), - '7.50in': ('b', display.display_ns.WAVESHARE_EPAPER_7_5_IN), + '1.54in': ('a', WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_1_54_IN), + '2.13in': ('a', WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_2_13_IN), + '2.90in': ('a', WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_2_9_IN), + '2.70in': ('b', WaveshareEPaperTypeBModel.WAVESHARE_EPAPER_2_7_IN), + '4.20in': ('b', WaveshareEPaperTypeBModel.WAVESHARE_EPAPER_4_2_IN), + '7.50in': ('b', WaveshareEPaperTypeBModel.WAVESHARE_EPAPER_7_5_IN), } @@ -34,7 +39,7 @@ def validate_full_update_every_only_type_a(value): PLATFORM_SCHEMA = vol.All(display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({ - cv.GenerateID(): cv.declare_variable_id(None), + cv.GenerateID(): cv.declare_variable_id(WaveshareEPaper), cv.GenerateID(CONF_SPI_ID): cv.use_variable_id(SPIComponent), vol.Required(CONF_CS_PIN): pins.gpio_output_pin_schema, vol.Required(CONF_DC_PIN): pins.gpio_output_pin_schema, diff --git a/esphomeyaml/components/esp32_ble_beacon.py b/esphomeyaml/components/esp32_ble_beacon.py index 2d889df9f0..9f356acb5e 100644 --- a/esphomeyaml/components/esp32_ble_beacon.py +++ b/esphomeyaml/components/esp32_ble_beacon.py @@ -3,11 +3,11 @@ import voluptuous as vol from esphomeyaml import config_validation as cv from esphomeyaml.const import CONF_ID, CONF_SCAN_INTERVAL, ESP_PLATFORM_ESP32, CONF_UUID, CONF_TYPE from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, RawExpression, ArrayInitializer, \ - setup_component + setup_component, Component ESP_PLATFORMS = [ESP_PLATFORM_ESP32] -ESP32BLEBeacon = esphomelib_ns.ESP32BLEBeacon +ESP32BLEBeacon = esphomelib_ns.class_('ESP32BLEBeacon', Component) CONF_MAJOR = 'major' CONF_MINOR = 'minor' diff --git a/esphomeyaml/components/esp32_ble_tracker.py b/esphomeyaml/components/esp32_ble_tracker.py index e3856b12d6..40be12590a 100644 --- a/esphomeyaml/components/esp32_ble_tracker.py +++ b/esphomeyaml/components/esp32_ble_tracker.py @@ -1,15 +1,21 @@ import voluptuous as vol from esphomeyaml import config_validation as cv +from esphomeyaml.components import sensor from esphomeyaml.const import CONF_ID, CONF_SCAN_INTERVAL, ESP_PLATFORM_ESP32 from esphomeyaml.core import HexInt from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, ArrayInitializer, \ - setup_component + setup_component, Component ESP_PLATFORMS = [ESP_PLATFORM_ESP32] CONF_ESP32_BLE_ID = 'esp32_ble_id' -ESP32BLETracker = esphomelib_ns.ESP32BLETracker +ESP32BLETracker = esphomelib_ns.class_('ESP32BLETracker', Component) +XiaomiSensor = esphomelib_ns.class_('XiaomiSensor', sensor.Sensor) +XiaomiDevice = esphomelib_ns.class_('XiaomiDevice') +XIAOMI_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(XiaomiSensor) +}) CONFIG_SCHEMA = vol.Schema({ cv.GenerateID(): cv.declare_variable_id(ESP32BLETracker), diff --git a/esphomeyaml/components/esp32_touch.py b/esphomeyaml/components/esp32_touch.py index ad549c7930..0591e1e92f 100644 --- a/esphomeyaml/components/esp32_touch.py +++ b/esphomeyaml/components/esp32_touch.py @@ -6,7 +6,7 @@ from esphomeyaml.const import CONF_ID, CONF_SETUP_MODE, CONF_IIR_FILTER, \ CONF_SLEEP_DURATION, CONF_MEASUREMENT_DURATION, CONF_LOW_VOLTAGE_REFERENCE, \ CONF_HIGH_VOLTAGE_REFERENCE, CONF_VOLTAGE_ATTENUATION, ESP_PLATFORM_ESP32 from esphomeyaml.core import TimePeriod -from esphomeyaml.helpers import App, Pvariable, add, global_ns, setup_component +from esphomeyaml.helpers import App, Pvariable, add, global_ns, setup_component, Component ESP_PLATFORMS = [ESP_PLATFORM_ESP32] @@ -41,7 +41,7 @@ VOLTAGE_ATTENUATION = { '0V': global_ns.TOUCH_HVOLT_ATTEN_0V, } -ESP32TouchComponent = binary_sensor.binary_sensor_ns.ESP32TouchComponent +ESP32TouchComponent = binary_sensor.binary_sensor_ns.class_('ESP32TouchComponent', Component) CONFIG_SCHEMA = vol.Schema({ cv.GenerateID(): cv.declare_variable_id(ESP32TouchComponent), diff --git a/esphomeyaml/components/fan/__init__.py b/esphomeyaml/components/fan/__init__.py index 807c463db5..9874c4114f 100644 --- a/esphomeyaml/components/fan/__init__.py +++ b/esphomeyaml/components/fan/__init__.py @@ -7,24 +7,27 @@ from esphomeyaml.const import CONF_ID, CONF_MQTT_ID, CONF_OSCILLATION_COMMAND_TO CONF_OSCILLATION_STATE_TOPIC, CONF_SPEED_COMMAND_TOPIC, CONF_SPEED_STATE_TOPIC, CONF_INTERNAL, \ CONF_SPEED, CONF_OSCILLATING, CONF_OSCILLATION_OUTPUT, CONF_NAME from esphomeyaml.helpers import Application, Pvariable, add, esphomelib_ns, setup_mqtt_component, \ - TemplateArguments, get_variable, templatable, bool_ + TemplateArguments, get_variable, templatable, bool_, Action, Nameable, Component PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ }) fan_ns = esphomelib_ns.namespace('fan') -FanState = fan_ns.FanState -MQTTFanComponent = fan_ns.MQTTFanComponent -MakeFan = Application.MakeFan -TurnOnAction = fan_ns.TurnOnAction -TurnOffAction = fan_ns.TurnOffAction -ToggleAction = fan_ns.ToggleAction -FanSpeed = fan_ns.FanSpeed -FAN_SPEED_OFF = fan_ns.FAN_SPEED_OFF -FAN_SPEED_LOW = fan_ns.FAN_SPEED_LOW -FAN_SPEED_MEDIUM = fan_ns.FAN_SPEED_MEDIUM -FAN_SPEED_HIGH = fan_ns.FAN_SPEED_HIGH +FanState = fan_ns.class_('FanState', Nameable, Component) +MQTTFanComponent = fan_ns.class_('MQTTFanComponent', mqtt.MQTTComponent) +MakeFan = Application.struct('MakeFan') + +# Actions +TurnOnAction = fan_ns.class_('TurnOnAction', Action) +TurnOffAction = fan_ns.class_('TurnOffAction', Action) +ToggleAction = fan_ns.class_('ToggleAction', Action) + +FanSpeed = fan_ns.enum('FanSpeed') +FAN_SPEED_OFF = FanSpeed.FAN_SPEED_OFF +FAN_SPEED_LOW = FanSpeed.FAN_SPEED_LOW +FAN_SPEED_MEDIUM = FanSpeed.FAN_SPEED_MEDIUM +FAN_SPEED_HIGH = FanSpeed.FAN_SPEED_HIGH FAN_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(FanState), @@ -74,7 +77,7 @@ BUILD_FLAGS = '-DUSE_FAN' CONF_FAN_TOGGLE = 'fan.toggle' FAN_TOGGLE_ACTION_SCHEMA = maybe_simple_id({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(FanState), }) @@ -90,7 +93,7 @@ def fan_toggle_to_code(config, action_id, arg_type): CONF_FAN_TURN_OFF = 'fan.turn_off' FAN_TURN_OFF_ACTION_SCHEMA = maybe_simple_id({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(FanState), }) @@ -106,7 +109,7 @@ def fan_turn_off_to_code(config, action_id, arg_type): CONF_FAN_TURN_ON = 'fan.turn_on' FAN_TURN_ON_ACTION_SCHEMA = maybe_simple_id({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(FanState), vol.Optional(CONF_OSCILLATING): cv.templatable(cv.boolean), vol.Optional(CONF_SPEED): cv.templatable(validate_fan_speed), }) diff --git a/esphomeyaml/components/fan/binary.py b/esphomeyaml/components/fan/binary.py index e797b6f75a..533b56b59b 100644 --- a/esphomeyaml/components/fan/binary.py +++ b/esphomeyaml/components/fan/binary.py @@ -1,19 +1,18 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import fan +from esphomeyaml.components import fan, output from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_OSCILLATION_OUTPUT, CONF_OUTPUT from esphomeyaml.helpers import App, add, get_variable, variable, setup_component PLATFORM_SCHEMA = cv.nameable(fan.FAN_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan), - vol.Required(CONF_OUTPUT): cv.use_variable_id(None), - vol.Optional(CONF_OSCILLATION_OUTPUT): cv.use_variable_id(None), + vol.Required(CONF_OUTPUT): cv.use_variable_id(output.BinaryOutput), + vol.Optional(CONF_OSCILLATION_OUTPUT): cv.use_variable_id(output.BinaryOutput), }).extend(cv.COMPONENT_SCHEMA.schema)) def to_code(config): - output = None for output in get_variable(config[CONF_OUTPUT]): yield @@ -21,7 +20,6 @@ def to_code(config): fan_struct = variable(config[CONF_MAKE_ID], rhs) add(fan_struct.Poutput.set_binary(output)) if CONF_OSCILLATION_OUTPUT in config: - oscillation_output = None for oscillation_output in get_variable(config[CONF_OSCILLATION_OUTPUT]): yield add(fan_struct.Poutput.set_oscillation(oscillation_output)) diff --git a/esphomeyaml/components/fan/speed.py b/esphomeyaml/components/fan/speed.py index 0141659e04..71003fb312 100644 --- a/esphomeyaml/components/fan/speed.py +++ b/esphomeyaml/components/fan/speed.py @@ -1,7 +1,7 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import fan, mqtt +from esphomeyaml.components import fan, mqtt, output from esphomeyaml.const import CONF_HIGH, CONF_LOW, CONF_MAKE_ID, CONF_MEDIUM, CONF_NAME, \ CONF_OSCILLATION_OUTPUT, CONF_OUTPUT, CONF_SPEED, CONF_SPEED_COMMAND_TOPIC, \ CONF_SPEED_STATE_TOPIC @@ -9,10 +9,10 @@ from esphomeyaml.helpers import App, add, get_variable, variable PLATFORM_SCHEMA = cv.nameable(fan.FAN_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan), - vol.Required(CONF_OUTPUT): cv.use_variable_id(None), + vol.Required(CONF_OUTPUT): cv.use_variable_id(output.FloatOutput), vol.Optional(CONF_SPEED_STATE_TOPIC): cv.publish_topic, vol.Optional(CONF_SPEED_COMMAND_TOPIC): cv.subscribe_topic, - vol.Optional(CONF_OSCILLATION_OUTPUT): cv.use_variable_id(None), + vol.Optional(CONF_OSCILLATION_OUTPUT): cv.use_variable_id(output.BinaryOutput), vol.Optional(CONF_SPEED): vol.Schema({ vol.Required(CONF_LOW): cv.percentage, vol.Required(CONF_MEDIUM): cv.percentage, @@ -22,7 +22,6 @@ PLATFORM_SCHEMA = cv.nameable(fan.FAN_PLATFORM_SCHEMA.extend({ def to_code(config): - output = None for output in get_variable(config[CONF_OUTPUT]): yield rhs = App.make_fan(config[CONF_NAME]) @@ -37,7 +36,6 @@ def to_code(config): add(fan_struct.Poutput.set_speed(output)) if CONF_OSCILLATION_OUTPUT in config: - oscillation_output = None for oscillation_output in get_variable(config[CONF_OSCILLATION_OUTPUT]): yield add(fan_struct.Poutput.set_oscillation(oscillation_output)) diff --git a/esphomeyaml/components/font.py b/esphomeyaml/components/font.py index f18336a0a0..1456c3e717 100644 --- a/esphomeyaml/components/font.py +++ b/esphomeyaml/components/font.py @@ -11,8 +11,8 @@ from esphomeyaml.helpers import App, ArrayInitializer, MockObj, Pvariable, RawEx DEPENDENCIES = ['display'] -Font = display.display_ns.Font -Glyph = display.display_ns.Glyph +Font = display.display_ns.class_('Font') +Glyph = display.display_ns.class_('Glyph') def validate_glyphs(value): diff --git a/esphomeyaml/components/i2c.py b/esphomeyaml/components/i2c.py index bee54847df..133b3031c6 100644 --- a/esphomeyaml/components/i2c.py +++ b/esphomeyaml/components/i2c.py @@ -4,9 +4,10 @@ import esphomeyaml.config_validation as cv from esphomeyaml import pins from esphomeyaml.const import CONF_FREQUENCY, CONF_SCL, CONF_SDA, CONF_SCAN, CONF_ID, \ CONF_RECEIVE_TIMEOUT -from esphomeyaml.helpers import App, add, Pvariable, esphomelib_ns, setup_component +from esphomeyaml.helpers import App, add, Pvariable, esphomelib_ns, setup_component, Component -I2CComponent = esphomelib_ns.I2CComponent +I2CComponent = esphomelib_ns.class_('I2CComponent', Component) +I2CDevice = pins.I2CDevice CONFIG_SCHEMA = vol.Schema({ cv.GenerateID(): cv.declare_variable_id(I2CComponent), diff --git a/esphomeyaml/components/image.py b/esphomeyaml/components/image.py index acb99bbb19..ac0c95be2d 100644 --- a/esphomeyaml/components/image.py +++ b/esphomeyaml/components/image.py @@ -15,7 +15,7 @@ _LOGGER = logging.getLogger(__name__) DEPENDENCIES = ['display'] -Image_ = display.display_ns.Image +Image_ = display.display_ns.class_('Image') CONF_RAW_DATA_ID = 'raw_data_id' diff --git a/esphomeyaml/components/light/__init__.py b/esphomeyaml/components/light/__init__.py index c75370d239..c74376b2fb 100644 --- a/esphomeyaml/components/light/__init__.py +++ b/esphomeyaml/components/light/__init__.py @@ -11,36 +11,48 @@ from esphomeyaml.const import CONF_ALPHA, CONF_BLUE, CONF_BRIGHTNESS, CONF_COLOR CONF_EFFECT from esphomeyaml.helpers import Application, ArrayInitializer, Pvariable, RawExpression, \ StructInitializer, add, add_job, esphomelib_ns, process_lambda, setup_mqtt_component, \ - get_variable, TemplateArguments, templatable, uint32, float_, std_string + get_variable, TemplateArguments, templatable, uint32, float_, std_string, Nameable, Component, \ + Action PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ }) +# Base light_ns = esphomelib_ns.namespace('light') -LightState = light_ns.LightState -LightColorValues = light_ns.LightColorValues -MQTTJSONLightComponent = light_ns.MQTTJSONLightComponent -ToggleAction = light_ns.ToggleAction -TurnOffAction = light_ns.TurnOffAction -TurnOnAction = light_ns.TurnOnAction -MakeLight = Application.MakeLight -RandomLightEffect = light_ns.RandomLightEffect -LambdaLightEffect = light_ns.LambdaLightEffect -StrobeLightEffect = light_ns.StrobeLightEffect -StrobeLightEffectColor = light_ns.StrobeLightEffectColor -FlickerLightEffect = light_ns.FlickerLightEffect -FastLEDLambdaLightEffect = light_ns.FastLEDLambdaLightEffect -FastLEDRainbowLightEffect = light_ns.FastLEDRainbowLightEffect -FastLEDColorWipeEffect = light_ns.FastLEDColorWipeEffect -FastLEDColorWipeEffectColor = light_ns.FastLEDColorWipeEffectColor -FastLEDScanEffect = light_ns.FastLEDScanEffect -FastLEDScanEffectColor = light_ns.FastLEDScanEffectColor -FastLEDTwinkleEffect = light_ns.FastLEDTwinkleEffect -FastLEDRandomTwinkleEffect = light_ns.FastLEDRandomTwinkleEffect -FastLEDFireworksEffect = light_ns.FastLEDFireworksEffect -FastLEDFlickerEffect = light_ns.FastLEDFlickerEffect -FastLEDLightOutputComponent = light_ns.FastLEDLightOutputComponent +LightState = light_ns.class_('LightState', Nameable, Component) +MakeLight = Application.struct('MakeLight') +LightOutput = light_ns.class_('LightOutput') +FastLEDLightOutputComponent = light_ns.class_('FastLEDLightOutputComponent', LightOutput) + +# Actions +ToggleAction = light_ns.class_('ToggleAction', Action) +TurnOffAction = light_ns.class_('TurnOffAction', Action) +TurnOnAction = light_ns.class_('TurnOnAction', Action) + +LightColorValues = light_ns.class_('LightColorValues') + + +MQTTJSONLightComponent = light_ns.class_('MQTTJSONLightComponent', mqtt.MQTTComponent) + +# Effects +LightEffect = light_ns.class_('LightEffect') +RandomLightEffect = light_ns.class_('RandomLightEffect', LightEffect) +LambdaLightEffect = light_ns.class_('LambdaLightEffect', LightEffect) +StrobeLightEffect = light_ns.class_('StrobeLightEffect', LightEffect) +StrobeLightEffectColor = light_ns.class_('StrobeLightEffectColor', LightEffect) +FlickerLightEffect = light_ns.class_('FlickerLightEffect', LightEffect) +BaseFastLEDLightEffect = light_ns.class_('BaseFastLEDLightEffect', LightEffect) +FastLEDLambdaLightEffect = light_ns.class_('FastLEDLambdaLightEffect', BaseFastLEDLightEffect) +FastLEDRainbowLightEffect = light_ns.class_('FastLEDRainbowLightEffect', BaseFastLEDLightEffect) +FastLEDColorWipeEffect = light_ns.class_('FastLEDColorWipeEffect', BaseFastLEDLightEffect) +FastLEDColorWipeEffectColor = light_ns.class_('FastLEDColorWipeEffectColor', BaseFastLEDLightEffect) +FastLEDScanEffect = light_ns.class_('FastLEDScanEffect', BaseFastLEDLightEffect) +FastLEDScanEffectColor = light_ns.class_('FastLEDScanEffectColor', BaseFastLEDLightEffect) +FastLEDTwinkleEffect = light_ns.class_('FastLEDTwinkleEffect', BaseFastLEDLightEffect) +FastLEDRandomTwinkleEffect = light_ns.class_('FastLEDRandomTwinkleEffect', BaseFastLEDLightEffect) +FastLEDFireworksEffect = light_ns.class_('FastLEDFireworksEffect', BaseFastLEDLightEffect) +FastLEDFlickerEffect = light_ns.class_('FastLEDFlickerEffect', BaseFastLEDLightEffect) CONF_STROBE = 'strobe' CONF_FLICKER = 'flicker' @@ -345,7 +357,7 @@ BUILD_FLAGS = '-DUSE_LIGHT' CONF_LIGHT_TOGGLE = 'light.toggle' LIGHT_TOGGLE_ACTION_SCHEMA = maybe_simple_id({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(LightState), vol.Optional(CONF_TRANSITION_LENGTH): cv.templatable(cv.positive_time_period_milliseconds), }) @@ -367,7 +379,7 @@ def light_toggle_to_code(config, action_id, arg_type): CONF_LIGHT_TURN_OFF = 'light.turn_off' LIGHT_TURN_OFF_ACTION_SCHEMA = maybe_simple_id({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(LightState), vol.Optional(CONF_TRANSITION_LENGTH): cv.templatable(cv.positive_time_period_milliseconds), }) @@ -389,7 +401,7 @@ def light_turn_off_to_code(config, action_id, arg_type): CONF_LIGHT_TURN_ON = 'light.turn_on' LIGHT_TURN_ON_ACTION_SCHEMA = maybe_simple_id({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(LightState), vol.Exclusive(CONF_TRANSITION_LENGTH, 'transformer'): cv.templatable(cv.positive_time_period_milliseconds), vol.Exclusive(CONF_FLASH_LENGTH, 'transformer'): diff --git a/esphomeyaml/components/light/binary.py b/esphomeyaml/components/light/binary.py index f12e3ba01d..c9b6214544 100644 --- a/esphomeyaml/components/light/binary.py +++ b/esphomeyaml/components/light/binary.py @@ -1,19 +1,18 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import light +from esphomeyaml.components import light, output from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT, CONF_EFFECTS from esphomeyaml.helpers import App, get_variable, variable, setup_component PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), - vol.Required(CONF_OUTPUT): cv.use_variable_id(None), + vol.Required(CONF_OUTPUT): cv.use_variable_id(output.BinaryOutput), vol.Optional(CONF_EFFECTS): light.validate_effects(light.BINARY_EFFECTS), }).extend(cv.COMPONENT_SCHEMA.schema)) def to_code(config): - output = None for output in get_variable(config[CONF_OUTPUT]): yield rhs = App.make_binary_light(config[CONF_NAME], output) diff --git a/esphomeyaml/components/light/cwww.py b/esphomeyaml/components/light/cwww.py index faae23551b..d21139b5a0 100644 --- a/esphomeyaml/components/light/cwww.py +++ b/esphomeyaml/components/light/cwww.py @@ -1,7 +1,7 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import light +from esphomeyaml.components import light, output from esphomeyaml.components.light.rgbww import validate_cold_white_colder, \ validate_color_temperature from esphomeyaml.const import CONF_COLD_WHITE, CONF_COLD_WHITE_COLOR_TEMPERATURE, \ @@ -11,8 +11,8 @@ from esphomeyaml.helpers import App, get_variable, variable, setup_component PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), - vol.Required(CONF_COLD_WHITE): cv.use_variable_id(None), - vol.Required(CONF_WARM_WHITE): cv.use_variable_id(None), + vol.Required(CONF_COLD_WHITE): cv.use_variable_id(output.FloatOutput), + vol.Required(CONF_WARM_WHITE): cv.use_variable_id(output.FloatOutput), vol.Required(CONF_COLD_WHITE_COLOR_TEMPERATURE): validate_color_temperature, vol.Required(CONF_WARM_WHITE_COLOR_TEMPERATURE): validate_color_temperature, diff --git a/esphomeyaml/components/light/fastled_clockless.py b/esphomeyaml/components/light/fastled_clockless.py index d23f5b61b9..c779f4ceed 100644 --- a/esphomeyaml/components/light/fastled_clockless.py +++ b/esphomeyaml/components/light/fastled_clockless.py @@ -53,7 +53,7 @@ def validate(value): return value -MakeFastLEDLight = Application.MakeFastLEDLight +MakeFastLEDLight = Application.struct('MakeFastLEDLight') PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeFastLEDLight), @@ -89,7 +89,6 @@ def to_code(config): add(fast_led.set_max_refresh_rate(config[CONF_MAX_REFRESH_RATE])) if CONF_POWER_SUPPLY in config: - power_supply = None for power_supply in get_variable(config[CONF_POWER_SUPPLY]): yield add(fast_led.set_power_supply(power_supply)) diff --git a/esphomeyaml/components/light/fastled_spi.py b/esphomeyaml/components/light/fastled_spi.py index a90750e3f2..bd4df644e3 100644 --- a/esphomeyaml/components/light/fastled_spi.py +++ b/esphomeyaml/components/light/fastled_spi.py @@ -30,7 +30,7 @@ RGB_ORDERS = [ 'BGR', ] -MakeFastLEDLight = Application.MakeFastLEDLight +MakeFastLEDLight = Application.struct('MakeFastLEDLight') PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeFastLEDLight), @@ -69,7 +69,6 @@ def to_code(config): add(fast_led.set_max_refresh_rate(config[CONF_MAX_REFRESH_RATE])) if CONF_POWER_SUPPLY in config: - power_supply = None for power_supply in get_variable(config[CONF_POWER_SUPPLY]): yield add(fast_led.set_power_supply(power_supply)) diff --git a/esphomeyaml/components/light/monochromatic.py b/esphomeyaml/components/light/monochromatic.py index a87b1701d4..4fca6287ac 100644 --- a/esphomeyaml/components/light/monochromatic.py +++ b/esphomeyaml/components/light/monochromatic.py @@ -1,14 +1,14 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import light +from esphomeyaml.components import light, output from esphomeyaml.const import CONF_DEFAULT_TRANSITION_LENGTH, CONF_GAMMA_CORRECT, CONF_MAKE_ID, \ CONF_NAME, CONF_OUTPUT, CONF_EFFECTS from esphomeyaml.helpers import App, get_variable, variable, setup_component PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), - vol.Required(CONF_OUTPUT): cv.use_variable_id(None), + vol.Required(CONF_OUTPUT): cv.use_variable_id(output.FloatOutput), vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, vol.Optional(CONF_EFFECTS): light.validate_effects(light.MONOCHROMATIC_EFFECTS), @@ -16,7 +16,6 @@ PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ def to_code(config): - output = None for output in get_variable(config[CONF_OUTPUT]): yield rhs = App.make_monochromatic_light(config[CONF_NAME], output) diff --git a/esphomeyaml/components/light/rgb.py b/esphomeyaml/components/light/rgb.py index e8ddbe3a19..556ba9b241 100644 --- a/esphomeyaml/components/light/rgb.py +++ b/esphomeyaml/components/light/rgb.py @@ -1,16 +1,16 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import light +from esphomeyaml.components import light, output from esphomeyaml.const import CONF_BLUE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_GAMMA_CORRECT, \ CONF_GREEN, CONF_MAKE_ID, CONF_NAME, CONF_RED, CONF_EFFECTS from esphomeyaml.helpers import App, get_variable, variable, setup_component PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), - vol.Required(CONF_RED): cv.use_variable_id(None), - vol.Required(CONF_GREEN): cv.use_variable_id(None), - vol.Required(CONF_BLUE): cv.use_variable_id(None), + vol.Required(CONF_RED): cv.use_variable_id(output.FloatOutput), + vol.Required(CONF_GREEN): cv.use_variable_id(output.FloatOutput), + vol.Required(CONF_BLUE): cv.use_variable_id(output.FloatOutput), vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, vol.Optional(CONF_EFFECTS): light.validate_effects(light.RGB_EFFECTS), @@ -18,13 +18,10 @@ PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ def to_code(config): - red = None for red in get_variable(config[CONF_RED]): yield - green = None for green in get_variable(config[CONF_GREEN]): yield - blue = None for blue in get_variable(config[CONF_BLUE]): yield rhs = App.make_rgb_light(config[CONF_NAME], red, green, blue) diff --git a/esphomeyaml/components/light/rgbw.py b/esphomeyaml/components/light/rgbw.py index bfa7dd9bb7..07631ca71b 100644 --- a/esphomeyaml/components/light/rgbw.py +++ b/esphomeyaml/components/light/rgbw.py @@ -1,17 +1,17 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import light +from esphomeyaml.components import light, output from esphomeyaml.const import CONF_BLUE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_GAMMA_CORRECT, \ CONF_GREEN, CONF_MAKE_ID, CONF_NAME, CONF_RED, CONF_WHITE, CONF_EFFECTS from esphomeyaml.helpers import App, get_variable, variable, setup_component PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), - vol.Required(CONF_RED): cv.use_variable_id(None), - vol.Required(CONF_GREEN): cv.use_variable_id(None), - vol.Required(CONF_BLUE): cv.use_variable_id(None), - vol.Required(CONF_WHITE): cv.use_variable_id(None), + vol.Required(CONF_RED): cv.use_variable_id(output.FloatOutput), + vol.Required(CONF_GREEN): cv.use_variable_id(output.FloatOutput), + vol.Required(CONF_BLUE): cv.use_variable_id(output.FloatOutput), + vol.Required(CONF_WHITE): cv.use_variable_id(output.FloatOutput), vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, vol.Optional(CONF_EFFECTS): light.validate_effects(light.RGB_EFFECTS), @@ -19,16 +19,12 @@ PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ def to_code(config): - red = None for red in get_variable(config[CONF_RED]): yield - green = None for green in get_variable(config[CONF_GREEN]): yield - blue = None for blue in get_variable(config[CONF_BLUE]): yield - white = None for white in get_variable(config[CONF_WHITE]): yield rhs = App.make_rgbw_light(config[CONF_NAME], red, green, blue, white) diff --git a/esphomeyaml/components/light/rgbww.py b/esphomeyaml/components/light/rgbww.py index 20e7c0fad8..fa7a92d6ff 100644 --- a/esphomeyaml/components/light/rgbww.py +++ b/esphomeyaml/components/light/rgbww.py @@ -1,7 +1,7 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import light +from esphomeyaml.components import light, output from esphomeyaml.const import CONF_BLUE, CONF_COLD_WHITE, CONF_COLD_WHITE_COLOR_TEMPERATURE, \ CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_GREEN, CONF_MAKE_ID, \ CONF_NAME, CONF_RED, CONF_WARM_WHITE, CONF_WARM_WHITE_COLOR_TEMPERATURE @@ -30,11 +30,11 @@ def validate_cold_white_colder(value): PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), - vol.Required(CONF_RED): cv.use_variable_id(None), - vol.Required(CONF_GREEN): cv.use_variable_id(None), - vol.Required(CONF_BLUE): cv.use_variable_id(None), - vol.Required(CONF_COLD_WHITE): cv.use_variable_id(None), - vol.Required(CONF_WARM_WHITE): cv.use_variable_id(None), + vol.Required(CONF_RED): cv.use_variable_id(output.FloatOutput), + vol.Required(CONF_GREEN): cv.use_variable_id(output.FloatOutput), + vol.Required(CONF_BLUE): cv.use_variable_id(output.FloatOutput), + vol.Required(CONF_COLD_WHITE): cv.use_variable_id(output.FloatOutput), + vol.Required(CONF_WARM_WHITE): cv.use_variable_id(output.FloatOutput), vol.Required(CONF_COLD_WHITE_COLOR_TEMPERATURE): validate_color_temperature, vol.Required(CONF_WARM_WHITE_COLOR_TEMPERATURE): validate_color_temperature, diff --git a/esphomeyaml/components/logger.py b/esphomeyaml/components/logger.py index b47995f7f1..839d371d56 100644 --- a/esphomeyaml/components/logger.py +++ b/esphomeyaml/components/logger.py @@ -8,7 +8,7 @@ from esphomeyaml.const import CONF_ARGS, CONF_BAUD_RATE, CONF_FORMAT, CONF_ID, C CONF_LOGS, CONF_TAG, CONF_TX_BUFFER_SIZE from esphomeyaml.core import ESPHomeYAMLError, Lambda from esphomeyaml.helpers import App, Pvariable, RawExpression, TemplateArguments, add, \ - esphomelib_ns, global_ns, process_lambda, statement + esphomelib_ns, global_ns, process_lambda, statement, Component LOG_LEVELS = { 'NONE': global_ns.ESPHOMELIB_LOG_LEVEL_NONE, @@ -44,7 +44,7 @@ def validate_local_no_higher_than_global(value): return value -LogComponent = esphomelib_ns.LogComponent +LogComponent = esphomelib_ns.class_('LogComponent', Component) CONFIG_SCHEMA = vol.All(vol.Schema({ cv.GenerateID(): cv.declare_variable_id(LogComponent), diff --git a/esphomeyaml/components/mqtt.py b/esphomeyaml/components/mqtt.py index c8f85a870b..646ddc0e73 100644 --- a/esphomeyaml/components/mqtt.py +++ b/esphomeyaml/components/mqtt.py @@ -17,7 +17,7 @@ from esphomeyaml.const import CONF_BIRTH_MESSAGE, CONF_BROKER, CONF_CLIENT_ID, C from esphomeyaml.core import ESPHomeYAMLError from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, RawExpression, \ StructInitializer, TemplateArguments, add, esphomelib_ns, optional, std_string, templatable, \ - uint8, bool_, JsonObjectRef, process_lambda, JsonObjectConstRef + uint8, bool_, JsonObjectRef, process_lambda, JsonObjectConstRef, Component, Action, Trigger def validate_message_just_topic(value): @@ -38,12 +38,14 @@ MQTT_MESSAGE_SCHEMA = vol.Any(None, MQTT_MESSAGE_BASE.extend({ })) mqtt_ns = esphomelib_ns.namespace('mqtt') -MQTTMessage = mqtt_ns.MQTTMessage -MQTTClientComponent = mqtt_ns.MQTTClientComponent -MQTTPublishAction = mqtt_ns.MQTTPublishAction -MQTTPublishJsonAction = mqtt_ns.MQTTPublishJsonAction -MQTTMessageTrigger = mqtt_ns.MQTTMessageTrigger -MQTTJsonMessageTrigger = mqtt_ns.MQTTJsonMessageTrigger +MQTTMessage = mqtt_ns.struct('MQTTMessage') +MQTTClientComponent = mqtt_ns.class_('MQTTClientComponent', Component) +MQTTPublishAction = mqtt_ns.class_('MQTTPublishAction', Action) +MQTTPublishJsonAction = mqtt_ns.class_('MQTTPublishJsonAction', Action) +MQTTMessageTrigger = mqtt_ns.class_('MQTTMessageTrigger', Trigger.template(std_string)) +MQTTJsonMessageTrigger = mqtt_ns.class_('MQTTJsonMessageTrigger', + Trigger.template(JsonObjectConstRef)) +MQTTComponent = mqtt_ns.class_('MQTTComponent', Component) def validate_broker(value): diff --git a/esphomeyaml/components/ota.py b/esphomeyaml/components/ota.py index e7052d60e0..83b224cbed 100644 --- a/esphomeyaml/components/ota.py +++ b/esphomeyaml/components/ota.py @@ -7,16 +7,15 @@ import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_ID, CONF_OTA, CONF_PASSWORD, CONF_PORT, CONF_SAFE_MODE, \ ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266 from esphomeyaml.core import ESPHomeYAMLError -from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns +from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, Component _LOGGER = logging.getLogger(__name__) -OTAComponent = esphomelib_ns.OTAComponent +OTAComponent = esphomelib_ns.class_('OTAComponent', Component) CONFIG_SCHEMA = vol.Schema({ cv.GenerateID(): cv.declare_variable_id(OTAComponent), vol.Optional(CONF_SAFE_MODE, default=True): cv.boolean, - # TODO Num attempts + wait time vol.Optional(CONF_PORT): cv.port, vol.Optional(CONF_PASSWORD): cv.string, }) diff --git a/esphomeyaml/components/output/__init__.py b/esphomeyaml/components/output/__init__.py index d4f6d27836..6456bd0991 100644 --- a/esphomeyaml/components/output/__init__.py +++ b/esphomeyaml/components/output/__init__.py @@ -5,7 +5,7 @@ import esphomeyaml.config_validation as cv from esphomeyaml.components.power_supply import PowerSupplyComponent from esphomeyaml.const import CONF_INVERTED, CONF_MAX_POWER, CONF_POWER_SUPPLY, CONF_ID, CONF_LEVEL from esphomeyaml.helpers import add, esphomelib_ns, get_variable, TemplateArguments, Pvariable, \ - templatable, float_, add_job + templatable, float_, add_job, Action PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ @@ -25,9 +25,13 @@ FLOAT_OUTPUT_SCHEMA = BINARY_OUTPUT_SCHEMA.extend({ FLOAT_OUTPUT_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(FLOAT_OUTPUT_SCHEMA.schema) output_ns = esphomelib_ns.namespace('output') -TurnOffAction = output_ns.TurnOffAction -TurnOnAction = output_ns.TurnOnAction -SetLevelAction = output_ns.SetLevelAction +BinaryOutput = output_ns.class_('BinaryOutput') +FloatOutput = output_ns.class_('FloatOutput', BinaryOutput) + +# Actions +TurnOffAction = output_ns.class_('TurnOffAction', Action) +TurnOnAction = output_ns.class_('TurnOnAction', Action) +SetLevelAction = output_ns.class_('SetLevelAction', Action) def setup_output_platform_(obj, config, skip_power_supply=False): @@ -51,7 +55,7 @@ BUILD_FLAGS = '-DUSE_OUTPUT' CONF_OUTPUT_TURN_ON = 'output.turn_on' OUTPUT_TURN_ON_ACTION = maybe_simple_id({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(BinaryOutput), }) @@ -67,7 +71,7 @@ def output_turn_on_to_code(config, action_id, arg_type): CONF_OUTPUT_TURN_OFF = 'output.turn_off' OUTPUT_TURN_OFF_ACTION = maybe_simple_id({ - vol.Required(CONF_ID): cv.use_variable_id(None) + vol.Required(CONF_ID): cv.use_variable_id(BinaryOutput) }) @@ -83,7 +87,7 @@ def output_turn_off_to_code(config, action_id, arg_type): CONF_OUTPUT_SET_LEVEL = 'output.set_level' OUTPUT_SET_LEVEL_ACTION = vol.Schema({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(FloatOutput), vol.Required(CONF_LEVEL): cv.templatable(cv.percentage), }) diff --git a/esphomeyaml/components/output/esp8266_pwm.py b/esphomeyaml/components/output/esp8266_pwm.py index 611b1ca9af..a5ad50be33 100644 --- a/esphomeyaml/components/output/esp8266_pwm.py +++ b/esphomeyaml/components/output/esp8266_pwm.py @@ -5,7 +5,8 @@ import esphomeyaml.config_validation as cv from esphomeyaml.components import output from esphomeyaml.const import CONF_ID, CONF_NUMBER, CONF_PIN, ESP_PLATFORM_ESP8266 from esphomeyaml.core import ESPHomeYAMLError -from esphomeyaml.helpers import App, Pvariable, gpio_output_pin_expression, setup_component +from esphomeyaml.helpers import App, Pvariable, gpio_output_pin_expression, setup_component, \ + Component ESP_PLATFORMS = [ESP_PLATFORM_ESP8266] @@ -16,7 +17,7 @@ def valid_pwm_pin(value): return value -ESP8266PWMOutput = output.output_ns.ESP8266PWMOutput +ESP8266PWMOutput = output.output_ns.class_('ESP8266PWMOutput', output.FloatOutput, Component) PLATFORM_SCHEMA = output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({ vol.Required(CONF_ID): cv.declare_variable_id(ESP8266PWMOutput), diff --git a/esphomeyaml/components/output/gpio.py b/esphomeyaml/components/output/gpio.py index 54e3cf7657..51e3ce27ef 100644 --- a/esphomeyaml/components/output/gpio.py +++ b/esphomeyaml/components/output/gpio.py @@ -4,9 +4,11 @@ from esphomeyaml import pins import esphomeyaml.config_validation as cv from esphomeyaml.components import output from esphomeyaml.const import CONF_ID, CONF_PIN -from esphomeyaml.helpers import App, Pvariable, gpio_output_pin_expression, setup_component +from esphomeyaml.helpers import App, Pvariable, gpio_output_pin_expression, setup_component, \ + Component -GPIOBinaryOutputComponent = output.output_ns.GPIOBinaryOutputComponent +GPIOBinaryOutputComponent = output.output_ns.class_('GPIOBinaryOutputComponent', + output.BinaryOutput, Component) PLATFORM_SCHEMA = output.BINARY_OUTPUT_PLATFORM_SCHEMA.extend({ vol.Required(CONF_ID): cv.declare_variable_id(GPIOBinaryOutputComponent), diff --git a/esphomeyaml/components/output/ledc.py b/esphomeyaml/components/output/ledc.py index fce085296c..987d44a5be 100644 --- a/esphomeyaml/components/output/ledc.py +++ b/esphomeyaml/components/output/ledc.py @@ -5,7 +5,7 @@ from esphomeyaml import pins from esphomeyaml.components import output from esphomeyaml.const import APB_CLOCK_FREQ, CONF_BIT_DEPTH, CONF_CHANNEL, CONF_FREQUENCY, \ CONF_ID, CONF_PIN, ESP_PLATFORM_ESP32 -from esphomeyaml.helpers import App, Pvariable, add, setup_component +from esphomeyaml.helpers import App, Pvariable, add, setup_component, Component ESP_PLATFORMS = [ESP_PLATFORM_ESP32] @@ -19,7 +19,7 @@ def validate_frequency_bit_depth(obj): return obj -LEDCOutputComponent = output.output_ns.LEDCOutputComponent +LEDCOutputComponent = output.output_ns.class_('LEDCOutputComponent', output.FloatOutput, Component) PLATFORM_SCHEMA = vol.All(output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({ vol.Required(CONF_ID): cv.declare_variable_id(LEDCOutputComponent), diff --git a/esphomeyaml/components/output/pca9685.py b/esphomeyaml/components/output/pca9685.py index a2d7149a64..ba2f57ce6d 100644 --- a/esphomeyaml/components/output/pca9685.py +++ b/esphomeyaml/components/output/pca9685.py @@ -8,7 +8,7 @@ from esphomeyaml.helpers import Pvariable, get_variable DEPENDENCIES = ['pca9685'] -Channel = PCA9685OutputComponent.Channel +Channel = PCA9685OutputComponent.class_('Channel', output.FloatOutput) PLATFORM_SCHEMA = output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({ vol.Required(CONF_ID): cv.declare_variable_id(Channel), diff --git a/esphomeyaml/components/pca9685.py b/esphomeyaml/components/pca9685.py index 694b3e3424..ac3094abaf 100644 --- a/esphomeyaml/components/pca9685.py +++ b/esphomeyaml/components/pca9685.py @@ -1,13 +1,14 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import output +from esphomeyaml.components import output, i2c from esphomeyaml.const import CONF_ADDRESS, CONF_FREQUENCY, CONF_ID, CONF_PHASE_BALANCER -from esphomeyaml.helpers import App, HexIntLiteral, Pvariable, add, setup_component +from esphomeyaml.helpers import App, HexIntLiteral, Pvariable, add, setup_component, Component DEPENDENCIES = ['i2c'] -PCA9685OutputComponent = output.output_ns.namespace('PCA9685OutputComponent') +PCA9685OutputComponent = output.output_ns.class_('PCA9685OutputComponent', + Component, i2c.I2CDevice) PHASE_BALANCER_MESSAGE = ("The phase_balancer option has been removed in version 1.5.0. " "esphomelib will now automatically choose a suitable phase balancer.") diff --git a/esphomeyaml/components/pcf8574.py b/esphomeyaml/components/pcf8574.py index ef8e4ef877..d683749fa1 100644 --- a/esphomeyaml/components/pcf8574.py +++ b/esphomeyaml/components/pcf8574.py @@ -1,16 +1,26 @@ import voluptuous as vol +from esphomeyaml import pins +from esphomeyaml.components import i2c import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_PCF8575 -from esphomeyaml.helpers import App, Pvariable, esphomelib_ns, setup_component +from esphomeyaml.helpers import App, Pvariable, esphomelib_ns, setup_component, Component, \ + GPIOInputPin, GPIOOutputPin, io_ns DEPENDENCIES = ['i2c'] -io_ns = esphomelib_ns.namespace('io') -PCF8574Component = io_ns.PCF8574Component +PCF8574GPIOMode = io_ns.enum('PCF8574GPIOMode') +PCF8675_GPIO_MODES = { + 'INPUT': PCF8574GPIOMode.PCF8574_INPUT, + 'INPUT_PULLUP': PCF8574GPIOMode.PCF8574_INPUT_PULLUP, + 'OUTPUT': PCF8574GPIOMode.PCF8574_OUTPUT, +} + +PCF8574GPIOInputPin = io_ns.class_('PCF8574GPIOInputPin', GPIOInputPin) +PCF8574GPIOOutputPin = io_ns.class_('PCF8574GPIOOutputPin', GPIOOutputPin) PCF8574_SCHEMA = vol.Schema({ - vol.Required(CONF_ID): cv.declare_variable_id(PCF8574Component), + vol.Required(CONF_ID): cv.declare_variable_id(pins.PCF8574Component), vol.Optional(CONF_ADDRESS, default=0x21): cv.i2c_address, vol.Optional(CONF_PCF8575, default=False): cv.boolean, }).extend(cv.COMPONENT_SCHEMA.schema) diff --git a/esphomeyaml/components/pn532.py b/esphomeyaml/components/pn532.py index a521f9b8c8..046697dc32 100644 --- a/esphomeyaml/components/pn532.py +++ b/esphomeyaml/components/pn532.py @@ -2,17 +2,18 @@ import voluptuous as vol import esphomeyaml.config_validation as cv from esphomeyaml import pins, automation -from esphomeyaml.components import binary_sensor +from esphomeyaml.components import binary_sensor, spi from esphomeyaml.components.spi import SPIComponent from esphomeyaml.const import CONF_CS_PIN, CONF_ID, CONF_SPI_ID, CONF_UPDATE_INTERVAL, \ CONF_ON_TAG, CONF_TRIGGER_ID from esphomeyaml.helpers import App, Pvariable, get_variable, gpio_output_pin_expression, \ - std_string, setup_component + std_string, setup_component, PollingComponent, Trigger DEPENDENCIES = ['spi'] -PN532Component = binary_sensor.binary_sensor_ns.PN532Component -PN532Trigger = binary_sensor.binary_sensor_ns.PN532Trigger +PN532Component = binary_sensor.binary_sensor_ns.class_('PN532Component', PollingComponent, + spi.SPIDevice) +PN532Trigger = binary_sensor.binary_sensor_ns.class_('PN532Trigger', Trigger.template(std_string)) CONFIG_SCHEMA = vol.All(cv.ensure_list, [vol.Schema({ cv.GenerateID(): cv.declare_variable_id(PN532Component), diff --git a/esphomeyaml/components/power_supply.py b/esphomeyaml/components/power_supply.py index 8dc49c6175..97efda4f1e 100644 --- a/esphomeyaml/components/power_supply.py +++ b/esphomeyaml/components/power_supply.py @@ -4,9 +4,9 @@ import esphomeyaml.config_validation as cv from esphomeyaml import pins from esphomeyaml.const import CONF_ENABLE_TIME, CONF_ID, CONF_KEEP_ON_TIME, CONF_PIN from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, gpio_output_pin_expression, \ - setup_component + setup_component, Component -PowerSupplyComponent = esphomelib_ns.PowerSupplyComponent +PowerSupplyComponent = esphomelib_ns.class_('PowerSupplyComponent', Component) POWER_SUPPLY_SCHEMA = vol.Schema({ vol.Required(CONF_ID): cv.declare_variable_id(PowerSupplyComponent), diff --git a/esphomeyaml/components/rdm6300.py b/esphomeyaml/components/rdm6300.py index ff2f490f44..c6de71553a 100644 --- a/esphomeyaml/components/rdm6300.py +++ b/esphomeyaml/components/rdm6300.py @@ -1,18 +1,18 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import binary_sensor -from esphomeyaml.components.uart import UARTComponent +from esphomeyaml.components import binary_sensor, uart from esphomeyaml.const import CONF_ID, CONF_UART_ID -from esphomeyaml.helpers import App, Pvariable, get_variable, setup_component +from esphomeyaml.helpers import App, Pvariable, get_variable, setup_component, Component DEPENDENCIES = ['uart'] -RDM6300Component = binary_sensor.binary_sensor_ns.RDM6300Component +RDM6300Component = binary_sensor.binary_sensor_ns.class_('RDM6300Component', Component, + uart.UARTDevice) CONFIG_SCHEMA = vol.All(cv.ensure_list_not_empty, [vol.Schema({ cv.GenerateID(): cv.declare_variable_id(RDM6300Component), - cv.GenerateID(CONF_UART_ID): cv.use_variable_id(UARTComponent), + cv.GenerateID(CONF_UART_ID): cv.use_variable_id(uart.UARTComponent), }).extend(cv.COMPONENT_SCHEMA.schema)]) diff --git a/esphomeyaml/components/remote_receiver.py b/esphomeyaml/components/remote_receiver.py index 38cff0c83d..878e5a6fc5 100644 --- a/esphomeyaml/components/remote_receiver.py +++ b/esphomeyaml/components/remote_receiver.py @@ -5,20 +5,25 @@ from esphomeyaml import pins from esphomeyaml.const import CONF_BUFFER_SIZE, CONF_DUMP, CONF_FILTER, CONF_ID, CONF_IDLE, \ CONF_PIN, CONF_TOLERANCE from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, gpio_input_pin_expression, \ - setup_component + setup_component, Component remote_ns = esphomelib_ns.namespace('remote') -RemoteReceiverComponent = remote_ns.RemoteReceiverComponent +RemoteControlComponentBase = remote_ns.class_('RemoteControlComponentBase') +RemoteReceiverComponent = remote_ns.class_('RemoteReceiverComponent', + RemoteControlComponentBase, + Component) + +RemoteReceiveDumper = remote_ns.class_('RemoteReceiveDumper') DUMPERS = { - 'lg': remote_ns.LGDumper, - 'nec': remote_ns.NECDumper, - 'panasonic': remote_ns.PanasonicDumper, - 'raw': remote_ns.RawDumper, - 'samsung': remote_ns.SamsungDumper, - 'sony': remote_ns.SonyDumper, - 'rc_switch': remote_ns.RCSwitchDumper, + 'lg': remote_ns.class_('LGDumper', RemoteReceiveDumper), + 'nec': remote_ns.class_('NECDumper', RemoteReceiveDumper), + 'panasonic': remote_ns.class_('PanasonicDumper', RemoteReceiveDumper), + 'raw': remote_ns.class_('RawDumper', RemoteReceiveDumper), + 'samsung': remote_ns.class_('SamsungDumper', RemoteReceiveDumper), + 'sony': remote_ns.class_('SonyDumper', RemoteReceiveDumper), + 'rc_switch': remote_ns.class_('RCSwitchDumper', RemoteReceiveDumper), } diff --git a/esphomeyaml/components/remote_transmitter.py b/esphomeyaml/components/remote_transmitter.py index 3b0cc985d1..144ac2bfdf 100644 --- a/esphomeyaml/components/remote_transmitter.py +++ b/esphomeyaml/components/remote_transmitter.py @@ -1,18 +1,18 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv from esphomeyaml import pins +from esphomeyaml.components.remote_receiver import RemoteControlComponentBase, remote_ns +import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_ADDRESS, CONF_CARRIER_DUTY_PERCENT, CONF_CHANNEL, CONF_CODE, \ CONF_DEVICE, CONF_FAMILY, CONF_GROUP, CONF_ID, CONF_INVERTED, CONF_ONE, CONF_PIN, \ CONF_PROTOCOL, CONF_PULSE_LENGTH, CONF_STATE, CONF_SYNC, CONF_ZERO from esphomeyaml.core import HexInt -from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, gpio_output_pin_expression, \ +from esphomeyaml.helpers import App, Component, Pvariable, add, gpio_output_pin_expression, \ setup_component -remote_ns = esphomelib_ns.namespace('remote') - -RemoteTransmitterComponent = remote_ns.RemoteTransmitterComponent -RCSwitchProtocol = remote_ns.RCSwitchProtocol +RemoteTransmitterComponent = remote_ns.class_('RemoteTransmitterComponent', + RemoteControlComponentBase, Component) +RCSwitchProtocol = remote_ns.class_('RCSwitchProtocol') rc_switch_protocols = remote_ns.rc_switch_protocols diff --git a/esphomeyaml/components/script.py b/esphomeyaml/components/script.py index 6c8c52469e..5aab19c3c8 100644 --- a/esphomeyaml/components/script.py +++ b/esphomeyaml/components/script.py @@ -4,10 +4,11 @@ from esphomeyaml import automation from esphomeyaml.automation import ACTION_REGISTRY, maybe_simple_id import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_ID -from esphomeyaml.helpers import NoArg, Pvariable, TemplateArguments, esphomelib_ns, get_variable +from esphomeyaml.helpers import NoArg, Pvariable, TemplateArguments, esphomelib_ns, get_variable, \ + Trigger, Action -Script = esphomelib_ns.Script -ScriptExecuteAction = esphomelib_ns.ScriptExecuteAction +Script = esphomelib_ns.class_('Script', Trigger.template(NoArg)) +ScriptExecuteAction = esphomelib_ns.class_('ScriptExecuteAction', Action) CONFIG_SCHEMA = automation.validate_automation({ vol.Required(CONF_ID): cv.declare_variable_id(Script), diff --git a/esphomeyaml/components/sensor/__init__.py b/esphomeyaml/components/sensor/__init__.py index 6b648b418f..f11ed35a46 100644 --- a/esphomeyaml/components/sensor/__init__.py +++ b/esphomeyaml/components/sensor/__init__.py @@ -11,7 +11,8 @@ from esphomeyaml.const import CONF_ABOVE, CONF_ACCURACY_DECIMALS, CONF_ALPHA, CO CONF_THROTTLE, CONF_TRIGGER_ID, CONF_UNIQUE, CONF_UNIT_OF_MEASUREMENT, CONF_WINDOW_SIZE, \ CONF_SEND_FIRST_AT from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, add, add_job, esphomelib_ns, \ - float_, process_lambda, setup_mqtt_component, templatable + float_, process_lambda, setup_mqtt_component, templatable, Nameable, PollingComponent, Trigger, \ + Component PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ @@ -58,31 +59,40 @@ FILTERS_SCHEMA = vol.All(cv.ensure_list, [vol.All({ vol.Optional(CONF_OR): validate_recursive_filter, }, cv.has_exactly_one_key(*FILTER_KEYS))]) -# pylint: disable=invalid-name +# Base sensor_ns = esphomelib_ns.namespace('sensor') -Sensor = sensor_ns.Sensor -MQTTSensorComponent = sensor_ns.MQTTSensorComponent -OffsetFilter = sensor_ns.OffsetFilter -MultiplyFilter = sensor_ns.MultiplyFilter -FilterOutValueFilter = sensor_ns.FilterOutValueFilter -FilterOutNANFilter = sensor_ns.FilterOutNANFilter -SlidingWindowMovingAverageFilter = sensor_ns.SlidingWindowMovingAverageFilter -ExponentialMovingAverageFilter = sensor_ns.ExponentialMovingAverageFilter -LambdaFilter = sensor_ns.LambdaFilter -ThrottleFilter = sensor_ns.ThrottleFilter -DeltaFilter = sensor_ns.DeltaFilter -OrFilter = sensor_ns.OrFilter -HeartbeatFilter = sensor_ns.HeartbeatFilter -DebounceFilter = sensor_ns.DebounceFilter -UniqueFilter = sensor_ns.UniqueFilter +Sensor = sensor_ns.class_('Sensor', Nameable) +MQTTSensorComponent = sensor_ns.class_('MQTTSensorComponent', mqtt.MQTTComponent) + +PollingSensorComponent = sensor_ns.class_('PollingSensorComponent', PollingComponent, Sensor) +EmptySensor = sensor_ns.class_('EmptySensor', Sensor) +EmptyPollingParentSensor = sensor_ns.class_('EmptyPollingParentSensor', EmptySensor) + +# Triggers +SensorStateTrigger = sensor_ns.class_('SensorStateTrigger', Trigger.template(float_)) +SensorRawStateTrigger = sensor_ns.class_('SensorRawStateTrigger', Trigger.template(float_)) +ValueRangeTrigger = sensor_ns.class_('ValueRangeTrigger', Trigger.template(float_)) + + +# Filters +Filter = sensor_ns.class_('Filter') +SlidingWindowMovingAverageFilter = sensor_ns.class_('SlidingWindowMovingAverageFilter', Filter) +ExponentialMovingAverageFilter = sensor_ns.class_('ExponentialMovingAverageFilter', Filter) +LambdaFilter = sensor_ns.class_('LambdaFilter', Filter) +OffsetFilter = sensor_ns.class_('OffsetFilter', Filter) +MultiplyFilter = sensor_ns.class_('MultiplyFilter', Filter) +FilterOutValueFilter = sensor_ns.class_('FilterOutValueFilter', Filter) +FilterOutNANFilter = sensor_ns.class_('FilterOutNANFilter', Filter) +ThrottleFilter = sensor_ns.class_('ThrottleFilter', Filter) +DebounceFilter = sensor_ns.class_('DebounceFilter', Filter, Component) +HeartbeatFilter = sensor_ns.class_('HeartbeatFilter', Filter, Component) +DeltaFilter = sensor_ns.class_('DeltaFilter', Filter) +OrFilter = sensor_ns.class_('OrFilter', Filter) +UniqueFilter = sensor_ns.class_('UniqueFilter', Filter) -SensorStateTrigger = sensor_ns.SensorStateTrigger -SensorRawStateTrigger = sensor_ns.SensorRawStateTrigger -ValueRangeTrigger = sensor_ns.ValueRangeTrigger SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend({ cv.GenerateID(CONF_MQTT_ID): cv.declare_variable_id(MQTTSensorComponent), - cv.GenerateID(): cv.declare_variable_id(Sensor), vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string_strict, vol.Optional(CONF_ICON): cv.icon, vol.Optional(CONF_ACCURACY_DECIMALS): vol.Coerce(int), diff --git a/esphomeyaml/components/sensor/adc.py b/esphomeyaml/components/sensor/adc.py index d29f2759c2..f629ee3d4d 100644 --- a/esphomeyaml/components/sensor/adc.py +++ b/esphomeyaml/components/sensor/adc.py @@ -22,8 +22,8 @@ def validate_adc_pin(value): return pins.analog_pin(value) -MakeADCSensor = Application.MakeADCSensor -ADCSensorComponent = sensor.sensor_ns.ADCSensorComponent +MakeADCSensor = Application.struct('MakeADCSensor') +ADCSensorComponent = sensor.sensor_ns.class_('ADCSensorComponent', sensor.PollingSensorComponent) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(ADCSensorComponent), diff --git a/esphomeyaml/components/sensor/ads1115.py b/esphomeyaml/components/sensor/ads1115.py index 153d55d640..5f6c296789 100644 --- a/esphomeyaml/components/sensor/ads1115.py +++ b/esphomeyaml/components/sensor/ads1115.py @@ -9,24 +9,26 @@ from esphomeyaml.helpers import get_variable DEPENDENCIES = ['ads1115'] +ADS1115Multiplexer = sensor.sensor_ns.enum('ADS1115Multiplexer') MUX = { - 'A0_A1': sensor.sensor_ns.ADS1115_MULTIPLEXER_P0_N1, - 'A0_A3': sensor.sensor_ns.ADS1115_MULTIPLEXER_P0_N3, - 'A1_A3': sensor.sensor_ns.ADS1115_MULTIPLEXER_P1_N3, - 'A2_A3': sensor.sensor_ns.ADS1115_MULTIPLEXER_P2_N3, - 'A0_GND': sensor.sensor_ns.ADS1115_MULTIPLEXER_P0_NG, - 'A1_GND': sensor.sensor_ns.ADS1115_MULTIPLEXER_P1_NG, - 'A2_GND': sensor.sensor_ns.ADS1115_MULTIPLEXER_P2_NG, - 'A3_GND': sensor.sensor_ns.ADS1115_MULTIPLEXER_P3_NG, + 'A0_A1': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P0_N1, + 'A0_A3': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P0_N3, + 'A1_A3': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P1_N3, + 'A2_A3': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P2_N3, + 'A0_GND': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P0_NG, + 'A1_GND': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P1_NG, + 'A2_GND': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P2_NG, + 'A3_GND': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P3_NG, } +ADS1115Gain = sensor.sensor_ns.enum('ADS1115Gain') GAIN = { - '6.144': sensor.sensor_ns.ADS1115_GAIN_6P144, - '4.096': sensor.sensor_ns.ADS1115_GAIN_6P096, - '2.048': sensor.sensor_ns.ADS1115_GAIN_2P048, - '1.024': sensor.sensor_ns.ADS1115_GAIN_1P024, - '0.512': sensor.sensor_ns.ADS1115_GAIN_0P512, - '0.256': sensor.sensor_ns.ADS1115_GAIN_0P256, + '6.144': ADS1115Gain.ADS1115_GAIN_6P144, + '4.096': ADS1115Gain.ADS1115_GAIN_6P096, + '2.048': ADS1115Gain.ADS1115_GAIN_2P048, + '1.024': ADS1115Gain.ADS1115_GAIN_1P024, + '0.512': ADS1115Gain.ADS1115_GAIN_0P512, + '0.256': ADS1115Gain.ADS1115_GAIN_0P256, } @@ -45,7 +47,7 @@ def validate_mux(value): return cv.one_of(*MUX)(value) -ADS1115Sensor = sensor.sensor_ns.ADS1115Sensor +ADS1115Sensor = sensor.sensor_ns.class_('ADS1115Sensor', sensor.EmptySensor) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(ADS1115Sensor), diff --git a/esphomeyaml/components/sensor/bh1750.py b/esphomeyaml/components/sensor/bh1750.py index 87dd054d27..09057e5f7f 100644 --- a/esphomeyaml/components/sensor/bh1750.py +++ b/esphomeyaml/components/sensor/bh1750.py @@ -1,21 +1,23 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor +from esphomeyaml.components import sensor, i2c from esphomeyaml.const import CONF_ADDRESS, CONF_MAKE_ID, CONF_NAME, CONF_RESOLUTION, \ CONF_UPDATE_INTERVAL from esphomeyaml.helpers import App, Application, add, variable, setup_component DEPENDENCIES = ['i2c'] +BH1750Resolution = sensor.sensor_ns.enum('BH1750Resolution') BH1750_RESOLUTIONS = { - 4.0: sensor.sensor_ns.BH1750_RESOLUTION_4P0_LX, - 1.0: sensor.sensor_ns.BH1750_RESOLUTION_1P0_LX, - 0.5: sensor.sensor_ns.BH1750_RESOLUTION_0P5_LX, + 4.0: BH1750Resolution.BH1750_RESOLUTION_4P0_LX, + 1.0: BH1750Resolution.BH1750_RESOLUTION_1P0_LX, + 0.5: BH1750Resolution.BH1750_RESOLUTION_0P5_LX, } -MakeBH1750Sensor = Application.MakeBH1750Sensor -BH1750Sensor = sensor.sensor_ns.BH1750Sensor +MakeBH1750Sensor = Application.struct('MakeBH1750Sensor') +BH1750Sensor = sensor.sensor_ns.class_('BH1750Sensor', sensor.PollingSensorComponent, + i2c.I2CDevice) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(BH1750Sensor), diff --git a/esphomeyaml/components/sensor/ble_rssi.py b/esphomeyaml/components/sensor/ble_rssi.py index 4240b41bd4..e209b9af64 100644 --- a/esphomeyaml/components/sensor/ble_rssi.py +++ b/esphomeyaml/components/sensor/ble_rssi.py @@ -9,7 +9,7 @@ from esphomeyaml.helpers import get_variable, esphomelib_ns DEPENDENCIES = ['esp32_ble_tracker'] -ESP32BLERSSISensor = esphomelib_ns.ESP32BLERSSISensor +ESP32BLERSSISensor = esphomelib_ns.class_('ESP32BLERSSISensor', sensor.Sensor) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(ESP32BLERSSISensor), @@ -19,7 +19,6 @@ PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ def to_code(config): - hub = None for hub in get_variable(config[CONF_ESP32_BLE_ID]): yield rhs = hub.make_rssi_sensor(config[CONF_NAME], make_address_array(config[CONF_MAC_ADDRESS])) diff --git a/esphomeyaml/components/sensor/bme280.py b/esphomeyaml/components/sensor/bme280.py index 1f48f1f204..23e395f6ef 100644 --- a/esphomeyaml/components/sensor/bme280.py +++ b/esphomeyaml/components/sensor/bme280.py @@ -8,35 +8,49 @@ from esphomeyaml.helpers import App, Application, add, variable, setup_component DEPENDENCIES = ['i2c'] +BME280Oversampling = sensor.sensor_ns.enum('BME280Oversampling') OVERSAMPLING_OPTIONS = { - 'NONE': sensor.sensor_ns.BME280_OVERSAMPLING_NONE, - '1X': sensor.sensor_ns.BME280_OVERSAMPLING_1X, - '2X': sensor.sensor_ns.BME280_OVERSAMPLING_2X, - '4X': sensor.sensor_ns.BME280_OVERSAMPLING_4X, - '8X': sensor.sensor_ns.BME280_OVERSAMPLING_8X, - '16X': sensor.sensor_ns.BME280_OVERSAMPLING_16X, + 'NONE': BME280Oversampling.BME280_OVERSAMPLING_NONE, + '1X': BME280Oversampling.BME280_OVERSAMPLING_1X, + '2X': BME280Oversampling.BME280_OVERSAMPLING_2X, + '4X': BME280Oversampling.BME280_OVERSAMPLING_4X, + '8X': BME280Oversampling.BME280_OVERSAMPLING_8X, + '16X': BME280Oversampling.BME280_OVERSAMPLING_16X, } +BME280IIRFilter = sensor.sensor_ns.enum('BME280IIRFilter') IIR_FILTER_OPTIONS = { - 'OFF': sensor.sensor_ns.BME280_IIR_FILTER_OFF, - '2X': sensor.sensor_ns.BME280_IIR_FILTER_2X, - '4X': sensor.sensor_ns.BME280_IIR_FILTER_4X, - '8X': sensor.sensor_ns.BME280_IIR_FILTER_8X, - '16X': sensor.sensor_ns.BME280_IIR_FILTER_16X, + 'OFF': BME280IIRFilter.BME280_IIR_FILTER_OFF, + '2X': BME280IIRFilter.BME280_IIR_FILTER_2X, + '4X': BME280IIRFilter.BME280_IIR_FILTER_4X, + '8X': BME280IIRFilter.BME280_IIR_FILTER_8X, + '16X': BME280IIRFilter.BME280_IIR_FILTER_16X, } BME280_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ vol.Optional(CONF_OVERSAMPLING): vol.All(vol.Upper, cv.one_of(*OVERSAMPLING_OPTIONS)), }) -MakeBME280Sensor = Application.MakeBME280Sensor +MakeBME280Sensor = Application.struct('MakeBME280Sensor') +BME280TemperatureSensor = sensor.sensor_ns.class_('BME280TemperatureSensor', + sensor.EmptyPollingParentSensor) +BME280PressureSensor = sensor.sensor_ns.class_('BME280PressureSensor', + sensor.EmptyPollingParentSensor) +BME280HumiditySensor = sensor.sensor_ns.class_('BME280HumiditySensor', + sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBME280Sensor), vol.Optional(CONF_ADDRESS, default=0x77): cv.i2c_address, - vol.Required(CONF_TEMPERATURE): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA), - vol.Required(CONF_PRESSURE): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA), - vol.Required(CONF_HUMIDITY): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA), + vol.Required(CONF_TEMPERATURE): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(BME280TemperatureSensor), + })), + vol.Required(CONF_PRESSURE): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(BME280PressureSensor), + })), + vol.Required(CONF_HUMIDITY): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(BME280HumiditySensor), + })), vol.Optional(CONF_IIR_FILTER): vol.All(vol.Upper, cv.one_of(*IIR_FILTER_OPTIONS)), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema) diff --git a/esphomeyaml/components/sensor/bme680.py b/esphomeyaml/components/sensor/bme680.py index 04f2e71338..71778574a1 100644 --- a/esphomeyaml/components/sensor/bme680.py +++ b/esphomeyaml/components/sensor/bme680.py @@ -10,39 +10,57 @@ from esphomeyaml.helpers import App, Application, add, variable, setup_component DEPENDENCIES = ['i2c'] +BME680Oversampling = sensor.sensor_ns.enum('BME680Oversampling') OVERSAMPLING_OPTIONS = { - 'NONE': sensor.sensor_ns.BME680_OVERSAMPLING_NONE, - '1X': sensor.sensor_ns.BME680_OVERSAMPLING_1X, - '2X': sensor.sensor_ns.BME680_OVERSAMPLING_2X, - '4X': sensor.sensor_ns.BME680_OVERSAMPLING_4X, - '8X': sensor.sensor_ns.BME680_OVERSAMPLING_8X, - '16X': sensor.sensor_ns.BME680_OVERSAMPLING_16X, + 'NONE': BME680Oversampling.BME680_OVERSAMPLING_NONE, + '1X': BME680Oversampling.BME680_OVERSAMPLING_1X, + '2X': BME680Oversampling.BME680_OVERSAMPLING_2X, + '4X': BME680Oversampling.BME680_OVERSAMPLING_4X, + '8X': BME680Oversampling.BME680_OVERSAMPLING_8X, + '16X': BME680Oversampling.BME680_OVERSAMPLING_16X, } +BME680IIRFilter = sensor.sensor_ns.enum('BME680IIRFilter') IIR_FILTER_OPTIONS = { - 'OFF': sensor.sensor_ns.BME680_IIR_FILTER_OFF, - '1X': sensor.sensor_ns.BME680_IIR_FILTER_1X, - '3X': sensor.sensor_ns.BME680_IIR_FILTER_3X, - '7X': sensor.sensor_ns.BME680_IIR_FILTER_7X, - '15X': sensor.sensor_ns.BME680_IIR_FILTER_15X, - '31X': sensor.sensor_ns.BME680_IIR_FILTER_31X, - '63X': sensor.sensor_ns.BME680_IIR_FILTER_63X, - '127X': sensor.sensor_ns.BME680_IIR_FILTER_127X, + 'OFF': BME680IIRFilter.BME680_IIR_FILTER_OFF, + '1X': BME680IIRFilter.BME680_IIR_FILTER_1X, + '3X': BME680IIRFilter.BME680_IIR_FILTER_3X, + '7X': BME680IIRFilter.BME680_IIR_FILTER_7X, + '15X': BME680IIRFilter.BME680_IIR_FILTER_15X, + '31X': BME680IIRFilter.BME680_IIR_FILTER_31X, + '63X': BME680IIRFilter.BME680_IIR_FILTER_63X, + '127X': BME680IIRFilter.BME680_IIR_FILTER_127X, } BME680_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ vol.Optional(CONF_OVERSAMPLING): vol.All(vol.Upper, cv.one_of(*OVERSAMPLING_OPTIONS)), }) -MakeBME680Sensor = Application.MakeBME680Sensor +MakeBME680Sensor = Application.struct('MakeBME680Sensor') +BME680TemperatureSensor = sensor.sensor_ns.class_('BME680TemperatureSensor', + sensor.EmptyPollingParentSensor) +BME680PressureSensor = sensor.sensor_ns.class_('BME680PressureSensor', + sensor.EmptyPollingParentSensor) +BME680HumiditySensor = sensor.sensor_ns.class_('BME680HumiditySensor', + sensor.EmptyPollingParentSensor) +BME680GasResistanceSensor = sensor.sensor_ns.class_('BME680GasResistanceSensor', + sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBME680Sensor), vol.Optional(CONF_ADDRESS, default=0x76): cv.i2c_address, - vol.Required(CONF_TEMPERATURE): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA), - vol.Required(CONF_PRESSURE): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA), - vol.Required(CONF_HUMIDITY): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA), - vol.Required(CONF_GAS_RESISTANCE): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Required(CONF_TEMPERATURE): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(BME680TemperatureSensor), + })), + vol.Required(CONF_PRESSURE): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(BME680PressureSensor), + })), + vol.Required(CONF_HUMIDITY): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(BME680HumiditySensor), + })), + vol.Required(CONF_GAS_RESISTANCE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(BME680GasResistanceSensor), + })), vol.Optional(CONF_IIR_FILTER): vol.All(vol.Upper, cv.one_of(*IIR_FILTER_OPTIONS)), vol.Optional(CONF_HEATER): vol.Any(None, vol.All(vol.Schema({ vol.Optional(CONF_TEMPERATURE, default=320): vol.All(vol.Coerce(int), vol.Range(200, 400)), diff --git a/esphomeyaml/components/sensor/bmp085.py b/esphomeyaml/components/sensor/bmp085.py index 74a12ce187..24b7199a10 100644 --- a/esphomeyaml/components/sensor/bmp085.py +++ b/esphomeyaml/components/sensor/bmp085.py @@ -8,12 +8,20 @@ from esphomeyaml.helpers import App, Application, HexIntLiteral, add, variable, DEPENDENCIES = ['i2c'] -MakeBMP085Sensor = Application.MakeBMP085Sensor +MakeBMP085Sensor = Application.struct('MakeBMP085Sensor') +BMP085TemperatureSensor = sensor.sensor_ns.class_('BMP085TemperatureSensor', + sensor.EmptyPollingParentSensor) +BMP085PressureSensor = sensor.sensor_ns.class_('BMP085PressureSensor', + sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBMP085Sensor), - vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Required(CONF_PRESSURE): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(BMP085TemperatureSensor), + })), + vol.Required(CONF_PRESSURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(BMP085PressureSensor), + })), vol.Optional(CONF_ADDRESS): cv.i2c_address, vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema) diff --git a/esphomeyaml/components/sensor/bmp280.py b/esphomeyaml/components/sensor/bmp280.py index 4c09681f01..35d30403d8 100644 --- a/esphomeyaml/components/sensor/bmp280.py +++ b/esphomeyaml/components/sensor/bmp280.py @@ -8,34 +8,44 @@ from esphomeyaml.helpers import App, Application, add, variable, setup_component DEPENDENCIES = ['i2c'] +BMP280Oversampling = sensor.sensor_ns.enum('BMP280Oversampling') OVERSAMPLING_OPTIONS = { - 'NONE': sensor.sensor_ns.BMP280_OVERSAMPLING_NONE, - '1X': sensor.sensor_ns.BMP280_OVERSAMPLING_1X, - '2X': sensor.sensor_ns.BMP280_OVERSAMPLING_2X, - '4X': sensor.sensor_ns.BMP280_OVERSAMPLING_4X, - '8X': sensor.sensor_ns.BMP280_OVERSAMPLING_8X, - '16X': sensor.sensor_ns.BMP280_OVERSAMPLING_16X, + 'NONE': BMP280Oversampling.BMP280_OVERSAMPLING_NONE, + '1X': BMP280Oversampling.BMP280_OVERSAMPLING_1X, + '2X': BMP280Oversampling.BMP280_OVERSAMPLING_2X, + '4X': BMP280Oversampling.BMP280_OVERSAMPLING_4X, + '8X': BMP280Oversampling.BMP280_OVERSAMPLING_8X, + '16X': BMP280Oversampling.BMP280_OVERSAMPLING_16X, } +BMP280IIRFilter = sensor.sensor_ns.enum('BMP280IIRFilter') IIR_FILTER_OPTIONS = { - 'OFF': sensor.sensor_ns.BMP280_IIR_FILTER_OFF, - '2X': sensor.sensor_ns.BMP280_IIR_FILTER_2X, - '4X': sensor.sensor_ns.BMP280_IIR_FILTER_4X, - '8X': sensor.sensor_ns.BMP280_IIR_FILTER_8X, - '16X': sensor.sensor_ns.BMP280_IIR_FILTER_16X, + 'OFF': BMP280IIRFilter.BMP280_IIR_FILTER_OFF, + '2X': BMP280IIRFilter.BMP280_IIR_FILTER_2X, + '4X': BMP280IIRFilter.BMP280_IIR_FILTER_4X, + '8X': BMP280IIRFilter.BMP280_IIR_FILTER_8X, + '16X': BMP280IIRFilter.BMP280_IIR_FILTER_16X, } BMP280_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ vol.Optional(CONF_OVERSAMPLING): vol.All(vol.Upper, cv.one_of(*OVERSAMPLING_OPTIONS)), }) -MakeBMP280Sensor = Application.MakeBMP280Sensor +MakeBMP280Sensor = Application.struct('MakeBMP280Sensor') +BMP280TemperatureSensor = sensor.sensor_ns.class_('BMP280TemperatureSensor', + sensor.EmptyPollingParentSensor) +BMP280PressureSensor = sensor.sensor_ns.class_('BMP280PressureSensor', + sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBMP280Sensor), vol.Optional(CONF_ADDRESS, default=0x77): cv.i2c_address, - vol.Required(CONF_TEMPERATURE): cv.nameable(BMP280_OVERSAMPLING_SENSOR_SCHEMA), - vol.Required(CONF_PRESSURE): cv.nameable(BMP280_OVERSAMPLING_SENSOR_SCHEMA), + vol.Required(CONF_TEMPERATURE): cv.nameable(BMP280_OVERSAMPLING_SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(BMP280TemperatureSensor), + })), + vol.Required(CONF_PRESSURE): cv.nameable(BMP280_OVERSAMPLING_SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(BMP280PressureSensor), + })), vol.Optional(CONF_IIR_FILTER): vol.All(vol.Upper, cv.one_of(*IIR_FILTER_OPTIONS)), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema) diff --git a/esphomeyaml/components/sensor/cse7766.py b/esphomeyaml/components/sensor/cse7766.py index 0bc5c07b05..917266afed 100644 --- a/esphomeyaml/components/sensor/cse7766.py +++ b/esphomeyaml/components/sensor/cse7766.py @@ -1,23 +1,35 @@ import voluptuous as vol -from esphomeyaml.components import sensor +from esphomeyaml.components import sensor, uart from esphomeyaml.components.uart import UARTComponent import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_CURRENT, CONF_ID, CONF_NAME, CONF_POWER, CONF_UART_ID, \ CONF_VOLTAGE -from esphomeyaml.helpers import App, Pvariable, get_variable, setup_component +from esphomeyaml.helpers import App, Pvariable, get_variable, setup_component, Component DEPENDENCIES = ['uart'] -CSE7766Component = sensor.sensor_ns.CSE7766Component +CSE7766Component = sensor.sensor_ns.class_('CSE7766Component', Component, uart.UARTDevice) +CSE7766VoltageSensor = sensor.sensor_ns.class_('CSE7766VoltageSensor', + sensor.EmptySensor) +CSE7766CurrentSensor = sensor.sensor_ns.class_('CSE7766CurrentSensor', + sensor.EmptySensor) +CSE7766PowerSensor = sensor.sensor_ns.class_('CSE7766PowerSensor', + sensor.EmptySensor) PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(CSE7766Component), cv.GenerateID(CONF_UART_ID): cv.use_variable_id(UARTComponent), - vol.Optional(CONF_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Optional(CONF_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(CSE7766VoltageSensor), + })), + vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(CSE7766CurrentSensor), + })), + vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(CSE7766PowerSensor), + })), }).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(CONF_VOLTAGE, CONF_CURRENT, CONF_POWER)) diff --git a/esphomeyaml/components/sensor/dallas.py b/esphomeyaml/components/sensor/dallas.py index fa9ed39cfb..b974c8e636 100644 --- a/esphomeyaml/components/sensor/dallas.py +++ b/esphomeyaml/components/sensor/dallas.py @@ -7,7 +7,8 @@ from esphomeyaml.const import CONF_ADDRESS, CONF_DALLAS_ID, CONF_INDEX, CONF_NAM CONF_RESOLUTION from esphomeyaml.helpers import HexIntLiteral, get_variable -DallasTemperatureSensor = sensor.sensor_ns.DallasTemperatureSensor +DallasTemperatureSensor = sensor.sensor_ns.class_('DallasTemperatureSensor', + sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(DallasTemperatureSensor), diff --git a/esphomeyaml/components/sensor/dht.py b/esphomeyaml/components/sensor/dht.py index 967e725b90..a13d0f0fdd 100644 --- a/esphomeyaml/components/sensor/dht.py +++ b/esphomeyaml/components/sensor/dht.py @@ -3,26 +3,37 @@ import voluptuous as vol import esphomeyaml.config_validation as cv from esphomeyaml.components import sensor from esphomeyaml.const import CONF_HUMIDITY, CONF_MAKE_ID, CONF_MODEL, CONF_NAME, CONF_PIN, \ - CONF_TEMPERATURE, CONF_UPDATE_INTERVAL + CONF_TEMPERATURE, CONF_UPDATE_INTERVAL, CONF_ID from esphomeyaml.helpers import App, Application, add, gpio_output_pin_expression, variable, \ - setup_component + setup_component, PollingComponent, Pvariable from esphomeyaml.pins import gpio_output_pin_schema +DHTModel = sensor.sensor_ns.enum('DHTModel') DHT_MODELS = { - 'AUTO_DETECT': sensor.sensor_ns.DHT_MODEL_AUTO_DETECT, - 'DHT11': sensor.sensor_ns.DHT_MODEL_DHT11, - 'DHT22': sensor.sensor_ns.DHT_MODEL_DHT22, - 'AM2302': sensor.sensor_ns.DHT_MODEL_AM2302, - 'RHT03': sensor.sensor_ns.DHT_MODEL_RHT03, + 'AUTO_DETECT': DHTModel.DHT_MODEL_AUTO_DETECT, + 'DHT11': DHTModel.DHT_MODEL_DHT11, + 'DHT22': DHTModel.DHT_MODEL_DHT22, + 'AM2302': DHTModel.DHT_MODEL_AM2302, + 'RHT03': DHTModel.DHT_MODEL_RHT03, } -MakeDHTSensor = Application.MakeDHTSensor +MakeDHTSensor = Application.struct('MakeDHTSensor') +DHTComponent = sensor.sensor_ns.class_('DHTComponent', PollingComponent) +DHTTemperatureSensor = sensor.sensor_ns.class_('DHTTemperatureSensor', + sensor.EmptyPollingParentSensor) +DHTHumiditySensor = sensor.sensor_ns.class_('DHTHumiditySensor', + sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDHTSensor), + cv.GenerateID(): cv.declare_variable_id(DHTComponent), vol.Required(CONF_PIN): gpio_output_pin_schema, - vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(DHTTemperatureSensor), + })), + vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(DHTHumiditySensor), + })), vol.Optional(CONF_MODEL): vol.All(vol.Upper, cv.one_of(*DHT_MODELS)), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema) @@ -34,16 +45,19 @@ def to_code(config): rhs = App.make_dht_sensor(config[CONF_TEMPERATURE][CONF_NAME], config[CONF_HUMIDITY][CONF_NAME], pin, config.get(CONF_UPDATE_INTERVAL)) - dht = variable(config[CONF_MAKE_ID], rhs) + make = variable(config[CONF_MAKE_ID], rhs) + dht = make.Pdht + Pvariable(config[CONF_ID], dht) + if CONF_MODEL in config: constant = DHT_MODELS[config[CONF_MODEL]] - add(dht.Pdht.set_dht_model(constant)) + add(dht.set_dht_model(constant)) - sensor.setup_sensor(dht.Pdht.Pget_temperature_sensor(), - dht.Pmqtt_temperature, config[CONF_TEMPERATURE]) - sensor.setup_sensor(dht.Pdht.Pget_humidity_sensor(), - dht.Pmqtt_humidity, config[CONF_HUMIDITY]) - setup_component(dht.Pdht, config) + sensor.setup_sensor(dht.Pget_temperature_sensor(), + make.Pmqtt_temperature, config[CONF_TEMPERATURE]) + sensor.setup_sensor(dht.Pget_humidity_sensor(), + make.Pmqtt_humidity, config[CONF_HUMIDITY]) + setup_component(dht, config) BUILD_FLAGS = '-DUSE_DHT_SENSOR' diff --git a/esphomeyaml/components/sensor/dht12.py b/esphomeyaml/components/sensor/dht12.py index 518203a5d4..7e80ab410e 100644 --- a/esphomeyaml/components/sensor/dht12.py +++ b/esphomeyaml/components/sensor/dht12.py @@ -1,19 +1,30 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor +from esphomeyaml.components import sensor, i2c from esphomeyaml.const import CONF_HUMIDITY, CONF_MAKE_ID, CONF_NAME, CONF_TEMPERATURE, \ - CONF_UPDATE_INTERVAL -from esphomeyaml.helpers import App, Application, variable, setup_component + CONF_UPDATE_INTERVAL, CONF_ID +from esphomeyaml.helpers import App, Application, variable, setup_component, PollingComponent, \ + Pvariable DEPENDENCIES = ['i2c'] -MakeDHT12Sensor = Application.MakeDHT12Sensor +MakeDHT12Sensor = Application.struct('MakeDHT12Sensor') +DHT12Component = sensor.sensor_ns.class_('DHT12Component', PollingComponent, i2c.I2CDevice) +DHT12TemperatureSensor = sensor.sensor_ns.class_('DHT12TemperatureSensor', + sensor.EmptyPollingParentSensor) +DHT12HumiditySensor = sensor.sensor_ns.class_('DHT12HumiditySensor', + sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDHT12Sensor), - vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA), + cv.GenerateID(): cv.declare_variable_id(DHT12Component), + vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(DHT12TemperatureSensor), + })), + vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(DHT12HumiditySensor), + })), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema) @@ -22,13 +33,15 @@ def to_code(config): rhs = App.make_dht12_sensor(config[CONF_TEMPERATURE][CONF_NAME], config[CONF_HUMIDITY][CONF_NAME], config.get(CONF_UPDATE_INTERVAL)) - dht = variable(config[CONF_MAKE_ID], rhs) + make = variable(config[CONF_MAKE_ID], rhs) + dht = make.Pdht12 + Pvariable(config[CONF_ID], dht) - sensor.setup_sensor(dht.Pdht12.Pget_temperature_sensor(), dht.Pmqtt_temperature, + sensor.setup_sensor(dht.Pget_temperature_sensor(), make.Pmqtt_temperature, config[CONF_TEMPERATURE]) - sensor.setup_sensor(dht.Pdht12.Pget_humidity_sensor(), dht.Pmqtt_humidity, + sensor.setup_sensor(dht.Pget_humidity_sensor(), make.Pmqtt_humidity, config[CONF_HUMIDITY]) - setup_component(dht.Pdht12, config) + setup_component(dht, config) BUILD_FLAGS = '-DUSE_DHT12_SENSOR' diff --git a/esphomeyaml/components/sensor/duty_cycle.py b/esphomeyaml/components/sensor/duty_cycle.py index 85617da4e6..85f8ec3bd9 100644 --- a/esphomeyaml/components/sensor/duty_cycle.py +++ b/esphomeyaml/components/sensor/duty_cycle.py @@ -7,8 +7,8 @@ from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_PIN, CONF_UPDATE_INT from esphomeyaml.helpers import App, Application, gpio_input_pin_expression, variable, \ setup_component -MakeDutyCycleSensor = Application.MakeDutyCycleSensor -DutyCycleSensor = sensor.sensor_ns.DutyCycleSensor +MakeDutyCycleSensor = Application.struct('MakeDutyCycleSensor') +DutyCycleSensor = sensor.sensor_ns.class_('DutyCycleSensor', sensor.PollingSensorComponent) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(DutyCycleSensor), diff --git a/esphomeyaml/components/sensor/esp32_hall.py b/esphomeyaml/components/sensor/esp32_hall.py index dc06c11ee4..ddf2af9b5e 100644 --- a/esphomeyaml/components/sensor/esp32_hall.py +++ b/esphomeyaml/components/sensor/esp32_hall.py @@ -7,8 +7,8 @@ from esphomeyaml.helpers import App, Application, variable, setup_component ESP_PLATFORMS = [ESP_PLATFORM_ESP32] -MakeESP32HallSensor = Application.MakeESP32HallSensor -ESP32HallSensor = sensor.sensor_ns.ESP32HallSensor +MakeESP32HallSensor = Application.struct('MakeESP32HallSensor') +ESP32HallSensor = sensor.sensor_ns.class_('ESP32HallSensor', sensor.PollingSensorComponent) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(ESP32HallSensor), diff --git a/esphomeyaml/components/sensor/hdc1080.py b/esphomeyaml/components/sensor/hdc1080.py index 3aa78a036b..e8decc408a 100644 --- a/esphomeyaml/components/sensor/hdc1080.py +++ b/esphomeyaml/components/sensor/hdc1080.py @@ -1,19 +1,30 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor +from esphomeyaml.components import sensor, i2c from esphomeyaml.const import CONF_HUMIDITY, CONF_MAKE_ID, CONF_NAME, CONF_TEMPERATURE, \ - CONF_UPDATE_INTERVAL -from esphomeyaml.helpers import App, Application, variable, setup_component + CONF_UPDATE_INTERVAL, CONF_ID +from esphomeyaml.helpers import App, Application, variable, setup_component, PollingComponent, \ + Pvariable DEPENDENCIES = ['i2c'] -MakeHDC1080Sensor = Application.MakeHDC1080Sensor +MakeHDC1080Sensor = Application.struct('MakeHDC1080Sensor') +HDC1080Component = sensor.sensor_ns.class_('HDC1080Component', PollingComponent, i2c.I2CDevice) +HDC1080TemperatureSensor = sensor.sensor_ns.class_('HDC1080TemperatureSensor', + sensor.EmptyPollingParentSensor) +HDC1080HumiditySensor = sensor.sensor_ns.class_('HDC1080HumiditySensor', + sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHDC1080Sensor), - vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA), + cv.GenerateID(): cv.declare_variable_id(HDC1080Component), + vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(HDC1080TemperatureSensor), + })), + vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(HDC1080HumiditySensor), + })), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema) @@ -24,6 +35,7 @@ def to_code(config): config.get(CONF_UPDATE_INTERVAL)) make = variable(config[CONF_MAKE_ID], rhs) hdc1080 = make.Phdc1080 + Pvariable(config[CONF_ID], hdc1080) sensor.setup_sensor(hdc1080.Pget_temperature_sensor(), make.Pmqtt_temperature, diff --git a/esphomeyaml/components/sensor/hlw8012.py b/esphomeyaml/components/sensor/hlw8012.py index 2c4c0b5ced..0f2f7d0aa5 100644 --- a/esphomeyaml/components/sensor/hlw8012.py +++ b/esphomeyaml/components/sensor/hlw8012.py @@ -1,17 +1,18 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv from esphomeyaml import pins from esphomeyaml.components import sensor +import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_CF1_PIN, CONF_CF_PIN, CONF_CHANGE_MODE_EVERY, CONF_CURRENT, \ CONF_CURRENT_RESISTOR, CONF_ID, CONF_NAME, CONF_POWER, CONF_SEL_PIN, CONF_UPDATE_INTERVAL, \ CONF_VOLTAGE, CONF_VOLTAGE_DIVIDER -from esphomeyaml.helpers import App, Pvariable, add, gpio_output_pin_expression, setup_component +from esphomeyaml.helpers import App, PollingComponent, Pvariable, add, gpio_output_pin_expression, \ + setup_component -HLW8012Component = sensor.sensor_ns.HLW8012Component -HLW8012VoltageSensor = sensor.sensor_ns.HLW8012VoltageSensor -HLW8012CurrentSensor = sensor.sensor_ns.HLW8012CurrentSensor -HLW8012PowerSensor = sensor.sensor_ns.HLW8012PowerSensor +HLW8012Component = sensor.sensor_ns.class_('HLW8012Component', PollingComponent) +HLW8012VoltageSensor = sensor.sensor_ns.class_('HLW8012VoltageSensor', sensor.EmptySensor) +HLW8012CurrentSensor = sensor.sensor_ns.class_('HLW8012CurrentSensor', sensor.EmptySensor) +HLW8012PowerSensor = sensor.sensor_ns.class_('HLW8012PowerSensor', sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(HLW8012Component), @@ -19,9 +20,15 @@ PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ vol.Required(CONF_CF_PIN): pins.input_pin, vol.Required(CONF_CF1_PIN): pins.input_pin, - vol.Optional(CONF_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Optional(CONF_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(HLW8012VoltageSensor), + })), + vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(HLW8012CurrentSensor), + })), + vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(HLW8012PowerSensor), + })), vol.Optional(CONF_CURRENT_RESISTOR): cv.resistance, vol.Optional(CONF_VOLTAGE_DIVIDER): cv.positive_float, diff --git a/esphomeyaml/components/sensor/hmc5883l.py b/esphomeyaml/components/sensor/hmc5883l.py index dc05245158..a4ed04cf0a 100644 --- a/esphomeyaml/components/sensor/hmc5883l.py +++ b/esphomeyaml/components/sensor/hmc5883l.py @@ -2,9 +2,9 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor +from esphomeyaml.components import sensor, i2c from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_NAME, CONF_UPDATE_INTERVAL, CONF_RANGE -from esphomeyaml.helpers import App, Pvariable, add, setup_component +from esphomeyaml.helpers import App, Pvariable, add, setup_component, PollingComponent DEPENDENCIES = ['i2c'] @@ -13,19 +13,23 @@ CONF_FIELD_STRENGTH_Y = 'field_strength_y' CONF_FIELD_STRENGTH_Z = 'field_strength_z' CONF_HEADING = 'heading' -HMC5883LComponent = sensor.sensor_ns.HMC5883LComponent -HMC5883LFieldStrengthSensor = sensor.sensor_ns.HMC5883LFieldStrengthSensor -HMC5883LHeadingSensor = sensor.sensor_ns.HMC5883LHeadingSensor +HMC5883LComponent = sensor.sensor_ns.class_('HMC5883LComponent', PollingComponent, i2c.I2CDevice) +HMC5883LFieldStrengthSensor = sensor.sensor_ns.class_('HMC5883LFieldStrengthSensor', + sensor.EmptyPollingParentSensor) +HMC5883LHeadingSensor = sensor.sensor_ns.class_('HMC5883LHeadingSensor', + sensor.EmptyPollingParentSensor) + +HMC5883LRange = sensor.sensor_ns.enum('HMC5883LRange') HMC5883L_RANGES = { - 88: sensor.sensor_ns.HMC5883L_RANGE_88_UT, - 130: sensor.sensor_ns.HMC5883L_RANGE_130_UT, - 190: sensor.sensor_ns.HMC5883L_RANGE_190_UT, - 250: sensor.sensor_ns.HMC5883L_RANGE_250_UT, - 400: sensor.sensor_ns.HMC5883L_RANGE_400_UT, - 470: sensor.sensor_ns.HMC5883L_RANGE_470_UT, - 560: sensor.sensor_ns.HMC5883L_RANGE_560_UT, - 810: sensor.sensor_ns.HMC5883L_RANGE_810_UT, + 88: HMC5883LRange.HMC5883L_RANGE_88_UT, + 130: HMC5883LRange.HMC5883L_RANGE_130_UT, + 190: HMC5883LRange.HMC5883L_RANGE_190_UT, + 250: HMC5883LRange.HMC5883L_RANGE_250_UT, + 400: HMC5883LRange.HMC5883L_RANGE_400_UT, + 470: HMC5883LRange.HMC5883L_RANGE_470_UT, + 560: HMC5883LRange.HMC5883L_RANGE_560_UT, + 810: HMC5883LRange.HMC5883L_RANGE_810_UT, } @@ -42,10 +46,18 @@ SENSOR_KEYS = [CONF_FIELD_STRENGTH_X, CONF_FIELD_STRENGTH_Y, CONF_FIELD_STRENGTH PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(HMC5883LComponent), vol.Optional(CONF_ADDRESS): cv.i2c_address, - vol.Optional(CONF_FIELD_STRENGTH_X): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_FIELD_STRENGTH_Y): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_FIELD_STRENGTH_Z): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_HEADING): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Optional(CONF_FIELD_STRENGTH_X): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(HMC5883LFieldStrengthSensor), + })), + vol.Optional(CONF_FIELD_STRENGTH_Y): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(HMC5883LFieldStrengthSensor), + })), + vol.Optional(CONF_FIELD_STRENGTH_Z): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(HMC5883LFieldStrengthSensor), + })), + vol.Optional(CONF_HEADING): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(HMC5883LHeadingSensor), + })), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, vol.Optional(CONF_RANGE): validate_range, }).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(*SENSOR_KEYS)) diff --git a/esphomeyaml/components/sensor/htu21d.py b/esphomeyaml/components/sensor/htu21d.py index 872059d855..6c4b077d80 100644 --- a/esphomeyaml/components/sensor/htu21d.py +++ b/esphomeyaml/components/sensor/htu21d.py @@ -1,19 +1,30 @@ import voluptuous as vol +from esphomeyaml.components import i2c, sensor import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor from esphomeyaml.const import CONF_HUMIDITY, CONF_MAKE_ID, CONF_NAME, CONF_TEMPERATURE, \ - CONF_UPDATE_INTERVAL -from esphomeyaml.helpers import App, Application, variable, setup_component + CONF_UPDATE_INTERVAL, CONF_ID +from esphomeyaml.helpers import App, Application, PollingComponent, setup_component, variable, \ + Pvariable DEPENDENCIES = ['i2c'] -MakeHTU21DSensor = Application.MakeHTU21DSensor +MakeHTU21DSensor = Application.struct('MakeHTU21DSensor') +HTU21DComponent = sensor.sensor_ns.class_('HTU21DComponent', PollingComponent, i2c.I2CDevice) +HTU21DTemperatureSensor = sensor.sensor_ns.class_('HTU21DTemperatureSensor', + sensor.EmptyPollingParentSensor) +HTU21DHumiditySensor = sensor.sensor_ns.class_('HTU21DHumiditySensor', + sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(HTU21DComponent), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHTU21DSensor), - vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(HTU21DTemperatureSensor), + })), + vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(HTU21DHumiditySensor), + })), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema) @@ -24,6 +35,8 @@ def to_code(config): config.get(CONF_UPDATE_INTERVAL)) make = variable(config[CONF_MAKE_ID], rhs) htu21d = make.Phtu21d + Pvariable(config[CONF_ID], htu21d) + sensor.setup_sensor(htu21d.Pget_temperature_sensor(), make.Pmqtt_temperature, config[CONF_TEMPERATURE]) sensor.setup_sensor(htu21d.Pget_humidity_sensor(), make.Pmqtt_humidity, diff --git a/esphomeyaml/components/sensor/hx711.py b/esphomeyaml/components/sensor/hx711.py index 368d65129e..9f35e31cca 100644 --- a/esphomeyaml/components/sensor/hx711.py +++ b/esphomeyaml/components/sensor/hx711.py @@ -7,17 +7,20 @@ from esphomeyaml.const import CONF_GAIN, CONF_MAKE_ID, CONF_NAME, CONF_UPDATE_IN from esphomeyaml.helpers import App, Application, add, gpio_input_pin_expression, variable, \ setup_component -MakeHX711Sensor = Application.MakeHX711Sensor +MakeHX711Sensor = Application.struct('MakeHX711Sensor') +HX711Sensor = sensor.sensor_ns.class_('HX711Sensor', sensor.PollingSensorComponent) CONF_DOUT_PIN = 'dout_pin' +HX711Gain = sensor.sensor_ns.enum('HX711Gain') GAINS = { - 128: sensor.sensor_ns.HX711_GAIN_128, - 32: sensor.sensor_ns.HX711_GAIN_32, - 64: sensor.sensor_ns.HX711_GAIN_64, + 128: HX711Gain.HX711_GAIN_128, + 32: HX711Gain.HX711_GAIN_32, + 64: HX711Gain.HX711_GAIN_64, } PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(HX711Sensor), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHX711Sensor), vol.Required(CONF_DOUT_PIN): pins.gpio_input_pin_schema, vol.Required(CONF_CLK_PIN): pins.gpio_output_pin_schema, @@ -27,10 +30,8 @@ PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ def to_code(config): - dout_pin = None for dout_pin in gpio_input_pin_expression(config[CONF_DOUT_PIN]): yield - sck_pin = None for sck_pin in gpio_input_pin_expression(config[CONF_CLK_PIN]): yield diff --git a/esphomeyaml/components/sensor/ina219.py b/esphomeyaml/components/sensor/ina219.py index 7dcd34d881..647c099978 100644 --- a/esphomeyaml/components/sensor/ina219.py +++ b/esphomeyaml/components/sensor/ina219.py @@ -1,19 +1,21 @@ # coding=utf-8 import voluptuous as vol +from esphomeyaml.components import i2c, sensor import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor -from esphomeyaml.const import CONF_ADDRESS, CONF_CURRENT, CONF_ID, CONF_MAX_CURRENT, \ - CONF_MAX_VOLTAGE, CONF_NAME, CONF_POWER, CONF_UPDATE_INTERVAL, CONF_BUS_VOLTAGE, \ - CONF_SHUNT_VOLTAGE, CONF_SHUNT_RESISTANCE -from esphomeyaml.helpers import App, Pvariable, setup_component +from esphomeyaml.const import CONF_ADDRESS, CONF_BUS_VOLTAGE, CONF_CURRENT, CONF_ID, \ + CONF_MAX_CURRENT, CONF_MAX_VOLTAGE, CONF_NAME, CONF_POWER, CONF_SHUNT_RESISTANCE, \ + CONF_SHUNT_VOLTAGE, CONF_UPDATE_INTERVAL +from esphomeyaml.helpers import App, PollingComponent, Pvariable, setup_component DEPENDENCIES = ['i2c'] -INA219Component = sensor.sensor_ns.INA219Component -INA219VoltageSensor = sensor.sensor_ns.INA219VoltageSensor -INA219CurrentSensor = sensor.sensor_ns.INA219CurrentSensor -INA219PowerSensor = sensor.sensor_ns.INA219PowerSensor +INA219Component = sensor.sensor_ns.class_('INA219Component', PollingComponent, i2c.I2CDevice) +INA219VoltageSensor = sensor.sensor_ns.class_('INA219VoltageSensor', + sensor.EmptyPollingParentSensor) +INA219CurrentSensor = sensor.sensor_ns.class_('INA219CurrentSensor', + sensor.EmptyPollingParentSensor) +INA219PowerSensor = sensor.sensor_ns.class_('INA219PowerSensor', sensor.EmptyPollingParentSensor) SENSOR_KEYS = [CONF_BUS_VOLTAGE, CONF_SHUNT_VOLTAGE, CONF_CURRENT, CONF_POWER] @@ -21,10 +23,18 @@ SENSOR_KEYS = [CONF_BUS_VOLTAGE, CONF_SHUNT_VOLTAGE, CONF_CURRENT, PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(INA219Component), vol.Optional(CONF_ADDRESS, default=0x40): cv.i2c_address, - vol.Optional(CONF_BUS_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_SHUNT_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Optional(CONF_BUS_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(INA219VoltageSensor), + })), + vol.Optional(CONF_SHUNT_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(INA219VoltageSensor), + })), + vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(INA219CurrentSensor), + })), + vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(INA219PowerSensor), + })), vol.Optional(CONF_SHUNT_RESISTANCE, default=0.1): vol.All(cv.resistance, vol.Range(min=0.0, max=32.0)), vol.Optional(CONF_MAX_VOLTAGE, default=32.0): vol.All(cv.voltage, vol.Range(min=0.0, max=32.0)), diff --git a/esphomeyaml/components/sensor/ina3221.py b/esphomeyaml/components/sensor/ina3221.py index 7973f76f4b..0ac8dff1d7 100644 --- a/esphomeyaml/components/sensor/ina3221.py +++ b/esphomeyaml/components/sensor/ina3221.py @@ -1,11 +1,11 @@ # coding=utf-8 import voluptuous as vol +from esphomeyaml.components import i2c, sensor import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor from esphomeyaml.const import CONF_ADDRESS, CONF_BUS_VOLTAGE, CONF_CURRENT, CONF_ID, CONF_NAME, \ CONF_POWER, CONF_SHUNT_RESISTANCE, CONF_SHUNT_VOLTAGE, CONF_UPDATE_INTERVAL -from esphomeyaml.helpers import App, Pvariable, add, setup_component +from esphomeyaml.helpers import App, PollingComponent, Pvariable, add, setup_component DEPENDENCIES = ['i2c'] @@ -13,18 +13,28 @@ CONF_CHANNEL_1 = 'channel_1' CONF_CHANNEL_2 = 'channel_2' CONF_CHANNEL_3 = 'channel_3' -INA3221Component = sensor.sensor_ns.INA3221Component -INA3221VoltageSensor = sensor.sensor_ns.INA3221VoltageSensor -INA3221CurrentSensor = sensor.sensor_ns.INA3221CurrentSensor -INA3221PowerSensor = sensor.sensor_ns.INA3221PowerSensor +INA3221Component = sensor.sensor_ns.class_('INA3221Component', PollingComponent, i2c.I2CDevice) +INA3221VoltageSensor = sensor.sensor_ns.class_('INA3221VoltageSensor', + sensor.EmptyPollingParentSensor) +INA3221CurrentSensor = sensor.sensor_ns.class_('INA3221CurrentSensor', + sensor.EmptyPollingParentSensor) +INA3221PowerSensor = sensor.sensor_ns.class_('INA3221PowerSensor', sensor.EmptyPollingParentSensor) SENSOR_KEYS = [CONF_BUS_VOLTAGE, CONF_SHUNT_VOLTAGE, CONF_CURRENT, CONF_POWER] INA3221_CHANNEL_SCHEMA = vol.All(vol.Schema({ - vol.Optional(CONF_BUS_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_SHUNT_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Optional(CONF_BUS_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(INA3221VoltageSensor), + })), + vol.Optional(CONF_SHUNT_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(INA3221VoltageSensor), + })), + vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(INA3221CurrentSensor), + })), + vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(INA3221PowerSensor), + })), vol.Optional(CONF_SHUNT_RESISTANCE, default=0.1): vol.All(cv.resistance, vol.Range(min=0.0, max=32.0)), }).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(*SENSOR_KEYS)) diff --git a/esphomeyaml/components/sensor/max6675.py b/esphomeyaml/components/sensor/max6675.py index 50973d67c4..4a061c9bf2 100644 --- a/esphomeyaml/components/sensor/max6675.py +++ b/esphomeyaml/components/sensor/max6675.py @@ -2,15 +2,16 @@ import voluptuous as vol import esphomeyaml.config_validation as cv from esphomeyaml import pins -from esphomeyaml.components import sensor +from esphomeyaml.components import sensor, spi from esphomeyaml.components.spi import SPIComponent from esphomeyaml.const import CONF_CS_PIN, CONF_MAKE_ID, CONF_NAME, CONF_SPI_ID, \ CONF_UPDATE_INTERVAL from esphomeyaml.helpers import App, Application, get_variable, gpio_output_pin_expression, \ variable, setup_component -MakeMAX6675Sensor = Application.MakeMAX6675Sensor -MAX6675Sensor = sensor.sensor_ns.MAX6675Sensor +MakeMAX6675Sensor = Application.struct('MakeMAX6675Sensor') +MAX6675Sensor = sensor.sensor_ns.class_('MAX6675Sensor', sensor.PollingSensorComponent, + spi.SPIDevice) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(MAX6675Sensor), @@ -22,10 +23,8 @@ PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ def to_code(config): - spi = None for spi in get_variable(config[CONF_SPI_ID]): yield - cs = None for cs in gpio_output_pin_expression(config[CONF_CS_PIN]): yield rhs = App.make_max6675_sensor(config[CONF_NAME], spi, cs, diff --git a/esphomeyaml/components/sensor/mhz19.py b/esphomeyaml/components/sensor/mhz19.py index 989d3ef6c1..1e71de7e1a 100644 --- a/esphomeyaml/components/sensor/mhz19.py +++ b/esphomeyaml/components/sensor/mhz19.py @@ -1,33 +1,43 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor +from esphomeyaml.components import sensor, uart from esphomeyaml.components.uart import UARTComponent +import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_CO2, CONF_MAKE_ID, CONF_NAME, CONF_TEMPERATURE, CONF_UART_ID, \ - CONF_UPDATE_INTERVAL -from esphomeyaml.helpers import App, Application, get_variable, variable, setup_component + CONF_UPDATE_INTERVAL, CONF_ID +from esphomeyaml.helpers import App, Application, PollingComponent, get_variable, setup_component, \ + variable, Pvariable DEPENDENCIES = ['uart'] -MakeMHZ19Sensor = Application.MakeMHZ19Sensor +MakeMHZ19Sensor = Application.struct('MakeMHZ19Sensor') +MHZ19Component = sensor.sensor_ns.class_('MHZ19Component', PollingComponent, uart.UARTDevice) +MHZ19TemperatureSensor = sensor.sensor_ns.class_('MHZ19TemperatureSensor', + sensor.EmptyPollingParentSensor) +MHZ19CO2Sensor = sensor.sensor_ns.class_('MHZ19CO2Sensor', sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(MHZ19Component), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeMHZ19Sensor), cv.GenerateID(CONF_UART_ID): cv.use_variable_id(UARTComponent), - vol.Required(CONF_CO2): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Required(CONF_CO2): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(MHZ19CO2Sensor), + })), + vol.Optional(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(MHZ19TemperatureSensor), + })), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema) def to_code(config): - uart = None for uart in get_variable(config[CONF_UART_ID]): yield rhs = App.make_mhz19_sensor(uart, config[CONF_CO2][CONF_NAME], config.get(CONF_UPDATE_INTERVAL)) make = variable(config[CONF_MAKE_ID], rhs) mhz19 = make.Pmhz19 + Pvariable(config[CONF_ID], mhz19) sensor.setup_sensor(mhz19.Pget_co2_sensor(), make.Pmqtt, config[CONF_CO2]) if CONF_TEMPERATURE in config: diff --git a/esphomeyaml/components/sensor/mpu6050.py b/esphomeyaml/components/sensor/mpu6050.py index ab8edb2429..8fce2d8280 100644 --- a/esphomeyaml/components/sensor/mpu6050.py +++ b/esphomeyaml/components/sensor/mpu6050.py @@ -1,10 +1,10 @@ import voluptuous as vol +from esphomeyaml.components import i2c, sensor import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_NAME, CONF_TEMPERATURE, \ CONF_UPDATE_INTERVAL -from esphomeyaml.helpers import App, Pvariable, setup_component +from esphomeyaml.helpers import App, PollingComponent, Pvariable, setup_component DEPENDENCIES = ['i2c'] @@ -15,10 +15,11 @@ CONF_GYRO_X = 'gyro_x' CONF_GYRO_Y = 'gyro_y' CONF_GYRO_Z = 'gyro_z' -MPU6050Component = sensor.sensor_ns.MPU6050Component -MPU6050AccelSensor = sensor.sensor_ns.MPU6050AccelSensor -MPU6050GyroSensor = sensor.sensor_ns.MPU6050GyroSensor -MPU6050TemperatureSensor = sensor.sensor_ns.MPU6050TemperatureSensor +MPU6050Component = sensor.sensor_ns.class_('MPU6050Component', PollingComponent, i2c.I2CDevice) +MPU6050AccelSensor = sensor.sensor_ns.class_('MPU6050AccelSensor', sensor.EmptyPollingParentSensor) +MPU6050GyroSensor = sensor.sensor_ns.class_('MPU6050GyroSensor', sensor.EmptyPollingParentSensor) +MPU6050TemperatureSensor = sensor.sensor_ns.class_('MPU6050TemperatureSensor', + sensor.EmptyPollingParentSensor) SENSOR_KEYS = [CONF_ACCEL_X, CONF_ACCEL_Y, CONF_ACCEL_Z, CONF_GYRO_X, CONF_GYRO_Y, CONF_GYRO_Z] @@ -26,13 +27,27 @@ SENSOR_KEYS = [CONF_ACCEL_X, CONF_ACCEL_Y, CONF_ACCEL_Z, PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(MPU6050Component), vol.Optional(CONF_ADDRESS, default=0x68): cv.i2c_address, - vol.Optional(CONF_ACCEL_X): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_ACCEL_Y): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_ACCEL_Z): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_GYRO_X): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_GYRO_Y): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_GYRO_Z): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Optional(CONF_ACCEL_X): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(MPU6050AccelSensor), + })), + vol.Optional(CONF_ACCEL_Y): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(MPU6050AccelSensor), + })), + vol.Optional(CONF_ACCEL_Z): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(MPU6050AccelSensor), + })), + vol.Optional(CONF_GYRO_X): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(MPU6050GyroSensor), + })), + vol.Optional(CONF_GYRO_Y): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(MPU6050GyroSensor), + })), + vol.Optional(CONF_GYRO_Z): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(MPU6050GyroSensor), + })), + vol.Optional(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(MPU6050TemperatureSensor), + })), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(*SENSOR_KEYS)) diff --git a/esphomeyaml/components/sensor/mqtt_subscribe.py b/esphomeyaml/components/sensor/mqtt_subscribe.py index 6ec901e059..e06cd456ae 100644 --- a/esphomeyaml/components/sensor/mqtt_subscribe.py +++ b/esphomeyaml/components/sensor/mqtt_subscribe.py @@ -3,12 +3,12 @@ import voluptuous as vol from esphomeyaml.components import sensor import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_QOS, CONF_TOPIC -from esphomeyaml.helpers import App, Application, add, variable, setup_component +from esphomeyaml.helpers import App, Application, add, variable, setup_component, Component DEPENDENCIES = ['mqtt'] -MakeMQTTSubscribeSensor = Application.MakeMQTTSubscribeSensor -MQTTSubscribeSensor = sensor.sensor_ns.MQTTSubscribeSensor +MakeMQTTSubscribeSensor = Application.struct('MakeMQTTSubscribeSensor') +MQTTSubscribeSensor = sensor.sensor_ns.class_('MQTTSubscribeSensor', sensor.Sensor, Component) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(MQTTSubscribeSensor), diff --git a/esphomeyaml/components/sensor/ms5611.py b/esphomeyaml/components/sensor/ms5611.py index 05feef7b0e..d2310035f0 100644 --- a/esphomeyaml/components/sensor/ms5611.py +++ b/esphomeyaml/components/sensor/ms5611.py @@ -1,20 +1,31 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor +from esphomeyaml.components import sensor, i2c from esphomeyaml.const import CONF_ADDRESS, CONF_MAKE_ID, CONF_NAME, CONF_PRESSURE, \ - CONF_TEMPERATURE, CONF_UPDATE_INTERVAL -from esphomeyaml.helpers import App, Application, add, variable, setup_component + CONF_TEMPERATURE, CONF_UPDATE_INTERVAL, CONF_ID +from esphomeyaml.helpers import App, Application, add, variable, setup_component, PollingComponent, \ + Pvariable DEPENDENCIES = ['i2c'] -MakeMS5611Sensor = Application.MakeMS5611Sensor +MakeMS5611Sensor = Application.struct('MakeMS5611Sensor') +MS5611Component = sensor.sensor_ns.class_('MS5611Component', PollingComponent, i2c.I2CDevice) +MS5611TemperatureSensor = sensor.sensor_ns.class_('MS5611TemperatureSensor', + sensor.EmptyPollingParentSensor) +MS5611PressureSensor = sensor.sensor_ns.class_('MS5611PressureSensor', + sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(MS5611Component), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeMS5611Sensor), vol.Optional(CONF_ADDRESS): cv.i2c_address, - vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Required(CONF_PRESSURE): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(MS5611TemperatureSensor), + })), + vol.Required(CONF_PRESSURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(MS5611PressureSensor), + })), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema) @@ -25,6 +36,7 @@ def to_code(config): config.get(CONF_UPDATE_INTERVAL)) make = variable(config[CONF_MAKE_ID], rhs) ms5611 = make.Pms5611 + Pvariable(config[CONF_ID], ms5611) if CONF_ADDRESS in config: add(ms5611.set_address(config[CONF_ADDRESS])) diff --git a/esphomeyaml/components/sensor/pmsx003.py b/esphomeyaml/components/sensor/pmsx003.py index 30cb474015..58ec8ffc9f 100644 --- a/esphomeyaml/components/sensor/pmsx003.py +++ b/esphomeyaml/components/sensor/pmsx003.py @@ -1,24 +1,26 @@ import voluptuous as vol -from esphomeyaml.components import sensor +from esphomeyaml.components import sensor, uart from esphomeyaml.components.uart import UARTComponent import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_FORMALDEHYDE, CONF_HUMIDITY, CONF_ID, CONF_NAME, CONF_PM_10_0, \ CONF_PM_1_0, CONF_PM_2_5, CONF_TEMPERATURE, CONF_TYPE, CONF_UART_ID -from esphomeyaml.helpers import App, Pvariable, get_variable, setup_component +from esphomeyaml.helpers import App, Pvariable, get_variable, setup_component, Component DEPENDENCIES = ['uart'] -PMSX003Component = sensor.sensor_ns.PMSX003Component +PMSX003Component = sensor.sensor_ns.class_('PMSX003Component', uart.UARTDevice, Component) +PMSX003Sensor = sensor.sensor_ns.class_('PMSX003Sensor', sensor.Sensor) CONF_PMSX003 = 'PMSX003' CONF_PMS5003T = 'PMS5003T' CONF_PMS5003ST = 'PMS5003ST' +PMSX003Type = sensor.sensor_ns.enum('PMSX003Type') PMSX003_TYPES = { - CONF_PMSX003: sensor.sensor_ns.PMSX003_TYPE_X003, - CONF_PMS5003T: sensor.sensor_ns.PMSX003_TYPE_5003T, - CONF_PMS5003ST: sensor.sensor_ns.PMSX003_TYPE_5003ST, + CONF_PMSX003: PMSX003Type.PMSX003_TYPE_X003, + CONF_PMS5003T: PMSX003Type.PMSX003_TYPE_5003T, + CONF_PMS5003ST: PMSX003Type.PMSX003_TYPE_5003ST, } SENSORS_TO_TYPE = { @@ -38,17 +40,22 @@ def validate_pmsx003_sensors(value): return value +PMSX003_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(PMSX003Sensor), +}) + + PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(PMSX003Component), cv.GenerateID(CONF_UART_ID): cv.use_variable_id(UARTComponent), vol.Required(CONF_TYPE): vol.All(vol.Upper, cv.one_of(*PMSX003_TYPES)), - vol.Optional(CONF_PM_1_0): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_PM_2_5): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_PM_10_0): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_FORMALDEHYDE): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Optional(CONF_PM_1_0): cv.nameable(PMSX003_SENSOR_SCHEMA), + vol.Optional(CONF_PM_2_5): cv.nameable(PMSX003_SENSOR_SCHEMA), + vol.Optional(CONF_PM_10_0): cv.nameable(PMSX003_SENSOR_SCHEMA), + vol.Optional(CONF_TEMPERATURE): cv.nameable(PMSX003_SENSOR_SCHEMA), + vol.Optional(CONF_HUMIDITY): cv.nameable(PMSX003_SENSOR_SCHEMA), + vol.Optional(CONF_FORMALDEHYDE): cv.nameable(PMSX003_SENSOR_SCHEMA), }).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(*SENSORS_TO_TYPE)) diff --git a/esphomeyaml/components/sensor/pulse_counter.py b/esphomeyaml/components/sensor/pulse_counter.py index 73739ddf76..b73d62123e 100644 --- a/esphomeyaml/components/sensor/pulse_counter.py +++ b/esphomeyaml/components/sensor/pulse_counter.py @@ -9,16 +9,20 @@ from esphomeyaml.const import CONF_COUNT_MODE, CONF_FALLING_EDGE, CONF_INTERNAL_ from esphomeyaml.helpers import App, Application, add, variable, gpio_input_pin_expression, \ setup_component +PulseCounterCountMode = sensor.sensor_ns.enum('PulseCounterCountMode') COUNT_MODES = { - 'DISABLE': sensor.sensor_ns.PULSE_COUNTER_DISABLE, - 'INCREMENT': sensor.sensor_ns.PULSE_COUNTER_INCREMENT, - 'DECREMENT': sensor.sensor_ns.PULSE_COUNTER_DECREMENT, + 'DISABLE': PulseCounterCountMode.PULSE_COUNTER_DISABLE, + 'INCREMENT': PulseCounterCountMode.PULSE_COUNTER_INCREMENT, + 'DECREMENT': PulseCounterCountMode.PULSE_COUNTER_DECREMENT, } COUNT_MODE_SCHEMA = vol.All(vol.Upper, cv.one_of(*COUNT_MODES)) -MakePulseCounterSensor = Application.MakePulseCounterSensor -PulseCounterSensorComponent = sensor.sensor_ns.PulseCounterSensorComponent +PulseCounterBase = sensor.sensor_ns.class_('PulseCounterBase') +MakePulseCounterSensor = Application.struct('MakePulseCounterSensor') +PulseCounterSensorComponent = sensor.sensor_ns.class_('PulseCounterSensorComponent', + sensor.PollingSensorComponent, + PulseCounterBase) def validate_internal_filter(value): diff --git a/esphomeyaml/components/sensor/rotary_encoder.py b/esphomeyaml/components/sensor/rotary_encoder.py index 1ca7e9fa2d..1be3d44803 100644 --- a/esphomeyaml/components/sensor/rotary_encoder.py +++ b/esphomeyaml/components/sensor/rotary_encoder.py @@ -5,20 +5,21 @@ from esphomeyaml import pins from esphomeyaml.components import sensor from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_RESOLUTION from esphomeyaml.helpers import App, Application, add, gpio_input_pin_expression, variable, \ - setup_component + setup_component, Component +RotaryEncoderResolution = sensor.sensor_ns.enum('RotaryEncoderResolution') RESOLUTIONS = { - '1': sensor.sensor_ns.ROTARY_ENCODER_1_PULSE_PER_CYCLE, - '2': sensor.sensor_ns.ROTARY_ENCODER_2_PULSES_PER_CYCLE, - '4': sensor.sensor_ns.ROTARY_ENCODER_4_PULSES_PER_CYCLE, + '1': RotaryEncoderResolution.ROTARY_ENCODER_1_PULSE_PER_CYCLE, + '2': RotaryEncoderResolution.ROTARY_ENCODER_2_PULSES_PER_CYCLE, + '4': RotaryEncoderResolution.ROTARY_ENCODER_4_PULSES_PER_CYCLE, } CONF_PIN_A = 'pin_a' CONF_PIN_B = 'pin_b' CONF_PIN_RESET = 'pin_reset' -MakeRotaryEncoderSensor = Application.MakeRotaryEncoderSensor -RotaryEncoderSensor = sensor.sensor_ns.RotaryEncoderSensor +MakeRotaryEncoderSensor = Application.struct('MakeRotaryEncoderSensor') +RotaryEncoderSensor = sensor.sensor_ns.class_('RotaryEncoderSensor', sensor.Sensor, Component) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(RotaryEncoderSensor), diff --git a/esphomeyaml/components/sensor/sht3xd.py b/esphomeyaml/components/sensor/sht3xd.py index bd93f3ca32..ea6b81e75d 100644 --- a/esphomeyaml/components/sensor/sht3xd.py +++ b/esphomeyaml/components/sensor/sht3xd.py @@ -1,19 +1,30 @@ import voluptuous as vol +from esphomeyaml.components import i2c, sensor import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor -from esphomeyaml.const import CONF_ACCURACY, CONF_ADDRESS, CONF_HUMIDITY, CONF_MAKE_ID, CONF_NAME, \ - CONF_TEMPERATURE, CONF_UPDATE_INTERVAL -from esphomeyaml.helpers import App, Application, variable, setup_component +from esphomeyaml.const import CONF_ADDRESS, CONF_HUMIDITY, CONF_MAKE_ID, CONF_NAME, \ + CONF_TEMPERATURE, CONF_UPDATE_INTERVAL, CONF_ID +from esphomeyaml.helpers import App, Application, PollingComponent, setup_component, variable, \ + Pvariable DEPENDENCIES = ['i2c'] -MakeSHT3XDSensor = Application.MakeSHT3XDSensor +MakeSHT3XDSensor = Application.struct('MakeSHT3XDSensor') +SHT3XDComponent = sensor.sensor_ns.class_('SHT3XDComponent', PollingComponent, i2c.I2CDevice) +SHT3XDTemperatureSensor = sensor.sensor_ns.class_('SHT3XDTemperatureSensor', + sensor.EmptyPollingParentSensor) +SHT3XDHumiditySensor = sensor.sensor_ns.class_('SHT3XDHumiditySensor', + sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(SHT3XDComponent), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeSHT3XDSensor), - vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(SHT3XDTemperatureSensor), + })), + vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(SHT3XDHumiditySensor), + })), vol.Optional(CONF_ADDRESS, default=0x44): cv.i2c_address, vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema) @@ -26,6 +37,7 @@ def to_code(config): config.get(CONF_UPDATE_INTERVAL)) make = variable(config[CONF_MAKE_ID], rhs) sht3xd = make.Psht3xd + Pvariable(config[CONF_ID], sht3xd) sensor.setup_sensor(sht3xd.Pget_temperature_sensor(), make.Pmqtt_temperature, config[CONF_TEMPERATURE]) diff --git a/esphomeyaml/components/sensor/tcs34725.py b/esphomeyaml/components/sensor/tcs34725.py index 400ca5fb4e..8322e1f054 100644 --- a/esphomeyaml/components/sensor/tcs34725.py +++ b/esphomeyaml/components/sensor/tcs34725.py @@ -1,11 +1,11 @@ # coding=utf-8 import voluptuous as vol +from esphomeyaml.components import i2c, sensor import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor from esphomeyaml.const import CONF_ADDRESS, CONF_COLOR_TEMPERATURE, CONF_GAIN, CONF_ID, \ CONF_ILLUMINANCE, CONF_INTEGRATION_TIME, CONF_NAME, CONF_UPDATE_INTERVAL -from esphomeyaml.helpers import App, Pvariable, add, setup_component +from esphomeyaml.helpers import App, PollingComponent, Pvariable, add, setup_component DEPENDENCIES = ['i2c'] @@ -14,36 +14,54 @@ CONF_GREEN_CHANNEL = 'green_channel' CONF_BLUE_CHANNEL = 'blue_channel' CONF_CLEAR_CHANNEL = 'clear_channel' -TCS34725Component = sensor.sensor_ns.TCS34725Component +TCS34725Component = sensor.sensor_ns.class_('TCS34725Component', PollingComponent, + i2c.I2CDevice) +TCS34725IntegrationTime = sensor.sensor_ns.enum('TCS34725IntegrationTime') TCS34725_INTEGRATION_TIMES = { - '2.4ms': sensor.sensor_ns.TCS34725_INTEGRATION_TIME_2_4MS, - '24ms': sensor.sensor_ns.TCS34725_INTEGRATION_TIME_24MS, - '50ms': sensor.sensor_ns.TCS34725_INTEGRATION_TIME_50MS, - '101ms': sensor.sensor_ns.TCS34725_INTEGRATION_TIME_101MS, - '154ms': sensor.sensor_ns.TCS34725_INTEGRATION_TIME_154MS, - '700ms': sensor.sensor_ns.TCS34725_INTEGRATION_TIME_700MS, + '2.4ms': TCS34725IntegrationTime.TCS34725_INTEGRATION_TIME_2_4MS, + '24ms': TCS34725IntegrationTime.TCS34725_INTEGRATION_TIME_24MS, + '50ms': TCS34725IntegrationTime.TCS34725_INTEGRATION_TIME_50MS, + '101ms': TCS34725IntegrationTime.TCS34725_INTEGRATION_TIME_101MS, + '154ms': TCS34725IntegrationTime.TCS34725_INTEGRATION_TIME_154MS, + '700ms': TCS34725IntegrationTime.TCS34725_INTEGRATION_TIME_700MS, } +TCS34725Gain = sensor.sensor_ns.enum('TCS34725Gain') TCS34725_GAINS = { - '1X': sensor.sensor_ns.TCS34725_GAIN_1X, - '4X': sensor.sensor_ns.TCS34725_GAIN_4X, - '16X': sensor.sensor_ns.TCS34725_GAIN_16X, - '60X': sensor.sensor_ns.TCS34725_GAIN_60X, + '1X': TCS34725Gain.TCS34725_GAIN_1X, + '4X': TCS34725Gain.TCS34725_GAIN_4X, + '16X': TCS34725Gain.TCS34725_GAIN_16X, + '60X': TCS34725Gain.TCS34725_GAIN_60X, } +TCS35725IlluminanceSensor = sensor.sensor_ns.class_('TCS35725IlluminanceSensor', + sensor.EmptyPollingParentSensor) +TCS35725ColorTemperatureSensor = sensor.sensor_ns.class_('TCS35725ColorTemperatureSensor', + sensor.EmptyPollingParentSensor) +TCS35725ColorChannelSensor = sensor.sensor_ns.class_('TCS35725ColorChannelSensor', + sensor.EmptyPollingParentSensor) + +COLOR_CHANNEL_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(TCS35725ColorChannelSensor), +}) + SENSOR_KEYS = [CONF_RED_CHANNEL, CONF_GREEN_CHANNEL, CONF_BLUE_CHANNEL, CONF_CLEAR_CHANNEL, CONF_ILLUMINANCE, CONF_COLOR_TEMPERATURE] PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(TCS34725Component), vol.Optional(CONF_ADDRESS): cv.i2c_address, - vol.Optional(CONF_RED_CHANNEL): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_GREEN_CHANNEL): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_BLUE_CHANNEL): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_CLEAR_CHANNEL): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_ILLUMINANCE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_COLOR_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Optional(CONF_RED_CHANNEL): cv.nameable(COLOR_CHANNEL_SENSOR_SCHEMA), + vol.Optional(CONF_GREEN_CHANNEL): cv.nameable(COLOR_CHANNEL_SENSOR_SCHEMA), + vol.Optional(CONF_BLUE_CHANNEL): cv.nameable(COLOR_CHANNEL_SENSOR_SCHEMA), + vol.Optional(CONF_CLEAR_CHANNEL): cv.nameable(COLOR_CHANNEL_SENSOR_SCHEMA), + vol.Optional(CONF_ILLUMINANCE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(TCS35725IlluminanceSensor), + })), + vol.Optional(CONF_COLOR_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(TCS35725ColorTemperatureSensor), + })), vol.Optional(CONF_INTEGRATION_TIME): cv.one_of(*TCS34725_INTEGRATION_TIMES), vol.Optional(CONF_GAIN): vol.All(vol.Upper, cv.one_of(*TCS34725_GAINS)), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, diff --git a/esphomeyaml/components/sensor/template.py b/esphomeyaml/components/sensor/template.py index 539a8207c5..d34f96da5d 100644 --- a/esphomeyaml/components/sensor/template.py +++ b/esphomeyaml/components/sensor/template.py @@ -6,8 +6,8 @@ from esphomeyaml.const import CONF_LAMBDA, CONF_MAKE_ID, CONF_NAME, CONF_UPDATE_ from esphomeyaml.helpers import App, process_lambda, variable, Application, float_, optional, add, \ setup_component -MakeTemplateSensor = Application.MakeTemplateSensor -TemplateSensor = sensor.sensor_ns.TemplateSensor +MakeTemplateSensor = Application.struct('MakeTemplateSensor') +TemplateSensor = sensor.sensor_ns.class_('TemplateSensor', sensor.PollingSensorComponent) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(TemplateSensor), diff --git a/esphomeyaml/components/sensor/total_daily_energy.py b/esphomeyaml/components/sensor/total_daily_energy.py index b9c2cca89b..0ddf867a05 100644 --- a/esphomeyaml/components/sensor/total_daily_energy.py +++ b/esphomeyaml/components/sensor/total_daily_energy.py @@ -1,22 +1,21 @@ import voluptuous as vol -from esphomeyaml.components import sensor -from esphomeyaml.components.time import sntp +from esphomeyaml.components import sensor, time import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_TIME_ID -from esphomeyaml.helpers import App, Application, get_variable, variable, setup_component +from esphomeyaml.helpers import App, Application, Component, get_variable, setup_component, variable DEPENDENCIES = ['time'] CONF_POWER_ID = 'power_id' -MakeTotalDailyEnergySensor = Application.MakeTotalDailyEnergySensor -TotalDailyEnergy = sensor.sensor_ns.TotalDailyEnergy +MakeTotalDailyEnergySensor = Application.struct('MakeTotalDailyEnergySensor') +TotalDailyEnergy = sensor.sensor_ns.class_('TotalDailyEnergy', sensor.Sensor, Component) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(TotalDailyEnergy), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTotalDailyEnergySensor), - cv.GenerateID(CONF_TIME_ID): cv.use_variable_id(sntp.SNTPComponent), - vol.Required(CONF_POWER_ID): cv.use_variable_id(None), + cv.GenerateID(CONF_TIME_ID): cv.use_variable_id(time.RealTimeClockComponent), + vol.Required(CONF_POWER_ID): cv.use_variable_id(sensor.Sensor), }).extend(cv.COMPONENT_SCHEMA.schema)) diff --git a/esphomeyaml/components/sensor/tsl2561.py b/esphomeyaml/components/sensor/tsl2561.py index fa949258bb..53112efc46 100644 --- a/esphomeyaml/components/sensor/tsl2561.py +++ b/esphomeyaml/components/sensor/tsl2561.py @@ -1,21 +1,24 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor +from esphomeyaml.components import sensor, i2c from esphomeyaml.const import CONF_ADDRESS, CONF_GAIN, CONF_INTEGRATION_TIME, CONF_MAKE_ID, \ CONF_NAME, CONF_UPDATE_INTERVAL from esphomeyaml.helpers import App, Application, add, variable, setup_component DEPENDENCIES = ['i2c'] +TSL2561IntegrationTime = sensor.sensor_ns.enum('TSL2561IntegrationTime') INTEGRATION_TIMES = { - 14: sensor.sensor_ns.TSL2561_INTEGRATION_14MS, - 101: sensor.sensor_ns.TSL2561_INTEGRATION_101MS, - 402: sensor.sensor_ns.TSL2561_INTEGRATION_402MS, + 14: TSL2561IntegrationTime.TSL2561_INTEGRATION_14MS, + 101: TSL2561IntegrationTime.TSL2561_INTEGRATION_101MS, + 402: TSL2561IntegrationTime.TSL2561_INTEGRATION_402MS, } + +TSL2561Gain = sensor.sensor_ns.enum('TSL2561Gain') GAINS = { - '1X': sensor.sensor_ns.TSL2561_GAIN_1X, - '16X': sensor.sensor_ns.TSL2561_GAIN_16X, + '1X': TSL2561Gain.TSL2561_GAIN_1X, + '16X': TSL2561Gain.TSL2561_GAIN_16X, } CONF_IS_CS_PACKAGE = 'is_cs_package' @@ -28,8 +31,9 @@ def validate_integration_time(value): return value -MakeTSL2561Sensor = Application.MakeTSL2561Sensor -TSL2561Sensor = Application.TSL2561Sensor +MakeTSL2561Sensor = Application.struct('MakeTSL2561Sensor') +TSL2561Sensor = sensor.sensor_ns.class_('TSL2561Sensor', sensor.PollingSensorComponent, + i2c.I2CDevice) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(TSL2561Sensor), @@ -47,6 +51,7 @@ def to_code(config): config.get(CONF_UPDATE_INTERVAL)) make_tsl = variable(config[CONF_MAKE_ID], rhs) tsl2561 = make_tsl.Ptsl2561 + if CONF_INTEGRATION_TIME in config: add(tsl2561.set_integration_time(INTEGRATION_TIMES[config[CONF_INTEGRATION_TIME]])) if CONF_GAIN in config: diff --git a/esphomeyaml/components/sensor/ultrasonic.py b/esphomeyaml/components/sensor/ultrasonic.py index b8bb861ff7..d12c4419fd 100644 --- a/esphomeyaml/components/sensor/ultrasonic.py +++ b/esphomeyaml/components/sensor/ultrasonic.py @@ -8,8 +8,9 @@ from esphomeyaml.const import CONF_ECHO_PIN, CONF_MAKE_ID, CONF_NAME, CONF_TIMEO from esphomeyaml.helpers import App, Application, add, gpio_input_pin_expression, \ gpio_output_pin_expression, variable, setup_component -MakeUltrasonicSensor = Application.MakeUltrasonicSensor -UltrasonicSensorComponent = sensor.sensor_ns.UltrasonicSensorComponent +MakeUltrasonicSensor = Application.struct('MakeUltrasonicSensor') +UltrasonicSensorComponent = sensor.sensor_ns.class_('UltrasonicSensorComponent', + sensor.PollingSensorComponent) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(UltrasonicSensorComponent), diff --git a/esphomeyaml/components/sensor/uptime.py b/esphomeyaml/components/sensor/uptime.py index 6175ed549d..60bf9a990b 100644 --- a/esphomeyaml/components/sensor/uptime.py +++ b/esphomeyaml/components/sensor/uptime.py @@ -5,8 +5,8 @@ from esphomeyaml.components import sensor from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_UPDATE_INTERVAL from esphomeyaml.helpers import App, Application, variable, setup_component -MakeUptimeSensor = Application.MakeUptimeSensor -UptimeSensor = sensor.sensor_ns.UptimeSensor +MakeUptimeSensor = Application.struct('MakeUptimeSensor') +UptimeSensor = sensor.sensor_ns.class_('UptimeSensor', sensor.PollingSensorComponent) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(UptimeSensor), diff --git a/esphomeyaml/components/sensor/wifi_signal.py b/esphomeyaml/components/sensor/wifi_signal.py index ab6d005d3a..564824b3aa 100644 --- a/esphomeyaml/components/sensor/wifi_signal.py +++ b/esphomeyaml/components/sensor/wifi_signal.py @@ -5,8 +5,8 @@ from esphomeyaml.components import sensor from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_UPDATE_INTERVAL from esphomeyaml.helpers import App, Application, variable, setup_component -MakeWiFiSignalSensor = Application.MakeWiFiSignalSensor -WiFiSignalSensor = sensor.sensor_ns.WiFiSignalSensor +MakeWiFiSignalSensor = Application.struct('MakeWiFiSignalSensor') +WiFiSignalSensor = sensor.sensor_ns.class_('WiFiSignalSensor', sensor.PollingSensorComponent) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(WiFiSignalSensor), diff --git a/esphomeyaml/components/sensor/xiaomi_miflora.py b/esphomeyaml/components/sensor/xiaomi_miflora.py index 830dc0d3b7..6d02fe7e84 100644 --- a/esphomeyaml/components/sensor/xiaomi_miflora.py +++ b/esphomeyaml/components/sensor/xiaomi_miflora.py @@ -1,26 +1,24 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor +from esphomeyaml.components import esp32_ble_tracker, sensor from esphomeyaml.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \ make_address_array -from esphomeyaml.const import CONF_BATTERY_LEVEL, CONF_CONDUCTIVITY, CONF_ILLUMINANCE, \ - CONF_MAC_ADDRESS, CONF_MAKE_ID, CONF_MOISTURE, CONF_NAME, CONF_TEMPERATURE -from esphomeyaml.helpers import Pvariable, esphomelib_ns, get_variable, setup_component +import esphomeyaml.config_validation as cv +from esphomeyaml.const import CONF_BATTERY_LEVEL, CONF_CONDUCTIVITY, CONF_ID, CONF_ILLUMINANCE, \ + CONF_MAC_ADDRESS, CONF_MOISTURE, CONF_NAME, CONF_TEMPERATURE +from esphomeyaml.helpers import Pvariable, get_variable DEPENDENCIES = ['esp32_ble_tracker'] -XiaomiDevice = esphomelib_ns.XiaomiDevice - PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(XiaomiDevice), + cv.GenerateID(): cv.declare_variable_id(esp32_ble_tracker.XiaomiDevice), cv.GenerateID(CONF_ESP32_BLE_ID): cv.use_variable_id(ESP32BLETracker), vol.Required(CONF_MAC_ADDRESS): cv.mac_address, - vol.Optional(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_MOISTURE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_ILLUMINANCE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_CONDUCTIVITY): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_BATTERY_LEVEL): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Optional(CONF_TEMPERATURE): cv.nameable(esp32_ble_tracker.XIAOMI_SENSOR_SCHEMA), + vol.Optional(CONF_MOISTURE): cv.nameable(esp32_ble_tracker.XIAOMI_SENSOR_SCHEMA), + vol.Optional(CONF_ILLUMINANCE): cv.nameable(esp32_ble_tracker.XIAOMI_SENSOR_SCHEMA), + vol.Optional(CONF_CONDUCTIVITY): cv.nameable(esp32_ble_tracker.XIAOMI_SENSOR_SCHEMA), + vol.Optional(CONF_BATTERY_LEVEL): cv.nameable(esp32_ble_tracker.XIAOMI_SENSOR_SCHEMA), }) @@ -28,7 +26,7 @@ def to_code(config): for hub in get_variable(config[CONF_ESP32_BLE_ID]): yield rhs = hub.make_xiaomi_device(make_address_array(config[CONF_MAC_ADDRESS])) - dev = Pvariable(config[CONF_MAKE_ID], rhs) + dev = Pvariable(config[CONF_ID], rhs) if CONF_TEMPERATURE in config: conf = config[CONF_TEMPERATURE] sensor.register_sensor(dev.Pmake_temperature_sensor(conf[CONF_NAME]), conf) diff --git a/esphomeyaml/components/sensor/xiaomi_mijia.py b/esphomeyaml/components/sensor/xiaomi_mijia.py index a38d8684b8..10a6573d6f 100644 --- a/esphomeyaml/components/sensor/xiaomi_mijia.py +++ b/esphomeyaml/components/sensor/xiaomi_mijia.py @@ -1,24 +1,22 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor +from esphomeyaml.components import esp32_ble_tracker, sensor from esphomeyaml.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \ make_address_array +import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_BATTERY_LEVEL, CONF_HUMIDITY, CONF_MAC_ADDRESS, CONF_MAKE_ID, \ CONF_NAME, CONF_TEMPERATURE -from esphomeyaml.helpers import Pvariable, esphomelib_ns, get_variable +from esphomeyaml.helpers import Pvariable, get_variable DEPENDENCIES = ['esp32_ble_tracker'] -XiaomiDevice = esphomelib_ns.XiaomiDevice - PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(XiaomiDevice), + cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(esp32_ble_tracker.XiaomiDevice), cv.GenerateID(CONF_ESP32_BLE_ID): cv.use_variable_id(ESP32BLETracker), vol.Required(CONF_MAC_ADDRESS): cv.mac_address, - vol.Optional(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA), - vol.Optional(CONF_BATTERY_LEVEL): cv.nameable(sensor.SENSOR_SCHEMA), + vol.Optional(CONF_TEMPERATURE): cv.nameable(esp32_ble_tracker.XIAOMI_SENSOR_SCHEMA), + vol.Optional(CONF_HUMIDITY): cv.nameable(esp32_ble_tracker.XIAOMI_SENSOR_SCHEMA), + vol.Optional(CONF_BATTERY_LEVEL): cv.nameable(esp32_ble_tracker.XIAOMI_SENSOR_SCHEMA), }) diff --git a/esphomeyaml/components/spi.py b/esphomeyaml/components/spi.py index 606091ca5c..c9c98eae09 100644 --- a/esphomeyaml/components/spi.py +++ b/esphomeyaml/components/spi.py @@ -4,9 +4,10 @@ import esphomeyaml.config_validation as cv from esphomeyaml import pins from esphomeyaml.const import CONF_CLK_PIN, CONF_ID, CONF_MISO_PIN, CONF_MOSI_PIN from esphomeyaml.helpers import App, Pvariable, esphomelib_ns, gpio_input_pin_expression, \ - gpio_output_pin_expression, add, setup_component + gpio_output_pin_expression, add, setup_component, Component -SPIComponent = esphomelib_ns.SPIComponent +SPIComponent = esphomelib_ns.class_('SPIComponent', Component) +SPIDevice = esphomelib_ns.class_('SPIDevice') SPI_SCHEMA = vol.All(vol.Schema({ cv.GenerateID(): cv.declare_variable_id(SPIComponent), diff --git a/esphomeyaml/components/status_led.py b/esphomeyaml/components/status_led.py index 0320f5f0d5..e67621c0ee 100644 --- a/esphomeyaml/components/status_led.py +++ b/esphomeyaml/components/status_led.py @@ -3,9 +3,9 @@ import voluptuous as vol from esphomeyaml import config_validation as cv, pins from esphomeyaml.const import CONF_ID, CONF_PIN from esphomeyaml.helpers import App, Pvariable, esphomelib_ns, gpio_output_pin_expression, \ - setup_component + setup_component, Component -StatusLEDComponent = esphomelib_ns.StatusLEDComponent +StatusLEDComponent = esphomelib_ns.class_('StatusLEDComponent', Component) CONFIG_SCHEMA = vol.Schema({ cv.GenerateID(): cv.declare_variable_id(StatusLEDComponent), diff --git a/esphomeyaml/components/stepper/__init__.py b/esphomeyaml/components/stepper/__init__.py index 3b5092d5cd..ac2ce911ac 100644 --- a/esphomeyaml/components/stepper/__init__.py +++ b/esphomeyaml/components/stepper/__init__.py @@ -5,7 +5,7 @@ import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_ACCELERATION, CONF_DECELERATION, CONF_ID, CONF_MAX_SPEED, \ CONF_POSITION, CONF_TARGET from esphomeyaml.helpers import Pvariable, TemplateArguments, add, add_job, esphomelib_ns, \ - get_variable, int32, templatable + get_variable, int32, templatable, Action PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ @@ -13,10 +13,10 @@ PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ # pylint: disable=invalid-name stepper_ns = esphomelib_ns.namespace('stepper') -Stepper = stepper_ns.Stepper +Stepper = stepper_ns.class_('Stepper') -SetTargetAction = stepper_ns.SetTargetAction -ReportPositionAction = stepper_ns.ReportPositionAction +SetTargetAction = stepper_ns.class_('SetTargetAction', Action) +ReportPositionAction = stepper_ns.class_('ReportPositionAction', Action) def validate_acceleration(value): @@ -60,7 +60,6 @@ def validate_speed(value): STEPPER_SCHEMA = vol.Schema({ - cv.GenerateID(): cv.declare_variable_id(Stepper), vol.Required(CONF_MAX_SPEED): validate_speed, vol.Optional(CONF_ACCELERATION): validate_acceleration, vol.Optional(CONF_DECELERATION): validate_acceleration, @@ -86,7 +85,7 @@ BUILD_FLAGS = '-DUSE_STEPPER' CONF_STEPPER_SET_TARGET = 'stepper.set_target' STEPPER_SET_TARGET_ACTION_SCHEMA = vol.Schema({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(Stepper), vol.Required(CONF_TARGET): cv.templatable(cv.int_), }) @@ -107,7 +106,7 @@ def stepper_set_target_to_code(config, action_id, arg_type): CONF_STEPPER_REPORT_POSITION = 'stepper.report_position' STEPPER_REPORT_POSITION_ACTION_SCHEMA = vol.Schema({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(Stepper), vol.Required(CONF_POSITION): cv.templatable(cv.int_), }) diff --git a/esphomeyaml/components/stepper/a4988.py b/esphomeyaml/components/stepper/a4988.py index c72295ee3f..281ede1110 100644 --- a/esphomeyaml/components/stepper/a4988.py +++ b/esphomeyaml/components/stepper/a4988.py @@ -4,9 +4,10 @@ from esphomeyaml import pins from esphomeyaml.components import stepper import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_DIR_PIN, CONF_ID, CONF_SLEEP_PIN, CONF_STEP_PIN -from esphomeyaml.helpers import App, Pvariable, add, gpio_output_pin_expression, setup_component +from esphomeyaml.helpers import App, Pvariable, add, gpio_output_pin_expression, setup_component, \ + Component -A4988 = stepper.stepper_ns.A4988 +A4988 = stepper.stepper_ns.class_('A4988', stepper.Stepper, Component) PLATFORM_SCHEMA = stepper.STEPPER_PLATFORM_SCHEMA.extend({ vol.Required(CONF_ID): cv.declare_variable_id(A4988), diff --git a/esphomeyaml/components/switch/__init__.py b/esphomeyaml/components/switch/__init__.py index 65e650f44e..d1f36cdba8 100644 --- a/esphomeyaml/components/switch/__init__.py +++ b/esphomeyaml/components/switch/__init__.py @@ -6,21 +6,21 @@ import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_ICON, CONF_ID, CONF_INVERTED, CONF_MQTT_ID, CONF_INTERNAL, \ CONF_OPTIMISTIC from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, setup_mqtt_component, \ - TemplateArguments, get_variable + TemplateArguments, get_variable, Nameable, Action PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ }) switch_ns = esphomelib_ns.namespace('switch_') -Switch = switch_ns.Switch -MQTTSwitchComponent = switch_ns.MQTTSwitchComponent -ToggleAction = switch_ns.ToggleAction -TurnOffAction = switch_ns.TurnOffAction -TurnOnAction = switch_ns.TurnOnAction +Switch = switch_ns.class_('Switch', Nameable) +MQTTSwitchComponent = switch_ns.class_('MQTTSwitchComponent', mqtt.MQTTComponent) + +ToggleAction = switch_ns.class_('ToggleAction', Action) +TurnOffAction = switch_ns.class_('TurnOffAction', Action) +TurnOnAction = switch_ns.class_('TurnOnAction', Action) SWITCH_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend({ - cv.GenerateID(): cv.declare_variable_id(Switch), cv.GenerateID(CONF_MQTT_ID): cv.declare_variable_id(MQTTSwitchComponent), vol.Optional(CONF_ICON): cv.icon, vol.Optional(CONF_INVERTED): cv.boolean, @@ -58,7 +58,7 @@ BUILD_FLAGS = '-DUSE_SWITCH' CONF_SWITCH_TOGGLE = 'switch.toggle' SWITCH_TOGGLE_ACTION_SCHEMA = maybe_simple_id({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(Switch), }) @@ -74,7 +74,7 @@ def switch_toggle_to_code(config, action_id, arg_type): CONF_SWITCH_TURN_OFF = 'switch.turn_off' SWITCH_TURN_OFF_ACTION_SCHEMA = maybe_simple_id({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(Switch), }) @@ -90,7 +90,7 @@ def switch_turn_off_to_code(config, action_id, arg_type): CONF_SWITCH_TURN_ON = 'switch.turn_on' SWITCH_TURN_ON_ACTION_SCHEMA = maybe_simple_id({ - vol.Required(CONF_ID): cv.use_variable_id(None), + vol.Required(CONF_ID): cv.use_variable_id(Switch), }) diff --git a/esphomeyaml/components/switch/gpio.py b/esphomeyaml/components/switch/gpio.py index eb957969bc..039bfcb4cb 100644 --- a/esphomeyaml/components/switch/gpio.py +++ b/esphomeyaml/components/switch/gpio.py @@ -5,10 +5,10 @@ from esphomeyaml.components import switch import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_PIN from esphomeyaml.helpers import App, Application, gpio_output_pin_expression, variable, \ - setup_component + setup_component, Component -MakeGPIOSwitch = Application.MakeGPIOSwitch -GPIOSwitch = switch.switch_ns.GPIOSwitch +MakeGPIOSwitch = Application.struct('MakeGPIOSwitch') +GPIOSwitch = switch.switch_ns.class_('GPIOSwitch', switch.Switch, Component) PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(GPIOSwitch), diff --git a/esphomeyaml/components/switch/output.py b/esphomeyaml/components/switch/output.py index 3a11e39670..c0a293af9c 100644 --- a/esphomeyaml/components/switch/output.py +++ b/esphomeyaml/components/switch/output.py @@ -1,17 +1,17 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import switch +from esphomeyaml.components import switch, output from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT -from esphomeyaml.helpers import App, Application, get_variable, variable, setup_component +from esphomeyaml.helpers import App, Application, get_variable, variable, setup_component, Component -MakeOutputSwitch = Application.MakeOutputSwitch -OutputSwitch = switch.switch_ns.OutputSwitch +MakeOutputSwitch = Application.struct('MakeOutputSwitch') +OutputSwitch = switch.switch_ns.class_('OutputSwitch', switch.Switch, Component) PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(OutputSwitch), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeOutputSwitch), - vol.Required(CONF_OUTPUT): cv.use_variable_id(None), + vol.Required(CONF_OUTPUT): cv.use_variable_id(output.BinaryOutput), }).extend(cv.COMPONENT_SCHEMA.schema)) diff --git a/esphomeyaml/components/switch/remote_transmitter.py b/esphomeyaml/components/switch/remote_transmitter.py index 378d0ecad1..effa4121d5 100644 --- a/esphomeyaml/components/switch/remote_transmitter.py +++ b/esphomeyaml/components/switch/remote_transmitter.py @@ -1,18 +1,18 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv from esphomeyaml.components import switch from esphomeyaml.components.remote_transmitter import RC_SWITCH_RAW_SCHEMA, \ RC_SWITCH_TYPE_A_SCHEMA, RC_SWITCH_TYPE_B_SCHEMA, RC_SWITCH_TYPE_C_SCHEMA, \ RC_SWITCH_TYPE_D_SCHEMA, RemoteTransmitterComponent, binary_code, build_rc_switch_protocol, \ remote_ns +import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_ADDRESS, CONF_CARRIER_FREQUENCY, CONF_CHANNEL, CONF_CODE, \ CONF_COMMAND, CONF_DATA, CONF_DEVICE, CONF_FAMILY, CONF_GROUP, CONF_INVERTED, CONF_LG, \ CONF_NAME, CONF_NBITS, CONF_NEC, CONF_PANASONIC, CONF_PROTOCOL, CONF_RAW, CONF_RC_SWITCH_RAW, \ CONF_RC_SWITCH_TYPE_A, CONF_RC_SWITCH_TYPE_B, CONF_RC_SWITCH_TYPE_C, CONF_RC_SWITCH_TYPE_D, \ CONF_REPEAT, CONF_SAMSUNG, CONF_SONY, CONF_STATE, CONF_TIMES, \ CONF_WAIT_TIME -from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, add, get_variable +from esphomeyaml.helpers import ArrayInitializer, Pvariable, add, get_variable DEPENDENCIES = ['remote_transmitter'] @@ -23,18 +23,18 @@ REMOTE_KEYS = [CONF_NEC, CONF_LG, CONF_SAMSUNG, CONF_SONY, CONF_PANASONIC, CONF_ CONF_REMOTE_TRANSMITTER_ID = 'remote_transmitter_id' CONF_TRANSMITTER_ID = 'transmitter_id' -RemoteTransmitter = remote_ns.RemoteTransmitter -LGTransmitter = remote_ns.LGTransmitter -NECTransmitter = remote_ns.NECTransmitter -PanasonicTransmitter = remote_ns.PanasonicTransmitter -RawTransmitter = remote_ns.RawTransmitter -SamsungTransmitter = remote_ns.SamsungTransmitter -SonyTransmitter = remote_ns.SonyTransmitter -RCSwitchRawTransmitter = remote_ns.RCSwitchRawTransmitter -RCSwitchTypeATransmitter = remote_ns.RCSwitchTypeATransmitter -RCSwitchTypeBTransmitter = remote_ns.RCSwitchTypeBTransmitter -RCSwitchTypeCTransmitter = remote_ns.RCSwitchTypeCTransmitter -RCSwitchTypeDTransmitter = remote_ns.RCSwitchTypeDTransmitter +RemoteTransmitter = remote_ns.class_('RemoteTransmitter', switch.Switch) +LGTransmitter = remote_ns.class_('LGTransmitter', RemoteTransmitter) +NECTransmitter = remote_ns.class_('NECTransmitter', RemoteTransmitter) +PanasonicTransmitter = remote_ns.class_('PanasonicTransmitter', RemoteTransmitter) +RawTransmitter = remote_ns.class_('RawTransmitter', RemoteTransmitter) +SamsungTransmitter = remote_ns.class_('SamsungTransmitter', RemoteTransmitter) +SonyTransmitter = remote_ns.class_('SonyTransmitter', RemoteTransmitter) +RCSwitchRawTransmitter = remote_ns.class_('RCSwitchRawTransmitter', RemoteTransmitter) +RCSwitchTypeATransmitter = remote_ns.class_('RCSwitchTypeATransmitter', RCSwitchRawTransmitter) +RCSwitchTypeBTransmitter = remote_ns.class_('RCSwitchTypeBTransmitter', RCSwitchRawTransmitter) +RCSwitchTypeCTransmitter = remote_ns.class_('RCSwitchTypeCTransmitter', RCSwitchRawTransmitter) +RCSwitchTypeDTransmitter = remote_ns.class_('RCSwitchTypeDTransmitter', RCSwitchRawTransmitter) validate_raw_data = [vol.Any(vol.Coerce(int), cv.time_period_microseconds)] diff --git a/esphomeyaml/components/switch/restart.py b/esphomeyaml/components/switch/restart.py index 90a8f1de3f..c81f486dd2 100644 --- a/esphomeyaml/components/switch/restart.py +++ b/esphomeyaml/components/switch/restart.py @@ -5,8 +5,8 @@ from esphomeyaml.components import switch from esphomeyaml.const import CONF_INVERTED, CONF_MAKE_ID, CONF_NAME from esphomeyaml.helpers import App, Application, variable -MakeRestartSwitch = Application.MakeRestartSwitch -RestartSwitch = switch.switch_ns.RestartSwitch +MakeRestartSwitch = Application.struct('MakeRestartSwitch') +RestartSwitch = switch.switch_ns.class_('RestartSwitch', switch.Switch) PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(RestartSwitch), diff --git a/esphomeyaml/components/switch/shutdown.py b/esphomeyaml/components/switch/shutdown.py index 330750eb0c..cca5f7184c 100644 --- a/esphomeyaml/components/switch/shutdown.py +++ b/esphomeyaml/components/switch/shutdown.py @@ -5,8 +5,8 @@ from esphomeyaml.components import switch from esphomeyaml.const import CONF_INVERTED, CONF_MAKE_ID, CONF_NAME from esphomeyaml.helpers import App, Application, variable -MakeShutdownSwitch = Application.MakeShutdownSwitch -ShutdownSwitch = switch.switch_ns.ShutdownSwitch +MakeShutdownSwitch = Application.struct('MakeShutdownSwitch') +ShutdownSwitch = switch.switch_ns.class_('ShutdownSwitch', switch.Switch) PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(ShutdownSwitch), diff --git a/esphomeyaml/components/switch/template.py b/esphomeyaml/components/switch/template.py index d231cd761d..464d90feb7 100644 --- a/esphomeyaml/components/switch/template.py +++ b/esphomeyaml/components/switch/template.py @@ -6,10 +6,10 @@ from esphomeyaml.components import switch from esphomeyaml.const import CONF_LAMBDA, CONF_MAKE_ID, CONF_NAME, CONF_TURN_OFF_ACTION, \ CONF_TURN_ON_ACTION, CONF_OPTIMISTIC, CONF_RESTORE_STATE from esphomeyaml.helpers import App, Application, process_lambda, variable, NoArg, add, bool_, \ - optional, setup_component + optional, setup_component, Component -MakeTemplateSwitch = Application.MakeTemplateSwitch -TemplateSwitch = switch.switch_ns.TemplateSwitch +MakeTemplateSwitch = Application.struct('MakeTemplateSwitch') +TemplateSwitch = switch.switch_ns.class_('TemplateSwitch', switch.Switch, Component) PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(TemplateSwitch), diff --git a/esphomeyaml/components/switch/uart.py b/esphomeyaml/components/switch/uart.py index dccfc75deb..3cbe26dc36 100644 --- a/esphomeyaml/components/switch/uart.py +++ b/esphomeyaml/components/switch/uart.py @@ -1,7 +1,7 @@ import voluptuous as vol import esphomeyaml.config_validation as cv -from esphomeyaml.components import switch +from esphomeyaml.components import switch, uart from esphomeyaml.components.uart import UARTComponent from esphomeyaml.const import CONF_DATA, CONF_INVERTED, CONF_MAKE_ID, CONF_NAME, CONF_UART_ID from esphomeyaml.core import HexInt @@ -9,8 +9,8 @@ from esphomeyaml.helpers import App, Application, ArrayInitializer, get_variable DEPENDENCIES = ['uart'] -MakeUARTSwitch = Application.MakeUARTSwitch -UARTSwitch = switch.switch_ns.UARTSwitch +MakeUARTSwitch = Application.struct('MakeUARTSwitch') +UARTSwitch = switch.switch_ns.class_('UARTSwitch', switch.Switch, uart.UARTDevice) def validate_data(value): @@ -33,13 +33,12 @@ PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ def to_code(config): - uart = None - for uart in get_variable(config[CONF_UART_ID]): + for uart_ in get_variable(config[CONF_UART_ID]): yield data = config[CONF_DATA] if isinstance(data, str): data = [HexInt(ord(x)) for x in data] - rhs = App.make_uart_switch(uart, config[CONF_NAME], ArrayInitializer(*data, multiline=False)) + rhs = App.make_uart_switch(uart_, config[CONF_NAME], ArrayInitializer(*data, multiline=False)) restart = variable(config[CONF_MAKE_ID], rhs) switch.setup_switch(restart.Puart, restart.Pmqtt, config) diff --git a/esphomeyaml/components/text_sensor/__init__.py b/esphomeyaml/components/text_sensor/__init__.py index 89c3e2fead..0348b07fed 100644 --- a/esphomeyaml/components/text_sensor/__init__.py +++ b/esphomeyaml/components/text_sensor/__init__.py @@ -6,7 +6,7 @@ import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_ICON, CONF_ID, CONF_INTERNAL, CONF_MQTT_ID, CONF_ON_VALUE, \ CONF_TRIGGER_ID from esphomeyaml.helpers import App, Pvariable, add, add_job, esphomelib_ns, setup_mqtt_component, \ - std_string + std_string, Nameable, Trigger PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ @@ -14,14 +14,14 @@ PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ # pylint: disable=invalid-name text_sensor_ns = esphomelib_ns.namespace('text_sensor') -TextSensor = text_sensor_ns.TextSensor -MQTTTextSensor = text_sensor_ns.MQTTTextSensor +TextSensor = text_sensor_ns.class_('TextSensor', Nameable) +MQTTTextSensor = text_sensor_ns.class_('MQTTTextSensor', mqtt.MQTTComponent) -TextSensorStateTrigger = text_sensor_ns.TextSensorStateTrigger +TextSensorStateTrigger = text_sensor_ns.class_('TextSensorStateTrigger', + Trigger.template(std_string)) TEXT_SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend({ cv.GenerateID(CONF_MQTT_ID): cv.declare_variable_id(MQTTTextSensor), - cv.GenerateID(): cv.declare_variable_id(TextSensor), vol.Optional(CONF_ICON): cv.icon, vol.Optional(CONF_ON_VALUE): automation.validate_automation({ cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(TextSensorStateTrigger), diff --git a/esphomeyaml/components/text_sensor/mqtt_subscribe.py b/esphomeyaml/components/text_sensor/mqtt_subscribe.py index b2ad34e129..c4dafadee7 100644 --- a/esphomeyaml/components/text_sensor/mqtt_subscribe.py +++ b/esphomeyaml/components/text_sensor/mqtt_subscribe.py @@ -3,12 +3,13 @@ import voluptuous as vol from esphomeyaml.components import text_sensor import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_QOS, CONF_TOPIC -from esphomeyaml.helpers import App, Application, add, variable, setup_component +from esphomeyaml.helpers import App, Application, add, variable, setup_component, Component DEPENDENCIES = ['mqtt'] -MakeMQTTSubscribeTextSensor = Application.MakeMQTTSubscribeTextSensor -MQTTSubscribeTextSensor = text_sensor.text_sensor_ns.MQTTSubscribeTextSensor +MakeMQTTSubscribeTextSensor = Application.struct('MakeMQTTSubscribeTextSensor') +MQTTSubscribeTextSensor = text_sensor.text_sensor_ns.class_('MQTTSubscribeTextSensor', + text_sensor.TextSensor, Component) PLATFORM_SCHEMA = cv.nameable(text_sensor.TEXT_SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(MQTTSubscribeTextSensor), diff --git a/esphomeyaml/components/text_sensor/template.py b/esphomeyaml/components/text_sensor/template.py index 61499bb3b6..264841ea4b 100644 --- a/esphomeyaml/components/text_sensor/template.py +++ b/esphomeyaml/components/text_sensor/template.py @@ -4,10 +4,11 @@ from esphomeyaml.components import text_sensor import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_LAMBDA, CONF_MAKE_ID, CONF_NAME, CONF_UPDATE_INTERVAL from esphomeyaml.helpers import App, Application, add, optional, process_lambda, std_string, \ - variable, setup_component + variable, setup_component, PollingComponent -MakeTemplateTextSensor = Application.MakeTemplateTextSensor -TemplateTextSensor = text_sensor.text_sensor_ns.TemplateTextSensor +MakeTemplateTextSensor = Application.struct('MakeTemplateTextSensor') +TemplateTextSensor = text_sensor.text_sensor_ns.class_('TemplateTextSensor', + text_sensor.TextSensor, PollingComponent) PLATFORM_SCHEMA = cv.nameable(text_sensor.TEXT_SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(TemplateTextSensor), diff --git a/esphomeyaml/components/text_sensor/version.py b/esphomeyaml/components/text_sensor/version.py index e1312c5342..1bfbac7fe6 100644 --- a/esphomeyaml/components/text_sensor/version.py +++ b/esphomeyaml/components/text_sensor/version.py @@ -1,10 +1,11 @@ from esphomeyaml.components import text_sensor import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME -from esphomeyaml.helpers import App, Application, variable, setup_component +from esphomeyaml.helpers import App, Application, variable, setup_component, Component -MakeVersionTextSensor = Application.MakeVersionTextSensor -VersionTextSensor = text_sensor.text_sensor_ns.VersionTextSensor +MakeVersionTextSensor = Application.struct('MakeVersionTextSensor') +VersionTextSensor = text_sensor.text_sensor_ns.class_('VersionTextSensor', + text_sensor.TextSensor, Component) PLATFORM_SCHEMA = cv.nameable(text_sensor.TEXT_SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(VersionTextSensor), diff --git a/esphomeyaml/components/time/__init__.py b/esphomeyaml/components/time/__init__.py index 3d4d7c44c7..30a4f5e7d7 100644 --- a/esphomeyaml/components/time/__init__.py +++ b/esphomeyaml/components/time/__init__.py @@ -8,7 +8,8 @@ import esphomeyaml.config_validation as cv from esphomeyaml import automation from esphomeyaml.const import CONF_CRON, CONF_DAYS_OF_MONTH, CONF_DAYS_OF_WEEK, CONF_HOURS, \ CONF_MINUTES, CONF_MONTHS, CONF_ON_TIME, CONF_SECONDS, CONF_TIMEZONE, CONF_TRIGGER_ID -from esphomeyaml.helpers import App, NoArg, Pvariable, add, add_job, esphomelib_ns, ArrayInitializer +from esphomeyaml.helpers import App, NoArg, Pvariable, add, add_job, esphomelib_ns, \ + ArrayInitializer, Component, Trigger _LOGGER = logging.getLogger(__name__) @@ -17,7 +18,9 @@ PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ }) time_ns = esphomelib_ns.namespace('time') -CronTrigger = time_ns.CronTrigger +RealTimeClockComponent = time_ns.class_('RealTimeClockComponent', Component) +CronTrigger = time_ns.class_('CronTrigger', Trigger.template(NoArg), Component) +EsphomelibTime = time_ns.struct('EsphomelibTime') def _tz_timedelta(td): diff --git a/esphomeyaml/components/time/sntp.py b/esphomeyaml/components/time/sntp.py index 36925f2fc3..0422c8b6fa 100644 --- a/esphomeyaml/components/time/sntp.py +++ b/esphomeyaml/components/time/sntp.py @@ -5,7 +5,7 @@ from esphomeyaml.components import time as time_ from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_SERVERS from esphomeyaml.helpers import App, Pvariable, add, setup_component -SNTPComponent = time_.time_ns.SNTPComponent +SNTPComponent = time_.time_ns.class_('SNTPComponent', time_.RealTimeClockComponent) PLATFORM_SCHEMA = time_.TIME_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(SNTPComponent), diff --git a/esphomeyaml/components/uart.py b/esphomeyaml/components/uart.py index 0a04542665..8f5b9463fb 100644 --- a/esphomeyaml/components/uart.py +++ b/esphomeyaml/components/uart.py @@ -3,9 +3,10 @@ import voluptuous as vol import esphomeyaml.config_validation as cv from esphomeyaml import pins from esphomeyaml.const import CONF_BAUD_RATE, CONF_ID, CONF_RX_PIN, CONF_TX_PIN -from esphomeyaml.helpers import App, Pvariable, esphomelib_ns, setup_component +from esphomeyaml.helpers import App, Pvariable, esphomelib_ns, setup_component, Component -UARTComponent = esphomelib_ns.UARTComponent +UARTComponent = esphomelib_ns.class_('UARTComponent', Component) +UARTDevice = esphomelib_ns.class_('UARTDevice') UART_SCHEMA = vol.All(vol.Schema({ cv.GenerateID(): cv.declare_variable_id(UARTComponent), diff --git a/esphomeyaml/components/web_server.py b/esphomeyaml/components/web_server.py index 4a408843b6..dc1f7b6d7f 100644 --- a/esphomeyaml/components/web_server.py +++ b/esphomeyaml/components/web_server.py @@ -5,11 +5,10 @@ import voluptuous as vol import esphomeyaml.config_validation as cv from esphomeyaml import core from esphomeyaml.const import CONF_PORT, CONF_JS_URL, CONF_CSS_URL, CONF_ID, ESP_PLATFORM_ESP32 -from esphomeyaml.helpers import App, add, Pvariable, esphomelib_ns, setup_component +from esphomeyaml.helpers import App, add, Pvariable, esphomelib_ns, setup_component, Component, \ + StoringController -_LOGGER = logging.getLogger(__name__) - -WebServer = esphomelib_ns.WebServer +WebServer = esphomelib_ns.class_('WebServer', Component, StoringController) CONFIG_SCHEMA = vol.Schema({ cv.GenerateID(): cv.declare_variable_id(WebServer), diff --git a/esphomeyaml/components/wifi.py b/esphomeyaml/components/wifi.py index 125ccb6711..a627f9bb73 100644 --- a/esphomeyaml/components/wifi.py +++ b/esphomeyaml/components/wifi.py @@ -5,7 +5,8 @@ import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_AP, CONF_CHANNEL, CONF_DNS1, CONF_DNS2, CONF_DOMAIN, \ CONF_GATEWAY, CONF_HOSTNAME, CONF_ID, CONF_MANUAL_IP, CONF_PASSWORD, CONF_POWER_SAVE_MODE,\ CONF_REBOOT_TIMEOUT, CONF_SSID, CONF_STATIC_IP, CONF_SUBNET, ESP_PLATFORM_ESP8266 -from esphomeyaml.helpers import App, Pvariable, StructInitializer, add, esphomelib_ns, global_ns +from esphomeyaml.helpers import App, Pvariable, StructInitializer, add, esphomelib_ns, global_ns, \ + Component def validate_password(value): @@ -64,16 +65,16 @@ def validate(config): return config -# pylint: disable=invalid-name -IPAddress = global_ns.IPAddress -ManualIP = esphomelib_ns.ManualIP -WiFiComponent = esphomelib_ns.WiFiComponent -WiFiAp = esphomelib_ns.WiFiAp +IPAddress = global_ns.class_('IPAddress') +ManualIP = esphomelib_ns.struct('ManualIP') +WiFiComponent = esphomelib_ns.class_('WiFiComponent', Component) +WiFiAp = esphomelib_ns.struct('WiFiAp') +WiFiPowerSaveMode = esphomelib_ns.enum('WiFiPowerSaveMode') WIFI_POWER_SAVE_MODES = { - 'NONE': esphomelib_ns.WIFI_POWER_SAVE_NONE, - 'LIGHT': esphomelib_ns.WIFI_POWER_SAVE_LIGHT, - 'HIGH': esphomelib_ns.WIFI_POWER_SAVE_HIGH, + 'NONE': WiFiPowerSaveMode.WIFI_POWER_SAVE_NONE, + 'LIGHT': WiFiPowerSaveMode.WIFI_POWER_SAVE_LIGHT, + 'HIGH': WiFiPowerSaveMode.WIFI_POWER_SAVE_HIGH, } CONFIG_SCHEMA = vol.All(vol.Schema({ diff --git a/esphomeyaml/config.py b/esphomeyaml/config.py index 814df4905b..f891be6f34 100644 --- a/esphomeyaml/config.py +++ b/esphomeyaml/config.py @@ -10,7 +10,7 @@ from voluptuous.humanize import humanize_error from esphomeyaml import core, yaml_util, core_config from esphomeyaml.const import CONF_ESPHOMEYAML, CONF_PLATFORM, CONF_WIFI, ESP_PLATFORMS from esphomeyaml.core import ESPHomeYAMLError -from esphomeyaml.helpers import color +from esphomeyaml.helpers import color, MockObjClass from esphomeyaml.util import safe_print _LOGGER = logging.getLogger(__name__) @@ -106,11 +106,29 @@ def do_id_pass(result): # Check searched IDs for id, prefix, config in searching_ids: - if id.id is not None and not any(v[0].id == id.id for v in declare_ids): - result.add_error("Couldn't find ID {}".format(id.id), '.'.join(prefix), config) + if id.id is not None: + # manually declared + match = next((v[0] for v in declare_ids if v[0].id == id.id ), None) + if match is None: + # No declared ID with this name + result.add_error("Couldn't find ID {}".format(id.id), '.'.join(prefix), config) + continue + if not isinstance(match.type, MockObjClass) or not isinstance(id.type, MockObjClass): + continue + if not match.type.inherits_from(id.type): + result.add_error("ID '{}' of type {} doesn't inherit from {}. Please double check " + "your ID is pointing to the correct value" + "".format(id.id, match.type, id.type)) + if id.id is None and id.type is not None: - id.id = next((v[0].id for v in declare_ids if v[0].type == id.type), None) - if id.id is None: + for v in declare_ids: + if v[0] is None or not isinstance(v[0].type, MockObjClass): + continue + inherits = v[0].type.inherits_from(id.type) + if inherits: + id.id = v[0].id + break + else: result.add_error("Couldn't resolve ID for type {}".format(id.type), '.'.join(prefix), config) diff --git a/esphomeyaml/helpers.py b/esphomeyaml/helpers.py index d0dfb349c9..036d680763 100644 --- a/esphomeyaml/helpers.py +++ b/esphomeyaml/helpers.py @@ -530,6 +530,20 @@ class MockObj(Expression): obj.requires.append(self) return obj + def class_(self, name, *parents): + obj = MockObjClass(u'{}::{}'.format(self.base, name), u'.', parents=parents) + obj.requires.append(self) + return obj + + def struct(self, name): + return self.class_(name) + + def enum(self, name, is_class=False): + if is_class: + return self.namespace(name) + + return self + def operator(self, name): if name == 'ref': obj = MockObj(u'{} &'.format(self.base), u'') @@ -556,6 +570,34 @@ class MockObj(Expression): return obj +class MockObjClass(MockObj): + def __init__(self, *args, **kwargs): + parens = kwargs.pop('parents') + MockObj.__init__(self, *args, **kwargs) + self._parents = [] + for paren in parens: + if not isinstance(paren, MockObjClass): + raise ValueError + self._parents.append(paren) + self._parents += paren._parents + + def inherits_from(self, other): + if self == other: + return True + for parent in self._parents: + if parent == other: + return True + return False + + def template(self, args): + if not isinstance(args, TemplateArguments): + args = TemplateArguments(args) + obj = MockObjClass(u'{}{}'.format(self.base, args), parents=self._parents) + obj.requires.append(self) + obj.requires.append(args) + return obj + + global_ns = MockObj('', '') float_ = global_ns.namespace('float') bool_ = global_ns.namespace('bool') @@ -570,16 +612,24 @@ NAN = global_ns.namespace('NAN') esphomelib_ns = global_ns # using namespace esphomelib; NoArg = esphomelib_ns.NoArg App = esphomelib_ns.App -Application = esphomelib_ns.namespace('Application') -optional = esphomelib_ns.optional +io_ns = esphomelib_ns.namespace('io') +Nameable = esphomelib_ns.class_('Nameable') +Trigger = esphomelib_ns.class_('Trigger') +Action = esphomelib_ns.class_('Action') +Component = esphomelib_ns.class_('Component') +PollingComponent = esphomelib_ns.class_('PollingComponent', Component) +Application = esphomelib_ns.class_('Application') +optional = esphomelib_ns.class_('optional') arduino_json_ns = global_ns.namespace('ArduinoJson') -JsonObject = arduino_json_ns.JsonObject +JsonObject = arduino_json_ns.class_('JsonObject') JsonObjectRef = JsonObject.operator('ref') JsonObjectConstRef = JsonObjectRef.operator('const') +Controller = esphomelib_ns.class_('Controller') +StoringController = esphomelib_ns.class_('StoringController', Controller) -GPIOPin = esphomelib_ns.GPIOPin -GPIOOutputPin = esphomelib_ns.GPIOOutputPin -GPIOInputPin = esphomelib_ns.GPIOInputPin +GPIOPin = esphomelib_ns.class_('GPIOPin') +GPIOOutputPin = esphomelib_ns.class_('GPIOOutputPin', GPIOPin) +GPIOInputPin = esphomelib_ns.class_('GPIOInputPin', GPIOPin) def get_gpio_pin_number(conf): @@ -646,6 +696,7 @@ def setup_mqtt_component(obj, config): add(obj.set_availability(availability[CONF_TOPIC], availability[CONF_PAYLOAD_AVAILABLE], availability[CONF_PAYLOAD_NOT_AVAILABLE])) + def setup_component(obj, config): if CONF_SETUP_PRIORITY in config: add(obj.set_setup_priority(config[CONF_SETUP_PRIORITY])) diff --git a/esphomeyaml/pins.py b/esphomeyaml/pins.py index 1b67860ed4..8d736ee9b2 100644 --- a/esphomeyaml/pins.py +++ b/esphomeyaml/pins.py @@ -2,11 +2,11 @@ import logging import voluptuous as vol -import esphomeyaml.config_validation as cv from esphomeyaml import core -from esphomeyaml.components import pcf8574 +import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_INVERTED, CONF_MODE, CONF_NUMBER, CONF_PCF8574, \ ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266 +from esphomeyaml.helpers import Component, esphomelib_ns, io_ns _LOGGER = logging.getLogger(__name__) @@ -285,8 +285,11 @@ def shorthand_input_pin(value): return {CONF_NUMBER: value} +I2CDevice = esphomelib_ns.class_('I2CDevice') +PCF8574Component = io_ns.class_('PCF8574Component', Component, I2CDevice) + PCF8574_OUTPUT_PIN_SCHEMA = vol.Schema({ - vol.Required(CONF_PCF8574): cv.use_variable_id(pcf8574.PCF8574Component), + vol.Required(CONF_PCF8574): cv.use_variable_id(PCF8574Component), vol.Required(CONF_NUMBER): vol.Coerce(int), vol.Optional(CONF_MODE): vol.All(vol.Upper, cv.one_of("OUTPUT")), vol.Optional(CONF_INVERTED, default=False): cv.boolean, diff --git a/tests/test1.yaml b/tests/test1.yaml index e2703a3621..fadd001008 100644 --- a/tests/test1.yaml +++ b/tests/test1.yaml @@ -67,12 +67,10 @@ mqtt: ESP_LOGD("main", "Got message %s", x.c_str()); - topic: livingroom/ota_mode then: - - deep_sleep.prevent: - id: deep_sleep_1 + - deep_sleep.prevent: deep_sleep_1 - topic: livingroom/ota_mode then: - - deep_sleep.enter: - id: deep_sleep_1 + - deep_sleep.enter: deep_sleep_1 on_json_message: topic: the/topic then: