Hallo zusammen,
ich habe mein notify von Perl auf Fhem umgestellt:
defmod n_Luft_aussen notify MYSENSOR_4:(temperature2|humidity2).* setreading Luft_aussen temperature [MYSENSOR_4:temperature2];; setreading Luft_aussen humidity [MYSENSOR_4:humidity2]
Nun habe die eine Vermischung der Werte von 2 Sensoren im dbLog:
2021-02-26 17:57:08 2021-02-26_17-55-08__1__Luft_aussen__DHT T: 7.1 H: 99.9
2021-02-26 17:57:08 2021-02-26_17-55-08__1__Luft_aussen__DHT_1 T: 7.1 H: 41.7
2021-02-26 17:57:08 2021-02-26_17-55-11__1__Luft_aussen__DHT T: 20.6 H: 41.7
2021-02-26 17:57:08 2021-02-26_17-55-11__1__Luft_aussen__DHT_1 T: 20.6 H: 99.9
2021-02-26 17:57:08 2021-02-26_17-55-18__1__Luft_aussen__DHT T: 7.1 H: 99.9
2021-02-26 17:57:08 2021-02-26_17-55-18__1__Luft_aussen__DHT_1 T: 7.1 H: 41.7
Die Ausgabe von DHT_1 ist nur die Anzeige von dbLog, wg. des gleichen Zeitstempels. Alles readings heißen DHT.
Beide Sensoren sind im gleichen Device (MySensor-Node):
Internals:
DEF 4
FUUID 5fd64147-f33f-ff70-c307-fb28083d2e61c114
FVERSION 10_MYSENSORS_DEVICE.pm:0.232570/2020-11-29
IODev MyGW_RS485
NAME MYSENSOR_4
NR 385
STATE received presentation
TYPE MYSENSORS_DEVICE
ack 0
radioId 4
repeater 0
OLDREADINGS:
2021-02-26 17:58:10 temperature20 27.2
READINGS:
2021-01-19 19:03:38 SKETCH_NAME MySensHWR
2021-01-14 21:26:56 SKETCH_VERSION 1.2
2021-02-26 17:36:59 humidity1 41.7
2021-02-26 14:46:49 humidity2 99.9
2021-01-19 19:03:38 id10 2874700A05000019
2021-01-19 19:03:38 id11 28397C0B05000088
2021-01-19 19:03:38 id12 289F172C06000015
2021-01-19 19:03:38 id13 28FFFF740217048B
2021-01-19 19:03:38 id20 28FF0875021704F3
2021-01-19 19:03:38 id21 28FF9CD301170541
2021-01-19 19:03:38 parentId 0
2021-01-19 19:03:38 state received presentation
2021-02-26 17:36:59 temperature1 20.6
2021-02-26 17:30:52 temperature10 17.9
2021-02-26 17:24:48 temperature11 17.0
2021-02-26 17:55:11 temperature12 5.7
2021-02-26 17:18:43 temperature13 6.0
2021-02-26 17:57:00 temperature2 7.2
2021-02-26 17:58:20 temperature20 27.5
2021-02-26 17:37:30 temperature21 43.0
Dass ich die Werte so (T: 7.1 H: 41.7) logge, ist historisch bedingt, die Sensoren waren früher anders angeschlossen.
Wieso werden die readings temperature1 und temperature2, bzw. humidity1 und humidity2 vermischt?
Hi,
sorry aber ich kann keinen Zusammenhang zwischen Deinem notify deinem dbLog Auszug und deinem Device erkennen.
Da muss es eine unsichtbare Komponente geben.
Aber: mit deinem notify werden nun beide Werte immer doppelt nach Luft_aussen geschrieben - ist das sinnvoll?
Das sieht nach Datenschubse aus ::) kann man vielleicht effektiver lösen - wenn man wüsste was insgesamt passiert ;)
Gruß Otto
Hallo Otto,
du schon wieder ;)
Ja es gibt ein userReading, das ist jedoch nicht der Auslöser, das habe ich getestet. Deshalb auch erst nicht gepostet.
Ich musste schnell weg, da ist mir dann auch aufgefallen, dass der Zusammenhang fehlt. :(
Richtig:
Internals:
FUUID 5ffb3a85-f33f-ff70-8057-0d016672d081d7ab
NAME Luft_aussen
NR 415
STATE 6.9°C 99.9%
TYPE dummy
Helper:
DBLOG:
DHT:
logdb:
TIME 1614367629.02019
VALUE T: 6.9 H: 99.9
READINGS:
2021-02-26 20:34:34 DHT T: 6.9 H: 99.9
2021-02-26 20:27:09 dewpoint 6.9
2021-02-26 20:34:34 humidity 99.9
2021-02-26 20:34:34 temperature 6.9
Attributes:
DbLogInclude DHT.*
event-min-interval .*:3600
event-on-change-reading .*
group ConfoAir
room Technik->ConfoAir
stateFormat { sprintf("%s°C %s%%", ReadingsVal("Luft_aussen","temperature",0), ReadingsVal("Luft_aussen","humidity",0)) ; }
userReadings DHT {my $tem= ReadingsNum("Luft_aussen","temperature",0); my $hum= ReadingsNum("Luft_aussen","humidity",0); sprintf("T: %s H: %s", $tem, $hum) if ($tem || $hum) ne "NAN";}
Falsch:
Internals:
FUUID 5ffb3a85-f33f-ff70-8057-0d016672d081d7ab
NAME Luft_aussen
NR 415
STATE 20.4°C 41.5%
TYPE dummy
Helper:
DBLOG:
DHT:
logdb:
TIME 1614368229.58484
VALUE T: 20.4 H: 41.5
READINGS:
2021-02-26 20:37:09 DHT T: 20.4 H: 41.5
2021-02-26 20:37:09 dewpoint 6.9
2021-02-26 20:37:09 humidity 41.5
2021-02-26 20:37:09 temperature 20.4
Attributes:
DbLogInclude DHT.*
event-min-interval .*:3600
event-on-change-reading .*
group ConfoAir
room Technik->ConfoAir
stateFormat { sprintf("%s°C %s%%", ReadingsVal("Luft_aussen","temperature",0), ReadingsVal("Luft_aussen","humidity",0)) ; }
userReadings DHT {my $tem= ReadingsNum("Luft_aussen","temperature",0); my $hum= ReadingsNum("Luft_aussen","humidity",0); sprintf("T: %s H: %s", $tem, $hum) if ($tem || $hum) ne "NAN";}
Bezgl. doppeltes Schreiben in dbLog, ich möchte ja jede Temperatur- und Feuchteänderung erfassen. MySensor sendet nur Werte, die sich geändert habe, das sollte nicht tragisch sein. Wenn es aber besser geht, gerne...
Gruß und Danke
Bernd
Sorry, mein Fehler.
Ich habe das gleiche notify und Dummy für den 2. Sensor. Mit c&p geändert und die Hälfte beim anpassen übersehen. ;D
D.h. das 2. notify schreibt in diesen Dummy, anstatt in den Anderen (Kopf schlag).
Wie war das mit Wald und Bäume...
Du schreibst aber bei eine Temp Änderung die Temp und Hum und bei einer Hum Änderung die Temp und Hum. Also alles doppelt.
Mach mal erstmal lieber zwei notify
defmod n_Luft_aussen1 notify MYSENSOR_4:humidity2.* setreading Luft_aussen humidity $EVTPART1
defmod n_Luft_aussen2 notify MYSENSOR_4:temperature2.* setreading Luft_aussen temperature $EVTPART1
Aber wozu musst Du die Daten erst in den Dummy schubsen? Warum machst Du das userReadings nicht gleich im MYSENSOR_4?
Zitat von: Otto123 am 26 Februar 2021, 21:01:56
Du schreibst aber bei eine Temp Änderung die Temp und Hum und bei einer Hum Änderung die Temp und Hum. Also alles doppelt.
Mach mal erstmal lieber zwei notify
defmod n_Luft_aussen1 notify MYSENSOR_4:humidity2.* setreading Luft_aussen humidity $EVTPART1
defmod n_Luft_aussen2 notify MYSENSOR_4:temperature2.* setreading Luft_aussen temperature $EVTPART1
Aber wozu musst Du die Daten erst in den Dummy schubsen? Warum machst Du das userReadings nicht gleich im MYSENSOR_4?
Mit 2 notify ist es besser, habe es gerade in der Datenbank gesehen.
Wie schon erwähnt, die Sensoren waren zuvor anders (AVR NetIO mit Ethersex über ECMD) angebunden. Um nicht rückwirkend die Datenbank anzupassen usw. habe ich das pragmatisch erstmal so gelöst.
Zudem habe ich gerne einzelne Devices, besserer Überblick, Verteilung in versch. Räume, STATE ist entsprechend anpassbar.
Wenn du die readings im MYSENSOR_4-Device siehts, das sind "eigentlich" 5 verschiedene Devices zusammengefasst (PV-Temp, Vor- und Rücklauf EWT, Diff.Temp. bei Sonnenschein, Temp u. Feuchte Lüftung, Temp u. Feuchte HWR).
3 Nodes habe ich noch gar nicht aktiv, da sieht es noch "schlimmer" aus. ;D
"Schalter" mache ich mit readingsProxy...da gibt es keine Events, daher hierfür nicht geeignet.
Ich musste das notify so schreiben:
defmod n_Luft_aussen_Temp notify MYSENSOR_4:temperature2.* setreading Luft_aussen temperature [MYSENSOR_4:temperature2]
Sobald ich $EVTPART1 benutze werden auch die temperature20 und 21 ins Reading geschrieben. Ist logisch, da regex: temperature2.*
Wie kann man das regex auf die 2 beschränken?
Klar, denn das Reading ist doch im Event mit Doppelpunkt begrenzt? Immer im Eventmonitor schauen!
temperature2.* triggert alles was mit temperature2 beginnt.
temperature2:.* triggert alles was mit temperature2: beginnt. $EVTPARTx wird am Leerzeichen getrennt.
Zitat von: Otto123 am 27 Februar 2021, 00:18:36
Klar, denn das Reading ist doch im Event mit Doppelpunkt begrenzt? Immer im Eventmonitor schauen!
temperature2.* triggert alles was mit temperature2 beginnt.
temperature2:.* triggert alles was mit temperature2: beginnt. $EVTPARTx wird am Leerzeichen getrennt.
Danke Otto, ich habe zu kompliziert gedacht. Eventmonitor, klar, war Gestern wohl schon zu spät. ::)
Allerdings hatte ich schon mehrmals notifys, da hat es mit dem Doppelpunkt nicht funktioniert -> und wieder der Eventmonitor. :o
Nochmal als Info:
Das Trennen auf 2 notify erzeugt weiterhin doppelte Einträge in der Datenbank, sobald sich Temperatur und Feuchte gleichzeitig ändern. Der Grund liegt darin, dass beim auslesen des DHT22 beides "gleichzeitig" abgefragt und bei Änderungen auch beides übertragen wird.
Da die Feuchte nicht so wichtig ist, triggere ich nun nur noch auf die Temperatur und übertrage damit beide Sensorwerte:
defmod n_Luft_aussen_Temp notify MYSENSOR_4:temperature2:.* setreading Luft_aussen temperature $EVTPART1;; setreading Luft_aussen humidity [MYSENSOR_4:humidity2]