Hey,
just wanted to share how I managed to control my vaillant heating.
All I was knowing is, that my roomthermostat communicates via a bus called “ebus” with the main heating system.
After some research I found this shop with ready2use adapters. (75- 140€).
If it should be cheaper, this post in a german forum is the right point to start with building a adapter by yourself. There is a complete parts list (reichelt) and a lot helpfully infos.
The costs amount for all parts with hosing is less than 20€
On the software side I use ebusd by john30
https://github.com/john30
wiki with infos how to insall and how to use
https://github.com/john30/ebusd/wiki
Now I am able to see what is going on inside the heating and also to send commands by pimatic.


- 1 is a ShellPresenceSensor to show ebusd service presence. When pimatic restarts the ebusd doesn`t work any more. I use some rules to kill and start it again.
{
"id": "ebusd_presence",
"name": "ebusd",
"class": "ShellPresenceSensor",
"interval": 10000,
"command": "pgrep ebusd >/dev/null && echo 1 || echo 0"
}
rules:
if pimatic is starting then execute \"sudo service ebusd stop\" and after 5 seconds execute \"sudo killall ebusd\" and after 7 seconds execute \"sudo killall ebusctl\"
if ebusd_presence is absent for 10 seconds then execute \"sudo ebusd -c /etc/ebusd -d /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_AI03U6OL-if00-port0\"
- 2 is a ShellPresenceSensor to show flame presence
{
"id": "vaillant_flame_presence",
"name": "Flamme",
"class": "ShellPresenceSensor",
"interval": 10000,
"command": "ebusctl read sdflame | head -1 | sed 's/on/1/g' | sed 's/off/0/g'"
},
- 3 and **4 **are VariablesDevices. 1-3x in the week the “ebusctl read” gets wrong values for the roomtemperature ( over 1000°C or -150°C) and the graph looks very ugly. To prevent that I use the pimatic-filter-plugin, which does a great job.
{
"id": "vaillant_info",
"name": "Info",
"class": "VariablesDevice",
"variables": [
{
"name": "Wohnzimmer_soll",
"expression": "$vaillant-heating.temperatureSetpoint",
"type": "number",
"unit": "°C",
"label": "Wohnzimmer-Soll",
"acronym": "WZsoll"
},
{
"name": "Wohnzimmer_ist",
"expression": "$filter2-raum.temperature",
"type": "number",
"unit": "°C",
"label": "Wohnzimmer-Ist",
"acronym": "WZist"
},
{
"name": "WW Solltemperatur",
"expression": "$vaillant-warmwasser.temperatureSetpoint",
"type": "number",
"unit": "°C",
"label": "WW-Soll",
"acronym": "WWsoll"
},
{
"name": "WW Speicher",
"expression": "$filter2-speicher.temperature",
"type": "number",
"unit": "°C",
"label": "Speicher-Ist",
"acronym": "WWist"
}
]
},
{
"id": "vaillant_raum_temp",
"name": "Wohnzimmer Raumtemperatur",
"xBoostLabel": "Off",
"class": "ShellSensor",
"attributeName": "vaillant_room_temp",
"attributeType": "number",
"attributeUnit": "°C",
"interval": 300000,
"command": "ebusctl read DisplayedRoomTemp"
},
{
"class": "SimpleTruncatedMeanFilter",
"id": "filter2-raum",
"name": "Raum-f2",
"size": 5,
"output": {
"name": "temperature",
"label": "Raum",
"expression": "$vaillant_raum_temp.vaillant_room_temp",
"acronym": "T",
"type": "number",
"unit": "°C"
}
},
- 5 and 6 are Shellswitches for turn on/off heating and warm water
{
"id": "vaillant_heizung",
"name": "Vaillant Heizung",
"class": "ShellSwitch",
"onCommand": "ebusctl write -c 430 Hc1OPMode manual >/dev/null 2>&1",
"offCommand": "ebusctl write -c 430 Hc1OPMode off >/dev/null 2>&1"
},
{
"id": "vaillant_warmwasser",
"name": "Vaillant Warmwasser",
"class": "ShellSwitch",
"onCommand": "ebusctl write -c 430 HwcOPMode manual >/dev/null 2>&1",
"offCommand": "ebusctl write -c 430 HwcOPMode off >/dev/null 2>&1"
},
- 7 and 8 are DummyHeatingThermostats for changing the mode and the SetPoint temperature.
{
"class": "DummyHeatingThermostat",
"id": "vaillant-heating",
"name": "Heizkreislauf",
"comfyTemp": 21,
"ecoTemp": 17,
"guiShowModeControl": true,
"guiShowPresetControl": true
},
{
"class": "DummyHeatingThermostat",
"id": "vaillant-warmwasser",
"name": "Warmwasser",
"comfyTemp": 55,
"ecoTemp": 45,
"guiShowModeControl": true,
"guiShowPresetControl": true,
"guiShowTemperatueInput": true
},
rules:
if $start = 1 and $vaillant-heating.temperatureSetpoint changes then execute \"ebusctl write -c 430 Hc1ManualOPRoomTempDesired\t$vaillant-heating.temperatureSetpoint\"
if $start = 1 and $vaillant-heating.mode changes and $vaillant-heating.mode = \"auto\" then execute \"ebusctl write -c 430 Hc1OPMode auto\"
if $start = 1 and $vaillant-heating.mode changes and $vaillant-heating.mode = \"manu\" then execute \"ebusctl write -c 430 Hc1OPMode manual\"
- 9 are ButtonDevices to turn on warm water for 30 minutes and set the temperture to 45°C or 55°C.
{
"id": "vaillant-buttons",
"name": "Vaillant",
"class": "ButtonsDevice",
"buttons": [
{
"id": "vaillant-baden",
"text": "Baden 55°"
},
{
"id": "vaillant-duschen",
"text": "Duschen 45°"
}
]
},
rules:
if its 6:15 then press vaillant-duschen
if $start = 1 and vaillant-duschen is pressed then execute \"ebusctl write -c 430 HwcManualOPTempDesired 45\" and turn vaillant_warmwasser on for 30 minutes and set $vaillant_warmwasser_soll = 45
if $start = 1 and vaillant-baden is pressed then execute \"ebusctl write -c 430 HwcManualOPTempDesired 55\" and turn vaillant_warmwasser on for 30 minutes and set $vaillant_warmwasser_soll = 55 and after 31 minutes execute \"ebusctl write -c 430 HwcManualOPTempDesired 45\" and after 30 minutes set $vaillant_warmwasser_soll = 45
Have fun 
magic-tune
Nice to see that someone else is controlling a central heating system with pimatic.
). But it should also work with v9. Pimatic v.9 is more user friendly and supports autodicovery. It is so easy to add devices on the fly.