Verriegelung mehrerer DOIFs: Einschalten von Lampen

Begonnen von FunkOdyssey, 12 November 2019, 21:42:45

Vorheriges Thema - Nächstes Thema

FunkOdyssey

Hallo, ich traue mich kaum zu fragen. Ich mache alles mögliche mit DOIF, aber ich scheitere ständig an diesem einen Problem.

Ich habe eine Lampe, die wie folgt geschaltet werden soll:

(1) Timer/Astro
- Astro oder Zeit => einschalten
- Feste Zeit => ausschalten

(2) otion
- wenn nicht schon eingeschaltet, so bei Bewegung => einschalten
- für x Sekunden und dann wieder ausschalten.

(3) Weiterhin dürfen die Einschaltungen nicht vorgenommen werden, wenn bereits eine manuelle Einschaltung durchgeführt wurde? Schalte ich also manuell auf dim50%, so darf Timer/Astro nicht auf 30% runtergehen und Motion nicht auf 100%.

Optional:
Eigentlich ist es sogar ein wenig komplexer, da bei Bewegung eine vorhandene Beleuchtung heller gedimmt werden soll, aber das lasse ich jetzt erst einmal außen vor.




Code:

Variante (2) habe ich

DOIF
(
([bewegungsmelder:motion] =~ "on"
)
(
set zw_dim_wegbeleuchtung dim 30
)
(
set zw_dim_wegbeleuchtung off
)

attr xyz do resetwait
attr xyz wait 0,180


Variante (1) erwähnt ich jetzt gar nicht. Sind nur Timer, die das Licht auf 100% einschalten. Quasi als Abschreckung.




Mein Problem:

Wenn ich eine Bewegung um 17:00 Uhr feststelle, so wird das Licht eingeschaltet.
Normalerweise wird nach x Sekunden wieder ausgeschaltet.
Wenn in diesem Zeitraum aber der Timer/die Astro-Zeit liegt, dann wird die Einschaltung über diesen Timer wieder beendet.

Das Timer-DOIF weiß nichts vom Motion-DOIF. Und umgekehrt.
Ich habe diverse Zwischenlösung über Dummys und Kreuzabfragen über $cmd == n gemacht. Aber irgendwie komme ich damit auch nicht zum Ziel.




Allgemeine Frage zur Vorgehensweise:

Ihr nutzt doch sicherlich auch für die verschiedenen Events ein eigenes DOIF oder AT, oder?
Ihr habt doch nicht alles in einem DOIF zusammengeschrieben, oder?

Ich stolpere immer wieder über die einfachsten on-for-timer-Gebilde in DOIF. Ganz speziell, wenn die technische Umgebung nicht einheitlich ist: Homematic, Z-Wave, etc.
Man muss die Logik also ins DOIF packen und ich kann kein Peering nehmen.

Wie macht ihr das?
Über unzählige Sicherheitsabfragen in allen DOIFs?

amenomade

Warum packst Du nicht alles in eindem einzigen DOIF? So könntest Du alle Abhängigkeiten vorsehen.

Ansonsten ja im TimerDOIF mit [?MotionDOIF] eq "cmdnn" eine Abhängigkeit kreieren
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

FunkOdyssey

Zitat von: amenomade am 12 November 2019, 22:28:07
Warum packst Du nicht alles in eindem einzigen DOIF? So könntest Du alle Abhängigkeiten vorsehen.

Das sind teilweise ziemlich viele DOIFs mit starken Abhängigkeiten zu verschiedenen Triggern.
Wenn ich mal ein wenig mehr Zeit habe, kann ich das noch einmal versuchen.


Zitat von: amenomade am 12 November 2019, 22:28:07
Ansonsten ja im TimerDOIF mit [?MotionDOIF] eq "cmdnn" eine Abhängigkeit kreieren

So mache ich das derzeit. Ich muss nur immer aufpassen, dass sich die cmd_nr ändert, wenn ich einen weiteren Vergleich aufnehmen. So muss ich anschließend alle davon abhängigen DOIFs anpassen. Ich hatte hier schon mehrfach Probleme gehabt. Darum nutze ich hierfür lieber einen Dummy. Programmiertechnisch unelegant, aber übersichtlicher. Außerdem lasse ich mir den Dummy dann über readingsHistory anzeigen.

Danke.

Thyraz

Man kann den Zweigen im Doif glaub auch Namen geben
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

FunkOdyssey

Oh ja. Altes Feature, bei mir aber nie genutzt.
Das Attribut: cmdState

Danke