Seite 1 von 2

Persistence Min/Max mit Zeitstempel

Verfasst: 7. Feb 2021 13:28
von seka
Hallo zusammen,

ich habe bei mir eine Wetterstation die mir die aktuelle Außentemperatur anzeigt. Diesen Wert speichere ich über rrd4j.
Nun würde ich gerne zu meinem bereit vorhandenen Minimum-Wert und Maximum- Wert den Zeit Stempel.

Anbei mal meine Regel:

Code: Alles auswählen

rule "Enocean6: Temp min Wert Monat"
when	
	Item EnOcean_Wetter_Temp changed

then
        val hmformat = java.time.format.DateTimeFormatter.ofPattern("HH:mm, yy/MM/dd")

            var Min = EnOcean_Wetter_Temp.minimumSince(now.minusMonths(1), "rrd4j").state as Number
            EnOcean_Wetter_Temp_Min_m_test.postUpdate(EnOcean_Wetter_Temp.minimumSince(now.minusMonths(1), "rrd4j").state as Number) + " °C (" + Min.timestamp.format(hmformat) + ")"
            

end
und hier den Opanhab.log Eintrag

Code: Alles auswählen

2021-02-07 13:24:56.340 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'enocean-6' failed: 'timestamp' is not a member of 'java.lang.Number'; line 75, column 146, length 13 in enocean
Kann mir jemand sagen wie die Regel richtig aussehen müsste?

Dank und einen schönen restlichen Sonntag
Sebastian

Re: Persistence Min/Max mit Zeitstempel

Verfasst: 8. Feb 2021 00:06
von udo1toni
Na ja, ist doch klar. Du verwendest die Variable Min, der Du einen Zahlenwert zugewiesen hast und erwartest ernsthaft, dass diese Variable zusätzlich noch einen Zeitstempel hält?

Du möchtest eher sowas:

Code: Alles auswählen

rule "Enocean6: Temp min Wert Monat"
when
    Item EnOcean_Wetter_Temp changed
then
    val hmformat = java.time.format.DateTimeFormatter.ofPattern("HH:mm, yy/MM/dd")

    val Min = EnOcean_Wetter_Temp.minimumSince(now.minusMonths(1), "rrd4j").state as Number
    val MinTime = EnOcean_Wetter_Temp.minimumSince(now.minusMonths(1), "rrd4j").timestamp

    EnOcean_Wetter_Temp_Min_m_test.postUpdate(Min.format("%.1f °C") + " (" + MinTime.format(hmformat) + ")")
end

Re: Persistence Min/Max mit Zeitstempel

Verfasst: 8. Feb 2021 21:08
von seka
Hi,
Danke für deine schnelle Antwort.
Ja Regeln Programmieren zählt nicht zu meinen Stärken :D

Wenn ich dein Beispiel in meine Regel packe bekomme ich folgende Error Meldung im log:

Code: Alles auswählen

2021-02-08 21:05:36.034 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'test-1' failed: 'format' is not a member of 'java.lang.Number'; line 11, column 47, length 21 in test
Danke

Re: Persistence Min/Max mit Zeitstempel

Verfasst: 8. Feb 2021 23:18
von udo1toni
Hmm... Lass mal das as Number in der Zuweisung der Konstanten Min weg.

Notfalls könnte man die Zuweisung anders gestalten.

Re: Persistence Min/Max mit Zeitstempel

Verfasst: 9. Feb 2021 16:38
von seka
Wenn ich das ".state as Number" weglasse bleibt die Fehlermeldung gleich.
Wenn ich dann das ".format" auch noch rauswerfe würde die Regel so aussehen:

Code: Alles auswählen

rule "1_Test: Temp min Wert Monat"
when
    Item EnOcean_Wetter_Temp changed
then
    val hmformat = java.time.format.DateTimeFormatter.ofPattern("HH:mm, yy/MM/dd")

    val Min = EnOcean_Wetter_Temp.minimumSince(now.minusMonths(1), "rrd4j")
    val MinTime = EnOcean_Wetter_Temp.minimumSince(now.minusMonths(1), "rrd4j").timestamp

    EnOcean_Wetter_Temp_Min_m_test.postUpdate(Min + " (" + MinTime.format(hmformat) + ")")
end
Dann ist wenigstens die Fehlermeldung eine andere vllt hilft das weiter:

Code: Alles auswählen

Cannot convert '11.01.21, 03:30: EnOcean_Wetter_Temp -> -7.058823529411768 (03:30, 21/01/11)' to a state type which item 'EnOcean_Wetter_Temp_Min_m_test' accepts: [DecimalType, QuantityType, UnDefType].

Re: Persistence Min/Max mit Zeitstempel

Verfasst: 9. Feb 2021 18:54
von udo1toni
Ich habe nichts davon geschrieben, .state wegzulassen. minimumSince liefert ein genericItem zurück, das heißt, es liefert sowohl Status als auch Zeitstempel, deshalb liefert eine Anfrage ohne .state beide Werte zurück.

Re: Persistence Min/Max mit Zeitstempel

Verfasst: 9. Feb 2021 22:01
von seka
Hab jetzt mehrere Sachen versucht
aktuell schaut die Regel so aus:

Code: Alles auswählen

rule "1_Test: Temp min Wert Monat"
when
    Item EnOcean_Wetter_Temp changed
then
    val hmformat = java.time.format.DateTimeFormatter.ofPattern("HH:mm, yy/MM/dd")

    val Min = EnOcean_Wetter_Temp.minimumSince(now.minusMonths(1), "rrd4j").state
    val MinTime = EnOcean_Wetter_Temp.minimumSince(now.minusMonths(1), "rrd4j").timestamp

    EnOcean_Wetter_Temp_Min_m_test.postUpdate(Min.format("%.1f °C") + " (" + MinTime.format(hmformat) + ")")
end
die Error Meldung ist noch die selbe.

Re: Persistence Min/Max mit Zeitstempel

Verfasst: 9. Feb 2021 22:46
von udo1toni
Dann machen wir mal was anderes:

Code: Alles auswählen

rule "1_Test: Temp min Wert Monat"
when
    Item EnOcean_Wetter_Temp changed
then
    val hmformat = java.time.format.DateTimeFormatter.ofPattern("HH:mm, yy/MM/dd")

    val Min = EnOcean_Wetter_Temp.minimumSince(now.minusMonths(1), "rrd4j").state
    val MinTime = EnOcean_Wetter_Temp.minimumSince(now.minusMonths(1), "rrd4j").timestamp
    logInfo("tempMinWert","Min: {} MinTime: {}",Min,MinTime)
    // vorerst auskommentiert---
    // EnOcean_Wetter_Temp_Min_m_test.postUpdate(Min.format("%.1f °C") + " (" + MinTime.format(hmformat) + ")")
end

Re: Persistence Min/Max mit Zeitstempel

Verfasst: 9. Feb 2021 22:50
von seka
Dann habe ich das im log stehen:

Code: Alles auswählen

2021-02-09 22:50:13.453 [INFO ] [penhab.core.model.script.tempMinWert] - Min: -7.058823529411768 MinTime: 2021-01-11T03:30+01:00[Europe/Berlin]

Re: Persistence Min/Max mit Zeitstempel

Verfasst: 9. Feb 2021 22:55
von udo1toni
Also, dann ist shcon mal das richtige in den Konstanten.

Nächster Versuch:

Code: Alles auswählen

rule "1_Test: Temp min Wert Monat"
when
    Item EnOcean_Wetter_Temp changed
then
    val hmformat = java.time.format.DateTimeFormatter.ofPattern("HH:mm, yy/MM/dd")

    val Min = EnOcean_Wetter_Temp.minimumSince(now.minusMonths(1), "rrd4j").state.format("%.1f °C")
    val MinTime = EnOcean_Wetter_Temp.minimumSince(now.minusMonths(1), "rrd4j").timestamp.format(hmformat)
    logInfo("tempMinWert","Min: {} MinTime: {}",Min,MinTime)
    // vorerst auskommentiert---
    // EnOcean_Wetter_Temp_Min_m_test.postUpdate(Min + " (" + MinTime + ")")
end