Und-Verknüpfung presence und WeekDayTimer

Begonnen von klfhem, 04 November 2020, 15:55:14

Vorheriges Thema - Nächstes Thema

klfhem

Ich möchte eine Warmwasserzirkulationspumpe (an einem Shelly-Plug) in Abhängigkeit von der Anwesenheit der Familienmitglieder und
der Tageszeit (nachts aus) schalten.
Beides einzeln funktioniert: presence allein schaltet und der WeekDayTimer auch.

Die AND-Verknüpfung beider jedoch nicht.
Hier habe ich schon verschiedene Lösung getestet. Mit notify, mit DOIF, mit DOELSEIF, in fhem und in Perl.
Hat jemand schon mal so eine Verknüpfung gebastelt?

Das geht nicht:

define zirkpumpe DOIF ([da:"state:.present"] and [wwtimer:"currValue:.on"]) (set shelly on)

das auch nicht:

define zirkpumpe notify zirkpumpe:on {if (ReadingsVal("da","state","") eq "present") && (ReadingVal("wwtimer","currValue","") eq "on") (set shelly "on")}

... das kann doch nicht so schwer sein, eine AND-Verknüpfung zu bauen.

Beta-User

Der WDT selbst bietet dazu mehrere Optionen an:
zum einen kann man einen Befehl verzögern, wenn bzw. solange eine Bedingung eingetreten ist (delayedExecutionCond) - darüber kann man neuerdings sogar bestimmen, was der WDT dann in der Zwischenzeit als state haben soll - (es wird aber jede Minute geprüft, ob das noch paßt mit der Verzögerung),
zum zweiten kann man den ganzen WDT über die Angabe einer condition für diesen Tag außer Betrieb nehmen (man kann ggf. "drumrum" was bauen, um ihn neu zu initialisieren), und
zu guter letzt kann man auch einfach im Ausführungsteil etwas Perl reinbasteln, in dem dann geprüft wird, ob der Befehl wirklich ausgeführt werden soll. Wenn nicht, fällt das halt für den Zeitpunkt aus (kann man mit switchInThePast und "enable" auch neu setzen lassen, wenn man das will).

Hier mal ein Beispiel für Perl im Ausführungsteil - gleich mit mehreren Bedingungen und einem "on-for-timer", damit du was zum weiterspielen hast...:
define Timer_Brunnen_Schildkroeten WeekdayTimer Wasser_Schildkroeten 10:45|1800 12:30|1800 14:00|1800 15:30|1800 17:00|1800 19:00|1800 { if (ReadingsNum("Aussentemperatur_Nord", "state", 7) > 8 && ReadingsVal("Heizung_Schildkroeten","state","active") eq "disabled") { fhem ("set $NAME on-for-timer $EVENT")}}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

klfhem

Hallo Beta-User, vielen Dank für die Hinweise. Allerdings verstehe ich den WeekDayTimer wohl noch nicht.
Warum funktioniert das ganz einfache Ding hier nicht?

define wwtimer weekDayTimer shelly 06:00|on 20:30|off if ([da] eq "present") (set shelly "on")

Hab das auch schon in Perl probiert, (wie in deiner {if..}-Version, geht auch nicht.

Beta-User

Zitat von: klfhem am 05 November 2020, 18:57:53
Warum funktioniert das ganz einfache Ding hier nicht?
Weil das eine ganz krude Mischung aus allem Möglichen ist...

Mal angenommen, das soll zur Ausführungszeit geprüft werden (dazu ist keine Info von dir gekommen...), müßte das - erst mal nur in Perl geschrieben, keine set magic u.a. - etwa so klappen:define wwtimer weekDayTimer shelly 06:00|on 20:30|off {if (ReadingsVal("da","state","absent") eq "present") { fhem ("set shelly on")}}
[/code]
Ansonsten bitte immer ein list in Code-Tags liefern. Das hilft v.a. auch dir selbst festzustellen, ob und wie WDT deinen Input "verstanden" hat.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

klfhem

So einfach und "krude" war die Lösung:

define zirkpumpe DOIF ( ([5:45-23:00]) and [da] eq "present")  (set shelly on) DOELSE (set shelly off)

[da] ist eine structure von mehreren Familienangehörigen. Wenn einer "present" ist, geht die structure auf "present".
Dann schaltet die Warmwasser-Zirkulationspumpe ein.
Ausser nachts, da benötigt keiner sofort Warmwasser aus dem Hahn.