ich habe folgendes Problem. Ich habe ein Pico W mit einem Reed-Sensor bestückt und lese so die Impulse von meinem Gaszähler aus. Diesen Triggerimpuls schicke ich per Mqqt-protokoll an meinem Raspberry. Nun möchte ich ein Counter-Item erstellen was mit jedem Impuls aufsummiert.( Wert +1). Leider kann ich dazu keine Beispiele für eine Rule in OH 3 dazu finden. Meine Rule registriert den Trigger_Change, aber dann komme ich nicht weiter.
Counter OH3
-
Egon_80
- Beiträge: 9
- Registriert: 7. Nov 2022 07:40
Counter OH3
Hallo,
ich habe folgendes Problem. Ich habe ein Pico W mit einem Reed-Sensor bestückt und lese so die Impulse von meinem Gaszähler aus. Diesen Triggerimpuls schicke ich per Mqqt-protokoll an meinem Raspberry. Nun möchte ich ein Counter-Item erstellen was mit jedem Impuls aufsummiert.( Wert +1). Leider kann ich dazu keine Beispiele für eine Rule in OH 3 dazu finden. Meine Rule registriert den Trigger_Change, aber dann komme ich nicht weiter.
ich habe folgendes Problem. Ich habe ein Pico W mit einem Reed-Sensor bestückt und lese so die Impulse von meinem Gaszähler aus. Diesen Triggerimpuls schicke ich per Mqqt-protokoll an meinem Raspberry. Nun möchte ich ein Counter-Item erstellen was mit jedem Impuls aufsummiert.( Wert +1). Leider kann ich dazu keine Beispiele für eine Rule in OH 3 dazu finden. Meine Rule registriert den Trigger_Change, aber dann komme ich nicht weiter.
- udo1toni
- Beiträge: 15442
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Counter OH3
Willkommen im Forum!
In welcher Form kommt der Impuls über mqtt an? wechselt die Payload kurz auf einen Wert und wieder zurück, oder wie muss ich mir das vorstellen?
Auf jeden Fall musst Du den Channel, in dem der Impuls ankommt, mit einem Item verknüpfen (gewöhnlich wird es sich um ein Switch Item oder Contact Item handeln, je nachdem, wie man das im Channel definiert hat).
Weiterhin brauchst Du ein Number Item, welches Du aufaddieren kannst. Nennen wir es im weiteren Verlauf GasCounter. Es ist sinnvoll, das Item mit restoreOnStartup zu persistieren, damit bei einem Neustart von openHAB der "Zählerstand" nicht verloren geht. Am sinnvollsten ist es, das restoreOnStartup mit mapDB zu erledigen.
Nun brauchst Du noch eine Rule, welche sich um die Addition kümmert. Es gibt verschieden Optionen für Rules und man kann grundsätzlich jede lösbare Aufgabe mit jeder Rule Engine lösen, allerdings lassen sich Text Rules hier im Forum einfacher teilen
mit ein Grund, weshalb ich die DSL verwende.
Ich nutze die Notation, welche in einer *.rules Datei verwendet wird. Beim Einfügen über die UI muss man einige Dinge beachten.
Die Rule selbst ist einfach:
Die Rule triggert jedes Mal, wenn das Item den Zustand auf ON wechselt. Sollte das mit dem Impuls anders funktionieren, müsste man den Trigger notfalls anpassen.
Zunächst wird eine lokale Variable erzeugt und mit dem Wert 0 vorbelegt.
Falls das Counter Item einen gültigen Wert enthält, wird die Variable mit diesem Wert gesetzt.
Anschließend wird die Variable um eins erhöht. Die Schreibweise ist nur zulässig, weil es sich um eine Integer Variable handelt - ansonsten müsste man halt iCounter = iCounter + 1 schreiben.
Abschließend wird der Inhalt der Variablen in das Item transferiert.
Warum so kompliziert?
Das Counter Item kann einen ungültigen Status haben (NULL, UNDEF). Eine Addition wird in diesem Fall eine NullPointerException nach sich ziehen. Um diesen hässlichen Fehler zu umgehen, ist es unerlässlich, den Status auf Gültigkeit zu prüfen. Wenn man eh schon eine Prüfung vornehmen muss, kann man auch gleich einen Default Wert hinterlegen
und dafür ist der Weg über eine lokale Variable mit die einfachste Möglichkeit.
Wenn sichergestellt ist, dass das Item einen gültigen Wert hat, reicht auch diese Rule:
In welcher Form kommt der Impuls über mqtt an? wechselt die Payload kurz auf einen Wert und wieder zurück, oder wie muss ich mir das vorstellen?
Auf jeden Fall musst Du den Channel, in dem der Impuls ankommt, mit einem Item verknüpfen (gewöhnlich wird es sich um ein Switch Item oder Contact Item handeln, je nachdem, wie man das im Channel definiert hat).
Weiterhin brauchst Du ein Number Item, welches Du aufaddieren kannst. Nennen wir es im weiteren Verlauf GasCounter. Es ist sinnvoll, das Item mit restoreOnStartup zu persistieren, damit bei einem Neustart von openHAB der "Zählerstand" nicht verloren geht. Am sinnvollsten ist es, das restoreOnStartup mit mapDB zu erledigen.
Nun brauchst Du noch eine Rule, welche sich um die Addition kümmert. Es gibt verschieden Optionen für Rules und man kann grundsätzlich jede lösbare Aufgabe mit jeder Rule Engine lösen, allerdings lassen sich Text Rules hier im Forum einfacher teilen
Ich nutze die Notation, welche in einer *.rules Datei verwendet wird. Beim Einfügen über die UI muss man einige Dinge beachten.
Die Rule selbst ist einfach:
Code: Alles auswählen
rule "Gas Zähler"
when
Item GasImpuls changed to ON
then
var Integer iCounter = 0
if(GasCounter.state instanceof Number)
iCounter = (GasCounter.state as Number).intValue
iCounter += 1
GasCounter.postUpdate(iCounter)
endZunächst wird eine lokale Variable erzeugt und mit dem Wert 0 vorbelegt.
Falls das Counter Item einen gültigen Wert enthält, wird die Variable mit diesem Wert gesetzt.
Anschließend wird die Variable um eins erhöht. Die Schreibweise ist nur zulässig, weil es sich um eine Integer Variable handelt - ansonsten müsste man halt iCounter = iCounter + 1 schreiben.
Abschließend wird der Inhalt der Variablen in das Item transferiert.
Warum so kompliziert?
Das Counter Item kann einen ungültigen Status haben (NULL, UNDEF). Eine Addition wird in diesem Fall eine NullPointerException nach sich ziehen. Um diesen hässlichen Fehler zu umgehen, ist es unerlässlich, den Status auf Gültigkeit zu prüfen. Wenn man eh schon eine Prüfung vornehmen muss, kann man auch gleich einen Default Wert hinterlegen
Wenn sichergestellt ist, dass das Item einen gültigen Wert hat, reicht auch diese Rule:
Code: Alles auswählen
rule "Gas Zähler"
when
Item GasImpuls changed to ON
then
GasCounter.postUpdate((GasCounter.state as Number)+1)
endopenHAB5.0.1 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime) (Proxmox 9.0.11, LXC)
-
Egon_80
- Beiträge: 9
- Registriert: 7. Nov 2022 07:40
Re: Counter OH3
Hallo Udo1toni,
genau danach habe ich gesucht.
Vielen Dank....
genau danach habe ich gesucht.
Vielen Dank....