Sensor for Vallox DigitSE RS485 ventilation system with integration into FHEM.

  • Hero Member

    My house contains an air ventilation system from the company vallox. The controller of this device is an old school wall mounted micky-mouse-button device with an ugly LCD display. Using this controller is really annoying and the user expirience is really too much "last-century".
    The mission was to have the display data as well as the control buttons on my tablet. Another unflexible thing is the so-called boost-switch which can be pressed right before you have a shower. The switch makes the ventilation system run on max for 45minutes. if somebody accidentaly pressed the button in the midnight thinking it is a light-switch, the ventilation started roaring for 45minutes. I finally had to get up from bed walk downstairs and switch the system off to find some sleep again. This should also be a problem of the past. The idea was to handle the button using my new mysensors device. One click should start the ventilation for 45minutes, two clicks for 30minutes and a long click should stop the boost mode. I want to be able to interrupt the boost switch mode even from my iphone...

    I will post some pictures of the project the next days together with some details. I uploaded the library to control the vallox device via RS485 together with a mysensors sketch at:

    The sensor uses around 40 different child sensors as the vallox device offers so many different data.

    ... to be continued

  • Hero Member

    @Heinz Holy cow 40? I bet that took a while..

  • Hero Member

    This is the original controller of the ventilation system. It displays the fan speed as well as the 4 temperatures: incomming air, exhaust air, inside temp, outside temp. You can control the fan speed level 1-8 by pressing the up and down buttons.


    The controller communicates with the main device via a RS485 bus. To read the data sent between both parties I used an arduino mega as it has more than one hardware serial lines. This leads to less corrupt telegrams when communicating via RS485. You need at least one RS485 to TTL converter. As I had two of em I used one for sending and one for receiving telegrams:


    I had to develop a serial library that is able to interpret the vallox protocol. The protocol description can be found here:

    The library is used by the vallox-sensor-sketch to retrieve the data from the RS485 bus. The variables are send to the mysensors controller as different sensor values (41 different variables!).

    integration into FHEM was very easy. The following picture shows the most important variables and their readings. I did not import the other ones as I do not have any original CO2 Sensor nor humidty sensors attached.
    2015-02-09 14_22_20-Home, Sweet Home.png

    I also added some buttons to FHEM to make controlling of the vallox device easier:
    2015-02-09 14_25_54-Home, Sweet Home.png

    Inspired by samppa I added some calculations for efficiency of the heat exchanger see also

    The fan speed can be controlled by any tablet or phone in my house now. If somebody accidentally pushes the boost switch in the shower in the night it does not bother me any longer. I can easily turn it off using my iPhone ­čśë

  • Hero Member

    Code for integration of the sensor into FHEM:

    attr MYSENSOR_Vallox IODev MYSENSOR_Gateway
    attr MYSENSOR_Vallox alias digitSE
    attr MYSENSOR_Vallox group MySensors
    attr MYSENSOR_Vallox icon vent_ventilation_control
    attr MYSENSOR_Vallox mapReading_BoostSwitch 40 dimmer
    attr MYSENSOR_Vallox mapReading_CO2AdjustState 9 value1
    attr MYSENSOR_Vallox mapReading_DCFanInputAdjustment 26 dimmer
    attr MYSENSOR_Vallox mapReading_DCFanOutputAdjustment 27 dimmer
    attr MYSENSOR_Vallox mapReading_EfficiencyAverage 7 value1
    attr MYSENSOR_Vallox mapReading_EfficiencyIn 5 value1
    attr MYSENSOR_Vallox mapReading_EfficiencyOut 6 value1
    attr MYSENSOR_Vallox mapReading_FanSpeed 0 dimmer
    attr MYSENSOR_Vallox mapReading_FanSpeedMax 24 dimmer
    attr MYSENSOR_Vallox mapReading_FanSpeedMin 25 dimmer
    attr MYSENSOR_Vallox mapReading_FaultIndicator 14 value1
    attr MYSENSOR_Vallox mapReading_FilterGuardIndicator 12 value1
    attr MYSENSOR_Vallox mapReading_HeatingIndicator 13 value1
    attr MYSENSOR_Vallox mapReading_HeatingState 11 value1
    attr MYSENSOR_Vallox mapReading_HumidityAdjustState 10 value1
    attr MYSENSOR_Vallox mapReading_InputFanStopThreshold 28 temperature
    attr MYSENSOR_Vallox mapReading_PowerState 8 value1
    attr MYSENSOR_Vallox mapReading_ServiceReminderIndicator 15 value1
    attr MYSENSOR_Vallox mapReading_TempExhaust 3 temperature
    attr MYSENSOR_Vallox mapReading_TempIncomming 4 temperature
    attr MYSENSOR_Vallox mapReading_TempInside 1 temperature
    attr MYSENSOR_Vallox mapReading_TempOutside 2 temperature
    attr MYSENSOR_Vallox mode node
    attr MYSENSOR_Vallox room Sensoren
    attr MYSENSOR_Vallox setReading_BoostSwitch slider,0,1,60
    attr MYSENSOR_Vallox setReading_DCFanInputAdjustment slider,1,1,100
    attr MYSENSOR_Vallox setReading_DCFanOutputAdjustment slider,1,1,100
    attr MYSENSOR_Vallox setReading_FanSpeed slider,1,1,8
    attr MYSENSOR_Vallox setReading_FanSpeedMax slider,1,1,8
    attr MYSENSOR_Vallox setReading_FanSpeedMin slider,1,1,8
    attr MYSENSOR_Vallox stateFormat {sprintf "L├╝fterstufe: %d  Zuluft: %.0f  Abluft: %.0f  Au├čen: %.0f  Innen: %.0f", ReadingsVal($name,     "FanSpeed", 0), ReadingsVal($name, "TempIncomming", 0), ReadingsVal($name, "TempExhaust", 0), ReadingsVal($name, "TempOutside", 0), ReadingsVal($name, "TempInside", 0)}
    attr MYSENSOR_Vallox version 1.4.1
    #attr MYSENSOR_Vallox mapReading_Humidity 16 humidity
    #attr MYSENSOR_Vallox mapReading_BasicHumidityLevel 17 humidity
    #attr MYSENSOR_Vallox mapReading_HumiditySensor1 18 humidity
    #attr MYSENSOR_Vallox mapReading_HumiditySensor2 19 humidity
    #attr MYSENSOR_Vallox mapReading_CO2High 20 value1    
    #attr MYSENSOR_Vallox mapReading_CO2Low 21 value1
    #attr MYSENSOR_Vallox mapReading_CO2SetPointHigh 22 value1
    #attr MYSENSOR_Vallox mapReading_CO2SetPointLow 23 value1
    #attr MYSENSOR_Vallox mapReading_HeatingSetPoint 29 temperature
    #attr MYSENSOR_Vallox mapReading_PreHeatingSetPoint 30 temperature
    #attr MYSENSOR_Vallox mapReading_HrcBypassThreshold 31 temperature
    #attr MYSENSOR_Vallox mapReading_CellDefrostingThreshold 32 temperature
    #attr MYSENSOR_Vallox mapReading_AdjustmentIntervalMinutes 33 value1
    #attr MYSENSOR_Vallox mapReading_AutomaticHumidityLevelSeekerState 34 value1
    #attr MYSENSOR_Vallox mapReading_BoostSwitchMode 35 value1
    #attr MYSENSOR_Vallox mapReading_RadiatorType 36 value1
    #attr MYSENSOR_Vallox mapReading_CascadeAdjust 37 value1
    #attr MYSENSOR_Vallox mapReading_MaxSpeedLimitMode 38 value1
    #attr MYSENSOR_Vallox mapReading_ServiceReminder 39 value1    

    You can see that I commented out the CO2 Sensor and the humidity sensor ones.

    To control the device you need some further controls:

    define MYSENSOR_Vallox_FanSpeed dummy
    attr MYSENSOR_Vallox_FanSpeed alias L├╝fterstufe
    attr MYSENSOR_Vallox_FanSpeed devStateIcon 1:rc_1 2:rc_2 3:rc_3 4:rc_4 5:rc_5 6:rc_6 7:rc_7 8:rc_8
    attr MYSENSOR_Vallox_FanSpeed group L├╝ftung
    attr MYSENSOR_Vallox_FanSpeed icon vent_ventilation_control
    attr MYSENSOR_Vallox_FanSpeed room L├╝ftung
    attr MYSENSOR_Vallox_FanSpeed setList state:slider,1,1,8
    attr MYSENSOR_Vallox_FanSpeed webCmd state
    define MYSENSOR_Vallox_FanSpeed_Notify notify MYSENSOR_Vallox:FanSpeed:.* { my $d =   ReadingsVal("MYSENSOR_Vallox","FanSpeed", 1);; fhem("set MYSENSOR_Vallox_FanSpeed $d");;}
    define MYSENSOR_Vallox_FanSpeed_Notify2 notify MYSENSOR_Vallox_FanSpeed set MYSENSOR_Vallox FanSpeed %
    define MYSENSOR_Vallox_BoostSwitch dummy
    attr MYSENSOR_Vallox_BoostSwitch alias Sto├čl├╝ftung
    attr MYSENSOR_Vallox_BoostSwitch devStateIcon 0:vent_ventilation_level_0 15:vent_ventilation_level_1 30:vent_ventilation_level_2     45:vent_ventilation_level_3
    attr MYSENSOR_Vallox_BoostSwitch eventMap aus:0 kurz:15 mittel:30 lang:45
    attr MYSENSOR_Vallox_BoostSwitch group L├╝ftung
    attr MYSENSOR_Vallox_BoostSwitch icon vent_ventilation_level_manual_m
    attr MYSENSOR_Vallox_BoostSwitch room L├╝ftung
    attr MYSENSOR_Vallox_BoostSwitch setList state:aus,kurz,mittel,lang
    attr MYSENSOR_Vallox_BoostSwitch webCmd state
    define MYSENSOR_Vallox_BoostSwitch_Notify notify MYSENSOR_Vallox_BoostSwitch set MYSENSOR_Vallox BoostSwitch %
    define MYSENSOR_Vallox_BoostSwitch_Time dummy
    attr MYSENSOR_Vallox_BoostSwitch_Time alias Sto├čl├╝ftung min
    attr MYSENSOR_Vallox_BoostSwitch_Time group L├╝ftung
    attr MYSENSOR_Vallox_BoostSwitch_Time icon time_timer
    attr MYSENSOR_Vallox_BoostSwitch_Time room L├╝ftung
    define MYSENSOR_Vallox_BoostSwitch_Time_Notify notify MYSENSOR_Vallox:BoostSwitch:.* { my $d = sprintf ("%%.0f min", ReadingsVal("MYSENSOR_Vallox","BoostSwitch", 0));; fhem("set MYSENSOR_Vallox_BoostSwitch_Time $d");;}
    define MYSENSOR_Vallox_TempInside dummy
    attr MYSENSOR_Vallox_TempInside alias Temperatur Abluft
    attr MYSENSOR_Vallox_TempInside event-on-change-reading state
    attr MYSENSOR_Vallox_TempInside group Temperaturen
    attr MYSENSOR_Vallox_TempInside icon vent_used_air
    attr MYSENSOR_Vallox_TempInside room L├╝ftung
    define MYSENSOR_Vallox_TempInside_Notify notify MYSENSOR_Vallox:TempInside:.* { my $d = sprintf ("%%.0f C",     ReadingsVal("MYSENSOR_Vallox","TempInside", 0));; fhem("set MYSENSOR_Vallox_TempInside $d");;}
    define MYSENSOR_Vallox_TempOutside dummy
    attr MYSENSOR_Vallox_TempOutside alias Temperatur Frischluft
    attr MYSENSOR_Vallox_TempOutside event-on-change-reading state
    attr MYSENSOR_Vallox_TempOutside group Temperaturen
    attr MYSENSOR_Vallox_TempOutside icon vent_ambient_air
    attr MYSENSOR_Vallox_TempOutside room L├╝ftung
    define MYSENSOR_Vallox_TempOutside_Notify notify MYSENSOR_Vallox:TempOutside:.* { my $d = sprintf ("%%.0f C", ReadingsVal("MYSENSOR_Vallox","TempOutside", 0));; fhem("set MYSENSOR_Vallox_TempOutside $d");;}
    define MYSENSOR_Vallox_TempExhaust dummy
    attr MYSENSOR_Vallox_TempExhaust alias Temperatur Fortluft
    attr MYSENSOR_Vallox_TempExhaust event-on-change-reading state
    attr MYSENSOR_Vallox_TempExhaust group Temperaturen
    attr MYSENSOR_Vallox_TempExhaust icon vent_exhaust_air
    attr MYSENSOR_Vallox_TempExhaust room L├╝ftung
    define MYSENSOR_Vallox_TempExhaust_Notify notify MYSENSOR_Vallox:TempExhaust:.* { my $d = sprintf ("%%.0f C", ReadingsVal("MYSENSOR_Vallox","TempExhaust", 0));; fhem("set MYSENSOR_Vallox_TempExhaust $d");;}
    define MYSENSOR_Vallox_TempIncomming dummy
    attr MYSENSOR_Vallox_TempIncomming alias Temperatur Zuluft
    attr MYSENSOR_Vallox_TempIncomming event-on-change-reading state
    attr MYSENSOR_Vallox_TempIncomming group Temperaturen
    attr MYSENSOR_Vallox_TempIncomming icon vent_supply_air
    attr MYSENSOR_Vallox_TempIncomming room L├╝ftung
    define MYSENSOR_Vallox_TempIncomming_Notify notify MYSENSOR_Vallox:TempIncomming:.* { my $d = sprintf ("%%.0f C", ReadingsVal("MYSENSOR_Vallox","TempIncomming", 0));; fhem("set MYSENSOR_Vallox_TempIncomming $d");;}
    define MYSENSOR_Vallox_EfficiencyIn dummy
    attr MYSENSOR_Vallox_EfficiencyIn alias Effizienz Eingang
    attr MYSENSOR_Vallox_EfficiencyIn event-on-change-reading state
    attr MYSENSOR_Vallox_EfficiencyIn group Auswertung
    attr MYSENSOR_Vallox_EfficiencyIn icon vent_ambient_air
    attr MYSENSOR_Vallox_EfficiencyIn room L├╝ftung
    define MYSENSOR_Vallox_EfficiencyIn_Notify notify MYSENSOR_Vallox:EfficiencyIn:.* { my $d = sprintf ("%%.0f \%%", ReadingsVal("MYSENSOR_Vallox","EfficiencyIn", 0));; fhem("set MYSENSOR_Vallox_EfficiencyIn $d");;}
    define MYSENSOR_Vallox_EfficiencyOut dummy
    attr MYSENSOR_Vallox_EfficiencyOut alias Effizienz Ausgang
    attr MYSENSOR_Vallox_EfficiencyOut event-on-change-reading state
    attr MYSENSOR_Vallox_EfficiencyOut group Auswertung
    attr MYSENSOR_Vallox_EfficiencyOut icon vent_exhaust_air
    attr MYSENSOR_Vallox_EfficiencyOut room L├╝ftung
    define MYSENSOR_Vallox_EfficiencyOut_Notify notify MYSENSOR_Vallox:EfficiencyOut:.* { my $d = sprintf ("%%.0f \%%", ReadingsVal("MYSENSOR_Vallox","EfficiencyOut", 0));; fhem("set MYSENSOR_Vallox_EfficiencyOut $d");;}
    define MYSENSOR_Vallox_EfficiencyAverage dummy
    attr MYSENSOR_Vallox_EfficiencyAverage alias Effizienz
    attr MYSENSOR_Vallox_EfficiencyAverage event-on-change-reading state
    attr MYSENSOR_Vallox_EfficiencyAverage group Auswertung
    attr MYSENSOR_Vallox_EfficiencyAverage icon vent_bypass
    attr MYSENSOR_Vallox_EfficiencyAverage room L├╝ftung
    define MYSENSOR_Vallox_EfficiencyAverage_Notify notify MYSENSOR_Vallox:EfficiencyAverage:.* { my $d = sprintf ("%%.0f \%%", ReadingsVal("MYSENSOR_Vallox","EfficiencyAverage", 0));; fhem("set MYSENSOR_Vallox_EfficiencyAverage $d");;}

  • Hero Member

    BTW finding an appropriate housing for your sensors is not very easy. Housings should be nice and fit into their environment. Therefore I put my gateway in a sporty metal adidas housing:


    Later if found a sticker at the bottom of the box: "medium impact sports bra"!

  • Contest Winner

    @Heinz said:

    sporty metal adidas housing:

    I'd be worried about shorting against the walls of the can, and shielding my RF signals... But if it works and you like it... well there you go!

  • Hero Member

    there is an external antenna for the radio...

  • Contest Winner


    looked like a cable to me at first glance!!

  • @Heinz said:

    BTW finding an appropriate housing for your sensors is not very easy. Housings should be nice and fit into their environment...

    Hiding sensors in plain sight:


    One of my "Book-Sensors":

  • Hero Member

    The old book trick... very nice!

  • Hero Member

    After some months of testing a little update:
    I received some e-mails questioning the so called "heat recovery cell bypass" mode. There is a damper inside the device that can
    is switched automatically by the vallox-controller to bypass the heat recovery cell (HRC) to avoid heating up the house during the
    summer months. Well, when you open the device on a hot summer day you will probably see the damper in an obvious wrong position:
    the air does not bypass the HRC! Huh! whats wrong here?

    The device tries to cool down the incoming air by leading it through the HRC which is still colder than the temperature outside. If the temperature outside is colder than the air inside the house the damper is switched to the expected position. There are two things to you have to do to make all that work correctly:

    • turn off heating mode (the LED of the left most button on your control device must be off)
    • the HRC bypass temperature must be set to a value below the outside temperature (e.g. 14 degrees)

    To illustrate that effect I logged the temperatures in FHEM:


    Sorry for the german labels.
    The first plot shows the damper position: blue background: HRC bypass is active.
    The second plot shows the temperature outside the house (blue) and the temperature inside the house (red)

    As soon as the temperature outside is greater than the temperature inside the HRC bypass is deactivated to cool the incoming air by leading the air through the "colder" HRC.

    The fourth diagram shows the temperature of the air that is entering the rooms (purple) and the temperature outside the house (blue).
    You can see that the fresh air entering the rooms is lower than the temperature outside: the cooling effect works (even if it is only few degrees)

    To all guys thinking about how to control the damper on their own logic from a raspi or arduino. This is not neccessary as the vallox logic works very well.

  • Hero Member

    Some people asked if the library is able to control other parameters than the fan speed. The answer is yes. The following screenshot shows my sliders and buttons in FHEM:


    Sorry for the german labels again:
    The first group shows the power state (ON/OFF), the heating-state (winter season=ON, summer season=OFF) and the HRC damper position (inactive=OFF). See last post.

    The second group shows some alerts (none at the moment)
    the third group shows a button to switch between summer and winter season. The sliders control some temperature thresholds and other parameters.

    If you want to have a look at the bus data yourself you can download my sniffer tool which is a .Net port of the serial library described above under

  • Hardware Contributor

    @Heinz What Fhem plot style and font are you using?

  • Hero Member

    I modified the dark style. If you need the files I will upload em with a description how to integrate those.

  • Hardware Contributor

    @Heinz Yes please! I really liked those plots.

    I wouldn't mind it in german (as usual with Fhem stuff), but it's a lot easier for me with english.

  • Hero Member

    I simply copied the dark style of FHEM and named it dark2:

    copy the following files to your FHEM subfolder www/pgm2

    In your FHEM.cfg select this style for your WEB Frontend e.g.:
    define WEB FHEMWEB 8083 global
    attr WEB stylesheetPrefix dark2

    That's it.

    If you want to have other plot colours edit the files starting with dark2svg... I think it is self explaining.

  • Hero Member

    For those who want to have the FHEM files here they are:
    simply place the file in FHEM's subfolder FHEM and include it your fhem.cfg:

    include ./FHEM/_MYSENSOR_Vallox.cfg

    And here are the plot files which have to be placed in the subfolder www\gplot

    You will likely have to adapt the room and group names, and of course the german names, sorry for that.

  • Hardware Contributor

    Nice! Now I really want to buy a Vallox ... (and a house...)

  • Moin @Heinz,
    is it possible to use a RS485 USB-Stick ( instead of this construction? I've tried it with your .net Sniffer on my Windows PC and it worked well.


  • Hero Member

    You can use this rs485 to usb adapter to control the vallox device, no problem there. But do you intend to use your windows pc as controller then? Or do you want to use the stick directly with fhem? this would require some software which takes the serial telegrams and imports the values into fhem... or any other homeautomation controller.

  • No, the Windows PC was only for testing and verifying that the RS485 Connection workes well.

    My preferred solution would be this stick at the Raspberry Pi which is running the FHEM. Therefor I'd need a module to read the stream and interpret it in the FHEM format. Problem: I've never written a module. It would be possible somehow.. in some month. ­čśë

    The alternate solution would be your mysensor system. Especially because its running and tested. Problem: The Hardware. I have no experience in arduino and absolutly no idea how to build such a board. Thats why I thought I could plug the stick to an arduino and make it magicly work. ­čśë

    EDIT: Ok. It is easier than I thought to write this module. I'm working on it and the main functions should be finished this week. I'll publish it, if it is ready for testing.

  • Hero Member

    Ah ok I see. Probably you can get some help in the fhem forum. I also thought about doing this using a raspi... you could use the library to write a standalone exe which reads the serial stuff from usb and sets the values in fhem using the webinterface.

  • Hello, Thank you for this Tool. I have rebuild it but I get no Data in Fhem and the serial Monitor from Arduino. Can every one help me?
    This is the output from serial Monitor.

  • Hero Member

    here is my output:

    Opening port
    Port open
    Starting repeater (RNNRA-, 2.0.0)
    TSP:MSG:SEND 100-100-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc:
    TSP:MSG:READ 1-1-100 s=255,c=3,t=8,pt=1,l=1,sg=0:1
    TSP:MSG:FPAR RES (ID=1, dist=1)
    TSP:MSG:PAR OK (ID=1, dist=2)
    TSP:MSG:READ 0-0-100 s=255,c=3,t=8,pt=1,l=1,sg=0:0
    TSP:MSG:FPAR RES (ID=0, dist=0)
    TSP:MSG:PAR OK (ID=0, dist=1)
    TSP:MSG:READ 104-104-100 s=255,c=3,t=8,pt=1,l=1,sg=0:1
    TSP:MSG:FPAR RES (ID=104, dist=1)
    TSP:MSG:READ 1-1-100 s=255,c=3,t=8,pt=1,l=1,sg=0:1
    TSP:MSG:FPAR RES (ID=1, dist=1)
    TSM:CHKID:OK (ID=100)
    TSP:PING:SEND (dest=0)
    TSP:MSG:SEND 100-100-0-0 s=255,c=3,t=24,pt=1,l=1,sg=0,ft=0,st=ok:1
    TSP:MSG:READ 0-0-100 s=255,c=3,t=25,pt=1,l=1,sg=0:1
    TSP:MSG:PONG RECV (hops=1)
    TSP:MSG:SEND 100-100-0-0 s=255,c=3,t=15,pt=6,l=2,sg=0,ft=0,st=ok:0100
    !TSP:MSG:SEND 100-100-0-0 s=255,c=0,t=18,pt=0,l=5,sg=0,ft=0,st=fail:2.0.0
    TSP:MSG:SEND 100-100-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,ft=1,st=ok:0
    TSP:MSG:READ 0-0-100 s=255,c=3,t=6,pt=0,l=1,sg=0:M
    TSP:MSG:SEND 100-100-0-0 s=255,c=3,t=11,pt=0,l=15,sg=0,ft=0,st=ok:Vallox Digit SE
    TSP:MSG:SEND 100-100-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,ft=0,st=ok:2.5
    TSP:MSG:SEND 100-100-0-0 s=0,c=0,t=4,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=1,c=0,t=6,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=2,c=0,t=6,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=3,c=0,t=6,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=4,c=0,t=6,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=5,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=6,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=7,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=8,c=0,t=3,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=9,c=0,t=3,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=10,c=0,t=3,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=11,c=0,t=3,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=12,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=13,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=14,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=15,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=24,c=0,t=4,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=25,c=0,t=4,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=26,c=0,t=4,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=27,c=0,t=4,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=28,c=0,t=4,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=29,c=0,t=4,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=30,c=0,t=4,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=31,c=0,t=4,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=32,c=0,t=4,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=33,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=34,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=35,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=36,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=37,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=38,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=39,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=40,c=0,t=4,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=41,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=42,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=43,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=44,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=45,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=46,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=47,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=48,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 100-100-0-0 s=49,c=0,t=23,pt=0,l=0,sg=0,ft=0,st=ok:
    Started cyclic update timer.
    Request registration...
    TSP:MSG:SEND 100-100-0-0 s=255,c=3,t=26,pt=1,l=1,sg=0,ft=0,st=ok:2
    TSP:MSG:READ 0-0-100 s=255,c=3,t=27,pt=1,l=1,sg=0:1
    Node registration=1
    Init complete, id=100, parent=0, distance=1, registration=1
    Dropped 0
    Received telegram from 21->11 command=0 arg=A3
    Received telegram from 11->21 command=A3 arg=29
    Property 200 changed 41
    Power state 1
    TSP:MSG:SEND 100-100-0-0 s=8,c=1,t=2,pt=2,l=2,sg=0,ft=0,st=ok:1
    CO2 adjust state 0
    TSP:MSG:SEND 100-100-0-0 s=9,c=1,t=2,pt=2,l=2,sg=0,ft=0,st=ok:0
    Humidity adjust state 0
    TSP:MSG:SEND 100-100-0-0 s=10,c=1,t=2,pt=2,l=2,sg=0,ft=0,st=ok:0
    Heating state 1
    TSP:MSG:SEND 100-100-0-0 s=11,c=1,t=2,pt=2,l=2,sg=0,ft=0,st=ok:1
    Filter guard indicator 0
    TSP:MSG:SEND 100-100-0-0 s=12,c=1,t=24,pt=2,l=2,sg=0,ft=0,st=ok:0
    Heating indicator 1
    TSP:MSG:SEND 100-100-0-0 s=13,c=1,t=24,pt=2,l=2,sg=0,ft=0,st=ok:1
    Fault indicator 0
    TSP:MSG:SEND 100-100-0-0 s=14,c=1,t=24,pt=2,l=2,sg=0,ft=0,st=ok:0
    Serivce reminder indicator 0
    TSP:MSG:SEND 100-100-0-0 s=15,c=1,t=24,pt=2,l=2,sg=0,ft=0,st=ok:0
    Received telegram from 21->11 command=0 arg=29
    Received telegram from 11->21 command=29 arg=1
    Received telegram from 21->11 command=0 arg=35
    Received telegram from 11->21 command=35 arg=9D
    Temp incomming 19
    TSP:MSG:SEND 100-100-0-0 s=4,c=1,t=0,pt=2,l=2,sg=0,ft=0,st=ok:19
    Received telegram from 21->11 command=0 arg=71
    Received telegram from 11->21 command=71 arg=0
    Received telegram from 21->11 command=0 arg=A3
    Received telegram from 11->21 command=A3 arg=29

    This is the output of the mysensors 2.0 version which can be downloaded from

    I wonder why your node has id=0.

  • Hi, my output ist now:

    3 TSM:INIT
    4 TSF:WUR:MS=0
    13 TSF:SID:OK,ID=42
    15 TSM:FPAR
    52 TSF:MSG:SEND,42-42-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    2061 TSM:FPAR
    2098 TSF:MSG:SEND,42-42-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    4107 TSM:FPAR
    4143 TSF:MSG:SEND,42-42-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    6153 TSM:FPAR
    6189 TSF:MSG:SEND,42-42-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    8197 !TSM:FPAR:FAIL
    8198 TSM:FAIL:CNT=1
    8200 TSM:FAIL:PDT
    18203 TSM:FAIL:RE-INIT
    18205 TSM:INIT
    18212 TSM:INIT:TSP OK
    18214 TSF:SID:OK,ID=42
    18216 TSM:FPAR
    18253 TSF:MSG:SEND,42-42-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    20261 !TSM:FPAR:NO REPLY
    20263 TSM:FPAR
    20300 TSF:MSG:SEND,42-42-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    22307 !TSM:FPAR:NO REPLY
    22309 TSM:FPAR
    22346 TSF:MSG:SEND,42-42-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    24353 !TSM:FPAR:NO REPLY
    24355 TSM:FPAR
    24392 TSF:MSG:SEND,42-42-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:

    I get no reply from the Vallox.
    Is your original Vallox controller online

  • Hero Member

    The "no reply" message is from the mysensors library, but I don't know what it means.
    The line "started cyclic update timer" indicates that the sensor initialized successfully, but it is missing in your output.

    My latest code is online at

  • Admin

    Use the log parser to help you interpret the log.

  • @heinz
    Hi Heinz, the SVG_FileLog_Vallox_#.gplot files are empty ...probably the link is dead...could you reup them? Or could you send them tio me?

    Thanks, Holger

  • @heinz
    Sorry...everything is fine with the gplot was my fault trying to look at them with the crimpson editor...instead of FHEM gplot

  • Hello Heinz, all,
    first of all thank you for sharing your work in this thread!
    I have not to much skills around programming and arduino, but was however able to build this and integrate my Vallox 90 SE into ioBroker. Absolutely Great!
    You mentioned the bypass damper above and I see you have visualized it in fhem. I found the Value to set the Threshold temp for this (31), however I wonder where you got the actual bypass position from. Which Value shows if its open or closed?
    I do not want to control it, i just would like to log the Position Status to see when it happens.

    Thanks a lot i feel blind ­čÖé

  • Hero Member

    Hi @captaindork
    sorry for delay,.... the position of the damper (which is the bypass) is indicated through a single bit of the multi purpose IO-Port 2. The library defines that as property 38 DamperMotorPositionProperty.
    In the mysensors example it is published as
    const uint8_t DAMPER_MOTOR_POSITION = 42;
    The value is either 1 or 0.

    I mapped it in FHEM as follows

    attr MYSENSOR_Vallox mapReading_DamperMotorPosition 42 value1
    define MYSENSOR_Vallox_DamperMotorPosition dummy
    attr MYSENSOR_Vallox_DamperMotorPosition alias WRG-Bypass
    attr MYSENSOR_Vallox_DamperMotorPosition devStateIcon 1:rc_GREEN 0:rc_BLANK
    attr MYSENSOR_Vallox_DamperMotorPosition event-on-update-reading state
    attr MYSENSOR_Vallox_DamperMotorPosition group Status
    attr MYSENSOR_Vallox_DamperMotorPosition icon vent_bypass
    attr MYSENSOR_Vallox_DamperMotorPosition room L├╝ftung
    attr MYSENSOR_Vallox_DamperMotorPosition sortby 3
    define MYSENSOR_Vallox_DamperMotorPosition_Notify notify MYSENSOR_Vallox:DamperMotorPosition:.* { my $d = sprintf ("%.0f", ReadingsVal("MYSENSOR_Vallox","DamperMotorPosition", 0));; fhem("set MYSENSOR_Vallox_DamperMotorPosition $d");;}
    define MYSENSOR_Vallox_DamperMotorPosition_Notify2 at +*00:01:00 { my $d = sprintf "%.0f", ReadingsVal("MYSENSOR_Vallox","DamperMotorPosition", 0);; fhem("set MYSENSOR_Vallox_DamperMotorPosition $d");;}

  • Hi.

    Can you make exact parts list for this setup.

  • Hero Member

    Ok ... after my holidays.

  • Hero Member

    Well basically the part list is very simple

    1x Arduino Mega 2560
    1x NRF24L01+
    1x Pushbutton
    2x MAX485 Module TTL Switch Module (one for sender, one for receiver)

    The 1x Resistor 120Ohms is only neccessary if not already mounted on the MAX485 Module. It depends on what module
    you bought. So have a look at the layout and check if there is a 120Ohms resistor mounted between pins A and B.
    The module ( already contains that resistor.

    Optionally you can add a capacitor between + and - to stabilize the voltage level if your power supply is a weak one.
    Anyone will do like 10uF, 100uF...

  • Hero Member

    Note that you can make use of any MAX485 module that is suitable for the arduino (5V). Basically they are all the same except for a few minor tweaks like LEDs or other non relevant stuff.

  • I found this old thread and since I have a Vallox machine it's interesting. RS485 is new to me but MySensors isn't.

    Can I have a node like this described by Heinz parallel with the "mickey mouse"-display? Using the display's connector? Or is it one or the other?

    I'd feel better having both (manual display&buttons and connection to MySensors=>Domoticz, in my case).

Log in to reply

Suggested Topics