Wie? if-Fall mit Wert aus dem State füttern

Begonnen von c2j2, 24 Dezember 2016, 15:04:57

Vorheriges Thema - Nächstes Thema

c2j2

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!

Ellert

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

c2j2

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.

Damian

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()}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

c2j2

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?

Ellert

"dein_dummy" ersetzt Du durch "Var_Regelungsmodus", also so (sprintf("%02d:00:00",[Var_Regelungsmodus])

c2j2

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()}

c2j2

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 ;)))!!!