Rules wieder ...

Alle Infos und Tipps speziell zu openHAB 2

Moderatoren: seppy, udo1toni

Antworten
pampulea
Beiträge: 7
Registriert: 5. Mär 2019 19:03

Rules wieder ...

Beitrag von pampulea » 16. Mär 2019 18:23

Hallo zusammen,
habe seit gestern ein Problem mit rules, und zwar:
ich lese von Fronius Wechselrichter und ein EMH-eHZ Stromzähler. Soweit funktioniert alles. Ich habe versucht die letzten Tage die Historische Werte zu ermitteln. D.h. heutige Stromverbrauch, heutige Einspeise u.s.w. Gestern Abend hat funktioniert und dachte das wars. Heute Morgen habe ein Neustart gemacht und danach kommt die Fehlermeldung mit dem rule!!!
Hier die rule:

Code: Alles auswählen

rule "Stromzaehler Verbrauch Tag"
	when
		Item STR_sum received update
	then
		STR_tag.postUpdate(STR_sum.deltaSince(now.withTimeAtStartOfDay))
		STR_ges.postUpdate(STR_sum)
		STR_akt.postUpdate(STR_act)
end
Und hier die Fehlermeldung:

Code: Alles auswählen

2019-03-16 18:20:21.996 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Stromzaehler Verbrauch Tag': The argument 'state' must not be null.
Was könnte passieren nach dem Neustart?
Kann mir bitte jemanden helfen?
Vielen Dank!

Beste Grüße,
Pampulea

Benutzeravatar
udo1toni
Beiträge: 1259
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Rules wieder ...

Beitrag von udo1toni » 17. Mär 2019 18:08

Nach einem Neustart sind alle Items noch nicht initialisiert und entsprechend noch mit dem Status NULL gesetzt. Bevor Du einen Wert schreibst, solltest Du prüfen, ob der Wert auch gültig ist. Die 2. Zeile kann eigentlich nie korrkt funktioniert haben (es sei denn, openHAB ist inzwischen noch weniger pingelig als ohnehin schon), denn Du müsstest hier nicht das Item als Argument übergeben, sondern dessen Status:

Code: Alles auswählen

STR_ges.postUpdate(STR_sum.state)

pampulea
Beiträge: 7
Registriert: 5. Mär 2019 19:03

Re: Rules wieder ...

Beitrag von pampulea » 17. Mär 2019 18:34

Hallo udo1toni,
ja du hast recht. Ursprunglich hatte ich so mit dem .state drin. Kamm aber eine Fehlermeldung dass die nicht NULL sein kann.
Danach habe gelöscht.
Aber "STR_ges" ist definiert als Item. Im influx.persistence stehl mit dem Option "restoreOnStartup".
Ich frage mich soll nicht nach neustart wieder mit dem alte Wert gesetzt?
Danke dir!
Beste Grüße,
Pampulea

Benutzeravatar
udo1toni
Beiträge: 1259
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Rules wieder ...

Beitrag von udo1toni » 17. Mär 2019 20:27

Ja, restoreOnStartup stellt den alten Wert wieder her, aber openHAB arbeitet stateless und asynchron, es gibt keine festgelegte Reihenfolge beim Start, es gibt keinerlei Garantien, zu welchem Zeitpunkt während des Systemstarts was passiert, das unterscheidet sich von System zu System und kann sogar von Start zu Start verschieden ablaufen. Bei Systemstarted ist es sogar häufig so, dass Items noch NULL liefern, weil die Persistence noch nicht initialisiert ist, welche für restoreOnStartup verwendet wird.

pampulea
Beiträge: 7
Registriert: 5. Mär 2019 19:03

Re: Rules wieder ...

Beitrag von pampulea » 19. Mär 2019 10:59

Hallo,
also wie soll ich hier weiterkommen.
Ich möchte hier den täglichen Stromverbrauch messen.
Die Rule will immer noch nicht. Keine Fehlermeldung!
Kann mir bitte jemand eine idee geben?
STR_ges gibt es. Wie schreibe der Wert täglich um 0.00 Uhr in eine Variable? Und weiter die Variable soll ich aus der STR_ges subtrahiere!
Oder gibt es eine andere Lösung für?
BG,
Pampulea

Benutzeravatar
udo1toni
Beiträge: 1259
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Rules wieder ...

Beitrag von udo1toni » 19. Mär 2019 17:26

Du musst erst mal rausfinden, an welcher Stelle es nun tatsächlich schief geht:

Code: Alles auswählen

rule "Stromzaehler Verbrauch Tag"
when
    Item STR_sum received update
then
    val myDelta = STR_sum.deltaSince(now.withTimeAtStartOfDay)
    if(!(myDelta instanceof Number)) {
        logError("energymeter","myDelta not of type Number! {}",myDelta)
        return;
    }
    if(!(STR_sum.state instanceof Number) {
        logError("energymeter","STR_sum.state not of type Number! {}", STR_sum.state)
        return;
    }
    if(!(STR_act.state instanceof Number) {
        logError("energymeter","STR_act.state not of type Number! {}", STR_act.state)
        return;
    }
    STR_tag.postUpdate(myDelta)
    STR_ges.postUpdate(STR_sum.state as Number)
    STR_akt.postUpdate(STR_act.state as Number)
end
Bitte beachte den Unterschied zwischen Variablen und Items. Du möchtest die Werte anzeigen, da brauchst Du ohnehin Items. Solange Du keine Berechnungen ausführst, ist die Variable oder Konstante nur eine Möglichkeit, aus einer mehrfach benötigten langen Zeichenkette (siehe oben) eine kurze Zeichenkette zu machen.

pampulea
Beiträge: 7
Registriert: 5. Mär 2019 19:03

Re: Rules wieder ...

Beitrag von pampulea » 21. Mär 2019 16:54

Hallo udo1toni,
ja der Unterschied zwischen Variablen und item kenne ich. Aber Danke!
Und nochmal danke, weil es funktioniert.
Habe eingebaut und ohne meckern hat funktioniert.
Ich habe noch einen bitte:
Wie kann ich von dem Beispiel weitergehen und den Verbrauch für die letzten 3-6 Tage berechne? Eigentlich nur einmal berechnen und je Abend eine Andere item mit der Aktuelle Verbrauchswert belegen!
Geht es noch einfacher?
BG aus Königstädten,
Pampulea

Benutzeravatar
udo1toni
Beiträge: 1259
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Rules wieder ...

Beitrag von udo1toni » 21. Mär 2019 17:46

Da Du die Werte ja schon in der Persistence drin hast, musst Du nur ein anderes deltaSince nehmen. Um historische Werte anzuzeigen, brauchst Du für jeden anzuzeigenden Wert ein Item, welches Du anzeigen kannst. Damit z.B. die letzten sieben Tage als diskrete Summen angezeigt werden, brauchst Du sieben Items. Dann lässt Du um Mitternacht eine Rule laufen, die den Wert von vor 6 Tagen auf das Item von vor 7 Tagen kopiert, danach von vor 5 Tagen auf das von vor 6 Tagen usw. bis Du das aktuelle Item auf null setzt, nachdem Du dessen Wert in das Item vor einem Tag gespeichert hast. Wenn man die Itemnamen geschickt wählt, kann man das mit wenigen Zeilen Code über eine Gruppe erschlagen.

Ich habe mir in Grafana eine Liste gebastelt, die mir Datum und Zeit der letzten 10 Besucher anzeigt (genauer, wann die Klingel betätigt wurde). Das ist in Grafana easy, aber extra nur dafür Grafana einzurichten ist Quatsch, das ist bei mir nur Beiwerk.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste