Seite 1 von 2

Items aus openhab nach MQTT

Verfasst: 2. Jun 2023 07:42
von goerdi
Hallo !

Gibts eigentlich eine Möglichkeit Items welche eigentlich nur in Openhab existieren in MQTT abzubilden ?
Ich hab in Openhab ein paar Items welche ich dort quasi "erzeuge" (sprich ich rechne mir z.B. den Wirkungsgrad eines Erzeugers aus.
In Openhab existiert dazu eine Items welches auch korrekt befuellt und angezeigt wird.
Wie kann ich nun erreichen dass dies auch in MQTT landet ?
(passendes thing erstellen reicht anscheinend nicht aus da schon probiert :-)

Gruss Gerd

Re: Items aus openhab nach MQTT

Verfasst: 2. Jun 2023 08:49
von PeterA
Hi,

Du musst das Item noch mit einem Channel Verlinken.
Dann landet das auch beim Broker.

Hier ein Beispiel:
Definition thing:
Es gibt immer ein State und Command Topic

Code: Alles auswählen

Type number : inv1_limit_relative		"I1 limit relative"		[stateTopic="solar/116183132641/status/limit_relative", commandTopic="solar/116183132641/cmd/limit_persistent_relative", unit="%"]
Type number : inv1_limit_absolute		"I1 limit absolute"		[stateTopic="solar/116183132641/status/limit_absolute", commandTopic="solar/116183132641/cmd/limit_persistent_absolute", unit="W"]
items:

Code: Alles auswählen

Number:Dimensionless    OpenDTU1_inv1_limit_relative      "Limit (rel)"                                  <qualityofservice>    (OpenDTU)                 {channel="mqtt:topic:3448a27a:OpenDTU1:inv1_limit_relative"}
Number                  OpenDTU1_inv1_limit_absolute      "Limit (abs)"                                  <qualityofservice>    (OpenDTU)                 {channel="mqtt:topic:3448a27a:OpenDTU1:inv1_limit_absolute"}
Ich hoffe das Hilft weiter.

Gruß
Peter

Re: Items aus openhab nach MQTT

Verfasst: 2. Jun 2023 09:40
von goerdi
Hi !

das habe ich ja..
thing

Code: Alles auswählen

       Type number : solar_eff  "WR Wirkungsgrad" [stateTopic="solarview/WR1/EFF", commandTopic="solarview/WR1/EFF"] 
item

Code: Alles auswählen

Number Solar_Efficiency   "Wirkungsgrad [ %.2f %%]" <solarplant>              { channel="mqtt:topic:home:solarview:solar_eff" }
Gruss Gerd

Re: Items aus openhab nach MQTT

Verfasst: 2. Jun 2023 09:45
von PeterA
Wenn ich mich richtig Erinnere wird nur was auf den Broker published wenn das Item einen "Command" bekommt.

https://community.openhab.org/t/solved- ... t/135634/3

Oder So:

viewtopic.php?t=4080

Und So:

viewtopic.php?t=6928

Re: Items aus openhab nach MQTT

Verfasst: 2. Jun 2023 11:16
von goerdi
Hi !

den 2ten und 3ten hab ich probiert irgendwie steigt da meine rule immer aus...

Gruss Gerd

Re: Items aus openhab nach MQTT

Verfasst: 2. Jun 2023 16:57
von udo1toni
Zeig doch mal Deine Rule konkret. Bitte die Code-Ansicht auswählen und den Text hier (als Code markiert) posten.

Re: Items aus openhab nach MQTT

Verfasst: 2. Jun 2023 23:04
von goerdi
Hi !

Code: Alles auswählen

rule "calc efficiency"
when
    Item Solar_Power_dc changed or
    Item Solar_Power_ac changed
then

sendCommand(triggeringItem.state.toString)
Solar_Efficiency.postUpdate(Solar_Power_ac.state as Number/Solar_Power_dc.state as Number * 100)

val mqttActions = getActions("mqtt", "mqtt:broker:home")
mqttActions.publishMQTT("solarview/WR1/EFF", Solar_Efficiency.state)

end
Also die ersten zwei Zeilen das geht ja sprich ich krieg den Wirkungsgrad angezeigt...

Gruss Gerd

Re: Items aus openhab nach MQTT

Verfasst: 3. Jun 2023 02:03
von udo1toni
Also das hier:

Code: Alles auswählen

sendCommand(triggeringItem.state.toString)
kann schon mal nicht funktionieren, weil je nachdem, wie man des dreht, entweder der Itemname fehlt, oder aber es wird versucht, den Wert des triggernden Items als Item Name zu verwenden (dann fehlt immer noch der zu sendende Befehl - außerdem existiert das implizite Objekt triggeringItem nicht in dem Kontext, es sei denn, Du arbeitest mit openHAB2.x

Code: Alles auswählen

rule "calc efficiency"
when
    Item Solar_Power_dc changed or
    Item Solar_Power_ac changed
then
    Solar_Efficiency.postUpdate((Solar_Power_ac.state as Number)/(Solar_Power_dc.state as Number) * 100)

    val mqttActions = getActions("mqtt", "mqtt:broker:home")
    mqttActions.publishMQTT("solarview/WR1/EFF", Solar_Efficiency.state)
end
Der Ausdruck Item.state as Number muss geklammert werden, damit die Berechnung funktioniert.

Besser:

Code: Alles auswählen

rule "calc efficiency"
when
    Item Solar_Power_dc changed or
    Item Solar_Power_ac changed
then
    var nPac = 0
    var nPdc = 0
    if(Solar_Power_ac.state instanceof Number)
        nPac = Solar_Power_ac.state as Number
    if(Solar_Power_dc.state instanceof Number)
        nPdc = Solar_Power_dc.state as Number
    var nEff = 0
    if(nPdc > 0)
        nEff = nPac / nPdc * 100

    Solar_Efficiency.sendCommand(nEff)
end
Das Item kann direkt den Wert an mqtt senden, warum mit einer Action lösen, wenn es auch über einen Channel geht?

Code: Alles auswählen

Number Solar_Efficiency (verlinkt mit einem mqtt number Channel, der als commandTopic solarview/WR1/EFF konfiguriert hat.)
Der Weg über lokale Variablen schützt vor Fehlermeldungen, weil z.B. eines der Items nicht initialisiert ist oder weil der Divisor vielleicht 0 ist.

Re: Items aus openhab nach MQTT

Verfasst: 3. Jun 2023 11:38
von goerdi
Hi !

Code: Alles auswählen

rule "calc efficiency 2 "
when
    Item Solar_Power_dc changed or
    Item Solar_Power_ac changed
then
    var nPac = 0
    var nPdc = 0
    if(Solar_Power_ac.state instanceof Number)
        nPac = Solar_Power_ac.state as Number
    if(Solar_Power_dc.state instanceof Number)
        nPdc = Solar_Power_dc.state as Number
    var nEff = 0
    if(nPdc > 0)
        nEff = nPac / nPdc * 100

    Solar_Efficiency.sendCommand(nEff)
end
Ergebnis
2023-06-03 11:35:18.669 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'test-1' failed: An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.IntegerExtensions.operator_greaterThan(int,int) on instance: null in test

Gruss Gerd

Re: Items aus openhab nach MQTT

Verfasst: 3. Jun 2023 13:43
von udo1toni
Und die Rule ist in einer rules-Datei angelegt?