Hallo,
seit der Nacht wo ich ein Update von FHEM durchlaufen lies habe ich ein sehr eigenartiges Phänomen.
Ich habe ein Device
Internals:
DEF 192.168.1.10 80 ESPEasy PuWa_2020_Wasseruhr
ESPEasy_MSGCNT 70
ESPEasy_TIME 2020-11-16 13:40:55
ESP_BUILD 20111
ESP_BUILD_NOTES - Mega
ESP_NODE_TYPE_ID ESP Easy Mega
ESP_SLEEP 0
ESP_UNIT 0
ESP_VERSION 2
FUUID 5faad607-f33f-06c8-4622-9876bed2f91588dd
HOST 192.168.1.10
IDENT PuWa_2020_Wasseruhr
INTERVAL 300
IODev ESPEasy
LASTInputDev ESPEasy
MAX_CMD_DURATION 1
MSGCNT 70
NAME ESPEasy_PuWa_2020_Wasseruhr
NOTIFYDEV global
NR 252
NTFY_ORDER 50-ESPEasy_PuWa_2020_Wasseruhr
PORT 80
STATE <div style="padding: 0px 5px 0px 5px;;;; text-align: left;;;;"> Verbrauch: 118,459m³</div>
SUBTYPE device
TYPE ESPEasy
VERSION 2.18
OLDREADINGS:
READINGS:
2020-11-16 13:40:55 Pulse_Count 489
2020-11-16 13:40:55 Pulse_Total 489
2020-11-16 13:40:55 Time 7153.00
2020-11-16 13:40:55 Total_Value 118459
2020-11-16 13:36:33 presence present
2020-11-16 13:40:55 state Pul: 489 Pul: 489 Tim: 7153.00
2020-11-16 13:40:55 value 118459
helper:
fpc 1605528379
pm:
Encode 1
JSON 1
received:
Pulse_Count 1605530455
Pulse_Total 1605530455
Time 1605530455
sec:
admpwd
Attributes:
IODev ESPEasy
Interval 300
alias Wasseruhr
group 0_Verbrauchsdaten
presenceCheck 1
readingSwitchText 1
room 23_Wasser
setState 3
startvalue 117970
stateFormat {
my $val = ReadingsVal($name,"Total_Value",0) / 1000;
$val = sprintf("%.3f",$val);
$val =~ s/\./,/;
'<div style="padding: 0px 5px 0px 5px;;;; text-align: left;;;;"> Verbrauch: '.$val."m³".'</div>'
}
userattr startvalue
verbose 2
welches auf einmal die Readings, welche via notify geschrieben werden, nicht mehr ins Logfile überträgt obwohl ein Event generiert wird.
Internals:
DEF ESPEasy_PuWa_2020_Wasseruhr:Pulse_Total.* {
my $val = ReadingsVal("ESPEasy_PuWa_2020_Wasseruhr","Pulse_Total",0);
my $attrval = AttrVal("ESPEasy_PuWa_2020_Wasseruhr","startvalue",0);
#Log 1, "NOTIFY_ESPEasy_Wasserzaehlerberechnung: startvalue=$attrval val=$val";
my $resulat = $attrval + $val;
if ($val > 0) {
CommandSetReading(undef, "ESPEasy_PuWa_2020_Wasseruhr Total_Value $resulat");
CommandSetReading(undef, "ESPEasy_PuWa_2020_Wasseruhr value $resulat");
CommandSet($defs{ESPEasy_PuWa_2020_Wasseruhr},"ESPEasy_PuWa_2020_Wasseruhr taskvalueset 1 1 ".$resulat/1000);
}
}
FUUID 5fabe74b-f33f-06c8-37f4-b483f8016cfd4631
NAME Wasserzaehlerberechnung
NOTIFYDEV ESPEasy_PuWa_2020_Wasseruhr
NR 261
NTFY_ORDER 50-Wasserzaehlerberechnung
REGEXP ESPEasy_PuWa_2020_Wasseruhr:Pulse_Total.*
STATE 2020-11-16 13:42:55
TRIGGERTIME 1605530575.18155
TYPE notify
READINGS:
2020-11-16 13:28:11 state active
Attributes:
group 3_Automatik
room 23_Wasser
Definition des Logfiles:
Internals:
CFGFN
DEF ./log/ESPEasy_PuWa_2020_Wasseruhr-%Y-%m.log ESPEasy_PuWa_2020_Wasseruhr:.*
FD 57
FUUID 5fb2720f-f33f-06c8-8f30-489d29354220d973
NAME FileLog_ESPEasy_PuWa_2020_Wasseruhr
NOTIFYDEV ESPEasy_PuWa_2020_Wasseruhr
NR 605
NTFY_ORDER 50-FileLog_ESPEasy_PuWa_2020_Wasseruhr
REGEXP ESPEasy_PuWa_2020_Wasseruhr:.*
STATE active
TYPE FileLog
currentlogfile ./log/ESPEasy_PuWa_2020_Wasseruhr-2020-11.log
logfile ./log/ESPEasy_PuWa_2020_Wasseruhr-%Y-%m.log
READINGS:
2020-11-16 13:43:55 linesInTheFile 72
Attributes:
room 23_Wasser
Die Readings Total_Value & value gehen verlustig. Wieso?
Ich erbitte Mithilfe.
MfG Marco
ZitatDie Readings Total_Value & value gehen verlustig. Wieso?
Weil die Methode, mit notify (oder DOIF,etc) Events zu "bereichern" nur zufaellig funktioniert, da spielt mindestens die Reihenfolge der Auswertung eine Rolle, evtl. auch andere Aspekte. Fuer diese Aufgabe sollte man userReadings verwenden.
Ein Umweg ist die Events mit sleep/InternalTimer/etc entkoppelt zu setzen.
Vielen Dank Rudi für die schnelle Antwort.
Ich hatte mir schon so etwas gedacht, das da ggf. eine Reihenfolge einwirkt.
Es wird sich also im Hintergrund etwas an Performence oder der abzuwicklenden Prozesse geändert haben.
Meine jetzige Lösung, userReadings:
userReadings value_liter {
my $val = ReadingsVal("ESPEasy_PuWa_2020_Wasseruhr","Pulse_Total",0);
my $attrval = AttrVal("ESPEasy_PuWa_2020_Wasseruhr","startvalue",0);
#Log 1, "NOTIFY_ESPEasy_Wasserzaehlerberechnung: startvalue=$attrval val=$val";
my $resulat = $attrval + $val;
if ($val > 0) {
$resulat
};
},
value_cubic_meter {
my $val = ReadingsVal("ESPEasy_PuWa_2020_Wasseruhr","value_liter",0) / 1000;
#$val = sprintf("%.3f",$val);
#$val =~ s/\./,/;
}
Danke!