Core: Z-Wave State for 'SwitchMultiLevel' is Ignored

Created on 18 May 2018  ·  68Comments  ·  Source: home-assistant/core

Home Assistant release with the issue:

0.69.1

Last working Home Assistant release (if known):
N/A [Issue has been present since initial configuration in 0.61 ]

Operating environment (Hass.io/Docker/Windows/etc.):

Hass.io

Component/platform:

https://www.home-assistant.io/components/zwave/

Description of problem:
State information from a Z-Wave device is not presented as a state in HA; (Checked in Domoticz and it works there)

The reproduction scenario is a NUC, with Aeotec Gen 5 and a Eurotronic Spirit TRV. Remote access can be granted if necessary

The following is an example of the log, which is showing a ValueChanged message; for both a Valve Position [SwitchMultiLevel] and a Tempature Sensor [SensorMultiLevel].

2018-05-18 13:02:30.103 Info, Node005, Received SwitchMultiLevel report: level=99
2018-05-18 13:02:30.103 Detail, Node005, Refreshed Value: old value=98, new value=99, type=byte
2018-05-18 13:02:30.103 Detail, Node005, Changes to this value are not verified
2018-05-18 13:02:30.103 Detail, Node005, Notification: ValueChanged
2018-05-18 13:08:30.098 Detail, Node005,   Received: 0x01, 0x0c, 0x00, 0x04, 0x00, 0x05, 0x06, 0x31, 0x05, 0x01, 0x42, 0x07, 0x88, 0x0c
2018-05-18 13:08:30.098 Detail,
2018-05-18 13:08:30.098 Info, Node005, Received SensorMultiLevel report from node 5, instance 1, Temperature: value=19.28C
2018-05-18 13:08:30.098 Detail, Node005, Refreshed Value: old value=19.10, new value=19.28, type=decimal
2018-05-18 13:08:30.098 Detail, Node005, Changes to this value are not verified
2018-05-18 13:08:30.098 Detail, Node005, Notification: ValueChanged
2018-05-18 13:10:32.821 Detail, Node002,   Received: 0x01, 0x0c, 0x00, 0x04, 0x00, 0x02, 0x06, 0x31, 0x05, 0x01, 0x22, 0x01, 0x0c, 0xe9
2018-05-18 13:10:32.821 Detail,

The Temperature is presented as part of the Climate state,

2018-05-18 13:08:30 INFO (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=zwave.eurotronic_eur_spiritz_wall_radiator_thermostat_2, old_state=<state zwave.eurotronic_eur_spiritz_wall_radiator_thermostat_2=ready; node_id=5, node_name=Hall U
pstairs West Radiator, manufacturer_name=EUROtronic, product_name=EUR_SPIRITZ Wall Radiator Thermostat, query_stage=Complete, is_awake=True, is_ready=True, is_failed=False, is_info_received=True, max_baud_rate=40000, is_zwave_plus=True, capabilities={'routing', 'frequent
', 'beaming'}, neighbors={1}, sentCnt=16, sentFailed=0, retries=0, receivedCnt=153, receivedDups=3, receivedUnsolicited=141, sentTS=2018-05-18 00:00:38:732 , receivedTS=2018-05-18 13:02:30:103 , lastRequestRTT=27, averageRequestRTT=182, lastResponseRTT=64, averageRespons
eRTT=226, battery_level=20, friendly_name=Hall Upstairs West Radiator @ 2018-05-17T00:02:12.109799+01:00>, new_state=<state zwave.eurotronic_eur_spiritz_wall_radiator_thermostat_2=ready; node_id=5, node_name=Hall Upstairs West Radiator, manufacturer_name=EUROtronic, prod
uct_name=EUR_SPIRITZ Wall Radiator Thermostat, query_stage=Complete, is_awake=True, is_ready=True, is_failed=False, is_info_received=True, max_baud_rate=40000, is_zwave_plus=True, capabilities={'routing', 'frequent', 'beaming'}, neighbors={1}, sentCnt=16, sentFailed=0, r
etries=0, receivedCnt=154, receivedDups=3, receivedUnsolicited=142, sentTS=2018-05-18 00:00:38:732 , receivedTS=2018-05-18 13:08:30:098 , lastRequestRTT=27, averageRequestRTT=182, lastResponseRTT=64, averageResponseRTT=226, battery_level=20, friendly_name=Hall Upstairs W
est Radiator @ 2018-05-17T00:02:12.109799+01:00>>
2018-05-18 13:08:30 INFO (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=sensor.eurotronic_eur_spiritz_wall_radiator_thermostat_temperature_2, old_state=<state sensor.eurotronic_eur_spiritz_wall_radiator_thermostat_temperature_2=19.1; no
de_id=5, value_index=1, value_instance=1, value_id=72057594126811154, unit_of_measurement=°C, friendly_name=Hall Upstairs West Radiator Temperature @ 2018-05-18T12:44:30.239917+01:00>, new_state=<state sensor.eurotronic_eur_spiritz_wall_radiator_thermostat_temperature_2=
19.3; node_id=5, value_index=1, value_instance=1, value_id=72057594126811154, unit_of_measurement=°C, friendly_name=Hall Upstairs West Radiator Temperature @ 2018-05-18T13:08:30.210396+01:00>>
2018-05-18 13:08:30 INFO (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=climate.eurotronic_eur_spiritz_wall_radiator_thermostat_heat_2, old_state=<state climate.eurotronic_eur_spiritz_wall_radiator_thermostat_heat_2=Heat; current_temper
ature=19.1, min_temp=7, max_temp=35, temperature=22.0, operation_mode=Heat, operation_list=['Manufacturer Specific', 'Heat', 'Off', 'Full Power', 'Heat Eco'], node_id=5, value_index=1, value_instance=1, value_id=72057594127106066, unit_of_measurement=°C, friendly_name=Ha
ll Upstairs West Radiator Heat, supported_features=129 @ 2018-05-17T00:01:38.002039+01:00>, new_state=<state climate.eurotronic_eur_spiritz_wall_radiator_thermostat_heat_2=Heat; current_temperature=19.3, min_temp=7, max_temp=35, temperature=22.0, operation_mode=Heat, ope
ration_list=['Manufacturer Specific', 'Heat', 'Off', 'Full Power', 'Heat Eco'], node_id=5, value_index=1, value_instance=1, value_id=72057594127106066, unit_of_measurement=°C, friendly_name=Hall Upstairs West Radiator Heat, supported_features=129 @ 2018-05-17T00:01:38.00
2039+01:00>>
2018-05-18 13:08:30 INFO (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=climate.eurotronic_eur_spiritz_wall_radiator_thermostat_furnace_2, old_state=<state climate.eurotronic_eur_spiritz_wall_radiator_thermostat_furnace_2=Heat; current_
temperature=19.1, min_temp=7, max_temp=35, temperature=19.1, operation_mode=Heat, operation_list=['Manufacturer Specific', 'Heat', 'Off', 'Full Power', 'Heat Eco'], node_id=5, value_index=7, value_instance=1, value_id=72057594127106162, unit_of_measurement=°C, friendly_n
ame=Hall Upstairs West Radiator Furnace, supported_features=129 @ 2018-05-17T00:01:38.075500+01:00>, new_state=<state climate.eurotronic_eur_spiritz_wall_radiator_thermostat_furnace_2=Heat; current_temperature=19.3, min_temp=7, max_temp=35, temperature=19.3, operation_mo
de=Heat, operation_list=['Manufacturer Specific', 'Heat', 'Off', 'Full Power', 'Heat Eco'], node_id=5, value_index=7, value_instance=1, value_id=72057594127106162, unit_of_measurement=°C, friendly_name=Hall Upstairs West Radiator Furnace, supported_features=129 @ 2018-05
-17T00:01:38.075500+01:00>>
2018-05-18 13:08:30 INFO (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=climate.eurotronic_eur_spiritz_wall_radiator_thermostat_heat_eco_2, old_state=<state climate.eurotronic_eur_spiritz_wall_radiator_thermostat_heat_eco_2=Heat; curren
t_temperature=19.1, min_temp=7, max_temp=35, temperature=18.0, operation_mode=Heat, operation_list=['Manufacturer Specific', 'Heat', 'Off', 'Full Power', 'Heat Eco'], node_id=5, value_index=11, value_instance=1, value_id=72057594127106226, unit_of_measurement=°C, friendl
y_name=Hall Upstairs West Radiator Heat Eco, supported_features=129 @ 2018-05-17T00:01:38.078191+01:00>, new_state=<state climate.eurotronic_eur_spiritz_wall_radiator_thermostat_heat_eco_2=Heat; current_temperature=19.3, min_temp=7, max_temp=35, temperature=18.0, operati
on_mode=Heat, operation_list=['Manufacturer Specific', 'Heat', 'Off', 'Full Power', 'Heat Eco'], node_id=5, value_index=11, value_instance=1, value_id=72057594127106226, unit_of_measurement=°C, friendly_name=Hall Upstairs West Radiator Heat Eco, supported_features=129 @
2018-05-17T00:01:38.078191+01:00>>
2018-05-18 13:08:30 INFO (MainThread) [homeassistant.components.automation] Executing battery_sensor_from_battery_level_attribute
2018-05-18 13:08:30 INFO (MainThread) [homeassistant.core] Bus:Handling <Event logbook_entry[L]: name=battery_sensor_from_battery_level_attribute, message=has been triggered, domain=automation, entity_id=automation.battery_sensor_from_battery_level_attribute>
2018-05-18 13:08:30 INFO (MainThread) [homeassistant.helpers.script] Script battery_sensor_from_battery_level_attribute: Running script
2018-05-18 13:08:30 INFO (MainThread) [homeassistant.helpers.script] Script battery_sensor_from_battery_level_attribute: Executing step call service
2018-05-18 13:08:30 INFO (MainThread) [homeassistant.core] Bus:Handling <Event call_service[L]: domain=mqtt, service=publish, service_data=topic=homeassistant/sensor/eurotronic_eur_spiritz_wall_radiator_thermostat_2_battery/config, retain=True, payload={
  "device_class": "battery",
  "name": "Hall Upstairs West Radiator Battery",
  "state_topic": "homeassistant/sensor/eurotronic_eur_spiritz_wall_radiator_thermostat_2_battery/state",
  "unit_of_measurement": "%",
  "unique_id": "eurotronic_eur_spiritz_wall_radiator_thermostat_2_battery",
  "source_entity_id": "zwave.eurotronic_eur_spiritz_wall_radiator_thermostat_2",
  "source_attribute": "battery_level"
}, service_call_id=140183438216496-1030>
2018-05-18 13:08:30 INFO (MainThread) [homeassistant.core] Bus:Handling <Event service_executed[L]: service_call_id=140183438216496-1030>
2018-05-18 13:08:30 INFO (MainThread) [homeassistant.components.mqtt.discovery] Component has already been discovered: sensor eurotronic_eur_spiritz_wall_radiator_thermostat_2_battery
2018-05-18 13:08:30 INFO (MainThread) [homeassistant.helpers.script] Script battery_sensor_from_battery_level_attribute: Executing step call service
2018-05-18 13:08:30 INFO (MainThread) [homeassistant.core] Bus:Handling <Event call_service[L]: domain=mqtt, service=publish, service_data=topic=homeassistant/sensor/eurotronic_eur_spiritz_wall_radiator_thermostat_2_battery/state, retain=True, payload=20, service_call_id
=140183438216496-1031>
2018-05-18 13:08:30 INFO (MainThread) [homeassistant.core] Bus:Handling <Event service_executed[L]: service_call_id=140183438216496-1031>
2018-05-18 13:08:30 INFO (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=automation.battery_sensor_from_battery_level_attribute, old_state=<state automation.battery_sensor_from_battery_level_attribute=on; last_triggered=2018-05-18T13:02:
30.241083+01:00, friendly_name=Battery Sensor from battery_level Attribute, initial_state=on, hide_entity=False, package=battery_alert, icon=mdi:battery-charging-wireless-outline @ 2018-05-17T00:01:37.253091+01:00>, new_state=<state automation.battery_sensor_from_battery_level_attribute=on; last_triggered=2018-05-18T13:08:30.259398+01:00, friendly_name=Battery Sensor from battery_level Attribute, initial_state=on, hide_entity=False, package=battery_alert, icon=mdi:battery-charging-wireless-outline @ 2018-05-17T00:01:37.253091+01:00>>
2

however the Valve Position appears to be ignore, and not presented at all.

2018-05-18 13:02:30 INFO (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=zwave.eurotronic_eur_spiritz_wall_radiator_thermostat_2, old_state=<state zwave.eurotronic_eur_spiritz_wall_radiator_thermostat_2=ready; node_id=5, node_name=Hall Upstairs West Radiator, manufacturer_name=EUROtronic, product_name=EUR_SPIRITZ Wall Radiator Thermostat, query_stage=Complete, is_awake=True, is_ready=True, is_failed=False, is_info_received=True, max_baud_rate=40000, is_zwave_plus=True, capabilities={'routing', 'frequent', 'beaming'}, neighbors={1}, sentCnt=16, sentFailed=0, retries=0, receivedCnt=152, receivedDups=3, receivedUnsolicited=140, sentTS=2018-05-18 00:00:38:732 , receivedTS=2018-05-18 12:58:30:108 , lastRequestRTT=27, averageRequestRTT=182, lastResponseRTT=64, averageResponseRTT=226, battery_level=20, friendly_name=Hall Upstairs West Radiator @ 2018-05-17T00:02:12.109799+01:00>, new_state=<state zwave.eurotronic_eur_spiritz_wall_radiator_thermostat_2=ready; node_id=5, node_name=Hall Upstairs West Radiator, manufacturer_name=EUROtronic, product_name=EUR_SPIRITZ Wall Radiator Thermostat, query_stage=Complete, is_awake=True, is_ready=True, is_failed=False, is_info_received=True, max_baud_rate=40000, is_zwave_plus=True, capabilities={'routing', 'frequent', 'beaming'}, neighbors={1}, sentCnt=16, sentFailed=0, retries=0, receivedCnt=153, receivedDups=3, receivedUnsolicited=141, sentTS=2018-05-18 00:00:38:732 , receivedTS=2018-05-18 13:02:30:103 , lastRequestRTT=27, averageRequestRTT=182, lastResponseRTT=64, averageResponseRTT=226, battery_level=20, friendly_name=Hall Upstairs West Radiator @ 2018-05-17T00:02:12.109799+01:00>>
2018-05-18 13:02:30 INFO (MainThread) [homeassistant.components.automation] Executing battery_sensor_from_battery_level_attribute
2018-05-18 13:02:30 INFO (MainThread) [homeassistant.core] Bus:Handling <Event logbook_entry[L]: name=battery_sensor_from_battery_level_attribute, message=has been triggered, domain=automation, entity_id=automation.battery_sensor_from_battery_level_attribute>
2018-05-18 13:02:30 INFO (MainThread) [homeassistant.helpers.script] Script battery_sensor_from_battery_level_attribute: Running script
2018-05-18 13:02:30 INFO (MainThread) [homeassistant.helpers.script] Script battery_sensor_from_battery_level_attribute: Executing step call service
2018-05-18 13:02:30 INFO (MainThread) [homeassistant.core] Bus:Handling <Event call_service[L]: domain=mqtt, service=publish, service_data=topic=homeassistant/sensor/eurotronic_eur_spiritz_wall_radiator_thermostat_2_battery/config, retain=True, payload={
  "device_class": "battery",
  "name": "Hall Upstairs West Radiator Battery",
  "state_topic": "homeassistant/sensor/eurotronic_eur_spiritz_wall_radiator_thermostat_2_battery/state",
  "unit_of_measurement": "%",
  "unique_id": "eurotronic_eur_spiritz_wall_radiator_thermostat_2_battery",
  "source_entity_id": "zwave.eurotronic_eur_spiritz_wall_radiator_thermostat_2",
  "source_attribute": "battery_level"
}, service_call_id=140183438216496-1028>
2018-05-18 13:02:30 INFO (MainThread) [homeassistant.components.mqtt.discovery] Component has already been discovered: sensor eurotronic_eur_spiritz_wall_radiator_thermostat_2_battery

Problem-relevant configuration.yaml entries and (fill out even if it seems unimportant):

zwave:
  usb_path: /dev/ttyACM0
  network_key: !secret zwave_secure
  config_path: /share/open-zwave/config
  debug: false

Traceback (if applicable):


Additional information:

The environment is hass.io, and the Z-Wave configuration is loaded from a copy of the Dev Branch of the Open Z Wave project which contains the definition for the device Eurotronics Spirit; which is located in the /share/open-zwave-config/eurotronic/eur_spiritz.xml file

<?xml version="1.0" encoding="utf-8"?>
<!--
Eurotronic Spirit Z-Wave Plus Thermostat
Product website: https://www.eurotronic.org/produkte/spirit-z-wave-plus.html
Tech manual: https://www.eurotronic.org/fileadmin/user_upload/eurotronic.org/Produktbilder/spirit_z_wave_plus/Spirit_Z-Wave_BAL_web_EN_view_04.pdf
-->
<Product xmlns='https://github.com/OpenZWave/open-zwave' Revision="1">
    <!-- Multilevel switch for setting valve opening -->
    <CommandClass id="38">
        <Value type="byte" genre="user" index="0" label="Valve Opening" units="%" min="0" max="100" value="0" />
    </CommandClass>

    <!-- Thermostat mode -->
    <CommandClass id="64">
        <Instance index="1" />
        <Value type="list" genre="user" instance="1" index="0" label="Mode">
            <Help>
                Off: No heating, only frost protection.
                Heat: Room temperature will be kept at the configured setpoint.
                Heat Eco: Energy save heating mode. Room temperature will be lowered to the configured eco setpoint in order to save energy.
                Full Power: Full power heating. This mode is left automatically after 5 minutes.
                Manufacturer Specific: Direct valve control mode. The valve opening percentage can be controlled using the switch multilevel command class.
            </Help>
            <Item label="Off" value="0" />
            <Item label="Heat" value="1" />
            <Item label="Heat Eco" value="11" />
            <Item label="Full Power" value="15" />
            <Item label="Manufacturer Specific" value="31" />
        </Value>
        <SupportedModes>
            <Mode index="0" label="Off" />
            <Mode index="1" label="Heat" />
            <Mode index="11" label="Heat Eco" />
            <Mode index="15" label="Full Power" />
            <Mode index="31" label="Manufacturer Specific" />
        </SupportedModes>
    </CommandClass>

    <!-- Setpoints -->
    <CommandClass id="67" base="0" typeInterpretation="A">
        <Instance index="1"/>
        <Value type="decimal" genre="user" instance="1" index="1" label="Heat" units="&#x00b0;C" read_only="false" write_only="false" min="8" max="28" value="20"/>
        <Value type="decimal" genre="user" instance="1" index="11" label="Heat Eco" units="&#x00b0;C" read_only="false" write_only="false" min="8" max="28" value="16"/>
    </CommandClass>

    <!-- Configuration Parameters -->
    <CommandClass id="112">
        <Instance index="1"/>
        <Value type="list" genre="config" instance="1" index="1" label="LCD Invert" min="0" max="1" value="0" size="1">
            <Help>
                Allows rotating the LCD contents by 180 degrees.
                Default: Normal
            </Help>
            <Item label="Normal" value="0" />
            <Item label="Upside Down" value="1" />
        </Value>
        <Value type="byte" genre="config" instance="1" index="2" label="LCD Timeout" min="0" max="30" units="sec" value="0">
            <Help>
                0: No Timeout, LCD always on.
                5-30: Timeout after 5-30s.
                Default: 0 (LCD always on)
            </Help>
        </Value>
        <Value type="list" genre="config" instance="1" index="3" label="Backlight" min="0" max="1" units="" value="1" size="1">
            <Help>
                Default: Backlight enabled
            </Help>
            <Item label="Backlight disabled" value="0" />
            <Item label="Backlight enabled" value="1" />
        </Value>
        <Value type="list" genre="config" instance="1" index="4" label="Battery Report" min="0" max="1" units="" value="1" size="1">
            <Help>
                Default: Send once a day
            </Help>
            <Item label="Only send battery status as notification" value="0" />
            <Item label="Send once a day" value="1" />
        </Value>
        <Value type="byte" genre="config" instance="1" index="5" label="Temperature Report Threshold" min="0" max="50" units="0.1&#x00b0;C" value="5">
            <Help>
                0: Don't send temperature automatically.
                1-50: Report temperature at 0.1-5.0&#x00b0;C temperature difference.
                Default: 5 (Delta = 0.5&#x00b0;C)
            </Help>
        </Value>
        <Value type="byte" genre="config" instance="1" index="6" label="Valve Opening Percentage Report" min="0" max="100" units="" value="0">
            <Help>
                0: Don't send Valve opening percentage automatically.
                1-100: Report valve opening percentage at a delta of 1-100%.
                Default: 0
            </Help>
        </Value>
        <Value type="list" genre="config" instance="1" index="7" label="Open Window Detection" min="0" max="3" units="" value="2" size="1">
            <Help>
                Default: Medium sensibility
            </Help>
            <Item label="Disabled" value="0" />
            <Item label="Low sensibility" value="1" />
            <Item label="Medium sensibility" value="2" />
            <Item label="High sensibility" value="3" />
        </Value>
        <Value type="byte" genre="config" instance="1" index="8" label="Measured Temperature Offset" min="0" max="255" units="" value="0">
            <Help>
                206-255: -5.0 to -0.1&#x00b0;C.
                0-50: 0&#x00b0;C-5&#x00b0;C.
                128: External Temperature Sensor.
                Default: 0 (0.0&#x00b0;C Offset)
            </Help>
        </Value>
    </CommandClass>
</Product>

in progress zwave

Most helpful comment

Hey guys, another winter season incoming, so after living with valve opening position as light entity in previous season(with opening positions from 0 to 255), I decided to change this to curtain component(opening positions from 0 to 100%).
To make this work:

Go to https://github.com/home-assistant/home-assistant
Click download.
Extract the archive.
Open folder home-assistant-devhomeassistantcomponentszwave
Copy this folder(zwave) into your custom_components folder (in my case /docker/homeassistant/custom_components/zwave )
Overwrite discovery_schemas.py with this file https://gist.github.com/insajd/b1c922284ec2e38e84704db16429e001 (it contains fixes @rweglarz made, but instead of light component, curtain is used)
In HA go to Configuration -> Z-Wave -> In "Z-Wave Node Management" choose Thermostat node you want to configure, scroll down to "Node Config Options", choose "6: Valve Opening Percentage Report" and set it to value 1-100. I've set it to 3.
After this restart HA and you'll have sensor something like "cover.eurotronic_eur_spiritz_wall_radiator_thermostat_level"

Basically what you've done here, is you've created custom integration of zwave with fix, to make valve opening position show up as curtain. Drawback to this, is after you update HA, whatever changes are in original zwave integration won't be present in your custom one. So if you want to be up-to-date with zwave changes, you'll need to redo the steps of copying zwave folder and .py file, but you'll need to check Revisions tab to merge just the changes that are needed in rev2.

All 68 comments

With some more further research I found the following post in the community forum https://community.home-assistant.io/t/eurotronic-stella-z-radiator-thermostat-valve-control/49101/2

Which references an issue I believe is related.
https://github.com/OpenZWave/open-zwave/pull/1386

Currently in hassio I am mapping the configuration files from dev branch to the mount in the container, is it possible to compile a new build of open z wave with this fix and map that also into the containers?

Upgraded to 0.72.1 and completely reset everything, new home assistant configuration, included TRVs and the issue is still reproducing.

The only way to expose this in Hass is to allow multilevel command class from this thermostat into the light platform. Meaning you will have a light entity which will reflect the valveposition, just like a light.It will be called light.valve_opening That is possible, but I need the basic_type, generic_type and specific_type of the thermostat from zwcfg xml to allow the light platform to accept it.

Do you need this?

<Node id="21" name="STELLAZ Wall Rad" location="" basic="4" generic="8" specific="6" type="General Thermostat V2" listening="false" frequentListening="false" beaming="true" routing="true" max_baud_rate="40000" version="4" query_stage="Complete">

<Node id="21" name="STELLAZ Wall Rad" location="" basic="4" generic="8" specific="6" type="General Thermostat V2" listening="false" frequentListening="false" beaming="true" routing="true" max_baud_rate="40000" version="4" query_stage="Complete">
        <Manufacturer id="148" name="EUROtronic">
            <Product type="1" id="1" name="EUR_STELLAZ Wall Radiator Thermostat Valve Control" />
        </Manufacturer>
        <CommandClasses>
            <CommandClass id="32" name="COMMAND_CLASS_BASIC" version="1" request_flags="4" innif="true" mapping="64">
                <Instance index="1" />
            </CommandClass>
            <CommandClass id="38" name="COMMAND_CLASS_SWITCH_MULTILEVEL" version="3" innif="true">
                <Instance index="1" />
                <Value type="byte" genre="user" instance="1" index="0" label="Level" units="" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="0" />
                <Value type="button" genre="user" instance="1" index="1" label="Open" units="" read_only="false" write_only="true" verify_changes="false" poll_intensity="0" min="0" max="0" />
                <Value type="button" genre="user" instance="1" index="2" label="Close" units="" read_only="false" write_only="true" verify_changes="false" poll_intensity="0" min="0" max="0" />
                <Value type="bool" genre="system" instance="1" index="3" label="Ignore Start Level" units="" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="True" />
                <Value type="byte" genre="system" instance="1" index="4" label="Start Level" units="" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="0" />
                <Value type="byte" genre="system" instance="1" index="5" label="Dimming Duration" units="" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="255" />
                <Value type="byte" genre="user" instance="1" index="6" label="Step Size" units="" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="0" />
                <Value type="button" genre="user" instance="1" index="7" label="Inc" units="" read_only="false" write_only="true" verify_changes="false" poll_intensity="0" min="0" max="0" />
                <Value type="button" genre="user" instance="1" index="8" label="Dec" units="" read_only="false" write_only="true" verify_changes="false" poll_intensity="0" min="0" max="0" />
            </CommandClass>
            <CommandClass id="49" name="COMMAND_CLASS_SENSOR_MULTILEVEL" version="4" innif="true">
                <Instance index="1" />
                <Value type="decimal" genre="user" instance="1" index="1" label="Temperature" units="C" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="26.5" />
            </CommandClass>
            <CommandClass id="64" name="COMMAND_CLASS_THERMOSTAT_MODE" version="1" request_flags="4" innif="true">
                <Instance index="1" />
                <Value type="list" genre="user" instance="1" index="0" label="Mode" units="" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" vindex="1" size="0">
                    <Item label="Frost Protection" value="0" />
                    <Item label="Comfort" value="1" />
                    <Item label="Energy Saving" value="11" />
                    <Item label="Direct Valve Control" value="31" />
                </Value>
                <SupportedModes>
                    <Mode index="0" label="Off" />
                    <Mode index="1" label="Heat" />
                    <Mode index="11" label="Heat Econ" />
                    <Mode index="14" label="Unknown" />
                </SupportedModes>
            </CommandClass>
            <CommandClass id="67" name="COMMAND_CLASS_THERMOSTAT_SETPOINT" version="1" request_flags="4" innif="true" base="0">
                <Instance index="1" />
                <Value type="decimal" genre="user" instance="1" index="0" label="Frost protection setpoint" units="C" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="" />
                <Value type="decimal" genre="user" instance="1" index="1" label="Comfort setpoint" units="C" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="7.0" />
                <Value type="decimal" genre="user" instance="1" index="7" label="Furnace" units="C" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="0.0" />
                <Value type="decimal" genre="user" instance="1" index="11" label="Energy saving setpoint" units="C" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="18.0" />
            </CommandClass>
            <CommandClass id="114" name="COMMAND_CLASS_MANUFACTURER_SPECIFIC" version="1" request_flags="4" innif="true">
                <Instance index="1" />
            </CommandClass>
            <CommandClass id="119" name="COMMAND_CLASS_NODE_NAMING" version="1" request_flags="4" innif="true">
                <Instance index="1" />
            </CommandClass>
            <CommandClass id="128" name="COMMAND_CLASS_BATTERY" version="1" request_flags="4" innif="true">
                <Instance index="1" />
                <Value type="byte" genre="user" instance="1" index="0" label="Battery Level" units="%" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="0" />
            </CommandClass>
            <CommandClass id="132" name="COMMAND_CLASS_WAKE_UP" version="2" request_flags="2" innif="true">
                <Instance index="1" />
                <Value type="int" genre="system" instance="1" index="0" label="Wake-up Interval" units="Seconds" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="-2147483648" max="2147483647" value="240" />
                <Value type="int" genre="system" instance="1" index="1" label="Minimum Wake-up Interval" units="Seconds" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="-2147483648" max="2147483647" value="240" />
                <Value type="int" genre="system" instance="1" index="2" label="Maximum Wake-up Interval" units="Seconds" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="-2147483648" max="2147483647" value="15728400" />
                <Value type="int" genre="system" instance="1" index="3" label="Default Wake-up Interval" units="Seconds" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="-2147483648" max="2147483647" value="604672" />
                <Value type="int" genre="system" instance="1" index="4" label="Wake-up Interval Step" units="Seconds" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="-2147483648" max="2147483647" value="240" />
            </CommandClass>
            <CommandClass id="134" name="COMMAND_CLASS_VERSION" version="1" request_flags="4" innif="true">
                <Instance index="1" />
                <Value type="string" genre="system" instance="1" index="0" label="Library Version" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="3" />
                <Value type="string" genre="system" instance="1" index="1" label="Protocol Version" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="3.42" />
                <Value type="string" genre="system" instance="1" index="2" label="Application Version" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="0.04" />
            </CommandClass>
        </CommandClasses>
    </Node>

Any news about controlling the valve opening? I'm using a Eurotronic Spirit thermostat and I'm really interested in this feature. Calling it as a light would be a manageable workaround. What has to be done? Only config changes or changes in home-assistant itself?

p.s. About monitoring the valve state: Since I configured the thermostat to send out valve opening reports, I find entries like this in OZW_Log.txt: "2018-10-03 22:02:20.802 Info, Node006, Received SwitchMultiLevel report: level=27". However, they are not represented in home-assistant.

Hi together.

I have the same issue but for me it would just be important to know the value of the thermostats valve. Is there a way to do that with vor example editing the config?

There's nothing about the direct control of the valve

Controlling through light component works, but can that be exposed as input number slider somehow?

Controlling through light component works, but can that be exposed as input number slider somehow?

How?

@mariohock I tool commit that @rweglarz made on Nov3, and overwritten my file homeassistant/components/zwave/discovery_schemas.py with this one from his commit https://github.com/rweglarz/home-assistant/blob/f65de53f4727e10e80ea71bc607a74486205d10c/homeassistant/components/zwave/discovery_schemas.py
Not sure what I did after, probably just restarted HA. Or maybe clicked something in Z-Wave config panel in HA. But after a while I saw two new lights entities appear in HA. Now when I set operation mode: manufacturer specific - then by changing brightness of the light - it changes the state of the valve. Brightness 255 - is 100% open valve.

I've arrived here with the same problem as was initially reported (i.e. that you can't get the current % open value for the valve).

It appears that @rweglarz change was rejected by @balloob as it made the TRV look like a light as well.

It looks like the change tries to address both issues - i.e. that you cant get the current % open and that you can't set the current %open.

@rweglarz - can you confirm if just the first 5 lines (lines 72-76) of you change would fix the % open being visible (if not actually being able to set it) and if that is more likely to be acceptable to @balloob ?

At the moment I turn on my boiler if any rad is more than 0.2degC below it's set point, but I still often find it pumping against closed valves and it would be nice to get that part of the issue fixed and in the hassio builds even if the fix for controlling the valves in "Manufacturer Specific" mode is more complex.

I am using the whole commit of @rweglarz, but I don't have any attributes containing current % open. Another issue is that light platform for valves refreshes only when you turn it off, and it turns itself back on again, refreshing the valve %state. If you're not doing this, then it shows just how much it was open during HA startup.
For displaying proper % of open valve, I use template : {{ (( states.light.eurotronic_eur_spiritz_wall_radiator_thermostat_level_2.attributes["brightness"] | float ) / 255 * 100) | float | round(1) }} and am getting 0-100% values.

I think we could create entity from utilizing python scripting, and reading OZW_Log.txt file for SwitchMultilevel values.

I have been using @ rweglarz for two months now.
Through the appdaemon I control the opening of the valve.

self.call_service ('light / turn_on', entity_id = 'light.eurotronic_eur_stellaz_wall_radiator_thermostat_valve_control_level_2', brightness = set_dimmer)

Everything works fine.

If you're not doing this, then it shows just how much it was open during HA startup.

@insajd Have you gone into the openzwave node management page and selected the valve and changed the config parameter "6: Valve Opening Percentage Report" from zero (which means it doesn't report) to some other value (I've used 5%)?

Thanks @Sevift / @insajd, it sounds like any fix which is going to be accepted into the master code branch is going to be more complex. While I've written my own tiny custom component in python, I don't have a proper hassio dev env set up and was hoping to avoid that but it sounds like if I want this fixed I'll have to roll my sleeves up.

Wow @iancg I somehow overlooked that I needed to do that 👍 Thank you! It was set to 0 for me. Changed to 5% and yes, the light now responds to valve level change as it's supposed to(together with template sensor)

Is this still an issue you are experiencing? Can you please try upgrading to the latest version of Home Assistant (0.90) and report back if this is still a problem? Thanks!

Does anyone know how to implement the fix by @rweglarz in hassio? Or atleast I can't seem to find discovery_schemas.py anywhere.

Does anyone know how to implement the fix by @rweglarz in hassio? Or atleast I can't seem to find discovery_schemas.py anywhere.

I copied the zwave component from: /usr/local/lib/python3.7/site-packages/homeassistant/components/zwave to /config/custom_components/
and edited the file: /config/custom_components/zwave/discovery_schemas.py

There hasn't been any activity on this issue recently. Due to the high number of incoming GitHub notifications, we have to clean some of the old issues, as many of them have already been resolved with the latest updates.
Please make sure to update to the latest Home Assistant version and check if that solves the issue. Let us know if that works for you by adding a comment 👍
This issue now has been marked as stale and will be closed if no further activity occurs. Thank you for your contributions.

There hasn't been any activity on this issue recently. Due to the high number of incoming GitHub notifications, we have to clean some of the old issues, as many of them have already been resolved with the latest updates.
Please make sure to update to the latest Home Assistant version and check if that solves the issue. Let us know if that works for you by adding a comment 👍
This issue now has been marked as stale and will be closed if no further activity occurs. Thank you for your contributions.

There are no positive changes in the latest version.

still no feasible solution to this :(

Can anyone help me just map the valve position as a sensor. I have gone over all the post and i am still stugging to work our how to do it.

Hey guys, another winter season incoming, so after living with valve opening position as light entity in previous season(with opening positions from 0 to 255), I decided to change this to curtain component(opening positions from 0 to 100%).
To make this work:

Go to https://github.com/home-assistant/home-assistant
Click download.
Extract the archive.
Open folder home-assistant-devhomeassistantcomponentszwave
Copy this folder(zwave) into your custom_components folder (in my case /docker/homeassistant/custom_components/zwave )
Overwrite discovery_schemas.py with this file https://gist.github.com/insajd/b1c922284ec2e38e84704db16429e001 (it contains fixes @rweglarz made, but instead of light component, curtain is used)
In HA go to Configuration -> Z-Wave -> In "Z-Wave Node Management" choose Thermostat node you want to configure, scroll down to "Node Config Options", choose "6: Valve Opening Percentage Report" and set it to value 1-100. I've set it to 3.
After this restart HA and you'll have sensor something like "cover.eurotronic_eur_spiritz_wall_radiator_thermostat_level"

Basically what you've done here, is you've created custom integration of zwave with fix, to make valve opening position show up as curtain. Drawback to this, is after you update HA, whatever changes are in original zwave integration won't be present in your custom one. So if you want to be up-to-date with zwave changes, you'll need to redo the steps of copying zwave folder and .py file, but you'll need to check Revisions tab to merge just the changes that are needed in rev2.

@insajd 's description works great. Thank you!

Why is this still not integrated in HA? 30 releases have passed already. What is needed to get this integrated by default?

Probably because https://github.com/home-assistant/home-assistant/pull/18138#issuecomment-435581726

Tell him "thank you"

Why cannot climate component be amended to have this percentage slider? Or, possibly, common 1-5 scale slider as on manual termostats

How is this still not fixed? There was a fix merge request which was rejected.

[edit] this was poorly worded.

How is this still not fixed, I'm baffled.

I have a theory for that (though it might not be accurate). With every new release Home Assistant brings in tons of new integrations. What they don't realize is with that, they just march into a maintenance hell. Every integration supposed to have an "owner" to take care of the maintenance. But since this is opensource anyone can just disappear at any given time.

With more than a 1000 integrations, this is just hell. They should STOP releasing new integrations and start focusing on fixing the old ones, and throwing out less used ones to have a more manageable number of them.

Unfortunately ZWave is especially in a despair state, without an owner. With a very old implementation. (altough they are working on a new https://github.com/cgarwood/python-openzwave-mqtt for 1.6)

It's quite simple. No one with the capability to fix this have had the time or interest to fix this.

Things are still happening and when a homeassistant-pyozw version with https://github.com/home-assistant/open-zwave/commit/7c92fca23ce4a896a9ac88006f5c3582608335fb in it gets packaged its way easier to get this working in a sane matter.

Also, I'm "baffled" by the shear ignorance of some sitting here wining about it. This is a open project, mostly built by volunteers, who all spend their time as they feel for it, and with attitudes like this, It clearly demotivates me from spending my time on this.

So, please, be respectful towards each other.

I did something that @insajd suggested a while ago. I have created an AppDaemon app that periodically reads OZW log file and parses out values of valve opening percentage. Those values are then used to create entities in HA.

It's not for control, but if you are interested only in monitoring valve opening percentage, it should be sufficient.

Check it out on https://github.com/jmarsik/ad-eurotronic-trv-valvepos and hopefully in a few days also in HACS.

My simple solution was:

sensor:
  - platform: command_line
    name: Radiator Hallway Valve Pos
    # Use pipefail to fail if we don't have a value yet.
    command: bash -c 'set -o pipefail ; grep "Node015, Received SwitchMultiLevel" /home/hass/.homeassistant/OZW_Log.txt | tail -n 1 | cut -d= -f 2-'
    unit_of_measurement: '%'

It's now replaced by patching zwave climate instead.

Yeah, that would also work of course. I just wanted to learn a little bit of AppDaemon and its possibilities.

My solution is also usable for Hass.io users. If you want to patch Z-Wave climate with Hass.io, you have to turn it into custom component (and then maintain it when upgrading, redoing the patch every time) or maybe you can mount the single patched file inside the container from host (don't know if possible with Hass.io architecture and available extension points) and then maintain this single file.

It would be nice to have all low-level Z-Wave values present in HA object model (node.values ...) even if there is no entity created from those values. For reading these values without entities could be presented as JSON attribute of the main Z-Wave device entity, with value_id and all that. With such information we would be able to use zwave.set_node_value service to set those values. Maybe someday :)

looks like update the 104.1 update the valves positions no longer visible

2020-01-17 17:09:00.040680 WARNING AppDaemon: ------------------------------------------------------------ 2020-01-17 17:11:00.006976 INFO eurotronic-trv-valvepos: Using OZW log file /config/OZW_Log.txt 2020-01-17 17:11:00.041863 WARNING AppDaemon: ------------------------------------------------------------ 2020-01-17 17:11:00.042225 WARNING AppDaemon: Unexpected error in worker for App eurotronic-trv-valvepos: 2020-01-17 17:11:00.042410 WARNING AppDaemon: Worker Ags: {'name': 'eurotronic-trv-valvepos', 'id': UUID('6930b976-7045-45db-a8ec-4bbf7a4cb046'), 'type': 'timer', 'function': <bound method EurotronicTRVValvePos.read_valvepos_from_log of <eurotronic-trv-valvepos.EurotronicTRVValvePos object at 0x7fca10133fd0>>, 'kwargs': {'interval': 120}} 2020-01-17 17:11:00.042550 WARNING AppDaemon: ------------------------------------------------------------ 2020-01-17 17:11:00.042952 WARNING AppDaemon: Traceback (most recent call last): File "/usr/lib/python3.8/site-packages/appdaemon/appdaemon.py", line 586, in worker funcref(self.sanitize_timer_kwargs(app, args["kwargs"])) File "/config/appdaemon/apps/eurotronic-trv-valvepos/eurotronic-trv-valvepos.py", line 28, in read_valvepos_from_log if (v["attributes"]["product_name"] == self.args.get("look_for_productname", "EUR_SPIRITZ Wall Radiator Thermostat")): KeyError: 'product_name'

@sutyagin can't agree. AppDaemon app with valve position sensors from @jmarsik still working fine for me, on 104.1.

@sutyagin can't agree. AppDaemon app with valve position sensors from @jmarsik still working fine for me, on 104.1.

what is your options.xml file look like? not sure what has happened but there was zwave update in the latest HA release

@sutyagin I did delete zwave folder from custom_components when started using this AppDaemon app, so using latest zwave changes from HA.
/config/options.xml contains

<?xml version="1.0" encoding="utf-8"?>
<!-- To be effective, this file should be placed in the user data folder specified in the Options::Create method -->
<Options xmlns='http://code.google.com/p/open-zwave/'>
  <Option name="logging" value="true" />
  <Option name="Associate" value="true" />
  <Option name="NotifyTransactions" value="false" />
  <Option name="DriverMaxAttempts" value="5" />
  <Option name="SaveConfiguration" value="true" />
  <!-- <Option name="RetryTimeout" value="40000" /> -->
  <!-- If you are using any Security Devices, you MUST set a network Key -->
  <!-- <Option name="NetworkKey" value="0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10" /> -->

  <!-- Some Devices have a big UserCode Table, that can mean startup times
  when refreshing Session Variables is very long (Especialy on Security
  Devices) This option will make the UserCode CC stop on the first
  "available" usercode slot rather than retrieve every one -->
  <Option name="RefreshAllUserCodes" value="false" />
  <Option name="ThreadTerminateTimeout" value="5000" />
</Options>

That didn't work for me.....

looks like update the 104.1 update the valves positions no longer visible

2020-01-17 17:09:00.040680 WARNING AppDaemon: ------------------------------------------------------------ 2020-01-17 17:11:00.006976 INFO eurotronic-trv-valvepos: Using OZW log file /config/OZW_Log.txt 2020-01-17 17:11:00.041863 WARNING AppDaemon: ------------------------------------------------------------ 2020-01-17 17:11:00.042225 WARNING AppDaemon: Unexpected error in worker for App eurotronic-trv-valvepos: 2020-01-17 17:11:00.042410 WARNING AppDaemon: Worker Ags: {'name': 'eurotronic-trv-valvepos', 'id': UUID('6930b976-7045-45db-a8ec-4bbf7a4cb046'), 'type': 'timer', 'function': <bound method EurotronicTRVValvePos.read_valvepos_from_log of <eurotronic-trv-valvepos.EurotronicTRVValvePos object at 0x7fca10133fd0>>, 'kwargs': {'interval': 120}} 2020-01-17 17:11:00.042550 WARNING AppDaemon: ------------------------------------------------------------ 2020-01-17 17:11:00.042952 WARNING AppDaemon: Traceback (most recent call last): File "/usr/lib/python3.8/site-packages/appdaemon/appdaemon.py", line 586, in worker funcref(self.sanitize_timer_kwargs(app, args["kwargs"])) File "/config/appdaemon/apps/eurotronic-trv-valvepos/eurotronic-trv-valvepos.py", line 28, in read_valvepos_from_log if (v["attributes"]["product_name"] == self.args.get("look_for_productname", "EUR_SPIRITZ Wall Radiator Thermostat")): KeyError: 'product_name'

It looks like that some of your Z-Wave entities don't have "product_name" attribute in Home Assistant. Could you check if that's the case and also report what such entities do you have?

I can add a simple check and ignore the entity if it doesn't have "product_name".

this is right, the product_name has gone from zwave log. Not sure what has
happened but it is not there any longer and this is causing the issue with
the reporting valves values.

On Thu, 30 Jan 2020 at 11:28, Jakub Marsik notifications@github.com wrote:

looks like update the 104.1 update the valves positions no longer visible

2020-01-17 17:09:00.040680 WARNING AppDaemon:
------------------------------------------------------------ 2020-01-17
17:11:00.006976 INFO eurotronic-trv-valvepos: Using OZW log file
/config/OZW_Log.txt 2020-01-17 17:11:00.041863 WARNING AppDaemon:
------------------------------------------------------------ 2020-01-17
17:11:00.042225 WARNING AppDaemon: Unexpected error in worker for App
eurotronic-trv-valvepos: 2020-01-17 17:11:00.042410 WARNING AppDaemon:
Worker Ags: {'name': 'eurotronic-trv-valvepos', 'id':
UUID('6930b976-7045-45db-a8ec-4bbf7a4cb046'), 'type': 'timer', 'function':
>,
'kwargs': {'interval': 120}} 2020-01-17 17:11:00.042550 WARNING AppDaemon:
------------------------------------------------------------ 2020-01-17
17:11:00.042952 WARNING AppDaemon: Traceback (most recent call last): File
"/usr/lib/python3.8/site-packages/appdaemon/appdaemon.py", line 586, in
worker funcref(self.sanitize_timer_kwargs(app, args["kwargs"])) File
"/config/appdaemon/apps/eurotronic-trv-valvepos/eurotronic-trv-valvepos.py",
line 28, in read_valvepos_from_log if (v["attributes"]["product_name"] ==
self.args.get("look_for_productname", "EUR_SPIRITZ Wall Radiator
Thermostat")): KeyError: 'product_name'

It looks like that some of your Z-Wave entities don't have "product_name"
attribute in Home Assistant. Could you check if that's the case and also
report what such entities do you have?

I can add a simple check and ignore the entity if it doesn't have
"product_name".


You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/home-assistant/home-assistant/issues/14526?email_source=notifications&email_token=ACU7AO2NA7B3YTMOLLJQW73RAK2XFA5CNFSM4FASTH72YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEKKU6CQ#issuecomment-580210442,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ACU7AO5ACLS6FWPC3KXIC6DRAK2XFANCNFSM4FASTH7Q
.

this is right, the product_name has gone from zwave log. Not sure what has happened but it is not there any longer and this is causing the issue with the reporting valves values.

On Thu, 30 Jan 2020 at 11:28, Jakub Marsik @.*> wrote: looks like update the 104.1 update the valves positions no longer visible 2020-01-17 17:09:00.040680 WARNING AppDaemon: ------------------------------------------------------------ 2020-01-17 17:11:00.006976 INFO eurotronic-trv-valvepos: Using OZW log file /config/OZW_Log.txt 2020-01-17 17:11:00.041863 WARNING AppDaemon: ------------------------------------------------------------ 2020-01-17 17:11:00.042225 WARNING AppDaemon: Unexpected error in worker for App eurotronic-trv-valvepos: 2020-01-17 17:11:00.042410 WARNING AppDaemon: Worker Ags: {'name': 'eurotronic-trv-valvepos', 'id': UUID('6930b976-7045-45db-a8ec-4bbf7a4cb046'), 'type': 'timer', 'function': >, 'kwargs': {'interval': 120}} 2020-01-17 17:11:00.042550 WARNING AppDaemon: ------------------------------------------------------------ 2020-01-17 17:11:00.042952 WARNING AppDaemon: Traceback (most recent call last): File "/usr/lib/python3.8/site-packages/appdaemon/appdaemon.py", line 586, in worker funcref(self.sanitize_timer_kwargs(app, args["kwargs"])) File "/config/appdaemon/apps/eurotronic-trv-valvepos/eurotronic-trv-valvepos.py", line 28, in read_valvepos_from_log if (v["attributes"]["product_name"] == self.args.get("look_for_productname", "EUR_SPIRITZ Wall Radiator Thermostat")): KeyError: 'product_name' It looks like that some of your Z-Wave entities don't have "product_name" attribute in Home Assistant. Could you check if that's the case and also report what such entities do you have? I can add a simple check and ignore the entity if it doesn't have "product_name". — You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub <#14526?email_source=notifications&email_token=ACU7AO2NA7B3YTMOLLJQW73RAK2XFA5CNFSM4FASTH72YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEKKU6CQ#issuecomment-580210442>, or unsubscribe https://github.com/notifications/unsubscribe-auth/ACU7AO5ACLS6FWPC3KXIC6DRAK2XFANCNFSM4FASTH7Q .

The application searches for product name in entity's attributes, not in OZW log. Could you check your Z-Wave entities and their attributes in Home Assistant?

I have the same issue as per https://github.com/jmarsik/ad-eurotronic-trv-valvepos/issues/3
On HA 104.3

zwave.eurotronic_eur_spiritz_wall_radiator_thermostat | ready | node_id: 14 node_name: EUROtronic EUR_SPIRITZ Wall Radiator Thermostat manufacturer_name: EUROtronic product_name: EUR_SPIRITZ Wall Radiator Thermostat query_stage: Complete is_awake: true is_ready: true is_failed: false is_info_received: true max_baud_rate: 40000 is_zwave_plus: true capabilities: zwave_plus,beaming,routing,frequent neighbors: 1,4,5,15,16,20,21,22 sentCnt: 20 sentFailed: 0 retries: 0 receivedCnt: 76 receivedDups: 0 receivedUnsolicited: 61 sentTS: 2020-01-31 12:34:14:472  receivedTS: 2020-01-31 12:34:40:706  lastRequestRTT: 27 averageRequestRTT: 445 lastResponseRTT: 60 averageResponseRTT: 61 battery_level: 100 application_version: 0.16 friendly_name: Study TRV Zwave
-- | -- | --

The product name is there,
Also checking the OZW log, the associated nodeid info is there
Node014, Received SwitchMultiLevel report: level=98

Should be solved in version 1.2 of my little application. Please try it and report back, thanks. The problem comes from the new functionality of HA 0.104 that restores entities on startup.

Works for me, thanks!

works for me as well. thanks a lot

There hasn't been any activity on this issue recently. Due to the high number of incoming GitHub notifications, we have to clean some of the old issues, as many of them have already been resolved with the latest updates.
Please make sure to update to the latest Home Assistant version and check if that solves the issue. Let us know if that works for you by adding a comment 👍
This issue now has been marked as stale and will be closed if no further activity occurs. Thank you for your contributions.

anti-stale

This issue also affects the Aeotec ZWA021 (appears to be the same product as the Eurotronics Spirit).

There hasn't been any activity on this issue recently. Due to the high number of incoming GitHub notifications, we have to clean some of the old issues, as many of them have already been resolved with the latest updates.
Please make sure to update to the latest Home Assistant version and check if that solves the issue. Let us know if that works for you by adding a comment 👍
This issue now has been marked as stale and will be closed if no further activity occurs. Thank you for your contributions.

anti-stale

I'm still using the solution with the patched zwave version on HA 0.103 since I want to have the option to set the valve position explicitly.

Has anyone tried the Spirits with the OpenZwave Beta? I wonder whether the valve position is available there and whether it can also be controlled with it.

With OZW beta, every value is can be accessed directly with MQTT. So even if something is not available in the zwave component, you can just query raw MQTT value.

I ended up going with Zwave2MQTT. The valves are fully supported, stability is great, checking all my boxes.

Ok good to know. Can the valve position also be changed this way?

Yes.

@Sungray Is it better than OpenZWave/qt-openzwave? I feel that has more of a official status, but I'm not 100% happy with it...

@karl-gustav I didn't try OpenZWave. I think Zwave2MQTT has less functionalities, but it's very solid. It's basically an adapter zwave <-> MQTT, that's it (and that's all I need, I don't want to do any logic on my Zwave controller, it should be handled elsewhere in my opinion, I like modularity).
As Zwave devices, I have one Z-Stick Gen5 EU (AEON Labs), two Range Extender 6 (AEON Labs), a bunch of EUR_SPIRITZ Wall Radiator Thermostat (EUROtronic), and one MultiSensor 6 (AEON Labs). All of them are working great.

@matejdro how can I read and change the valve values through mqtt, I set in openzwave the manufacter value, I can see some of
the values with the command mosquitto_sub -h 127.0.0.1 -t openzwave/1/node/15 but I don't know how can I read temps and valve percentage values

I am going to answer myself and put here the config for use the eurotronic valve like a cover in home assistant:

cover:
  - platform: mqtt
    name: "valvula_radiador_lara"
    command_topic: "OpenZWave/1/command/setvalue/"
    set_position_topic: "OpenZWave/1/command/setvalue/"
    set_position_template: "{ \"Value\": {{ position }}, \"ValueIDKey\": 256475153 }"
    position_topic: "OpenZWave/1/node/15/instance/1/commandclass/38/value/256475153/"
    value_template: "{{ value_json.Value }}"
    position_open: 98
    position_closed: 0
    payload_open: "{ \"Value\": 98, \"ValueIDKey\": 256475153 }"
    payload_close: "{ \"Value\": 0, \"ValueIDKey\": 256475153 }"

Yo have tu find your ValueIdKey, I found it looking in mqtt messages with a mqtt client

Yo have tu find your ValueIdKey, I found it looking in mqtt messages with a mqtt client

I don’t understand how to find it

MQTT I use this open source client, and click in scan then look in all the string to find for the "/38/" string that is the command to open the valve with the nodeId of the eurotronic, if you look in this image you have to find something like my example when you can find the ValueKey
mqtt2

Thanks, it worked.

Any reason you used cover here instead of just sensor?

Accessing the valve in this was is working great using OpenZWave (beta) and without any hacking of the code.

Thanks!

It would be awesome if we could get this integrated into the thermostat control at some point

Was this page helpful?
0 / 5 - 0 ratings