[Gelöst] DOIF-Templates Zuordnung der Timer

Begonnen von manne44, 25 November 2023, 17:50:22

Vorheriges Thema - Nächstes Thema

manne44

Hallo, ich habe mal eine dumme Frage zu den DOIF-Templates, die ich gern und reichlich nutze, sie funktionieren auch einwandfrei. Solange kein Fehler in der Definition und das Ding nicht so lang ist, dann ist alles klar.
Nun habe ich aber in einem Template mit 28 Bedingungen (if (bedingung1) or (bedingung2) usw.) und 31 Devices insgesamt 374 Timer. Mir ist nicht klar wo die alle her kommen, aber viel wichtiger ist es, was sie weshalb machen, also welcher Timer steht zu welcher Bedingung. Ich habe einige Fehler wie "error: Wrong timespec : either HH:MM:SS or {perlcode}" bei einigen Timern und möchte gern eine Zuordnung zu den Bedingungen finden, damit ich die Fehler beseitigen kann. Wie kann ich das denn finden?
Vielen Dank.
RPI4-Buster mit SSD, RPI-Zero mit Bookworm

manne44

Etwas habe ich schon herausgefunden: Als ich alle als Kommentar (#) versehene Zeilen entfernt hatte, da waren es nur noch 210 Timer. Offenbar gilt hier das Perl-Kommentarzeichen nicht.
RPI4-Buster mit SSD, RPI-Zero mit Bookworm

Damian

Kommentarzeilen beginnen dort mit ##
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

manne44

Ja, das mit den Kommentaren hatte ich bereits an anderer Stelle mit "##" gemacht, aber leider wieder vergessen.
Eine andere Frage ist die Zuordnung der Timer zu den Bedingungen. Ich wollte mal den großen Wurf wagen und alle Schalter in einem Template einbinden und in verschiedener Weise schalten. Mein Template sieht in etwa so aus:
DEF TPL_SWITCH_ALL ( {
  if (([$1_set:presence] eq "NONE") or
    ([$1_set:presence] eq "PRESENT" and ([HomePresence] eq "present")) or
    ([$1_set:presence] eq "ABSENT" and ([HomePresence] eq "absent"))) {
      if (([$1_set:mode] eq "TIME"  and [[$1_set:time_on]]) or
        ([$1_set:mode] eq "DAY"   and [[sunrise_time]]) or
        ([$1_set:mode] eq "NIGHT" and [[sunset_time]]) or
        ([$1_set:mode] eq "DLDR"  and [[sunrise_time]]) or
        ([$1_set:mode] eq "NLDR"  and [[sunset_time]])) {
          main::SwitchOnOff("$1","ON","A","$2");
      } elsif (([$1_set:mode] eq "TIME" and [[$1_set:time_off]]) or
        ([$1_set:mode] eq "DAY" and  [[$1_set:time_off]]) or
        ([$1_set:mode] eq "NIGHT" and [[$1_set:time_off]]) or
([$1_set:mode] eq "DLDR" and [[sunset_time]]) or
([$1_set:mode] eq "NLDR" and [[sunrise_time]])) {
          main::SwitchOnOff("$1","OFF","A","$2");
      }
    }
})
TPL_SWITCH_ALL(sw1,A)
TPL_SWITCH_ALL(sw2,A)
...
TPL_SWITCH_ALL(sw20,X)
TPL_SWITCH_ALL(sw21,Y)
}

Es werden eine Vielzahl von Timern gebildet, die ich aber nicht so einfach den Bedingungen zuordnen kann. Wie kann ich das denn machen?
Nebenbei, die Zeiten für sunset und sunrise sind deshalb als Zeit vorgegeben, weil ich zu dämlich bin dort die richtige Funktion einzusetzen, ist also ein "workarround".
RPI4-Buster mit SSD, RPI-Zero mit Bookworm

manne44

Also das mit den Timern habe ich selbst herausgefunden, denn man sollte von klein nach groß gehen, denn dann sieht man es deutlich. Wenn es nur wenige Devices gibt, dann gibt es in meinem Fall insgesamt 10 Fälle und für jedes Device und Fall einen Timer. Bei diesen vielen Devices würde dann der "timer_24_c03" der 4. Fall des dritten Device, also "([$1_set:mode] eq "DLDR"  and [[sunrise_time]])" in meinem Beispiel.
Ich hätte mir die Frage aus sparen können, denn erst denken, dann schreiben, das sollte das Motto sein.
Vielen Dank fürs Lesen.
RPI4-Buster mit SSD, RPI-Zero mit Bookworm