mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Add generate home assistant config command (#208)
* Add generate home assistant config command * Lint * Lint
This commit is contained in:
		| @@ -1,6 +1,7 @@ | ||||
| from __future__ import print_function | ||||
|  | ||||
| import argparse | ||||
| from collections import OrderedDict | ||||
| import logging | ||||
| import os | ||||
| import random | ||||
| @@ -334,6 +335,28 @@ def command_clean(args, config): | ||||
|     return 0 | ||||
|  | ||||
|  | ||||
| def command_hass_config(args, config): | ||||
|     from esphomeyaml.components import mqtt as mqtt_component | ||||
|  | ||||
|     _LOGGER.info("This is what you should put in your Home Assistant YAML configuration.") | ||||
|     _LOGGER.info("Please note this is only necessary if you're not using MQTT discovery.") | ||||
|     data = mqtt_component.GenerateHassConfigData(config) | ||||
|     hass_config = OrderedDict() | ||||
|     for domain, component, conf in iter_components(config): | ||||
|         if not hasattr(component, 'to_hass_config'): | ||||
|             continue | ||||
|         func = getattr(component, 'to_hass_config') | ||||
|         ret = func(data, conf) | ||||
|         if not isinstance(ret, (list, tuple)): | ||||
|             ret = [ret] | ||||
|         ret = [x for x in ret if x is not None] | ||||
|         domain_conf = hass_config.setdefault(domain.split('.')[0], []) | ||||
|         domain_conf += ret | ||||
|  | ||||
|     safe_print(yaml_util.dump(hass_config)) | ||||
|     return 0 | ||||
|  | ||||
|  | ||||
| def command_dashboard(args): | ||||
|     from esphomeyaml.dashboard import dashboard | ||||
|  | ||||
| @@ -355,6 +378,7 @@ POST_CONFIG_ACTIONS = { | ||||
|     'clean-mqtt': command_clean_mqtt, | ||||
|     'mqtt-fingerprint': command_mqtt_fingerprint, | ||||
|     'clean': command_clean, | ||||
|     'hass-config': command_hass_config, | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -436,6 +460,9 @@ def parse_args(argv): | ||||
|     dashboard.add_argument("--open-ui", help="Open the dashboard UI in a browser.", | ||||
|                            action='store_true') | ||||
|  | ||||
|     subparsers.add_parser('hass-config', help="Dump the configuration entries that should be added" | ||||
|                                               "to Home Assistant when not using MQTT discovery.") | ||||
|  | ||||
|     return parser.parse_args(argv[1:]) | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| from esphomeyaml.components import mqtt | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml import automation | ||||
| from esphomeyaml.const import CONF_DEVICE_CLASS, CONF_ID, CONF_INTERNAL, CONF_INVERTED, \ | ||||
| @@ -154,4 +155,14 @@ def register_binary_sensor(var, config): | ||||
|     add_job(setup_binary_sensor_core_, binary_sensor_var, mqtt_var, config) | ||||
|  | ||||
|  | ||||
| def core_to_hass_config(data, config): | ||||
|     ret = mqtt.build_hass_config(data, 'binary_sensor', config, | ||||
|                                  include_state=True, include_command=False) | ||||
|     if ret is None: | ||||
|         return None | ||||
|     if CONF_DEVICE_CLASS in config: | ||||
|         ret['device_class'] = config[CONF_DEVICE_CLASS] | ||||
|     return ret | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_BINARY_SENSOR' | ||||
|   | ||||
| @@ -21,3 +21,7 @@ def to_code(config): | ||||
|         yield | ||||
|     rhs = hub.make_presence_sensor(config[CONF_NAME], make_address_array(config[CONF_MAC_ADDRESS])) | ||||
|     binary_sensor.register_binary_sensor(rhs, config) | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return binary_sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -51,3 +51,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_ESP32_TOUCH_BINARY_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return binary_sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -24,3 +24,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_GPIO_BINARY_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return binary_sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -24,3 +24,7 @@ def to_code(config): | ||||
|     rhs = hub.make_touch_component(config[CONF_NAME], config[CONF_PAGE_ID], | ||||
|                                    config[CONF_COMPONENT_ID]) | ||||
|     binary_sensor.register_binary_sensor(rhs, config) | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return binary_sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -40,3 +40,7 @@ def to_code(config): | ||||
|     addr = [HexInt(int(x, 16)) for x in config[CONF_UID].split('-')] | ||||
|     rhs = hub.make_tag(config[CONF_NAME], ArrayInitializer(*addr, multiline=False)) | ||||
|     binary_sensor.register_binary_sensor(rhs, config) | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return binary_sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -21,3 +21,7 @@ def to_code(config): | ||||
|         yield | ||||
|     rhs = hub.make_card(config[CONF_NAME], config[CONF_UID]) | ||||
|     binary_sensor.register_binary_sensor(rhs, config) | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return binary_sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -119,3 +119,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_REMOTE_RECEIVER' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return binary_sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -19,3 +19,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_STATUS_BINARY_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return binary_sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -26,3 +26,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_TEMPLATE_BINARY_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return binary_sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY | ||||
| 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, \ | ||||
| @@ -88,3 +89,10 @@ def cover_stop_to_code(config, action_id, arg_type): | ||||
|     rhs = var.make_stop_action(template_arg) | ||||
|     type = StopAction.template(arg_type) | ||||
|     yield Pvariable(action_id, rhs, type=type) | ||||
|  | ||||
|  | ||||
| def core_to_hass_config(data, config): | ||||
|     ret = mqtt.build_hass_config(data, 'cover', config, include_state=True, include_command=True) | ||||
|     if ret is None: | ||||
|         return None | ||||
|     return ret | ||||
|   | ||||
| @@ -45,3 +45,12 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_TEMPLATE_COVER' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     ret = cover.core_to_hass_config(data, config) | ||||
|     if ret is None: | ||||
|         return None | ||||
|     if CONF_OPTIMISTIC in config: | ||||
|         ret['optimistic'] = config[CONF_OPTIMISTIC] | ||||
|     return ret | ||||
|   | ||||
| @@ -1,10 +1,11 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY | ||||
| from esphomeyaml.components import mqtt | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.const import CONF_ID, CONF_MQTT_ID, CONF_OSCILLATION_COMMAND_TOPIC, \ | ||||
|     CONF_OSCILLATION_STATE_TOPIC, CONF_SPEED_COMMAND_TOPIC, CONF_SPEED_STATE_TOPIC, CONF_INTERNAL, \ | ||||
|     CONF_SPEED, CONF_OSCILLATING | ||||
|     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_ | ||||
|  | ||||
| @@ -128,3 +129,15 @@ def fan_turn_on_to_code(config, action_id, arg_type): | ||||
|             yield None | ||||
|         add(action.set_speed(template_)) | ||||
|     yield action | ||||
|  | ||||
|  | ||||
| def core_to_hass_config(data, config): | ||||
|     ret = mqtt.build_hass_config(data, 'fan', config, include_state=True, include_command=True) | ||||
|     if ret is None: | ||||
|         return None | ||||
|     if CONF_OSCILLATION_OUTPUT in config: | ||||
|         default = mqtt.get_default_topic_for(data, 'fan', config[CONF_NAME], 'oscillation/state') | ||||
|         ret['oscillation_state_topic'] = config.get(CONF_OSCILLATION_STATE_TOPIC, default) | ||||
|         default = mqtt.get_default_topic_for(data, 'fan', config[CONF_NAME], 'oscillation/command') | ||||
|         ret['oscillation_command__topic'] = config.get(CONF_OSCILLATION_COMMAND_TOPIC, default) | ||||
|     return ret | ||||
|   | ||||
| @@ -27,3 +27,7 @@ def to_code(config): | ||||
|         add(fan_struct.Poutput.set_oscillation(oscillation_output)) | ||||
|  | ||||
|     fan.setup_fan(fan_struct.Pstate, fan_struct.Pmqtt, config) | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return fan.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.components import fan | ||||
| from esphomeyaml.components import fan, mqtt | ||||
| 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 | ||||
| @@ -43,3 +43,14 @@ def to_code(config): | ||||
|         add(fan_struct.Poutput.set_oscillation(oscillation_output)) | ||||
|  | ||||
|     fan.setup_fan(fan_struct.Pstate, fan_struct.Pmqtt, config) | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     ret = fan.core_to_hass_config(data, config) | ||||
|     if ret is None: | ||||
|         return None | ||||
|     default = mqtt.get_default_topic_for(data, 'fan', config[CONF_NAME], 'speed/state') | ||||
|     ret['speed_state_topic'] = config.get(CONF_SPEED_STATE_TOPIC, default) | ||||
|     default = mqtt.get_default_topic_for(data, 'fan', config[CONF_NAME], 'speed/command') | ||||
|     ret['speed_command__topic'] = config.get(CONF_SPEED_COMMAND_TOPIC, default) | ||||
|     return ret | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY | ||||
| from esphomeyaml.components import mqtt | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.const import CONF_ALPHA, CONF_BLUE, CONF_BRIGHTNESS, CONF_COLORS, \ | ||||
|     CONF_DEFAULT_TRANSITION_LENGTH, CONF_DURATION, CONF_EFFECTS, CONF_EFFECT_ID, \ | ||||
| @@ -448,3 +449,24 @@ def light_turn_on_to_code(config, action_id, arg_type): | ||||
|             yield None | ||||
|         add(action.set_effect(template_)) | ||||
|     yield action | ||||
|  | ||||
|  | ||||
| def core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=True, | ||||
|                         white_value=True): | ||||
|     ret = mqtt.build_hass_config(data, 'light', config, include_state=True, include_command=True, | ||||
|                                  platform='mqtt_json') | ||||
|     if ret is None: | ||||
|         return None | ||||
|     if brightness: | ||||
|         ret['brightness'] = True | ||||
|     if rgb: | ||||
|         ret['rgb'] = True | ||||
|     if color_temp: | ||||
|         ret['color_temp'] = True | ||||
|     if white_value: | ||||
|         ret['white_value'] = True | ||||
|     for effect in config.get(CONF_EFFECTS, []): | ||||
|         ret["effect"] = True | ||||
|         effects = ret.setdefault("effect_list", []) | ||||
|         effects.append(next(x for x in effect.values())[CONF_NAME]) | ||||
|     return ret | ||||
|   | ||||
| @@ -19,3 +19,8 @@ def to_code(config): | ||||
|     rhs = App.make_binary_light(config[CONF_NAME], output) | ||||
|     light_struct = variable(config[CONF_MAKE_ID], rhs) | ||||
|     light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config) | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return light.core_to_hass_config(data, config, brightness=False, rgb=False, color_temp=False, | ||||
|                                      white_value=False) | ||||
|   | ||||
| @@ -32,3 +32,8 @@ def to_code(config): | ||||
|                               cold_white, warm_white) | ||||
|     light_struct = variable(config[CONF_MAKE_ID], rhs) | ||||
|     light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config) | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return light.core_to_hass_config(data, config, brightness=True, rgb=False, color_temp=True, | ||||
|                                      white_value=False) | ||||
|   | ||||
| @@ -102,3 +102,8 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_FAST_LED_LIGHT' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return light.core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=False, | ||||
|                                      white_value=False) | ||||
|   | ||||
| @@ -82,3 +82,8 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_FAST_LED_LIGHT' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return light.core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=False, | ||||
|                                      white_value=False) | ||||
|   | ||||
| @@ -22,3 +22,8 @@ def to_code(config): | ||||
|     rhs = App.make_monochromatic_light(config[CONF_NAME], output) | ||||
|     light_struct = variable(config[CONF_MAKE_ID], rhs) | ||||
|     light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config) | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return light.core_to_hass_config(data, config, brightness=True, rgb=False, color_temp=False, | ||||
|                                      white_value=False) | ||||
|   | ||||
| @@ -30,3 +30,8 @@ def to_code(config): | ||||
|     rhs = App.make_rgb_light(config[CONF_NAME], red, green, blue) | ||||
|     light_struct = variable(config[CONF_MAKE_ID], rhs) | ||||
|     light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config) | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return light.core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=False, | ||||
|                                      white_value=False) | ||||
|   | ||||
| @@ -34,3 +34,8 @@ def to_code(config): | ||||
|     rhs = App.make_rgbw_light(config[CONF_NAME], red, green, blue, white) | ||||
|     light_struct = variable(config[CONF_MAKE_ID], rhs) | ||||
|     light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config) | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return light.core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=False, | ||||
|                                      white_value=True) | ||||
|   | ||||
| @@ -60,3 +60,8 @@ def to_code(config): | ||||
|                                red, green, blue, cold_white, warm_white) | ||||
|     light_struct = variable(config[CONF_MAKE_ID], rhs) | ||||
|     light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config) | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return light.core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=True, | ||||
|                                      white_value=True) | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| from collections import OrderedDict | ||||
| import re | ||||
|  | ||||
| import voluptuous as vol | ||||
| @@ -10,7 +11,10 @@ from esphomeyaml.const import CONF_BIRTH_MESSAGE, CONF_BROKER, CONF_CLIENT_ID, C | ||||
|     CONF_DISCOVERY_PREFIX, CONF_DISCOVERY_RETAIN, CONF_ID, CONF_KEEPALIVE, CONF_LEVEL, \ | ||||
|     CONF_LOG_TOPIC, CONF_ON_MESSAGE, CONF_PASSWORD, CONF_PAYLOAD, CONF_PORT, CONF_QOS, \ | ||||
|     CONF_REBOOT_TIMEOUT, CONF_RETAIN, CONF_SHUTDOWN_MESSAGE, CONF_SSL_FINGERPRINTS, CONF_TOPIC, \ | ||||
|     CONF_TOPIC_PREFIX, CONF_TRIGGER_ID, CONF_USERNAME, CONF_WILL_MESSAGE, CONF_ON_JSON_MESSAGE | ||||
|     CONF_TOPIC_PREFIX, CONF_TRIGGER_ID, CONF_USERNAME, CONF_WILL_MESSAGE, CONF_ON_JSON_MESSAGE, \ | ||||
|     CONF_STATE_TOPIC, CONF_MQTT, CONF_ESPHOMEYAML, CONF_NAME, CONF_AVAILABILITY, \ | ||||
|     CONF_PAYLOAD_AVAILABLE, CONF_PAYLOAD_NOT_AVAILABLE, CONF_INTERNAL | ||||
| 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 | ||||
| @@ -239,3 +243,66 @@ def required_build_flags(config): | ||||
|     if CONF_SSL_FINGERPRINTS in config: | ||||
|         return '-DASYNC_TCP_SSL_ENABLED=1' | ||||
|     return None | ||||
|  | ||||
|  | ||||
| def get_default_topic_for(data, component_type, name, suffix): | ||||
|     whitelist = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_' | ||||
|     sanitized_name = ''.join(x for x in name.lower().replace(' ', '_') if x in whitelist) | ||||
|     return '{}/{}/{}/{}'.format(data.topic_prefix, component_type, | ||||
|                                 sanitized_name, suffix) | ||||
|  | ||||
|  | ||||
| def build_hass_config(data, component_type, config, include_state=True, include_command=True, | ||||
|                       platform='mqtt'): | ||||
|     if config.get(CONF_INTERNAL, False): | ||||
|         return None | ||||
|     ret = OrderedDict() | ||||
|     ret['platform'] = platform | ||||
|     ret['name'] = config[CONF_NAME] | ||||
|     if include_state: | ||||
|         default = get_default_topic_for(data, component_type, config[CONF_NAME], 'state') | ||||
|         ret['state_topic'] = config.get(CONF_STATE_TOPIC, default) | ||||
|     if include_command: | ||||
|         default = get_default_topic_for(data, component_type, config[CONF_NAME], 'command') | ||||
|         ret['command_topic'] = config.get(CONF_STATE_TOPIC, default) | ||||
|     avail = config.get(CONF_AVAILABILITY, data.availability) | ||||
|     if avail: | ||||
|         ret['availability_topic'] = avail[CONF_TOPIC] | ||||
|         payload_available = avail[CONF_PAYLOAD_AVAILABLE] | ||||
|         if payload_available != 'online': | ||||
|             ret['payload_available'] = payload_available | ||||
|         payload_not_available = avail[CONF_PAYLOAD_NOT_AVAILABLE] | ||||
|         if payload_not_available != 'offline': | ||||
|             ret['payload_not_available'] = payload_not_available | ||||
|     return ret | ||||
|  | ||||
|  | ||||
| class GenerateHassConfigData(object): | ||||
|     def __init__(self, config): | ||||
|         if 'mqtt' not in config: | ||||
|             raise ESPHomeYAMLError("Cannot generate Home Assistant MQTT config if MQTT is not " | ||||
|                                    "used!") | ||||
|         mqtt = config[CONF_MQTT] | ||||
|         self.topic_prefix = mqtt.get(CONF_TOPIC_PREFIX, config[CONF_ESPHOMEYAML][CONF_NAME]) | ||||
|         birth_message = mqtt.get(CONF_BIRTH_MESSAGE) | ||||
|         if CONF_BIRTH_MESSAGE not in mqtt: | ||||
|             birth_message = { | ||||
|                 CONF_TOPIC: self.topic_prefix + '/status', | ||||
|                 CONF_PAYLOAD: 'online', | ||||
|             } | ||||
|         will_message = mqtt.get(CONF_WILL_MESSAGE) | ||||
|         if CONF_WILL_MESSAGE not in mqtt: | ||||
|             will_message = { | ||||
|                 CONF_TOPIC: self.topic_prefix + '/status', | ||||
|                 CONF_PAYLOAD: 'offline' | ||||
|             } | ||||
|         if not birth_message or not will_message: | ||||
|             self.availability = None | ||||
|         elif birth_message[CONF_TOPIC] != will_message[CONF_TOPIC]: | ||||
|             self.availability = None | ||||
|         else: | ||||
|             self.availability = { | ||||
|                 CONF_TOPIC: birth_message[CONF_TOPIC], | ||||
|                 CONF_PAYLOAD_AVAILABLE: birth_message[CONF_PAYLOAD], | ||||
|                 CONF_PAYLOAD_NOT_AVAILABLE: will_message[CONF_PAYLOAD], | ||||
|             } | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| from esphomeyaml.components import mqtt | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml import automation | ||||
| from esphomeyaml.const import CONF_ABOVE, CONF_ACCURACY_DECIMALS, CONF_ALPHA, CONF_BELOW, \ | ||||
| @@ -211,3 +212,18 @@ def register_sensor(var, config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_SENSOR' | ||||
|  | ||||
|  | ||||
| def core_to_hass_config(data, config): | ||||
|     ret = mqtt.build_hass_config(data, 'sensor', config, include_state=True, include_command=False) | ||||
|     if ret is None: | ||||
|         return None | ||||
|     if CONF_UNIT_OF_MEASUREMENT in config: | ||||
|         ret['unit_of_measurement'] = config[CONF_UNIT_OF_MEASUREMENT] | ||||
|     if CONF_EXPIRE_AFTER in config: | ||||
|         expire = config[CONF_EXPIRE_AFTER] | ||||
|         if expire is not None: | ||||
|             ret['expire_after'] = expire.total_seconds | ||||
|     if CONF_ICON in config: | ||||
|         ret['icon'] = config[CONF_ICON] | ||||
|     return ret | ||||
|   | ||||
| @@ -52,3 +52,7 @@ def required_build_flags(config): | ||||
|     if config[CONF_PIN] == 'VCC': | ||||
|         return '-DUSE_ADC_SENSOR_VCC' | ||||
|     return None | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -65,3 +65,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_ADS1115_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -35,3 +35,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_BH1750' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -21,3 +21,7 @@ def to_code(config): | ||||
|         yield | ||||
|     rhs = hub.make_rssi_sensor(config[CONF_NAME], make_address_array(config[CONF_MAC_ADDRESS])) | ||||
|     sensor.register_sensor(rhs, config) | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -72,3 +72,9 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_BME280' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]), | ||||
|             sensor.core_to_hass_config(data, config[CONF_PRESSURE]), | ||||
|             sensor.core_to_hass_config(data, config[CONF_HUMIDITY])] | ||||
|   | ||||
| @@ -92,3 +92,10 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_BME680' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]), | ||||
|             sensor.core_to_hass_config(data, config[CONF_PRESSURE]), | ||||
|             sensor.core_to_hass_config(data, config[CONF_HUMIDITY]), | ||||
|             sensor.core_to_hass_config(data, config[CONF_GAS_RESISTANCE])] | ||||
|   | ||||
| @@ -34,3 +34,8 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_BMP085_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]), | ||||
|             sensor.core_to_hass_config(data, config[CONF_PRESSURE])] | ||||
|   | ||||
| @@ -65,3 +65,8 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_BMP280' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]), | ||||
|             sensor.core_to_hass_config(data, config[CONF_PRESSURE])] | ||||
|   | ||||
| @@ -40,3 +40,11 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_CSE7766' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     ret = [] | ||||
|     for key in (CONF_VOLTAGE, CONF_CURRENT, CONF_POWER): | ||||
|         if key in config: | ||||
|             ret.append(sensor.core_to_hass_config(data, config[key])) | ||||
|     return ret | ||||
|   | ||||
| @@ -29,3 +29,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_DALLAS_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -46,3 +46,8 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_DHT_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]), | ||||
|             sensor.core_to_hass_config(data, config[CONF_HUMIDITY])] | ||||
|   | ||||
| @@ -31,3 +31,8 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_DHT12_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]), | ||||
|             sensor.core_to_hass_config(data, config[CONF_HUMIDITY])] | ||||
|   | ||||
| @@ -26,3 +26,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_DUTY_CYCLE_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -22,3 +22,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_ESP32_HALL_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -32,3 +32,8 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_HDC1080_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]), | ||||
|             sensor.core_to_hass_config(data, config[CONF_HUMIDITY])] | ||||
|   | ||||
| @@ -55,3 +55,11 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_HLW8012' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     ret = [] | ||||
|     for key in (CONF_VOLTAGE, CONF_CURRENT, CONF_POWER): | ||||
|         if key in config: | ||||
|             ret.append(sensor.core_to_hass_config(data, config[key])) | ||||
|     return ret | ||||
|   | ||||
| @@ -71,3 +71,11 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_HMC5883L' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     ret = [] | ||||
|     for key in (CONF_FIELD_STRENGTH_X, CONF_FIELD_STRENGTH_Y, CONF_FIELD_STRENGTH_Z, CONF_HEADING): | ||||
|         if key in config: | ||||
|             ret.append(sensor.core_to_hass_config(data, config[key])) | ||||
|     return ret | ||||
|   | ||||
| @@ -30,3 +30,8 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_HTU21D_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]), | ||||
|             sensor.core_to_hass_config(data, config[CONF_HUMIDITY])] | ||||
|   | ||||
| @@ -44,3 +44,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_HX711' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -51,3 +51,11 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_INA219' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     ret = [] | ||||
|     for key in (CONF_BUS_VOLTAGE, CONF_SHUNT_VOLTAGE, CONF_CURRENT, CONF_POWER): | ||||
|         if key in config: | ||||
|             ret.append(sensor.core_to_hass_config(data, config[key])) | ||||
|     return ret | ||||
|   | ||||
| @@ -62,3 +62,15 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_INA3221' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     ret = [] | ||||
|     for channel in (CONF_CHANNEL_1, CONF_CHANNEL_2, CONF_CHANNEL_3): | ||||
|         if channel not in config: | ||||
|             continue | ||||
|         conf = config[channel] | ||||
|         for key in (CONF_BUS_VOLTAGE, CONF_SHUNT_VOLTAGE, CONF_CURRENT, CONF_POWER): | ||||
|             if key in conf: | ||||
|                 ret.append(sensor.core_to_hass_config(data, conf[key])) | ||||
|     return ret | ||||
|   | ||||
| @@ -32,3 +32,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_MAX6675_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -36,3 +36,11 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_MHZ19' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     ret = [] | ||||
|     for key in (CONF_CO2, CONF_TEMPERATURE): | ||||
|         if key in config: | ||||
|             ret.append(sensor.core_to_hass_config(data, config[key])) | ||||
|     return ret | ||||
|   | ||||
| @@ -69,3 +69,12 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_MPU6050' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     ret = [] | ||||
|     for key in (CONF_ACCEL_X, CONF_ACCEL_Y, CONF_ACCEL_Z, CONF_GYRO_X, CONF_GYRO_Y, CONF_GYRO_Z, | ||||
|                 CONF_TEMPERATURE): | ||||
|         if key in config: | ||||
|             ret.append(sensor.core_to_hass_config(data, config[key])) | ||||
|     return ret | ||||
|   | ||||
| @@ -27,3 +27,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_MQTT_SUBSCRIBE_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -35,3 +35,8 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_MS5611' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]), | ||||
|             sensor.core_to_hass_config(data, config[CONF_PRESSURE])] | ||||
|   | ||||
| @@ -85,3 +85,12 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_PMSX003' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     ret = [] | ||||
|     for key in (CONF_PM_1_0, CONF_PM_2_5, CONF_PM_10_0, CONF_TEMPERATURE, CONF_HUMIDITY, | ||||
|                 CONF_FORMALDEHYDE): | ||||
|         if key in config: | ||||
|             ret.append(sensor.core_to_hass_config(data, config[key])) | ||||
|     return ret | ||||
|   | ||||
| @@ -65,3 +65,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_PULSE_COUNTER_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -49,3 +49,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_ROTARY_ENCODER_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -36,3 +36,8 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_SHT3XD' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]), | ||||
|             sensor.core_to_hass_config(data, config[CONF_HUMIDITY])] | ||||
|   | ||||
| @@ -78,3 +78,12 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_TCS34725' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     ret = [] | ||||
|     for key in (CONF_RED_CHANNEL, CONF_GREEN_CHANNEL, CONF_BLUE_CHANNEL, CONF_CLEAR_CHANNEL, | ||||
|                 CONF_ILLUMINANCE, CONF_COLOR_TEMPERATURE): | ||||
|         if key in config: | ||||
|             ret.append(sensor.core_to_hass_config(data, config[key])) | ||||
|     return ret | ||||
|   | ||||
| @@ -27,3 +27,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_TEMPLATE_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -55,3 +55,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_TSL2561' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -39,3 +39,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_ULTRASONIC_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -20,3 +20,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_UPTIME_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -20,3 +20,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_WIFI_SIGNAL_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -45,3 +45,12 @@ def to_code(config): | ||||
|     if CONF_BATTERY_LEVEL in config: | ||||
|         conf = config[CONF_BATTERY_LEVEL] | ||||
|         sensor.register_sensor(dev.Pmake_battery_level_sensor(conf[CONF_NAME]), conf) | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     ret = [] | ||||
|     for key in (CONF_TEMPERATURE, CONF_MOISTURE, CONF_ILLUMINANCE, CONF_CONDUCTIVITY, | ||||
|                 CONF_BATTERY_LEVEL): | ||||
|         if key in config: | ||||
|             ret.append(sensor.core_to_hass_config(data, config[key])) | ||||
|     return ret | ||||
|   | ||||
| @@ -37,3 +37,11 @@ def to_code(config): | ||||
|     if CONF_BATTERY_LEVEL in config: | ||||
|         conf = config[CONF_BATTERY_LEVEL] | ||||
|         sensor.register_sensor(dev.Pmake_battery_level_sensor(conf[CONF_NAME]), conf) | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     ret = [] | ||||
|     for key in (CONF_TEMPERATURE, CONF_HUMIDITY, CONF_BATTERY_LEVEL): | ||||
|         if key in config: | ||||
|             ret.append(sensor.core_to_hass_config(data, config[key])) | ||||
|     return ret | ||||
|   | ||||
| @@ -1,8 +1,10 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY | ||||
| from esphomeyaml.components import mqtt | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.const import CONF_ICON, CONF_ID, CONF_INVERTED, CONF_MQTT_ID, CONF_INTERNAL | ||||
| 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 | ||||
|  | ||||
| @@ -100,3 +102,14 @@ def switch_turn_on_to_code(config, action_id, arg_type): | ||||
|     rhs = var.make_turn_on_action(template_arg) | ||||
|     type = TurnOnAction.template(arg_type) | ||||
|     yield Pvariable(action_id, rhs, type=type) | ||||
|  | ||||
|  | ||||
| def core_to_hass_config(data, config): | ||||
|     ret = mqtt.build_hass_config(data, 'switch', config, include_state=True, include_command=True) | ||||
|     if ret is None: | ||||
|         return None | ||||
|     if CONF_ICON in config: | ||||
|         ret['icon'] = config[CONF_ICON] | ||||
|     if CONF_OPTIMISTIC in config: | ||||
|         ret['optimistic'] = config[CONF_OPTIMISTIC] | ||||
|     return ret | ||||
|   | ||||
| @@ -29,3 +29,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_GPIO_SWITCH' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return switch.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -23,3 +23,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_OUTPUT_SWITCH' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return switch.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -146,3 +146,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_REMOTE_TRANSMITTER' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return switch.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -20,3 +20,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_RESTART_SWITCH' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return switch.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -20,3 +20,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_SHUTDOWN_SWITCH' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return switch.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -42,3 +42,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_TEMPLATE_SWITCH' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return switch.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -43,3 +43,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_UART_SWITCH' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return switch.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| from esphomeyaml import automation | ||||
| from esphomeyaml.components import mqtt | ||||
| 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 | ||||
| @@ -58,3 +59,12 @@ def register_text_sensor(var, config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_TEXT_SENSOR' | ||||
|  | ||||
|  | ||||
| def core_to_hass_config(data, config): | ||||
|     ret = mqtt.build_hass_config(data, 'sensor', config, include_state=True, include_command=False) | ||||
|     if ret is None: | ||||
|         return None | ||||
|     if CONF_ICON in config: | ||||
|         ret['icon'] = config[CONF_ICON] | ||||
|     return ret | ||||
|   | ||||
| @@ -25,3 +25,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_MQTT_SUBSCRIBE_TEXT_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return text_sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -28,3 +28,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_TEMPLATE_TEXT_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return text_sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -17,3 +17,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_VERSION_TEXT_SENSOR' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return text_sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -132,6 +132,13 @@ class EsphomeyamlCleanHandler(EsphomeyamlCommandWebSocket): | ||||
|         return ["esphomeyaml", config_file, "clean"] | ||||
|  | ||||
|  | ||||
| class EsphomeyamlHassConfigHandler(EsphomeyamlCommandWebSocket): | ||||
|     def build_command(self, message): | ||||
|         js = json.loads(message) | ||||
|         config_file = os.path.join(CONFIG_DIR, js['configuration']) | ||||
|         return ["esphomeyaml", config_file, "hass-config"] | ||||
|  | ||||
|  | ||||
| class SerialPortRequestHandler(BaseHandler): | ||||
|     def get(self): | ||||
|         if not self.is_authenticated(): | ||||
| @@ -230,6 +237,7 @@ def make_app(debug=False): | ||||
|         (r"/validate", EsphomeyamlValidateHandler), | ||||
|         (r"/clean-mqtt", EsphomeyamlCleanMqttHandler), | ||||
|         (r"/clean", EsphomeyamlCleanHandler), | ||||
|         (r"/hass-config", EsphomeyamlHassConfigHandler), | ||||
|         (r"/download.bin", DownloadBinaryRequestHandler), | ||||
|         (r"/serial-ports", SerialPortRequestHandler), | ||||
|         (r"/wizard.html", WizardRequestHandler), | ||||
|   | ||||
| @@ -215,6 +215,7 @@ | ||||
|           <ul id="dropdown-{{ i }}" class="dropdown-content"> | ||||
|             <li><a href="#" class="action-clean-mqtt" data-node="{{ file }}">Clean MQTT</a></li> | ||||
|             <li><a href="#" class="action-clean" data-node="{{ file }}">Clean Build</a></li> | ||||
|             <li><a href="#" class="action-hass-config" data-node="{{ file }}">Home Assistant Configuration</a></li> | ||||
|           </ul> | ||||
|         </div> | ||||
|       </div> | ||||
| @@ -491,6 +492,18 @@ | ||||
|   </div> | ||||
| </div> | ||||
|  | ||||
| <div id="modal-hass-config" class="modal modal-fixed-footer"> | ||||
|   <div class="modal-content"> | ||||
|     <h4>Generate Home Assistant Configuration <code class="inlinecode filename"></code></h4> | ||||
|     <div class="log-container"> | ||||
|       <pre class="log"></pre> | ||||
|     </div> | ||||
|   </div> | ||||
|   <div class="modal-footer"> | ||||
|     <a class="modal-close waves-effect waves-green btn-flat stop-logs">Stop</a> | ||||
|   </div> | ||||
| </div> | ||||
|  | ||||
| <a class="btn-floating btn-large ribbon-fab waves-effect waves-light pink accent-2" id="setup-wizard-start"> | ||||
|   <i class="material-icons">add</i> | ||||
| </a> | ||||
| @@ -904,6 +917,54 @@ | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   const hassConfigModalElem = document.getElementById("modal-hass-config"); | ||||
|  | ||||
|   document.querySelectorAll(".action-hass-config").forEach((btn) => { | ||||
|     btn.addEventListener('click', (e) => { | ||||
|       configuration = e.target.getAttribute('data-node'); | ||||
|       const modalInstance = M.Modal.getInstance(hassConfigModalElem); | ||||
|       const log = hassConfigModalElem.querySelector(".log"); | ||||
|       log.innerHTML = ""; | ||||
|       const stopLogsButton = hassConfigModalElem.querySelector(".stop-logs"); | ||||
|       let stopped = false; | ||||
|       stopLogsButton.innerHTML = "Stop"; | ||||
|       modalInstance.open(); | ||||
|  | ||||
|       const filenameField = hassConfigModalElem.querySelector('.filename'); | ||||
|       filenameField.innerHTML = configuration; | ||||
|  | ||||
|       const logSocket = new WebSocket(wsUrl + "/hass-config"); | ||||
|       logSocket.addEventListener('message', (event) => { | ||||
|         const data = JSON.parse(event.data); | ||||
|         if (data.event === "line") { | ||||
|           const msg = data.data; | ||||
|           log.innerHTML += colorReplace(msg); | ||||
|         } else if (data.event === "exit") { | ||||
|           if (data.code === 0) { | ||||
|             M.toast({html: "Program exited successfully."}); | ||||
|             downloadButton.classList.remove('disabled'); | ||||
|           } else { | ||||
|             M.toast({html: `Program failed with code ${data.code}`}); | ||||
|           } | ||||
|           stopLogsButton.innerHTML = "Close"; | ||||
|           stopped = true; | ||||
|         } | ||||
|       }); | ||||
|       logSocket.addEventListener('open', () => { | ||||
|         const msg = JSON.stringify({configuration: configuration}); | ||||
|         logSocket.send(msg); | ||||
|       }); | ||||
|       logSocket.addEventListener('close', () => { | ||||
|         if (!stopped) { | ||||
|           M.toast({html: 'Terminated process.'}); | ||||
|         } | ||||
|       }); | ||||
|       modalInstance.options.onCloseStart = () => { | ||||
|         logSocket.close(); | ||||
|       }; | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   const modalSetupElem = document.getElementById("modal-wizard"); | ||||
|   const setupWizardStart = document.getElementById('setup-wizard-start'); | ||||
|   const startWizard = () => { | ||||
|   | ||||
| @@ -27,17 +27,24 @@ OTA_VERSION_1_0 = 1 | ||||
| MAGIC_BYTES = [0x6C, 0x26, 0xF7, 0x5C, 0x45] | ||||
|  | ||||
| _LOGGER = logging.getLogger(__name__) | ||||
| LAST_PROGRESS = -1 | ||||
|  | ||||
|  | ||||
| def update_progress(progress): | ||||
|     global LAST_PROGRESS | ||||
|  | ||||
|     bar_length = 60 | ||||
|     status = "" | ||||
|     if progress >= 1: | ||||
|         progress = 1 | ||||
|         status = "Done...\r\n" | ||||
|     new_progress = int(progress * 100) | ||||
|     if new_progress == LAST_PROGRESS: | ||||
|         return | ||||
|     LAST_PROGRESS = new_progress | ||||
|     block = int(round(bar_length * progress)) | ||||
|     text = "\rUploading: [{0}] {1}% {2}".format("=" * block + " " * (bar_length - block), | ||||
|                                                 int(progress * 100), status) | ||||
|                                                 new_progress, status) | ||||
|     sys.stderr.write(text) | ||||
|     sys.stderr.flush() | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user