Hallo FHEM Freunde,
Ich bin auf der Suche nach einer Anwesenheitserkennung beruhend auf einem Türsensor und einem Bewegungsmelder. Der Grundgedanke dahinter ist, wenn die Tür zu ist, soll eindeutig durch den Bewegungsmelder bestimmt sein, ob sich jemand im Raum befindet oder nicht. Ist die Tür offen soll der Status eines Dummys auf unknown oder so ähnlich gesetzt werden oder, wobei Ich mir nicht sicher bin wie sinnvoll das ist, bei regelmäßgiem Triggern des Bewegungsmelders auf ein Wahrscheinlich ja oder wahrscheinlich nein gesetzt werden ( ist aber in der Praxis wahrscheinlich eher sinnfrei).
Mein Grundgedanke war hier soetwas wie
Fabian.Tuer {
if(Fabian.Tuer eq "closed"){
//1 Sekunde Pause
if(BeWeGu eq "on") {
fhem(set Fabian.Presence 1
} else {
fhem(set Fabian.Presence 0)
}
}
elseif(Fabian.Tuer eq "open{
fhem("set Fabian.Presence unkown")
}
}
Das Problem mit dem Überprüfen des Bewegungsmelders ist, dass dieser eine kurze Zeit braucht, um nach Verlassen und schließen auf off umzuschalten ( ca. 1 Sekunde)
Jetzt bräuchte ich eine Pause funktion. sleep aus Perl möchte ich hier nicht verwenden, da ja dann das gesamte FHEM pausiert wird. Gibt es hier eine Alternative?
Ich hoffe ihr könnt mir weiter helfen, bin ein ziemlicher Anfänger was Perl Programmierung angeht.
#####Lösung#####
define XX DOIF ([Fabian.Tuer] eq "open") (set Fabian.Presence unknown)(del MoveCheck) DOELSE ({MoveCheck("BeWeGu", "Fabian.Presence")})(set Fabian.Presence unknown)(del MoveCheck)
attr XX wait 0,0:1,1,50
99_myUtils.pm
# MoveCheck(Sensor,Statusdummy)
# Überprüft die Anwesenheit im Raum mittels digitalem Firmata Bewegungsmelder
sub MoveCheck($$) {
my ($BeWeGu, $StateDev) = @_;
my ($on) = "on";
my ($one) = "1";
fhem("define MoveCheck DOIF ([$BeWeGu] eq '$on' and [$StateDev] ne '$one') (set $StateDev 1) DOELSEIF([$StateDev] ne '$one')(set $StateDev 0)");
}
Mit Sicherheit gibt es auch hier deutlich schönere Lösungen, aber es funktioniert. Falls doch noch jemand Verbesserungsvorschläge hat nehm ich diese natürlich dankend entgegen.
Beste Grüße
Fabian
Im Grunde dachte ich, dass dieser Code funktionieren sollte, was er aber leider nicht tut.
Fabian.Tuer {
my $door ReadingsVal("Fabian.Tuer","state","open");
if($door eq "open"){
fhem(set Fabian.Presence unknown);
}
else{
sleep 1;
my $move ReadingsVal("BeWeGu","state","off");
if($move eq "off"){
sleep 5;
if($move eq "off"){
fhem(set Fabian.Presence 0);
}
else{
fhem(set Fabian.Presence 1);
}
}
else{
fhem(set Fabian.Presence 1);
}
}
}
Kann mir jemand sagen, warum der Code nicht funktioniert? Außerdem wäre ebenfalls wichtig, ob die Varibalen nur bei der Definition einen Wert zugewiesen bekommen oder ob dieser bei jedem Zugriff neu aus dem jeweiligen Reading ausgelesen wird? Dies müsste sich ja einfach beheben lassen, indem beim Varibalenaufruf jeweils das ReadingsVal argument steht, oder?
Ich freue mich auf Hilfe und Anregungen und hoffe, dass mich dies bei meinen geringen Programmierkenntnissen weiter unterstützt.
Beste Grüße
Fabian
Hallo Fabian,
Fabian.Tuer ist ein notify?
Die Readings werden bei jedem Aufruf gelesen, allerdings denke ich wird Dein notify nur einmal getriggert.
Was liefert den der Bewegungsmelder und wie lange liefert der bei Bewegung ein "on"?
Gruß Otto
Die Zuweisungen der Werte an die Variablen sind schon fehlerhaft.
Wenn das notify wirklich triggern sollte braucht der TE doch nur das einfachste überhaupt zu machen - ins Logfile schauen.