diff --git a/python_scripts/shellies_discovery.py b/python_scripts/shellies_discovery.py index ec780f72..b3419aa4 100644 --- a/python_scripts/shellies_discovery.py +++ b/python_scripts/shellies_discovery.py @@ -85,77 +85,77 @@ - https://raw.githubusercontent.com/bieniu/home-assistant-config/master/python_scripts/python_scripts.json """ -VERSION = '0.10.3' - -ATTR_DEVELOP = 'develop' - -ATTR_ID = 'id' -ATTR_MAC = 'mac' -ATTR_FW_VER = 'fw_ver' -ATTR_DISCOVERY_PREFIX = 'discovery_prefix' -ATTR_TEMP_UNIT = 'temp_unit' -ATTR_QOS = 'qos' - -ATTR_TEMPLATE_TEMPERATURE = '{{ value | float | round(1) }}' -ATTR_TEMPLATE_HUMIDITY = '{{ value | float | round(1) }}' -ATTR_TEMPLATE_LUX = '{{ value | float | round }}' -ATTR_TEMPLATE_POWER = '{{ value | float | round(1) }}' -ATTR_TEMPLATE_REACTIVE_POWER = '{{ value | float | round(1) }}' -ATTR_TEMPLATE_VOLTAGE = '{{ value | float | round(1) }}' -ATTR_TEMPLATE_ENERGY = '{{ (value | float / 60 / 1000) | round(2) }}' -ATTR_TEMPLATE_BATTERY = '{{ value | float | round }}' -ATTR_TEMPALATE_OVERPOWER = '{{ value_json.overpower }}' - -ATTR_MANUFACTURER = 'Allterco Robotics' -ATTR_MODEL_SHELLY1 = 'Shelly1' -ATTR_MODEL_SHELLY1PM = 'Shelly1PM' -ATTR_MODEL_SHELLY2 = 'Shelly2' -ATTR_MODEL_SHELLY25 = 'Shelly2.5' -ATTR_MODEL_SHELLYPLUG = 'Shelly Plug' -ATTR_MODEL_SHELLYPLUG_S = 'Shelly Plug S' -ATTR_MODEL_SHELLY4PRO = 'Shelly4Pro' -ATTR_MODEL_SHELLYHT = 'Shelly H&T' -ATTR_MODEL_SHELLYSMOKE = 'Shelly Smoke' -ATTR_MODEL_SHELLYSENSE = 'Shelly Sense' -ATTR_MODEL_SHELLYRGBW2 = 'Shelly RGBW2' -ATTR_MODEL_SHELLYEM = 'ShellyEM' -ATTR_SHELLY = 'Shelly' -ATTR_TEMPERATURE = 'temperature' -ATTR_HUMIDITY = 'humidity' -ATTR_BATTERY = 'battery' -ATTR_LUX = 'lux' -ATTR_ILLUMINANCE = 'illuminance' -ATTR_POWER = 'power' -ATTR_REACTIVE_POWER = 'reactive_power' -ATTR_VOLTAGE = 'voltage' -ATTR_ENERGY = 'energy' -ATTR_SWITCH = 'switch' -ATTR_LIGHT = 'light' -ATTR_RGBW = 'rgbw' -ATTR_WHITE = 'white' -ATTR_FAN = 'fan' -ATTR_SMOKE = 'smoke' -ATTR_MOTION = 'motion' -ATTR_CHARGER = 'charger' -ATTR_INPUT = 'input' -ATTR_LONGPUSH = 'longpush' -ATTR_OVERTEMPERATURE = 'overtemperature' -ATTR_OVERPOWER = 'overpower' -ATTR_HEAT = 'heat' -ATTR_COVER = 'cover' -ATTR_UNIT_W = 'W' -ATTR_UNIT_KWH = 'kWh' -ATTR_UNIT_V = 'V' -ATTR_UNIT_VAR = 'VAR' -ATTR_UNIT_PERCENT = '%' -ATTR_UNIT_LUX = 'lx' -ATTR_UNIT_CELSIUS = '°C' -ATTR_UNIT_FARENHEIT = '°F' -ATTR_ON = 'on' -ATTR_OFF = 'off' -ATTR_TRUE_FALSE_PAYLOAD = {ATTR_ON: 'true', ATTR_OFF: 'false'} -ATTR_1_0_PAYLOAD = {ATTR_ON: '1', ATTR_OFF: '0'} -ATTR_EXPIRE_AFTER = '7200' +VERSION = "0.10.4" + +ATTR_DEVELOP = "develop" + +ATTR_ID = "id" +ATTR_MAC = "mac" +ATTR_FW_VER = "fw_ver" +ATTR_DISCOVERY_PREFIX = "discovery_prefix" +ATTR_TEMP_UNIT = "temp_unit" +ATTR_QOS = "qos" + +ATTR_TEMPLATE_TEMPERATURE = "{{ value | float | round(1) }}" +ATTR_TEMPLATE_HUMIDITY = "{{ value | float | round(1) }}" +ATTR_TEMPLATE_LUX = "{{ value | float | round }}" +ATTR_TEMPLATE_POWER = "{{ value | float | round(1) }}" +ATTR_TEMPLATE_REACTIVE_POWER = "{{ value | float | round(1) }}" +ATTR_TEMPLATE_VOLTAGE = "{{ value | float | round(1) }}" +ATTR_TEMPLATE_ENERGY = "{{ (value | float / 60 / 1000) | round(2) }}" +ATTR_TEMPLATE_BATTERY = "{{ value | float | round }}" +ATTR_TEMPALATE_OVERPOWER = "{{ value_json.overpower }}" + +ATTR_MANUFACTURER = "Allterco Robotics" +ATTR_MODEL_SHELLY1 = "Shelly1" +ATTR_MODEL_SHELLY1PM = "Shelly1PM" +ATTR_MODEL_SHELLY2 = "Shelly2" +ATTR_MODEL_SHELLY25 = "Shelly2.5" +ATTR_MODEL_SHELLYPLUG = "Shelly Plug" +ATTR_MODEL_SHELLYPLUG_S = "Shelly Plug S" +ATTR_MODEL_SHELLY4PRO = "Shelly4Pro" +ATTR_MODEL_SHELLYHT = "Shelly H&T" +ATTR_MODEL_SHELLYSMOKE = "Shelly Smoke" +ATTR_MODEL_SHELLYSENSE = "Shelly Sense" +ATTR_MODEL_SHELLYRGBW2 = "Shelly RGBW2" +ATTR_MODEL_SHELLYEM = "ShellyEM" +ATTR_SHELLY = "Shelly" +ATTR_TEMPERATURE = "temperature" +ATTR_HUMIDITY = "humidity" +ATTR_BATTERY = "battery" +ATTR_LUX = "lux" +ATTR_ILLUMINANCE = "illuminance" +ATTR_POWER = "power" +ATTR_REACTIVE_POWER = "reactive_power" +ATTR_VOLTAGE = "voltage" +ATTR_ENERGY = "energy" +ATTR_SWITCH = "switch" +ATTR_LIGHT = "light" +ATTR_RGBW = "rgbw" +ATTR_WHITE = "white" +ATTR_FAN = "fan" +ATTR_SMOKE = "smoke" +ATTR_MOTION = "motion" +ATTR_CHARGER = "charger" +ATTR_INPUT = "input" +ATTR_LONGPUSH = "longpush" +ATTR_OVERTEMPERATURE = "overtemperature" +ATTR_OVERPOWER = "overpower" +ATTR_HEAT = "heat" +ATTR_COVER = "cover" +ATTR_UNIT_W = "W" +ATTR_UNIT_KWH = "kWh" +ATTR_UNIT_V = "V" +ATTR_UNIT_VAR = "VAR" +ATTR_UNIT_PERCENT = "%" +ATTR_UNIT_LUX = "lx" +ATTR_UNIT_CELSIUS = "°C" +ATTR_UNIT_FARENHEIT = "°F" +ATTR_ON = "on" +ATTR_OFF = "off" +ATTR_TRUE_FALSE_PAYLOAD = {ATTR_ON: "true", ATTR_OFF: "false"} +ATTR_1_0_PAYLOAD = {ATTR_ON: "1", ATTR_OFF: "0"} +ATTR_EXPIRE_AFTER = "7200" develop = False retain = True @@ -172,24 +172,26 @@ else: raise ValueError except ValueError: - logger.error("Wrong qos argument! Should be 0, 1 or 2. The default \ - value 0 was used.") + logger.error( + "Wrong qos argument! Should be 0, 1 or 2. The default \ + value 0 was used." + ) temp_unit = ATTR_UNIT_CELSIUS if data.get(ATTR_TEMP_UNIT) is not None: - if data.get(ATTR_TEMP_UNIT) == 'F': + if data.get(ATTR_TEMP_UNIT) == "F": temp_unit = ATTR_UNIT_FARENHEIT -disc_prefix = 'homeassistant' +disc_prefix = "homeassistant" if data.get(ATTR_DISCOVERY_PREFIX) is not None: disc_prefix = data.get(ATTR_DISCOVERY_PREFIX) if data.get(ATTR_DEVELOP) is not None: develop = data.get(ATTR_DEVELOP) if develop: - disc_prefix = 'develop' + disc_prefix = "develop" retain = False logger.error("DEVELOP MODE !!!") -if id == '' or mac == '': +if id == "" or mac == "": logger.error("Expected id and mac as arguments.") else: relays = 0 @@ -216,22 +218,19 @@ white_lights = 0 battery_powered = False - if id[:-7] == 'shelly1': + if id[:-7] == "shelly1": model = ATTR_MODEL_SHELLY1 relays = 1 relays_bin_sensors = [ATTR_INPUT, ATTR_LONGPUSH] relays_bin_sensors_payload = [ATTR_1_0_PAYLOAD, ATTR_1_0_PAYLOAD] - if id[:-7] == 'shelly1pm': + if id[:-7] == "shelly1pm": model = ATTR_MODEL_SHELLY1PM relays = 1 relays_sensors = [ATTR_POWER, ATTR_ENERGY] relays_sensors_units = [ATTR_UNIT_W, ATTR_UNIT_KWH] relays_sensors_classes = [ATTR_POWER, ATTR_POWER] - relays_sensors_templates = [ - ATTR_TEMPLATE_POWER, - ATTR_TEMPLATE_ENERGY - ] + relays_sensors_templates = [ATTR_TEMPLATE_POWER, ATTR_TEMPLATE_ENERGY] relays_bin_sensors = [ATTR_INPUT, ATTR_LONGPUSH] relays_bin_sensors_payload = [ATTR_1_0_PAYLOAD, ATTR_1_0_PAYLOAD] sensors = [ATTR_TEMPERATURE] @@ -242,31 +241,25 @@ bin_sensors_classes = [ATTR_HEAT] bin_sensors_payload = [ATTR_1_0_PAYLOAD] - if id[:-7] == 'shellyswitch': + if id[:-7] == "shellyswitch": model = ATTR_MODEL_SHELLY2 relays = 2 rollers = 1 relays_sensors = [ATTR_POWER, ATTR_ENERGY] relays_sensors_units = [ATTR_UNIT_W, ATTR_UNIT_KWH] relays_sensors_classes = [ATTR_POWER, ATTR_POWER] - relays_sensors_templates = [ - ATTR_TEMPLATE_POWER, - ATTR_TEMPLATE_ENERGY - ] + relays_sensors_templates = [ATTR_TEMPLATE_POWER, ATTR_TEMPLATE_ENERGY] relays_bin_sensors = [ATTR_INPUT, ATTR_LONGPUSH] relays_bin_sensors_payload = [ATTR_1_0_PAYLOAD, ATTR_1_0_PAYLOAD] - if id[:-7] == 'shellyswitch25': + if id[:-7] == "shellyswitch25": model = ATTR_MODEL_SHELLY25 relays = 2 rollers = 1 relays_sensors = [ATTR_POWER, ATTR_ENERGY] relays_sensors_units = [ATTR_UNIT_W, ATTR_UNIT_KWH] relays_sensors_classes = [ATTR_POWER, ATTR_POWER] - relays_sensors_templates = [ - ATTR_TEMPLATE_POWER, - ATTR_TEMPLATE_ENERGY - ] + relays_sensors_templates = [ATTR_TEMPLATE_POWER, ATTR_TEMPLATE_ENERGY] relays_bin_sensors = [ATTR_INPUT, ATTR_LONGPUSH] relays_bin_sensors_payload = [ATTR_1_0_PAYLOAD, ATTR_1_0_PAYLOAD] sensors = [ATTR_TEMPERATURE] @@ -277,27 +270,21 @@ bin_sensors_classes = [ATTR_HEAT] bin_sensors_payload = [ATTR_1_0_PAYLOAD] - if id[:-7] == 'shellyplug': + if id[:-7] == "shellyplug": model = ATTR_MODEL_SHELLYPLUG relays = 1 relays_sensors = [ATTR_POWER, ATTR_ENERGY] relays_sensors_units = [ATTR_UNIT_W, ATTR_UNIT_KWH] relays_sensors_classes = [ATTR_POWER, ATTR_POWER] - relays_sensors_templates = [ - ATTR_TEMPLATE_POWER, - ATTR_TEMPLATE_ENERGY - ] + relays_sensors_templates = [ATTR_TEMPLATE_POWER, ATTR_TEMPLATE_ENERGY] - if id[:-7] == 'shellyplug-s': + if id[:-7] == "shellyplug-s": model = ATTR_MODEL_SHELLYPLUG_S relays = 1 relays_sensors = [ATTR_POWER, ATTR_ENERGY] relays_sensors_units = [ATTR_UNIT_W, ATTR_UNIT_KWH] relays_sensors_classes = [ATTR_POWER, ATTR_POWER] - relays_sensors_templates = [ - ATTR_TEMPLATE_POWER, - ATTR_TEMPLATE_ENERGY - ] + relays_sensors_templates = [ATTR_TEMPLATE_POWER, ATTR_TEMPLATE_ENERGY] sensors = [ATTR_TEMPERATURE] sensors_classes = sensors sensors_units = [temp_unit] @@ -306,18 +293,15 @@ bin_sensors_classes = [ATTR_HEAT] bin_sensors_payload = [ATTR_1_0_PAYLOAD] - if id[:-7] == 'shelly4pro': + if id[:-7] == "shelly4pro": model = ATTR_MODEL_SHELLY4PRO relays = 4 relays_sensors = [ATTR_POWER, ATTR_ENERGY] relays_sensors_units = [ATTR_UNIT_W, ATTR_UNIT_KWH] relays_sensors_classes = [ATTR_POWER, ATTR_POWER] - relays_sensors_templates = [ - ATTR_TEMPLATE_POWER, - ATTR_TEMPLATE_ENERGY - ] + relays_sensors_templates = [ATTR_TEMPLATE_POWER, ATTR_TEMPLATE_ENERGY] - if id[:-7] == 'shellyht': + if id[:-7] == "shellyht": model = ATTR_MODEL_SHELLYHT sensors = [ATTR_TEMPERATURE, ATTR_HUMIDITY, ATTR_BATTERY] sensors_classes = sensors @@ -325,54 +309,43 @@ sensors_templates = [ ATTR_TEMPLATE_TEMPERATURE, ATTR_TEMPLATE_HUMIDITY, - ATTR_TEMPLATE_BATTERY + ATTR_TEMPLATE_BATTERY, ] battery_powered = True - if id[:-7] == 'shellysmoke': + if id[:-7] == "shellysmoke": model = ATTR_MODEL_SHELLYSMOKE sensors = [ATTR_TEMPERATURE, ATTR_BATTERY] sensors_classes = sensors sensors_units = [temp_unit, ATTR_UNIT_PERCENT] - sensors_templates = [ - ATTR_TEMPLATE_TEMPERATURE, - ATTR_TEMPLATE_BATTERY - ] + sensors_templates = [ATTR_TEMPLATE_TEMPERATURE, ATTR_TEMPLATE_BATTERY] bin_sensors = [ATTR_SMOKE] bin_sensors_classes = bin_sensors bin_sensors_payload = [ATTR_TRUE_FALSE_PAYLOAD] battery_powered = True - if id[:-7] == 'shellysense': + if id[:-7] == "shellysense": model = ATTR_MODEL_SHELLYSENSE sensors = [ATTR_TEMPERATURE, ATTR_HUMIDITY, ATTR_LUX, ATTR_BATTERY] sensors_classes = [ ATTR_TEMPERATURE, ATTR_HUMIDITY, ATTR_ILLUMINANCE, - ATTR_BATTERY - ] - sensors_units = [ - temp_unit, - ATTR_UNIT_PERCENT, - ATTR_UNIT_LUX, - ATTR_UNIT_PERCENT + ATTR_BATTERY, ] + sensors_units = [temp_unit, ATTR_UNIT_PERCENT, ATTR_UNIT_LUX, ATTR_UNIT_PERCENT] sensors_templates = [ ATTR_TEMPLATE_TEMPERATURE, ATTR_TEMPLATE_HUMIDITY, ATTR_TEMPLATE_LUX, - ATTR_TEMPLATE_BATTERY + ATTR_TEMPLATE_BATTERY, ] bin_sensors = [ATTR_MOTION, ATTR_CHARGER] bin_sensors_classes = [ATTR_MOTION, ATTR_POWER] - bin_sensors_payload = [ - ATTR_TRUE_FALSE_PAYLOAD, - ATTR_TRUE_FALSE_PAYLOAD - ] + bin_sensors_payload = [ATTR_TRUE_FALSE_PAYLOAD, ATTR_TRUE_FALSE_PAYLOAD] battery_powered = True - if id[:-7] == 'shellyrgbw2': + if id[:-7] == "shellyrgbw2": model = ATTR_MODEL_SHELLYRGBW2 rgbw_lights = 1 white_lights = 4 @@ -381,601 +354,591 @@ lights_bin_sensors_templates = [ATTR_TEMPALATE_OVERPOWER] lights_bin_sensors_payload = [ATTR_TRUE_FALSE_PAYLOAD] - if id[:-7] == 'shellyem': + if id[:-7] == "shellyem": model = ATTR_MODEL_SHELLYEM meters = 2 meters_sensors = [ATTR_POWER, ATTR_REACTIVE_POWER, ATTR_VOLTAGE] meters_sensors_units = [ATTR_UNIT_W, ATTR_UNIT_VAR, ATTR_UNIT_V] - meters_sensors_classes = [ATTR_POWER, '', ''] + meters_sensors_classes = [ATTR_POWER, None, None] meters_sensors_templates = [ ATTR_TEMPLATE_POWER, ATTR_TEMPLATE_REACTIVE_POWER, - ATTR_TEMPLATE_VOLTAGE + ATTR_TEMPLATE_VOLTAGE, ] for roller_id in range(0, rollers): - device_name = '{} {}'.format(model, id.split('-')[-1]) - roller_name = '{} Roller {}'.format(device_name, roller_id) - default_topic = 'shellies/{}/'.format(id) - state_topic = '~roller/{}'.format(roller_id) - command_topic = '{}/command'.format(state_topic) - position_topic = '{}/pos'.format(state_topic) - set_position_topic = '{}/command/pos'.format(state_topic) - availability_topic = '~online' - unique_id = '{}-roller-{}'.format(id, roller_id) + device_name = "{} {}".format(model, id.split("-")[-1]) + roller_name = "{} Roller {}".format(device_name, roller_id) + default_topic = "shellies/{}/".format(id) + state_topic = "~roller/{}".format(roller_id) + command_topic = "{}/command".format(state_topic) + position_topic = "{}/pos".format(state_topic) + set_position_topic = "{}/command/pos".format(state_topic) + availability_topic = "~online" + unique_id = "{}-roller-{}".format(id, roller_id) if data.get(id): config_component = data.get(id) elif data.get(id.lower()): config_component = data.get(id.lower()) component = ATTR_COVER - config_topic = '{}/{}/{}-roller-{}/config'.format( - disc_prefix, - component, - id, - roller_id + config_topic = "{}/{}/{}-roller-{}/config".format( + disc_prefix, component, id, roller_id ) if config_component == component: roller_mode = True - payload = '{\"name\":\"' + roller_name + '\",' \ - '\"cmd_t\":\"' + command_topic + '\",' \ - '\"pos_t\":\"' + position_topic + '\",' \ - '\"set_pos_t\":\"' + set_position_topic + '\",' \ - '\"pl_open\":\"open\",' \ - '\"pl_cls\":\"close\",' \ - '\"pl_stop\":\"stop\",' \ - '\"opt\":\"false\",' \ - '\"avty_t\":\"' + availability_topic + '\",' \ - '\"pl_avail\":\"true\",' \ - '\"pl_not_avail\":\"false\",' \ - '\"uniq_id\":\"' + unique_id + '\",' \ - '\"qos\":\"' + str(qos) + '\",' \ - '\"dev\": {\"ids\": [\"' + mac + '\"],' \ - '\"name\":\"' + device_name + '\",' \ - '\"mdl\":\"' + model + '\",' \ - '\"sw\":\"' + fw_ver + '\",' \ - '\"mf\":\"' + ATTR_MANUFACTURER + '\"},' \ - '\"~\":\"' + default_topic + '\"}' + payload = ( + '{"name":"' + roller_name + '",' + '"cmd_t":"' + command_topic + '",' + '"pos_t":"' + position_topic + '",' + '"set_pos_t":"' + set_position_topic + '",' + '"pl_open":"open",' + '"pl_cls":"close",' + '"pl_stop":"stop",' + '"opt":"false",' + '"avty_t":"' + availability_topic + '",' + '"pl_avail":"true",' + '"pl_not_avail":"false",' + '"uniq_id":"' + unique_id + '",' + '"qos":"' + str(qos) + '",' + '"dev": {"ids": ["' + mac + '"],' + '"name":"' + device_name + '",' + '"mdl":"' + model + '",' + '"sw":"' + fw_ver + '",' + '"mf":"' + ATTR_MANUFACTURER + '"},' + '"~":"' + default_topic + '"}' + ) else: - payload = '' + payload = "" service_data = { - 'topic': config_topic, - 'payload': payload, - 'retain': retain, - 'qos': qos + "topic": config_topic, + "payload": payload, + "retain": retain, + "qos": qos, } - hass.services.call('mqtt', 'publish', service_data, False) + hass.services.call("mqtt", "publish", service_data, False) for relay_id in range(0, relays): - device_name = '{} {}'.format(model, id.split('-')[-1]) - relay_name = '{} Relay {}'.format(device_name, relay_id) - default_topic = 'shellies/{}/'.format(id) - state_topic = '~relay/{}'.format(relay_id) - command_topic = '{}/command'.format(state_topic) - availability_topic = '~online' - unique_id = '{}-relay-{}'.format(id, relay_id) + device_name = "{} {}".format(model, id.split("-")[-1]) + relay_name = "{} Relay {}".format(device_name, relay_id) + default_topic = "shellies/{}/".format(id) + state_topic = "~relay/{}".format(relay_id) + command_topic = "{}/command".format(state_topic) + availability_topic = "~online" + unique_id = "{}-relay-{}".format(id, relay_id) if data.get(unique_id): config_component = data.get(unique_id) elif data.get(unique_id.lower()): config_component = data.get(unique_id.lower()) for component in relay_components: - config_topic = '{}/{}/{}-relay-{}/config'.format( - disc_prefix, - component, - id, - relay_id + config_topic = "{}/{}/{}-relay-{}/config".format( + disc_prefix, component, id, relay_id ) if component == config_component and not roller_mode: - payload = '{\"name\":\"' + relay_name + '\",' \ - '\"cmd_t\":\"' + command_topic + '\",' \ - '\"stat_t\":\"' + state_topic + '\",' \ - '\"pl_off\":\"off\",' \ - '\"pl_on\":\"on\",' \ - '\"avty_t\":\"' + availability_topic + '\",' \ - '\"pl_avail\":\"true\",' \ - '\"pl_not_avail\":\"false\",' \ - '\"uniq_id\":\"' + unique_id + '\",' \ - '\"qos\":\"' + str(qos) + '\",' \ - '\"dev\": {\"ids\": [\"' + mac + '\"],' \ - '\"name\":\"' + device_name + '\",' \ - '\"mdl\":\"' + model + '\",' \ - '\"sw\":\"' + fw_ver + '\",' \ - '\"mf\":\"' + ATTR_MANUFACTURER + '\"},' \ - '\"~\":\"' + default_topic + '\"}' + payload = ( + '{"name":"' + relay_name + '",' + '"cmd_t":"' + command_topic + '",' + '"stat_t":"' + state_topic + '",' + '"pl_off":"off",' + '"pl_on":"on",' + '"avty_t":"' + availability_topic + '",' + '"pl_avail":"true",' + '"pl_not_avail":"false",' + '"uniq_id":"' + unique_id + '",' + '"qos":"' + str(qos) + '",' + '"dev": {"ids": ["' + mac + '"],' + '"name":"' + device_name + '",' + '"mdl":"' + model + '",' + '"sw":"' + fw_ver + '",' + '"mf":"' + ATTR_MANUFACTURER + '"},' + '"~":"' + default_topic + '"}' + ) else: - payload = '' + payload = "" service_data = { - 'topic': config_topic, - 'payload': payload, - 'retain': retain, - 'qos': qos + "topic": config_topic, + "payload": payload, + "retain": retain, + "qos": qos, } - hass.services.call('mqtt', 'publish', service_data, False) + hass.services.call("mqtt", "publish", service_data, False) - if relay_id == relays-1: + if relay_id == relays - 1: for sensor_id in range(0, len(relays_sensors)): - unique_id = '{}-relay-{}'.format( - id, - relays_sensors[sensor_id] - ) - config_topic = '{}/sensor/{}-{}/config'.format( - disc_prefix, - id, - relays_sensors[sensor_id] + unique_id = "{}-relay-{}".format(id, relays_sensors[sensor_id]) + config_topic = "{}/sensor/{}-{}/config".format( + disc_prefix, id, relays_sensors[sensor_id] ) - sensor_name = '{} {}'.format( - device_name, - relays_sensors[sensor_id].capitalize() + sensor_name = "{} {}".format( + device_name, relays_sensors[sensor_id].capitalize() ) - state_topic = '~relay/{}'.format(relays_sensors[sensor_id]) + state_topic = "~relay/{}".format(relays_sensors[sensor_id]) if model == ATTR_MODEL_SHELLY2 or roller_mode: - payload = '{\"name\":\"' + sensor_name + '\",' \ - '\"stat_t\":\"' + state_topic + '\",' \ - '\"unit_of_meas\":\"' + relays_sensors_units[sensor_id] + '\",' \ - '\"dev_cla\":\"' + relays_sensors_classes[sensor_id] + '\",' \ - '\"val_tpl\":\"' + relays_sensors_templates[sensor_id] + '\",' \ - '\"avty_t\":\"' + availability_topic + '\",' \ - '\"pl_avail\":\"true\",' \ - '\"pl_not_avail\":\"false\",' \ - '\"uniq_id\":\"' + unique_id + '\",' \ - '\"qos\":\"' + str(qos) + '\",' \ - '\"dev\": {\"ids\": [\"' + mac + '\"],' \ - '\"name\":\"' + device_name + '\",' \ - '\"mdl\":\"' + model + '\",' \ - '\"sw\":\"' + fw_ver + '\",' \ - '\"mf\":\"' + ATTR_MANUFACTURER + '\"},' \ - '\"~\":\"' + default_topic + '\"}' + payload = ( + '{"name":"' + sensor_name + '",' + '"stat_t":"' + state_topic + '",' + '"unit_of_meas":"' + relays_sensors_units[sensor_id] + '",' + '"dev_cla":"' + relays_sensors_classes[sensor_id] + '",' + '"val_tpl":"' + relays_sensors_templates[sensor_id] + '",' + '"avty_t":"' + availability_topic + '",' + '"pl_avail":"true",' + '"pl_not_avail":"false",' + '"uniq_id":"' + unique_id + '",' + '"qos":"' + str(qos) + '",' + '"dev": {"ids": ["' + mac + '"],' + '"name":"' + device_name + '",' + '"mdl":"' + model + '",' + '"sw":"' + fw_ver + '",' + '"mf":"' + ATTR_MANUFACTURER + '"},' + '"~":"' + default_topic + '"}' + ) else: - payload = '' + payload = "" service_data = { - 'topic': config_topic, - 'payload': payload, - 'retain': retain, - 'qos': qos + "topic": config_topic, + "payload": payload, + "retain": retain, + "qos": qos, } - hass.services.call('mqtt', 'publish', service_data, False) + hass.services.call("mqtt", "publish", service_data, False) for sensor_id in range(0, len(relays_sensors)): - unique_id = '{}-relay-{}-{}'.format( - id, - relays_sensors[sensor_id], - relay_id - ) - config_topic = '{}/sensor/{}-{}-{}/config'.format( - disc_prefix, - id, - relays_sensors[sensor_id], - relay_id - ) - sensor_name = '{} {} {}'.format( - device_name, - relays_sensors[sensor_id].capitalize(), - relay_id + unique_id = "{}-relay-{}-{}".format(id, relays_sensors[sensor_id], relay_id) + config_topic = "{}/sensor/{}-{}-{}/config".format( + disc_prefix, id, relays_sensors[sensor_id], relay_id ) - state_topic = '~relay/{}/{}'.format( - relay_id, - relays_sensors[sensor_id] + sensor_name = "{} {} {}".format( + device_name, relays_sensors[sensor_id].capitalize(), relay_id ) + state_topic = "~relay/{}/{}".format(relay_id, relays_sensors[sensor_id]) if model != ATTR_MODEL_SHELLY2 and not roller_mode: - payload = '{\"name\":\"' + sensor_name + '\",' \ - '\"stat_t\":\"' + state_topic + '\",' \ - '\"unit_of_meas\":\"' + relays_sensors_units[sensor_id] + '\",' \ - '\"dev_cla\":\"' + relays_sensors_classes[sensor_id] + '\",' \ - '\"val_tpl\":\"' + relays_sensors_templates[sensor_id] + '\",' \ - '\"avty_t\":\"' + availability_topic + '\",' \ - '\"pl_avail\":\"true\",' \ - '\"pl_not_avail\":\"false\",' \ - '\"uniq_id\":\"' + unique_id + '\",' \ - '\"qos\":\"' + str(qos) + '\",' \ - '\"dev\": {\"ids\": [\"' + mac + '\"],' \ - '\"name\":\"' + device_name + '\",' \ - '\"mdl\":\"' + model + '\",' \ - '\"sw\":\"' + fw_ver + '\",' \ - '\"mf\":\"' + ATTR_MANUFACTURER + '\"},' \ - '\"~\":\"' + default_topic + '\"}' + payload = ( + '{"name":"' + sensor_name + '",' + '"stat_t":"' + state_topic + '",' + '"unit_of_meas":"' + relays_sensors_units[sensor_id] + '",' + '"dev_cla":"' + relays_sensors_classes[sensor_id] + '",' + '"val_tpl":"' + relays_sensors_templates[sensor_id] + '",' + '"avty_t":"' + availability_topic + '",' + '"pl_avail":"true",' + '"pl_not_avail":"false",' + '"uniq_id":"' + unique_id + '",' + '"qos":"' + str(qos) + '",' + '"dev": {"ids": ["' + mac + '"],' + '"name":"' + device_name + '",' + '"mdl":"' + model + '",' + '"sw":"' + fw_ver + '",' + '"mf":"' + ATTR_MANUFACTURER + '"},' + '"~":"' + default_topic + '"}' + ) else: - payload = '' + payload = "" service_data = { - 'topic': config_topic, - 'payload': payload, - 'retain': retain, - 'qos': qos + "topic": config_topic, + "payload": payload, + "retain": retain, + "qos": qos, } - hass.services.call('mqtt', 'publish', service_data, False) + hass.services.call("mqtt", "publish", service_data, False) for bin_sensor_id in range(0, len(relays_bin_sensors)): - unique_id = '{}-{}-{}'.format( - id, - relays_bin_sensors[bin_sensor_id], - relay_id + unique_id = "{}-{}-{}".format( + id, relays_bin_sensors[bin_sensor_id], relay_id ) - config_topic = '{}/binary_sensor/{}-{}-{}/config'.format( - disc_prefix, - id, - relays_bin_sensors[bin_sensor_id], - relay_id + config_topic = "{}/binary_sensor/{}-{}-{}/config".format( + disc_prefix, id, relays_bin_sensors[bin_sensor_id], relay_id ) - sensor_name = '{} {} {}'.format( - device_name, - relays_bin_sensors[bin_sensor_id].capitalize(), - relay_id - ) - state_topic = '~{}/{}'.format( - relays_bin_sensors[bin_sensor_id], - relay_id + sensor_name = "{} {} {}".format( + device_name, relays_bin_sensors[bin_sensor_id].capitalize(), relay_id ) + state_topic = "~{}/{}".format(relays_bin_sensors[bin_sensor_id], relay_id) if not roller_mode: - payload = '{\"name\":\"' + sensor_name + '\",' \ - '\"stat_t\":\"' + state_topic + '\",' \ - '\"pl_on\":\"' + relays_bin_sensors_payload[bin_sensor_id][ATTR_ON] + '\",' \ - '\"pl_off\":\"' + relays_bin_sensors_payload[bin_sensor_id][ATTR_OFF] + '\",' \ - '\"avty_t\":\"' + availability_topic + '\",' \ - '\"pl_avail\":\"true\",' \ - '\"pl_not_avail\":\"false\",' \ - '\"uniq_id\":\"' + unique_id + '\",' \ - '\"qos\":\"' + str(qos) + '\",' \ - '\"dev\": {\"ids\": [\"' + mac + '\"],' \ - '\"name\":\"' + device_name + '\",' \ - '\"mdl\":\"' + model + '\",' \ - '\"sw\":\"' + fw_ver + '\",' \ - '\"mf\":\"' + ATTR_MANUFACTURER + '\"},' \ - '\"~\":\"' + default_topic + '\"}' + payload = ( + '{"name":"' + sensor_name + '",' + '"stat_t":"' + state_topic + '",' + '"pl_on":"' + + relays_bin_sensors_payload[bin_sensor_id][ATTR_ON] + + '",' + '"pl_off":"' + + relays_bin_sensors_payload[bin_sensor_id][ATTR_OFF] + + '",' + '"avty_t":"' + availability_topic + '",' + '"pl_avail":"true",' + '"pl_not_avail":"false",' + '"uniq_id":"' + unique_id + '",' + '"qos":"' + str(qos) + '",' + '"dev": {"ids": ["' + mac + '"],' + '"name":"' + device_name + '",' + '"mdl":"' + model + '",' + '"sw":"' + fw_ver + '",' + '"mf":"' + ATTR_MANUFACTURER + '"},' + '"~":"' + default_topic + '"}' + ) else: - payload = '' + payload = "" service_data = { - 'topic': config_topic, - 'payload': payload, - 'retain': retain, - 'qos': qos + "topic": config_topic, + "payload": payload, + "retain": retain, + "qos": qos, } - hass.services.call('mqtt', 'publish', service_data, False) + hass.services.call("mqtt", "publish", service_data, False) for sensor_id in range(0, len(sensors)): - device_name = '{} {}'.format(model, id.split('-')[-1]) - unique_id = '{}-{}'.format(id, sensors[sensor_id]) - config_topic = '{}/sensor/{}-{}/config'.format( - disc_prefix, - id, - sensors[sensor_id] - ) - default_topic = 'shellies/{}/'.format(id) - availability_topic = '~online' - sensor_name = '{} {}'.format( - device_name, - sensors[sensor_id].capitalize() + device_name = "{} {}".format(model, id.split("-")[-1]) + unique_id = "{}-{}".format(id, sensors[sensor_id]) + config_topic = "{}/sensor/{}-{}/config".format( + disc_prefix, id, sensors[sensor_id] ) + default_topic = "shellies/{}/".format(id) + availability_topic = "~online" + sensor_name = "{} {}".format(device_name, sensors[sensor_id].capitalize()) if relays != 0: - state_topic = '~{}'.format(sensors[sensor_id]) + state_topic = "~{}".format(sensors[sensor_id]) else: - state_topic = '~sensor/{}'.format(sensors[sensor_id]) + state_topic = "~sensor/{}".format(sensors[sensor_id]) if battery_powered: - payload = '{\"name\":\"' + sensor_name + '\",' \ - '\"stat_t\":\"' + state_topic + '\",' \ - '\"unit_of_meas\":\"' + sensors_units[sensor_id] + '\",' \ - '\"dev_cla\":\"' + sensors_classes[sensor_id] + '\",' \ - '\"val_tpl\":\"' + sensors_templates[sensor_id] + '\",' \ - '\"exp_aft\":\"' + ATTR_EXPIRE_AFTER + '\",' \ - '\"uniq_id\":\"' + unique_id + '\",' \ - '\"qos\":\"' + str(qos) + '\",' \ - '\"dev\": {\"ids\": [\"' + mac + '\"],' \ - '\"name\":\"' + device_name + '\",' \ - '\"mdl\":\"' + model + '\",' \ - '\"sw\":\"' + fw_ver + '\",' \ - '\"mf\":\"' + ATTR_MANUFACTURER + '\"},' \ - '\"~\":\"' + default_topic + '\"}' + payload = ( + '{"name":"' + sensor_name + '",' + '"stat_t":"' + state_topic + '",' + '"unit_of_meas":"' + sensors_units[sensor_id] + '",' + '"dev_cla":"' + sensors_classes[sensor_id] + '",' + '"val_tpl":"' + sensors_templates[sensor_id] + '",' + '"exp_aft":"' + ATTR_EXPIRE_AFTER + '",' + '"uniq_id":"' + unique_id + '",' + '"qos":"' + str(qos) + '",' + '"dev": {"ids": ["' + mac + '"],' + '"name":"' + device_name + '",' + '"mdl":"' + model + '",' + '"sw":"' + fw_ver + '",' + '"mf":"' + ATTR_MANUFACTURER + '"},' + '"~":"' + default_topic + '"}' + ) else: - payload = '{\"name\":\"' + sensor_name + '\",' \ - '\"stat_t\":\"' + state_topic + '\",' \ - '\"unit_of_meas\":\"' + sensors_units[sensor_id] + '\",' \ - '\"dev_cla\":\"' + sensors_classes[sensor_id] + '\",' \ - '\"val_tpl\":\"' + sensors_templates[sensor_id] + '\",' \ - '\"avty_t\":\"' + availability_topic + '\",' \ - '\"pl_avail\":\"true\",' \ - '\"pl_not_avail\":\"false\",' \ - '\"uniq_id\":\"' + unique_id + '\",' \ - '\"qos\":\"' + str(qos) + '\",' \ - '\"dev\": {\"ids\": [\"' + mac + '\"],' \ - '\"name\":\"' + device_name + '\",' \ - '\"mdl\":\"' + model + '\",' \ - '\"sw\":\"' + fw_ver + '\",' \ - '\"mf\":\"' + ATTR_MANUFACTURER + '\"},' \ - '\"~\":\"' + default_topic + '\"}' + payload = ( + '{"name":"' + sensor_name + '",' + '"stat_t":"' + state_topic + '",' + '"unit_of_meas":"' + sensors_units[sensor_id] + '",' + '"dev_cla":"' + sensors_classes[sensor_id] + '",' + '"val_tpl":"' + sensors_templates[sensor_id] + '",' + '"avty_t":"' + availability_topic + '",' + '"pl_avail":"true",' + '"pl_not_avail":"false",' + '"uniq_id":"' + unique_id + '",' + '"qos":"' + str(qos) + '",' + '"dev": {"ids": ["' + mac + '"],' + '"name":"' + device_name + '",' + '"mdl":"' + model + '",' + '"sw":"' + fw_ver + '",' + '"mf":"' + ATTR_MANUFACTURER + '"},' + '"~":"' + default_topic + '"}' + ) service_data = { - 'topic': config_topic, - 'payload': payload, - 'retain': retain, - 'qos': qos + "topic": config_topic, + "payload": payload, + "retain": retain, + "qos": qos, } - hass.services.call('mqtt', 'publish', service_data, False) + hass.services.call("mqtt", "publish", service_data, False) for bin_sensor_id in range(0, len(bin_sensors)): - device_name = '{} {}'.format(model, id.split('-')[-1]) - unique_id = '{}-{}'.format(id, bin_sensors[bin_sensor_id]) - config_topic = '{}/binary_sensor/{}-{}/config'.format( - disc_prefix, - id, - bin_sensors[bin_sensor_id] + device_name = "{} {}".format(model, id.split("-")[-1]) + unique_id = "{}-{}".format(id, bin_sensors[bin_sensor_id]) + config_topic = "{}/binary_sensor/{}-{}/config".format( + disc_prefix, id, bin_sensors[bin_sensor_id] ) - default_topic = 'shellies/{}/'.format(id) - availability_topic = '~online' - sensor_name = '{} {}'.format( - device_name, - bin_sensors[bin_sensor_id].capitalize() + default_topic = "shellies/{}/".format(id) + availability_topic = "~online" + sensor_name = "{} {}".format( + device_name, bin_sensors[bin_sensor_id].capitalize() ) if relays != 0: - state_topic = '~{}'.format(bin_sensors[bin_sensor_id]) + state_topic = "~{}".format(bin_sensors[bin_sensor_id]) else: - state_topic = '~sensor/{}'.format(bin_sensors[bin_sensor_id]) + state_topic = "~sensor/{}".format(bin_sensors[bin_sensor_id]) if battery_powered: - payload = '{\"name\":\"' + sensor_name + '\",' \ - '\"stat_t\":\"' + state_topic + '\",' \ - '\"pl_on\":\"' + bin_sensors_payload[bin_sensor_id][ATTR_ON] + '\",' \ - '\"pl_off\":\"' + bin_sensors_payload[bin_sensor_id][ATTR_OFF] + '\",' \ - '\"dev_cla\":\"' + bin_sensors_classes[bin_sensor_id] + '\",' \ - '\"uniq_id\":\"' + unique_id + '\",' \ - '\"qos\":\"' + str(qos) + '\",' \ - '\"dev\": {\"ids\": [\"' + mac + '\"],' \ - '\"name\":\"' + device_name + '\",' \ - '\"mdl\":\"' + model + '\",' \ - '\"sw\":\"' + fw_ver + '\",' \ - '\"mf\":\"' + ATTR_MANUFACTURER + '\"},' \ - '\"~\":\"' + default_topic + '\"}' + payload = ( + '{"name":"' + sensor_name + '",' + '"stat_t":"' + state_topic + '",' + '"pl_on":"' + bin_sensors_payload[bin_sensor_id][ATTR_ON] + '",' + '"pl_off":"' + bin_sensors_payload[bin_sensor_id][ATTR_OFF] + '",' + '"dev_cla":"' + bin_sensors_classes[bin_sensor_id] + '",' + '"uniq_id":"' + unique_id + '",' + '"qos":"' + str(qos) + '",' + '"dev": {"ids": ["' + mac + '"],' + '"name":"' + device_name + '",' + '"mdl":"' + model + '",' + '"sw":"' + fw_ver + '",' + '"mf":"' + ATTR_MANUFACTURER + '"},' + '"~":"' + default_topic + '"}' + ) else: - payload = '{\"name\":\"' + sensor_name + '\",' \ - '\"stat_t\":\"' + state_topic + '\",' \ - '\"pl_on\":\"' + bin_sensors_payload[bin_sensor_id][ATTR_ON] + '\",' \ - '\"pl_off\":\"' + bin_sensors_payload[bin_sensor_id][ATTR_OFF] + '\",' \ - '\"avty_t\":\"' + availability_topic + '\",' \ - '\"pl_avail\":\"true\",' \ - '\"pl_not_avail\":\"false\",' \ - '\"dev_cla\":\"' + bin_sensors_classes[bin_sensor_id] + '\",' \ - '\"uniq_id\":\"' + unique_id + '\",' \ - '\"qos\":\"' + str(qos) + '\",' \ - '\"dev\": {\"ids\": [\"' + mac + '\"],' \ - '\"name\":\"' + device_name + '\",' \ - '\"mdl\":\"' + model + '\",' \ - '\"sw\":\"' + fw_ver + '\",' \ - '\"mf\":\"' + ATTR_MANUFACTURER + '\"},' \ - '\"~\":\"' + default_topic + '\"}' + payload = ( + '{"name":"' + sensor_name + '",' + '"stat_t":"' + state_topic + '",' + '"pl_on":"' + bin_sensors_payload[bin_sensor_id][ATTR_ON] + '",' + '"pl_off":"' + bin_sensors_payload[bin_sensor_id][ATTR_OFF] + '",' + '"avty_t":"' + availability_topic + '",' + '"pl_avail":"true",' + '"pl_not_avail":"false",' + '"dev_cla":"' + bin_sensors_classes[bin_sensor_id] + '",' + '"uniq_id":"' + unique_id + '",' + '"qos":"' + str(qos) + '",' + '"dev": {"ids": ["' + mac + '"],' + '"name":"' + device_name + '",' + '"mdl":"' + model + '",' + '"sw":"' + fw_ver + '",' + '"mf":"' + ATTR_MANUFACTURER + '"},' + '"~":"' + default_topic + '"}' + ) service_data = { - 'topic': config_topic, - 'payload': payload, - 'retain': retain, - 'qos': qos + "topic": config_topic, + "payload": payload, + "retain": retain, + "qos": qos, } - hass.services.call('mqtt', 'publish', service_data, False) + hass.services.call("mqtt", "publish", service_data, False) for light_id in range(0, rgbw_lights): - device_name = '{} {}'.format(model, id.split('-')[-1]) - light_name = '{} Light {}'.format(device_name, light_id) - default_topic = 'shellies/{}/'.format(id) - state_topic = '~color/{}/status'.format(light_id) - command_topic = '~color/{}/set'.format(light_id) - availability_topic = '~online' - unique_id = '{}-light-{}'.format(id, light_id) - config_topic = '{}/light/{}-{}/config'.format( - disc_prefix, id, light_id) + device_name = "{} {}".format(model, id.split("-")[-1]) + light_name = "{} Light {}".format(device_name, light_id) + default_topic = "shellies/{}/".format(id) + state_topic = "~color/{}/status".format(light_id) + command_topic = "~color/{}/set".format(light_id) + availability_topic = "~online" + unique_id = "{}-light-{}".format(id, light_id) + config_topic = "{}/light/{}-{}/config".format(disc_prefix, id, light_id) if data.get(id): config_light = data.get(id) elif data.get(id.lower()): config_light = data.get(id.lower()) if config_light == ATTR_RGBW: - payload = '{\"schema\":\"template\",' \ - '\"name\":\"' + light_name + '\",' \ - '\"cmd_t\":\"' + command_topic + '\",' \ - '\"stat_t\":\"' + state_topic + '\",' \ - '\"avty_t\":\"' + availability_topic + '\",' \ - '\"pl_avail\":\"true\",' \ - '\"pl_not_avail\":\"false\",' \ - '\"fx_list\":[0, 1, 2, 3, 4, 5, 5],' \ - '\"cmd_on_tpl\":\"{\\"turn\\":\\"on\\"{% if brightness is defined %},\\"gain\\":{{ brightness | float | multiply(0.3922) | round(0) }}{% endif %}{% if red is defined and green is defined and blue is defined %},\\"red\\":{{ red }},\\"green\\":{{ green }},\\"blue\\":{{ blue }}{% endif %}{% if white_value is defined %},\\"white\\":{{ white_value }}{% endif %}{% if effect is defined %},\\"effect\\":{{ effect }}{% endif %}}\",' \ - '\"cmd_off_tpl\":\"{\\"turn\\":\\"off\\"}\",' \ - '\"stat_tpl\":\"{% if value_json.ison %}on{% else %}off{% endif %}\",' \ - '\"bri_tpl\":\"{{ value_json.gain | float | multiply(2.55) | round(0) }}\",' \ - '\"r_tpl\":\"{{ value_json.red }}\",' \ - '\"g_tpl\":\"{{ value_json.green }}\",' \ - '\"b_tpl\":\"{{ value_json.blue }}\",' \ - '\"whit_val_tpl\":\"{{ value_json.white }}\",' \ - '\"fx_tpl\":\"{{ value_json.effect }}\",' \ - '\"uniq_id\":\"' + unique_id + '\",' \ - '\"qos\":\"' + str(qos) + '\",' \ - '\"dev\": {\"ids\": [\"' + mac + '\"],' \ - '\"name\":\"' + device_name + '\",' \ - '\"mdl\":\"' + model + '\",' \ - '\"sw\":\"' + fw_ver + '\",' \ - '\"mf\":\"' + ATTR_MANUFACTURER + '\"},' \ - '\"~\":\"' + default_topic + '\"}' + payload = ( + '{"schema":"template",' + '"name":"' + light_name + '",' + '"cmd_t":"' + command_topic + '",' + '"stat_t":"' + state_topic + '",' + '"avty_t":"' + availability_topic + '",' + '"pl_avail":"true",' + '"pl_not_avail":"false",' + '"fx_list":[0, 1, 2, 3, 4, 5, 5],' + '"cmd_on_tpl":"{\\"turn\\":\\"on\\"{% if brightness is defined %},\\"gain\\":{{ brightness | float | multiply(0.3922) | round(0) }}{% endif %}{% if red is defined and green is defined and blue is defined %},\\"red\\":{{ red }},\\"green\\":{{ green }},\\"blue\\":{{ blue }}{% endif %}{% if white_value is defined %},\\"white\\":{{ white_value }}{% endif %}{% if effect is defined %},\\"effect\\":{{ effect }}{% endif %}}",' + '"cmd_off_tpl":"{\\"turn\\":\\"off\\"}",' + '"stat_tpl":"{% if value_json.ison %}on{% else %}off{% endif %}",' + '"bri_tpl":"{{ value_json.gain | float | multiply(2.55) | round(0) }}",' + '"r_tpl":"{{ value_json.red }}",' + '"g_tpl":"{{ value_json.green }}",' + '"b_tpl":"{{ value_json.blue }}",' + '"whit_val_tpl":"{{ value_json.white }}",' + '"fx_tpl":"{{ value_json.effect }}",' + '"uniq_id":"' + unique_id + '",' + '"qos":"' + str(qos) + '",' + '"dev": {"ids": ["' + mac + '"],' + '"name":"' + device_name + '",' + '"mdl":"' + model + '",' + '"sw":"' + fw_ver + '",' + '"mf":"' + ATTR_MANUFACTURER + '"},' + '"~":"' + default_topic + '"}' + ) else: - payload = '' + payload = "" service_data = { - 'topic': config_topic, - 'payload': payload, - 'retain': retain, - 'qos': qos + "topic": config_topic, + "payload": payload, + "retain": retain, + "qos": qos, } - hass.services.call('mqtt', 'publish', service_data, False) + hass.services.call("mqtt", "publish", service_data, False) for bin_sensor_id in range(0, len(lights_bin_sensors)): - unique_id = '{}-color-{}-{}'.format( - id, - lights_bin_sensors[bin_sensor_id], - light_id + unique_id = "{}-color-{}-{}".format( + id, lights_bin_sensors[bin_sensor_id], light_id ) - config_topic = '{}/binary_sensor/{}-{}-{}/config'.format( - disc_prefix, - id, - lights_bin_sensors[bin_sensor_id], - light_id + config_topic = "{}/binary_sensor/{}-{}-{}/config".format( + disc_prefix, id, lights_bin_sensors[bin_sensor_id], light_id ) - sensor_name = '{} {} {}'.format( - device_name, - lights_bin_sensors[bin_sensor_id].capitalize(), - light_id + sensor_name = "{} {} {}".format( + device_name, lights_bin_sensors[bin_sensor_id].capitalize(), light_id ) - state_topic = '~color/{}/status'.format(light_id) + state_topic = "~color/{}/status".format(light_id) if config_light == ATTR_RGBW: - payload = '{\"name\":\"' + sensor_name + '\",' \ - '\"stat_t\":\"' + state_topic + '\",' \ - '\"val_tpl\":\"' + lights_bin_sensors_templates[bin_sensor_id] + '\",' \ - '\"pl_on\":\"' + lights_bin_sensors_payload[bin_sensor_id][ATTR_ON] + '\",' \ - '\"pl_off\":\"' + lights_bin_sensors_payload[bin_sensor_id][ATTR_OFF] + '\",' \ - '\"avty_t\":\"' + availability_topic + '\",' \ - '\"pl_avail\":\"true\",' \ - '\"pl_not_avail\":\"false\",' \ - '\"uniq_id\":\"' + unique_id + '\",' \ - '\"qos\":\"' + str(qos) + '\",' \ - '\"dev\": {\"ids\": [\"' + mac + '\"],' \ - '\"name\":\"' + device_name + '\",' \ - '\"mdl\":\"' + model + '\",' \ - '\"sw\":\"' + fw_ver + '\",' \ - '\"mf\":\"' + ATTR_MANUFACTURER + '\"},' \ - '\"~\":\"' + default_topic + '\"}' + payload = ( + '{"name":"' + sensor_name + '",' + '"stat_t":"' + state_topic + '",' + '"val_tpl":"' + lights_bin_sensors_templates[bin_sensor_id] + '",' + '"pl_on":"' + + lights_bin_sensors_payload[bin_sensor_id][ATTR_ON] + + '",' + '"pl_off":"' + + lights_bin_sensors_payload[bin_sensor_id][ATTR_OFF] + + '",' + '"avty_t":"' + availability_topic + '",' + '"pl_avail":"true",' + '"pl_not_avail":"false",' + '"uniq_id":"' + unique_id + '",' + '"qos":"' + str(qos) + '",' + '"dev": {"ids": ["' + mac + '"],' + '"name":"' + device_name + '",' + '"mdl":"' + model + '",' + '"sw":"' + fw_ver + '",' + '"mf":"' + ATTR_MANUFACTURER + '"},' + '"~":"' + default_topic + '"}' + ) else: - payload = '' + payload = "" service_data = { - 'topic': config_topic, - 'payload': payload, - 'retain': retain, - 'qos': qos + "topic": config_topic, + "payload": payload, + "retain": retain, + "qos": qos, } - hass.services.call('mqtt', 'publish', service_data, False) - + hass.services.call("mqtt", "publish", service_data, False) for light_id in range(0, white_lights): - device_name = '{} {}'.format(model, id.split('-')[-1]) - light_name = '{} Light {}'.format(device_name, light_id) - default_topic = 'shellies/{}/'.format(id) - state_topic = '~white/{}/status'.format(light_id) - command_topic = '~white/{}/set'.format(light_id) - availability_topic = '~online' - unique_id = '{}-light-white-{}'.format(id, light_id) - config_topic = '{}/light/{}-white-{}/config'.format( - disc_prefix, id, light_id) + device_name = "{} {}".format(model, id.split("-")[-1]) + light_name = "{} Light {}".format(device_name, light_id) + default_topic = "shellies/{}/".format(id) + state_topic = "~white/{}/status".format(light_id) + command_topic = "~white/{}/set".format(light_id) + availability_topic = "~online" + unique_id = "{}-light-white-{}".format(id, light_id) + config_topic = "{}/light/{}-white-{}/config".format(disc_prefix, id, light_id) if data.get(id): config_light = data.get(id) elif data.get(id.lower()): config_light = data.get(id.lower()) if config_light == ATTR_WHITE: - payload = '{\"schema\":\"template\",' \ - '\"name\":\"' + light_name + '\",' \ - '\"cmd_t\":\"' + command_topic + '\",' \ - '\"stat_t\":\"' + state_topic + '\",' \ - '\"avty_t\":\"' + availability_topic + '\",' \ - '\"pl_avail\":\"true\",' \ - '\"pl_not_avail\":\"false\",' \ - '\"cmd_on_tpl\":\"{\\"turn\\":\\"on\\"{% if brightness is defined %},\\"brightness\\":{{brightness | float | multiply(0.3922) | round(0)}}{% endif %}{% if red is defined and green is defined and blue is defined %},\\"red\\":{{ red }},\\"green\\":{{ green }},\\"blue\\":{{ blue }}{% endif %}{% if white_value is defined %},\\"white\\":{{ white_value }}{% endif %}{% if effect is defined %},\\"effect\\":{{ effect }}{% endif %}}\",' \ - '\"cmd_off_tpl\":\"{\\"turn\\":\\"off\\"}\",' \ - '\"stat_tpl\":\"{% if value_json.ison %}on{% else %}off{% endif %}\",' \ - '\"bri_tpl\":\"{{ value_json.brightness | float | multiply(2.55) | round(0) }}\",' \ - '\"uniq_id\":\"' + unique_id + '\",' \ - '\"qos\":\"' + str(qos) + '\",' \ - '\"dev\": {\"ids\": [\"' + mac + '\"],' \ - '\"name\":\"' + device_name + '\",' \ - '\"mdl\":\"' + model + '\",' \ - '\"sw\":\"' + fw_ver + '\",' \ - '\"mf\":\"' + ATTR_MANUFACTURER + '\"},' \ - '\"~\":\"' + default_topic + '\"}' + payload = ( + '{"schema":"template",' + '"name":"' + light_name + '",' + '"cmd_t":"' + command_topic + '",' + '"stat_t":"' + state_topic + '",' + '"avty_t":"' + availability_topic + '",' + '"pl_avail":"true",' + '"pl_not_avail":"false",' + '"cmd_on_tpl":"{\\"turn\\":\\"on\\"{% if brightness is defined %},\\"brightness\\":{{brightness | float | multiply(0.3922) | round(0)}}{% endif %}{% if red is defined and green is defined and blue is defined %},\\"red\\":{{ red }},\\"green\\":{{ green }},\\"blue\\":{{ blue }}{% endif %}{% if white_value is defined %},\\"white\\":{{ white_value }}{% endif %}{% if effect is defined %},\\"effect\\":{{ effect }}{% endif %}}",' + '"cmd_off_tpl":"{\\"turn\\":\\"off\\"}",' + '"stat_tpl":"{% if value_json.ison %}on{% else %}off{% endif %}",' + '"bri_tpl":"{{ value_json.brightness | float | multiply(2.55) | round(0) }}",' + '"uniq_id":"' + unique_id + '",' + '"qos":"' + str(qos) + '",' + '"dev": {"ids": ["' + mac + '"],' + '"name":"' + device_name + '",' + '"mdl":"' + model + '",' + '"sw":"' + fw_ver + '",' + '"mf":"' + ATTR_MANUFACTURER + '"},' + '"~":"' + default_topic + '"}' + ) else: - payload = '' + payload = "" service_data = { - 'topic': config_topic, - 'payload': payload, - 'retain': retain, - 'qos': qos + "topic": config_topic, + "payload": payload, + "retain": retain, + "qos": qos, } - hass.services.call('mqtt', 'publish', service_data, False) + hass.services.call("mqtt", "publish", service_data, False) for bin_sensor_id in range(0, len(lights_bin_sensors)): - unique_id = '{}-white-{}-{}'.format( - id, - lights_bin_sensors[bin_sensor_id], - light_id + unique_id = "{}-white-{}-{}".format( + id, lights_bin_sensors[bin_sensor_id], light_id ) - config_topic = '{}/binary_sensor/{}-{}-{}/config'.format( - disc_prefix, - id, - lights_bin_sensors[bin_sensor_id], - light_id + config_topic = "{}/binary_sensor/{}-{}-{}/config".format( + disc_prefix, id, lights_bin_sensors[bin_sensor_id], light_id ) - sensor_name = '{} {} {}'.format( - device_name, - lights_bin_sensors[bin_sensor_id].capitalize(), - light_id + sensor_name = "{} {} {}".format( + device_name, lights_bin_sensors[bin_sensor_id].capitalize(), light_id ) - state_topic = '~white/{}/status'.format(light_id) + state_topic = "~white/{}/status".format(light_id) if config_light != ATTR_RGBW: - payload = '{\"name\":\"' + sensor_name + '\",' \ - '\"stat_t\":\"' + state_topic + '\",' \ - '\"val_tpl\":\"' + lights_bin_sensors_templates[bin_sensor_id] + '\",' \ - '\"pl_on\":\"' + lights_bin_sensors_payload[bin_sensor_id][ATTR_ON] + '\",' \ - '\"pl_off\":\"' + lights_bin_sensors_payload[bin_sensor_id][ATTR_OFF] + '\",' \ - '\"avty_t\":\"' + availability_topic + '\",' \ - '\"pl_avail\":\"true\",' \ - '\"pl_not_avail\":\"false\",' \ - '\"uniq_id\":\"' + unique_id + '\",' \ - '\"qos\":\"' + str(qos) + '\",' \ - '\"dev\": {\"ids\": [\"' + mac + '\"],' \ - '\"name\":\"' + device_name + '\",' \ - '\"mdl\":\"' + model + '\",' \ - '\"sw\":\"' + fw_ver + '\",' \ - '\"mf\":\"' + ATTR_MANUFACTURER + '\"},' \ - '\"~\":\"' + default_topic + '\"}' + payload = ( + '{"name":"' + sensor_name + '",' + '"stat_t":"' + state_topic + '",' + '"val_tpl":"' + lights_bin_sensors_templates[bin_sensor_id] + '",' + '"pl_on":"' + + lights_bin_sensors_payload[bin_sensor_id][ATTR_ON] + + '",' + '"pl_off":"' + + lights_bin_sensors_payload[bin_sensor_id][ATTR_OFF] + + '",' + '"avty_t":"' + availability_topic + '",' + '"pl_avail":"true",' + '"pl_not_avail":"false",' + '"uniq_id":"' + unique_id + '",' + '"qos":"' + str(qos) + '",' + '"dev": {"ids": ["' + mac + '"],' + '"name":"' + device_name + '",' + '"mdl":"' + model + '",' + '"sw":"' + fw_ver + '",' + '"mf":"' + ATTR_MANUFACTURER + '"},' + '"~":"' + default_topic + '"}' + ) else: - payload = '' + payload = "" service_data = { - 'topic': config_topic, - 'payload': payload, - 'retain': retain, - 'qos': qos + "topic": config_topic, + "payload": payload, + "retain": retain, + "qos": qos, } - hass.services.call('mqtt', 'publish', service_data, False) + hass.services.call("mqtt", "publish", service_data, False) for meter_id in range(0, meters): - device_name = '{} {}'.format(model, id.split('-')[-1]) - meter_name = '{} Meter {}'.format(device_name, meter_id) - default_topic = 'shellies/{}/'.format(id) - state_topic = '~emeter/{}'.format(meter_id) - availability_topic = '~online' + device_name = "{} {}".format(model, id.split("-")[-1]) + meter_name = "{} Meter {}".format(device_name, meter_id) + default_topic = "shellies/{}/".format(id) + state_topic = "~emeter/{}".format(meter_id) + availability_topic = "~online" for sensor_id in range(0, len(meters_sensors)): - unique_id = '{}-emeter-{}-{}'.format( - id, - meters_sensors[sensor_id], - meter_id + unique_id = "{}-emeter-{}-{}".format( + id, meters_sensors[sensor_id], meter_id ) - config_topic = '{}/sensor/{}-{}-{}/config'.format( - disc_prefix, - id, - meters_sensors[sensor_id], - meter_id + config_topic = "{}/sensor/{}-{}-{}/config".format( + disc_prefix, id, meters_sensors[sensor_id], meter_id ) - sensor_name = '{} {} {}'.format( - device_name, - meters_sensors[sensor_id].capitalize(), - meter_id + sensor_name = "{} {} {}".format( + device_name, meters_sensors[sensor_id].capitalize(), meter_id ) - state_topic = '~emeter/{}/{}'.format( - meter_id, - meters_sensors[sensor_id] - ) - payload = '{\"name\":\"' + sensor_name + '\",' \ - '\"stat_t\":\"' + state_topic + '\",' \ - '\"unit_of_meas\":\"' + meters_sensors_units[sensor_id] + '\",' \ - '\"val_tpl\":\"' + meters_sensors_templates[sensor_id] + '\",' \ - '\"dev_cla\":\"' + meters_sensors_classes[sensor_id] + '\",' \ - '\"avty_t\":\"' + availability_topic + '\",' \ - '\"pl_avail\":\"true\",' \ - '\"pl_not_avail\":\"false\",' \ - '\"uniq_id\":\"' + unique_id + '\",' \ - '\"qos\":\"' + str(qos) + '\",' \ - '\"dev\": {\"ids\": [\"' + mac + '\"],' \ - '\"name\":\"' + device_name + '\",' \ - '\"mdl\":\"' + model + '\",' \ - '\"sw\":\"' + fw_ver + '\",' \ - '\"mf\":\"' + ATTR_MANUFACTURER + '\"},' \ - '\"~\":\"' + default_topic + '\"}' + state_topic = "~emeter/{}/{}".format(meter_id, meters_sensors[sensor_id]) + if meters_sensors_classes[sensor_id]: + payload = ( + '{"name":"' + sensor_name + '",' + '"stat_t":"' + state_topic + '",' + '"unit_of_meas":"' + meters_sensors_units[sensor_id] + '",' + '"val_tpl":"' + meters_sensors_templates[sensor_id] + '",' + '"dev_cla":"' + meters_sensors_classes[sensor_id] + '",' + '"avty_t":"' + availability_topic + '",' + '"pl_avail":"true",' + '"pl_not_avail":"false",' + '"uniq_id":"' + unique_id + '",' + '"qos":"' + str(qos) + '",' + '"dev": {"ids": ["' + mac + '"],' + '"name":"' + device_name + '",' + '"mdl":"' + model + '",' + '"sw":"' + fw_ver + '",' + '"mf":"' + ATTR_MANUFACTURER + '"},' + '"~":"' + default_topic + '"}' + ) + else: + payload = ( + '{"name":"' + sensor_name + '",' + '"stat_t":"' + state_topic + '",' + '"unit_of_meas":"' + meters_sensors_units[sensor_id] + '",' + '"val_tpl":"' + meters_sensors_templates[sensor_id] + '",' + '"avty_t":"' + availability_topic + '",' + '"pl_avail":"true",' + '"pl_not_avail":"false",' + '"uniq_id":"' + unique_id + '",' + '"qos":"' + str(qos) + '",' + '"dev": {"ids": ["' + mac + '"],' + '"name":"' + device_name + '",' + '"mdl":"' + model + '",' + '"sw":"' + fw_ver + '",' + '"mf":"' + ATTR_MANUFACTURER + '"},' + '"~":"' + default_topic + '"}' + ) service_data = { - 'topic': config_topic, - 'payload': payload, - 'retain': retain, - 'qos': qos + "topic": config_topic, + "payload": payload, + "retain": retain, + "qos": qos, } - hass.services.call('mqtt', 'publish', service_data, False) + hass.services.call("mqtt", "publish", service_data, False)