Problem mit event-on-change-reading

Begonnen von Gast45, 31 Mai 2018, 18:50:20

Vorheriges Thema - Nächstes Thema

amenomade

Wie wird den Taupunkt kalkuliert? Bitte die entsprechende "list"
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

RomanticBoy83

Scheint doch alles zu funktionieren. Ich verstehe das Problem nicht wirklich.
Zum Test - um nicht warten zu müssen - kannst du auch ein setreading auf deine Quelle machen um eine Änderung anzustoßen.

Noch ein Tip/"ichglaube": das reading mit dem Namen "state" wird automatisch als "STATE" übernommen. Vielleicht erzeugst du dir so den gewünschten STATE. Aber wie geschildert, so richtig folgen kann ich dem Problem nicht.

Gast45

#17
@amenomade:
Taupunktberechnung:

Internals:
   CMD_TYPE   dewpoint
   DEF        dewpoint SensorAussen temperature humidity dewpoint
   DEV_REGEXP SensorAussen
   HUM_NAME   humidity
   NAME       dew_state_Aussen
   NEW_NAME   dewpoint
   NOTIFYDEV  SensorAussen
   NR         37
   NTFY_ORDER 10-dew_state_Aussen
   STATE      active
   TEMP_NAME  temperature
   TYPE       dewpoint
Attributes:
   absFeuchte 1


@RomanticBoy83:
ganz knapp nochmal in Antwort #14


@alle:
Dies steht im CommandRef:
Zitatevent-min-interval
This attribute takes a comma-separated list of reading:minInterval pairs. You may use regular expressions for reading. Events will only be generated, if at least minInterval seconds elapsed since the last reading of the matched type. If event-on-change-reading is also specified, they are combined with OR: if one of them is true, the event is generated.
Bei Kombination gilt: Bei Änderung oder nach Zeitablauf
Meist liegt der Fehler vor der Tastatur

amenomade

Kannst Du bitte das dewpoint Device auf verbose 5 stellen, und die Log posten?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Gast45

#19
Hallo,

ich habe das verbose eingestellt und per Hand die Werte geändert. Wie gestern schon gesehen wird sowohl bei Änderung von humidity als auch temperature ein Event erzeugt. Die Ergebnisse aus dem LOG sind folgende:

LOG nach Änderung humidity (83->82) im SensorAussenQuelle (Daten werden wie beschrieben alle 20 Sekunden nach SensorAussen kopiert):
2018.06.01 15:34:39 4: dewpoint_notify: cmd_type=dewpoint devname=SensorAussen dewname=dew_state_Aussen, dev=SensorAussen, dev_regex=SensorAussen temp_name=temperature hum_name=humidity
2018.06.01 15:34:39 5: dewpoint_notify: s='humidity: 82'
2018.06.01 15:34:39 5: dewpoint_notify: evName='humidity:' val=82'
2018.06.01 15:34:39 5: dewpoint_notify humidity! dev=SensorAussen, hum_name=humidity, hum=82
2018.06.01 15:34:39 5: dewpoint max_timediff=1
2018.06.01 15:34:39 5: >dev=SensorAussen, temp_name=temperature, reference temperature=20 (0), hum=82
2018.06.01 15:34:39 5: dewpoint_notify: dewpoint=16.8
2018.06.01 15:34:39 5: dewpoint absFeuchte= 14.1
2018.06.01 15:34:39 5: dewpoint_notify: current=16.8



LOG nach Änderung temperature (20->21) im SensorAussenQuelle (Daten werden wie beschrieben alle 20 Sekunden nach SensorAussen kopiert):
2018.06.01 15:35:59 4: dewpoint_notify: cmd_type=dewpoint devname=SensorAussen dewname=dew_state_Aussen, dev=SensorAussen, dev_regex=SensorAussen temp_name=temperature hum_name=humidity
2018.06.01 15:35:59 5: dewpoint_notify: s='temperature: 21'
2018.06.01 15:35:59 5: dewpoint_notify: evName='temperature:' val=21'
2018.06.01 15:35:59 5: dewpoint_notify temperature! dev=SensorAussen, temp_name=temperature, temp=21
2018.06.01 15:35:59 5: dewpoint max_timediff=1
2018.06.01 15:35:59 5: >dev=SensorAussen, hum_name=humidity, reference humidity=82 (20), temp=21


Man sieht, dass die Routine aufgerufen wird, aber die Berechnung bei Änderung der Temperatur nicht erfolgt. Ich kann hieraus aber nicht erkennen wieso nicht.....
Meist liegt der Fehler vor der Tastatur

amenomade

#20
Im ersten Fall war time_diff 0, sprich < max_timediff. Deswegen erfolgte die Kalkulation.
Beim 2. Fall war time_diff 20, sprich > max_timediff. Deswegen keine Kalkulation.

Wenn nur ein Wert (temperature) geändert wurde, versucht dewpoint den anderen Wert (humidity) aus dem Reading zu lesen, aber er kalkuliert nicht, wenn dieser anderen Wert zu alt ist (älter als max_timediff).
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Gast45

#21
Ah, das ist der Wert in der Klammer? Auf die Idee, dass ich mit max_timediff ein Problem haben könnte, bin ich gar nicht gekommen, weil ich beide Werte doch quasi gleichzeitig schreibe. Aber klar, ich schreibe zuerst die Temperatur, dann wird schon das Event (offenbar ein Interrupt) erzeugt und die Luftfeuchtigkeit ist noch 20 Sekunden alt.

Man muss hier in Millisekunden denken und wissen, dass ein Event ein Interrupt ist, der sich zwischen den Kopierschritt schiebt.
Danke für die Unterstützung ..... max_timediff = 60 sollte dieses Problem lösen :)


Bleibt nur noch das, warum bei dieser Konfiguration nichts mehr ins FileLog geschrieben wird.
SensorAussen:T:.*
Aber as gucke ich mir nochmal an. Wird vielleicht daran liegen, dass es das Reading state so nicht mehr gibt?
Meist liegt der Fehler vor der Tastatur

amenomade

#22
Zitat von: Gast45 am 02 Juni 2018, 10:28:46
Ah, das ist der Wert in der Klammer? Auf die Idee, dass ich mit max_timediff ein Problem haben könnte, bin ich gar nicht gekommen,
Ja, isses. Auf die Idee wäre ich auch nicht gekommen, wenn ich nicht im Code geguckt hätte ;)

Ein Reading state gibt es nw. immer. state reagiert aber ein bisschen anders, was Events angeht.
https://fhem.de/commandref_DE.html#DOIF_addStateEvent
Schau mal die Events im EventMonitor, und guck was er vorschlägt, wenn Du die Zeile markierst, und dann dort auf "Create/Modify Device" klickst und FileLog auswählst. Da kriegst Du die richtige Regex. Vermutlich fehlt ein . vor dem T
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Gast45

#23
Ich habe eine noch schönere Lösung, um das max_timediff-Problem zu umgehen, weil man so weniger am Standard rumschrauben muss. Wenn man beide Werte (T/H) nicht einzeln, sondern nur einmal an eine FHEM-Routine übergibt, dann klappt es auch.

Ich habe die Definition für das Kopieren der Werte jetzt so gelöst:
+*00:00:20 { my $temp= ReadingsVal("SensorAussenQuelle","temperature",0) ;
my $hum= ReadingsVal("SensorAussenQuelle","humidity",0) ;
fhem("setreading SensorAussen temperature $temp;setreading SensorAussen humidity $hum");}
Meist liegt der Fehler vor der Tastatur

Gast45

#24
Das Problem mit dem Loggen scheint nicht trivial zu sein.

Hier nochmal der zeitliche Ablauf (erspart sich nochmal den ganzen Thread durchzulesen):

Vor dem letzten Update
Ich habe T/H alle 20 Sekunden in den state von SensorAussen kopiert. Den Taupunkt hatte ich mit "T H D" berechnet, wodurch mein STATE entsprechend erweitert wurde. Für die textuelle Ansicht hatte ich auch noch einen stateFormat-"Trick".
attr SensorAussen stateFormat state D: dewpoint A: absFeuchte
--> Im FileLog stand dann immer sowas:
2018-05-23_19:24:48 SensorAussen T: 24.3 H: 43.0 D: 10.9 A: 9.5
2018-05-23_19:28:28 SensorAussen T: 24.2 H: 43.0 D: 10.8 A: 9.4
2018-05-23_19:32:08 SensorAussen T: 24.1 H: 43.0 D: 10.7 A: 9.4

Und im STATE stand bei neu berechneten Werten durch die Berechnungen über 98_dewpoint:
T: 24.2 H: 43.0 D: 10.8 A: 9.4
oder, wenn keine neuen Werte berechnet wurden und damit stateFormat griff
T: 24.2 H: 43.0 D: n.V. A: 9.4
Dazu hatte ich ein UserReading dewpoint mit dem Wert "n.V." angelegt. Trick  ;D

Beim Letzen Update
Hier hat sich in 98_dewpoint beim Umgang mit stateFormat etwas geändert. Ohne dass ich etwas geändert hatte, stand seitdem im FileLog nur noch:
2018-05-23_19:34:31 SensorAussen T: 24.1 H: 43.0
2018-05-23_19:36:21 SensorAussen T: 24.0 H: 43.0
2018-05-23_19:37:21 SensorAussen T: 24.0 H: 42.0


Daraufhin hatte ich das stateFormat einfach nur gelöscht und im FileLog steht seit dem wieder:
2018-05-24_20:47:23 SensorAussen T: 19.3 H: 70.0 D: 13.7 A: 11.6
2018-05-24_20:52:43 SensorAussen T: 19.3 H: 70.0 D: 13.7 A: 11.6
2018-05-24_20:53:03 SensorAussen T: 19.3 H: 71.0 D: 13.9 A: 11.7


Allerdings habe ich jetzt auch im SATE nur noch T und H, hätte aber gerne auch wieder D und A.

Seit dem
Jetzt versuche ich irgendwie die alte Darstellung wieder herzustellen. Meine Erkenntnis bisher:
1. Offenbar darf man den Taupunkt nicht so berechnen:
dewpoint SensorAussen temperature humidity dewpoint
sondern so
dewpoint SensorAussen T H D
Das ist aber laut CommandRef nicht mehr anzuwenden
ZitatVeraltet, für neue Definitionen nicht mehr benutzen
  Wenn <temp_name> T lautet, wird die Temperatur aus state T: H: benutzt und <new_name> zu STATE hinzugefügt. Das hinzufügen zu STATE erfolgt nur, falls im Zielgerät das Attribut "stateFormat" nicht definiert ist.

2. Wenn man dennoch letztere Definition benutzt, dann führt
stateFormat state D: dewpoint A: absFeuchte
seit dem Update aber dazu, dass folgendes im STATE steht:
T: 19.3 H: 70.0 13.7: n.V. A: 11.6
"D" wird durch ein seit dem Update erzeugten Reading D ersetzt. Der Haken an der Sache ist nur, dass D nur genau einmal erzeugt und dann nie wieder aktualisiert wird :(
Sonst hätte ich das stateFormat einfach mit
[sprintf("....")}
umgeschrieben.


Darum nun die ganze Aktion auf
dewpoint SensorAussen temperature humidity dewpoint
umzustellen.
Hier habe ich mit dem stateFormat
attr SensorAussen stateFormat T: temperature H: humidity D: dewpoint A: absFeuchte
kein Problem. Aber das Loggen klappt halt nicht mehr. Über die Taupunktberechnung mit "T H D" gibt es im Logfile folgende Zeile am Ende der Taupunktberechnung:
dewpoint_notify: current=T: 26.1 H: 55 D: 16.4 A: 13.4
Die gibt es bei der Berechnung über "temperature humidity dewpoint" nicht.
Auch das Attribut
attr FileLog_SensorAussen addStateEvent 1
hat leider nicht geholfen.  :(
Man kann dann zwar "state" auswählen und der wird auch geloggt, aber "state" ist nicht gleich "STATE" und enthält D und A nicht.

Ich wühle mich mal durchs Forum.....


Meist liegt der Fehler vor der Tastatur

amenomade

Ich würde sagen: verschieb das Thread nach "Automatisierung" Unterforum. Dort werden dewpoint und Filelog gepflegt.
File                         Maintainer           Forum
=========================================================================
FHEM/92_FileLog.pm           rudolfkoenig         Automatisierung
FHEM/92_SingleFileLog.pm     rudolfkoenig         Automatisierung
FHEM/93_DbLog.pm             Tobias/DS_Starter    Automatisierung
FHEM/98_dewpoint.pm          hotbso               Automatisierung

Oder mach einfach ein neues Thread dort.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Gast45

In dem Zusammenhang gibt es folgenden Thread, der sich schwerpunktmäßig auf das Loggen bezieht:

https://forum.fhem.de/index.php?topic=88098.msg807911#msg807911
Meist liegt der Fehler vor der Tastatur