Changes for 1.12 (#482)

* Update setup scripts

* Add delete action, remove Hass config command

* Update esphome.js

* Lint
This commit is contained in:
Otto Winter 2019-03-16 22:24:26 +01:00 committed by GitHub
parent 0ccfe33427
commit d332e491ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
107 changed files with 156 additions and 837 deletions

View File

@ -126,7 +126,7 @@ test3:
- pip install -e . - pip install -e .
- pip install twine - pip install twine
script: script:
- python setup.py sdist - python setup.py sdist bdist_wheel
- twine upload dist/* - twine upload dist/*
tags: tags:
- docker - docker

View File

@ -1,17 +1,6 @@
include LICENSE
include README.md include README.md
include esphome/dashboard/templates/index.html include esphome/dashboard/templates/*.html
include esphome/dashboard/templates/login.html include esphome/dashboard/static/*.js
include esphome/dashboard/static/ace.js include esphome/dashboard/static/*.css
include esphome/dashboard/static/esphome.css include esphome/dashboard/static/*.ico
include esphome/dashboard/static/esphome.js
include esphome/dashboard/static/favicon.ico
include esphome/dashboard/static/jquery.min.js
include esphome/dashboard/static/jquery.validate.min.js
include esphome/dashboard/static/jquery-ui.min.js
include esphome/dashboard/static/materialize.min.css
include esphome/dashboard/static/materialize.min.js
include esphome/dashboard/static/materialize-stepper.min.css
include esphome/dashboard/static/materialize-stepper.min.js
include esphome/dashboard/static/mode-yaml.js
include esphome/dashboard/static/theme-dreamweaver.js
include esphome/dashboard/static/ext-searchbox.js

View File

@ -1,7 +1,6 @@
from __future__ import print_function from __future__ import print_function
import argparse import argparse
from collections import OrderedDict
from datetime import datetime from datetime import datetime
import logging import logging
import os import os
@ -348,28 +347,6 @@ def command_clean(args, config):
return 0 return 0
def command_hass_config(args, config):
from esphome.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): def command_dashboard(args):
from esphome.dashboard import dashboard from esphome.dashboard import dashboard
@ -391,7 +368,6 @@ POST_CONFIG_ACTIONS = {
'clean-mqtt': command_clean_mqtt, 'clean-mqtt': command_clean_mqtt,
'mqtt-fingerprint': command_mqtt_fingerprint, 'mqtt-fingerprint': command_mqtt_fingerprint,
'clean': command_clean, 'clean': command_clean,
'hass-config': command_hass_config,
} }
@ -471,10 +447,6 @@ def parse_args(argv):
dashboard.add_argument("--socket", dashboard.add_argument("--socket",
help="Make the dashboard serve under a unix socket", type=str) help="Make the dashboard serve under a unix socket", type=str)
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:]) return parser.parse_args(argv[1:])

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: api.proto # source: api.proto

View File

@ -287,16 +287,6 @@ def register_binary_sensor(var, config):
CORE.add_job(setup_binary_sensor_core_, binary_sensor_var, config) CORE.add_job(setup_binary_sensor_core_, binary_sensor_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' BUILD_FLAGS = '-DUSE_BINARY_SENSOR'
CONF_BINARY_SENSOR_IS_ON = 'binary_sensor.is_on' CONF_BINARY_SENSOR_IS_ON = 'binary_sensor.is_on'

View File

@ -30,7 +30,3 @@ def to_code(config):
func = getattr(hub, DIRECTIONS[config[CONF_DIRECTION]]) func = getattr(hub, DIRECTIONS[config[CONF_DIRECTION]])
rhs = func(config[CONF_NAME]) rhs = func(config[CONF_NAME])
binary_sensor.register_binary_sensor(rhs, config) binary_sensor.register_binary_sensor(rhs, config)
def to_hass_config(data, config):
return binary_sensor.core_to_hass_config(data, config)

View File

@ -33,7 +33,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_CUSTOM_BINARY_SENSOR' BUILD_FLAGS = '-DUSE_CUSTOM_BINARY_SENSOR'
def to_hass_config(data, config):
return [binary_sensor.core_to_hass_config(data, sens) for sens in config[CONF_BINARY_SENSORS]]

View File

@ -23,7 +23,3 @@ def to_code(config):
yield yield
rhs = hub.make_presence_sensor(config[CONF_NAME], make_address_array(config[CONF_MAC_ADDRESS])) rhs = hub.make_presence_sensor(config[CONF_NAME], make_address_array(config[CONF_MAC_ADDRESS]))
binary_sensor.register_binary_sensor(rhs, config) binary_sensor.register_binary_sensor(rhs, config)
def to_hass_config(data, config):
return binary_sensor.core_to_hass_config(data, config)

View File

@ -56,7 +56,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_ESP32_TOUCH_BINARY_SENSOR' BUILD_FLAGS = '-DUSE_ESP32_TOUCH_BINARY_SENSOR'
def to_hass_config(data, config):
return binary_sensor.core_to_hass_config(data, config)

View File

@ -29,7 +29,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_GPIO_BINARY_SENSOR' BUILD_FLAGS = '-DUSE_GPIO_BINARY_SENSOR'
def to_hass_config(data, config):
return binary_sensor.core_to_hass_config(data, config)

View File

@ -24,7 +24,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_HOMEASSISTANT_BINARY_SENSOR' BUILD_FLAGS = '-DUSE_HOMEASSISTANT_BINARY_SENSOR'
def to_hass_config(data, config):
return binary_sensor.core_to_hass_config(data, config)

View File

@ -22,7 +22,3 @@ def to_code(config):
yield yield
rhs = MPR121Channel.new(config[CONF_NAME], config[CONF_CHANNEL]) rhs = MPR121Channel.new(config[CONF_NAME], config[CONF_CHANNEL])
binary_sensor.register_binary_sensor(hub.add_channel(rhs), config) binary_sensor.register_binary_sensor(hub.add_channel(rhs), config)
def to_hass_config(data, config):
return binary_sensor.core_to_hass_config(data, config)

View File

@ -27,7 +27,3 @@ def to_code(config):
rhs = hub.make_touch_component(config[CONF_NAME], config[CONF_PAGE_ID], rhs = hub.make_touch_component(config[CONF_NAME], config[CONF_PAGE_ID],
config[CONF_COMPONENT_ID]) config[CONF_COMPONENT_ID])
binary_sensor.register_binary_sensor(rhs, config) binary_sensor.register_binary_sensor(rhs, config)
def to_hass_config(data, config):
return binary_sensor.core_to_hass_config(data, config)

View File

@ -43,7 +43,3 @@ def to_code(config):
addr = [HexInt(int(x, 16)) for x in config[CONF_UID].split('-')] addr = [HexInt(int(x, 16)) for x in config[CONF_UID].split('-')]
rhs = hub.make_tag(config[CONF_NAME], addr) rhs = hub.make_tag(config[CONF_NAME], addr)
binary_sensor.register_binary_sensor(rhs, config) binary_sensor.register_binary_sensor(rhs, config)
def to_hass_config(data, config):
return binary_sensor.core_to_hass_config(data, config)

View File

@ -24,7 +24,3 @@ def to_code(config):
yield yield
rhs = hub.make_card(config[CONF_NAME], config[CONF_UID]) rhs = hub.make_card(config[CONF_NAME], config[CONF_UID])
binary_sensor.register_binary_sensor(rhs, config) binary_sensor.register_binary_sensor(rhs, config)
def to_hass_config(data, config):
return binary_sensor.core_to_hass_config(data, config)

View File

@ -145,7 +145,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_REMOTE_RECEIVER' BUILD_FLAGS = '-DUSE_REMOTE_RECEIVER'
def to_hass_config(data, config):
return binary_sensor.core_to_hass_config(data, config)

View File

@ -22,7 +22,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_STATUS_BINARY_SENSOR' BUILD_FLAGS = '-DUSE_STATUS_BINARY_SENSOR'
def to_hass_config(data, config):
return binary_sensor.core_to_hass_config(data, config)

View File

@ -54,7 +54,3 @@ def binary_sensor_template_publish_to_code(config, action_id, template_arg, args
yield None yield None
add(action.set_state(template_)) add(action.set_state(template_))
yield action yield action
def to_hass_config(data, config):
return binary_sensor.core_to_hass_config(data, config)

View File

@ -96,10 +96,3 @@ def cover_stop_to_code(config, action_id, template_arg, args):
rhs = var.make_stop_action(template_arg) rhs = var.make_stop_action(template_arg)
type = StopAction.template(template_arg) type = StopAction.template(template_arg)
yield Pvariable(action_id, rhs, type=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

View File

@ -77,12 +77,3 @@ def cover_template_publish_to_code(config, action_id, template_arg, args):
yield None yield None
add(action.set_state(template_)) add(action.set_state(template_))
yield action yield action
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

View File

@ -4,9 +4,9 @@ from esphome.automation import ACTION_REGISTRY, maybe_simple_id
from esphome.components import mqtt from esphome.components import mqtt
from esphome.components.mqtt import setup_mqtt_component from esphome.components.mqtt import setup_mqtt_component
import esphome.config_validation as cv import esphome.config_validation as cv
from esphome.const import CONF_ID, CONF_INTERNAL, CONF_MQTT_ID, CONF_NAME, CONF_OSCILLATING, \ from esphome.const import CONF_ID, CONF_INTERNAL, CONF_MQTT_ID, CONF_OSCILLATING, \
CONF_OSCILLATION_COMMAND_TOPIC, CONF_OSCILLATION_OUTPUT, CONF_OSCILLATION_STATE_TOPIC, \ CONF_OSCILLATION_COMMAND_TOPIC, CONF_OSCILLATION_STATE_TOPIC, CONF_SPEED, \
CONF_SPEED, CONF_SPEED_COMMAND_TOPIC, CONF_SPEED_STATE_TOPIC CONF_SPEED_COMMAND_TOPIC, CONF_SPEED_STATE_TOPIC
from esphome.core import CORE from esphome.core import CORE
from esphome.cpp_generator import Pvariable, add, get_variable, templatable from esphome.cpp_generator import Pvariable, add, get_variable, templatable
from esphome.cpp_types import Action, Application, Component, Nameable, bool_, esphome_ns from esphome.cpp_types import Action, Application, Component, Nameable, bool_, esphome_ns
@ -130,15 +130,3 @@ def fan_turn_on_to_code(config, action_id, template_arg, args):
template_ = FAN_SPEEDS[template_] template_ = FAN_SPEEDS[template_]
add(action.set_speed(template_)) add(action.set_speed(template_))
yield action 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

View File

@ -28,7 +28,3 @@ def to_code(config):
fan.setup_fan(fan_struct.Pstate, config) fan.setup_fan(fan_struct.Pstate, config)
setup_component(fan_struct.Poutput, config) setup_component(fan_struct.Poutput, config)
def to_hass_config(data, config):
return fan.core_to_hass_config(data, config)

View File

@ -1,6 +1,6 @@
import voluptuous as vol import voluptuous as vol
from esphome.components import fan, mqtt, output from esphome.components import fan, output
import esphome.config_validation as cv import esphome.config_validation as cv
from esphome.const import CONF_HIGH, CONF_LOW, CONF_MAKE_ID, CONF_MEDIUM, CONF_NAME, \ from esphome.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_OSCILLATION_OUTPUT, CONF_OUTPUT, CONF_SPEED, CONF_SPEED_COMMAND_TOPIC, \
@ -42,14 +42,3 @@ def to_code(config):
add(fan_struct.Poutput.set_oscillation(oscillation_output)) add(fan_struct.Poutput.set_oscillation(oscillation_output))
fan.setup_fan(fan_struct.Pstate, config) fan.setup_fan(fan_struct.Pstate, 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

View File

@ -499,24 +499,3 @@ def light_turn_on_to_code(config, action_id, template_arg, args):
yield None yield None
add(action.set_effect(template_)) add(action.set_effect(template_))
yield action 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)
if ret is None:
return None
ret['schema'] = 'json'
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

View File

@ -21,8 +21,3 @@ def to_code(config):
light_struct = variable(config[CONF_MAKE_ID], rhs) light_struct = variable(config[CONF_MAKE_ID], rhs)
light.setup_light(light_struct.Pstate, config) light.setup_light(light_struct.Pstate, config)
setup_component(light_struct.Pstate, config) setup_component(light_struct.Pstate, 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)

View File

@ -35,8 +35,3 @@ def to_code(config):
light_struct = variable(config[CONF_MAKE_ID], rhs) light_struct = variable(config[CONF_MAKE_ID], rhs)
light.setup_light(light_struct.Pstate, config) light.setup_light(light_struct.Pstate, config)
setup_component(light_struct.Pstate, config) setup_component(light_struct.Pstate, 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)

View File

@ -106,8 +106,3 @@ def to_code(config):
REQUIRED_BUILD_FLAGS = '-DUSE_FAST_LED_LIGHT' REQUIRED_BUILD_FLAGS = '-DUSE_FAST_LED_LIGHT'
LIB_DEPS = 'FastLED@3.2.0' LIB_DEPS = 'FastLED@3.2.0'
def to_hass_config(data, config):
return light.core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=False,
white_value=False)

View File

@ -86,8 +86,3 @@ def to_code(config):
REQUIRED_BUILD_FLAGS = '-DUSE_FAST_LED_LIGHT' REQUIRED_BUILD_FLAGS = '-DUSE_FAST_LED_LIGHT'
LIB_DEPS = 'FastLED@3.2.0' LIB_DEPS = 'FastLED@3.2.0'
def to_hass_config(data, config):
return light.core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=False,
white_value=False)

View File

@ -24,8 +24,3 @@ def to_code(config):
light_struct = variable(config[CONF_MAKE_ID], rhs) light_struct = variable(config[CONF_MAKE_ID], rhs)
light.setup_light(light_struct.Pstate, config) light.setup_light(light_struct.Pstate, config)
setup_component(light_struct.Pstate, config) setup_component(light_struct.Pstate, 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)

View File

@ -188,8 +188,3 @@ def to_code(config):
REQUIRED_BUILD_FLAGS = '-DUSE_NEO_PIXEL_BUS_LIGHT' REQUIRED_BUILD_FLAGS = '-DUSE_NEO_PIXEL_BUS_LIGHT'
LIB_DEPS = 'NeoPixelBus@2.4.1' LIB_DEPS = 'NeoPixelBus@2.4.1'
def to_hass_config(data, config):
return light.core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=False,
white_value='W' in config[CONF_TYPE])

View File

@ -46,7 +46,3 @@ def to_code(config):
rhs = App.make_partition_light(config[CONF_NAME], segments) rhs = App.make_partition_light(config[CONF_NAME], segments)
make = variable(config[CONF_MAKE_ID], rhs) make = variable(config[CONF_MAKE_ID], rhs)
light.setup_light(make.Pstate, config) light.setup_light(make.Pstate, config)
def to_hass_config(data, config):
return light.core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=False)

View File

@ -30,8 +30,3 @@ def to_code(config):
light_struct = variable(config[CONF_MAKE_ID], rhs) light_struct = variable(config[CONF_MAKE_ID], rhs)
light.setup_light(light_struct.Pstate, config) light.setup_light(light_struct.Pstate, config)
setup_component(light_struct.Pstate, config) setup_component(light_struct.Pstate, 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)

View File

@ -33,8 +33,3 @@ def to_code(config):
light_struct = variable(config[CONF_MAKE_ID], rhs) light_struct = variable(config[CONF_MAKE_ID], rhs)
light.setup_light(light_struct.Pstate, config) light.setup_light(light_struct.Pstate, config)
setup_component(light_struct.Pstate, config) setup_component(light_struct.Pstate, 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)

View File

@ -63,8 +63,3 @@ def to_code(config):
light_struct = variable(config[CONF_MAKE_ID], rhs) light_struct = variable(config[CONF_MAKE_ID], rhs)
light.setup_light(light_struct.Pstate, config) light.setup_light(light_struct.Pstate, config)
setup_component(light_struct.Pstate, config) setup_component(light_struct.Pstate, 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)

View File

@ -1,4 +1,3 @@
from collections import OrderedDict
import re import re
import voluptuous as vol import voluptuous as vol
@ -9,12 +8,11 @@ from esphome.components import logger
import esphome.config_validation as cv import esphome.config_validation as cv
from esphome.const import CONF_AVAILABILITY, CONF_BIRTH_MESSAGE, CONF_BROKER, CONF_CLIENT_ID, \ from esphome.const import CONF_AVAILABILITY, CONF_BIRTH_MESSAGE, CONF_BROKER, CONF_CLIENT_ID, \
CONF_COMMAND_TOPIC, CONF_DISCOVERY, CONF_DISCOVERY_PREFIX, CONF_DISCOVERY_RETAIN, \ CONF_COMMAND_TOPIC, CONF_DISCOVERY, CONF_DISCOVERY_PREFIX, CONF_DISCOVERY_RETAIN, \
CONF_ESPHOME, CONF_ID, CONF_INTERNAL, CONF_KEEPALIVE, CONF_LEVEL, CONF_LOG_TOPIC, \ CONF_ID, CONF_KEEPALIVE, CONF_LEVEL, CONF_LOG_TOPIC, CONF_ON_JSON_MESSAGE, CONF_ON_MESSAGE, \
CONF_MQTT, CONF_NAME, CONF_ON_JSON_MESSAGE, CONF_ON_MESSAGE, CONF_PASSWORD, CONF_PAYLOAD, \ CONF_PASSWORD, CONF_PAYLOAD, CONF_PAYLOAD_AVAILABLE, CONF_PAYLOAD_NOT_AVAILABLE, CONF_PORT, \
CONF_PAYLOAD_AVAILABLE, CONF_PAYLOAD_NOT_AVAILABLE, CONF_PORT, CONF_QOS, CONF_REBOOT_TIMEOUT, \ CONF_QOS, CONF_REBOOT_TIMEOUT, CONF_RETAIN, CONF_SHUTDOWN_MESSAGE, CONF_SSL_FINGERPRINTS, \
CONF_RETAIN, CONF_SHUTDOWN_MESSAGE, CONF_SSL_FINGERPRINTS, CONF_STATE_TOPIC, CONF_TOPIC, \ CONF_STATE_TOPIC, CONF_TOPIC, CONF_TOPIC_PREFIX, CONF_TRIGGER_ID, CONF_USERNAME, \
CONF_TOPIC_PREFIX, CONF_TRIGGER_ID, CONF_USERNAME, CONF_WILL_MESSAGE CONF_WILL_MESSAGE
from esphome.core import EsphomeError
from esphome.cpp_generator import Pvariable, RawExpression, StructInitializer, TemplateArguments, \ from esphome.cpp_generator import Pvariable, RawExpression, StructInitializer, TemplateArguments, \
add, get_variable, process_lambda, templatable add, get_variable, process_lambda, templatable
from esphome.cpp_types import Action, App, Component, JsonObjectConstRef, JsonObjectRef, \ from esphome.cpp_types import Action, App, Component, JsonObjectConstRef, JsonObjectRef, \
@ -273,61 +271,6 @@ def get_default_topic_for(data, component_type, name, suffix):
sanitized_name, suffix) sanitized_name, suffix)
def build_hass_config(data, component_type, config, include_state=True, include_command=True):
if config.get(CONF_INTERNAL, False):
return None
ret = OrderedDict()
ret['platform'] = 'mqtt'
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 EsphomeError("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_ESPHOME][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],
}
def setup_mqtt_component(obj, config): def setup_mqtt_component(obj, config):
if CONF_RETAIN in config: if CONF_RETAIN in config:
add(obj.set_retain(config[CONF_RETAIN])) add(obj.set_retain(config[CONF_RETAIN]))

View File

@ -273,21 +273,6 @@ def sensor_in_range_to_code(config, condition_id, template_arg, args):
yield cond yield cond
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
def _mean(xs): def _mean(xs):
return sum(xs) / len(xs) return sum(xs) / len(xs)

View File

@ -56,10 +56,6 @@ def required_build_flags(config):
return None return None
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)
def includes(config): def includes(config):
if config[CONF_PIN] == 'VCC': if config[CONF_PIN] == 'VCC':
return 'ADC_MODE(ADC_VCC);' return 'ADC_MODE(ADC_VCC);'

View File

@ -70,7 +70,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_ADS1115_SENSOR' BUILD_FLAGS = '-DUSE_ADS1115_SENSOR'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -29,7 +29,3 @@ def to_code(config):
func = getattr(hub, TYPES[config[CONF_TYPE]]) func = getattr(hub, TYPES[config[CONF_TYPE]])
rhs = func(config[CONF_NAME]) rhs = func(config[CONF_NAME])
sensor.register_sensor(rhs, config) sensor.register_sensor(rhs, config)
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -39,7 +39,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_BH1750' BUILD_FLAGS = '-DUSE_BH1750'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -24,7 +24,3 @@ def to_code(config):
yield yield
rhs = hub.make_rssi_sensor(config[CONF_NAME], make_address_array(config[CONF_MAC_ADDRESS])) rhs = hub.make_rssi_sensor(config[CONF_NAME], make_address_array(config[CONF_MAC_ADDRESS]))
sensor.register_sensor(rhs, config) sensor.register_sensor(rhs, config)
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -85,9 +85,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_BME280' 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])]

View File

@ -108,10 +108,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_BME680' 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])]

View File

@ -43,8 +43,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_BMP085_SENSOR' 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])]

View File

@ -75,8 +75,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_BMP280' 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])]

View File

@ -57,11 +57,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_CSE7766' 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

View File

@ -31,7 +31,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_CUSTOM_SENSOR' BUILD_FLAGS = '-DUSE_CUSTOM_SENSOR'
def to_hass_config(data, config):
return [sensor.core_to_hass_config(data, sens) for sens in config[CONF_SENSORS]]

View File

@ -32,7 +32,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_DALLAS_SENSOR' BUILD_FLAGS = '-DUSE_DALLAS_SENSOR'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -57,8 +57,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_DHT_SENSOR' 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])]

View File

@ -40,8 +40,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_DHT12_SENSOR' 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])]

View File

@ -29,7 +29,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_DUTY_CYCLE_SENSOR' BUILD_FLAGS = '-DUSE_DUTY_CYCLE_SENSOR'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -26,7 +26,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_ESP32_HALL_SENSOR' BUILD_FLAGS = '-DUSE_ESP32_HALL_SENSOR'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -40,8 +40,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_HDC1080_SENSOR' 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])]

View File

@ -66,11 +66,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_HLW8012' 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

View File

@ -87,11 +87,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_HMC5883L' 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

View File

@ -23,7 +23,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_HOMEASSISTANT_SENSOR' BUILD_FLAGS = '-DUSE_HOMEASSISTANT_SENSOR'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -41,8 +41,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_HTU21D_SENSOR' 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])]

View File

@ -47,7 +47,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_HX711' BUILD_FLAGS = '-DUSE_HX711'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -66,11 +66,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_INA219' 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

View File

@ -77,15 +77,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_INA3221' 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

View File

@ -33,7 +33,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_MAX31855_SENSOR' BUILD_FLAGS = '-DUSE_MAX31855_SENSOR'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -34,7 +34,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_MAX6675_SENSOR' BUILD_FLAGS = '-DUSE_MAX6675_SENSOR'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -45,11 +45,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_MHZ19' 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

View File

@ -90,12 +90,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_MPU6050' 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

View File

@ -30,7 +30,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_MQTT_SUBSCRIBE_SENSOR' BUILD_FLAGS = '-DUSE_MQTT_SUBSCRIBE_SENSOR'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -44,8 +44,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_MS5611' 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])]

View File

@ -95,12 +95,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_PMSX003' 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

View File

@ -76,7 +76,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_PULSE_COUNTER_SENSOR' BUILD_FLAGS = '-DUSE_PULSE_COUNTER_SENSOR'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -70,7 +70,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_ROTARY_ENCODER_SENSOR' BUILD_FLAGS = '-DUSE_ROTARY_ENCODER_SENSOR'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -68,11 +68,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_SDS011' BUILD_FLAGS = '-DUSE_SDS011'
def to_hass_config(data, config):
ret = []
for key in (CONF_PM_2_5, CONF_PM_10_0):
if key in config:
ret.append(sensor.core_to_hass_config(data, config[key]))
return ret

View File

@ -42,8 +42,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_SHT3XD' 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])]

View File

@ -102,12 +102,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_TCS34725' 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

View File

@ -52,7 +52,3 @@ def sensor_template_publish_to_code(config, action_id, template_arg, args):
yield None yield None
add(action.set_state(template_)) add(action.set_state(template_))
yield action yield action
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -32,7 +32,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_TOTAL_DAILY_ENERGY_SENSOR' BUILD_FLAGS = '-DUSE_TOTAL_DAILY_ENERGY_SENSOR'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -63,7 +63,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_TSL2561' BUILD_FLAGS = '-DUSE_TSL2561'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -52,7 +52,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_ULTRASONIC_SENSOR' BUILD_FLAGS = '-DUSE_ULTRASONIC_SENSOR'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -24,7 +24,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_UPTIME_SENSOR' BUILD_FLAGS = '-DUSE_UPTIME_SENSOR'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -24,7 +24,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_WIFI_SIGNAL_SENSOR' BUILD_FLAGS = '-DUSE_WIFI_SIGNAL_SENSOR'
def to_hass_config(data, config):
return sensor.core_to_hass_config(data, config)

View File

@ -42,12 +42,3 @@ def to_code(config):
if CONF_BATTERY_LEVEL in config: if CONF_BATTERY_LEVEL in config:
conf = config[CONF_BATTERY_LEVEL] conf = config[CONF_BATTERY_LEVEL]
sensor.register_sensor(dev.Pmake_battery_level_sensor(conf[CONF_NAME]), conf) 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

View File

@ -34,11 +34,3 @@ def to_code(config):
if CONF_BATTERY_LEVEL in config: if CONF_BATTERY_LEVEL in config:
conf = config[CONF_BATTERY_LEVEL] conf = config[CONF_BATTERY_LEVEL]
sensor.register_sensor(dev.Pmake_battery_level_sensor(conf[CONF_NAME]), conf) 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

View File

@ -6,7 +6,7 @@ from esphome.components import mqtt
from esphome.components.mqtt import setup_mqtt_component from esphome.components.mqtt import setup_mqtt_component
import esphome.config_validation as cv import esphome.config_validation as cv
from esphome.const import CONF_ICON, CONF_ID, CONF_INTERNAL, CONF_INVERTED, CONF_MQTT_ID, \ from esphome.const import CONF_ICON, CONF_ID, CONF_INTERNAL, CONF_INVERTED, CONF_MQTT_ID, \
CONF_ON_TURN_OFF, CONF_ON_TURN_ON, CONF_OPTIMISTIC, CONF_TRIGGER_ID CONF_ON_TURN_OFF, CONF_ON_TURN_ON, CONF_TRIGGER_ID
from esphome.core import CORE from esphome.core import CORE
from esphome.cpp_generator import Pvariable, add, get_variable from esphome.cpp_generator import Pvariable, add, get_variable
from esphome.cpp_types import Action, App, Nameable, Trigger, esphome_ns from esphome.cpp_types import Action, App, Nameable, Trigger, esphome_ns
@ -149,14 +149,3 @@ def switch_is_off_to_code(config, condition_id, template_arg, args):
rhs = var.make_switch_is_off_condition(template_arg) rhs = var.make_switch_is_off_condition(template_arg)
type = SwitchCondition.template(template_arg) type = SwitchCondition.template(template_arg)
yield Pvariable(condition_id, rhs, type=type) yield Pvariable(condition_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

View File

@ -32,7 +32,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_CUSTOM_SWITCH' BUILD_FLAGS = '-DUSE_CUSTOM_SWITCH'
def to_hass_config(data, config):
return [switch.core_to_hass_config(data, swi) for swi in config[CONF_SWITCHES]]

View File

@ -48,7 +48,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_GPIO_SWITCH' BUILD_FLAGS = '-DUSE_GPIO_SWITCH'
def to_hass_config(data, config):
return switch.core_to_hass_config(data, config)

View File

@ -26,7 +26,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_OUTPUT_SWITCH' BUILD_FLAGS = '-DUSE_OUTPUT_SWITCH'
def to_hass_config(data, config):
return switch.core_to_hass_config(data, config)

View File

@ -164,7 +164,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_REMOTE_TRANSMITTER' BUILD_FLAGS = '-DUSE_REMOTE_TRANSMITTER'
def to_hass_config(data, config):
return switch.core_to_hass_config(data, config)

View File

@ -21,7 +21,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_RESTART_SWITCH' BUILD_FLAGS = '-DUSE_RESTART_SWITCH'
def to_hass_config(data, config):
return switch.core_to_hass_config(data, config)

View File

@ -21,7 +21,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_SHUTDOWN_SWITCH' BUILD_FLAGS = '-DUSE_SHUTDOWN_SWITCH'
def to_hass_config(data, config):
return switch.core_to_hass_config(data, config)

View File

@ -72,7 +72,3 @@ def switch_template_publish_to_code(config, action_id, template_arg, args):
yield None yield None
add(action.set_state(template_)) add(action.set_state(template_))
yield action yield action
def to_hass_config(data, config):
return switch.core_to_hass_config(data, config)

View File

@ -44,7 +44,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_UART_SWITCH' BUILD_FLAGS = '-DUSE_UART_SWITCH'
def to_hass_config(data, config):
return switch.core_to_hass_config(data, config)

View File

@ -63,12 +63,3 @@ def register_text_sensor(var, config):
BUILD_FLAGS = '-DUSE_TEXT_SENSOR' 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

View File

@ -32,7 +32,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_CUSTOM_TEXT_SENSOR' BUILD_FLAGS = '-DUSE_CUSTOM_TEXT_SENSOR'
def to_hass_config(data, config):
return [text_sensor.core_to_hass_config(data, sens) for sens in config[CONF_TEXT_SENSORS]]

View File

@ -24,7 +24,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_HOMEASSISTANT_TEXT_SENSOR' BUILD_FLAGS = '-DUSE_HOMEASSISTANT_TEXT_SENSOR'
def to_hass_config(data, config):
return text_sensor.core_to_hass_config(data, config)

View File

@ -31,7 +31,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_MQTT_SUBSCRIBE_TEXT_SENSOR' BUILD_FLAGS = '-DUSE_MQTT_SUBSCRIBE_TEXT_SENSOR'
def to_hass_config(data, config):
return text_sensor.core_to_hass_config(data, config)

View File

@ -53,7 +53,3 @@ def text_sensor_template_publish_to_code(config, action_id, template_arg, args):
yield None yield None
add(action.set_state(template_)) add(action.set_state(template_))
yield action yield action
def to_hass_config(data, config):
return text_sensor.core_to_hass_config(data, config)

View File

@ -21,7 +21,3 @@ def to_code(config):
BUILD_FLAGS = '-DUSE_VERSION_TEXT_SENSOR' BUILD_FLAGS = '-DUSE_VERSION_TEXT_SENSOR'
def to_hass_config(data, config):
return text_sensor.core_to_hass_config(data, config)

View File

@ -3,11 +3,13 @@ from __future__ import print_function
import codecs import codecs
import collections import collections
import hashlib
import hmac import hmac
import json import json
import logging import logging
import multiprocessing import multiprocessing
import os import os
import shutil
import subprocess import subprocess
import threading import threading
@ -28,7 +30,7 @@ from esphome.__main__ import get_serial_ports
from esphome.helpers import mkdir_p, get_bool_env, run_system_command from esphome.helpers import mkdir_p, get_bool_env, run_system_command
from esphome.py_compat import IS_PY2 from esphome.py_compat import IS_PY2
from esphome.storage_json import EsphomeStorageJSON, StorageJSON, \ from esphome.storage_json import EsphomeStorageJSON, StorageJSON, \
esphome_storage_path, ext_storage_path esphome_storage_path, ext_storage_path, trash_storage_path
from esphome.util import shlex_quote from esphome.util import shlex_quote
# pylint: disable=unused-import, wrong-import-order # pylint: disable=unused-import, wrong-import-order
@ -64,6 +66,27 @@ def template_args():
} }
def authenticated(func):
def decorator(self, *args, **kwargs):
if not self.is_authenticated():
self.redirect(RELATIVE_URL + 'login')
return None
return func(self, *args, **kwargs)
return decorator
def bind_config(func):
def decorator(self, *args, **kwargs):
configuration = self.get_argument('configuration')
if not is_allowed(configuration):
self.set_status(500)
return None
kwargs = kwargs.copy()
kwargs['configuration'] = configuration
return func(self, *args, **kwargs)
return decorator
# pylint: disable=abstract-method # pylint: disable=abstract-method
class BaseHandler(tornado.web.RequestHandler): class BaseHandler(tornado.web.RequestHandler):
def is_authenticated(self): def is_authenticated(self):
@ -178,10 +201,8 @@ class EsphomeHassConfigHandler(EsphomeCommandWebSocket):
class SerialPortRequestHandler(BaseHandler): class SerialPortRequestHandler(BaseHandler):
@authenticated
def get(self): def get(self):
if not self.is_authenticated():
self.redirect(RELATIVE_URL + 'login')
return
ports = get_serial_ports() ports = get_serial_ports()
data = [] data = []
for port, desc in ports: for port, desc in ports:
@ -198,12 +219,10 @@ class SerialPortRequestHandler(BaseHandler):
class WizardRequestHandler(BaseHandler): class WizardRequestHandler(BaseHandler):
@authenticated
def post(self): def post(self):
from esphome import wizard from esphome import wizard
if not self.is_authenticated():
self.redirect(RELATIVE_URL + 'login')
return
kwargs = {k: ''.join(v) for k, v in self.request.arguments.items()} kwargs = {k: ''.join(v) for k, v in self.request.arguments.items()}
destination = os.path.join(CONFIG_DIR, kwargs['name'] + '.yaml') destination = os.path.join(CONFIG_DIR, kwargs['name'] + '.yaml')
wizard.wizard_write(path=destination, **kwargs) wizard.wizard_write(path=destination, **kwargs)
@ -211,13 +230,10 @@ class WizardRequestHandler(BaseHandler):
class DownloadBinaryRequestHandler(BaseHandler): class DownloadBinaryRequestHandler(BaseHandler):
def get(self): @authenticated
if not self.is_authenticated(): @bind_config
self.redirect(RELATIVE_URL + 'login') def get(self, configuration=None):
return
# pylint: disable=no-value-for-parameter # pylint: disable=no-value-for-parameter
configuration = self.get_argument('configuration')
storage_path = ext_storage_path(CONFIG_DIR, configuration) storage_path = ext_storage_path(CONFIG_DIR, configuration)
storage_json = StorageJSON.load(storage_path) storage_json = StorageJSON.load(storage_path)
if storage_json is None: if storage_json is None:
@ -315,11 +331,8 @@ class DashboardEntry(object):
class MainRequestHandler(BaseHandler): class MainRequestHandler(BaseHandler):
@authenticated
def get(self): def get(self):
if not self.is_authenticated():
self.redirect(RELATIVE_URL + 'login')
return
begin = bool(self.get_argument('begin', False)) begin = bool(self.get_argument('begin', False))
entries = _list_dashboard_entries() entries = _list_dashboard_entries()
@ -400,11 +413,8 @@ class PingStatusThread(threading.Thread):
class PingRequestHandler(BaseHandler): class PingRequestHandler(BaseHandler):
@authenticated
def get(self): def get(self):
if not self.is_authenticated():
self.redirect(RELATIVE_URL + 'login')
return
PING_REQUEST.set() PING_REQUEST.set()
self.write(json.dumps(PING_RESULT)) self.write(json.dumps(PING_RESULT))
@ -414,34 +424,52 @@ def is_allowed(configuration):
class EditRequestHandler(BaseHandler): class EditRequestHandler(BaseHandler):
def get(self): @authenticated
if not self.is_authenticated(): @bind_config
self.redirect(RELATIVE_URL + 'login') def get(self, configuration=None):
return
# pylint: disable=no-value-for-parameter # pylint: disable=no-value-for-parameter
configuration = self.get_argument('configuration')
if not is_allowed(configuration):
self.set_status(401)
return
with open(os.path.join(CONFIG_DIR, configuration), 'r') as f: with open(os.path.join(CONFIG_DIR, configuration), 'r') as f:
content = f.read() content = f.read()
self.write(content) self.write(content)
def post(self): @authenticated
if not self.is_authenticated(): @bind_config
self.redirect(RELATIVE_URL + 'login') def post(self, configuration=None):
return
# pylint: disable=no-value-for-parameter # pylint: disable=no-value-for-parameter
configuration = self.get_argument('configuration')
if not is_allowed(configuration):
self.set_status(401)
return
with open(os.path.join(CONFIG_DIR, configuration), 'wb') as f: with open(os.path.join(CONFIG_DIR, configuration), 'wb') as f:
f.write(self.request.body) f.write(self.request.body)
self.set_status(200) self.set_status(200)
return
class DeleteRequestHandler(BaseHandler):
@authenticated
@bind_config
def post(self, configuration=None):
config_file = os.path.join(CONFIG_DIR, configuration)
storage_path = ext_storage_path(CONFIG_DIR, configuration)
storage_json = StorageJSON.load(storage_path)
if storage_json is None:
self.set_status(500)
return
name = storage_json.name
trash_path = trash_storage_path(CONFIG_DIR)
mkdir_p(trash_path)
shutil.move(config_file, os.path.join(trash_path, configuration))
# Delete build folder (if exists)
build_folder = os.path.join(CONFIG_DIR, name)
if build_folder is not None:
shutil.rmtree(build_folder, os.path.join(trash_path, name))
class UndoDeleteRequestHandler(BaseHandler):
@authenticated
@bind_config
def post(self, configuration=None):
config_file = os.path.join(CONFIG_DIR, configuration)
trash_path = trash_storage_path(CONFIG_DIR)
shutil.move(os.path.join(trash_path, configuration), config_file)
PING_RESULT = {} # type: dict PING_RESULT = {} # type: dict
@ -511,9 +539,9 @@ def get_static_file_url(name):
else: else:
path = os.path.join(static_path, name) path = os.path.join(static_path, name)
with open(path, 'rb') as f_handle: with open(path, 'rb') as f_handle:
hash_ = hash(f_handle.read()) & (2**32-1) hash_ = hashlib.md5(f_handle.read()).hexdigest()[:8]
_STATIC_FILE_HASHES[name] = hash_ _STATIC_FILE_HASHES[name] = hash_
return RELATIVE_URL + u'static/{}?hash={:08X}'.format(name, hash_) return RELATIVE_URL + u'static/{}?hash={}'.format(name, hash_)
def make_app(debug=False): def make_app(debug=False):
@ -561,6 +589,8 @@ def make_app(debug=False):
(RELATIVE_URL + "download.bin", DownloadBinaryRequestHandler), (RELATIVE_URL + "download.bin", DownloadBinaryRequestHandler),
(RELATIVE_URL + "serial-ports", SerialPortRequestHandler), (RELATIVE_URL + "serial-ports", SerialPortRequestHandler),
(RELATIVE_URL + "ping", PingRequestHandler), (RELATIVE_URL + "ping", PingRequestHandler),
(RELATIVE_URL + "delete", DeleteRequestHandler),
(RELATIVE_URL + "undo-delete", UndoDeleteRequestHandler),
(RELATIVE_URL + "wizard.html", WizardRequestHandler), (RELATIVE_URL + "wizard.html", WizardRequestHandler),
(RELATIVE_URL + r"static/(.*)", StaticFileHandler, {'path': static_path}), (RELATIVE_URL + r"static/(.*)", StaticFileHandler, {'path': static_path}),
], **settings) ], **settings)

View File

@ -590,51 +590,30 @@ document.querySelectorAll(".action-clean").forEach((btn) => {
}); });
}); });
const hassConfigModalElem = document.getElementById("modal-hass-config"); document.querySelectorAll(".action-delete").forEach((btn) => {
document.querySelectorAll(".action-hass-config").forEach((btn) => {
btn.addEventListener('click', (e) => { btn.addEventListener('click', (e) => {
configuration = e.target.getAttribute('data-node'); configuration = e.target.getAttribute('data-node');
const modalInstance = M.Modal.getInstance(hassConfigModalElem);
const log = hassConfigModalElem.querySelector(".log");
log.innerHTML = "";
const colorState = initializeColorState();
const stopLogsButton = hassConfigModalElem.querySelector(".stop-logs");
let stopped = false;
stopLogsButton.innerHTML = "Stop";
modalInstance.open();
const filenameField = hassConfigModalElem.querySelector('.filename'); fetch(`${relative_url}delete?configuration=${configuration}`, {
filenameField.innerHTML = configuration; credentials: "same-origin",
method: "POST",
}).then(res => res.text()).then(() => {
const toastHtml = `<span>Deleted <code class="inlinecode">${configuration}</code>
<button class="btn-flat toast-action">Undo</button></button>`;
const toast = M.toast({html: toastHtml});
const undoButton = toast.el.querySelector('.toast-action');
const logSocket = new WebSocket(wsUrl + "hass-config"); document.querySelector(`.entry-row[data-node="${configuration}"]`).remove();
logSocket.addEventListener('message', (event) => {
const data = JSON.parse(event.data); undoButton.addEventListener('click', () => {
if (data.event === "line") { fetch(`${relative_url}undo-delete?configuration=${configuration}`, {
colorReplace(log, colorState, data.data); credentials: "same-origin",
} else if (data.event === "exit") { method: "POST",
if (data.code === 0) { }).then(res => res.text()).then(() => {
M.toast({html: "Program exited successfully."}); window.location.reload(false);
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();
};
}); });
}); });

View File

@ -58,7 +58,7 @@
<main> <main>
<div class="container"> <div class="container">
{% for i, entry in enumerate(entries) %} {% for i, entry in enumerate(entries) %}
<div class="row"> <div class="row entry-row" data-node="{{ entry.filename }}">
<div class="col s12 m10 offset-m1 l12"> <div class="col s12 m10 offset-m1 l12">
<div class="card horizontal"> <div class="card horizontal">
<div class="card-image center-align hide-on-small-only"> <div class="card-image center-align hide-on-small-only">
@ -93,7 +93,7 @@
<li><a class="action-clean-mqtt" data-node="{{ entry.filename }}">Clean MQTT</a></li> <li><a class="action-clean-mqtt" data-node="{{ entry.filename }}">Clean MQTT</a></li>
<li><a class="action-clean" data-node="{{ entry.filename }}">Clean Build</a></li> <li><a class="action-clean" data-node="{{ entry.filename }}">Clean Build</a></li>
<li><a class="action-compile" data-node="{{ entry.filename }}">Compile</a></li> <li><a class="action-compile" data-node="{{ entry.filename }}">Compile</a></li>
<li><a class="action-hass-config" data-node="{{ entry.filename }}">HASS MQTT Configuration</a></li> <li><a class="action-delete" data-node="{{ entry.filename }}">Delete</a></li>
</ul> </ul>
</div> </div>
</div> </div>
@ -422,16 +422,6 @@
</div> </div>
</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>
<pre class="log"></pre>
</div>
<div class="modal-footer">
<a class="modal-close waves-effect waves-green btn-flat stop-logs">Stop</a>
</div>
</div>
<div id="modal-editor" class="modal modal-fixed-footer"> <div id="modal-editor" class="modal modal-fixed-footer">
<div class="modal-content"> <div class="modal-content">
<h4>Edit <code class="inlinecode filename"></code></h4> <h4>Edit <code class="inlinecode filename"></code></h4>

View File

@ -29,6 +29,10 @@ def esphome_storage_path(base_path): # type: (str) -> str
return os.path.join(base_path, '.esphome', 'esphome.json') return os.path.join(base_path, '.esphome', 'esphome.json')
def trash_storage_path(base_path): # type: (str) -> str
return os.path.join(base_path, '.esphome', 'trash')
# pylint: disable=too-many-instance-attributes # pylint: disable=too-many-instance-attributes
class StorageJSON(object): class StorageJSON(object):
def __init__(self, storage_version, name, esphome_core_version, esphome_version, def __init__(self, storage_version, name, esphome_core_version, esphome_version,

View File

@ -1,8 +0,0 @@
# Esphomeyaml Hass.io Add-On
[![esphomeyaml logo](https://raw.githubusercontent.com/OttoWinter/esphomeyaml/dev/esphomeyaml-edge/logo.png)](https://esphomelib.com/esphomeyaml/index.html)
# This Add-On has moved!
See https://esphome.io/changelog/v1.11.0.html#installation-methods-changed
for updated instructions

Some files were not shown because too many files have changed in this diff Show More