Variablen in Datei .rules an Items übergeben und in der sitemap anzeigen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Variablen in Datei .rules an Items übergeben und in der sitemap anzeigen

Beitrag von udo1toni »

Die drei Variablen musst Du gar nicht in den Rules definieren. Stattdessen benötigst Du die drei Werte als Items.
Den Bewölkungsgrad musst Du vermutlich über einen Sensor bestimmen, den Du über ein Binding an das Item koppelst.
Die Strahlungsintensität bekommst Du vemutlich einfach über einen Wetterdienst.
Cosinus Theta berechnest Du wahrscheinlich aus dem Winkel zwischen Sonne und PV-Zelle, ergibt sich also aus dem Astro Binding.

Diese Items nutzt Du dann einfach in der Rule.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

MichaelLCN
Beiträge: 2
Registriert: 11. Mär 2019 17:47

Re: Variablen in Datei .rules an Items übergeben und in der sitemap anzeigen

Beitrag von MichaelLCN »

Hallo!
Seit ein paar Tagen sitze ich mit folgendem Problem fest und komme nicht weiter. Vielleicht kann hier jemand helfen!?
Ich benutzte die Basic UI und Openhab 2 auf einem Raspberry. Folgendes Szenario:
Ich sende an openhab mit dem Microsoft UDP Sender/ Reciever Programm ein UDP "Telegramm", z.B. 123. Dieses wird dann in der Sitemap angezeigt. Das funktioniert auch:

.sitemap Datei:
Text item=FromUDPnode

.items Datei:
String FromUDPnode "FromUDPnode [%s]" {udp="<[*:*:'']"}

openhab 2 log Viewer:
2019-11-03 21:12:27.086 [vent.ItemStateChangedEvent] - FromUDPnode changed from 456 to 123

Nun möchte ich aber, wenn ein bestimmtes UDP Telegramm kommt, z.B. 123, dass eine Lampe angeht. Dafür habe ich eine Regel geschrieben. Diese wird nicht ausgeführt und ich weiß nicht warum. In den log-Dateien gibt es keine Fehlermeldung. Hier die Regel:

.rules Datei:
val String test = 123
rule "udp test"
when
Item FromUDPnode received update
then
if( FromUDPnode.state == test )
{
sendCommand(Licht_EG_Wohnzimmer_Esstisch, ON)
}
end


Vielleicht kann mir jemand helfen.
Vielen Dank!!!!

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

Re: Variablen in Datei .rules an Items übergeben und in der sitemap anzeigen

Beitrag von udo1toni »

Du testest einen String gegen einen Status.

Code: Alles auswählen

val String test = "123"

rule "udp test"
when
    Item FromUDPnode received update
then
    if(FromUDPnode.state.toString == test) {
        sendCommand(Licht_EG_Wohnzimmer_Esstisch, ON)
    }
end
Also zum einen die Konstante nicht nur als String definieren, sondern auch einen String zuweisen, und keine Zahl ;)
Zum anderen des Status explizit nach String konvertieren lassen, um auf der sicheren Seite zu sein.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

MichaelLCN
Beiträge: 2
Registriert: 11. Mär 2019 17:47

Re: Variablen in Datei .rules an Items übergeben und in der sitemap anzeigen

Beitrag von MichaelLCN »

Hallo!
Vielen Dank für die Antwort. Leider hat es aber auch nicht funktioniert. Die if Anweisung wird nicht ausgeführt. Ich habe mir jetzt mal die Wertigkeiten der unterschiedlichen Variablen und items in dem log-file angeschaut. Wird das udp Telegramm 123 gesendet haben x, test und FromUDPnode die Wertigkeit 123. Demnach sollte die if-Anweisung ausgeführt werden. Das sendCommand(Licht_EG_Wohnzimmer_Esstisch, OFF) ist funktionstüchtig, ohne if-Anweisung wird es ausgeführt.
Ich habe keine Idee mehr!

Hier die rule:

val String test = "123"
var String x

rule "udp-test"

when
Item FromUDPnode received update
then
x = FromUDPnode.state.toString
logInfo("TEST1", x)
logInfo("TEST2", FromUDPnode.state.toString)
logInfo("TEST3", test)

if( x == test ) {
sendCommand(Licht_EG_Wohnzimmer_Esstisch, OFF)
}
end


Hier das log-file:

2019-11-05 22:20:06.701 [INFO ] [eclipse.smarthome.model.script.TEST1] - 123

2019-11-05 22:20:06.736 [INFO ] [eclipse.smarthome.model.script.TEST1] - 123

2019-11-05 22:20:06.745 [INFO ] [eclipse.smarthome.model.script.TEST1] - 123

2019-11-05 22:20:06.701 [INFO ] [eclipse.smarthome.model.script.TEST1] - 123

2019-11-05 22:20:06.739 [INFO ] [eclipse.smarthome.model.script.TEST1] - 123

2019-11-05 22:20:06.750 [INFO ] [eclipse.smarthome.model.script.TEST2] - 123

2019-11-05 22:20:06.756 [INFO ] [eclipse.smarthome.model.script.TEST2] - 123

2019-11-05 22:20:06.758 [INFO ] [eclipse.smarthome.model.script.TEST2] - 123

2019-11-05 22:20:06.760 [INFO ] [eclipse.smarthome.model.script.TEST3] - 123

2019-11-05 22:20:06.764 [INFO ] [eclipse.smarthome.model.script.TEST3] - 123

2019-11-05 22:20:06.767 [INFO ] [eclipse.smarthome.model.script.TEST2] - 123

2019-11-05 22:20:06.770 [INFO ] [eclipse.smarthome.model.script.TEST2] - 123

2019-11-05 22:20:06.770 [INFO ] [eclipse.smarthome.model.script.TEST3] - 123

2019-11-05 22:20:06.783 [INFO ] [eclipse.smarthome.model.script.TEST3] - 123

2019-11-05 22:20:06.783 [INFO ] [eclipse.smarthome.model.script.TEST3] - 123

2019-11-05 22:20:06.783 [INFO ] [eclipse.smarthome.model.script.TEST1] - 123

2019-11-05 22:20:06.793 [INFO ] [eclipse.smarthome.model.script.TEST2] - 123

2019-11-05 22:20:06.797 [INFO ] [eclipse.smarthome.model.script.TEST1] - 123

2019-11-05 22:20:06.799 [INFO ] [eclipse.smarthome.model.script.TEST3] - 123

2019-11-05 22:20:06.804 [INFO ] [eclipse.smarthome.model.script.TEST1] - 123

2019-11-05 22:20:06.804 [INFO ] [eclipse.smarthome.model.script.TEST2] - 123

2019-11-05 22:20:06.809 [INFO ] [eclipse.smarthome.model.script.TEST1] - 123

2019-11-05 22:20:06.810 [INFO ] [eclipse.smarthome.model.script.TEST3] - 123

2019-11-05 22:20:06.810 [INFO ] [eclipse.smarthome.model.script.TEST2] - 123

2019-11-05 22:20:06.814 [INFO ] [eclipse.smarthome.model.script.TEST3] - 123

2019-11-05 22:20:06.815 [INFO ] [eclipse.smarthome.model.script.TEST2] - 123

2019-11-05 22:20:06.818 [INFO ] [eclipse.smarthome.model.script.TEST3] - 123

Vielleicht fällt Euch ja was auf......
Vielen Dank!!!!

Benutzeravatar
peter-pan
Beiträge: 2564
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Variablen in Datei .rules an Items übergeben und in der sitemap anzeigen

Beitrag von peter-pan »

MichaelLCN hat geschrieben: 5. Nov 2019 22:26 Hallo!
Vielen Dank für die Antwort. Leider hat es aber auch nicht funktioniert. Die if Anweisung wird nicht ausgeführt. Ich habe mir jetzt mal die Wertigkeiten der unterschiedlichen Variablen und items in dem log-file angeschaut. Wird das udp Telegramm 123 gesendet haben x, test und FromUDPnode die Wertigkeit 123. Demnach sollte die if-Anweisung ausgeführt werden. Das sendCommand(Licht_EG_Wohnzimmer_Esstisch, OFF) ist funktionstüchtig, ohne if-Anweisung wird es ausgeführt.
Ich habe keine Idee mehr!
Bist du sicher, dass dein Item nur "123" (dreistellig) enthält ? Ich weiss nicht wie man die Länge des Strings ermitteln kann (das geht bestimmt). Du könntest es aber vielleicht auch mal so probieren:

Code: Alles auswählen

var Number test1 = (Float::parseFloat(String::format("%s",FromUDPnode.state).replace(' ','')))
logInfo("test1"," Wert  ist: {}", test1)
var String test2 = (String::format("%s",FromUDPnode.state).replace(' ',''))
logInfo("test2"," Wert ist: {}", test2)
indem du evtl. vorhandene Spaces eliminierst und anschliessend den Vergleich machst (entweder numerisch oder als String).

Edit: Die Rule triggered aber sehr oft :?:
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.1 openhabian

Benutzeravatar
WupperJunge
Beiträge: 57
Registriert: 27. Mai 2021 18:19
Wohnort: Wuppertal

Re: Variablen in Datei .rules an Items übergeben und in der sitemap anzeigen

Beitrag von WupperJunge »

Beim Studium der Beispiele in unserem Forum hier, bin ich durch Zufall auf das obige Item und einen Ausdruck gestoßen:

x.items

Code: Alles auswählen

Number numItem "numItem[%s]"
Nun bin ich hinsichtlich JAVA und damit OpenHAB ansoluter Anfänger. Kann mir evtl. jemand sagen, welche Funktion das "%s" in numItem[%s] als Label-Bezeichnung hat?
- Raspberry Pi 4 Model B (4GB RAM) im Argon One Pi Gehäuse mit Raspberry Pi OS
- openHAB 3.3.0.M6 installiert via Advanced Packaging Tool (APT)

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

Re: Variablen in Datei .rules an Items übergeben und in der sitemap anzeigen

Beitrag von udo1toni »

Es handelt sich nicht um Java!

Zum Einen, wenn es Bestandteil einer Rule wäre, handelte es sich um die Rules DSL, welche auf xTend absiert.
Zum Anderen ist diese Zeile eine Item-Definition in einer *.items Datei. Sie bedeutet:

Lege ein Number Item an. Der Name des Items soll numItem sein. Das Label des Items soll numItem sein, wobei das Status des Items mit im Label ausgegeben werden soll (das ist der Teil zwischen [ und ]). Dabei soll der Status als String eingefügt werden (das ist die Bedeutung von %s).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
WupperJunge
Beiträge: 57
Registriert: 27. Mai 2021 18:19
Wohnort: Wuppertal

Re: Variablen in Datei .rules an Items übergeben und in der sitemap anzeigen

Beitrag von WupperJunge »

udo1toni hat geschrieben: 30. Mai 2021 23:01 Es handelt sich nicht um Java!

Zum Einen, wenn es Bestandteil einer Rule wäre, handelte es sich um die Rules DSL, welche auf xTend absiert.
Zum Anderen ist diese Zeile eine Item-Definition in einer *.items Datei. Sie bedeutet:

Lege ein Number Item an. Der Name des Items soll numItem sein. Das Label des Items soll numItem sein, wobei das Status des Items mit im Label ausgegeben werden soll (das ist der Teil zwischen [ und ]). Dabei soll der Status als String eingefügt werden (das ist die Bedeutung von %s).
DANKE!!
- Raspberry Pi 4 Model B (4GB RAM) im Argon One Pi Gehäuse mit Raspberry Pi OS
- openHAB 3.3.0.M6 installiert via Advanced Packaging Tool (APT)

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

Re: Variablen in Datei .rules an Items übergeben und in der sitemap anzeigen

Beitrag von udo1toni »

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

kdb
Beiträge: 10
Registriert: 9. Jan 2024 18:00

Re: Variablen in Datei .rules an Items übergeben und in der sitemap anzeigen

Beitrag von kdb »

Hallo die Beschreibung ist sehr verständlich.
Wie ist es unter OpenHAB 4.x. Wo müsste ich die Testrule speichern und wie könnte ich auf die Ergebnisse zugreifen ?
Danke
udo1toni hat geschrieben: 17. Mai 2018 19:21
Ich springe hier mal bei, um ein wenig Licht ins Dunkel zu bringen. :)

Die UI von openHAB ist dazu gedacht, Items bzw. deren Status anzuzeigen und/oder zu manipulieren (also Schalter AN/AUS).
Deshalb kann openHAB bis auf wenige Ausnahmen auch nichts anderes in eine UI einbetten.
Die Ausnahmen sind Webview, Mapview, Image, Video und Chart, wobei auch diese Elemente ihre Steuerinformationenen gewöhnlich aus Items beziehen.

Du musst also zwingend ein Item verwenden, wenn Du irgendeinen Zahlenwert oder gesteuerten Text anzeigen lassen möchtest.
Glücklicherweise muss man bei der Definition eines Items kein Binding oder auch Channels angeben. Es reicht also ein ungebundenes Item vom passenden Typ, um den errechneten Wert anzuzeigen.

var/val: var steht für Variable, also ein Platzhalter, dessen konkreter Wert (das, was darin gespeichert ist) variabel, also veränderbar ist. Der Gegensatz dazu ist val, das steht für Value, also ein Wert. Dieser Wert ist aber zur Laufzeit nicht änderbar, einmal festgelegt, bleibt er so, wie er ist, er ist also konstant.

Code: Alles auswählen

var int iMyInterger = 5
val int cMyInteger = 5

rule "Testrule"
    when
        Time cron "0 0 18 * * ?"  // einmal täglich 18 Uhr
    then
        iMyInteger = iMyInteger + 1  // klappt, da variabel
        cMyInteger = cMyInteger + 1  // Fehler, da konstant
end
Gemein wird es dann, wenn ich innerhalb einer Rule ein val einsetze. Auch hier darf der Wert nicht mehr verändert werden. Wenn die Rule aber beendet wird, wird auch die Konstante wieder aus dem Speicher entfernt. Beim nächsten Aufruf der Rule darf der Konstanten also erneut einmalig ein Wert zugewiesen werden. Der Unterschied besteht vor allem darin, wie der Speicher für Variablen und Konstanten verwaltet wird.

Code: Alles auswählen

logInfo("Prognose_PV_Leistung",Prognose_PV_Leistung.toString)
logInfo() ist eine Action, die im Logging einen Eintrag der Stufe INFO erzeugt. Es gibt auch logDebug(), logError() und logWarn().
Der Witz einer solchen Zeile, und warum es dafür vier verschiedene Actions gibt, ist, dass man das Logging während der Laufzeit von openHAB steuern kann, und zwar extrem kleinteilig. Der erste Parameter von logInfo() ist der Loggername (genauer der letzte Teil des Loggernamens). Wenn man das Logging für diesen Loggernamen auf WARN setzt, wird logInfo() keine Ausgabe mehr erzeugen, logWarn() aber weiterhin. Wenn man das Logging auf DEBUG setzt, werden zusätzlich auch logDebug() Anweisungen eine Ausgabe erzeugen.
Es ist also sinnvoll, solche logInfo() Actions überall da einzusetzen, wo man gerne recht genaue Informationen haben möchte, was gerade in der Rule abgeht. Wenn die Verarbeitung der Rule ungewöhnliche Randbedingungen vorfindet, bietet sich ein logWarn() an, wenn ein krasser Fehler auftritt, ein logError(). Wenn man eine sehr umfangreiche Rule schreibt, kann es auch sinnvoll sein, an weiteren Stellen z.B. Zwischenergebnisse mit logDebug() ausgeben zu lassen. Man lässt dann das Logging auf INFO oder auf WARN, nur wenn es Probleme gibt, dreht man das Logging auf und bekommt dann zusätzliche Informationen.
Das Logging von Karaf (das ist die von openHAB eingesetzte OSGI-Schicht) ist extrem mächtig, man kann z.B. auch bestimmte Logs in separate Dateien laufen lassen, default landet alles erstmal in openhab.log, bis auf Events, die landen in events.log

Der zweite Parameter ist die eigentliche Information, die geloggt werden soll. Die zitierte Zeile ist nicht so ganz korrekt, denn der Loggername wird hier für Klartext missbraucht. Da dieser Klartext auch noch recht lang ist, wird die automatische Formatierung des log Files hier zerstörerisch wirken. Korrekt sähe das eher so aus:

Code: Alles auswählen

logInfo("pvCalc","Prognose_PV_Leistung: {} Wh",Prognose_PV_Leistung)
Diese Zeile bewirkt eine Logzeile in dieser Form:

Code: Alles auswählen

2018-05-17 16:28:39.482 [INFO] [.e.model.script.pvCalc] Prognose_PV_Leistung: 45321.12345 Wh
Für erste Schritte mit openHAB2 empfehle ich dringend, openHAB2 frisch zu installieren und dann die Demo auszuwählen. Dabei wird automatisch eine Konfiguration eingespielt, die zum einen einige Dinge zeigt, die so möglich sind, zum anderen kann man sich die Konfigurationsdateien prima anschauen und so verstehen, die openHAB tickt. Ich nutze openHAB seit Version 1.0 und habe es exakt so gemacht. Ich habe erst nach praktisch kompletter Inbetriebnahme erste Fragen gehabt, z.B. weil ich einen Zeitstempel aus der Persistence auslesen wollte (was bisher zumindest mit erheblichem Aufwand verbunden war), aber für die Grundfunktionen musste ich nicht mal groß im Wiki stöbern, das ergab sich alles praktisch von selbst aus der Demo.

Weiterhin möchte ich empfehlen, für ein Produktivsystem eine zweite openHAB Instanz separat einzurichten. Dabei kann man im Hinterkopf behalten, dass openHAB hervorragend auf kleinen Systemen läuft. Es reicht also z.B. auch eine kleine virtuelle Maschine, auf der dann freilich z.B. Debian werkeln muss - extra ein Windows dafür hochzuziehen ist albern ;) Falls Du aber noch eine ältere Gurke dastehen hast, die eh nur zustaubt, kann auch auf dieser eine Instanz laufen. Auf dem einen System kannst Du dann nach Herzenslust testen, auf dem anderen läuft das, was bisher für gut befunden wurde.

Antworten