Counter OH3

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Egon_80
Beiträge: 9
Registriert: 7. Nov 2022 07:40
Answers: 0

Counter OH3

Beitrag von Egon_80 »

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. :?:

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

Re: Counter OH3

Beitrag von udo1toni »

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:

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)
end
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:

Code: Alles auswählen

rule "Gas Zähler"
when
    Item GasImpuls changed to ON
then
    GasCounter.postUpdate((GasCounter.state as Number)+1)
end
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Egon_80
Beiträge: 9
Registriert: 7. Nov 2022 07:40
Answers: 0

Re: Counter OH3

Beitrag von Egon_80 »

Hallo Udo1toni,
genau danach habe ich gesucht.
Vielen Dank....

Antworten