viele Bedingungen - was tun

Begonnen von matze1999, 27 Dezember 2021, 11:41:03

Vorheriges Thema - Nächstes Thema

matze1999

Hallo,

ich hab mal eine theoretishe Frage:

ich habe einen Entfeuchter für den Hobbyraum laufen, dieser soll Zeit und von mehreren anderen Geräte abhängig aus und wieder an geschaltet werden.
Z.B. an Werktagen von 07.00 - 17.00 und an Wochenenden und in den Ferien von 10.00 - 17:00  Uhr. Weiterhin sollen zwei Presence abgefragt werden und das Gerät davon abhängig aus, und wenn die wieder absent sind eingeschaltet werden. Wochennde steht per $we zur Verfügung, für die Ferien habe ich einen Schalter, die Presence sind auch vorhanden und laufen.

Versucht habe ich das über DOIF mit mäßigem Erfolg.

Wei würde das ein "FHEM-Profi" lösen? Ist DOIF hier das richtige Werkzeug (bei meinen Versuchen, werden zwar alle Bedingungen richtig abgefragt, aber der Entfeuchter schaltet sich regelmäßig ab und wieder an (wenn  ich ein DOELSE Gerät off drin habe) oder bei einer anderen Variante nicht mehr an, wenn eine Bedingung zum Abschalten wieder weg fällt.

Internals:
   DEF        ([08:00-17:00] and !($we) and [UrlauboderFerien] eq "Arbeit" and [MArbeit] eq "absent") (
set MQTT2_DVES_486458_CH2 on)
DOELSEIF  ([10:00-17:00] and ($we or [UrlauboderFerien] eq "Ferien")) (
set MQTT2_DVES_486458_CH2 on)
DOELSEIF (
[08:00-17:00] and ([MArbeit] eq "present" or [MPCLAN] eq "present")) (
set MQTT2_DVES_486458_CH2 off)

   FUUID      61a09b7b-f33f-214e-5263-a6b4d21c256845f3
   MODEL      FHEM
   NAME       EntfeuchterEin
   NOTIFYDEV  MArbeit,global,UrlauboderFerien,MPCLAN
   NR         242
   NTFY_ORDER 50-EntfeuchterEin
   STATE      cmd_3
   TYPE       DOIF
   VERSION    25295 2021-12-04 18:13:39
   READINGS:
     2021-12-27 11:39:25   Device          MArbeit
     2021-12-27 11:39:25   cmd             3
     2021-12-27 11:39:25   cmd_event       MArbeit
     2021-12-27 11:39:25   cmd_nr          3
     2021-12-27 11:39:25   e_MArbeit_STATE present
     2021-12-27 11:39:20   e_MPCLAN_STATE  present
     2021-12-27 09:29:10   mode            enabled
     2021-12-27 11:39:25   state           cmd_3
     2021-12-27 09:29:10   timer_01_c01    28.12.2021 08:00:00
     2021-12-27 09:29:10   timer_02_c01    27.12.2021 17:00:00
     2021-12-27 09:29:10   timer_03_c02    27.12.2021 10:00:00
     2021-12-27 09:29:10   timer_04_c02    27.12.2021 17:00:00
     2021-12-27 09:29:10   timer_05_c03    28.12.2021 08:00:00
     2021-12-27 09:29:10   timer_06_c03    27.12.2021 17:00:00
   Regex:
     accu:
     collect:
     cond:
       MArbeit:
         0:
           &STATE     ^MArbeit$
         1:
         2:
           &STATE     ^MArbeit$
       MPCLAN:
         0:
         1:
         2:
           &STATE     ^MPCLAN$
       UrlauboderFerien:
         0:
           &STATE     ^UrlauboderFerien$
         1:
           &STATE     ^UrlauboderFerien$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::DOIF_time($hash,0,1,$wday,$hms) and !($we) and ::InternalDoIf($hash,'UrlauboderFerien','STATE') eq "Arbeit" and ::InternalDoIf($hash,'MArbeit','STATE') eq "absent"
     1          ::DOIF_time($hash,2,3,$wday,$hms) and ($we or ::InternalDoIf($hash,'UrlauboderFerien','STATE') eq "Ferien")
     2           ::DOIF_time($hash,4,5,$wday,$hms) and (::InternalDoIf($hash,'MArbeit','STATE') eq "present" or ::InternalDoIf($hash,'MPCLAN','STATE') eq "present")
   days:
   do:
     0:
       0           set MQTT2_DVES_486458_CH2 on
     1:
       0           set MQTT2_DVES_486458_CH2 on
     2:
       0           set MQTT2_DVES_486458_CH2 off
     3:
   helper:
     DEVFILTER  ^global$|^UrlauboderFerien$|^MArbeit$|^MPCLAN$
     NOTIFYDEV  global|UrlauboderFerien|MArbeit|MPCLAN
     event      present,presence: present
     globalinit 1
     last_timer 6
     sleeptimer -1
     timerdev   MArbeit
     timerevent present,presence: present
     triggerDev MArbeit
     DOIF_eventa:
       cmd_nr: 3
       cmd: 3
       cmd_event: MArbeit
       cmd_3
     DOIF_eventas:
       cmd_nr: 3
       cmd: 3
       cmd_event: MArbeit
       state: cmd_3
     timerevents:
       present
       presence: present
     timereventsState:
       state: present
       presence: present
     triggerEvents:
       present
       presence: present
     triggerEventsState:
       state: present
       presence: present
   internals:
     all         UrlauboderFerien:STATE MArbeit:STATE MPCLAN:STATE
   interval:
     0          -1
     1          0
     2          -1
     3          2
     4          -1
     5          4
   intervalfunc:
   intervaltimer:
   localtime:
     0          1640674800
     1          1640620800
     2          1640595600
     3          1640620800
     4          1640674800
     5          1640620800
   readings:
   realtime:
     0          08:00:00
     1          17:00:00
     2          10:00:00
     3          17:00:00
     4          08:00:00
     5          17:00:00
   time:
     0          08:00:00
     1          17:00:00
     2          10:00:00
     3          17:00:00
     4          08:00:00
     5          17:00:00
   timeCond:
     0          0
     1          0
     2          1
     3          1
     4          2
     5          2
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   timers:
     0           0  1
     1           2  3
     2           4  5
   trigger:
   triggertime:
     1640620800:
       localtime  1640620800
       hash:
     1640674800:
       localtime  1640674800
       hash:
   uiState:
   uiTable:
Attributes:
   alias      EntfeuchterEin
   do         always
   room       nt+di


matze1999

rabehd

#1
Ich steuere meinen Befeuchter ähnlich und ohne Probleme.
Du triggertst mit allem und nutzt keine Abfragen [?UrlauboderFerien] eq "Ferien".
Da würde ich anfangen.
Hilfreich ist oft ein DOELSE (), denn in welchen Zweig soll erspringen, wenn keiner richtig ist?
Auch funktionierende Lösungen kann man hinterfragen.

Wernieman

Ich mache das mit einem notify und perl if ... ist für mich persönlich übersichtlicher als DOIF
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

matze1999

@Wernieman,

Zitat von: Wernieman am 27 Dezember 2021, 13:41:17
Ich mache das mit einem notify und perl if ... ist für mich persönlich übersichtlicher als DOIF

kann man das irgendwo nachlesen, am Besten mit Beispielen?

matze1999

MadMax-FHEM

#4
Zitat von: matze1999 am 10 Januar 2022, 08:00:48
@Wernieman,

kann man das irgendwo nachlesen, am Besten mit Beispielen?

matze1999

-> https://wiki.fhem.de/wiki/Notify
(etwas weiter unten)

EDIT: bzw. innerhalb von {  } ist ganz normale Perl-Programmierung ;) -> https://wiki.fhem.de/wiki/Klammerebenen
("Zugriff" zurück auf fhem [wie im Wiki auch zu lesen?] -> fhem("hier dann fhem Befehle") / inkl. Abfragen von Readings etc.: ReadingsVal, ReadingsNum, AttrVal, AttrNum, usw.)

Evtl. auslagern in eine myUtils-Sub (übersichtlicher [finde ich])... -> https://wiki.fhem.de/wiki/99_myUtils_anlegen

Leichteres Anlegen von notify (und DOIF und FileLog und...) -> https://wiki.fhem.de/wiki/Event_monitor

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Wernieman

Als Ergänzung:

FHEM ist Ereignisbassiert (sollte so sein), also ist das erste sich zu überlegen, auf was man Trickert. Dann ein perl-if dahinter ...
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Damian

Zitat von: matze1999 am 27 Dezember 2021, 11:41:03
Wei würde das ein "FHEM-Profi" lösen? Ist DOIF hier das richtige Werkzeug (bei meinen Versuchen, werden zwar alle Bedingungen richtig abgefragt, aber der Entfeuchter schaltet sich regelmäßig ab und wieder an (wenn  ich ein DOELSE Gerät off drin habe) oder bei einer anderen Variante nicht mehr an, wenn eine Bedingung zum Abschalten wieder weg fällt.

Du hast hier mehrere Bedingungen, aber in Wirklichkeit nur zwei Fälle. Es reicht, wenn du die beiden Fälle zum Einschalten in eine if-Bedingung mit or zusammenfasst, Ausschalten wäre dann der else-Fall. Diese Aussage gilt unabhängig davon, ob du es mit DOIF oder sonst wie löst.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF