(Gelöst]Runaway Multiline-Fehler

Begonnen von cwagner, 17 Dezember 2019, 23:35:31

Vorheriges Thema - Nächstes Thema

cwagner

Wegen des ewigen Speicherschwundes, der durch DOIF-Updates so eingedämmt wurde, dass mein Hausserver immerhin 7 Tage durchhält, ehe  "Cannot fork: Cannot allocate memory" habe ich nun über Perlbrew mal Perl 5.30.1 probeweise im Einsatz. Bei einem einzigen meiner vielen DOIFS kommt ein neuer Fehler, der noch unter 5.24.1 niemals auftrat:

2019.12.17 23:23:54 1: PERL WARNING: Bareword found where operator expected at (eval 35222) line 2, near "'error Undefined subroutine &main::DOIF_FUNC_DI_Brenner_temp called at (eval 30695) line 1.
in style: ::DOIF_FUNC_DI_Brenner_temp(::ReadingValDoIf($hash,'T_RL_Anhebung"
  (Might be a runaway multi-line '' string starting on line 1)


Die dazugehörige Definition ist:
Internals:
   .AttrList  disable:0,1 loglevel:0,1,2,3,4,5,6 notexist checkReadingEvent:0,1 addStateEvent:1,0 weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading
   DEF        {
if ([Vorlauf:state:d]>=39.7 and [T_Heizung:temperature:d]<[?Vorlauf:state:d] and [?T_RL_Anhebung:temperature:d]<[?Vorlauf:state:d])
{fhem_set("Switch_Heizkeller:FILTER=Brenner=OFF output Brenner ON");set_State ("feuert")} ## Brenner starten
elsif ([T_Heizung:temperature:d]>[?Vorlauf:state:d]+20)
{fhem_set ("Switch_Heizkeller:FILTER=Brenner=ON output Brenner OFF");set_State ("aus")} ## Brenner stoppen
}
   FUUID      5d754630-f33f-e1df-af0c-d9aa685b6efd1e02
   MODEL      Perl
   NAME       DI_Brenner
   NOTIFYDEV  T_Galerie_Fussboden,DI_FBH_Betrieb,RR_Galerie,T_Warmwasser,global,T_Heizung,Vorlauf,T_RL_Anhebung,T_Ruecklauf,SW_02_WW_Pumpe,SW_01_RL_Anhebung,SW_04_FBH_Pumpe,Switch_Heizkeller,SW_03_Heizpumpe,T_Vorlauf
   NR         215
   NTFY_ORDER 50-DI_Brenner
   STATE      aus
   TYPE       DOIF
   VERSION    20744 2019-12-14 10:26:26
   .attraggr:
   .attrminint:
   READINGS:
     2019-12-17 23:32:06   Device          T_Heizung
     2019-12-17 23:32:06   block_01        executed
     2019-12-17 23:32:06   e_T_Heizung_temperature 39.3125
     2019-12-17 22:22:22   e_Vorlauf_state 39.6
     2019-12-17 22:17:40   mode            enabled
     2019-12-17 21:53:39   state           aus
   Regex:
     accu:
     cond:
       T_Heizung:
         0:
           temperature ^T_Heizung$:^temperature:
       Vorlauf:
         0:
           state      ^Vorlauf$:^state:
     uiTable:
       DI_FBH_Betrieb:
         DI_Brenner_uiTable_c_1_6_0_0:
           &STATE     ^DI_FBH_Betrieb$
       RR_Galerie:
         DI_Brenner_uiTable_c_1_7_0_0:
           &STATE     ^RR_Galerie$
       SW_01_RL_Anhebung:
         DI_Brenner_uiTable_c_1_4_0_0:
           &STATE     ^SW_01_RL_Anhebung$
       SW_02_WW_Pumpe:
         DI_Brenner_uiTable_c_1_5_0_0:
           &STATE     ^SW_02_WW_Pumpe$
       SW_03_Heizpumpe:
         DI_Brenner_uiTable_c_1_2_0_0:
           &STATE     ^SW_03_Heizpumpe$
       SW_04_FBH_Pumpe:
         DI_Brenner_uiTable_c_1_8_0_0:
           &STATE     ^SW_04_FBH_Pumpe$
       Switch_Heizkeller:
         DI_Brenner_uiTable_c_1_0_0_0:
           Brenner    ^Switch_Heizkeller$:^Brenner:
       T_Galerie_Fussboden:
         DI_Brenner_uiTable_c_1_7_1_0:
           temperature ^T_Galerie_Fussboden$:^temperature:
       T_Heizung:
         DI_Brenner_uiTable_c_1_1_0_0:
           temperature ^T_Heizung$:^temperature:
       T_RL_Anhebung:
         DI_Brenner_uiTable_c_1_4_0_1:
           temperature ^T_RL_Anhebung$:^temperature:
       T_Ruecklauf:
         DI_Brenner_uiTable_c_1_3_1_0:
           temperature ^T_Ruecklauf$:^temperature:
       T_Vorlauf:
         DI_Brenner_uiTable_c_1_3_0_0:
           temperature ^T_Vorlauf$:^temperature:
       T_Warmwasser:
         DI_Brenner_uiTable_c_1_5_0_1:
           temperature ^T_Warmwasser$:^temperature:
       Vorlauf:
         DI_Brenner_uiTable_c_1_1_1_0:
           &STATE     ^Vorlauf$
   condition:
     0         
if (::ReadingValDoIf($hash,'Vorlauf','state','','d')>=39.7 and ::ReadingValDoIf($hash,'T_Heizung','temperature','','d')<::ReadingValDoIf($hash,'Vorlauf','state','','d') and ::ReadingValDoIf($hash,'T_RL_Anhebung','temperature','','d')<::ReadingValDoIf($hash,'Vorlauf','state','','d'))
{fhem_set("Switch_Heizkeller:FILTER=Brenner=OFF output Brenner ON");set_State ("feuert")}   elsif (::ReadingValDoIf($hash,'T_Heizung','temperature','','d')>::ReadingValDoIf($hash,'Vorlauf','state','','d')+20)
{fhem_set ("Switch_Heizkeller:FILTER=Brenner=ON output Brenner OFF");set_State ("aus")} 
   helper:
     DEVFILTER  ^global$|^T_Heizung$|^Vorlauf$|^T_Galerie_Fussboden$|^SW_02_WW_Pumpe$|^DI_FBH_Betrieb$|^RR_Galerie$|^SW_04_FBH_Pumpe$|^SW_01_RL_Anhebung$|^T_Warmwasser$|^Switch_Heizkeller$|^SW_03_Heizpumpe$|^T_Ruecklauf$|^T_RL_Anhebung$|^T_Vorlauf$
     NOTIFYDEV  global|T_Heizung|Vorlauf|T_Galerie_Fussboden|SW_02_WW_Pumpe|DI_FBH_Betrieb|RR_Galerie|SW_04_FBH_Pumpe|SW_01_RL_Anhebung|T_Warmwasser|Switch_Heizkeller|SW_03_Heizpumpe|T_Ruecklauf|T_RL_Anhebung|T_Vorlauf
     event      temperature: 39.3125
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev T_Heizung
     triggerEvents:
       temperature: 39.3125
     triggerEventsState:
       temperature: 39.3125
   internals:
   perlblock:
     0         
   readings:
     all         Vorlauf:state T_Heizung:temperature
   trigger:
   uiState:
   uiTable:
     attributesfirst 1
     dev        SW_04_FBH_Pumpe
     package    package DI_Brenner;
     reading    &STATE
     shownodeviceline Aktuell|Ute
     table:
       0:
         0:
           0:
             0          "I----"
         1:
           0:
             0          "Heizung"
         2:
           0:
             0          "-----"
         3:
           0:
             0          "----I"
         4:
           0:
             0          "I- RLA -I"
         5:
           0:
             0          "I- WW -I"
         6:
           0:
             0          "I---"
         7:
           0:
             0          "--FBH"
         8:
           0:
             0          "---I"
       1:
         0:
           0:
             0          package DI_Brenner;::DOIF_Widget($hash,$reg,'DI_Brenner_uiTable_c_1_0_0_0',::ReadingValDoIf($hash,'Switch_Heizkeller','Brenner'),"","iconLabel,ON,sani_boiler_temp\@red",'','Switch_Heizkeller','Brenner')
         1:
           0:
             0          package DI_Brenner;::DOIF_Widget($hash,$reg,'DI_Brenner_uiTable_c_1_1_0_0',::ReadingValDoIf($hash,'T_Heizung','temperature','','d1'),"")
             1          "°"
           1:
             0          package DI_Brenner;::DOIF_Widget($hash,$reg,'DI_Brenner_uiTable_c_1_1_1_0',::InternalDoIf($hash,'Vorlauf','STATE'),"")
             1          "+20 °"
         2:
           0:
             0          package DI_Brenner;::DOIF_Widget($hash,$reg,'DI_Brenner_uiTable_c_1_2_0_0',::InternalDoIf($hash,'SW_03_Heizpumpe','STATE'),"","iconLabel,on,sani_pump\@green",'','SW_03_Heizpumpe','state')
         3:
           0:
             0          package DI_Brenner;::DOIF_Widget($hash,$reg,'DI_Brenner_uiTable_c_1_3_0_0',::ReadingValDoIf($hash,'T_Vorlauf','temperature','','d1'),"")
             1          "°VL"
           1:
             0          package DI_Brenner;::DOIF_Widget($hash,$reg,'DI_Brenner_uiTable_c_1_3_1_0',::ReadingValDoIf($hash,'T_Ruecklauf','temperature','','d1'),"")
             1          "°RL"
         4:
           0:
             0          package DI_Brenner;::DOIF_Widget($hash,$reg,'DI_Brenner_uiTable_c_1_4_0_0',::InternalDoIf($hash,'SW_01_RL_Anhebung','STATE'),"","iconLabel,on,sani_return_temp\@green",'','SW_01_RL_Anhebung','state')
             1          'error Undefined subroutine &main::DOIF_FUNC_DI_Brenner_temp called at (eval 30695) line 1.
in style: ::DOIF_FUNC_DI_Brenner_temp(::ReadingValDoIf($hash,'T_RL_Anhebung','temperature'))'
         5:
           0:
             0          package DI_Brenner;::DOIF_Widget($hash,$reg,'DI_Brenner_uiTable_c_1_5_0_0',::InternalDoIf($hash,'SW_02_WW_Pumpe','STATE'),"","iconLabel,on,sani_water_cold\@red",'','SW_02_WW_Pumpe','state')
             1          'error Undefined subroutine &main::DOIF_FUNC_DI_Brenner_temp called at (eval 30699) line 1.
in style: ::DOIF_FUNC_DI_Brenner_temp(::ReadingValDoIf($hash,'T_Warmwasser','temperature'))'
         6:
           0:
             0          package DI_Brenner;::DOIF_Widget($hash,$reg,'DI_Brenner_uiTable_c_1_6_0_0',::InternalDoIf($hash,'DI_FBH_Betrieb','STATE'),"","iconLabel,deactivated,sani_floor_heating\@grey,on,sani_floor_heating\@green,off,sani_floor_heating\@red",'','DI_FBH_Betrieb','state')
         7:
           0:
             0          package DI_Brenner;::DOIF_Widget($hash,$reg,'DI_Brenner_uiTable_c_1_7_0_0',::InternalDoIf($hash,'RR_Galerie','STATE'),"")
             1          "° Soll"
           1:
             0          package DI_Brenner;::DOIF_Widget($hash,$reg,'DI_Brenner_uiTable_c_1_7_1_0',::ReadingValDoIf($hash,'T_Galerie_Fussboden','temperature','','d1'),"")
             1          "°  Ist"
         8:
           0:
             0          package DI_Brenner;::DOIF_Widget($hash,$reg,'DI_Brenner_uiTable_c_1_8_0_0',::InternalDoIf($hash,'SW_04_FBH_Pumpe','STATE'),"","iconLabel,on,sani_pump\@green",'','SW_04_FBH_Pumpe','state')
     tc:
       0          style='font-weight:normal;font-size:10pt;text-align:center'
       1          style='font-weight:bold;text-align:right'
       2          style='font-weight:normal;font-size:10pt;text-align:center'
       3          style='font-weight:bold;text-align:right'
       4          style='font-weight:normal;font-size:10pt;text-align:center'
       5          style='font-weight:bold;text-align:right'
       6          style='font-weight:normal;font-size:10pt;text-align:center'
       7          style='font-weight:bold;text-align:right'
       8          style='font-weight:normal;font-size:10pt;text-align:center'
     td:
       0:
       1:
     tr:
Attributes:
   DbLogExclude .*
   group      Heizung
   icon       sani_boiler_temp@orange
   room       Aktuell,Heizung,Ute
   uiTable    {
$SHOWNODEVICELINE = "Aktuell|Ute";
$ATTRIBUTESFIRST =  1;
$TC{0..8}= "style='font-weight:normal;font-size:10pt;text-align:center'";
$TC{1,3,5,7}= "style='font-weight:bold;text-align:right'"
}
IMPORT contrib/DOIF/uiTable.tpl
"I----"|"Heizung"|"-----"|"----I"|"I- RLA -I"|"I- WW -I"|"I---"|"--FBH"|"---I"
WID([Switch_Heizkeller:Brenner],"iconLabel,ON,sani_boiler_temp\@red")|[T_Heizung:temperature:d1]."°",[Vorlauf]."+20 °"|
WID([SW_03_Heizpumpe],"iconLabel,on,sani_pump\@green")|[T_Vorlauf:temperature:d1]."°VL",[T_Ruecklauf:temperature:d1]."°RL"|
WID ([SW_01_RL_Anhebung],"iconLabel,on,sani_return_temp\@green").STY([T_RL_Anhebung:temperature:d1]."°RLA",FUNC_temp([T_RL_Anhebung:temperature]))|
WID ([SW_02_WW_Pumpe],"iconLabel,on,sani_water_cold\@red").STY([T_Warmwasser:temperature:d1]."°WW",FUNC_temp([T_Warmwasser:temperature]))|
WID ([DI_FBH_Betrieb],"iconLabel,deactivated,sani_floor_heating\@grey,on,sani_floor_heating\@green,off,sani_floor_heating\@red")|[RR_Galerie]."° Soll",[T_Galerie_Fussboden:temperature:d1]."°  Ist"|
WID([SW_04_FBH_Pumpe],"iconLabel,on,sani_pump\@green")
   verbose    2


In Zeile 1 von Definition und uiTable finde ich nichts, was mich stutzig macht. Und ehe der WAF wegen kalter Bude eisig wird, frage ich doch lieber mal nach...

Edit: Habe nun FUNC_temp durch die  'temp' aus dem "DoIF-Adventskalender" ersetzt und auch bei den Readings konsequent die Nachkommastellen festgelegt.

Danke allen Helfenden!


Herzliche Grüße

Christian

P.S.: In den ersten 3 Tagen Null Speicherleak mit Perl 5.30.1
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

amenomade

Wo ist die sub FUNC_temp definiert?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

cwagner

#2
Zentral im Template. Und sie funktioniert in ungefähr 15 weiteren uiTables auch unauffällig. Aber die Spur ist heiß, es muss an der Definition im attribut uiTable liegen. Wenn ich die rausnehme, ist es gut...
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

Zitat von: cwagner am 18 Dezember 2019, 07:18:54
Zentral im Template. Und sie funktioniert in ungefähr 15 weiteren uiTables auch unauffällig.

Es gibt jetzt offiziell eine uiTable.tpl in contrib, vielleicht wurde deine damit überschrieben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

Ne, leider nicht, hatte ich geguckt. Da sind immer noch meine Funktionen sowie die originalen drin.
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

Zitat von: cwagner am 18 Dezember 2019, 08:26:53
Ne, leider nicht, hatte ich geguckt. Da sind immer noch meine Funktionen sowie die originalen drin.

Es könnte auch an der neuen DOIF-Version liegen.

Offenbar wird ::DOIF_FUNC_DI_Brenner_temp in main-Package gesucht.

Du müsstest im Perlblock das package angeben, wo deine Funktion definiert wurde:

{
package $SELF;
$SHOWNODEVICELINE = "Aktuell|Ute";
$ATTRIBUTESFIRST =  1;
$TC{0..8}= "style='font-weight:normal;font-size:10pt;text-align:center'";
$TC{1,3,5,7}= "style='font-weight:bold;text-align:right'"
}



Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#6
Ich habe noch mal im Programmcode geschaut.

Die FUNC_...-Funktionen werden immer aus dem main-package angezogen. Mit den neuen Möglichkeiten kann man beliebige eigene Funktionen in einem package definieren.  Wenn du deine Funktion FUNC_DI_Brenner_temp, einfach anders bennenst (ohne FUNC am Anfang), z. B. Brenner_temp, dann sollte es gehen. Ansonsten hast du bestimmt schon gesehen, dass inzwischen einige uiTable-Funktionen im DOIF vordefiniert sind: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg

PS: Auch der Import von mehreren Dateien sollte jetzt funktionieren (da war noch ein Fehler drin)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

Zitat von: Damian am 18 Dezember 2019, 09:04:23
{
package $SELF;

Damit behebe ich das Problem nicht - den anderen Hinweisen muss ich noch nachgehen. Vielen Dank bis hierhin auf jeden Fall, Damian.

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB