FHEM Forum

FHEM => Sonstiges => Thema gestartet von: JoeALLb am 17 April 2018, 16:13:16

Titel: userreading: Deep recursion, die nicht sein sollte?!?
Beitrag von: JoeALLb am 17 April 2018, 16:13:16
Hallo,

bekomme bei folgendem Device
define d dummy
attr d oldreadings basicReport
attr d userReadings state-tmp:state-tmp-.* {\
  fhem("setreading $name state-tmpDebug Test");;\
}

und diesem Befehl
setreading d state-tmp-test xx2

diese Fehlermeldung.
PERL WARNING: Deep recursion on subroutine "main::fhem" at (eval 2449) line 2.

Nun verstehe ich diese nicht... Das userreadig sollte aufgerufen werden, aber dann würde ich mir erwarten, dass ein Reading "state-tmpDebug" mit dem Inhalt Test angelegt wird.
Das sollte das userReading eigentlich nicht wieder aufrufen, da das neu zu erstellende Reading ja kein "-" nach dem tmp hat, dies
aber in der userreading-Definition ausgeschlossen ist...
Habe ich einen Denkfehler, oder ist das ein Bug?

sG
Joe
Titel: Antw:userreading: Deep recursion, die nicht sein sollte?!?
Beitrag von: Otto123 am 17 April 2018, 16:21:10
Hallo Joe,

genaugenommen ist das kein Fehler sondern eine Warnung!

Ich würde Namen in FHEM nicht mit einem Buchstaben machen und auch keine Punkte verwenden, aber sicher ist das kein Problem. ;)

So richtig sinnvoll erscheint mir Dein Konstrukt jetzt nicht, vielleicht sieht das perl einfach genauso  :D

Funktioniert es denn ansonsten?

Gruß Otto
Titel: Antw:userreading: Deep recursion, die nicht sein sollte?!?
Beitrag von: JoeALLb am 17 April 2018, 16:57:41
Zitat von: Otto123 am 17 April 2018, 16:21:10
genaugenommen ist das kein Fehler sondern eine Warnung!

Gruß Otto

Hallo Otto,

nunja, FHEM stürtzt dabei ab und reagiert nicht mehr, von daher würde ich es schon als Fehler bezeichnen!
Diesen Fall wie im Beispiel beschrieben sehe ich eben als unlogisch, aber vielleicht gibt es dazu einen Hintergrund?


sG
Joe
Titel: Antw:userreading: Deep recursion, die nicht sein sollte?!?
Beitrag von: Otto123 am 17 April 2018, 17:13:41
Naja dann läuft offenbar doch eine Schleife.

Du setzt in einem userReading ein anderes reading, eventuell verursacht allein das die Schleife, denn dadurch wird der userreading Prozesse wiedergetriggert und stellt eventuell erst danach fest, dass er nicht erzeugen soll, aber da ist die Schleife schon wieder an ihm vorbei gerannt.

Keine Ahnung, da müsste man den Code anschauen ...

Gruß Otto
Titel: Antw:userreading: Deep recursion, die nicht sein sollte?!?
Beitrag von: CoolTux am 17 April 2018, 17:50:13
Du hast das Konzept eines Userreading nicht verstanden. Wenn du setreading verwenden möchtest, warum auch immer, dann nimm ein notify zum triggern.
Titel: Antw:userreading: Deep recursion, die nicht sein sollte?!?
Beitrag von: rudolfkoenig am 17 April 2018, 21:37:54
setreading/userreading/etc operieren auf  $defs{d}{CHANGED}, was eine Liste aller Events ist, die auf einmal ausgeloest wurden, z.Bsp. weil ein Funktelegramm 5 Events generiert. Diese Liste wird erst entfernt, nachdem die Verarbeitung (mit allen notifies, etc) fertig ist.

Wenn man aus einer userreading setreading aufruft, dann wird ein weiteres Event am Ende der Liste angehaengt, und eine (in diesem Fall zusaetzliche) Verarbeitung der Liste angestossen, was zu Endlosrekursion fuehrt.

Ich kann leider nicht verhindern, dass der Benutzer keine Endlosschleife oder -rekursion baut, auch wenn das Groebste an manchen Stellen verhindert wird, wie z.Bsp. trigger aus trigger bei gleichem Geraet.
Titel: Antw:userreading: Deep recursion, die nicht sein sollte?!?
Beitrag von: JoeALLb am 18 April 2018, 07:52:00
Danke Rudi für die ausführliche Erklärung, so versteht man auch, warum das doch eine Rekursion ist... !
ich löse es nun anders!