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.
Du missbrauchst die Funktion für etwas für das sie niemals gedacht war.
Nimm ein Notify
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.
Das
fhem("setreading $NAME Picture1 blabla");
ist nicht Sinnvoll in einem userreadings
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)
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
Das gleiche passiert übrigends auch bei einem setreading commando im stateformat, das führt ebenso zu einer deep recursion...
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.
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.