Also das hier:
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.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet