Shelly Wall Display Thermostat Steuerung in openHAB via MQTT

Dies ist eine Schritt für Schritt Anleitung, wie man ein Shelly Walldisplay im Thermostat Mode in openHAB via MQTT integriert. Steuerbar ist es dann von beiden Seiten, inkl Nachtabsenkung, Booster Mode und Abwesenheitsmodus.
Voraussetzungen
- Shelly Wall Display (X2, XL)
- openHAB Installation mit MQTT Broker
- MQTT Explorer oder anderen MQTT Client
Schritte
- Aktivieren des Thermostat Modus auf dem Shelly Wall Display
- Anlegen von 5 Thermostat Zeitplan Profilen (Normal, Urlaub, Booster, SG-Green, Nacht - jeweils Zeitplan 0:00 - 0:00 Uhr)
- Verbindung des Wall Displays an den MQTT Broker
- Auslesen der Wall Display Thermostat
rule_idfür jeden Zeitplan - Anlage Shelly Wall Display MQTT Thing in openHAB
- Installation des Thermostat List Widget in openHAB
- Erstellung aller Thermostat Items in openHAB
- Installation der Thermostat Block Library in openHAB
- Erstellung der Thermostat Regel in openHAB
Shelly Wall Display konfigurieren
Aktiviert auf dem Shelly Wall Display als erstes den Thermostat Modus unter den Einstellungen. Dann aktiviert den Thermostat Scheduler. Dort benennt ihr als erstes die bereits angelegte Regel (hat profile_id 0) in "Fenster offen" um. Dann gebt ihr einen Zeitplan der jeden Tag von 0:00 - 0:00 Uhr geht. Anschließend legt ihr genau in dieser Reihenfolge und ebenfalls mit Zeitplan 0:00 - 0:00 Uhr diese Profile an:
- Urlaub (hat dann profile_id 1)
- Booster (hat dann profile_id 2)
- SG-Green (hat dann profile_id 3)
- Nacht (hat dann profile_id 4)
Nun geht ihr in die Netzwerk Einstellungen und aktiviert und konfiguriert MQTT. Aktiviert hier auf jeden Fall:
- RPC status notifications over MQTT
- Generic status update over MQTT
Wenn alles geklappt hat sollte MQTT als verbunden angezeigt werden und die ersten Werte am Broker ankommen. Am besten mit dem MQTT Explorer prüfen.
Hinweis: MQTT kann momentan auf den Wall Displays keine SSL Verschlüsselung, also nutzt die unverschlüsselte.
Thermostat Schedule rule_id auslesen
Um im MQTT Thing die richtigen Werte für die Booster, Nacht und Abwesenheitstemperatur zu setzen, benötigen wir die rule_id des jeweiligen Zeitplans. Diese sind leider unique und müssen deshalb ausgelesen werden. Die Zeitplan IDs selbst sind einfach von 0-4, also in der Reihenfolge wie ihr sie anlegt.
Das ganze machen wir nun einfach via MQTT (MQTT Explorer) dafür schicken wir an das shelly device an /rpc einen kleinen JSON formatierten Befehl. Im MQTT Explorer könnt ihr einfach bei Publish den Topic <topic2shellydevice>/rpc eintragen und das folgende JSON als Subject einfügen.
Beispiel Topic: shelly/shelly-wd-gz/rpc
{
"id": 102,
"src": "cli",
"method": "Thermostat.Schedule.ListRules",
"params": {
"id": 0,
"profile_id": 0
}
}
nach dem absenden solltet ihr im MQTT Explorer einen neuen Topic mit cli/rpc finden, das ist nun der output des Shelly mit der rule_id:
{"id":102,"dst":"cli","src":"ShellyWallDisplay-000334425745","result":{"rules":[{"rule_id":"1763576806251","enable":true,"target_C":20.5,"profile_id":0,"timespec":"* 0 0 * * MON,TUE,WED,THU,FRI,SAT,SUN"}]}}
hier im Beispiel: "rule_id":"1763576806251"
Schreibt euch die rule_id irgendwo am besten in eine Datei, ihr benötigt sie später beim openHAB Thing.
Das wiederholt ihr bitte für alle profile_id: 1-4
// Rule mit id 0 auslesen
{"id":102,"src":"cli","method":"Thermostat.Schedule.ListRules",
"params":{"id":0,"profile_id":0}}
// Rule mit id 1 auslesen
{"id":103,"src":"cli","method":"Thermostat.Schedule.ListRules",
"params":{"id":0,"profile_id":1}}
// Rule mit id 2 auslesen
{"id":103,"src":"cli","method":"Thermostat.Schedule.ListRules",
"params":{"id":0,"profile_id":2}}
// Rule mit id 3 auslesen
{"id":103,"src":"cli","method":"Thermostat.Schedule.ListRules",
"params":{"id":0,"profile_id":3}}
// Rule mit id 4 auslesen
{"id":103,"src":"cli","method":"Thermostat.Schedule.ListRules",
"params":{"id":0,"profile_id":4}}
Hinweis: wenn ihr das JSON nutzt bekommt ihr ersteinmal sicherheitshalber die Profil Liste mit den Profil IDs:
// Rule Ids auslesen
{"id":101,"src":"cli","method":"Thermostat.Schedule.ListProfiles","params":{"id":0}}
der output sollte dann so aussehen:
{"id":101,"dst":"cli","src":"ShellyWallDisplay-000332225745","result":{"profiles":[{"id":0,"name":"Normal"},{"id":1,"name":"Urlaub"},{"id":2,"name":"Booster"},{"id":3,"name":"SG-Green"},{"id":4,"name":"Nacht"}]}}
openHAB Generic MQTT Thing
Nachdem wir nun wissen wie unsere rule_ids sind, legen wir in openHAB ein neues "Generic MQTT Thing" an. Voraussetzung ist, das ihr bereits euren MQTT Broker als Thing eingerichtet habt. Wenn nicht legt ihn als erstes an.
Ich mache das alles immer über die openHAB Main UI:
- wählt den Broker aus
- benennt das Thing wie immer ihr möchtet
- und geht auf erstellen.
Nach dem erstellen wechselt in den Code Tab, hier sollte in etwas das hier stehen:
UID: mqtt:topic:09000f9f:39af009189
label: Shelly Wall Display Badezimmer MQTT
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:09000f9f
das erweitern wir nun um folgende Channels und um den Health Check des Things:
configuration:
payloadNotAvailable: "false"
availabilityTopic: shelly/shelly-wd-bz/online
payloadAvailable: "true"
channels:
- id: relay#output
channelTypeUID: mqtt:switch
label: Betrieb
description: Betrieb (on/off)
configuration:
stateTopic: shelly/shelly-wd-bz/status/switch:0
transformationPattern:
- JSONPATH:$.output
off: "false"
on: "true"
- id: thermostat#switch
channelTypeUID: mqtt:switch
label: Thermostat Betrieb
description: Thermostat Betrieb (on/off)
configuration:
commandTopic: shelly/shelly-wd-bz/rpc
formatBeforePublish: '{"id":1,"src":"shelly/shelly-wd-bz/oh","method":"Thermostat.SetConfig","params":{"id":0,"config":{"enable":%s}}}'
stateTopic: shelly/shelly-wd-bz/status/thermostat:0
transformationPattern:
- JSONPATH:$.enable
off: "false"
on: "true"
- id: thermostat#setpoint
channelTypeUID: mqtt:number
label: Solltemperatur
description: Solltemperatur in °C
configuration:
unit: °C
min: 18
formatBeforePublish: '{"id": 1,"src": "shelly/shelly-wd-bz/oh","method":
"Thermostat.SetConfig","params": {"id": 0,"config": {"target_C": %f}}}'
max: 30
commandTopic: shelly/shelly-wd-bz/rpc
step: 0.1
stateTopic: shelly/shelly-wd-bz/status/thermostat:0
transformationPattern:
- JSONPATH:$.target_C
- id: thermostat#hysterese
channelTypeUID: mqtt:number
label: Hysterese
description: Solltemperatur in °C
configuration:
commandTopic: shelly/shelly-wd-bz/rpc
unit: °C
step: 0.1
min: 0
formatBeforePublish: '{"id": 1,"src": "shelly/shelly-wd-bz/oh","method":
"Thermostat.SetConfig","params": {"id": 0,"config": {"hysteresis":
%f}}}'
max: 2
- id: thermostat#schedule
channelTypeUID: mqtt:switch
label: Zeitplan
description: Zeitplan (on/off)
configuration:
commandTopic: shelly/shelly-wd-bz/rpc
formatBeforePublish: '{"id":1,"src":"shelly/shelly-wd-bz/oh","method":"Thermostat.Schedule.SetConfig","params":{"id":0,"config":{"enable":%s}}}'
stateTopic: shelly/shelly-wd-bz/status/thermostat:0
transformationPattern:
- JSONPATH:$.schedules.enable
off: "false"
on: "true"
- id: thermostat#scheduleprofile
channelTypeUID: mqtt:number
label: Zeitplan Profil
description: Zeitplan Profil
configuration:
commandTopic: shelly/shelly-wd-bz/rpc
formatBeforePublish: '{"id":1,"src":"shelly/shelly-wd-bz/oh","method":"Thermostat.Schedule.SetConfig","params":{"id":0,"config":{"profile_id":%.0f}}}'
stateTopic: shelly/shelly-wd-bz/status/thermostat:0
transformationPattern:
- JSONPATH:$.schedules.profile_id
- id: thermostat#night_temperature
channelTypeUID: mqtt:number
label: Nacht Temperatur
description: Nachttemperatur in °C
configuration:
commandTopic: shelly/shelly-wd-bz/rpc
unit: °C
step: 0.5
min: 18
formatBeforePublish: '{"id": 10,"src": "shelly/shelly-wd-bz/oh","method":
"Thermostat.Schedule.ChangeRule","params": {"id": 0, "config":
{"rule_id": 1759776161044,"target_C": %f}}}'
max: 30
- id: thermostat#booster_temperature
channelTypeUID: mqtt:number
label: Booster Temperatur
description: Booster Temperatur in °C
configuration:
commandTopic: shelly/shelly-wd-bz/rpc
unit: °C
step: 0.5
min: 18
formatBeforePublish: '{"id": 10,"src": "shelly/shelly-wd-bz/oh","method":
"Thermostat.Schedule.ChangeRule","params": {"id": 0, "config":
{"rule_id": 1759776123067,"target_C": %f}}}'
max: 30
- id: thermostat#sggreen_temperature
channelTypeUID: mqtt:number
label: SG Green Temperatur
description: SG-Green Temperatur in °C
configuration:
commandTopic: shelly/shelly-wd-bz/rpc
unit: °C
step: 0.5
min: 18
formatBeforePublish: '{"id": 10,"src": "shelly/shelly-wd-bz/oh","method":
"Thermostat.Schedule.ChangeRule","params": {"id": 0, "config":
{"rule_id": 1763576825406,"target_C": %f}}}'
max: 30
- id: thermostat#absence_temperature
channelTypeUID: mqtt:number
label: Abwesenheit Temperatur
description: Abwesenheit Temperatur in °C
configuration:
commandTopic: shelly/shelly-wd-bz/rpc
unit: °C
step: 0.5
min: 18
formatBeforePublish: '{"id": 10,"src": "shelly/shelly-wd-bz/oh","method":
"Thermostat.Schedule.ChangeRule","params": {"id": 0, "config":
{"rule_id": 1759776096557,"target_C": %f}}}'
max: 30
- id: thermostat#windowopen_temperature
channelTypeUID: mqtt:number
label: Fenster offen Temperatur
description: Fenster offen Temperatur in °C
configuration:
commandTopic: shelly/shelly-wd-bz/rpc
unit: °C
step: 0.5
min: 18
formatBeforePublish: '{"id": 10,"src": "shelly/shelly-wd-bz/oh","method":
"Thermostat.Schedule.ChangeRule","params": {"id": 0, "config":
{"rule_id": 1763576806251,"target_C": %f}}}'
max: 30
- id: thermostat#basistemp
channelTypeUID: mqtt:number
label: Basis-Solltemperatur
description: Manuelle Temperatur ohne Profil
configuration:
stateTopic: shelly/shelly-wd-bz/oh/rpc
transformationPattern:
- JSONPATH:$.result.target_C
- id: sensor#temperature
channelTypeUID: mqtt:number
label: Temperatur
description: Temperatur in °C
configuration:
stateTopic: shelly/shelly-wd-bz/status/temperature:0
transformationPattern:
- JSONPATH:$.tC
unit: °C
- id: sensor#humidity
channelTypeUID: mqtt:number
label: Luftfeuchtigkeit
description: Luftfeuchtigkeit in %
configuration:
stateTopic: shelly/shelly-wd-bz/status/humidity:0
transformationPattern:
- JSONPATH:$.rh
unit: "%"
- id: sensor#illuminance
channelTypeUID: mqtt:number
label: Beleuchtungsstärke
description: Beleuchtungsstärke in Lux
configuration:
stateTopic: shelly/shelly-wd-bz/status/illuminance:0
transformationPattern:
- JSONPATH:$.lux
unit: lx
- id: sensor#battery
channelTypeUID: mqtt:number
label: Batterieladung
description: Batterieladung in %
configuration:
stateTopic: shelly/shelly-wd-bz/status/devicepower:1
transformationPattern:
- JSONPATH:$.battery.percent
unit: "%"
nun kommt die erste Bastelarbeit:
- ersetzt überall die Stellen (Topics) wo
shelly/shelly-wd-gzgegen euer Topic vom Wall Display. - tragt bei den Thermostat Profilen eure, richtige
rule_idein ("rule_id": 1759776096557):Das komplette .yaml findet ihr auch hier https://github.com/alaub81/openHAB/blob/master/conf/things/shelly_walldisplay_mqtt.yml- id: thermostat#night_temperature ... formatBeforePublish: '{"id": 10,"src": "shelly/shelly-wd-bz/oh","method": "Thermostat.Schedule.ChangeRule","params": {"id": 0, "config": {"rule_id": 1759776161044,"target_C": %f}}}' ... - id: thermostat#booster_temperature ... formatBeforePublish: '{"id": 10,"src": "shelly/shelly-wd-bz/oh","method": "Thermostat.Schedule.ChangeRule","params": {"id": 0, "config": {"rule_id": 1759776123067,"target_C": %f}}}' ... - id: thermostat#sggreen_temperature ... formatBeforePublish: '{"id": 10,"src": "shelly/shelly-wd-bz/oh","method": "Thermostat.Schedule.ChangeRule","params": {"id": 0, "config": {"rule_id": 1763576825406,"target_C": %f}}}' ... - id: thermostat#absence_temperature ... formatBeforePublish: '{"id": 10,"src": "shelly/shelly-wd-bz/oh","method": "Thermostat.Schedule.ChangeRule","params": {"id": 0, "config": {"rule_id": 1759776096557,"target_C": %f}}}' - id: thermostat#normal_temperature ... formatBeforePublish: '{"id": 10,"src": "shelly/shelly-wd-bz/oh","method": "Thermostat.Schedule.ChangeRule","params": {"id": 0, "config": {"rule_id": 1763576806251,"target_C": %f}}}'
- speichern und das THING ist erst einmal angelegt.
Installation des openHAB Thermostat List Widget
Ich habe ein kleines Thermostat List Widget gebaut. Das könnt ihr direkt verwenden, ihr müsst es nur bei den Entwickler Tools in openHAB via copy and paste installieren.
Eine Anleitung dazu findet ihr hier, verwendet aber das thermostat_wd_widget.yml:
Den Code Widget Code für das geänderte Widget für das Wall Display hier:
openHAB Thermostat Items anlegen
nun braucht ihr einige Items für eure Thermostat Steuerung, nehmt dafür einfach meine .items Vorlage. Entweder importiert ihr sie, aber Achtung, der Main UI Importer unter den Entwicklertools supported noch nicht alles, ihr müsst da auf jeden Fall nacharbeiten. Ich würde empfehlen einfach pro Thermostat, eine .items Datei abzulegen.
Ladet die Datei am besten herunter und bearbeitet sie nach euren wünschen - wenigstens das hier:
- Mit Suchen und Ersetzen könnt ihr
Badezimmerin was auch immer umbenennen - Dann die UID des MQTT Thing ändern, dafür
mqtt:topic:09000f9f:1479c8706bgegen die eure UID austauschen, diese bekommt ihr im MainUI unter Things, dann COPY UID. - Ändert noch beim Group Item den Ort
FF_BATHROOM
Das sollte reichen und ihr solltet nun alle Items bei euch in openHAB sehen. Die Sensoren sollten zudem nach ein paar Minuten Werte liefern, alles andere müsst ihr später einstellen.
Möchtet ihr die Items händisch anlegen, benötigt ihr auf jeden Fall Items für:
- Temperatur
- Luftfeuchtigkeit
- Heizungsventil Betrieb
- Thermostat Betrieb
- Thermostat Solltemperatur
- Solltemperatur (Basis)
- Solltemperatur (effektiv)
- Walldisplay Thermostat Zeitplan Betrieb
- Walldisplay Thermostat Zeitplan Profil
die anderen Items sind mehr oder weniger optional:
- Beleuchtungsstärke
- Batterieladung
- Thermostat Hysterese
- Thermostat Absenkzeit
- Thermostat Normalbetriebzeit
- Solltemperatur (Abwesenheit)
- Solltemperatur (Booster)
- Solltemperatur (Nacht)
- Solltemperatur (SG-Green)
- Solltemperatur (Fenster offen)
- Fußbodenheizung Booster
- Heizung Smart-Grid Modus
openHAB Thermostat Block Library installieren
Um euch das Leben einfacher zu machen, habe ich ein Regelwerk in Form einer openHAB Block Library gebaut Diese bringt die folgenden Features mit:
- Thermostat-Item ≠ ON wird die gesamte Regel übersprungen.
- Flexible Eingaben (Simulation möglich)
- Für PRESENCE, BOOSTER, SG_MODE, NIGHTSTART_ITEM, NIGHTSTOP_ITEM:
- Kannst du entweder Item-Namen oder direkte Texte übergeben ("OFF", "ON", "green", "22:00" …).
- Leere / ungültige Eingaben bekommen sinnvolle Defaults:
- Präsenz → ON
- Booster → OFF
- SG-Modus → orange
- Nachtzeiten → deaktiviert
- Für PRESENCE, BOOSTER, SG_MODE, NIGHTSTART_ITEM, NIGHTSTOP_ITEM:
- Booster-Logik
- Wenn Booster = ON:
- Zeitplan-Switch wird eingeschaltet.
- Es wird dein Booster-Profil (Profil-ID 2) auf dem Walldisplay gesetzt.
- Abwesenheit / SG / Nacht / Fenster werden komplett übersprungen.
- Wenn Booster = ON:
- Fenster-Logik
- Optionaler Fensterkontakt:
- Fenster offen → Profil 0 aktivieren + Fenster-Sollwert schreiben.
- Fenster zu → Logik läuft normal weiter.
- Fenster-Sollwert wird aus Basis-Sollwert - Fensterabsenkung berechnet.
- Schreibt:
- Effektiv-Sollwert
- Fenster-Setpoint-Item.
- Optionaler Fensterkontakt:
- Abwesenheits-Logik
- Wenn Präsenz = OFF und SG = red:
- Profil 1 (Abwesenheit) aktiv.
- Effektiv- und Abwesenheits-Sollwert = Basis - Abwesenheitsabsenkung.
- Wenn Präsenz = OFF und SG = red:
- SG-Green-Logik
- SG = green:
- Profil 3 (SG-Green) aktiv.
- Effektiv- und SG-Green-Sollwert = Basis + SG-Green-Erhöhung.
- Gilt sowohl bei Anwesenheit als auch bei Abwesenheit (mit anderer Zweig-Logik).
- SG = green:
- Nachtabsenkung
- Nachtstart/-ende können DateTime-Items oder Textzeiten sein.
- Ermittelt anhand aktueller Uhrzeit, ob in der Nachtphase:
- In Nacht → Profil 4, Effektiv- und Nacht-Sollwert = Basis - Nachtabsenkung.
- Sonst → Normalbetrieb.
- Normalbetrieb
- Wenn keine Abwesenheit/SG/Nacht/Fenster greifen:
- Zeitplan wird deaktiviert.
- Effektiv-Sollwert = Normal-Sollwert.
- Wenn keine Abwesenheit/SG/Nacht/Fenster greifen:
- Logging / Debug
- Konfigurierbares Loglevel im Block: info, warn, error, debug.
- Ausführliches Logging der Eingaben (normalized), Profile und berechneten Temperaturen.
ihr könnt die Block Library aus meinem GitHub Repository nehmen:
Importiert sie einfach unter den Entwickler Tools --> Block Libraries via copy and paste.
openHAB Thermostat Regel
Nun erstellt ihr in openHAB eine neue Regel: Fußbodenheizung Badezimmer
Lasst sie durch folgendes triggern:
- Thermostat Betrieb Item, Changed state
- Thermostat Solltemperatur, Changed state
- Thermostat Nachtabsenkzeit, Item Uhrzeit (Time only)
- Thermostat Normalbetriebszeit, Item Uhrzeit (Time only)
- Anwesenheits Item, Changed state
- SmartGrid Item, Changed state
- Booster Item, Changed state
- Fenster Item, Changed state
Dann bei "then" eine neues Inline Script designed with Blockly. Dort fügt ihr dann die Block Library ein und füllt die Items und Felder nach euren Wünschen:
Mehrere Fenster in einem Raum
Falls ihr mehrere Fenster in einem Raum habt, könnt ihr diese einfach mittels LIST Block einfügen:
Amazon Alexa und Apple Home Thermostat
wenn ihr meine items Konfiguration genutzt habt, solltet ihr nun auch in Apple Home und Amazon Alexa Thermostate angezeigt bekommen. Ihr könnt nun auch per Sprachbefehl die Temperatur einstellen.
Weiteres...
Entnehmt weiteres, wie zum Beispiel den Booster oder die Heizungssteuerung aus diesem Artikel: