FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: werner-fhem am 13 Februar 2015, 07:13:21

Titel: Gelöst Sunset if-Bedingung GPIO Bewegungsmelder Aussenleuchte schalten
Beitrag von: werner-fhem am 13 Februar 2015, 07:13:21
Ich möchte eine Aussenleuchte einschalten in Abhängigkeit vom Sonnenuntergang und zusätzlich bei einer Bewegungserkennung durch
einen Bewegungsmelder. Die Aussenleuchte und der Bewegungsmelder schalte ich am RPI durch die GPIO's.

Der folgende Code funktioniert nur hier fehlt die IF Abfrage des Bewegungsmelder.

define at_SonnenUnt11 at *{sunset(900)} { fhem ("set GPIO18 on")}

In dem folgenden Code habe ich versucht die IF Abfrage einzubauen nur hier habe ich meine Probleme.

define at_SonnenUnt11 at *{sunset(900)} { fhem ("set GPIO18 on") if (ReadingsVal("GPIOSchalter1", "state", "off") eq "off")}

Der GPIOSchalter1 ist der Bewegungsmelder. Dieser sendet ein state "off" bei Bewegung!

Für Eure Hilfe wäre ich dankbar.

Titel: Antw:Sunset if-Bedingung GPIO Bewegungsmelder Aussenleuchte schalten
Beitrag von: Zrrronggg! am 13 Februar 2015, 13:30:44
Hm. Okay...

ZitatIch möchte eine Aussenleuchte einschalten in Abhängigkeit vom Sonnenuntergang und zusätzlich bei einer Bewegungserkennung durch
einen Bewegungsmelder.

Meint wahrscheinlich mathematisch und, also wenn beides zugleich wahr ist?


define at_SonnenUnt11 at *{sunset(900)} { fhem ("set GPIO18 on") if (ReadingsVal("GPIOSchalter1", "state", "off") eq "off")}

Das bewirkt (abgesehen, dass da meiner Meinung nach Klammerfehler drin sind) von der Logik her folgendes:
Wenn der Zeitpunkt des Sonneuntergangs eintritt , wird(GENAU 1x) geprüft, ob genau in dem Moment Bewegung ist. Wenn ja: Licht an.

Das tritt ...  äh... sicher eher selten ein.
Bei IF oder if muss man sehr sorgfältig überlegen, was die hingeschriebene Bedingungen tatsächlich von der Logik bewirken.

Du müsstest besser prüfen, ob wenn der Bewegungsmelder Bewegung meldet, es nach Sonnuntergang ist.

Ich persönlich würde das mit isday machen, isday hat aber keinen offset.

(genau genommen mache ich das so, das ich die Helligkeitswerte die die meisten IR Melder entweder mitsenden (HM) oder als Schaltbedingung verwenden können (FS20) verwende, ich gehe davon aus, dass dein Bewegungsmelder das nicht kann?)

Ich bin mir nicht sicher, wie man in einer if-bedingung prüfen kann, ob es nach oder vor {sunset(900)} ist.

Bis hier jemand kommt, der das besser weiss als ich, kannst du es so machen:

define Nacht dummy
define at_SonnenUnt11 at *{sunset(900)}  set Nacht dunkel
# morgens mit Sunset Dummy Nacht auf "hell" oder so setzen
define Bewegung_Licht notify GPIOSchalter1:off { if (Value("Nacht") eq "dunkel") { fhem("set GPIO18 on")}}


oder mit isday (das aber genau sunset und sunrise ohne offset verwendet)

... { if (!isday()) { fhem("set...
Titel: Antw:Sunset if-Bedingung GPIO Bewegungsmelder Aussenleuchte schalten
Beitrag von: werner-fhem am 13 Februar 2015, 16:22:40
Vielen Dank Zrrronggg!
Der Code funktioniert (isday habe ich noch nicht probiert).
Nur jetzt schaltet der GPIO nicht mehr aus. Wie ich gelesen habe funktioniert on-for-timer an der GPIO nicht.
on-for-timer funktioniert nur bei spez. Geräten.
Gibt es eine Alternative von on-for-timer. Ich möchte das Licht nach der Bewegungserkennung wieder nach x sec ausschalten.

Vielen Dank
Titel: Antw:Sunset if-Bedingung GPIO Bewegungsmelder Aussenleuchte schalten
Beitrag von: Zrrronggg! am 13 Februar 2015, 18:00:12

define Bewegung_Licht notify GPIOSchalter1:off { if (Value("Nacht") eq "dunkel") { fhem("set GPIO18 on ;; define Licht_aus at +00:00:30 set GPIO18 off")}}

30 Sekunden
Titel: Gelöst :Sunset if-Bedingung GPIO Bewegungsmelder Aussenleuchte schalten
Beitrag von: werner-fhem am 15 Februar 2015, 10:06:50
Vielen Dank für die Unterstützung

Das Problem ist gelöst:

Hier noch als Zusammenfassung den funktionierenden Code:

define Nacht dummy
define at_Sonnenuntergang at *{sunset(0)}  set Nacht dunkel
define at_Sonnenaufgang at *{sunrise(0)}  set Nacht hell

define Bewegung_Licht notify GPIOSchalter1:off { if (Value("Nacht") eq "dunkel") { fhem("set GPIO18 on ;; define Licht_aus at +00:00:05 set GPIO18 off")}}


Erläuterung: mit sunset (Sonnenuntergang) wird Nacht auf dunkel gesetzt.
                     mit sunrise (Sonnenuntergang) wird Nacht auf hell gesetzt.
Der Bewegungsmelder (GPIOSchalter1) schaltet das Licht (GPIO18) nur Nachts (dunkel) für 00:00:05 sec an.

Als Alternative geht auch isday nur hier kann nur genau bei Sonnenaufgang und Sonnenuntergang geschaltet werden ohne Differenz.

define Bewegung_Licht notify GPIOSchalter1:off { if (!isday()) { fhem("set GPIO18 on ;; define Licht_aus at +00:00:05 set GPIO18 off")}}

Als Bewegungsmelder habe ich hier den "Pyroelectrische Infrarot PIR Bewegung Sensor Detektor Modul" im Einsatz.
Die Aussenleuchten werde ich mit ELRO Funksteckdosen schalten.
Dies ist eine sehr Preiswerte Alternative.
Vielen Dank nochmals für die Unterstützung.
Titel: Antw:Gelöst Sunset if-Bedingung GPIO Bewegungsmelder Aussenleuchte schalten
Beitrag von: Zrrronggg! am 16 Februar 2015, 20:01:47
Noch 2 Anmerkungen:

define Nacht dummy
define at_Sonnenuntergang at *{sunset(0)}  set Nacht dunkel
define at_Sonnenaufgang at *{sunrise(0)}  set Nacht hell

In diesem konkreten Fall ist Nacht = !isday weil offset 0

Diese Schaltung hat noch den Nachteil, das eine Bewegung die Einschaltzeit nicht verlängert.

Also

23:00:00 sei Auslösung, das Licht geht an
23:00:04 sei erneut Auslösung, Licht ist bereits an (erzeugt die Fehlermeldung "Licht_aus" allready exists, delete it first, das ist aber nur eine optisches Problem, man kann die Fehlermeldung ignorieren.)

Das Licht geht trotzdem um
23:00:05 aus

Wenn das erwünscht ist, dann ist das so okay.

Wenn erneute Auslösung verlängern soll, muss man z.B.: so formulieren

define Bewegung_Licht notify GPIOSchalter1:off { if (Value("Nacht") eq "dunkel") { fhem("delete Licht_aus ;; set GPIO18 on ;; define Licht_aus at +00:00:05 set GPIO18 off")}}


Dies erzeugt bei erster Auslösung dann die Fehlermeldung "Licht_aus does not exist , define it first"
Das ist aber nur eine optisches Problem, man kann die Fehlermeldung ignorieren.