Schritt 1: Du legst das Modbus Thing so an, dass die Daten gelesen und geschrieben werden können.
Schritt 2: Du prüfst, dass das auch funktioniert (indem Du den number Channel mit einem neuen Number Item verlinkst und dieses über die UI steuerst. Schau nach, ob Änderungen auf Modbus-Seite in openHAB angezeigt werden und umgekehrt.
Schritt 3: Du legst den passenden Channel für das Thermostat an.
Schritt 4: Du prüfst, dass auch dieser Channel wie erwartet funktioniert. (siehe Schritt 2)
Selbstverständlich kannst Du die Reihenfolge der Schritte auch sinngemäß ändern, wichtig ist aber, dass zunächst beide Anbindungen in der UI in beide Richtungen funktionieren.
Im nächsten Schritt verifizierst Du, dass beide Channel den gleichen Wertebereich nutzen. Es kommt z.B. oft vor, dass Modbus 1/10°C Schritte nutzt. Allerdings mit einem Integerwert, d.h. aus 21,5 °C wird 215. Der Thermostat verwendet aber evtl. einen echten Float Wert, also z.B. 21.5 für 21,5 °C.
Im besten Fall sorgst Du durch Anpassungen an den Channels dafür, dass die Werte als QuantityType zur Verfügung stehen, mindestens aber, dass beide Channel den gleichen Wertebereich nutzen.
Als letztes verlinkst Du beide Channel mit dem selben Number Item. Dabei gibst Du beim "Slave" als Profile noch "follow" mit an. Dadurch interpretiert dieser Channel eine eintreffende Statusänderung als Befehl und sendet den Wert an das verknüpfte Gerät weiter.
Aber Achtung! Du darfst nicht beide Channel mit follow konfigurieren, Du musst Dich also entscheiden, ob eine Wertänderung am Thermostaten oder am Modbus Gerät zur anderen Seite gesendet wird.
Zusatzinfo:
Wenn Das nicht akzeptabel ist (die Set Temperatur soll jederzeit an beiden Geräten und über die UI konfigurierbar sein), musst Du stattdessen auf eine Rule ausweichen und am besten drei Number Items verwenden (eines für die UI, eines für den Thermostaten und eines für das Modbus Register). Die Weiterleitung der Steuerbefehle wird dann durch die Rule vorgenommen, in der Form, dass die Rule auf
changed triggert (alle drei Items) und den empfangenen Wert an alle Items als Befehl sendet, allerdings nur dann, wenn sich der aktuelle Wert des jeweiligen Items vom empfangenen Wert unterscheidet. z.B. so:
Code: Alles auswählen
Group gThermostatWohnzimmer
Number ThermostatWohnzimmerModbus (gThermostatWohnzimmer)
Number ThermostatWohnzimmerEcht (gThermostatWohnzimmer)
Number ThermostatWohnzimmerUI "Wohnzimmer Thermostat" (gThermostatWohnzimmer) {stateDescription=""[pattern="%.1f °C"]}
Also drei Items, zusammengefasst in der Gruppe gThermostatWohnzimmer.
Code: Alles auswählen
rule "Termostat Wohnzimmer"
when
Member of gThermostatWohnzimmer changed // eines der Items hat seinen Wert geändert
then
if(!(newState instanceof Number)) // ist der Wert keine gültige Zahl?
return; // dann Abbruch
val soll = (newState as Number).floatValue // neuen Sollwert als Float Zahl bereitstellen
gThermostatWohnzimmer.members.forEach[i| // für jedes Item der Gruppe ausführen
var Boolean bSetzen = true // definiere einen variablen Wahrheitswert
if(i.state instanceof Number) // falls der Status des Items eine Zahl ist
if((i.state as Number).floatValue == soll) // falls die Zahl gleich dem empfangenen Wert ist
bSetzen = false // kein Befehl notwendig -> Variable auf false ändern
if(bSetzen) // falls bSetzen weiterhin wahr ist
i.sendCommand(soll) // sende den empfangenen Wert an das aktuelle Item
]
end
Diese Variante ist aber nur dann notwendig, wenn Du unbedingt an allen drei Stellen gleichberechtigt steuern können willst.
Ansonsten kannst Du die "einfache" Variante nehmen, die ich oben beschrieben habe.