Eurotronic Spirit Z-Wave - external temperature sensor

I had a technical exchange with Eurotronic last year as I was struggling to use an Aeotec Multisensor 6 as the external temperature sensor source with my Spirit. My system uses a Vera Lite controller.

It appears that the Spirit is fussy about the encapsulation of the temperature sensor data that is being sent to it (by Association). Their words were “The Spirit does not support the multi-channel command class. The reception is confirmed via ACK but the command is not processed on application level. Please send the multilevel sensor report without endpoint encapsulation.”

As mentioned, I was trying to use an Aeotec Multisensor 6 to provide the external temperature reading. With the Vera I had no control over this data was encapsulated, as it was being sent by the Multisensor directly to the Spirit by Association. I used a Zniffer to see what was actually being sent, and the data did appear to have an extra layer of encapsulation which would explain why the Spirit was ignoring it - although it was acknowledging it with an ACK!

I still haven’t got this working (no spare time!) - it seems that I would need to use another type of sensor that sends the data without encapsulation, unless of course Aeotec provided a firmware update that changed the way the multilevel sensor report was sent from the Multisensor.

Another alternative is to try to route the temperature through the controller somehow. I don’t believe that is possible with the Vera, but it might be possible on one of the more open controllers.

3 Likes

@Morgano that’s the most helpful comment I have found in the world on this topic !
I am amazed that nobody managed so far to use this external temperature sensor feature.
Does someone know by chance which temperature sensor can work with this Spirit ?

I also had a look at the Spirit Zigbee version and it doesn’t work either:

@thermostat Yes it’s been exasperating trying to get such a simple concept to work! It looks like it is possible on OpenHAB (see the final link in the first post) as this appears to allow more low-level control than Home Assistant. I’ve been trialling both OpenHAB and Home Assistant with a view to moving away from my Vera, but both systems seem to have their drawbacks - I’m not convinced I like either!
Back to the External sensor question, I also tried unsuccessfully with a Fibaro Universal sensor. Later on I bought a ZWave Me Z-Uno. I never got around to trying this but the documentation suggested that it would not be possible.
So, I think the only definite solutions are to use an external sensor but route it though the controller (OpenHAB, not possible in HA), or to implement the ‘Temperature Offset correction’ scheme described earlier in this thread.
Another possibility is to try to get the approach used in OpenHAB to work on HA. It only really requires the ability to send bytes out on the Z-Wave network (the Z-wave commands themselves are quite simple), and to effectively ‘roll your own’ Multilevel sensor report in the simple format that the Spirit requires.

@Morgano I have written to Eurotronic about this topic and asked if they can confirm a working temperature sensor. I am a bit reluctant to go with the OpenHAB approach or the ‘Temperature Offset correction’ (as they are highly dependent on OpenHAB or HA sending regular updates/sync).
I will report here if I can get any answer.

@thermostat I already asked them a while back about compatible sensors and got nowhere; hopefully you might have more success!
In case it is of interest, below is a screenshot of the technical part of the email I sent them showing the sensor sending a temperature report to the Spirit, captured by my Zniffer. This got ACKed by the Spirit but is not processed by it due to the encapsulation.

Probably the best solution to this whole issue would be for Eurotronic to update the firmware in their devices to cope with this type of sensor report. However, it might not help existing owners of the devices as I don’t believe that the Spirit is user-updatable.

@Morgano Indeed but based on Eurotronic’s previous behaviour, I wouldn’t hold my breath for a new firmware…
It seems that for the time being, it makes more sense to go with a proprietary solution like Homematic HMIP-eTRV-2 which can be easily bought with the associated external temperature sensor.
In addition it seems that it is well supported by Home Assistant.

Just out of curiosity, what is your feedback with Home Assistant ? You seemed a bit dissatisfied ?

Hey, I bought 9 of these (36€ @ amazon.de) and want to eliminate the need of the classic room thermostat, and instead, if one of 'em is askigh heat (and I don’t mean “on” or “heat”) because set temp is higher then current temp, I want to switch my gas heater/boiler on. how do I do this? Reading valve opening of all 9 of them? writing a rule for delta t?

Valve opening readout is not stock atm. So I’m looking for a concequent switching in heat/eco and boost mode.

Thanks!

PS; any nice examples of a programmable thermostat gui in HA?

Can I ask you why you are compensating to the average temperature instead of relying solely on your external temp sensor?

My TRV is sitting in the opposite end of the room. I wanted a temperature that represented the room better. So my setup consist of two temperature sensors at both ends of the room, and the avarage should represent the general room temperature.

When I have a temperature sensor inside the TRV why not use it as well? :slight_smile:

I see. The opposite ends explains the average calculation. Thanks :slight_smile:

Hi guys,
I’m actually on zipato zipabox and I’m exploring hass to migrate all my system. One of my primary objectives is to get my eurotronics trv to works, as it never worked good with zipabox (I’m unable to use external temperature).

As I understand, now Spirit valve is compatible with hass and is possibile to use an external temperature as @Siggylicious wrote in his post on top of the thread (I have a similar situation, long room with a big window and radiator near the window, so big temp difference… 15°C near the window, 19°C on the other side).

I understood correctly? Is now possibile to use spirit trv with hass and external temp?

Hi @ExTrEmE

You definitly can, that was the whole purpose for me choosing it. You will need to adjust the Measured Temperature Offset which can be adjusted to -5 C to +5 C of the internal measured temperature. See my previous post about how to adjust this temperature in automation.yaml.

I have recently set this up in the hassio node-red addon and can link that too if you want.

1 Like

Hi,
even though I use ioBroker instead of HomeAssistant I’m fighting the same fight trying to feed the Spirit with an external temperature.
has anybody had any luck with reaching out to Eurotronic?

Thanks,
Kevin

Just as a random note:

I have several Eurotronic Spirit Z-wave and some have a different firmware version so I emailed Eurotronic about it and if there are some files available to update - they replied in a one liner - Yes it can upate itself but they won’t publish any new(?) updates due to several hub vendors not offering that feature.

Hello @Siggylicious please share me Node-red addon. Did you improve you previous code?

@Siggylicious of course this is the easy-way. Set an adjusting offset with parameter and stop (and this is working also with my zipabox).
If I understood, you get the trv temp, other sensor temp, calculate an average temp, and then set the offset to the average-trv difference. right?

@jelennn below is my node-red flow. It could proberly have been done smarter but it is more or less a what I had in my automation.yaml put directly into node-red.

[{"id":"addb4d7c.36da8","type":"server-state-changed","z":"4d2ad910.e13508","name":"TRV temp change","server":"154dc902.7c20a7","version":1,"entityidfilter":"sensor.eurotronic_eur_spiritz_wall_radiator_thermostat_temperature","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"x":110,"y":340,"wires":[["302d2b0e.b043f4","de11714d.4817f"]]},{"id":"302d2b0e.b043f4","type":"function","z":"4d2ad910.e13508","name":"Real office temp","func":"const globalHomeAssistant = global.get('homeassistant');\n\nmsg.payload = (globalHomeAssistant.homeAssistant.states[\"sensor.eurotronic_eur_spiritz_wall_radiator_thermostat_temperature\"].state - globalHomeAssistant.homeAssistant.states[\"input_number.office_temp_offset_in_degrees\"].state + 1).toFixed(2);\n\nreturn msg;","outputs":1,"noerr":0,"x":380,"y":400,"wires":[["ae0d7e4e.0b49f"]]},{"id":"de11714d.4817f","type":"function","z":"4d2ad910.e13508","name":"Avg office temp","func":"const globalHomeAssistant = global.get('homeassistant');\n\nmsg.payload = ((Number(globalHomeAssistant.homeAssistant.states[\"input_number.office_trv_real_temp\"].state) + Number(globalHomeAssistant.homeAssistant.states[\"sensor.0x00158d00025d8dfd_temperature\"].state)) / 2).toFixed(2);\n\nreturn msg;","outputs":1,"noerr":0,"x":380,"y":460,"wires":[["1e203e93.77f1b1"]]},{"id":"59b9a73b.3e7308","type":"function","z":"4d2ad910.e13508","name":"Set temp offset in degrees","func":"const globalHomeAssistant = global.get('homeassistant');\n\nmsg.payload = (Number(globalHomeAssistant.homeAssistant.states[\"input_number.office_temp_avg\"].state) - Number(globalHomeAssistant.homeAssistant.states[\"input_number.office_trv_real_temp\"].state)).toFixed(2);\n\nreturn msg;","outputs":1,"noerr":0,"x":410,"y":520,"wires":[["d504b39d.062c9"]]},{"id":"30f2088b.9ff0b8","type":"function","z":"4d2ad910.e13508","name":"Set temp offset to match config param","func":"const globalHomeAssistant = global.get('homeassistant');\n\nif ( Number(globalHomeAssistant.homeAssistant.states[\"input_number.office_temp_offset_in_degrees\"].state) > 5)\n{\n    msg.payload = 50;\n}\nelse if( Number(globalHomeAssistant.homeAssistant.states[\"input_number.office_temp_offset_in_degrees\"].state) >= 0)\n{\n    msg.payload = (Number(globalHomeAssistant.homeAssistant.states[\"input_number.office_temp_offset_in_degrees\"].state) * 10).toFixed(0);\n}\nelse if( Number(globalHomeAssistant.homeAssistant.states[\"input_number.office_temp_offset_in_degrees\"].state) < -5)\n{\n    msg.payload = 206;\n}\nelse\n{\n    msg.payload = 256 + (Number(globalHomeAssistant.homeAssistant.states[\"input_number.office_temp_offset_in_degrees\"].state) * 10).toFixed(0);\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":450,"y":580,"wires":[["b365558f.414cd8"]]},{"id":"ae0d7e4e.0b49f","type":"api-call-service","z":"4d2ad910.e13508","name":"Set payload","server":"154dc902.7c20a7","version":1,"debugenabled":false,"service_domain":"input_number","service":"set_value","entityId":"input_number.office_trv_real_temp","data":"{\"value\":{{payload}}}","dataType":"json","mergecontext":"","output_location":"payload","output_location_type":"msg","mustacheAltTags":false,"x":670,"y":400,"wires":[[]]},{"id":"1e203e93.77f1b1","type":"api-call-service","z":"4d2ad910.e13508","name":"Set payload","server":"154dc902.7c20a7","version":1,"debugenabled":false,"service_domain":"input_number","service":"set_value","entityId":"input_number.office_temp_avg","data":"{\"value\":{{payload}}}","dataType":"json","mergecontext":"","output_location":"payload","output_location_type":"msg","mustacheAltTags":false,"x":670,"y":460,"wires":[[]]},{"id":"a71abbaa.9f41c8","type":"server-state-changed","z":"4d2ad910.e13508","name":"Office temp change","server":"154dc902.7c20a7","version":1,"entityidfilter":"sensor.0x00158d00025d8dfd_temperature","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"x":110,"y":420,"wires":[["de11714d.4817f"]]},{"id":"d504b39d.062c9","type":"api-call-service","z":"4d2ad910.e13508","name":"Set payload","server":"154dc902.7c20a7","version":1,"debugenabled":false,"service_domain":"input_number","service":"set_value","entityId":"input_number.office_temp_offset_in_degrees","data":"{\"value\":{{payload}}}","dataType":"json","mergecontext":"","output_location":"payload","output_location_type":"msg","mustacheAltTags":false,"x":670,"y":520,"wires":[[]]},{"id":"e6a71036.5de0b","type":"server-state-changed","z":"4d2ad910.e13508","name":"TRV real temp change","server":"154dc902.7c20a7","version":1,"entityidfilter":"input_number.office_trv_real_temp","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"x":120,"y":500,"wires":[["59b9a73b.3e7308"]]},{"id":"14aa7c5d.b0bdb4","type":"server-state-changed","z":"4d2ad910.e13508","name":"Office temp offset change","server":"154dc902.7c20a7","version":1,"entityidfilter":"input_number.office_temp_offset_in_degrees","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"x":130,"y":580,"wires":[["30f2088b.9ff0b8"]]},{"id":"b365558f.414cd8","type":"api-call-service","z":"4d2ad910.e13508","name":"Set payload","server":"154dc902.7c20a7","version":1,"debugenabled":false,"service_domain":"input_number","service":"set_value","entityId":"input_number.office_temp_offset_in_byte","data":"{\"value\":{{payload}}}","dataType":"json","mergecontext":"","output_location":"payload","output_location_type":"msg","mustacheAltTags":false,"x":710,"y":580,"wires":[[]]},{"id":"738aadb.35eda54","type":"server-state-changed","z":"4d2ad910.e13508","name":"Send temp offset to TRV","server":"154dc902.7c20a7","version":1,"entityidfilter":"input_number.office_temp_offset_in_byte","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"x":130,"y":660,"wires":[["2f7432d3.506e9e"]]},{"id":"21c71b76.4f65a4","type":"api-call-service","z":"4d2ad910.e13508","name":"Set payload","server":"154dc902.7c20a7","version":1,"debugenabled":false,"service_domain":"zwave","service":"set_config_parameter","entityId":"","data":"{\"node_id\": 9, \"parameter\": 8, \"value\":{{payload}}}","dataType":"json","mergecontext":"","output_location":"payload","output_location_type":"msg","mustacheAltTags":false,"x":730,"y":660,"wires":[[]]},{"id":"2f7432d3.506e9e","type":"function","z":"4d2ad910.e13508","name":"Set temp offset to match config param","func":"const globalHomeAssistant = global.get('homeassistant');\n\nmsg.payload = Number(globalHomeAssistant.homeAssistant.states[\"input_number.office_temp_offset_in_byte\"].state).toFixed(0);\n\nreturn msg;","outputs":1,"noerr":0,"x":450,"y":660,"wires":[["21c71b76.4f65a4"]]},{"id":"154dc902.7c20a7","type":"server","z":"","name":"Home Assistant"}]

@ExTrEmE yup. Get the offset and convert it and then send it.

Hello,

Iam using a Zipato Zipabox for that work. Create a virtual thermostat. This device will have several in- and outputs. Outputs are set setpoints for the Spirit. Inputs are measred temperatures from any device which is able to work like a sensor. If you use a SRT 321 device you are able to change the set temp without using a App or other interface. One virt. Thermostat can controll several Spirits. I am using it for a big house with several configurations. For your convinience you can plan for every item night/day temp.settings.
Tipp: You can use for all this a Zipabox 1 which is very cheap to buy. Because Zipato has a working HTTP interface you can link it to any system which talks HTTP. I use it for 4 years and saved per year all my investments by reducing costs for gas!

It’s correct. Virtual thermostat is able to change setpoint.
Unfortunately with zipabox I was unable to se the valve to read the temp from another sensor; config param set to the right value, another sensors associated with the valve… nothing: probably the issue is not entirely a zipabox fault.

I got it finally working with an external temperature sensor. the eurotronic thermostats are a bit picky about the sensors they work with. The only ones I found are the sensors from eurotronic itself (https://eurotronic.org/produkte/sensoren/). You simply have to set the thermostat option Measured Temperature Offset to 128 and put the thermostat into the “temperature” association group of the sensor.

homeassistant does not support the sensors out of the box yet. I have committed the necessary changes to homeassistant today so I hope the sensors will be supported soon.

P.S: For those wondering where to buy these sensors, I could only find them at https://www.hornbach.de/shop/suche/sortiment/eurotronic.

2 Likes