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
Wo ist die sub FUNC_temp definiert?
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...
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.
Ne, leider nicht, hatte ich geguckt. Da sind immer noch meine Funktionen sowie die originalen drin.
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'"
}
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)
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