[Gelöst] Vorletzten Temperaturwert speichern und Differenz ermitteln

Begonnen von NewRasPi, 17 Februar 2019, 22:17:30

Vorheriges Thema - Nächstes Thema

CoolTux

Zitat von: Damian am 18 Februar 2019, 13:17:40
Wie schon geschrieben man braucht nichts weiter zu definieren (keine Dummys, keine weiteren Readings, kein OldReadings-Attribut etc.), es reicht einfach die Definition:

DOIF ([SchlafzimmerTemp:temperature:diff] > 5)(set ....)

Das ist schön und auch wirklich sehr Userfreundlich. Aber so lernen die User nichts. Was ist wenn sie mal an einen Punkt kommen wo DOIF nicht helfen kann. Dann fehlt ihnen das Rüstzeug um sich was eigenes zu bauen.
Ist nicht böse gemeint. Ich finde toll das es so geht und würde NewRasPi auch empfehlen es so zu machen, sobald er auch den anderen Weg über FHEM und Perl spezifische Funktionen verstanden hat.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

NewRasPi

Hallo CoolTux und Damian

um das alles wirklich zu verstehen fehlt mir schon das Informatik Studium. Da bin ich froh das es auch kürzere einfachere Wege gibt, auch wenn ich ja nicht verstehe,
wie die DOIF Funktion etwas berechnet, was vorher nicht mal im Device berechnet wurde.
Ich muss bei meinem FHEM immer nur kleine Schritte machen, bin aber stolz was damit schon alles zu bewerkstelligen war.

Zitat von: Damian am 18 Februar 2019, 13:17:40
Wie schon geschrieben man braucht nichts weiter zu definieren (keine Dummys, keine weiteren Readings, kein OldReadings-Attribut etc.), es reicht einfach die Definition:

DOIF ([SchlafzimmerTemp:temperature:diff] > 5)(set ....)
Hallo CoolTux und Damian
ich bin begeistert.
Das ganze muss ich noch mit den richtigen Variablen füllen, wenn das mit dieser Funktion dann hoffentlich auch funktioniert.

GarageTemp
AussenTemp
DachbodenTemp
BadTemp
SchlafzimmerTemp


Internals:
   CFGFN     
   DEF        ([^Temp:temperature:diff] > 5)
(set TabletWohnzimmer ttsMsg Hallo die Temperatur im $DEVICE steigt zu schnell)
(set AcerHandy2 ttsMsg Hallo die Temperatur im $DEVICE steigt zu schnell)
DOELSE ()
   FUUID      5c6aa366-f33f-103c-feee-e7659679a3472a58
   MODEL      FHEM
   NAME       TemperaturKontrollDOIF
   NR         375286
   NTFY_ORDER 50-TemperaturKontrollDOIF
   STATE      initialized
   TYPE       DOIF
   Helper:
     DBLOG:
       state:
         logdb:
           TIME       1550494085.72993
           VALUE      initialized
   READINGS:
     2019-02-18 13:48:05   cmd             0
     2019-02-18 13:48:05   mode            enabled
     2019-02-18 13:48:05   state           initialized
     2019-02-18 13:48:05   timer_01_c01    error: Wrong timespec ^Temp:temperature:diff: either HH:MM:SS or {perlcode}
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday) > 5
   devices:
   do:
     0:
       0          set TabletWohnzimmer ttsMsg Hallo die Temperatur im $DEVICE steigt zu schnell
       1          set AcerHandy2 ttsMsg Hallo die Temperatur im $DEVICE steigt zu schnell
     1:
       0         
   helper:
     globalinit 1
     last_timer 1
     sleeptimer -1
   itimer:
   localtime:
   time:
     0          ^Temp:temperature:diff
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   uiState:
   uiTable:
Attributes:
   do         always


Oder eben erst mal 5 DOIF mit einzelnen Texten erstellen.
Schöne Grüße und noch mal DANKE
NewRasPi
Raspberry Pi 2 Mod B + Raspberry Pi 3 + Raspberry Pi4; HM Lan Adapter; 8 Kanal Relaiskarte; ca. 15x 1wire Temperatur Sensor DS18B20; 10x HC-SR501 Bewegungsmelder; 9x HM Rauchmelder HM-Sec-SD; HM Funk Fenstersensoren; HM Strommess-Zwischenstecker;

Damian

#17
Zitat von: NewRasPi am 18 Februar 2019, 13:57:48
Oder eben erst mal 5 DOIF mit einzelnen Texten erstellen.

Das funktioniert nur mit konkreten Devicenamen - keine RegeX-Angaben.

Kurz zur Funktionsweise: Initiiert durch die Angabe der Funktion diff sammelt DOIF die gesendeten Wert des Readings intern und kann dadurch die Differenz berechnen. Man kann ebenfalls Durchschnitt, Median oder Anstieg berechnen. Die Anzahl der gesammelten Werte kann ebenfalls angegeben werden, für diese Aufgabe braucht man nur die letzten zwei (diff entspricht diff2).
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

NewRasPi

Hallo Damian und alle Spezialisten
ist es den "Grundsätzlich schlechter" in diesem Fall z.B. fünf DOIF`s zu machen, die jedes davon nur eine Abfrage macht, anstatt, wenns möglich ist, ein DOIF mit variablen - also muss der Raspberry dadurch mehr oder weniger arbeiten?
Wenn es nur ein optisches Grauen ist, wenn da ewig viele einzelne DOIF Device sind versuch ich die einfach mal in einen versteckten Raum zu platzieren.

Dankeschön für Euer Wissen und die Arbeit für die Module
Schöne Grüße
NewRasPi

Zitat von: Damian am 18 Februar 2019, 14:58:07
Das funktioniert nur mit konkreten Devicenamen - keine RegeX-Angaben.

Kurz zur Funktionsweise: Initiiert durch die Angabe der Funktion diff sammelt DOIF die gesendeten Wert des Readings intern und kann dadurch die Differenz berechnen. Man kann ebenfalls Durchschnitt, Median oder Anstieg berechnen. Die Anzahl der gesammelten Werte kann ebenfalls angegeben werden, für diese Aufgabe braucht man nur die letzten zwei (diff entspricht diff2).
Raspberry Pi 2 Mod B + Raspberry Pi 3 + Raspberry Pi4; HM Lan Adapter; 8 Kanal Relaiskarte; ca. 15x 1wire Temperatur Sensor DS18B20; 10x HC-SR501 Bewegungsmelder; 9x HM Rauchmelder HM-Sec-SD; HM Funk Fenstersensoren; HM Strommess-Zwischenstecker;

Damian

Zitat von: NewRasPi am 18 Februar 2019, 15:23:08
Hallo Damian und alle Spezialisten
ist es den "Grundsätzlich schlechter" in diesem Fall z.B. fünf DOIF`s zu machen, die jedes davon nur eine Abfrage macht, anstatt, wenns möglich ist, ein DOIF mit variablen - also muss der Raspberry dadurch mehr oder weniger arbeiten?
Wenn es nur ein optisches Grauen ist, wenn da ewig viele einzelne DOIF Device sind versuch ich die einfach mal in einen versteckten Raum zu platzieren.

Dankeschön für Euer Wissen und die Arbeit für die Module
Schöne Grüße
NewRasPi

Du kannst auch alles in ein DOIF packen, wo ist das Problem?

Jedes DOIF kostet etwas Performance und etwas Speicher, aber selbst bei einem Raspi müssten es schon sehr sehr viele sein, damit man etwas davon merkt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

NewRasPi

Hallo Damian
"mein Raspberry" kann nicht rechnen.
Alle 5 Minuten sagt mein DOIF jetzt das die Temperatur zu schnell steigt. Die Temperatur hat sich aber nur um 0,25°C geändert!
Hier das List der Kontroll DOIF:
Internals:
   CFGFN     
   DEF        ([SchlafzimmerTemp:temperature:diff] > 5)
(set TabletWohnzimmer ttsMsg Hallo die Temperatur im Schlafzimmer steigt zu schnell)
(set AcerHandy2 ttsMsg Hallo die Temperatur im Schlafzimmer steigt zu schnell)
DOELSE ()
   FUUID      5c6aa366-f33f-103c-feee-e7659679a3472a58
   MODEL      FHEM
   NAME       TemperaturKontrollSZDOIF
   NR         375286
   NTFY_ORDER 50-TemperaturKontrollDOIF
   STATE      cmd_1
   TYPE       DOIF
   Helper:
     DBLOG:
       state:
         logdb:
           TIME       1550513051.53256
           VALUE      cmd_1
   READINGS:
     2019-02-18 19:04:11   Device          SchlafzimmerTemp
     2019-02-18 19:04:11   cmd             1.2
     2019-02-18 19:04:11   cmd_event       SchlafzimmerTemp
     2019-02-18 19:04:11   cmd_nr          1
     2019-02-18 19:04:11   cmd_seqnr       2
     2019-02-18 19:04:11   e_SchlafzimmerTemp_temperature 19.5
     2019-02-18 15:33:52   mode            enabled
     2019-02-18 19:04:11   state           cmd_1
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'SchlafzimmerTemp','temperature','','diff') > 5
   devices:
     0           SchlafzimmerTemp
     all         SchlafzimmerTemp
   do:
     0:
       0          set TabletWohnzimmer ttsMsg Hallo die Temperatur im Schlafzimmer steigt zu schnell
       1          set AcerHandy2 ttsMsg Hallo die Temperatur im Schlafzimmer steigt zu schnell
     1:
       0         
   helper:
     event      temperature: 19.5,T: 19.50 °C
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   SchlafzimmerTemp
     timerevent temperature: 19.5,T: 19.50 °C
     triggerDev SchlafzimmerTemp
     DOIF_eventas:
       cmd_nr: 1
       cmd_seqnr: 2
       cmd_event: SchlafzimmerTemp
       state: cmd_1
     timerevents:
       temperature: 19.5
       T: 19.50 °C
     timereventsState:
       temperature: 19.5
       state: T: 19.50 °C
     triggerEvents:
       temperature: 19.5
       T: 19.50 °C
     triggerEventsState:
       temperature: 19.5
       state: T: 19.50 °C
   internals:
   itimer:
   readings:
     0           SchlafzimmerTemp:temperature
     all         SchlafzimmerTemp:temperature
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always


Das List des Temperaturfühler:
Internals:
   ALARM      0
   ASYNC      0
   DEF        DS18B20 FFFB96641403
   ERRCOUNT   0
   FUUID      5c430225-f33f-103c-58a0-d28ad6c55a24787a
   INTERVAL   300
   IODev      OWio
   NAME       SchlafzimmerTemp
   NOTIFYDEV  global
   NR         34
   NTFY_ORDER 50-SchlafzimmerTemp
   OW_FAMILY  28
   OW_ID      FFFB96641403
   PRESENT    1
   ROM_ID     28.FFFB96641403.78
   STATE      T: 19.50 °C
   TYPE       OWTHERM
   owg_cf     10
   owg_temp   19.5
   owg_th     40
   owg_tl     0
   Helper:
     DBLOG:
       data:
         logdb:
           TIME       1550513051.57629
           VALUE      state: T: 19.50 °C
       temperature:
         logdb:
           TIME       1550513051.57629
           VALUE      19.5
   OLDREADINGS:
     2019-02-18 18:29:11   state           T: 19.25 °C
     2019-02-18 10:44:11   temperature     19.75
   READINGS:
     2019-02-18 19:04:11   alterWert       T: 19.25 °C
     2019-02-18 19:04:11   state           T: 19.50 °C
     2019-02-18 19:04:11   temperature     19.5
   tempf:
     factor     1
     offset     0
Attributes:
   DbLogExclude failures,T,85
   DbLogInclude temperature
   IODev      OWio
   event-min-interval temperature,state:300
   event-on-change-reading temperature,state
   fp_Lageplan 172,299,5,SchlafzimmerTemp,
   fp_statevalue STATE
   icon       temp_temperature
   interval   300
   model      DS18B20
   oldreadings state
   resolution 10
   room       1.2_Schlafzimmer,OWX
   tempHigh   40
   tempLow    0
   tempUnit   Celsius
   userReadings alterWert:T:.* { OldReadingsVal($name,'state','none')}
   verbose    1


Was habe ich den jetzt falsch gemacht. Alle 5 Minuten eine Ansage ohne das es eigentlich auslösen sollte strapaziert den WAF.
Schöne Grüße
NewRasPi
Raspberry Pi 2 Mod B + Raspberry Pi 3 + Raspberry Pi4; HM Lan Adapter; 8 Kanal Relaiskarte; ca. 15x 1wire Temperatur Sensor DS18B20; 10x HC-SR501 Bewegungsmelder; 9x HM Rauchmelder HM-Sec-SD; HM Funk Fenstersensoren; HM Strommess-Zwischenstecker;

Ellert

Zitat von: NewRasPi am 18 Februar 2019, 13:57:48
... was vorher nicht mal im Device berechnet wurde.
Falls das einer liest und glaubt, über userReadings kann schon seit Jahren die Differenz und der Differenzenquotient in einem Reading des selben  Gerätes dargestellt werden, s. https://commandref.fhem.de/commandref_DE.html#userReadings

Beispiel
attr <device> userReadings difftemp:temperature.* difference

Damian

Zitat von: NewRasPi am 18 Februar 2019, 19:10:38
Hallo Damian
"mein Raspberry" kann nicht rechnen.
Alle 5 Minuten sagt mein DOIF jetzt das die Temperatur zu schnell steigt. Die Temperatur hat sich aber nur um 0,25°C geändert!

Ich würde behaupten, dass du nicht die aktuelle DOIF-Version hast.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

NewRasPi

Zitat von: Damian am 18 Februar 2019, 20:33:17
Ich würde behaupten, dass du nicht die aktuelle DOIF-Version hast.
Du musst doch Hellseher sein Damian.
Da letztens so viel von Problemen beim Update geschrieben wurde, habe ich wirklich seit einigen Tagen kein Update mehr gemacht.
Das werde ich jetzt sofort nachholen und berichten ob es dann "rechnen kann".

Dankeschön
Raspberry Pi 2 Mod B + Raspberry Pi 3 + Raspberry Pi4; HM Lan Adapter; 8 Kanal Relaiskarte; ca. 15x 1wire Temperatur Sensor DS18B20; 10x HC-SR501 Bewegungsmelder; 9x HM Rauchmelder HM-Sec-SD; HM Funk Fenstersensoren; HM Strommess-Zwischenstecker;

Damian

Zitat von: Ellert am 18 Februar 2019, 20:02:47
Falls das einer liest und glaubt, über userReadings kann schon seit Jahren die Differenz und der Differenzenquotient in einem Reading des selben  Gerätes dargestellt werden, s. https://commandref.fhem.de/commandref_DE.html#userReadings

Beispiel
attr <device> userReadings difftemp:temperature.* difference

Ich denke, das Problem ist, dass die meisten nicht (mehr) wissen, was ein Differenzenquotient ist ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Zitat von: Damian am 18 Februar 2019, 20:47:16
Ich denke, das Problem ist, dass die meisten nicht (mehr) wissen, was ein Differenzenquotient ist ;)
Na ja, in Wikipedia gibt's den Begriff  schon noch https://de.wikipedia.org/wiki/Differenzenquotient

und Intuitiv liegt der TE damit
Zitat von: NewRasPi am 17 Februar 2019, 22:17:30
Ziel meines vorhabens ist, auszuwerten ob sich die Temperatur von der letzten Messung (z.B. vor 5 Minuten intervall) zu der aktuellen um mehr
als 5 °C geändert hat um dann eine Warnmeldung auszugeben.
ja auch nicht falsch.

Damian

Zitat von: Ellert am 19 Februar 2019, 09:51:12
Na ja, in Wikipedia gibt's den Begriff  schon noch https://de.wikipedia.org/wiki/Differenzenquotient

und Intuitiv liegt der TE damit ja auch nicht falsch.

Viele werden es auch als Steigungsdreieck kennen, dazu muss man auch kein Abi haben.

Da oft von einem festen Zeitintervall (x1-x2) ausgegangen wird, reduziert sich die Aufgabe auf die Überprüfung der Differenz (y1-y2), wie in diesem Fall.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Der Begriff Steigungsdreieck ist bisher unbemerkt an mir vorübergezogen

Ja, wenn der Sensor sich an das feste Zeitintervall hält, reicht der modifier "difference", sonst benötigt man "differential" bei den userReadings, z. B. wenn man eventbeschränkende Attribute (event-on-.*) verwendet.

NewRasPi

#28
Zitat von: Ellert am 19 Februar 2019, 10:49:21
Der Begriff Steigungsdreieck ist bisher unbemerkt an mir vorübergezogen

Ja, wenn der Sensor sich an das feste Zeitintervall hält, reicht der modifier "difference", sonst benötigt man "differential" bei den userReadings, z. B. wenn man eventbeschränkende Attribute (event-on-.*) verwendet.

Hallo Ihr Spezialisten
kurze Rückmeldung. Die nervigen Meldungen im 300 Sekundentakt ohne Änderung der Temperatur sind nach dem Update weg. Es gab zwar nach dem ersten "shutdown restart" nach dem Update eine Fehler Benachrichtigung das im Device ein falsches Attribute "fp_statevalue" vorhanden ist. Wer auch immer das angelegt hatte, ich wars nicht. (sagen immer alle)
Nach einem weiteren "shutdown restart" hat sich das aber wieder "erledigt".

Kann es sein das die Funktion von CoolTux mit dem userReadings  alterWert:T:.* { OldReadingsVal($name,'state','none')}
pro FHEM/ Raspi nur einmal vergeben werden kann? Auf den weiteren 1-wire Temperatursensoren geht es jedenfalls nicht.
Ich habe auch noch versucht, den Namen des userReadings verändert, aber auch dann geht es in einem anderen Temperaturfüher Device bei mir nicht/ oder zeigt "none".
userReadings  alterWertGarage:T:.* { OldReadingsVal($name,'state','none')}
Als nächstes werde ich mal mit dem Fön die Temperatursensoren um mehr als 5 °C anwärmen und prüfen ob dann das DOIF auslöst. (leider erst heut abend zuhause)
Eine Anmerkung zu Differenzenquotienen - im technischen kenne ich das unter dem Begriff "delta" mit Dreieck als Sympol, was für die Veränderung steht.

Vielen Dank für Eure Hilfe - ohne Euch würde ich vermuttlich nur den Startbildschirm von FHEM bewundern. (ganz ohne "Funktionen")
Schöne Grüße
NewRasPi
Raspberry Pi 2 Mod B + Raspberry Pi 3 + Raspberry Pi4; HM Lan Adapter; 8 Kanal Relaiskarte; ca. 15x 1wire Temperatur Sensor DS18B20; 10x HC-SR501 Bewegungsmelder; 9x HM Rauchmelder HM-Sec-SD; HM Funk Fenstersensoren; HM Strommess-Zwischenstecker;

Ellert

Zitat von: NewRasPi am 19 Februar 2019, 12:57:38
Hallo Ihr Spezialisten
kurze Rückmeldung. Die nervigen Meldungen im 300 Sekundentakt ohne Änderung der Temperatur sind nach dem Update weg. Es gab zwar nach dem ersten "shutdown restart" nach dem Update eine Fehler Benachrichtigung das im Device ein falsches Attribute "fp_statevalue" vorhanden ist. Wer auch immer das angelegt hatte, ich wars nicht. (sagen immer alle)
Nach einem weiteren "shutdown restart" hat sich das aber wieder "erledigt".

Kann es sein das die Funktion von CoolTux mit dem userReadings  alterWert:T:.* { OldReadingsVal($name,'state','none')}
pro FHEM/ Raspi nur einmal vergeben werden kann? Auf den weiteren 1-wire Temperatursensoren geht es jedenfalls nicht.
Ich habe auch noch versucht, den Namen des userReadings verändert, aber auch dann geht es in einem anderen Temperaturfüher Device bei mir nicht/ oder zeigt "none".
userReadings  alterWertGarage:T:.* { OldReadingsVal($name,'state','none')}
Als nächstes werde ich mal mit dem Fön die Temperatursensoren um mehr als 5 °C anwärmen und prüfen ob dann das DOIF auslöst. (leider erst heut abend zuhause)
Eine Anmerkung zu Differenzenquotienen - im technischen kenne ich das unter dem Begriff "delta" mit Dreieck als Sympol, was für die Veränderung steht.

Vielen Dank für Eure Hilfe - ohne Euch würde ich vermuttlich nur den Startbildschirm von FHEM bewundern. (ganz ohne "Funktionen")
Schöne Grüße
NewRasPi
Wie gesagt wenn Du eine Differenz willst geht das in jedem Gerät über userReadings, dazu benötigst Du OldReadingsVal nicht und überspringst diesen Schritt mit
attr <device> userReadings difftemp:temperature.* difference Dann steht im Reading difftemp die Temperaturdifferenz. Die Angaben musst Du natürlich auf Dein Device anpassen.
Wenn das Aktualisierungsintervall nicht konstant ist, musst Du die Temperaturänderung auf die Zeit beziehen damit die Werte vergleichbar sind, dann hast Du die Steigung der Temperatur pro Zeiteinheit (Sekunden)
Das geht dann mit dem modifier "differential" so:
attr <device> userReadings difftemp:temperature.* differential
Aber, das ist jetzt eine Nacherzählung dessen was hier steht: https://commandref.fhem.de/commandref_DE.html#userReadings