FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: ThoTo am 14 März 2018, 20:06:29

Titel: PERL WARNING: Deep recursion on subroutine ...
Beitrag von: ThoTo am 14 März 2018, 20:06:29
Hallo zusammen!

Mein FHEM hat sich heute Nacht verabschiedet bzw. wurde durch mein Watchdog-Script beendet, Logmeldungen wie folgt:
2018.03.14 03:52:07 1: PERL WARNING: Deep recursion on subroutine "main::CallFn" at fhem.pl line 1759.
2018.03.14 03:52:07 3: eval: {
  fhem("set $name getIP");
}
2018.03.14 03:52:08 1: PERL WARNING: Deep recursion on subroutine "main::readingsSingleUpdate" at ./FHEM/10_MQTT_DEVICE.pm line 115.
2018.03.14 03:52:08 3: eval: {
  fhem("set $name getIP");
}
2018.03.14 03:52:08 1: PERL WARNING: Deep recursion on subroutine "main::readingsEndUpdate" at fhem.pl line 4620.
2018.03.14 03:52:08 3: eval: {
  fhem("set $name getIP");
}
2018.03.14 03:52:08 1: PERL WARNING: Deep recursion on subroutine "main::fhem" at (eval 1549533) line 2.
2018.03.14 03:52:08 3: eval: {
  fhem("set $name getIP");
}
2018.03.14 03:52:08 1: PERL WARNING: Deep recursion on subroutine "main::AnalyzeCommandChain" at fhem.pl line 3568.
2018.03.14 03:52:08 3: eval: {
  fhem("set $name getIP");
}
2018.03.14 03:52:08 1: PERL WARNING: Deep recursion on subroutine "main::AnalyzeCommand" at fhem.pl line 1026.
2018.03.14 03:52:08 3: eval: {
  fhem("set $name getIP");
}
2018.03.14 03:52:08 1: PERL WARNING: Deep recursion on subroutine "main::CommandSet" at fhem.pl line 1173.
2018.03.14 03:52:08 3: eval: {
  fhem("set $name getIP");
}
2018.03.14 03:52:08 1: PERL WARNING: Deep recursion on subroutine "main::DoSet" at fhem.pl line 1792.
2018.03.14 03:52:08 3: eval: {
  fhem("set $name getIP");
}
2018.03.14 03:52:08 1: PERL WARNING: Deep recursion on subroutine "MQTT::DEVICE::Set" at fhem.pl line 3523.
2018.03.14 03:52:08 3: eval: {
  fhem("set $name getIP");
}
2018.03.14 04:05:33 1: telnetPort: Can't open server port at 7072: Address already in use. Exiting.
2018.03.14 04:08:05 1: telnetPort: Can't open server port at 7072: Address already in use. Exiting.
2018.03.14 06:46:07 3: telnetPort: port 7072 opened


Zur gleichen Zeit beendete sich die Testinstanz, es dürfte nach den Fehlern aus der Hauptinstanz wohl mit dem Speicher eng geworden sein.
2018.03.14 04:07:18 1: Cannot fork: Cannot allocate memory
2018.03.14 04:07:18 1: Cannot fork: Cannot allocate memory



fhem("set $name getIP"); kommt von meinen MQTT-Devices, damit aktualisiere ich ein Reading mit der IP-Adresse, List wie folgt:
Internals:
   CFGFN     
   IODev      MQTTBroker
   NAME       GARA.SONF.Deckenleuchte
   NR         237
   STATE      off
   TYPE       MQTT_DEVICE
   qos        *:1
   retain     *:1
   READINGS:
     2018-02-25 16:39:03   IPAddress       192.168.1.2
     2018-02-25 16:39:01   getIP           
     2018-03-14 19:58:50   presence        Online
     2018-03-14 11:29:15   result          {"POWER":"off"}
     2018-03-14 11:29:15   result_POWER    off
     2018-03-14 11:29:15   state           off
     2018-03-14 19:56:38   tele            {"Time":"2018-03-14T19:56:38", "Uptime":481, "Vcc":3.143, "POWER":"off", "Wifi":{"AP":1, "SSId":"WiFi", "RSSI":34, "APMac":"00:00:00:00:00:00"}}
     2018-03-14 19:56:38   tele_POWER      off
     2018-03-14 19:56:38   tele_Time       2018-03-14T19:56:38
     2018-03-14 19:56:38   tele_Uptime     481
     2018-03-14 19:56:38   tele_Vcc        3.143
     2018-03-14 19:56:38   tele_Wifi_AP    1
     2018-03-14 19:56:38   tele_Wifi_APMac 00:00:00:00:00:00
     2018-03-14 19:56:38   tele_Wifi_RSSI  34
     2018-03-14 19:56:38   tele_Wifi_SSId  WiFi
     2018-03-14 19:58:50   transmission-state incoming publish received
   message_ids:
   publishSets:
     :
       topic      cmnd/Sonoff-000000/POWER
       values:
         on
         off
     getIP:
       topic      cmnd/Sonoff-000000/IPAddress1
       values:
         noArg
   sets:
     getIP      noArg
     off       
     on         
   subscribe:
     tele/Sonoff-000000/LWT
     stat/Sonoff-000000/RESULT
     stat/Sonoff-000000/POWER
     tele/Sonoff-000000/STATE
   subscribeExpr:
     ^tele\/Sonoff-000000\/LWT$
     ^stat\/Sonoff-000000\/RESULT$
     ^stat\/Sonoff-000000\/POWER$
     ^tele\/Sonoff-000000\/STATE$
   subscribeReadings:
     stat/Sonoff-000000/POWER:
       cmd       
       name       state
     stat/Sonoff-000000/RESULT:
       cmd       
       name       result
     tele/Sonoff-000000/LWT:
       cmd       
       name       presence
     tele/Sonoff-000000/STATE:
       cmd       
       name       tele
Attributes:
   IODev      MQTTBroker
   alias      Deckenleuchte Garage
   event-on-change-reading .*
   group      Beleuchtung
   icon       light_ceiling_light
   publishSet on off cmnd/Sonoff-000000/POWER
   publishSet_getIP noArg cmnd/Sonoff-000000/IPAddress1
   qos        at-least-once
   retain     1
   room       Haus
   stateFormat {ReadingsVal($name, "presence", "") eq "Offline" ? "Offline" : ReadingsVal($name, "state", "")}
   subscribeReading_presence tele/Sonoff-000000/LWT
   subscribeReading_result stat/Sonoff-000000/RESULT
   subscribeReading_state stat/Sonoff-000000/POWER
   subscribeReading_tele tele/Sonoff-000000/STATE
   useSetExtensions 1
   userReadings IPAddress:result_IPAddress1.* {
  my $devIP = ReadingsVal($name,'result_IPAddress1','(0.0.0.0)');
  fhem("deletereading $name result_IPAddress1");
  if ($devIP =~ m/\(((?:\d{1,3}\.){3}\d{1,3})\)/) {
    return $1;
  } else {
    return $devIP;
  }
},
getIP:presence.*?Online  {
  fhem("set $name getIP");
}
   webCmd     toggle:on:off


Wo liegt das Problem bzw. wie kann ich es lösen?
Die Konfiguration in dieser Form hat sich in den letzten Tagen/Wochen nicht geändert, ich hatte den Absturz zum ersten Mal.

LG Thomas
Titel: Antw:PERL WARNING: Deep recursion on subroutine ...
Beitrag von: nils_ am 15 März 2018, 08:37:05
Zitat von: ThoTo am 14 März 2018, 20:06:29
Zur gleichen Zeit beendete sich die Testinstanz, es dürfte nach den Fehlern aus der Hauptinstanz wohl mit dem Speicher eng geworden sein.
2018.03.14 04:07:18 1: Cannot fork: Cannot allocate memory
2018.03.14 04:07:18 1: Cannot fork: Cannot allocate memory

mmh ursache oder folge davon....?
lies doch mal hier mit: https://forum.fhem.de/index.php/topic,84372.0.html
Titel: Antw:PERL WARNING: Deep recursion on subroutine ...
Beitrag von: Thorsten Pferdekaemper am 15 März 2018, 12:25:23
Hi,
hast Du da ein UserReading, welches "set $name getIP" macht? Wenn ich das richtig sehe: Ändert getIP etwas am Device? Falls ja, dann wird dadurch ja wieder das UserReading aufgerufen. Das ergibt dann eine unendliche Rekursion.
Gruß,
   Thorsten
Titel: Antw:PERL WARNING: Deep recursion on subroutine ...
Beitrag von: ThoTo am 16 März 2018, 19:57:47
Zitat von: Thorsten Pferdekaemper am 15 März 2018, 12:25:23
Hi,
hast Du da ein UserReading, welches "set $name getIP" macht? Wenn ich das richtig sehe: Ändert getIP etwas am Device? Falls ja, dann wird dadurch ja wieder das UserReading aufgerufen. Das ergibt dann eine unendliche Rekursion.
Gruß,
   Thorsten

Hi Thorsten,

ja genau so ist es.

getIP erzeugt/ändert das Reading result_IPAddress1.
Das Triggern von getIP gehört in ein sauberes Notify, ich habs im Userreading, das ist falsch.

Trotzdem lese ich mal im von nils_ angesprochen Thread mit, hatt den Fehler ja zum ersten Mal und in Kombination mit einem Problem  auf der Testinstanz.

Danke & LG
Thomas