Gas-Zählerstand in manuell in openHab eingeben

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Locke
Beiträge: 251
Registriert: 14. Apr 2020 11:35
Answers: 3
Wohnort: bei Hamburg

Gas-Zählerstand in manuell in openHab eingeben

Beitrag von Locke »

Hi,
ich habe ein Reedkontakt an meinem Gaszähler montiert, Software (Arduino) habe ich aus dem Netz auf einem Wemos D1 mini. Es läuft auch und ich kann mir den Gas Verbrauch in Grafana auch anzeigen lassen. Leider hat der Arduino Sketch es nicht mit drin den Aktuellen Zählerstand mit anzugeben und ich bin da überfordert.
Kann man ein item mit dem Zählerstand anlegen und mit hochzählen lassen, so das man den Aktuellen Zählerstand auch in Grafana mit einbinden kann ?
In openHab habe ich Thing, Channel, item dafür angelegt. Es wird vom Reedkontakt per mqtt (stateTopic: gas/digital) pro Impuls immer "1" gesendet und "0".
Die Daten werden direkt in influxdb geschrieben (ist im Sketch schon mit angegeben).

läuft auf System Raspberry Pi 4, 2GB RAM, openHAB 3.3.0

Code: Alles auswählen

UID: mqtt:topic:Broker_163:GAS_Zaehler
label: GAS Zähler
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:Broker_163
channels:
  - id: GAS_Zaehler
    channelTypeUID: mqtt:number
    label: GAS Zähler
    description: ""
    configuration:
      stateTopic: gas/digital
  - id: GAS_Zaehler_Tagesverbrauch
    channelTypeUID: mqtt:number
    label: GAS Zähler Tagesverbrauch
    description: ""
    configuration:
      stateTopic: gas/tagesstand
  - id: GAS_Zaehler_Analog
    channelTypeUID: mqtt:number
    label: GAS Zähler Analog
    description: ""
    configuration:
      stateTopic: gas/analog
Danke
von peter-pan » 26. Feb 2024 11:32
...also; die Art wie Udo an das Thema ran gegangen ist, ist die mit den Möglichkeiten aus OH3/OH4 (Widgets). Mein Herangehensweise ist dagegen noch "oldschool", basierend auf der ursprünglichen Regel (OH2).

Aber noch mal von Anfang!
Unter OH2.5 hattest du damals ein Rule gepostet, mit der du einen Wert (erstmalig - Gaszaehler_Stand.postUpdate(Letzter_abgelesener_Zaehlerstand))setzen wolltest und danach sollte dieser Wert "fix" sein

Code: Alles auswählen

 if (Gaszaehler_Stand.state != NULL && Gaszaehler_Stand.state <= Letzter_abgelesener_Zaehlerstand) {
        Gaszaehler_Stand.postUpdate(Letzter_abgelesener_Zaehlerstand)  } 
und die Regel sollte beim Triggern diesen Wert immer wieder erhöhen
(var Einheit = 0.01)
. Und das hat ja auch schon funktioniert.

Deshalb habe ich eine zweite Regel vorgeschlagen, die basierend auf der "globalen Variablen"
(var Letzter_abgelesener_Zaehlerstand = 1495.70)
diesen Wert wieder in dein Item "Gaszaehler_Stand" setzt.

Wenn ich dich aber jetzt richtig verstehe, brauchst(willst) du die Prüfung auf den "letzten abgelesenen Zählerstand" gar nicht. Dann kann man diese Bedingung (s.o.) auch weglassen und mit der eleganten Lösung von Udo den Wert einfach direkt in das Item "Gaszaehler_Stand" per Widget setzen.

Der Yaml-Code wäre dann mit deinem Item:

Code: Alles auswählen

component: oh-input-card
config:
  item: Gaszaehler_Stand
  title: Eine Zahl
  name: Wert
  type: number
  inputmode: decimal
  sendButton: true
slots: null
und sieht so aus:
widget.jpg
Die Fehlermeldung...

Code: Alles auswählen

2024-02-26 11:12:46.645 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'test_zaehler_udo-1' failed: An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.DoubleExtensions.operator_plus(double,double) on instance: null in test_zaehler_udo
habe ich beim Ausführen der Regel auch bekommen und diese noch etwas angepasst (Deklaration der Variablen in der Rule-Typ):

Code: Alles auswählen

val            Einheit = 0.01                      // m³ pro Puls
val      Gaspreis_Jahr = 200.1                     // € pro Jahr
val       Gaspreis_Tag = 54.82191780821918         // ct pro Tag
val       Gaspreis_kWh = 19.269                    // ct pro kWh
val     Gaspreis_zZahl = 0.9645                    // z Zahl
val Gaspreis_Brennwert = 10.293                    // Brennwert

rule "Increment Gas Meter"
when
    Item Dummy_4 changed from OFF to ON
then
    var Number nCountTotal = 0.0
    var Number nCountToday = 0.0
    var Number     Faktor = Gaspreis_zZahl * Gaspreis_Brennwert * Gaspreis_kWh 

    if(Gaszaehler_Stand.state instanceof Number)
        nCountTotal = Gaszaehler_Stand.state as Number

    nCountTotal += Einheit
    Gaszaehler_Stand.postUpdate(nCountTotal)
    Thread.sleep(300)
    nCountToday = Gaszaehler_Stand.deltaSince(now.with(LocalTime.MIDNIGHT))
    Gaszaehler_Heute.postUpdate(nCountToday)
    Gaskosten_Heute.postUpdate((nCountToday * Faktor + Gaspreis_Tag) / 100) 
end
Dann hat's geklappt, "wie geschnitten Brot" :lol:
Gehe zur vollständigen Antwort
thnx
____Sven_________________________________________________________________________________________
System 1, Raspberry Pi 4, 4GB RAM, openHAB 2.5.10 / System 2, Raspberry Pi 4, 2GB RAM, openHAB 3.3.0 /
System 3, Raspberry Pi 4, 2GB RAM, openHAB 4.0.2 / System 4 (Testsystem), Raspberry Pi 4, 2GB RAM, openHAB 4.1.1 / System 5, (als NAS) Raspberry PI 4, 4 GB RAM, openmediavault 6.8.0-1 (Shaitan)

Locke
Beiträge: 251
Registriert: 14. Apr 2020 11:35
Answers: 3
Wohnort: bei Hamburg

Re: Gas-Zählerstand in manuell in openHab eingeben

Beitrag von Locke »

Hi,
ich habe von dem Ersteller des Sketches eine Antwort bekommen:

Hi. Ich verwende die Daten hauptsächlich in openHAB und berechne auch da ein paar Sachen damit. Dort mache ich auch die Summierung und Auswertungen:

Code: Alles auswählen

var Number Letzter_abgelesener_Zaehlerstand = 14950.70

var Number Einheit = 0.01

var Number Gaspreis_Monat = 200.1 // € pro Jahr
var Number Gaspreis_Tag = 54.82191780821918 // ct pro Tag
var Number Gaspreis_kWh = 19.269 // ct pro kWh
var Number Gaspreis_zZahl = 0.9645 // z Zahl
var Number Gaspreis_Brennwert = 10.293 //Brennwert

rule "Increment Gas Meter"
when
Item GASZahler_GASZahler changed from 0 to 1
then
// Aktuellen Zaehlerstand setzten - die folgenden drei Zeilen auskommentieren und anschließend einen Zählimpuls auslösen damit das Regelwerk einmal durchlaufen wird!
/**/ if (Gaszaehler_Stand.state != NULL && Gaszaehler_Stand.state < Letzter_abgelesener_Zaehlerstand) { /**/ postUpdate(Gaszaehler_Stand, (Letzter_abgelesener_Zaehlerstand)) /**/ } postUpdate(Gaszaehler_Heute, (Gaszaehler_Heute.state as DecimalType + Einheit)) postUpdate(Gaszaehler_Stand, (Gaszaehler_Stand.state as DecimalType + Einheit)) var Faktor = Gaspreis_zZahl * Gaspreis_Brennwert * Gaspreis_kWh postUpdate(Gaskosten_Heute, ((Gaszaehler_Heute.state as DecimalType * Faktor) + Gaspreis_Tag) / 100) end
Ich habe es geändert mit meinen items und bekomme aber immer die Fehlermeldung:

Code: Alles auswählen

[ERROR] [internal.handler.ScriptActionHandler] – Script execution of rule with UID ‚Gaszaehler_Stand‘ failed: var Number Letzter_abgelesener_Zaehlerstand = 14950.70
Könnt ihr mir weiterhelfen ?
Ich bekomme es einfach nicht hin
thnx
____Sven_________________________________________________________________________________________
System 1, Raspberry Pi 4, 4GB RAM, openHAB 2.5.10 / System 2, Raspberry Pi 4, 2GB RAM, openHAB 3.3.0 /
System 3, Raspberry Pi 4, 2GB RAM, openHAB 4.0.2 / System 4 (Testsystem), Raspberry Pi 4, 2GB RAM, openHAB 4.1.1 / System 5, (als NAS) Raspberry PI 4, 4 GB RAM, openmediavault 6.8.0-1 (Shaitan)

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

Re: Gas-Zählerstand in manuell in openHab eingeben

Beitrag von udo1toni »

Ist klar, dass es sich um eine DSL Rule handelt, die in dieser Form zwingend über eine rules Datei angelegt werden muss?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Locke
Beiträge: 251
Registriert: 14. Apr 2020 11:35
Answers: 3
Wohnort: bei Hamburg

Re: Gas-Zählerstand in manuell in openHab eingeben

Beitrag von Locke »

Hi Udo,
ja habe ich mir gedacht und es auch damit versucht, leider ohne Erfolg. Ich habe den Ersteller auch nochmal angeschrieben und um Hilfe gebeten, da er es bei sich so am laufen hat. Ich kann ja nur lernen dabei, es nur frustrierend wenn es irgendwie nicht klappt trotz vorgefertigten Rules usw……
thnx
____Sven_________________________________________________________________________________________
System 1, Raspberry Pi 4, 4GB RAM, openHAB 2.5.10 / System 2, Raspberry Pi 4, 2GB RAM, openHAB 3.3.0 /
System 3, Raspberry Pi 4, 2GB RAM, openHAB 4.0.2 / System 4 (Testsystem), Raspberry Pi 4, 2GB RAM, openHAB 4.1.1 / System 5, (als NAS) Raspberry PI 4, 4 GB RAM, openmediavault 6.8.0-1 (Shaitan)

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

Re: Gas-Zählerstand in manuell in openHab eingeben

Beitrag von peter-pan »

Ich bin mir zwar nicht sicher, aber es könnte sein, dass die Art der "Manipulation" der Item-States in der Regel nicht so funktionieren, wie es beabsichtigt ist. Schau mal hier.

Ich habe die "postUpdate"-Methoden etwas verändert. Als Trigger habe ich ein Dummy-Item-Switch genommen und den "Then-Teil" etwas "gehübscht", also aus einem Schlangensatz, einzelne Zeilenhäppchen gemacht und noch ein paar Logs eingebaut, damit man sieht, wenn und ob dir Regel auch triggert.

Das sieht dann so aus:

Code: Alles auswählen

var Number Letzter_abgelesener_Zaehlerstand = 1495.70
var  Number Einheit = 0.01
var Number Gaspreis_Monat = 200.1 // € pro Jahr
var Number Gaspreis_Tag = 54.82191780821918 // ct pro Tag
var Number Gaspreis_kWh = 19.269 // ct pro kWh
var Number Gaspreis_zZahl = 0.9645 // z Zahl
var Number Gaspreis_Brennwert = 10.293 //Brennwert

rule "Increment Gas Meter"
when
   Item Dummy_6 changed from OFF to ON
then
        logInfo("Zählerstand","Test aktiviert 1") 
// Aktuellen Zaehlerstand setzten - die folgenden drei Zeilen auskommentieren und anschließend einen Zählimpuls auslösen damit das Regelwerk einmal durchlaufen wird!
/**/ if (Gaszaehler_Stand.state != NULL && Gaszaehler_Stand.state < Letzter_abgelesener_Zaehlerstand) {
        logInfo("Zählerstand","Bedingung erfüllt") 
         /**/ Gaszaehler_Stand.postUpdate(Letzter_abgelesener_Zaehlerstand) /**/ } 
        Gaszaehler_Heute.postUpdate(Gaszaehler_Heute.state as DecimalType + Einheit)
        Gaszaehler_Stand.postUpdate(Gaszaehler_Stand.state as DecimalType + Einheit)
        var Faktor = Gaspreis_zZahl * Gaspreis_Brennwert * Gaspreis_kWh 
        postUpdate(Gaskosten_Heute, ((Gaszaehler_Heute.state as DecimalType * Faktor) + Gaspreis_Tag) / 100) 
        logInfo("Zählerstand","Test aktiviert 2") 
end
Die Regel ist dann bei mir auch durch gelaufen:

Code: Alles auswählen

2022-10-13 22:46:17.114 [INFO ] [penhab.core.model.script.Zählerstand] - Test aktiviert 1
2022-10-13 22:46:17.131 [INFO ] [penhab.core.model.script.Zählerstand] - Test aktiviert 2
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

Locke
Beiträge: 251
Registriert: 14. Apr 2020 11:35
Answers: 3
Wohnort: bei Hamburg

Re: Gas-Zählerstand in manuell in openHab eingeben

Beitrag von Locke »

peter-pan hat geschrieben: 13. Okt 2022 22:49

Hi Peter,
danke für Deine Unterstützung.
Ich habe die Regel von Dir kopiert und bei mir getestet auch mit einem Dummy Schalter und sie läuft hier bei mir nicht.
Die Regel habe ich in VSC erstellt.
Beim ausführen kommt die Fehlermeldung:

Code: Alles auswählen

[ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'Increment_Gas_Meter-1' failed: Could not cast NULL to org.openhab.core.library.types.DecimalType; line 56, column 37, length 37 in Increment_Gas_Meter
Hast Du eine Erklärung dafür warum es bei Dir läuft und bei mir nicht ?

Danke
thnx
____Sven_________________________________________________________________________________________
System 1, Raspberry Pi 4, 4GB RAM, openHAB 2.5.10 / System 2, Raspberry Pi 4, 2GB RAM, openHAB 3.3.0 /
System 3, Raspberry Pi 4, 2GB RAM, openHAB 4.0.2 / System 4 (Testsystem), Raspberry Pi 4, 2GB RAM, openHAB 4.1.1 / System 5, (als NAS) Raspberry PI 4, 4 GB RAM, openmediavault 6.8.0-1 (Shaitan)

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

Re: Gas-Zählerstand in manuell in openHab eingeben

Beitrag von peter-pan »

Locke hat geschrieben: 14. Okt 2022 12:13 Hast Du eine Erklärung dafür warum es bei Dir läuft und bei mir nicht ?
....so aus der "Lameng" nicht :?: :?

Was steht denn da bei dir in der Zeile 56 der Regel ? Du weiß schon, dass alle globalen Variablen vor der ersten Regel in deinem Rules-File stehen müssen !!!
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

Locke
Beiträge: 251
Registriert: 14. Apr 2020 11:35
Answers: 3
Wohnort: bei Hamburg

Re: Gas-Zählerstand in manuell in openHab eingeben

Beitrag von Locke »

Hi,
in der Regel Zeile 56 steht:

Code: Alles auswählen

        Gaszaehler_Heute.postUpdate(Gaszaehler_Heute.state as DecimalType + Einheit)
Die Regel sieht so aus:

Code: Alles auswählen

var Number Letzter_abgelesener_Zaehlerstand = 1495.70
var  Number Einheit = 0.01
var Number Gaspreis_Monat = 200.1 // € pro Jahr
var Number Gaspreis_Tag = 54.82191780821918 // ct pro Tag
var Number Gaspreis_kWh = 19.269 // ct pro kWh
var Number Gaspreis_zZahl = 0.9645 // z Zahl
var Number Gaspreis_Brennwert = 10.293 //Brennwert

rule "Increment Gas Meter"
when
   Item DummySchalter_TestSchalter changed from OFF to ON
then
        logInfo("Zählerstand","Test aktiviert 1") 
// Aktuellen Zaehlerstand setzten - die folgenden drei Zeilen auskommentieren und anschließend einen Zählimpuls auslösen damit das Regelwerk einmal durchlaufen wird!
/**/ if (Gaszaehler_Stand.state != NULL && Gaszaehler_Stand.state < Letzter_abgelesener_Zaehlerstand) {
        logInfo("Zählerstand","Bedingung erfüllt") 
          /**/ Gaszaehler_Stand.postUpdate(Letzter_abgelesener_Zaehlerstand) /**/ } 
        Gaszaehler_Heute.postUpdate(Gaszaehler_Heute.state as DecimalType + Einheit)
        Gaszaehler_Stand.postUpdate(Gaszaehler_Stand.state as DecimalType + Einheit)
        var Faktor = Gaspreis_zZahl * Gaspreis_Brennwert * Gaspreis_kWh 
        postUpdate(Gaskosten_Heute, ((Gaszaehler_Heute.state as DecimalType * Faktor) + Gaspreis_Tag) / 100) 
        logInfo("Zählerstand","Test aktiviert 2")
end
an dieser Stelle meckert er
Gaszaehler_Heute.postUpdate(Gaszaehler_Heute.state as DecimalType + Einheit)
thnx
____Sven_________________________________________________________________________________________
System 1, Raspberry Pi 4, 4GB RAM, openHAB 2.5.10 / System 2, Raspberry Pi 4, 2GB RAM, openHAB 3.3.0 /
System 3, Raspberry Pi 4, 2GB RAM, openHAB 4.0.2 / System 4 (Testsystem), Raspberry Pi 4, 2GB RAM, openHAB 4.1.1 / System 5, (als NAS) Raspberry PI 4, 4 GB RAM, openmediavault 6.8.0-1 (Shaitan)

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

Re: Gas-Zählerstand in manuell in openHab eingeben

Beitrag von peter-pan »

Es ist von meiner Seite aus auch mit deiner Regel gelaufen, obwohl noch ein kleiner Schönheitsfehler (schon von mir) enthalten war:

Code: Alles auswählen

var  Number Einheit = 0.01
var Number Einheit = 0.01
Trotzdem läuft die Regel bei mir.

Was für einen Status hat denn das Item "Gaszaehler_Heute". Evtl. müsste man das noch initialisieren.

Also noch ein Versuch:

Code: Alles auswählen

var Number Letzter_abgelesener_Zaehlerstand = 1495.70
var Number Einheit = 0.01
var Number Gaspreis_Monat = 200.1 // € pro Jahr
var Number Gaspreis_Tag = 54.82191780821918 // ct pro Tag
var Number Gaspreis_kWh = 19.269 // ct pro kWh
var Number Gaspreis_zZahl = 0.9645 // z Zahl
var Number Gaspreis_Brennwert = 10.293 //Brennwert

rule "Increment Gas Meter"
when
   Item DummySchalter_TestSchalter changed from OFF to ON
then
     logInfo("Zählerstand","Test aktiviert 1") 
     if (!(Gaszaehler_Heute.state instanceof Number)) {
         logInfo("Zählerstand","Test Gaszaehler_Heute wird initialisiert")
         Gaszaehler_Heute.postUpdate(0)
     }
     if (!(Gaszaehler_Stand.state instanceof Number)) {
         logInfo("Zählerstand","Test Gaszaehler_Stand wird initialisiert")
         Gaszaehler_Stand.postUpdate(0)
     }
        
// Aktuellen Zaehlerstand setzten - die folgenden drei Zeilen auskommentieren und anschließend einen Zählimpuls auslösen damit das Regelwerk einmal durchlaufen wird!
/**/ if (Gaszaehler_Stand.state != NULL && Gaszaehler_Stand.state < Letzter_abgelesener_Zaehlerstand) {
        logInfo("Zählerstand","Bedingung erfüllt") 
          /**/ Gaszaehler_Stand.postUpdate(Letzter_abgelesener_Zaehlerstand) /**/ } 
        Gaszaehler_Heute.postUpdate(Gaszaehler_Heute.state as DecimalType + Einheit)
        Gaszaehler_Stand.postUpdate(Gaszaehler_Stand.state as DecimalType + Einheit)
        var Faktor = Gaspreis_zZahl * Gaspreis_Brennwert * Gaspreis_kWh 
        postUpdate(Gaskosten_Heute, ((Gaszaehler_Heute.state as DecimalType * Faktor) + Gaspreis_Tag) / 100) 
        logInfo("Zählerstand","Test aktiviert 2")
end
Jetzt wird also noch abgefragt, ob die Items auch tatsächlich einen Wert enthalten.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

Locke
Beiträge: 251
Registriert: 14. Apr 2020 11:35
Answers: 3
Wohnort: bei Hamburg

Re: Gas-Zählerstand in manuell in openHab eingeben

Beitrag von Locke »

peter-pan hat geschrieben: 14. Okt 2022 14:05
Hi Peter,
jetzt mit Deiner letzten umgebauten Regel funktioniert es :D
Ich danke Dir für diese tolle Unterstützung.
Hast Du denn jetzt eine Idee warum es vorher nicht funktioniert hat bei mir ?
Ihr seid echt super hier.

Danke
thnx
____Sven_________________________________________________________________________________________
System 1, Raspberry Pi 4, 4GB RAM, openHAB 2.5.10 / System 2, Raspberry Pi 4, 2GB RAM, openHAB 3.3.0 /
System 3, Raspberry Pi 4, 2GB RAM, openHAB 4.0.2 / System 4 (Testsystem), Raspberry Pi 4, 2GB RAM, openHAB 4.1.1 / System 5, (als NAS) Raspberry PI 4, 4 GB RAM, openmediavault 6.8.0-1 (Shaitan)

Antworten