Hallo zusammen,
ich bin begeistert von den Möglichkeiten, die FHEM bietet! Das Smart Home wächst Stück für Stück und ebenso die Regeln dafür, aber jetzt bin ich an meine Grenzen gekommen.
Mein Wunsch ist eine Steuerung der Beleuchtung des Hauseingangs:
"From dusk till dawn" soll sie per Bewegungsmelder für 3 min angehen, aber nur wenn sie nicht per Schalter schon dauerhaft angeschaltet wurde (dann soll sie auch dauerhaft anbleiben, wenn der Bewegungsmelder auslöst).
Mein Ausgangsaufbau (alle Geräte einzeln kommunizieren über den 433MHz CUL mit FHEM, manchmal ist die Verbindung allerdings etwas schlecht):
- FB_1_A: Knopfpaar auf einer InterTechno-Fernbedienung (für manuelle Schaltung)
- eingang_bewegungsmelder: InterTechno-Bewegungsmelder (für automatische Schaltung, wenn nicht eh schon manuell angeschaltet wurde)
- eingang_strahler: InterTechno-Unterputz-Schalter
Für die sichere Übertragung der IT-Befehle habe ich eine Funktion in 99_myUtils.pm gebaut, welche Befehle mehrfach senden soll:
sub safe_set($$) {
my ($device, $targetstate) = @_;
fhem( "setstate $device $targetstate , sleep 1 , setstate $device $targetstate , sleep 1 , setstate $device $targetstate" );
}
Die Logik für das Schalten habe ich versucht, mit DOIF umzusetzen:
([eingang_bewegungsmelder] eq "on" and [eingang_strahler] eq "off" and [FB_1_A] eq "off" and {!isday("HORIZON=1")})
({safe_set("eingang_strahler", "on")})
(defmod eingang_strahler_bewegungsmelder_aus at +00:03:00 {safe_set("eingang_strahler", "off")})
DOELSEIF ([eingang_bewegungsmelder] eq "on" and [eingang_strahler] eq "on" and [FB_1_A] eq "off" and {!isday("HORIZON=1")})
(defmod eingang_strahler_bewegungsmelder_aus at +00:03:00 {safe_set("eingang_strahler", "off")})
Der erste Block schaltet das Licht ein und setzt einen Ablauftimer, weil eingang_strahler noch nicht an war, die manuelle Schaltung per FB_1_A auch nicht greift und es dunkel ist (!isday("HORIZON=1")).
Der zweite Block muss es nicht anschalten, weil es schon an ist (per Bewegungsmelder, nicht manuell), setzt aber den Ablauftimer neu (ab dem erneuten Auslösen des Bewegungsmelders soll das Licht wieder volle 3 min an sein).
Meine
erste Frage:
Bin ich auf dem richtigen Weg, oder kann man das viel einfacher auf andere Weise lösen?
Meine
zweite Frage, falls dies schonmal die richtige Richtung ist:
Warum wird beim Ausführen der Regel das error-Attribut auf "no right bracket" gesetzt, und warum erscheint im Logfile folgendes:
2016.01.25 19:37:14 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 1858) line 1.
2016.01.25 19:37:14 3: stacktrace:
2016.01.25 19:37:14 3: main::__ANON__ called by (eval 1858) (1)
2016.01.25 19:37:14 3: (eval) called by ./FHEM/98_DOIF.pm (663)
2016.01.25 19:37:14 3: main::DOIF_CheckCond called by ./FHEM/98_DOIF.pm (771)
2016.01.25 19:37:14 3: main::DOIF_Trigger called by ./FHEM/98_DOIF.pm (868)
2016.01.25 19:37:14 3: main::DOIF_Notify called by fhem.pl (3196)
2016.01.25 19:37:14 3: main::CallFn called by fhem.pl (3119)
2016.01.25 19:37:14 3: main::DoTrigger called by fhem.pl (1588)
2016.01.25 19:37:14 3: main::DoSet called by fhem.pl (1609)
2016.01.25 19:37:14 3: main::CommandSet called by fhem.pl (1070)
2016.01.25 19:37:14 3: main::AnalyzeCommand called by ./FHEM/01_FHEMWEB.pm (2170)
2016.01.25 19:37:14 3: main::FW_fC called by ./FHEM/01_FHEMWEB.pm (705)
2016.01.25 19:37:14 3: main::FW_answerCall called by ./FHEM/01_FHEMWEB.pm (440)
2016.01.25 19:37:14 3: main::FW_Read called by fhem.pl (3196)
2016.01.25 19:37:14 3: main::CallFn called by fhem.pl (661)
Ich bin eh nicht so der Perl-Guru, aber das Zusammenspiel zwischem FHEM- und Perl-Kommandos überfordert mich hier offensichtlich. Oder ist mein Fehler in der definierten Funktion in 99_myUtils.pm? Ich weiß nicht mehr weiter und wäre für Hilfe sehr dankbar!
Gruß,
Experimentator
EDIT: Die Lösung ist, das Attribut "ITrepetition" statt der Perl-Funktion zu verwenden!
ZitatBefehle mehrfach senden
Möglicherweise gibt es für den Schalter ein Attribut "ITrepetition"
Zitatfhem( "setstate $device $targetstate , sleep 1 , setstate $device $targetstate , sleep 1 , setstate $device $targetstate" );
Du verwendest einen falschen Befehlstrenner für FHEM-Befehle : http://fhem.de/commandref_DE.html#command es ist nicht das Komma, das gilt nur für DOIF.
ZitatWarum wird beim Ausführen der Regel das error-Attribut auf "no right bracket" gesetzt
Du hast etwas geschrieben, so dass Perl danach eine Klammer erwartet, zum Beispiel ein falsch gesetztes Komma.
ZitatMöglicherweise gibt es für den Schalter ein Attribut "ITrepetition"
Das Attribut hatte ich übersehen. Damit wird die Perl-Funktion überflüssig - um so besser. Weniger Code enthält meist weniger Fehler. :)
Vielen Dank, Ellert!