98_dewpoint seit Update 23.05.18 fehlerhaft?

Begonnen von Gast45, 24 Mai 2018, 20:33:54

Vorheriges Thema - Nächstes Thema

Gast45

Hallo zusammen,
Seit dem o.g. Update wird mit
define dew_state dewpoint dewpoint Aussen_1 T H D
nicht immer, aber immer mal wieder im Device ein Reading ,,D" mit dem Taupunktwert angelegt. Manchmal wird nur der STATE um den Taupunkt erweitert, und manchmal zusätzlich dieses Reading.
(stateFormat zu dieser Zeit nicht definiert)

Da ich aber eigentlich stateFormat nutze
stateFormat state D: dewpoint A: absFeuchte
wird mir dieses Format zerschossen, sobald das erste mal das Reading ,,D" erzeugt wird, weil dann das D durch den Wert des Readings ersetzt wird.

Hat das Problem noch jemand?

Meist liegt der Fehler vor der Tastatur

sash.sc

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

Gast45

#2
Ja, soweit so gut, nur wird das Reading D nicht regelmäßig aktualisiert. Die absFeuchte wird öfter aktualisiert, obwohl beides ja zeitgleich berechnet wird.
Außerdem wäre ein anderer Reading-Name statt D schöner, weil man dann ein schönes knappes stateFormat mit u.a. ,,D:" als Bezeichnung machen kann, ohne dass diese mit dem Wert des Readings überschrieben wird.

Mal ein aktueller Auszug:

DeviceOverview            T: 25.5 H: 52.0 D: 14.9 A: 12.3
D                       13.9                      2018-05-24 20:07:03
absFeuchte         12.4                      2018-05-25 17:43:43
state                  T: 25.6 H: 52.0      2018-05-25 17:44:23


Es gibt hier kein stateFormat und wie man sieht ist D von gestern, absFeuchte aktuell und der Overview weicht von allem nochmal ab. Unschön sag ich mal....

Meist liegt der Fehler vor der Tastatur

hotbso

Das Reading heißt D, weil du das in deiner Definition so nennst. Siehe doch bitte in den anderen Thread oder die online Hilfe, da ist das beschrieben.

Gesendet von meinem Nexus 5X mit Tapatalk


Gast45

Sorry, ja stimmt mit dem Namen, war mir klar, hatte ich nur verdrängt. Aber mein ergänzter Satz oben zeigt weitere Diskrepanzen auf.....
Meist liegt der Fehler vor der Tastatur

hotbso

Setze im dewpoint mal verbose auf 5. Dann wird sehr detailliert geloggt, wie die Werte zu Stande kommen.

Gesendet von meinem Nexus 5X mit Tapatalk


Gast45

#6
Hier das Ergebnis, das meiner Meinung nach meine Schilderungen stützt.
Zunächst der Output im Log:

2018.05.25 18:45:23 4: dewpoint_notify: cmd_type=dewpoint devname=SensorAussen dewname=dew_state_Aussen, dev=SensorAussen, dev_regex=SensorAussen temp_name=T hum_name=H
2018.05.25 18:45:23 5: dewpoint_notify: s='T: 25.0 H: 56.0'
2018.05.25 18:45:23 5: dewpoint_notify: evName='T:' val=25.0'
2018.05.25 18:45:23 5: dewpoint_notify T: H:, temp=25.0 hum=56.0
2018.05.25 18:45:23 5: dewpoint max_timediff=1
2018.05.25 18:45:23 5: dewpoint_notify: dewpoint=15.6
2018.05.25 18:45:23 5: dewpoint absFeuchte= 12.9
2018.05.25 18:45:23 5: dewpoint_notify: current=T: 25.0 H: 56.0 D: 15.6 A: 12.9


Die Werte der letzte Zeile landen auch im File_LOG. Soweit so gut. Aber die Werte im Device sehen zu der Zeit leider so aus:

DeviceOverview        T: 25.0 H: 56.0

STATE                 T: 25.0 H: 56.0

D                     13.9              2018-05-24 20:07:03
absFeuchte            12.9              2018-05-25 18:45:23
Meist liegt der Fehler vor der Tastatur

Gast45

#7
Ich habe noch einen Satz mitgeschrieben, weil hier der STATE vervollständigt wurde, was im vorherigen Beispiel irgendwie nicht der Fall war....

Log:

2018.05.25 19:14:43 4: dewpoint_notify: cmd_type=dewpoint devname=SensorAussen dewname=dew_state_Aussen, dev=SensorAussen, dev_regex=SensorAussen temp_name=T hum_name=H
2018.05.25 19:14:43 5: dewpoint_notify: s='T: 24.3 H: 58.0'
2018.05.25 19:14:43 5: dewpoint_notify: evName='T:' val=24.3'
2018.05.25 19:14:43 5: dewpoint_notify T: H:, temp=24.3 hum=58.0
2018.05.25 19:14:43 5: dewpoint max_timediff=1
2018.05.25 19:14:43 5: dewpoint_notify: dewpoint=15.5
2018.05.25 19:14:43 5: dewpoint absFeuchte= 12.8
2018.05.25 19:14:43 5: dewpoint_notify: current=T: 24.3 H: 58.0 D: 15.5 A: 12.8



Device:

DeviceOverview
SensorAussen        T: 24.3 H: 58.0 D: 15.5 A: 12.8

STATE              T: 24.3 H: 58.0 D: 15.5 A: 12.8

D             13.9 2018-05-24 20:07:03
absFeuchte     12.8 2018-05-25 19:14:43

state              T: 24.3 H: 58.0 2018-05-25 19:14:43


Edit:
Der erste Datensatz kann glaube ich ignoriert werden. Ich übertrage alle 20 Sekunden die Temperatur und Luftfeuchte von einem Gerät in das Device SensorAussen. Dadurch kann ich alle Konfigurationen an SensorAussen binden und habe es leichter bei einem Batteriewechsel, denn da erscheinen die Sensoren immer als völlig neues Gerät, das ich auf diese weise nicht aufwändig umprogrammieren muss. Dadurch verschwinden aber immer wieder Taupunkt und absFeuchte aus dem STATE.
Meist liegt der Fehler vor der Tastatur

hotbso

Es sieht so aus, dass Du genau das Problem hast, wegen dem ich die Änderung in dewpoint gemacht habe. Die ist bei Dir nicht aktiv, weil du kein stateFormat benutzt.
Das ändern im STATE eines anderen devices muss (dewpoint ändert state im Sensor) ist problematisch.

Damit es richtig und deterministisch funktioniert, rate ich dir dringend zum Vorgehen mit stateFormat, wie hier https://forum.fhem.de/index.php?topic=87916.0 und in der Doku von dewpoint beschrieben.

Gruss
Holger

Gast45

Hi hotbso,

danke für deine Rückmeldung und schon mal sorry für den folgenden langen Text :)
Eigentlich hatte ich gedacht, dass ich es verstehe. Vor dem letzten Update hatte ich stateFormat genutzt, weil bei meiner Konfiguration im STATE immer nur T und H auftauchten, außer es kam zu einer Berechnung von D und A, dann kamen diese Werte für 20 Sekunden (s.u. at-Befehl) dazu.
Ich hatte da etwas getrickst: Durch das stateFormat (attr SensorAussen stateFormat state D: dewpoint A: absFeuchte) hatte ich erreicht, dass, wenn die Werte D/A nicht berechnet werden, der STATE nach dem stateFormat gebildet wird. Für "dewpoint" hatte ich ein userReading angelegt mit dem Wert "n.V.". Dadurch wußte ich, ob es aktuell berechnete Werte waren (D-Wert liegt durch 98_dewpoint vor) oder alte Werte (D-Wert ist "n.V." aus dem userReading), aber ich konnte zahlenmäßig immer den letzten Wert für absFeuchte lesen.

Nach dem Update blieben die Werte D/A komplett aus und ich habe stateFormat erstmal entfernt. Damit waren die Werte zumindest wieder im FileLog und damit in den Grafiken.

Also zur Erkläung im Detail mache ich vom Prinzip her folgendes:
Der Klimasensor liefert seine Daten (T/H) mal zeitnah mal weniger zeitnah und vereinzelt an ein Device vom Typ CUL_TX mit Namen "SensorAussenQuelle". Damit ich bei einem Batteriewechsel möglichst wenig Arbeit habe, passiert hier absolut nichts weiter.

Per at-Befehl kopiere ich alle 20 Sekunden die gerade vorliegenden Werte für T/H in den state von "SensorAussen". Zwar können die Werte in der Quelle zeitlich weiter auseinander liegen, aber davon weiß "SensorAussen" so natürlich nichts.
+*00:00:20 { my $temp= ReadingsVal("SensorAussenQuelle","temperature",0) ;
my $hum= ReadingsVal("SensorAussenQuelle","humidity",0) ;
fhem("set SensorAussen T: $temp H: $hum");}


Um nicht alle 20 Sekunden unveränderte Werte ins FileLog zu schreiben, werden Events nur ausgelöst, wenn der state sich ändert, aber mindestens alle 5 Minuten.
attr SensorAussen event-min-interval .*:300
attr SensorAussen event-on-change-reading state


Mit der ursprünglichen stateFormat Definition kann ich jetzt ohne Änderungen nichts mehr erreichen
attr SensorAussen stateFormat state D: dewpoint A: absFeuchte
Im Ergebnis würde bei mir jetzt "state", "D", "dewpoint" und "absFeuchte" durch die Readings ersetzt, wobei "D", wie du siehst nur einmal erzeugt und dann nie wieder aktualisiert wird.
T: 35.1 H: 33.0 13.9: n.V. A: 13.1


Ich könnte mir mit der jetzigen Philosophie von 98_dewpoint ja wieder mit stateFormat behelfen. Aber leider wird D offensichtlich nicht aufgefrischt.
Leider verstehe ich nicht, was du mit
ZitatDas ändern im STATE eines anderen devices muss (dewpoint ändert state im Sensor) ist problematisch.
meinst.
Ich ändere ja nach meinem Verständnis nichts in einem anderen Device? Aus SensorAussen wird Event-gesteuert dewpoint aufgerufen und sonst nichts weiter eigentlich. Und das ist doch auch Sinn und Zweck von 98_dewpoint?
define dew_state_Aussen dewpoint dewpoint SensorAussen T H D
Meist liegt der Fehler vor der Tastatur

hotbso

Ja, aber dewpoint ist ja ein selber ein Gerät, nämlich ein anderes Gerät als dein Sensor SensorAussen. Mit define legt man ja ein Gerät im Sinne von FHEM an. Und das Gerät dewpoint soll den STATE deines Geräts AussenSensor ändern. Das tun bei Dir aber noch jede Menge andere Akteure.

Deshalb schlage ich vor:
Wie auch immer erzeuge die Readings temperature und humidity in deinem AussenSensor und sorge dafür, dass events generiert werden.

Definiere dewpoint mit
define dew_state_Aussen dewpoint dewpoint SensorAussen temperature humidity dewpoint

Wenn dann events für temperature/humidity erzeugt werden, legt dewpoint verläßlich die Readings dewpoint und absFeuchte an und löst die Events dafür aus.
Dein stateFormat vom AussenSensor wird getriggert und formatiert den state nach deinen Wünschen.

Das funktioniert dann deterministisch.

Gast45

#11
Ich habe jetzt folgendes getan:

T/H alle 20 Sekunden kopieren:
+*00:00:20 { my $temp= ReadingsVal("SensorAussenQuelle","temperature",0) ;
my $hum= ReadingsVal("SensorAussenQuelle","humidity",0) ;
fhem("setreading SensorAussen temperature $temp");
fhem("setreading SensorAussen humidity $hum");}


Events auslösen:
attr SensorAussen event-min-interval .*:300
attr SensorAussen event-on-change-reading humidity,temperature


Taupunktberechnung:
define dew_state_Aussen dewpoint dewpoint SensorAussen temperature humidity dewpoint

STATE formatiert:
attr SensorAussen stateFormat T: temperature H: humidity D: dewpoint A: absFeuchte

Scheint soweit zu funktionieren, nur leider laufen die Werte jetzt nicht mehr ins FileLog. Das verstehe ich jetzt gerade noch nicht so recht, weil ich dachte, dass der STATE ins FileLog geschrieben wird. Damit die Files nicht so lang werden, hatte ich bisher folgendes Fileformat erzeugt:
2018-05-26_14:24:03 SensorAussen T: 36.6 H: 29.0 D: 15.7 A: 12.4
2018-05-26_14:28:03 SensorAussen T: 36.2 H: 29.0 D: 15.3 A: 12.2
2018-05-26_14:30:03 SensorAussen T: 36.3 H: 29.0 D: 15.4 A: 12.2


Dazu hatte ich folgende Definition für REGEXP im FileLog:
SensorAussen:T:.*
Meist liegt der Fehler vor der Tastatur

hotbso

Ich vermute mal, Du musst addStateEvent setzen. Bin aber kein Experte für Filelog.

Gast45

Danke für den Tipp. Manchmal braucht man einen Anstoß, in welche Richtung es Sinn macht weiter zu lesen. Leider komme ich im Moment nicht dazu..... melde mich aber, ob es geholfen hat :)
Meist liegt der Fehler vor der Tastatur

Gast45

Ne, das hat leider nicht geholfen..... 
Meist liegt der Fehler vor der Tastatur