Problem mit MODBUS

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Problem mit MODBUS

Beitrag von udo1toni »

Ups. Der Doppelpunkt nach dem return soll ein Semikolon sein. :)

Also um die Rule mal auseinander zu nehmen:

Code: Alles auswählen

rule "Update Modus"
when
    Item P_Netz changed
then
end
Der Rahmen der Rule. Zwischen when und then stehen der oder die Trigger. Zwischen then und end steht der Code, der ausgeführt wird, wenn die Rule getriggert wird.

Code: Alles auswählen

P_Netz.state instanceof Number
Wahr, falls der Status vom Typ Number ist

Code: Alles auswählen

if(!(boolean))
Das Ausrufezeichen ist das NOT der DSL, also "wenn nicht wahr..."

Code: Alles auswählen

return;

Rule beenden
Dieser Schritt (Prüfung auf Type Number) ist essentiell, denn ein Item vom Typ Number kann auch den Status NULL oder UNDEF halten, beide sind nicht vom Typ Number, ein Type Casting (as Number) wird dann eine Nullpointer Exception auslösen.

Code: Alles auswählen

val String strP_Netz = 
Definiere eine Konstante strP_Netz vom Typ String (als Objekt)

Code: Alles auswählen

Math::abs(Zahl)
Absolutwert von Zahl (also die Zahl ohne ihr Vorzeichen)

Code: Alles auswählen

.toString
Wandle nach String.

Code: Alles auswählen

Modus.postUpdate(Wert)
Setze das Item auf den Wert

Code: Alles auswählen

(if(0 < P_Netz.state as Number) "Netzeinspeisung: " else "Netzbezug: ")
Ternärer Operator, falls die Bedingung erfüllt ist, der erste Wert, ansonsten der zweite Wert. Durch die Umstellung (0 < Wert) kann man einmal Klammern sparen. Ansonsten müsste man

Code: Alles auswählen

(if((P_Netz.state as Number) > 0)
schreiben, da das as Number leider eine niedrigere Priorität als das > hat, obwohl das eher unlogisch erscheint...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Problem mit MODBUS

Beitrag von violine21 »

Vielen Dank Udo für die ausführliche Erklärung!
In einigen Posts erwähnst Du die "Magie von OpenHAB", hier kann man wohl von "Udo's Magie" sprechen ;) ;) ;)

Die Sache mit dem Doppelpunkt und dem Semikolon hatte ich mir zwischenzeitlich schon ergoogelt.
Allerdings tauchte dann ein anderer Fehler auf:

Code: Alles auswählen

val String strP_Netz = Math::abs(P_Netz.state as Number).toString
Da hat VSC gleich gemeckert und mir einen wertvollen Hinweis gegeben. Number und Int harmonieren nicht.
So funktioniert es jetzt genau so, wie ich mir das vorgestellt habe:

Code: Alles auswählen

val String strP_Netz = Math::abs((P_Netz.state as Number).intValue).toString
Was sagst Du zu meiner zwischenzeitlichen Lösung?

Code: Alles auswählen

if (P_Netz.state > 0)
        {Modus.sendCommand("Netzeinspeisung: "+ P_Netz.state.toString + " W")}
else
        {Modus.sendCommand("Netzbezug: "+ (P_Netz.state.toString.replaceAll("-","") +" W"))}
Viele Grüße!

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

Re: Problem mit MODBUS

Beitrag von udo1toni »

violine21 hat geschrieben: 6. Jan 2020 11:13
Allerdings tauchte dann ein anderer Fehler auf:

Code: Alles auswählen

val String strP_Netz = Math::abs(P_Netz.state as Number).toString
Da hat VSC gleich gemeckert und mir einen wertvollen Hinweis gegeben. Number und Int harmonieren nicht.
So funktioniert es jetzt genau so, wie ich mir das vorgestellt habe:

Code: Alles auswählen

val String strP_Netz = Math::abs((P_Netz.state as Number).intValue).toString
Ach ja, die lieben Datentypen, die treiben mich auch regelmäßig zur Verzweiflung...
violine21 hat geschrieben: 6. Jan 2020 11:13 Was sagst Du zu meiner zwischenzeitlichen Lösung?

Code: Alles auswählen

if (P_Netz.state > 0)
        {Modus.sendCommand("Netzeinspeisung: "+ P_Netz.state.toString + " W")}
else
        {Modus.sendCommand("Netzbezug: "+ (P_Netz.state.toString.replaceAll("-","") +" W"))}
Ja, das geht natürlich auch :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten