FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: c2j2 am 24 Dezember 2016, 15:04:57

Titel: Wie? if-Fall mit Wert aus dem State füttern
Beitrag von: c2j2 am 24 Dezember 2016, 15:04:57
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!
Titel: Antw:Wie? if-Fall mit Wert aus dem State füttern
Beitrag von: Ellert am 24 Dezember 2016, 18:34:46
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)
Titel: Antw:Wie? if-Fall mit Wert aus dem State füttern
Beitrag 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.
Titel: Antw:Wie? if-Fall mit Wert aus dem State füttern
Beitrag von: Damian am 25 Dezember 2016, 22:08:41
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()}
Titel: Antw:Wie? if-Fall mit Wert aus dem State füttern
Beitrag von: c2j2 am 26 Dezember 2016, 18:41:45
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?
Titel: Antw:Wie? if-Fall mit Wert aus dem State füttern
Beitrag von: Ellert am 26 Dezember 2016, 18:57:33
"dein_dummy" ersetzt Du durch "Var_Regelungsmodus", also so (sprintf("%02d:00:00",[Var_Regelungsmodus])
Titel: Antw:Wie? if-Fall mit Wert aus dem State füttern
Beitrag von: c2j2 am 26 Dezember 2016, 22:40:53
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()}
Titel: Antw:Wie? if-Fall mit Wert aus dem State füttern
Beitrag von: c2j2 am 26 Dezember 2016, 22:44:16
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 ;)))!!!