mirror of
https://github.com/esphome/esphome.git
synced 2024-11-25 08:28:12 +01:00
Add generate home assistant config command (#208)
* Add generate home assistant config command * Lint * Lint
This commit is contained in:
parent
36da3b85d5
commit
27b86d89b0
80 changed files with 625 additions and 5 deletions
|
@ -1,6 +1,7 @@
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
|
from collections import OrderedDict
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import random
|
import random
|
||||||
|
@ -334,6 +335,28 @@ def command_clean(args, config):
|
||||||
return 0
|
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):
|
def command_dashboard(args):
|
||||||
from esphomeyaml.dashboard import dashboard
|
from esphomeyaml.dashboard import dashboard
|
||||||
|
|
||||||
|
@ -355,6 +378,7 @@ 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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -436,6 +460,9 @@ def parse_args(argv):
|
||||||
dashboard.add_argument("--open-ui", help="Open the dashboard UI in a browser.",
|
dashboard.add_argument("--open-ui", help="Open the dashboard UI in a browser.",
|
||||||
action='store_true')
|
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:])
|
return parser.parse_args(argv[1:])
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
|
from esphomeyaml.components import mqtt
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import automation
|
from esphomeyaml import automation
|
||||||
from esphomeyaml.const import CONF_DEVICE_CLASS, CONF_ID, CONF_INTERNAL, CONF_INVERTED, \
|
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)
|
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'
|
BUILD_FLAGS = '-DUSE_BINARY_SENSOR'
|
||||||
|
|
|
@ -21,3 +21,7 @@ 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)
|
||||||
|
|
|
@ -51,3 +51,7 @@ 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)
|
||||||
|
|
|
@ -24,3 +24,7 @@ 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)
|
||||||
|
|
|
@ -24,3 +24,7 @@ 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)
|
||||||
|
|
|
@ -40,3 +40,7 @@ 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], ArrayInitializer(*addr, multiline=False))
|
rhs = hub.make_tag(config[CONF_NAME], ArrayInitializer(*addr, multiline=False))
|
||||||
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)
|
||||||
|
|
|
@ -21,3 +21,7 @@ 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)
|
||||||
|
|
|
@ -119,3 +119,7 @@ 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)
|
||||||
|
|
|
@ -19,3 +19,7 @@ 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)
|
||||||
|
|
|
@ -26,3 +26,7 @@ def to_code(config):
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_TEMPLATE_BINARY_SENSOR'
|
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
|
import voluptuous as vol
|
||||||
|
|
||||||
from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY
|
from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY
|
||||||
|
from esphomeyaml.components import mqtt
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.const import CONF_ID, CONF_MQTT_ID, CONF_INTERNAL
|
from esphomeyaml.const import CONF_ID, CONF_MQTT_ID, CONF_INTERNAL
|
||||||
from esphomeyaml.helpers import Pvariable, esphomelib_ns, setup_mqtt_component, add, \
|
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)
|
rhs = var.make_stop_action(template_arg)
|
||||||
type = StopAction.template(arg_type)
|
type = StopAction.template(arg_type)
|
||||||
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
|
||||||
|
|
|
@ -45,3 +45,12 @@ def to_code(config):
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_TEMPLATE_COVER'
|
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
|
import voluptuous as vol
|
||||||
|
|
||||||
from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY
|
from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY
|
||||||
|
from esphomeyaml.components import mqtt
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.const import CONF_ID, CONF_MQTT_ID, CONF_OSCILLATION_COMMAND_TOPIC, \
|
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_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, \
|
from esphomeyaml.helpers import Application, Pvariable, add, esphomelib_ns, setup_mqtt_component, \
|
||||||
TemplateArguments, get_variable, templatable, bool_
|
TemplateArguments, get_variable, templatable, bool_
|
||||||
|
|
||||||
|
@ -128,3 +129,15 @@ def fan_turn_on_to_code(config, action_id, arg_type):
|
||||||
yield None
|
yield None
|
||||||
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
|
||||||
|
|
|
@ -27,3 +27,7 @@ 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, fan_struct.Pmqtt, config)
|
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 voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
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, \
|
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_OSCILLATION_OUTPUT, CONF_OUTPUT, CONF_SPEED, CONF_SPEED_COMMAND_TOPIC, \
|
||||||
CONF_SPEED_STATE_TOPIC
|
CONF_SPEED_STATE_TOPIC
|
||||||
|
@ -43,3 +43,14 @@ 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, fan_struct.Pmqtt, config)
|
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
|
import voluptuous as vol
|
||||||
|
|
||||||
from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY
|
from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY
|
||||||
|
from esphomeyaml.components import mqtt
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.const import CONF_ALPHA, CONF_BLUE, CONF_BRIGHTNESS, CONF_COLORS, \
|
from esphomeyaml.const import CONF_ALPHA, CONF_BLUE, CONF_BRIGHTNESS, CONF_COLORS, \
|
||||||
CONF_DEFAULT_TRANSITION_LENGTH, CONF_DURATION, CONF_EFFECTS, CONF_EFFECT_ID, \
|
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
|
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,
|
||||||
|
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)
|
rhs = App.make_binary_light(config[CONF_NAME], output)
|
||||||
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
||||||
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
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)
|
cold_white, warm_white)
|
||||||
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
||||||
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
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'
|
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'
|
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)
|
rhs = App.make_monochromatic_light(config[CONF_NAME], output)
|
||||||
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
||||||
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
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)
|
rhs = App.make_rgb_light(config[CONF_NAME], red, green, blue)
|
||||||
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
||||||
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
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)
|
rhs = App.make_rgbw_light(config[CONF_NAME], red, green, blue, white)
|
||||||
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
||||||
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
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)
|
red, green, blue, cold_white, warm_white)
|
||||||
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
||||||
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
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 re
|
||||||
|
|
||||||
import voluptuous as vol
|
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_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_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_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, \
|
from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, RawExpression, \
|
||||||
StructInitializer, TemplateArguments, add, esphomelib_ns, optional, std_string, templatable, \
|
StructInitializer, TemplateArguments, add, esphomelib_ns, optional, std_string, templatable, \
|
||||||
uint8, bool_, JsonObjectRef, process_lambda, JsonObjectConstRef
|
uint8, bool_, JsonObjectRef, process_lambda, JsonObjectConstRef
|
||||||
|
@ -239,3 +243,66 @@ def required_build_flags(config):
|
||||||
if CONF_SSL_FINGERPRINTS in config:
|
if CONF_SSL_FINGERPRINTS in config:
|
||||||
return '-DASYNC_TCP_SSL_ENABLED=1'
|
return '-DASYNC_TCP_SSL_ENABLED=1'
|
||||||
return None
|
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
|
import voluptuous as vol
|
||||||
|
|
||||||
|
from esphomeyaml.components import mqtt
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import automation
|
from esphomeyaml import automation
|
||||||
from esphomeyaml.const import CONF_ABOVE, CONF_ACCURACY_DECIMALS, CONF_ALPHA, CONF_BELOW, \
|
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'
|
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':
|
if config[CONF_PIN] == 'VCC':
|
||||||
return '-DUSE_ADC_SENSOR_VCC'
|
return '-DUSE_ADC_SENSOR_VCC'
|
||||||
return None
|
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'
|
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'
|
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
|
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)
|
||||||
|
|
|
@ -72,3 +72,9 @@ 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])]
|
||||||
|
|
|
@ -92,3 +92,10 @@ 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])]
|
||||||
|
|
|
@ -34,3 +34,8 @@ 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])]
|
||||||
|
|
|
@ -65,3 +65,8 @@ 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])]
|
||||||
|
|
|
@ -40,3 +40,11 @@ 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
|
||||||
|
|
|
@ -29,3 +29,7 @@ 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)
|
||||||
|
|
|
@ -46,3 +46,8 @@ 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])]
|
||||||
|
|
|
@ -31,3 +31,8 @@ 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])]
|
||||||
|
|
|
@ -26,3 +26,7 @@ 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)
|
||||||
|
|
|
@ -22,3 +22,7 @@ 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)
|
||||||
|
|
|
@ -32,3 +32,8 @@ 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])]
|
||||||
|
|
|
@ -55,3 +55,11 @@ 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
|
||||||
|
|
|
@ -71,3 +71,11 @@ 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
|
||||||
|
|
|
@ -30,3 +30,8 @@ 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])]
|
||||||
|
|
|
@ -44,3 +44,7 @@ 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)
|
||||||
|
|
|
@ -51,3 +51,11 @@ 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
|
||||||
|
|
|
@ -62,3 +62,15 @@ 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
|
||||||
|
|
|
@ -32,3 +32,7 @@ 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)
|
||||||
|
|
|
@ -36,3 +36,11 @@ 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
|
||||||
|
|
|
@ -69,3 +69,12 @@ 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
|
||||||
|
|
|
@ -27,3 +27,7 @@ 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)
|
||||||
|
|
|
@ -35,3 +35,8 @@ 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])]
|
||||||
|
|
|
@ -85,3 +85,12 @@ 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
|
||||||
|
|
|
@ -65,3 +65,7 @@ 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)
|
||||||
|
|
|
@ -49,3 +49,7 @@ 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)
|
||||||
|
|
|
@ -36,3 +36,8 @@ 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])]
|
||||||
|
|
|
@ -78,3 +78,12 @@ 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
|
||||||
|
|
|
@ -27,3 +27,7 @@ def to_code(config):
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_TEMPLATE_SENSOR'
|
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'
|
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'
|
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'
|
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'
|
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:
|
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
|
||||||
|
|
|
@ -37,3 +37,11 @@ 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
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY
|
from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY
|
||||||
|
from esphomeyaml.components import mqtt
|
||||||
import esphomeyaml.config_validation as cv
|
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, \
|
from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, setup_mqtt_component, \
|
||||||
TemplateArguments, get_variable
|
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)
|
rhs = var.make_turn_on_action(template_arg)
|
||||||
type = TurnOnAction.template(arg_type)
|
type = TurnOnAction.template(arg_type)
|
||||||
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, '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'
|
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'
|
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'
|
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'
|
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'
|
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'
|
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'
|
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
|
import voluptuous as vol
|
||||||
|
|
||||||
from esphomeyaml import automation
|
from esphomeyaml import automation
|
||||||
|
from esphomeyaml.components import mqtt
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.const import CONF_ICON, CONF_ID, CONF_INTERNAL, CONF_MQTT_ID, CONF_ON_VALUE, \
|
from esphomeyaml.const import CONF_ICON, CONF_ID, CONF_INTERNAL, CONF_MQTT_ID, CONF_ON_VALUE, \
|
||||||
CONF_TRIGGER_ID
|
CONF_TRIGGER_ID
|
||||||
|
@ -58,3 +59,12 @@ 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
|
||||||
|
|
|
@ -25,3 +25,7 @@ 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)
|
||||||
|
|
|
@ -28,3 +28,7 @@ def to_code(config):
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_TEMPLATE_TEXT_SENSOR'
|
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'
|
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"]
|
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):
|
class SerialPortRequestHandler(BaseHandler):
|
||||||
def get(self):
|
def get(self):
|
||||||
if not self.is_authenticated():
|
if not self.is_authenticated():
|
||||||
|
@ -230,6 +237,7 @@ def make_app(debug=False):
|
||||||
(r"/validate", EsphomeyamlValidateHandler),
|
(r"/validate", EsphomeyamlValidateHandler),
|
||||||
(r"/clean-mqtt", EsphomeyamlCleanMqttHandler),
|
(r"/clean-mqtt", EsphomeyamlCleanMqttHandler),
|
||||||
(r"/clean", EsphomeyamlCleanHandler),
|
(r"/clean", EsphomeyamlCleanHandler),
|
||||||
|
(r"/hass-config", EsphomeyamlHassConfigHandler),
|
||||||
(r"/download.bin", DownloadBinaryRequestHandler),
|
(r"/download.bin", DownloadBinaryRequestHandler),
|
||||||
(r"/serial-ports", SerialPortRequestHandler),
|
(r"/serial-ports", SerialPortRequestHandler),
|
||||||
(r"/wizard.html", WizardRequestHandler),
|
(r"/wizard.html", WizardRequestHandler),
|
||||||
|
|
|
@ -215,6 +215,7 @@
|
||||||
<ul id="dropdown-{{ i }}" class="dropdown-content">
|
<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-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-clean" data-node="{{ file }}">Clean Build</a></li>
|
||||||
|
<li><a href="#" class="action-hass-config" data-node="{{ file }}">Home Assistant Configuration</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -491,6 +492,18 @@
|
||||||
</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>
|
||||||
|
<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">
|
<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>
|
<i class="material-icons">add</i>
|
||||||
</a>
|
</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 modalSetupElem = document.getElementById("modal-wizard");
|
||||||
const setupWizardStart = document.getElementById('setup-wizard-start');
|
const setupWizardStart = document.getElementById('setup-wizard-start');
|
||||||
const startWizard = () => {
|
const startWizard = () => {
|
||||||
|
|
|
@ -27,17 +27,24 @@ OTA_VERSION_1_0 = 1
|
||||||
MAGIC_BYTES = [0x6C, 0x26, 0xF7, 0x5C, 0x45]
|
MAGIC_BYTES = [0x6C, 0x26, 0xF7, 0x5C, 0x45]
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
LAST_PROGRESS = -1
|
||||||
|
|
||||||
|
|
||||||
def update_progress(progress):
|
def update_progress(progress):
|
||||||
|
global LAST_PROGRESS
|
||||||
|
|
||||||
bar_length = 60
|
bar_length = 60
|
||||||
status = ""
|
status = ""
|
||||||
if progress >= 1:
|
if progress >= 1:
|
||||||
progress = 1
|
progress = 1
|
||||||
status = "Done...\r\n"
|
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))
|
block = int(round(bar_length * progress))
|
||||||
text = "\rUploading: [{0}] {1}% {2}".format("=" * block + " " * (bar_length - block),
|
text = "\rUploading: [{0}] {1}% {2}".format("=" * block + " " * (bar_length - block),
|
||||||
int(progress * 100), status)
|
new_progress, status)
|
||||||
sys.stderr.write(text)
|
sys.stderr.write(text)
|
||||||
sys.stderr.flush()
|
sys.stderr.flush()
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue