FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: cwagner am 17 Dezember 2019, 23:35:31

Titel: (Gelöst]Runaway Multiline-Fehler
Beitrag von: cwagner am 17 Dezember 2019, 23:35:31
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
Titel: Antw:Runaway Multiline-Fehler
Beitrag von: amenomade am 17 Dezember 2019, 23:48:59
Wo ist die sub FUNC_temp definiert?
Titel: Antw:Runaway Multiline-Fehler
Beitrag von: cwagner am 18 Dezember 2019, 07:18:54
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...
Titel: Antw:Runaway Multiline-Fehler
Beitrag von: Damian am 18 Dezember 2019, 08:10:18
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.
Titel: Antw:Runaway Multiline-Fehler
Beitrag 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.
Titel: Antw:Runaway Multiline-Fehler
Beitrag von: Damian am 18 Dezember 2019, 09:04:23
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'"
}



Titel: Antw:Runaway Multiline-Fehler
Beitrag von: Damian am 18 Dezember 2019, 11:19:23
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)
Titel: Antw:Runaway Multiline-Fehler
Beitrag von: cwagner am 19 Dezember 2019, 08:08:28
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