ESPEasy fehler im Log: missed to call readingsBeginUpdate

Begonnen von clumsy, 02 Januar 2019, 14:07:14

Vorheriges Thema - Nächstes Thema

clumsy

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

dev0

Zeige bitte noch ein list vom Device wemos_mini_05_cox, da der Fehler bei mir der noch nie aufgetreten ist.

clumsy

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

dev0

Verwendest Du in der Sub setAirQuality() readingsSingleUpdate() oder oder den FHEM Befehl setreading?
Falls ja, dann ab jetzt stattdessen bitte 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.

clumsy

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!

dev0

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.

dev0

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.

clumsy

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!!  ;)

dev0

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.