[gelöst] Zyklisches toggeln alle 30 Sek.

Begonnen von tndx, 11 Juli 2023, 00:12:03

Vorheriges Thema - Nächstes Thema

tndx

Wie bekomme ich möglichst elegant folgende Aufgabe mit DOIF gelöst:

ZitatWenn z.B. bei dem cc1101 A auf der Speicherbank 1 FSK mit einer Datenrate von 8.842 kbps und auf der Speicherbank 2 FSK mit einer Datenrate von 9.579 kbps ist,
kann z.B. mit einem DOIF zwischen den Speicherbänken gewechselt werden indem z.B. die folgenden Befehle abwechselt ausgeführt werden:
get sduino cmdBank A1f
get sduino cmdBank A2f

Erschwerende Bedingung: es soll alle 30 Sekunden ausgeführt werden.

Abfrage auf Sekunden, wie es mit Minuten möglich ist (zu 00. und 30. Minute jeder Stunde) scheint mit Sekunden nicht möglich zu sein. Mit relativen Zeitangaben komme ich bei dem zyklischen Toggeln irgendwie nicht weiter. Mit Bedingungen und temporären Variablen ist es ja nicht mehr "elegant".

Übersehe ich irgenwas, oder ist dieser Use Case tatsächlich noch nicht abgedeckt?

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

tndx

Das hatte ich gestern probiert:
([+30])(get SDuino cmdBank A0f)
([+30])(get SDuino cmdBank A2f)

Das gibt mir FHEM im Event-Monitor aus:
2023-07-11 10:17:50 DOIF di_SDUINO_lc_mode_change cmd_nr: 1
2023-07-11 10:17:50 DOIF di_SDUINO_lc_mode_change cmd_seqnr: 1
2023-07-11 10:17:50 DOIF di_SDUINO_lc_mode_change cmd: 1.1
2023-07-11 10:17:50 DOIF di_SDUINO_lc_mode_change cmd_event: timer_1
2023-07-11 10:17:50 DOIF di_SDUINO_lc_mode_change cmd_1_1
2023-07-11 10:17:50 DOIF di_SDUINO_lc_mode_change cmd_nr: 1
2023-07-11 10:17:50 DOIF di_SDUINO_lc_mode_change cmd_seqnr: 2
2023-07-11 10:17:50 DOIF di_SDUINO_lc_mode_change cmd: 1.2
2023-07-11 10:17:50 DOIF di_SDUINO_lc_mode_change cmd_event: timer_1
2023-07-11 10:17:50 DOIF di_SDUINO_lc_mode_change error: [+30]: Unknown command [+30], try help.
2023-07-11 10:17:50 DOIF di_SDUINO_lc_mode_change cmd_1_2
2023-07-11 10:17:50 DOIF di_SDUINO_lc_mode_change cmd_nr: 1
2023-07-11 10:17:50 DOIF di_SDUINO_lc_mode_change cmd_seqnr: 3
2023-07-11 10:17:50 DOIF di_SDUINO_lc_mode_change cmd: 1.3
2023-07-11 10:17:50 DOIF di_SDUINO_lc_mode_change cmd_event: timer_1
2023-07-11 10:17:50 DOIF di_SDUINO_lc_mode_change cmd_1

Per

Na die Syntax muss schon richtig sein, DOELSEIF z.b. fehlt hier.
Wobei ich nur einen Fall nehmen würde und je nach aktuellem state den jeweils anderen nehmen würde.
Sowas geht super in der Perl Variante. Hier wäre wahrscheinlich DOIF und notify gleichwertig.

Damian

na, dann:

defmod di_cmdBank DOIF {[+30];; if (!defined $_cmd) {fhem"get SDuino cmdBank A0f";;$_cmd=1} else {fhem"get SDuino cmdBank A2f";;delete $_cmd}}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

tndx

OK, danke! Geht also doch nur mit einer Hilfsvariable. Nicht dass ich ein Problem damit habe, aber ich dachte bei der Fülle an Möglichkeiten bzgl. der Zeitsteuerung wird es irgendwas eleganteres/passenderes geben :)

@Per: die Syntax war ja wohl schon richtig, denn die Fehlermeldungen kamen erst zur Laufzeit.

betateilchen

Zitat von: tndx am 11 Juli 2023, 00:12:03Wie bekomme ich möglichst elegant folgende Aufgabe mit DOIF gelöst:

Wenn es nicht unbedingt DOIF sein muss, kann man es wirklich elegant lösen:

defmod test_at at +*00:00:30 {fhem("get sduino cmdBank ".Each($SELF,"A1f,A2f"))}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Damian

Zitat von: tndx am 11 Juli 2023, 17:45:56OK, danke! Geht also doch nur mit einer Hilfsvariable. Nicht dass ich ein Problem damit habe, aber ich dachte bei der Fülle an Möglichkeiten bzgl. der Zeitsteuerung wird es irgendwas eleganteres/passenderes geben :)

Du kannst es auf ohne Hilfsvariablen machen, indem du zwei zeitversetzte Timer setzt:

defmod di_Timer DOIF ([+:01]) (get SDuino cmdBank A0f) DOELSEIF ([([+:01]+30)]) (get SDuino cmdBank A2f)
oder

defmod di_Timer2 DOIF {[+60];;fhem"get SDuino cmdBank A0f";;set_Exec("timer",30,'fhem"get SDuino cmdBank A2f"')}
Das kannst du auch im FHEM-Modus mit wait basteln.

Mit Each geht es im DOIF natürlich auch - wenn man die Doku zu Each gefunden hat. ;)

oder oder oder ...

Was eleganter ist, liegt im Auge des Betrachters ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

tndx

Zitat von: betateilchen am 11 Juli 2023, 17:56:54Wenn es nicht unbedingt DOIF sein muss, kann man es wirklich elegant lösen:

defmod test_at at +*00:00:30 {fhem("get sduino cmdBank ".Each($SELF,"A1f,A2f"))}

Das nenne ich wirklich elegant! :)
Das muss nicht unbedingt DOIF sein, genauso wie ich eine Hilfavariable pragmatischerweise genommen hätte, nehme ich auch AT  ;)

Danke noch mal für eure Unterstützung!

Per

Zitat von: tndx am 11 Juli 2023, 17:45:56@Per: die Syntax war ja wohl schon richtig, denn die Fehlermeldungen kamen erst zur Laufzeit.
Nee, DOIF ist nur so mächtig, dass es auch solche Konstrukte kann, nur müssen sich dann Befehle in den Klammern befinden und keine Abfragen. Der Editor kann das nicht erkennen. Deshalb erst zur Laufzeit.