Temperatur Tendenz ermitteln

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Temperatur Tendenz ermitteln

Beitrag von violine21 »

KellerK1nd hat geschrieben: 13. Aug 2020 07:58 Ich würde ja gerne den Status nur schreiben, wenn sich in den letzten 15 Minuten der Wert geändert hat.
Mein Ansatz mit der 15-minütig getriggerten Rule basiert darauf, das ich dadurch einen "länger" laufenden Timer spare.
Ich hatte da schon die eine oder andere Huddelei mit Timerabstürzen, darum favorisiere ich bei langen, festen Zeitrastern
immer den Time-Cron.
Aber das kann jeder selbst entscheiden. ;)

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Temperatur Tendenz ermitteln

Beitrag von PeterA »

Ich hab das auch mal versucht:

Code: Alles auswählen

rule "Aussentemperatur Tendenz ermitteln" //Lacrosse Sensor
when
    Item AussenTemp changed or
    System started or
    Time cron "0 * * * * ?"// jede Minute
then
    if((AussenTemp.state as Number).floatValue > (AussenTemp.previousState().state as Number).floatValue){
        logInfo("Aussentemperatur", "steigend")
        AussenTemp_Tendenz.postUpdate("steigend")
    }
    if((AussenTemp.state as Number).floatValue == (AussenTemp.previousState().state as Number).floatValue){
        logInfo("Aussentemperatur", "stagnierend")
        AussenTemp_Tendenz.postUpdate("stagnierend")
    }
    if((AussenTemp.state as Number).floatValue < (AussenTemp.previousState().state as Number).floatValue){
        logInfo("Aussentemperatur", "fallend")
        AussenTemp_Tendenz.postUpdate("fallend")
    }
end
Aber trotz fallender Temperatur Triggert nur "stagnierend"

Code: Alles auswählen

2020-08-13 21:02:10.822 [vent.ItemStateChangedEvent] - AussenTemp changed from 21.1 to 21.0
2020-08-13 21:02:32.844 [INFO ] [rthome.model.script.Aussentemperatur] - stagnierend
Kann das an der rrd4j Persistence liegen welche ich für meine Items nehme ?

Gruß Peter
- OpenHab 2.4
#PWRUP

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

Re: Temperatur Tendenz ermitteln

Beitrag von udo1toni »

violine21 hat geschrieben:
udo1toni hat geschrieben: 13. Aug 2020 04:34aber sie benötigen auch dann Speicher und (ein wenig) Rechenzeit, wenn gerade keine Rule läuft
Ist das ein Ernst zu nehmender Fakt?
Nicht bei der gewählten Anzahl Threads, wohl aber, wenn man die Anzahl stark erhöht (z.B. Auf 200 Threads - das ist konfigurierbar).


Gesendet von iPad mit Tapatalk
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Temperatur Tendenz ermitteln

Beitrag von violine21 »

PeterA hat geschrieben: 13. Aug 2020 21:35 Aber trotz fallender Temperatur Triggert nur "stagnierend"

Code: Alles auswählen

2020-08-13 21:02:10.822 [vent.ItemStateChangedEvent] - AussenTemp changed from 21.1 to 21.0
2020-08-13 21:02:32.844 [INFO ] [rthome.model.script.Aussentemperatur] - stagnierend
Kann das an der rrd4j Persistence liegen welche ich für meine Items nehme ?

Gruß Peter
Klingt spannend!
Zwischen den beiden Ereignissen liegen 22 Sekunden.
Kann man sich eigentlich die rrd4j-Datenbank auch so anschauen, wie zB. MySQL mit phpmyadmin?
Vielleicht ist der previousState zum Zeitpunkt der Rule nicht der, den wir erwarten.
Das könnte man doch auch in den log-Text mit einbinden.
Oder es liegt schlicht an dem Komma (Punkt). Eventuell wird die Zahl nur als 21 interpretiert.
Dann wäre mir die Variante mit dem Proxy-Item doch sicherer.
Ich lass die Rule mal ohne den minütlichen Time-Cron laufen und beobachte.

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Temperatur Tendenz ermitteln

Beitrag von violine21 »

So, gerade gabs eine Temperaturänderung und siehe da:

Code: Alles auswählen

2020-08-14 01:35:00.046 [INFO ] [rthome.model.script.Aussentemperatur] - stagniert: 15.2 = 15.2
2020-08-14 01:54:43.421 [INFO ] [rthome.model.script.Aussentemperatur] - stagniert: 15.4 = 15.4
2020-08-14 01:54:43.421 [INFO ] [rthome.model.script.Aussentemperatur] - stagniert: 15.4 = 15.4
2020-08-14 01:57:01.423 [INFO ] [rthome.model.script.Aussentemperatur] - stagniert: 15.5 = 15.5
2020-08-14 01:59:07.105 [INFO ] [rthome.model.script.Aussentemperatur] - stagniert: 15.6 = 15.6
2020-08-14 02:02:02.362 [INFO ] [rthome.model.script.Aussentemperatur] - stagniert: 15.7 = 15.7
2020-08-14 02:04:43.325 [INFO ] [rthome.model.script.Aussentemperatur] - stagniert: 15.8 = 15.8
Der erste log-Eintrag war mit Time-Cron und die anderen durch Änderung hervorgerufen.
Zum Zeitpunkt des Rule-Durchlaufs war der previous.State bereits gleich dem Aktualwert.
Interessant wäre jetzt mal ein Blick in den Datenbankverlauf.
Übrigens hier die Rule:

Code: Alles auswählen

rule "Aussentemperatur Tendenz ermitteln"
when
    Item Wetterstation1ACTUALTEMPERATURE changed
then
    if((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue > (Wetterstation1ACTUALTEMPERATURE.previousState().state as Number).floatValue){
        logInfo("Aussentemperatur", "steigt: "+((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue)+" > "+((Wetterstation1ACTUALTEMPERATURE.previousState().state as Number).floatValue))
    }
    if((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue == (Wetterstation1ACTUALTEMPERATURE.previousState().state as Number).floatValue){
        logInfo("Aussentemperatur", "stagniert: "+((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue)+" = "+((Wetterstation1ACTUALTEMPERATURE.previousState().state as Number).floatValue))
    }
    if((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue < (Wetterstation1ACTUALTEMPERATURE.previousState().state as Number).floatValue){
        logInfo("Aussentemperatur", "fällt: "+((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue)+" < "+((Wetterstation1ACTUALTEMPERATURE.previousState().state as Number).floatValue))
    }
end
Evtl. kann Udo hier für Klarheit sorgen :idea:

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Temperatur Tendenz ermitteln

Beitrag von PeterA »

Das hier habe ich gerade "hier" gefunden:

https://openhabforum.de/viewtopic.php?f=15&t=3082
- OpenHab 2.4
#PWRUP

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Temperatur Tendenz ermitteln

Beitrag von violine21 »

PeterA hat geschrieben: 14. Aug 2020 06:11 Das hier habe ich gerade "hier" gefunden:

https://openhabforum.de/viewtopic.php?f=15&t=3082
Du Scherzkeks :D :D :D Den Thread kenne ich, das war ich selbst mit meiner Photovoltaikbatterie.
Ich hatte das seinerzeit anders gelöst und fand dieses Thema hier als Lernobjekt recht interessant.
Ich werde jetzt mal den kompletten previousState im log anzeigen lassen. Da ist dann wenigstens der Zeitstempel dabei.

Mit der Proxy-Item-Variante funktioniert es auf alle Fälle einwandfrei!

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Temperatur Tendenz ermitteln

Beitrag von PeterA »

Oh... hatte ich am Handy übersehen.
Deine Proxy-Item-Variante hatte ich gestern auch versucht.
Da maulte aber VSC bei diesem Teil "(letzte_Temperatur.state)"
Kann jetzt den Meldung nicht zeigen da nicht am richtigen Rechner.

Wie ist denn das Proxy Item definiert ?
- OpenHab 2.4
#PWRUP

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Temperatur Tendenz ermitteln

Beitrag von PeterA »

So

Code: Alles auswählen

rule "Aussentemperatur Tendenz ermitteln"
when
    Item AussenTemp changed or
    Time cron "0 0/15/30/45 * * *  ?"// jede 15. Minute
then
    if((AussenTemp.state as Number).floatValue > (AussenTemp_Tendenz_Proxy.state){
        logInfo("Aussentemperatur", "steigt")
    }
    if((AussenTemp.state as Number).floatValue == (AussenTemp_Tendenz_Proxy.state){
        logInfo("Aussentemperatur", "stagniert")
    }
    if((AussenTemp.state as Number).floatValue < (AussenTemp_Tendenz_Proxy.state){
        logInfo("Aussentemperatur", "fällt")
    }
   AussenTemp_Tendenz_Proxy.postUpdate((AussenTemp.state as Number).floatValue) 
end
Meldung von VSC:

Code: Alles auswählen

{
	"resource": "/Volumes/openHAB-conf/rules/tendenz_test.rules",
	"owner": "_generated_diagnostic_collection_name_#0",
	"code": "org.eclipse.xtext.xbase.validation.IssueCodes.incompatible_types",
	"severity": 8,
	"message": "Type mismatch: cannot convert from State to byte",
	"startLineNumber": 6,
	"startColumn": 50,
	"endLineNumber": 6,
	"endColumn": 82
}
So ist das Proxy Item definiert:

Code: Alles auswählen

Number:Temperature         AussenTemp_Tendenz_Proxy
- OpenHab 2.4
#PWRUP

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Temperatur Tendenz ermitteln

Beitrag von violine21 »

Das Item:

Code: Alles auswählen

Number  prevTemperatur
Die Rule:

Code: Alles auswählen

rule "Aussentemperatur Tendenz mit Proxy ermitteln"
when
    Item Wetterstation1ACTUALTEMPERATURE changed
then
    if(!(prevTemperatur.state instanceof Number)) {
        prevTemperatur.postUpdate(0)
    }

    if((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue > prevTemperatur.state as Number) {
        logInfo("Aussentemperatur", "steigt: "+(Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue+" > "+prevTemperatur.state as Number)
    }
    if((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue == prevTemperatur.state as Number){
        logInfo("Aussentemperatur", "stagniert: "+(Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue+" = "+prevTemperatur.state as Number)
    }
    if((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue < prevTemperatur.state as Number){
        logInfo("Aussentemperatur", "fällt: "+(Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue+" < "+prevTemperatur.state as Number)
    }

    prevTemperatur.postUpdate((Wetterstation1ACTUALTEMPERATURE.state as Number).floatValue)

end
"message": "Type mismatch: cannot convert from State to byte",
Da fehlt das " as Number"

Code: Alles auswählen

(AussenTemp_Tendenz_Proxy.state)

Code: Alles auswählen

(AussenTemp_Tendenz_Proxy.state as Number)
Wo es immer nur geht, verzichte ich auf Einheiten (UoM), außer bei der Visualisierung.
Hat sich iregendwie bei mir so fesgesetzt.
Zuletzt geändert von violine21 am 14. Aug 2020 11:37, insgesamt 2-mal geändert.

Antworten