Hallo (@dev0)
Nur zur Info: nach dem update auf die neuste Version (18088) gibts bei jedem update ein Fehler im fhem.log:
2019.01.02 13:54:35 1: readingsUpdate(wemos_mini_05_cox,COx,20.19) missed to call readingsBeginUpdate first.
2019.01.02 13:54:35 1: stacktrace:
2019.01.02 13:54:35 1: main::readingsBulkUpdate called by /opt/fhem/FHEM/34_ESPEasy.pm (1744)
2019.01.02 13:54:35 1: main::ESPEasy_dispatchParse called by /opt/fhem/fhem.pl (3806)
2019.01.02 13:54:35 1: main::Dispatch called by /opt/fhem/FHEM/34_ESPEasy.pm (1639)
2019.01.02 13:54:35 1: main::ESPEasy_dispatch called by /opt/fhem/FHEM/34_ESPEasy.pm (1106)
2019.01.02 13:54:35 1: main::ESPEasy_Read called by /opt/fhem/FHEM/98_apptime.pm (205)
2019.01.02 13:54:35 1: main::apptime_getTiming called by /opt/fhem/FHEM/98_apptime.pm (165)
2019.01.02 13:54:35 1: main::CallFn called by /opt/fhem/fhem.pl (727)
Falls Du Dir das mal ansehen magst.
gruss
STefan
Zeige bitte noch ein list vom Device wemos_mini_05_cox, da der Fehler bei mir der noch nie aufgetreten ist.
Klar, unten.. Jetzt wo du's sagst, fällt mir grad auf, dass es bei mir nur bei ca. 4 oder 5 devices auftritt (von ca. 50)... Evtl. wegen dem adjustValue oder devStateIcon?
Internals:
CFGFN /etc/fhem/espeasy.cfg
DEF wemos-mini-5.clumsy.ch 80 espeasy wemos_mini_05_cox
ESP_BUILD 20103
ESP_BUILD_GIT SMY_2.69T4 Jan 2 2019 15:56:24
ESP_BUILD_NOTES - Mega
ESP_NODE_TYPE_ID ESP Easy Mega
ESP_SLEEP 0
ESP_UNIT 5
ESP_VERSION 2
HOST wemos-mini-5.clumsy.ch
IDENT wemos_mini_05_cox
INTERVAL 300
IODev espeasy
LASTInputDev espeasy
MAX_CMD_DURATION 1
MSGCNT 316
NAME wemos_mini_05_cox
NOTIFYDEV global
NR 600
NTFY_ORDER 50-wemos_mini_05_cox
PORT 80
STATE COx: 18.84
SUBTYPE device
TYPE ESPEasy
VERSION 2.14
espeasy_MSGCNT 316
espeasy_TIME 2019-01-03 07:27:52
Helper:
DBLOG:
COx:
dblog:
TIME 1546496872.90262
VALUE 18.84
presence:
dblog:
TIME 1546496716.47958
VALUE present
state:
dblog:
TIME 1546496872.96355
VALUE COx
READINGS:
2019-01-03 07:27:52 COx 18.84
2019-01-03 07:25:16 presence present
2019-01-03 07:27:52 quality OK
2019-01-03 07:27:52 state COx: 18.84
helper:
fpc 1546470095
bm:
ESPEasy_Notify:
cnt 17
dmx -1000
dtot 0
dtotcnt 0
mTS 03.01. 00:01:34
max 0.000484943389892578
tot 0.00112533569335938
mAr:
HASH(0x558279844908)
HASH(0x558276925b10)
ESPEasy_Set:
cnt 59
dmx -1000
dtot 0
dtotcnt 0
mTS 03.01. 07:25:35
max 0.00038599967956543
tot 0.011237621307373
mAr:
HASH(0x558279844908)
wemos_mini_05_cox
?
pm:
Encode 1
JSON 1
received:
COx 1546496872
sec:
admpwd ******
Attributes:
IODev espeasy
Interval 300
adjustValue COx:setAirQuality($NAME,$READING,$VALUE,40,50)
devStateIcon {my $max=80; return ".*:message_attention\@FF0000" if (ReadingsVal("wemos_mini_05_cox", "presence", undef) ne "present"); return ".*:air_cox_100\@FF0000" if (ReadingsVal("wemos_mini_05_cox", "COx", undef) > $max); return ".*:air_cox_90\@FF3300" if (ReadingsVal("wemos_mini_05_cox", "COx", undef) > ($max*.9)); return ".*:air_cox_80\@FF6600" if (ReadingsVal("wemos_mini_05_cox", "COx", undef) > ($max*.8)); return ".*:air_cox_70\@FF9900" if (ReadingsVal("wemos_mini_05_cox", "COx", undef) > ($max*.7)); return ".*:air_cox_60\@FFCC00" if (ReadingsVal("wemos_mini_05_cox", "COx", undef) > ($max*.6)); return ".*:air_cox_50\@FFFF00" if (ReadingsVal("wemos_mini_05_cox", "COx", undef) > ($max*.5)); return ".*:air_cox_40\@CCFF00" if (ReadingsVal("wemos_mini_05_cox", "COx", undef) > ($max*.4)); return ".*:air_cox_30\@99FF00" if (ReadingsVal("wemos_mini_05_cox", "COx", undef) > ($max*3)); return ".*:air_cox_20\@66FF00" if (ReadingsVal("wemos_mini_05_cox", "COx", undef) > ($max*.2)); return ".*:air_cox_10\@33FF00" if (ReadingsVal("wemos_mini_05_cox", "COx", undef) > ($max*.1)); return ".*:air_cox\@00FF00" }
event-on-change-reading .*
event-on-update-reading state,switch,presence
fp_UG 422,579,0,wemos_mini_05_cox,
fp_Uebersicht 822,396,1,Garage,
group ESPEasy Device,air_quality
luftqualitaet all_luftqualitaet
luftqualitaet_map quality
presenceCheck 1
room Garage
setState 3
st_deviceHealth deviceHealth_ALL
st_deviceHealth_map deviceHealth
userattr luftqualitaet luftqualitaet_map st_deviceHealth st_deviceHealth_map structexclude wemos wemos_map
wemos all_wemos
Verwendest Du in der Sub setAirQuality() readingsSingleUpdate() oder oder den FHEM Befehl setreading?
Falls ja, dann ab jetzt stattdessen bitte readingsBulkUpdate (https://wiki.fhem.de/wiki/DevelopmentModuleAPI#readingsBulkUpdate) verwenden. Falls Du den device hash dafür benötigest, dann kannst Du "$defs{$NAME}" verwenden. Alternativ das Setzen des Readings via FHEM sleep Befehl verzögern (yield). Letzteres habe ich aber nicht getestet.
ja korrekt, verwende ich:
sub setAirQuality($$$$$) {
my ($name,$reading,$value,$warn,$crit) = @_;
my $cur = ReadingsVal("$name", "quality", undef);
if ($cur eq "WARNING") { $warn *= .90; }
if ($cur eq "CRITICAL") { $crit *= .90; }
if ($value < $warn) {
fhem("setreading $name quality OK");
} elsif ($value < $crit) {
fhem("setreading $name quality WARNING");
} else {
fhem("setreading $name quality CRITICAL");
}
return $value
}
Muss ich mir ansehen wie ich das umbaue, da ich die Funktion auch anderorts verwende und noch nie direkt mit dem readingsBulkUpdate werte angepasst hab.... nehme gerne tipps entgegen ;)
Als interimslösung hab ich übrigens einfach ein readingsBeginUpdate($hash); direkt vor dem Zeile 1744 eingebaut... Das funktioniert zwar, aber ist wohl nicht ganz so elegant (und korrekt)...
Vielen Dank schonmal!
Wenn Du diese Sub auch an anderer Stelle aufrufst, dann würde ich es via FHEM sleep versuchen:
statt:
fhem("setreading $name quality WARNING");
so:
fhem("sleep 0.1; setreading $name quality WARNING");
Dem FHEM sleep muss immer ein weiterer FHEM Befehl folgen, sonst blockiert FHEM einfach nur und ruft den folgenden Befehl nicht via Timer auf.
Wenn die gezeigte Sub vollständig ist und $VALUE gar nicht angepasst wird, dann würde ich eher ein Notify verwerden. In der command ref zu notify steht der Hinweis mit dem sleep auch drin, wenn ich micht richtig erinnere.
ok, danke für die tipps, schau ich mir an... wobei ich nicht so fan vom notify bin, in meinem setup (ca. 4000zeilen config mit >1500 devices) stell ich fest, dass die notifiy's recht zeit brauchen... aber eine variante wärs sicher..
übrigens noch guten start im neuen Jahr!! ;)
Statt notify geht auch DOIF, aber meine Vermutung ist, dass der Overhead dort gößer ist (ich kenne DOIF aber nicht wirklich).
Dir auch ein frohes Neues.