(gelöst) DOIF in Zusammenhang mit Perl-Funktion aus 99_myUtils.pm

Begonnen von experimentator, 25 Januar 2016, 19:42:30

Vorheriges Thema - Nächstes Thema

experimentator

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!

Ellert

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.

experimentator

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!