Anfängerfragen

Hier bitte alles rein was Off-topic ist.

Moderatoren: Cyrelian, seppy

harasch
Beiträge: 17
Registriert: 24. Dez 2023 20:09
Answers: 0

Anfängerfragen

Beitrag von harasch »

Hallo ich bin neu im Forum und hätte einige grundsätzliche Fragen.
Zunächst möchte ich mich kurz vorstellen.
Ich bin von Beruf Elektrotechniker und wohne in der schönen Pfalz. Mein Hobby ist die Elektronik vom arbeiten mit eagle bis zur Erstellung der Platinen. Eigentlich arbeite ich gerne mit den Microkontroller von Atmel. Ich habe aber vor einiger Zeit angefangen mit Hausautomation. Ich verwende hauptsächlich Shelly's aber auch einige esp d1 mini pro. Software benutze ich openhabe3 eine mariaDB und visualisiere einiges mit Grafana.
Es hat bisher alles funktioniert ohne das ich in openhab rules benutzt habe. jetzt komme ich aber nicht mehr ohne aus.
Ich habe den Status meiner Heizung z.B. Brenner 'an', Warmwassertemperatur, Vorlauftemperatur u.s.w. in der DB gespeichert und visualisiert. Jetzt möchte ich natürlich auch den Gasverbrauch erfassen. ich habe schon einiges dazu gelesen in verschiedenen Foren. Leider bin ich jetzt an einem Punkt an dem ich nicht mehr weiterkomme. Ich habe mit einem wemos d1 mini pro auf dem ESPEasy läuft einen Counter als Device angelegt. Die Daten bekomme ich auch im openhab per MQTT übertragen, soweit gut. Jetzt wollte ich eine Rule erstellen bei dem die Counts von einem Item einem anderen item übergeben werden soll. Der Grund ist das das item count um Mitternacht auf null gesetzt wird. Ich habe auch hier im Forum einiges gelesen und auch ausprobiert. Mein Problem ist egal wo ich welche Regel erstelle es funktioniert überhaupt keine Regel. Weder wenn ich was als script schreibe oder eine Standart Rule erstelle mit vorgegebener Maske oder auch als ECMA script. Es tut sich absolut nichts.
Könnte mir vieleicht jemand einen Schubser geben, vieleicht brauche ich nur einen kleinen Hinweis. Die Rules welche ich bisher gelesen habe kann ich auch nachvollziehen, aber wie gesagt es tut sich nichts.
Ich weis auch nicht wie man zum Beispiel ein Item, welches man ohne binding als text erstellt debuggen kann um zu sehen ob sich irgendwas tut.
Für Eure hilfe wäre ich sehr dankbar.
Viele Grüße

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

Re: Anfängerfragen

Beitrag von udo1toni »

Herzlich willkommen im openHAB Forum!

Im Grunde sollte eine simple Rule für Deine Zwecke ausreichen. Wichtig ist aber zunächst, wie die Items definiert sind.
Nehmen wir an, Du hast ein Item HeizungCount, das müsste vom Typ Number sein.
dann brauchst Du noch ein zweites Item, meinetwegen HeizungCountGesamt.
Die zugehörige Rule kannst Du über die UI erstellen:
Main UI->Administration->Einstellungen->Rules->add (weißes plus in blauem Kreis, rechte untere Ecke) Unique ID (z.B. count) Name (z.B. Heizung Zähler) When->Add Trigger->Item (Item HeizungCount selektieren; falls das Item nicht angezeigt wird, unten Show non-semantic anhaken) -> Pick (links oben) -> changed (Radio-Button wählen) -> Done (links oben) Achtung! nichts anderes anwählen, kein from, kein to, keinen Wert eintragen
Then -> Add Action -> Inline script -> Rules DSL.
Ich habe kein openHAB3 mehr zur Hand (ist einfach zu alt...), aber ich meine, dass an dieser Stelle das Bearbeitungsfenster schließt. Du kannst Dann das eigentliche Script bearbeiten, indem Du erneut die Zeile mit der neu angelegten Action anklickst. Es geht auf jeden Fall ein Editor-Fenster auf, in dem Du ausschließlich folgendes einträgst:

Code: Alles auswählen

var zaehler = 0
if(HeizungCountGesamt.state instanceof Number)
   zaehler = (HeizungCountGesamt.state as Number).intValue
HeizungCountGesamt.postUpdate(zaehler + 1)
Anschließend wählst Du Save bis Du wieder auf der Liste der Rules stehst.
Die Einrückungen sind optional, sie dienen nur der besseren Lesbarkeit.

Wenn Du die Rule zur Ansicht öffnest, findest Du an der oberen Kante zwei Karteireiter, der rechte davon ist mit Code beschriftet und zeigt nun in etwa folgenden Inhalt:

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: HeizungCount
    type: core.ItemStateChangeTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: |-
        var zaehler = 0
        if(HeizungCountGesamt.state instanceof Number)
          zaehler = (HeizungCountGesamt.state as Number).intValue
        HeizungCountGesamt.postUpdate(zaehler + 1)
    type: script.ScriptAction
Auf dem anderen Karteireiter Design gibt es außerdem einen "Play" Knopf, mit dem Du die Regel von Hand starten kannst (nur so zum testen).

Im linken Seitenmenü gibt es noch den Punkt Items, dort solltest Du das Item HeizungCountGesamt auch finden (es gibt auch eine Suchfunktion ganz oben, falls Du viele Items nutzt) und dort sollte das Item auch seinen Wert anzeigen.

Das Script selbst arbeitet folgendermaßen:
1. es legt eine lokale Variable an und füllt diese mit dem Wert 0
2. Falls das Item HeizungCountGesamt als Status eine gültige Zahl liefert, nimmt es diese Zahl, bildet daraus eine Ganzzahl und schreibt diese Ganzzahl in die Variable
3. die Variable wird um 1 hochgezählt und der Wert in das Item HeizungCountGesamt geschrieben.

Es gibt etliche mögliche Fehlerquellen, was diese einfache Aufgabe betrifft, aber der gezeigte Code wird funktionieren, wenn die Rahmenbedingungen stimmen (Items sind vom Typ Number und existieren in exakt der angegebenen Schreibweise)
Anders als alle anderen Scriptsprachen ist die Rules DSL Teil des openHAB Core, das heißt, man muss/kann sie nicht extra installieren (eine Fehlerquelle weniger). Ein Number Item welches neu angelegt wurde, hat zunächst den Wert NULL als Status. Man kann nicht NULL + 1 rechnen, bzw. man kann schon, aber es wird kein gültiges Ergebnis geben und in der Folge kann auch kein gültiger Wert im Item landen. Das ist ein häufiger "Anfängerfehler" (passiert aber auch alten Hasen...) Der Code oben prüft deshalb zunächst, ob eine gültige Zahl vorliegt, bevor damit gerechnet wird.
Zu guter Letzt wird gerne vergessen, dass ein Item Status eine von mehreren möglichen Eigenschaften eines Items ist, man muss also explizit auf den Status zugreifen (.state) wenn man den Status nutzen will und genauso die passende Methode verwenden (.postUpdate()), um den Status zu setzen.

Da es keine Möglichkeit gibt, den Wert eines Number Items ohne Code zu erhöhen, ist die obige Regel quasi die einfachst-mögliche Variante.

Alternativ zur UI kannst Du die Rule auch über eine Textdatei anlegen, dazu legst Du im Ordner $OPENHAB_CONF/rules/ eine Datei mit der Endung .rules an (auf einem Raspberry Pi als Plattform, installiert über openHABian oder alternativ mittels apt z.B. /etc/openhab/rules/meine.rules)
Der Dateiname selbst ist beliebig, solange die Endung korrekt ist (Groß/Kleinschreibung ist wichtig!). Um mögliche Fehler auszuschließen sollten Dateinamen möglichst keine Sonderzeichen und auch kein Leerzeichen enthalten. Englisches Alphabet, arabische Ziffern und meinetwegen noch der Unterstrich _, sonst nichts (obwohl noch viele andere Zeichen problemlos funktionieren werden...)

Der Inhalt der Datei wäre dann dies hier:

Code: Alles auswählen

rule "Heizung Zähler"
 when
    Item HeizungCount changed
 then
     var zaehler = 0
    if(HeizungCountGesamt.state instanceof Number)
    zaehler = (HeizungCountGesamt.state as Number).intValue
    HeizungCountGesamt.postUpdate(zaehler + 1)
 end
Anders als der Dateiname oder auch die UID einer Rule oder eines Items/Things/Channels usw. darf das Label einer Rule sehr wohl Sonderzeichen und Leerzeichen enthalten, wichtig ist nur, dass das Label systemweit eindeutig ist (es darf keine andere Rule mit dem selben Label geben, egal ob nun per Datei oder per UI angelegt)
Der Trigger wird hinter dem Schlüsselwort when definiert, der auszuführende Code steht zwischen den Schlüsselworten then und end. der Code ist identisch mit dem Code von oben.

Wenn Du die Rule per Datei anlegst, taucht sie ebenfalls in der UI auf, nur kannst Du sie dort dann nicht bearbeiten. Manuell starten (Play-Knopf) geht aber auch mit dieser Art Rules.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

harasch
Beiträge: 17
Registriert: 24. Dez 2023 20:09
Answers: 0

Re: Anfängerfragen

Beitrag von harasch »

Hallo udo1toni,
zunächst mal 'Frohe Weihnachten'!
Vielen Dank für die schnelle Antwort. Viele Informationen, das muß ich erst verarbeiten. Vieles von dem hatte ich schon intuitiv gemacht, aber wie gesagt ohne Erfolg. Ich weiß aber auch, dass wenn irgendwo etwas nicht ganz genau gemacht wird, eben nichts funktioniert.
Ich werde nun Deine Anleitung wirklich Schritt für Schritt versuchen umzusetzen.
Also nochmal vielen Dank!

harasch
Beiträge: 17
Registriert: 24. Dez 2023 20:09
Answers: 0

Re: Anfängerfragen

Beitrag von harasch »

Hallo udo1toni,
ich habe alle alten scripts und rules gelöscht was damit zusammenhing. Ich habe dann wie in der Anleitung ein script erstellt, vorab ein Item angelegt vom Typ Number und hab den Namen Gaszaehler_Stand vergeben.
Dann die Rule erstellt und das dazugehöhrige script ausgewählt welches als action ausgeführt werden soll. Es tut sich allerdings nichts.
Die counts vom ESP werden korrekt hochgezählt und im Item gaszaehler auch richtig angezeigt.
Das Item Gaszaehler_Stand bleibt aber stur auf NULL. Gibt es eine Möglichkeit dem Item Gaszaehler_Stand z.B. den Wert 0 zuzuweisen.
Ich konnte nirgendwo etwas finden.
Was aber auch erstaunlich ist, wenn ich den Magnet an den Reedkontakt halte ändert sich der Status der Rule, geht von idle auf running und wieder auf idle. Ich denke es hat damit etwas zu tun was Du beschrieben hast, das man nicht zu NULL etwas dazuaddieren kann.
Hast Du vieleicht eine Lösung?
Gruß, Harald

harasch
Beiträge: 17
Registriert: 24. Dez 2023 20:09
Answers: 0

Re: Anfängerfragen

Beitrag von harasch »

Hallo ich bins noch einmal,
es hat sich jetzt tatsächlich etwas verändert. Ich hatte noch ein Schreibfehler drin. Jetzt ist es so, dass das Item Gaszaehler_Stand tatsächlich hochgezählt wird, allerdings nur wenn ich auf den play Knopf drücke. Wenn sich das Item gaszaehler ändert wird die Rule nicht ausgeführt.
Hast Du eine Idee.

Gruß, Harald

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

Re: Anfängerfragen

Beitrag von udo1toni »

Schau bitte mal in das Log, was wirklich passiert, wenn das Item, welches die Rule auslöst, einen neuen Wert bekommt.
Falls Du jetzt fragst: Welches Log?:

Wenn Du das openHABian Image auf einem Pi verwendest, gibt es unter der selben IP, unter der auch openHAB mit http unter dem Port 8080 erreichbar ist, noch eine Seite, die mit http unter dem Port 9001 erreichbar ist. (Frontail ist der Name des Dienstes)

Alternativ - oder wenn Du openHAB auf anderem Weg installiert hast - findest Du die entsprechenden Datn im Dateisystem, auf einem GNU/Linux System gewöhnlich unter /var/log/openhab/ und in diesem Verzeichnis die Datei events.log, diese enthält alle openHAB Ereignisse, sofern sich aus diesen Ereignissen eine Änderung ergibt.
Die Datei wird bis zu einer gewissen Größe beschrieben und anschließend weg-rotiert, aus events.log wird events.log.1, aus events.log.1 wird vorher events.log.2 usw, und ältere Versionen werden außerdem mit gz gepackt. (also z.B. events.log.2.gz). Das Logging ist gewöhnlich lückenlos für ca. eine bis zwei Wochen (kommt etwas auf die Größe des Systems an), man kann hier also auch weiter zurückliegende Ereignisse anschauen.
Wichtig ist halt, die Rule triggert auf changed, d.h. das Item muss seinen Status ändern. Sollte in dem Item nur jeweils eine 1 ankommen (also ein Impuls vom Balgenzähler), dann muss der Trigger auf "received update" geändert werden, weil das Item selbst seinen Status nicht ändert.

Wenn Du über das Dateisystem suchst: cat dateiname | grep Itemname zeigt alle Zeilen der Datei dateiname an, die das Wort Itemname enthalten.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

harasch
Beiträge: 17
Registriert: 24. Dez 2023 20:09
Answers: 0

Re: Anfängerfragen

Beitrag von harasch »

Hallo udo1toni,
tatsächlich habe ich im Log einen Fehler erkannt. War einfach ein Schreibfehler. Ein weiterer Fehler war in der Logik, ich hatte execute script anstatt run script ausgewählt. Das script läuft jetzt. Was komisch ist, dass der Wert heute morgen im Item Gaszaehler_stand auf 1 stand. Gestern waren es, manuell zählen lassen, über 127. Der esp ist immer an Spannung, wird es eventuell automatisch um Mitternacht zurück gesetzt ? Wäre nicht schlecht, dann könnte ich mir einen weitere Rule sparen.
Bei mir läuft alles auf einem win10 System, bisher ohne Probleme. Nur vor einem Update von Openhab habe ich Respekt.
Ohne den 'zaehle' müßte die Übergabe dann folgendermaßen aussehen.

if(gaszaehler.state instanceof Number)
Gaszaehler_Stand = (gaszaehler.state as Number). intValue
Gaszaehler_Stand.postUpdate(gaszaehler)

Das Item gaszaehler bekommt ja die counts über MQTT vom ESP. Nun sollte der Inhalt von Gaszaehler_Stand vor Mittenacht in die db geschrieben werden,(direkt von der rule oder über die jdbc.persist)?
Die Counts von gaszaehler müssen aber noch in ein weiteres Item (Gasverbrauch gesamt) übergeben werden und ebenfalls gesichert werden. Denn der Wert total auf dem ESPEasy wird nicht persistiert.
Wenn das so funktioniert könnte ich alle anderen Berechnungen in openhab machen.

Ich danke Dir für Deine prompte Hilfe und hoffe ich kann auf Deine Expertise auch in Zukunft zugreifen.

Harald

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

Re: Anfängerfragen

Beitrag von udo1toni »

Ich glaube, Du wirfst da verschiedene Dinge durcheinander und denkst an anderer Stelle zu kompliziert.

Punkt 1: ein Item ist etwas anderes als eine Variable.
Ein Item hat verschiedene Eigenschaften, wenn Du mit einem Item arbeitest, musst Du also immer angeben, welche Eigenschaft Du meinst (z.B. Item.state, um den Status von Item zu erfahren). Außerdem kennt es Methoden, z.B. um den Status zu setzen (Item.postUpdate(Wert) setzt den Status von Item auf Wert)
Eine Variable hat keine Eigenschaften, Du kannst deshalb die Variable direkt verwenden, also z.B. meineVariable = 5
harasch hat geschrieben: 27. Dez 2023 11:31

Code: Alles auswählen

if(gaszaehler.state instanceof Number)
Gaszaehler_Stand = (gaszaehler.state as Number). intValue
//                                              ^ das Leerzeichen ist zu viel
Gaszaehler_Stand.postUpdate(gaszaehler)  // gaszaehler ist ein Item, oder? Dann knallt es hier
Also, abgesehen davon, dass der Code so oder so unsinnig ist :)

Wenn Du ein ESP Modul nutzt, welches die Impulse vom Gaszähler an openHAB weiter leitet, dann kannst Du einfach diese Impulse zählen. Wichtig ist dabei nur, dass das Item, in dem Du zählst, vom Typ Number ist. Damit der Zählerstand nicht verloren geht, kannst Du das Item mit der Strategy restoreOnStartup versehen. Falls openHAB neu gestartet wird, liest openHAB dann beim Start den letzten Zustand des Items vor dem Neustart aus und verwendet diesen als Initialwert. Wenn Du wissen willst, was Du "heute" verbraucht hast, kannst Du die Persistence befragen:

Code: Alles auswählen

Item.deltaSince(now.with(LocalTime.MIDNIGHT))
liefert die Differenz zwischen dem aktuellen Zählerstand und dem Zählerstand um Mitternacht. Genauso lassen sich auch beliebige andere Zeitpunkte als Startpunkt nutzen, oder auch bestimmte Zeiträume (deltaBetween) auslesen. Dazu muss das Item aber durchzählen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

harasch
Beiträge: 17
Registriert: 24. Dez 2023 20:09
Answers: 0

Re: Anfängerfragen

Beitrag von harasch »

Hallo udo1toni,
naja, jetzt bin ich wieder am Anfang. Hier kommt halt der bascom programmierer durch. Da werden eben variablen an Andere vom gleichen Typ übergeben oder das Ergebnis von Funktionen.
Wenn die Methode item.state den Inhalt des items zurück gibt und die Methode item.postUpdate(wert) den Wert des items beschreibt, dann wärs doch einfach so item_1.postUpdate(item_2.state) den Wert von item_2 auf das item_1 zu übergeben. Mal ganz einfach gesehen.
Ich bin ziemlich durcheinander.
Wenn der Code von Dir funktioniert (macht er auch) dann sollte doch die Variable zeahler den Wert des items gaszaehler.state haben.
zaehler = (gaszaehler.state as Number).intValue
Das funktioniert bei mir nicht. Nur das aufwärts zählen mit zaehler+1 das funktioniert. Bringt mir aber nichts.
Was ich eigentlich machen will, ist die counts welche vom ESP kommen zählen, das funktioniert mit dem item gaszahler.
dann sollte am 23:59 der Wert des items an das Item Tagesverbrauch(gibt dann später immer den Vortag) übergeben werden mit dem ich dann verschiedenen Berechnungen den Tagesverbrauch in m³ sowie die Kosten in € berechnen lasse. Das item gaszaehler soll dann um midnight auf 0 gesetzt werden um die counts des nächsten Tages zu zählen. Das item Gesamtverbrauch soll ebenfalls den Wert des items gaszaehler übernehmen, nur wird das nicht auf 0 gesetzt sondern die counts werden aufaddiert damit ich den Gesamtverbrauch per Woche, Monat und Jahr visualisieren kann.
Das ist quasi mein Ziel.
Ich habe viele verschiedene Codes gesehen welche genau dieses Thema behandeln, nur wie Eingangs schon gesagt funktioniert bei mir nix. Wahrscheinlich fehlt mir zu viel Hintergrundwissen.
Alleine schon Grundsätzliches Wissen was fehlt.
Ich habe ja in openHab den Reiter script und den Reiter rule. Wenn ich den Reiter script auswähle und den Code mit
rule "Test"
when Trigger
then action
end
Wird das script dann auch abgearbeitet oder muß ich den Reiter rule und dann run script auswählen um das script ab zu arbeiten.
Das sind so grunsätzliche Fragen welche mir noch nicht ganz klar sind.
Gruß, Harald

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

Re: Anfängerfragen

Beitrag von udo1toni »

Ist das Item gaszaehler denn vom Typ Number?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten