Zum Inhalt springen

Shelly Wall Display Thermostat Steuerung in openHAB via MQTT

Aus LHlab Wiki
Shelly Walldisplay Thermostat

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

Schritte

  1. Aktivieren des Thermostat Modus auf dem Shelly Wall Display
  2. Anlegen von 5 Thermostat Zeitplan Profilen (Normal, Urlaub, Booster, SG-Green, Nacht - jeweils Zeitplan 0:00 - 0:00 Uhr)
  3. Verbindung des Wall Displays an den MQTT Broker
  4. Auslesen der Wall Display Thermostat rule_id für jeden Zeitplan
  5. Anlage Shelly Wall Display MQTT Thing in openHAB
  6. Installation des Thermostat List Widget in openHAB
  7. Erstellung aller Thermostat Items in openHAB
  8. Installation der Thermostat Block Library in openHAB
  9. 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:

  1. ersetzt überall die Stellen (Topics) wo shelly/shelly-wd-gz gegen euer Topic vom Wall Display.
  2. tragt bei den Thermostat Profilen eure, richtige rule_id ein ("rule_id": 1759776096557):
      - 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}}}'
    
    Das komplette .yaml findet ihr auch hier https://github.com/alaub81/openHAB/blob/master/conf/things/shelly_walldisplay_mqtt.yml
  3. speichern und das THING ist erst einmal angelegt.

Installation des openHAB Thermostat List Widget

OpenHAB Thermostat 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 Badezimmer in was auch immer umbenennen
  • Dann die UID des MQTT Thing ändern, dafür mqtt:topic:09000f9f:1479c8706b gegen 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
  • 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.
  • 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.
  • Abwesenheits-Logik
    • Wenn Präsenz = OFF und SG = red:
      • Profil 1 (Abwesenheit) aktiv.
      • Effektiv- und Abwesenheits-Sollwert = Basis - Abwesenheitsabsenkung.
  • 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).
  • 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.
  • 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

Walldisplay Thermostat Rule 1

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:

Walldisplay Thermostat BlockLibrary Regel

Mehrere Fenster in einem Raum

Falls ihr mehrere Fenster in einem Raum habt, könnt ihr diese einfach mittels LIST Block einfügen:

WallDisplay Thermostat mehrere Fenster

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: