userreading: Deep recursion, die nicht sein sollte?!?

Begonnen von JoeALLb, 17 April 2018, 16:13:16

Vorheriges Thema - Nächstes Thema

JoeALLb

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
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

JoeALLb

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
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

CoolTux

Du hast das Konzept eines Userreading nicht verstanden. Wenn du setreading verwenden möchtest, warum auch immer, dann nimm ein notify zum triggern.
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

rudolfkoenig

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.

JoeALLb

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!
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270