HM-CC-RT-DN nach Mqtt

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
HiG
Beiträge: 136
Registriert: 16. Jun 2021 13:39

HM-CC-RT-DN nach Mqtt

Beitrag von HiG »

Da die Suche mir sagt...sie will mir nix sagen, da zuviele Einträge für diese Suchparameter vorhanden sind...ich aber nüx finde...


Ich möchte gerne meine HM-CC-RT-DN-Werte in die Mosquitto-Queue bringen.

Ich habe eine Items-Datei in der die Items defniert sind

Code: Alles auswählen

Number DG_HZ_Batterie		"Batterie [MAP(battery.map):%s]"		        <lowbattery>	(G_DG_Hz)	{channel="homematic:HG-HM-CC-RT-DN:ccu:xxx0432xx7:0#LOWBAT"}
Number DG_HZ_Temp_Ist		"Ist-Temperatur [%.2f °C]"				<temperature>	(G_DG_Hz)	{channel="homematic:HG-HM-CC-RT-DN:ccu:xxx0432xx7:4#ACTUAL_TEMPERATURE"}
Number DG_HZ_Temp_Soll		"Soll-Temperatur [%.2f °C]"				<temperature>	(G_DG_Hz)	{channel="homematic:HG-HM-CC-RT-DN:ccu:xxx0432xx7:4#SET_TEMPERATURE"}
Wie bekomme ich es hin...das OH die Werte bei Änderung in die MQ stellt?

Benutzeravatar
udo1toni
Beiträge: 13944
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: HM-CC-RT-DN nach Mqtt

Beitrag von udo1toni »

Du musst Channel erstellen, die jeweils auf ein Topic senden. Diese Channel musst Du dann mit den passenden Items verlinken und als Profile vermutlich Follow setzen, damit die Wertänderung als Befehl durchgereicht wird.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
HiG
Beiträge: 136
Registriert: 16. Jun 2021 13:39

Re: HM-CC-RT-DN nach Mqtt

Beitrag von HiG »

Ich hab mich mit meinem begrenzten Wissen drangesetzt unbd versucht Deine Worte in Taten umzusetzen

Folgende Dinge habe ich jetzt definiert

MQTT-Thing/Channel

Code: Alles auswählen

    Thing  topic  eg_test_heizung  "Test Heizung" @ "mqtt" {
    Type number : eg_tt_hz_Ist     "Ist-Temperatur"         [ stateTopic="zb2mqtt/eg_tt_hz_01", commandTopic="zb2mqtt/eg_tt_hz_01/set", formatBeforePublish="{ \"ist_temp\" : %f }"]
    Type number : eg_tt_hz_Soll    "Soll-Temperatur"        [ stateTopic="zb2mqtt/eg_tt_hz_01", commandTopic="zb2mqtt/eg_tt_hz_01/set", formatBeforePublish="{ \"soll_temp\" : %f }"]
  }
Item

Code: Alles auswählen

Number x_eg_tt_hz_Soll       "Soll-Temperatur"                  <temperature>       (gKuecheHeizung)                               { channel="mqtt:topic:ff57091363:eg_tt_hz_Soll"[profile="follow"]}
Dieses hab ich mir aus diesem Forum "geklaut"

Setzen Tue ich den Wert über eine Rule...damit das passiert wenn ich will

Code: Alles auswählen

rule "rules test1"
when
   Item x_dg_of_li_01_sw changed
then
  x_eg_tt_hz_Soll.sendCommand(75)
end
In meinem Mosquitto kommt allerdings nichts an. Also wahrscheinlich falsch :oops:

Benutzeravatar
udo1toni
Beiträge: 13944
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: HM-CC-RT-DN nach Mqtt

Beitrag von udo1toni »

Du solltest nicht zwei Channel mit identischen state- und commandTopics einrichten. Siehe unten...
Weiterhin stimmt die Channel UID nicht. Diese setzt sich zusammen aus "mqtt:topic:<bridge-id>:<thing-id>:<channel-id>, bei Dir fehlt also die Thing-ID (eg_test_heiung). Da Du hier Textkonfiguration angibst: Nutzt Du VSCode? Dort gibt es ein openHAB-Plugin. Man trägt den openHAB-Server ein und das Plugin zieht sich per REST API eine aktuelle Thing- und Item Liste. Man kann beide Listen anzeigen und vor allem vollautomatisch Items zu Things bzw. deren Channels erstellen lassen, damit ist es dann so gut wie ausgeschlossen, die falsche UID anzugeben.

Nochmal zurück zum Topic: Du willst auf ein identisches Topic unterschiedliche JSON Objekte senden. Am einfachsten (und zuverlässigsten) machst Du das direkt aus der Rule. Dazu legst Du einen String Channel an, der ausschließlich das commandTopic enthält und sonst gar nichts. Die komplette Formatierung des Befehls (also mit JSON Objekt) erledigst Du innerhalb der Rule. Dadurch hast Du viel bessere Kontrolle über das Objekt, und es ist auch einfacher, weitere Objekte hinzuzufügen:

Code: Alles auswählen

rule "rules test1"
when
   Item Sollwert received command // ein Number Item, welches den Sollwert speichert/anzeigt
then
    val Number nSoll = if(receivedCommand instanceof Number) (receivedCommand as Number).floatValue else 22    // 22 ist der Default Wert
    val String strSoll = "{ \"soll_temp\" : " + nSoll.toString + " }"                                          // Achtung, Alternative, Entweder diese oder die nächste Zeile
    val String strSoll = '{ "soll_temp" : ' + nSoll.toString + ' }'                                            // geht eventuell auch
    x_eg_tt_hz_Set.sendCommand(strSoll)
end
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
HiG
Beiträge: 136
Registriert: 16. Jun 2021 13:39

Re: HM-CC-RT-DN nach Mqtt

Beitrag von HiG »

Das klappt :-) Super...danke

Ich hab ein paar kleine "Umbauten" vorgenommen, weil ich ungeduldig bin ;-) "received command" wollte bei mir nicht funktionieren und stattdessen habe ich "changed" genommen.

Thing

Code: Alles auswählen

Thing  topic  eg_test_heizung  "Test Heizung" @ "mqtt" {
    Type string : eg_tt_hz_Soll    "Soll-Temperatur"        [ commandTopic="zb2mqtt/eg_tt_hz_01/set"]
  }
Item

Code: Alles auswählen

String x_eg_tt_hz_Soll       "Soll-Temperatur"                  <temperature>       (gKuecheHeizung)                               { channel="mqtt:topic:ff57091363:eg_test_heizung:eg_tt_hz_Ist"[profile="follow"]}

Code: Alles auswählen

rule "rules test1"
when
   Item eg_ku_hz_Temp_Soll changed// ein Number Item, welches den Sollwert speichert/anzeigt
then
    val Number nSoll = if(eg_ku_hz_Temp_Ist instanceof Number) (eg_ku_hz_Temp_Ist as Number).floatValue else 20    // 22 ist der Default Wert
    val String strSoll = "{ \"soll_temp\" : " + nSoll.toString + " }"                                          // Achtung, Alternative, Entweder diese oder die nächste Zeile
    //val String strSoll = '{ "soll_temp" : ' + nSoll.toString + ' }'                                            // geht eventuell auch
    logInfo("Heizung",strSoll)
    x_eg_tt_hz_Soll.sendCommand(strSoll)
end

Code: Alles auswählen

Number eg_ku_hz_Temp_Soll
Hab dann noch ein wenig nachgedacht...eigentlich könnte ich ja einen kompletten Payload zusammenbasteln und senden?!

Code: Alles auswählen

rule "rules test2"
when
   Item eg_ku_hz_Temp_Soll  changed // ein Number Item, welches den Sollwert speichert/anzeigt
then

    val Number nSoll = if(eg_ku_hz_Temp_Soll instanceof Number) (eg_ku_hz_Temp_Soll as Number).floatValue else 20    // 20 ist der Default Wert
    val Number nIst = if(eg_ku_hz_Temp_Ist instanceof Number) (eg_ku_hz_Temp_Ist as Number).floatValue else 20    // 20 ist der Default Wert
    val String strSoll = "{ \"soll_temp\" : " + nSoll.toString + ", " +  "\"ist_temp\" : " + nIst.toString + "  }"   
   
    logInfo("Heizung",strSoll)
    x_eg_tt_hz_Ist.sendCommand(strSoll)
end
Allerdings bin ich kein Freund von String-Konkatenation...schön wäre was wie ein StringBuilder oder so?!

Benutzeravatar
udo1toni
Beiträge: 13944
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: HM-CC-RT-DN nach Mqtt

Beitrag von udo1toni »

StringBuilder gibt es in openHAB DSL auch. Einfach

Code: Alles auswählen

val StringBuilder strMyString = new StringBuilder

strMyString.append("der erste Teilstring ")
strMyString.append(einObjekt.toString)
strMyString.append(" der dritte Teilstring")

logInfo("string","der String lautet: {}",strMystring.toString)
Aus dem Gedächtnis...

Das received command sollte funktionieren, solange Du über die UI verstellst. Wenn Du über ein anderes Binding steuerst, ist natürlich changed der richtige Trigger, und entsprechend newState als Wert.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
HiG
Beiträge: 136
Registriert: 16. Jun 2021 13:39

Re: HM-CC-RT-DN nach Mqtt

Beitrag von HiG »

udo1toni hat geschrieben: 20. Jan 2022 19:22 Aus dem Gedächtnis...
Funktioniert noch :lol:

Code: Alles auswählen

rule "rules test1"
when
   Item og_bd_hz_Temp_Ist changed // ein Number Item, welches den Sollwert speichert/anzeigt
then
    val Number stnew=(newState as Number)

    val Number nSoll = if(eg_ku_hz_Temp_Ist instanceof Number) (eg_ku_hz_Temp_Ist as Number).floatValue else 20    // 20 ist der Default Wert
    val Number nIst = if(eg_ku_hz_Temp_Ist instanceof Number) (eg_ku_hz_Temp_Ist as Number).floatValue else 20    // 20 ist der Default Wert
    val Number nVentil = if(eg_ku_hz_Ventil instanceof Number) (eg_ku_hz_Ventil as Number).floatValue else 0    // 20 ist der Default Wert
    val StringBuilder strMyString = new StringBuilder
    val String strSoll = "{ \"soll_temp\" : " + nSoll.toString + ", " +  "\"ist_temp\" : " + nIst.toString + "  }"
    
    strMyString.append("{ \"soll_temp\" : ")
    strMyString.append(nSoll.toString)
    strMyString.append(", \"ist_temp\" : ")
    strMyString.append(stnew.toString)
    strMyString.append(", \"ventil\" : ")
    strMyString.append(nVentil)
    strMyString.append(", \"window\" : ")
    strMyString.append(eg_ku_hz_Fenster.state.toString)
    strMyString.append(", \"active\" : ")
    strMyString.append(eg_ku_hz_Active.state.toString)
    strMyString.append(", \"mode\" : \"")
    strMyString.append(eg_ku_hz_C_M.state.toString)
    strMyString.append("\"}")
    logInfo("Heizung","new:" +  stnew.toString )

    logInfo("Heizung",strMyString.toString)
    x_eg_tt_hz_Ist.sendCommand(strSoll)
end
liefert

Code: Alles auswählen

{ "soll_temp" : 20, "ist_temp" : 18.70, "ventil" : 0, "window" : ON, "active" : OFF, "mode" : "AUTO-MODE"}

Benutzeravatar
udo1toni
Beiträge: 13944
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: HM-CC-RT-DN nach Mqtt

Beitrag von udo1toni »

:)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
HiG
Beiträge: 136
Registriert: 16. Jun 2021 13:39

Re: HM-CC-RT-DN nach Mqtt

Beitrag von HiG »

@udo1toni : Funktioniert das mit OH2.5 genauso? Dann könnte ich das direkt auf dem "Quellsystem" einspeisen. Aktuell zieht es sich die Werte per Remotebinding aus dem OH2.5 und schiebt sie dann (vom OH3) in die MQTT. Das liesse sich ja sparen



Nachtrag: Ja...das funzt auch da. #froi

Benutzeravatar
udo1toni
Beiträge: 13944
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: HM-CC-RT-DN nach Mqtt

Beitrag von udo1toni »

Welchen Teil meinst Du? Grundsätzlich, wenn Du mqtt2 nutzt (auf OH2.5 stünde auch noch mqtt1 zur Verfügung, Unterschied: bei mqtt2 gibt es Things, bei mqtt1 nicht), sollte das 1:1 genauso auch in OH2.5 funktionieren.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten