Hauptmenü

[gelöst] DOIF Optimierung

Begonnen von onkel-tobi, 12 November 2016, 09:38:20

Vorheriges Thema - Nächstes Thema

onkel-tobi

Hallo zusammen,

bekomme es irgendwie nicht hin, das optimale DOIF für meine Bedürfnisse zu erstellen.
Die Situation ist folgende:
Ich habe ein Dummy (du_og_fl_p1), über das eine Treppenbeleuchtung geschaltet wird.
Unsere Kinder schlafen im OG und wir im DG, von daher gibt es im OG einen Dummy du_og_rpi, der bei Bewegung auf on geschaltet wird, im DG gibt es einen HM Bewegungssensor, der ebenfalls auf motion reagiert.
Folgendes DOIF funktioniert erst einmal:
define di_og_fl_li DOIF ((([og_wz_motion] eq "motion") or ([du_og_fl_rpi] eq "on")) and ([og_wz_motion:brightness] < 35) and ([du_og_fl_p1] eq "off")) (set du_og_fl_p1 on,define 1min at +00:01:00 set du_og_fl_p1 off)
Was mich allerdings stört ist, dass zum einen versucht wird zu schalten, auch wenn die Steckdose schon an ist und zum anderen der Timer/at gesetzt wird, wenn er schon läuft.

Habe dann etliches probiert, aber irgendwie stehe ich auf dem Schlauch. Kann mir jemand zumindest einen Denkanstoß für ein besseres DOIF geben?

Danke & Gruß,
Tobi

igami

Erstmal vorab

([du_og_fl_rpi] eq "on")

brauchst du nicht zu Klammern, schadet aber auch nicht.

Zitat von: onkel-tobi am 12 November 2016, 09:38:20
Was mich allerdings stört ist, dass zum einen versucht wird zu schalten, auch wenn die Steckdose schon an ist
Dann musst du noch abfragen ob die Lampe schon eingeschaltet ist, bzw. überprüfen warum deine Abfrage nicht funktioniert. Mit einem ? vor der Bedingung wird diese auch nicht als Trigger für das DOIF verwendet (siehe commandref).

Zitat von: onkel-tobi am 12 November 2016, 09:38:20
[...]  und zum anderen der Timer/at gesetzt wird, wenn er schon läuft.
Hier würde ich auch kein at verwenden, sondern das wait attribut von DOIF. Alternativ für das at statt "define" "defmod" verwenden.

Zitat von: onkel-tobi am 12 November 2016, 09:38:20
Habe dann etliches probiert, aber irgendwie stehe ich auf dem Schlauch.
Hier wäre auch schön zu wissen was "etliches" ist.

Weiterhin ist es immer gut auch Zeilenumbrüche und Einrückungen zu verwenden. Bei mir würde das dann so aussehen:

define di_og_fl_li DOIF
((([og_wz_motion] eq "motion") or
  ([du_og_fl_rpi] eq "on")
) and
([og_wz_motion:brightness] < 35) and
([du_og_fl_p1] eq "off")
)(
  set du_og_fl_p1 on,
  define 1min at +00:01:00 set du_og_fl_p1 off
)


Ich würde das DOIF inetwa folgendermaßen aufbauen

define <name> DOIF
(<BewegungsEVENT> and
<sonstiges>
)(
  set <lampe> on
)(
  set <lampe> off
)

attr <name> do always
attr <name> wait 0,60
[code]
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

onkel-tobi

Hi igami,

erst einmal sorry dass ich mich erst jetzt wieder melde und vielen Dank für deinen Vorschlag.
Ich habe es nun folgendermaßen definiert:
define di_og_fl_li DOIF
((([og_wz_motion] eq "motion") or
[du_og_fl_rpi] eq "on")
and [?du_og_fl_p1] eq "off"  and
([og_wz_motion:brightness] < 35)) (
set du_og_fl_p1 on)
(set du_og_fl_p1 off)

attr di_og_fl_li do always
attr di_og_fl_li wait 0,60


Werde das mit den Klammern dann noch mal vereinheitlichen, aber so funktioniert es auf jd. Fall wie es sollte.

Gruß & danke,
Tobi