FHEM geht beu userreading auf 100% - warum

Begonnen von dirk.k, 18 April 2020, 20:19:50

Vorheriges Thema - Nächstes Thema

dirk.k

Hallo,
ich möchte (innerhalb Userreadings) ein reading (PictureLast) in das reading Picture1 auf dem gleichen Gerät verschieben.
Geht ein Wert für "PictureLast" ein, geht der fhem prozess auf 100% und nach 30 miunten hat sich das noch nicht beruhigt. Nur ein FHEM-Neustart hilft.
Was ist die Ursache für so ein Verhalten? Damit, das etwas bei Fehlern nicht funktioniert, hatte ich ja gerechnet.


attr ESPCamMotion userReadings tmp:PictureLast.* {
  fhem("setreading $NAME Picture1 blabla");
  return "bearbeitet";
},


Verbesserungsvorschläge nehme ich natürlich auch gerne an.

CoolTux

Du missbrauchst die Funktion für etwas für das sie niemals gedacht war.
Nimm ein Notify
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

KölnSolar

Wieso ?

Wenn ich den TE richtig verstehe, hat er sein Ziel nur falsch umgesetzt. Mir ist nur nicht klar, was da passiert. Ein endless-loop dürfte es nicht sein. eher blockiert das setreading auf das selbe device.  :-\

Dasattr ESPCamMotion userReadings Picture1:PictureLast.* {
  ReadingsVal($name,"PictureLast","") },
sollte der Beschreibung des Ziels entsprechen

Wozu soll tmp gut sein ? Wenn Du es unbedingt so brauchst könnte
attr ESPCamMotion userReadings Picture1:PictureLast.* {
  ReadingsVal($name,"PictureLast","") },
tmp:PictureLast.* {return "bearbeitet"},
funktionieren.

RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

CoolTux

Das
fhem("setreading $NAME Picture1 blabla");
ist nicht Sinnvoll in einem userreadings
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

dirk.k

ok, danke für den Input.
Die "pilot-zeile" war ja als POC nur dafür da, die Machbarkeit der Funktion auf einfache Weise zu prüfen.
Ziel war es, einen Wert auf ein anderes reading zu verschieben und so eine "Historie" zu bauen.
Meine ESP-CAM erstellt bei erkannter Bewegung ein Bild und schreibt den dateinamen in ein reading. Und ich möchte davon die letzten 10 aufgeführt haben.
Gelöst habe ich es jetzt so:

Picture9:PictureLast.* { ReadingsVal("ESPCamMotion","Picture8","n.v.") },
Picture8:PictureLast.* { ReadingsVal("ESPCamMotion","Picture7","n.v.") },
Picture7:PictureLast.* { ReadingsVal("ESPCamMotion","Picture6","n.v.") },
Picture6:PictureLast.* { ReadingsVal("ESPCamMotion","Picture5","n.v.") },
Picture5:PictureLast.* { ReadingsVal("ESPCamMotion","Picture4","n.v.") },
Picture4:PictureLast.* { ReadingsVal("ESPCamMotion","Picture3","n.v.") },
Picture3:PictureLast.* { ReadingsVal("ESPCamMotion","Picture2","n.v.") },
Picture2:PictureLast.* { ReadingsVal("ESPCamMotion","Picture1","n.v.") },
Picture1:PictureLast.* { ReadingsVal("ESPCamMotion","PictureLast","n.v.") },

Video9:VideoLast.* { ReadingsVal("ESPCamMotion","Video8","n.v.") },
Video8:VideoLast.* { ReadingsVal("ESPCamMotion","Video7","n.v.") },
Video7:VideoLast.* { ReadingsVal("ESPCamMotion","Video6","n.v.") },
Video6:VideoLast.* { ReadingsVal("ESPCamMotion","Video5","n.v.") },
Video5:VideoLast.* { ReadingsVal("ESPCamMotion","Video4","n.v.") },
Video4:VideoLast.* { ReadingsVal("ESPCamMotion","Video3","n.v.") },
Video3:VideoLast.* { ReadingsVal("ESPCamMotion","Video2","n.v.") },
Video2:VideoLast.* { ReadingsVal("ESPCamMotion","Video1","n.v.") },
Video1:VideoLast.* { ReadingsVal("ESPCamMotion","VideoLast","n.v.") },
 

(warum ein setreading innerhalb des gleichen Gerätes sich aufhängt, würde mit trotzdem interessieren, da der Trigger ja eindeutig auf ein anderes reading zeigt)

CoolTux

PERL WARNING: Deep recursion on subroutine "main::CommandSetReading" at fhem.pl line 1247.
2020.04.19 10:15:40.979 3: eval: { fhem('setreading ' . $NAME . ' test blab')}


Deswegen
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Jamo

Das gleiche passiert übrigends auch bei einem setreading commando im stateformat, das führt ebenso zu einer deep recursion...
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

amenomade

stateformat soll den Status des Devices formattieren. In stateformat ein anderes Reading zu setzen hat keinen Sinn.
Genauso is ein userReading da, um genau dieses userReading mit dem kalkulierten Wert zu aktualisieren, nicht um irgendwas anderes zu setzen.

Beide Sachen führen zur "deep recursion", weil setreading ein Event generiert, das die Kalkulation der userReadings oder des Status wieder anstosst.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Jamo

Im Stateformat kann man ja auch Berechnungen mit readings durchführen, e.g. differenzbildung. In einem Versuch hatte ich mal probiert, einen zwischenwert in einem reading zu speichern (um den zwischenwert zur kontrolle als reading sichtbar zu haben), was ebenfalls zu besagter deep recursion führte. Plus event-on-change-reading um ein Event im State durch den Zwischenwert auszuschliessen.

Wir müssen jetzt nicht darüber diskutieren dass das nicht sinnvoll ist, ich habe nur gesagt dass das auch zu einer deep recursion führt.
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence