Ankündigung

Einklappen
Keine Ankündigung bisher.

Logik für Anwesenheitsstatus gesucht

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] Logik für Anwesenheitsstatus gesucht

    Hallo zusammen,

    ich steh' gerade ein bisschen auf dem Schlauch und hoffe auf Denk-Unterstützung...
    Ich würde gerne mit Hilfe meines Riegelkontaktes in der Haustür und dem Bewegungsmelder im Flur meinen An-/Abwesenheitsstatus setzen. Das Problem liegt darin, dass ich unterscheiden muss, ob die Tür von innen oder außen abgeschlossen wird. Ich habe mir das so gedacht:
    • Tür wird zugesperrt, BWM meldet innerhalb 5 Sekunden keine Bewegung: abwesend
    • bei "Tür wird zugesperrt, BWM meldet Bewegung" und "Tür wird aufgesperrt": anwesend

    Getriggert werden soll das Ganze bei einer Änderung des Riegelkontaktes.
    Lässt sich sowas mit einem vorhandenen Plugin (z.B. der Logikprozessor.pl) realisieren? Alternativ zum WG hätte ich ansonsten auch noch smarthome.py zur Verfügung, falls hierfür jemand eine Lösung hätte....

    Danke schonmal und ein schönes Rest-Wochenende
    CU,
    Mathias

    #2
    Da fehlt mindestens noch ein Sensor, sonst gehts nicht. Der Bewegungsmelder sendet nicht jede Sekunde oder bei jeder Bewegung ein Telegramm.
    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    Kommentar


      #3
      Hi,
      Mein Melder ist so eingestellt, dass er die entsprechende GA bis (Nicht-) Bewegung innerhalb von 1sek. aktualisiert. Der sendet also praktisch, sobald ich den Erfassungsbereich betrete bzw. verlasse.

      Gesendet von meinem Amazon Kindle Fire HD mit Tapatalk
      CU,
      Mathias

      Kommentar


        #4
        Hallo gindler,

        oder wenn Du Zugriff auf das Alter der letzten Änderung vom BWM hast:
        • Tür wird zugesperrt, letzte Anwesendheitsmeldung vom BWM ist weniger als n (bspw. 5) Sekunden her: abwesend
        • sonst: anwesend

        Viele Grüße,

        Jan

        Kommentar


          #5
          Welcher Melder ist denn das? Das gibt doch ne Telegrammflut wenn man da durch die Räume läuft ... praktisch ist es aber schon.
          Umgezogen? Ja! ... Fertig? Nein!
          Baustelle 2.0 !

          Kommentar


            #6
            Hi,

            @JuMi:
            das ist ein Merten Argus.
            Ich kann da "Wiederholung bei Bewegung" (oder so ähnlich) und "Wiederholung nach Bewegungsende" einstellen. Den ersten Wert hab ich mal auf 2sek. gesetzt, den 2. auf 1min. Bei letzterem ist es auch so, wie ich es erwartet habe: jede Minute kommte eine "0", wenn sich nix bewegt.
            Die Telegrammflut bei Bewegung hab ich auch erwartet. Allerdings bleibt die aus: ich krieg 1x eine "1", wenn die Bewegung startet und 2sek. nach Bewegungsende 1x eine "0". Bug oder Feature? Egal, aber für meinen Zweck genau richtig so...

            @Jan:
            ich glaub, das haut so nicht hin. Was VOR dem Zusperren war, ist IMO egal. Wichtig ist, ob sich DANACH innerhalb eines Zeitfensters am BWM was tut.
            CU,
            Mathias

            Kommentar


              #7
              Zitat von gindler Beitrag anzeigen
              @Jan:
              ich glaub, das haut so nicht hin. Was VOR dem Zusperren war, ist IMO egal. Wichtig ist, ob sich DANACH innerhalb eines Zeitfensters am BWM was tut.
              Der Trick dabei ist, dass Du es nicht schaffst die Tür von innen Zuzuschließen ohne erst den BWM zu aktivieren und umgekehrt es von draußen nicht schaffst den BWM zu aktivieren vor die Tür geöffnet ist.

              Jan

              Kommentar


                #8
                Tolles Feature, meine ich ernst. Ich dachte er pollt während der Bewegung dann jede Sekunde ne 1.
                Dann sollte das doch lösbar sein, fürs genaue nachdenken fehlt grad die Zeit, aber wieder was gelernt.

                Grüße
                Umgezogen? Ja! ... Fertig? Nein!
                Baustelle 2.0 !

                Kommentar


                  #9
                  Du hast 3 unterschiedliche Zustände:

                  1. Abgeschlossen und abwesend
                  2. Abgeschlossen und anwesend
                  3. Offen und anwesend

                  Eigentlich musst Du nur zwischen 1 und 2 unterscheiden. 3 ergibt sich mit Riegelstellung.

                  Vorgang 1:
                  BWM hat Status 0 und Riegel ändert von ZU > AUF » anwesend
                  Vorgang 2:
                  BWM hat Status 0 und Riegel ändert von AUF > ZU » abwesend
                  Vorgang 3:
                  BWM hat Status 1 und Riegel ändert von AUF > ZU » anwesend
                  Vorgang 4*:
                  Riegel ist AUF » anwesend

                  Passt das ?
                  Umgezogen? Ja! ... Fertig? Nein!
                  Baustelle 2.0 !

                  Kommentar


                    #10
                    Das kann aber nur funktionieren, wenn nur eine Person im Haushalt ist (ohne Ausnahme). Wenn von zweien einer das Haus verlässt, wirds duster im Haus .

                    Kommentar


                      #11
                      Und ich hab mir sooooo viel Mühe gegeben .

                      Naja bei uns hängen iButtons ... Problem gelöst.
                      Umgezogen? Ja! ... Fertig? Nein!
                      Baustelle 2.0 !

                      Kommentar


                        #12
                        Hallo zusammen,

                        @XueSheng:
                        Das ist klar. Es kommt aber glücklicherweise (zumindest bei uns) eher nie vor, dass jemand von außen absperrt, solange noch jemand im Haus ist.

                        @JuMi:
                        Im Prinzip hast du Recht. Zustand 1 kann noch vereinfacht bzw. weggelassen werden, da bei Wechsel von zu->auf der BWM-Wert egal ist, da das Ergebnis dem von Zustand 4 entspricht.
                        Den Gedanken, das nur über den aktuellen Zustand des BWM zu steuern, kam mir auch (dürfte evtl. sogar über die Logik des Binäreingangs, an dem der Riegelkontakt hängt, machbar sein).
                        AAABER: dazu muss die Aktualisierungszeit des BWM ziemlich kurz sein (2-3 Sek.), sonst könnte es passieren, dass dieser noch sagt "anwesend" und ich trotzdem schon draußen bin und zusperre, also Vorgang 3 fälschlicherweise in Kraft tritt. Bei dieser kurzen Zeitspanne kann es aber im anderen Fall passieren, dass ich von innen zusperre, aber da so halbwegs ruhig stehe, dass im Moment des Zusperrens der BWM schon wieder auf 0 ist und somit fälschlicherweise Vorgang 2 ausgelöst wird :-(
                        Deshalb mein ursprünglicher Ansatz, mit Hilfe einer externen Logik zu arbeiten, die den Zeitraum von x Sekunden (5-10) nach Riegeländerung von AUF->ZU überwacht.
                        Ich probier diesen Ansatz trotzdem aus - vielleicht ist die Praxis ja gar nicht so fehleranfällig wie die Theorie
                        CU,
                        Mathias

                        Kommentar


                          #13
                          Ganz doofe Frage: Hast du außen keinen Bewegungsmelder, den du mit in die Logik einbeziehen kannst?

                          Kommentar


                            #14
                            Zitat von guste100 Beitrag anzeigen
                            Ganz doofe Frage: Hast du außen keinen Bewegungsmelder, den du mit in die Logik einbeziehen kannst?
                            Dann wär's ja zu einfach
                            Vielleicht kommt da mal IRGENDWANN einer - dazu muss ich aber erst noch nen Carport bauen, damit ich den sinnvoll platzieren kann.
                            CU,
                            Mathias

                            Kommentar


                              #15
                              Hallo zusammen,

                              nachdem ich kürzlich mal etwas tiefer in die Plugin-Programmierung eingestiegen bin, hab ich es nun selber geschafft, mir ein passendes Plugin zusammenzuschustern. Vielleicht kann ja sonst noch jemand was davon brauchen....
                              Code:
                              #############################################################################
                              # Plugin: status_haustuer.pl
                              # v0.1 20140323
                              # Autor: Mathias Gindler (mathias@gindler.de)
                              # License: GPL (v3)
                              #
                              #############################################################################
                              #
                              # Beschreibung:
                              # Setzen des Abwesenheits-Status anhand des Haustür-Riegelkontaktes
                              # Zur Unterscheidung, ob von innen (anwesend) oder außen (abwesend) abgeschlossen
                              # wird, wird der im Bereich der Tür vorhandene BWM verwendet:
                              # Wird innerhalb einer bestimmten Zeit x nach Verschließen keine Bewegung 
                              # erkannt, wurde die Tür von außen abgeschlossen, ansonsten von innen
                              #
                              #############################################################################
                              #
                              # Änderungshistorie:
                              #
                              #############################################################################
                              #
                              # Offene Punkte:
                              #
                              #############################################################################
                              #
                              # Abhängigkeiten:
                              #
                              #############################################################################
                              #
                              # plugin_info-Werte
                              # - Schliesszeit: Zeitpunkt des Zuschliessens
                              # - Tuerstatus: Tür offen oder zu
                              # - anwesend: anwesend, abwesend, undef (von Verschließen bis Ablauf Zeit x)
                              #
                              #############################################################################
                              
                              use POSIX;
                              use Time::Local;
                              
                              # Konstanten für Aufrufart
                              use constant EVENT_RESTART => 'restart';
                              use constant EVENT_MODIFIED => 'modified';
                              use constant EVENT_BUS => 'bus';
                              use constant EVENT_SOCKET => 'socket';
                              use constant EVENT_CYCLE => 'cycle';
                              
                              use constant ZU => 1;
                              use constant OFFEN => 0;
                              use constant ANWESEND => 1;
                              use constant ABWESEND => 0;
                              
                              
                              my $show_debug = 2;
                              my $debugindex = 1;
                              my $gv_event=undef;
                              
                              my $schliesszeit;
                              my $zeitraum = 5;    # Beobachtungsfenster für Bewegung nach Verschließen
                              my $status_anwesend = $plugin_info{$plugname.'_anwesend'};
                              my $status_tuer =       $plugin_info{$plugname.'_Tuerstatus'};
                              
                              
                              my $ga_tuer = "5/0/1";
                              my $ga_bewegung = "12/0/105";
                              my $ga_anwesend = "0/7/1";
                              
                              
                              plugin_log($plugname, "------------------------------------") if ($show_debug > 5);
                              
                              # Aufruf per Bus-Telegramm
                              $plugin_subscribe{$ga_tuer}{$plugname} = 1;
                              
                              # Aus welchem Grund läuft das Plugin gerade
                              if (!$plugin_initflag) {$gv_event = EVENT_RESTART;} # Restart des daemons / Reboot
                              elsif ($plugin_info{$plugname.'_lastsaved'} > $plugin_info{$plugname.'_last'}) {$gv_event = EVENT_MODIFIED;} # Plugin modifiziert
                              elsif (%msg) {$gv_event = EVENT_BUS;}               # Bustraffic
                              elsif ($fh) {$gv_event = EVENT_SOCKET;}             # Netzwerktraffic
                              else {$gv_event = EVENT_CYCLE;}                     # Zyklus
                              
                              plugin_log($plugname, $debugindex++." (MAIN) Aufrufgrund: $gv_event") if ($show_debug > 5);
                              
                              if ($gv_event eq EVENT_RESTART) {
                                  $plugin_info{$plugname.'_cycle'} = 0;
                              } 
                              elsif ($gv_event eq EVENT_MODIFIED) {
                                  $plugin_info{$plugname.'_cycle'} = 0;
                              }  
                              elsif ($gv_event eq EVENT_SOCKET) {
                              } 
                              elsif ($gv_event eq EVENT_CYCLE) {
                                  plugin_log($plugname, $debugindex++." Anwesenheitsstatus: $status_anwesend") if ($show_debug > 5);
                                  if ($status_anwesend eq undef and $status_tuer == ZU){
                                      if ($plugin_info{$plugname.'_Schliesszeit'} + $zeitraum < time()){
                                          plugin_log($plugname, $debugindex++." (CYCLE) Tür ist zugesperrt, keine Bewegung innerhalb $zeitraum sek.-> Abwesend") if ($show_debug > 1);
                                          $status_anwesend = ABWESEND;
                                          knx_write($ga_anwesend, $status_anwesend);
                                          delete $plugin_subscribe{$ga_bewegung}{$plugname}; # Reaktion auf Bewegung nur, wenn Tür zugesperrt wird
                              
                                          $plugin_info{$plugname.'_cycle'} = 0;
                                      }
                                  }
                              }
                              elsif ($gv_event eq EVENT_BUS) {
                                  if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $ga_tuer) {
                                          $status_tuer = $msg{'value'};
                                      if ($msg{'value'} == ZU){
                                          plugin_log($plugname, $debugindex++." (BUS) Tür wurde zugesperrt") if ($show_debug > 1);
                                          $plugin_info{$plugname.'_Schliesszeit'} = time();
                                          $status_anwesend = undef;
                                          $plugin_info{$plugname.'_cycle'} = $zeitraum;
                                          $plugin_subscribe{$ga_bewegung}{$plugname} = 1;
                                      }
                                      else{
                                          plugin_log($plugname, $debugindex++." (BUS) Tür wurde aufgesperrt -> Anwesend") if ($show_debug > 1);
                                          $status_anwesend = ANWESEND;
                                          knx_write($ga_anwesend, $status_anwesend);
                                      }
                                  } 
                                  elsif (($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $ga_bewegung) and ($plugin_info{$plugname.'_Tuerstatus'} == ZU)){
                                      if ($msg{'value'} == 1){
                                          plugin_log($plugname, $debugindex++." (BUS) Tür ist zugesperrt, Bewegung erkannt -> Anwesend") if ($show_debug > 1);
                                          $status_anwesend = ANWESEND;
                                          knx_write($ga_anwesend, $status_anwesend);
                                      }
                                  
                                  }
                              } 
                              
                              $plugin_info{$plugname.'_anwesend'} = $status_anwesend;
                              plugin_log($plugname, $debugindex++." Anwesend-Status: $status_anwesend") if ($show_debug > 5);
                              $plugin_info{$plugname.'_Tuerstatus'} = $status_tuer;
                              plugin_log($plugname, $debugindex++." Tür-Status: $status_tuer") if ($show_debug > 5);
                              CU,
                              Mathias

                              Kommentar

                              Lädt...
                              X