Problem: Heizungsregelung, die im Auto-Modus ist, außerdem mehrere Manuell-Modi hat, die (optional) nach einer gewissen Zeit wieder zurückgesetzt werden auf Auto, so dass die Heizung wieder VOR DER Rückkehr rechtzeitig die Wohnung aufwärmen kann:
attr Var_Regelungsmodus setList state:state_auto,state_manual,state_manual_3h,state_manual_6h,state_manual_9h,state_manual_12h
So, und nun würde ich gern die Zahl in dem Dummy-State in das Kommando statt "00:00:10" übernehmen, also "nn:00:00":
defmod di_Var_Regelungsmodus DOIF ([Var_Regelungsmodus:state:d]) (defmod defTempModeChange at +00:00:10 set Var_Regelungsmodus state_auto) DOELSE ();;Heating_Control_SetAllTemps()}
Ich habe aber noch keinen Weg dazu gefunden.
PS: Schönes Weihnachtsfest euch allen!
ZitatIch habe aber noch keinen Weg dazu gefunden.
Dann hast Du wohl die Beschreibung, wie das geht, in der Hilfe zum DOIF übersehen Filtern nach Ausdrücken mit
Ausgabeformatierung (http://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen)
Doch, sonst hätte ich das "[Var_Regelungsmodus:state:d]" so nicht geschrieben, das kommt da ja genau vor. Aber ich bekomme das nicht in das Argument des "then"-Teils.
Zitat von: c2j2 am 25 Dezember 2016, 21:57:41
Doch, sonst hätte ich das "[Var_Regelungsmodus:state:d]" so nicht geschrieben, das kommt da ja genau vor. Aber ich bekomme das nicht in das Argument des "then"-Teils.
Das, was du willst, müsstest du über Regex angeben, das "d" ist nur eine Abkürzung für filtern nach Zahlen. Oder einfach direkt mit sprintf
defmod di_Var_Regelungsmodus DOIF ([Var_Regelungsmodus:state:d]) (defmod defTempModeChange at +{(sprintf("%02d:00:00",[dein_dummy]))} set Var_Regelungsmodus state_auto) DOELSE ();;Heating_Control_SetAllTemps()}
Damian,
sorry, ich blicke es noch nicht. Mein Problem ist, dass in meinem Dummy die Zahl ja "irgendwo" im State ist, also "state_manual_3h" oder "state_manual_6h" etc., und dieses "3" oder "6" der wichtige Parameter ist, der die Stunden bestimmt, wann wieder auf "state_auto" geschaltet werden soll (im "then", wenn im State eine Zahl vorhanden ist, also nicht bei "state_auto" oder "state_manual").
Ich könnte mehrere DOIF machen, aber dazu bin ich erst mal zu (ehr-)geizig mit Code-Zeilen.
Daher filterte ich den State mit "d" auf die enthaltene Zahl, bekomme die so extrahierte Zahl alleine aber nicht in den "then"-Teil rüber.
Stelle ich mich grad so doof an (bin 100%ig in C++, aber Perl... sigh) oder geht das nicht?
"dein_dummy" ersetzt Du durch "Var_Regelungsmodus", also so (sprintf("%02d:00:00",[Var_Regelungsmodus])
Das klingt zwar halbwegs logisch, hatte ich aber probiert und wird leider nicht ersetzt durch die "neue" Formatierung, Fehlermeldung ist:
di_Var_Regelungsmodus: {Log 1,sprintf("***************%02d:00:00",state_manual_3h)}: Bareword "state_manual_3h" not allowed while "strict subs" in use at (eval 974781) line 1.
Test-Code ist:
defmod di_Var_Regelungsmodus DOIF ([Var_Regelungsmodus:state:d]) ({Log 1,sprintf("***************%02d:00:00",[Var_Regelungsmodus])}) DOELSE ();;Heating_Control_SetAllTemps()}
AAAAAHHHHHH!
defmod di_Var_Regelungsmodus DOIF ([Var_Regelungsmodus:state:d]) ({Log 1,sprintf("***************%02d:00:00",[Var_Regelungsmodus:state:d])}) DOELSE ();;Heating_Control_SetAllTemps()}
So geht es ;)
Danke für Deine Hilfe, das hat mich "dran" gehalten ;)))!!!