Seite 1 von 8
SOLVED - Verbrauch von heute (seit Mitternacht) anzeigen
Verfasst: 1. Mai 2022 21:10
von Florian.Reinartz
Moin Zusammen,
dieses Thema gibt es schon mehrfach aber irgendwie ist bei mir der Wurm drin...
Ich benutze für die Anzeige wieviel Strom ich heute (seit 0:00 Uhr) verbraucht habe folgende Zeile in einer Rule:
Code: Alles auswählen
Verbrauch_Strom_Tag.postUpdate((Zaehlerstand_Strom_1_0_1_8_0.deltaSince(now.withTimeAtStartOfDay)) / 1000.0)
Inhalt von >Zaehlerstand_Strom_1_0_1_8_0< ist aktuell >16792821.3< und als >Number< deklariert.
>Verbrauch_Strom_Tag< wird mit >38.74575000< berechnet... Alles gut!
Nun wollte ich diese Zeile auf die Wärmemenge meiner Solarthermieanlage anwenden.
Code: Alles auswählen
SolarThermie_Waermemenge_KW.postUpdate((SolarThermie_Waermemenge_W.state as Number) / 1000)
SolarThermie_Waermemenge_Tag_W.postUpdate(SolarThermie_Waermemenge_W.deltaSince(now.withTimeAtStartOfDay))
SolarThermie_Waermemenge_Tag_kW.postUpdate(SolarThermie_Waermemenge_KW.deltaSince(now.withTimeAtStartOfDay))
>SolarThermie_Waermemenge_W< hat den Wert >92759.0< und ist als >Number< definiert.
Die Umrechnung in KW (erste Zeile) funktioniert aber ich bin zu doof die Wärmemenge des Tages ausrechnen zu lassen.
Fehler im log:
Error during the execution of rule 'Solar-Wärmemenge berechnen': The argument 'state' must not be null.
Die Daten des Items >SolarThermie_Waermemenge_W< werden über die rrd4j.persist seit vorgestern gesammelt.
Code: Alles auswählen
SolarThermie_Waermemenge_W : strategy = everyHour, restoreOnStartup
SolarThermie_Waermemenge_Tag_kW.postUpdate(SolarThermie_Waermemenge_KW
.state.deltaSince(now.withTimeAtStartOfDay))
hilft schon mal nicht...
Ich stehe echt auf dem Schlauch...
Dankle für jede Unterstützung und Gruß
Flo
Re: Verbrauch von heute (seit Mitternacht) anzeigen
Verfasst: 1. Mai 2022 21:59
von udo1toni
Mein erster Tipp wäre, VSCode zu installieren und das openHAB Plugin zu aktivieren (incl. korrekter Konfiguration - ist aber nicht soooo wild, nur der korrekte Zugang zum openHAB Server)
Wenn Du dann die DSL Rules in Dateien in /etc/openhab/rules/ speicherst (in der klassischen Version... rule ... when ... then ... end) kannst Du auf diese Weise syntaktische Fehler direkt sehen (und Code Completion geht ebenfalls...)
Ein Punkt ist allerdings absolut sicher ein Problem, nämlich dass Du ein Item beschreibst und unmittelbar danach auf die Persistence dieses Items zugreifst. Der Zugriff auf ein Item dauert vielleicht eine oder zwei Millisekunden, auf die Persistence schon länger, vermutlich zehn bis zwanzig Millisekunden. Das Schreiben hingegen dauert sicherlich zehnmal länger, und deltaSince führt eine Berechnung durch, die mit zwei Werten arbeitet.
Du kannst versuchen, mit einem Thread::sleep(300) zwischen den einzelnen .postUpdate() Anweisungen etwas (300 Millisekunden) Zeit zu schinden. Das ist nicht sonderlich elegant, kann man aber ausprobieren. Bei Erfolg kann man über eine bessere Lösung nachdenken.
Re: Verbrauch von heute (seit Mitternacht) anzeigen
Verfasst: 2. Mai 2022 08:12
von Florian.Reinartz
Moin in die Runde,
ich arbeite seit Anfang an mit VSCode und dem openHAB PlugIn. Viele Fehler werden so vermieden aber bei diesem Thema bekomme ich keine Gedankenanstöße vom openHAB PlugIn.
Die dritte Zeile habe ich erst später hinzugefügt.
Ursprünglich sah es so aus:
Code: Alles auswählen
rule "Solar-Wärmemenge berechnen"
when
Item SolarThermie_Waermemenge_W changed
then
SolarThermie_Waermemenge_KW.postUpdate((SolarThermie_Waermemenge_W.state as Number) / 1000)
SolarThermie_Waermemenge_Tag_kW.postUpdate((SolarThermie_Waermemenge_W.deltaSince(now.withTimeAtStartOfDay)) / 1000)
end
Funktioniert aber auch nicht...
Die Verzögerung habe ich jetzt noch nicht ausprobiert weil es - glaube ich - in der Version nicht relevant ist.
Muss ich den Wert >SolarThermie_Waermemenge_W< vielleicht häufiger als stündlich in die Persistence schreiben?
Der Wert des Items >SolarThermie_Waermemenge_Tag_kW< bleibt >NULL<
So kann es doch eigentlich nicht an der Schreibverzögerung liegen...
fehlt bestimmt wieder nur so ein .state oder .state as Number oder so...
Ich bekomme es aber nicht zum Laufen ?!?
Sieht Jemand den Fehler?
Danke und Gruß
Florian
Re: Verbrauch von heute (seit Mitternacht) anzeigen
Verfasst: 2. Mai 2022 12:06
von udo1toni
Ah, gut. Welche Version von openHAB nutzt Du eigentlich? Weil... withTimeAtStartOfDay ist OH <= 2.5.12.
In openHAB3 ff. ist Joda Time durch JavaTime ersetzt. Dort sieht das dann so aus:
Code: Alles auswählen
rule "Solar-Wärmemenge berechnen"
when
Item SolarThermie_Waermemenge_W changed
then
SolarThermie_Waermemenge_KW.postUpdate((SolarThermie_Waermemenge_W.state as Number) / 1000)
SolarThermie_Waermemenge_Tag_kW.postUpdate((SolarThermie_Waermemenge_W.deltaSince(ZonedDateTime.now().with(LocalTime.MIDNIGHT)) as Number) / 1000)
end
Sorry, dass mir das erst jetzt aufgefallen ist... ich nutze halt selbst noch 2.5.12 produktiv und hatte gestern Frühdienst...
Oder etwas weniger länglich und besser lesbar (insbesondere um die Klammern besser zählen zu können...):
Code: Alles auswählen
rule "Solar-Wärmemenge berechnen"
when
Item SolarThermie_Waermemenge_W changed
then
val dtMidnight = ZonedDateTime.now().with(LocalTime.MIDNIGHT)
SolarThermie_Waermemenge_KW.postUpdate((SolarThermie_Waermemenge_W.state as Number) / 1000)
SolarThermie_Waermemenge_Tag_kW.postUpdate((SolarThermie_Waermemenge_W.deltaSince(dtMidnight) as Number) / 1000)
end
Re: Verbrauch von heute (seit Mitternacht) anzeigen
Verfasst: 2. Mai 2022 20:11
von Florian.Reinartz
...aber ich nutzew doch 2.5.12 ...
SolarThermie_Waermemenge_Tag_kW.postUpdate((SolarThermie_Waermemenge_W.deltaSince(ZonedDateTime.now().with(LocalTime.MIDNIGHT)) as Number) / 1000)
->
2022-05-02 20:13:30.009 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Solar-Wärmemenge berechnen': An error occurred during the script execution: Could not invoke method: org.eclipse.smarthome.model.persistence.extensions.PersistenceExtensions.deltaSince(org.eclipse.smarthome.core.items.Item,org.joda.time.base.AbstractInstant) on instance: null
SolarThermie_Waermemenge_Tag_kW.postUpdate((SolarThermie_Waermemenge_W.deltaSince(now.withTimeAtStartOfDay)) / 1000)
->
2022-05-02 20:14:32.258 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Solar-Wärmemenge berechnen': null
Re: Verbrauch von heute (seit Mitternacht) anzeigen
Verfasst: 2. Mai 2022 20:26
von udo1toni
Nun ja, das weißt
Du...
Schade, weil das eine schöne Variante gewesen wäre, um den Fehler zu korrigieren...
Das as Number hast Du schon ergänzt?
Code: Alles auswählen
SolarThermie_Waermemenge_Tag_kW.postUpdate((SolarThermie_Waermemenge_W.deltaSince(now.withTimeAtStartOfDay) as Number) / 1000)
Re: Verbrauch von heute (seit Mitternacht) anzeigen
Verfasst: 2. Mai 2022 20:57
von Florian.Reinartz
ja
SolarThermie_Waermemenge_Tag_kW.postUpdate((SolarThermie_Waermemenge_W.deltaSince(now.withTimeAtStartOfDay) as Number) / 1000)
->
2022-05-02 20:56:30.020 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Solar-Wärmemenge berechnen': null
Re: Verbrauch von heute (seit Mitternacht) anzeigen
Verfasst: 2. Mai 2022 21:07
von udo1toni
Dann hast Du schlicht keine Daten persistiert.
Du hast als Strategy everyHour angegeben. Hast Du diese Strategy auch definiert?
Re: Verbrauch von heute (seit Mitternacht) anzeigen
Verfasst: 2. Mai 2022 22:24
von Florian.Reinartz
{
everyMinute: "0 * * * * ?"
everyHour: "0 0 * * * ?"
everyDay: "0 0 0 * * ?"
default = everyChange
}
Re: Verbrauch von heute (seit Mitternacht) anzeigen
Verfasst: 2. Mai 2022 22:38
von udo1toni
Kannst Du bitte mal statt everyHour everyMinute nehmen? Für das Delta spielt das keine Rolle, ebenso wenig beim Datenverbrauch. rrd4j verhält sich in mancherlei Beziehung seltsam, wenn es nicht minütlich persistiert, vielleicht schlägt das auch hier zu...