Bewegungsmelder: Status zurücksetzen: Unterschied zwischen den Versionen

Aus FHEMWiki
K (Anpassung an FHEM 5.7)
(Anpassung von <source>-Tags nach <syntaxhighlight>)
 
(4 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Bewegungsmelder, zb. von Homematic, haben den Nachteil, das nach einer erkannten Bewegung zwar das Reading "motion" gesetzt - aber nicht mehr zurückgesetzt wird.
{{Randnotiz|RNText=Für HomeMatic ist dieser Codeschnipsel nicht mehr nötig. In der aktuellen Version des Moduls wird der Status automatisch aut ''noMotion'' zurückgesetzt.}}
Folgender Codeschnipsel behebt das. Das Reading wird auf "scanning" zurückgesetzt und ein Event ausgelöst auf das wiederrum reagiert werden kann.
Manche 'Bewegungsmelder (<strike>z.B. von [[HomeMatic Type motionDetector]]</strike>) haben den Nachteil, dass nach einer erkannten Bewegung zwar das Reading ''motion'' gesetzt, aber nicht mehr zurückgesetzt wird. Der folgende Codeschnipsel behebt das. Das Reading wird auf ''scanning'' zurückgesetzt und ein Event ausgelöst, auf das wiederum reagiert werden kann.


Folgender Code muss in die 99_MyUtils.pm kopiert werden.
Folgender Code muss in die [[99_myUtils anlegen|99_myUtils.pm]] kopiert werden:
sub BM_MotionHandling($$){
<syntaxhighlight lang="perl">
  my($device, $event) = @_;
sub BM_MotionHandling($$) {
  return if($attr{$device}{subType} ne "motionDetector");
    my ( $device, $event ) = @_;
    return if ( $attr{$device}{subType} ne "motionDetector" );
  my $ResetAT = $device."_Reset";
  if($event eq "motion") {
    # Bewegung erkannt, erstelle AT um Status wieder zurückzusetzen
          if (defined($defs{$ResetAT})) {
            fhem "modify ".$ResetAT." +00:05:00 {BM_MotionHandling(\"$device\", \"scanning\")}";
          } else {
          fhem "define ".$ResetAT." at +00:05:00 {BM_MotionHandling(\"$device\", \"scanning\")}";
          }
  } elsif($event eq "scanning") {
    # Status des Devices wieder zurücksetzen
    readingsSingleUpdate($defs{$device}, "state", $event, 1);
  }
}


Anschließend ist einmalig ein Notify zu definieren. Hier wird davon ausgegangen, das alle Bewegungsmelder mit "BM_" beginnen und bei Bewegung ein "motion" gesetzt wird. Andernfalls muss die Regexp angepasst werden.
    my $ResetAT = $device . "_Reset";
define NTFY_Reset_Motion notify (BM_.*:motion*) {BM_MotionHandling("$NAME", "motion")}
    if ( $event eq "motion" ) {
 
        # Bewegung erkannt, erstelle AT um Status wieder zurückzusetzen
        fhem "defmod " . $ResetAT
          . " at +00:05:00 {BM_MotionHandling(\"$device\", \"scanning\")}";
    }
    elsif ( $event eq "scanning" ) {
 
        # Status des Devices wieder zurücksetzen
        readingsSingleUpdate( $defs{$device}, "state", $event, 1 );
    }
}</syntaxhighlight>
 
Anschließend ist einmalig ein [[notify]] zu definieren. In diesem Beispiel wird davon ausgegangen, dass alle Bewegungsmelder mit "BM_" beginnen und bei Bewegung ein Reading mit dem Namen ''motion'' gesetzt wird. Anderenfalls muss die [[Regulärer Ausdruck|Regexp]] angepasst werden.
:<code>define NTFY_Reset_Motion notify (BM_.*:motion*) {BM_MotionHandling("$NAME", "motion")}</code>


[[Kategorie:Code Snippets]]
[[Kategorie:Code Snippets]]

Aktuelle Version vom 26. Juli 2017, 18:56 Uhr

Info green.pngFür HomeMatic ist dieser Codeschnipsel nicht mehr nötig. In der aktuellen Version des Moduls wird der Status automatisch aut noMotion zurückgesetzt.

Manche 'Bewegungsmelder (z.B. von HomeMatic Type motionDetector) haben den Nachteil, dass nach einer erkannten Bewegung zwar das Reading motion gesetzt, aber nicht mehr zurückgesetzt wird. Der folgende Codeschnipsel behebt das. Das Reading wird auf scanning zurückgesetzt und ein Event ausgelöst, auf das wiederum reagiert werden kann.

Folgender Code muss in die 99_myUtils.pm kopiert werden:

sub BM_MotionHandling($$) {
    my ( $device, $event ) = @_;
    return if ( $attr{$device}{subType} ne "motionDetector" );

    my $ResetAT = $device . "_Reset";
    if ( $event eq "motion" ) {

        # Bewegung erkannt, erstelle AT um Status wieder zurückzusetzen
        fhem "defmod " . $ResetAT
          . " at +00:05:00 {BM_MotionHandling(\"$device\", \"scanning\")}";
    }
    elsif ( $event eq "scanning" ) {

        # Status des Devices wieder zurücksetzen
        readingsSingleUpdate( $defs{$device}, "state", $event, 1 );
    }
}

Anschließend ist einmalig ein notify zu definieren. In diesem Beispiel wird davon ausgegangen, dass alle Bewegungsmelder mit "BM_" beginnen und bei Bewegung ein Reading mit dem Namen motion gesetzt wird. Anderenfalls muss die Regexp angepasst werden.

define NTFY_Reset_Motion notify (BM_.*:motion*) {BM_MotionHandling("$NAME", "motion")}