SHC reagiert beschleunigt auf Zustandsänderung von Eingängen

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • SHC reagiert beschleunigt auf Zustandsänderung von Eingängen

      Eine Verbesserung, welche ich seit mehreren Tagen in Verbindung mit dem SHC am laufen habe, möchte ich kurz vorstellen. Einige kennen bestimmt die Problematik, dass der SHC mittels Scheduler periodisch die Eingänge auf Zustandsänderungen abfragt (Pooling). Hinzu kommt, umso mehr Eingänge abgefragt werden, umso träger wird das System.

      Wenn aber die Eingänge mit dem Interrupt Verfahren in einem Python Script erkannt werden, gibt es da quasi kein delay. Damit kann dann auf der Basis von:
      php index.php app=shc -sw id=59 --onein Schaltelement im SHC geschaltet werden.

      In meinem Fall frage ich ein paar Türkontakte, die Klingel und mehrere PIR Sensoren ab. Das Problem ist, wenn jemand schnell die Tür öffnet und schließt, bekommt der SHC dies nicht mit. Oder nur kurz klingelt, ist es ebenso. Oder ein PIR, welches auch ein Verschicken des Bildes auslöst, sehe ich oft die Person nicht mehr, da sie zwischenzeitlich aus dem Bild verschwunden ist.

      Um dieses Mango zu umgehen, aber dennoch alle Features des SHC zu nutzen habe ich zur Erfassung des Ereignisses ein kleines Python Script geschrieben, welches per Interrupt getriggert wird.
      Also fast Realtime und nicht erst nach mehreren Sekunden.

      Jetzt habe ich den SHC Master auf einem Pi laufen, aber alle Actoren, Eingänge, Sensoren etc. sind auf verschiedene (5) Slave's verteilt. Wenn man sich besser mit Python etc. auskennt, kann man es sicher einfacher bewerkstelligen, ich zeige hier wie es für mich machbar war und es funktioniert.

      Ein Python Script läuft auf einem Slave und überwacht einen Eingang. Z.B. die Klingel. Parallel zur Klingel kann über einen Brückengleichrichter (4 Dioden als Brücke) plus Elko ein Relais angeschlossen werden, welches den Eingang des Pi's triggert. Wie beim Taster: 10 Kiloohm von 3,3 Volt zur GPIO. Der Kontakt des Relais muss dann die GPIO auf GND ziehen.

      Das Python Script z.B. klingel.py erkennt eine Zustandsänderung am GPIO xy. Dadurch wird als subprocess ein weiteres script z.B. remotesshklingel.sh aufgerufen, ebenfalls auf dem Slave. Aus diesem Script wird mittels sshpass ein Script auf dem Master (phpklingel.sh) aufgerufen um den Befehl an den SHC zugübergeben. Dieses Script schickt dann den Befehl an den SHC um einen countdown zu starten. Dieser countdown löst zum einen eine Aussen-Klingel im Garten aus und sendet mir mittels Pushingbox ein Bild der Haustür auf das Iphone. Wie das funktioniert hatte ich hier im Forum bereits einmal beschrieben.

      Wenn jetzt jemand den Klingelknopf auch nur eine zehntel Sekunde drückt, wird das erkannt und in Bruchteilen von Sekunden schaltet der SHC die Aussenklingel für 20 Sekunden ein und verschickt das Bild. Nachricht und Bild sind etwa 2 Sekunden auf dem Phone.

      Python Script klinel.py Zeile 17 GPIO eintragen im BCM Code.

      Python Source Code

      1. #!/usr/bin/python
      2. # -*- coding: utf-8 -*-
      3. import time, signal, os, glob
      4. import RPi.GPIO as GPIO
      5. import subprocess
      6. def interrupt_event(pin):
      7. zeit = time.strftime('%d.%m.%Y %H:%M:%S')
      8. print '{} -> GPIO {} ausgeloest! Klingel detected'.format(zeit, pin)
      9. #Aufruf Script()
      10. subprocess.call(['./remotesshklingel.sh'])
      11. if __name__ == '__main__':
      12. try:
      13. GPIO.setmode(GPIO.BCM)
      14. GPIO.setup(26, GPIO.IN)
      15. GPIO.add_event_detect(26, GPIO.FALLING, callback=interrupt_event, bouncetime=300)
      16. #keep script running
      17. signal.pause()
      18. except (KeyboardInterrupt, SystemExit):
      19. print 'Quit'
      20. GPIO.cleanup()
      Display All


      Wenn das Script zum Testen in der Konsole gestartet wird, bekommt man für jeden Event einen Zeitstempel. Später sollte man das Script mittels cronjob beimreboot automatisch starten.

      remoteklingel.sh

      Ip vom Master eintragen

      Shell-Script

      1. #!/bin/bash
      2. sshpass -p password ssh pi@192.168.200.115 phpklingel.sh
      phpklingel.sh auf SHC Master unter /usr/bin einsetzen.

      Um die id des Schaltelementes zu erfahren:

      pi@SHCMasterFlur:/var/www/shc $ php index.php app=shc -sw -l

      Shell-Script

      1. #!/bin/bash
      2. cd /var/www/shc
      3. php index.php app=shc -sw id=59 --on
      Insgesamt werden als 3 Scripts benötigt. 2 auf dem Slave und eines auf dem Master. Alle Scripts müssen ausführbar sein und sich im Ordner /usr/bin befinden. Wenn die Eingänge nicht auf einem Slave, sondern auf dem Master sind, kann man sich den Umweg über sshpass sparen. Es gibt wohl auch Möglichkeiten sshpass oder ähnliches in das Python- Interrupt Script einzubinden, dies erschien mir aber zu kompliziert. Ich wollte auf die schnelle eine funktionierende Lösung. Analog habe ich das auch für die Alarmkontakte der Türen und dem PIR gemacht.
      Da der Eingang des Pi's für den Interrupt sehr sensibel ist, sollte das Relais der Klingel nahe dem Pi angebracht werden und ein 100nF Kondensator möglichst nahe der GPIO gegen GND geschaltet werden, da sonst das Kabel als Antenne wirkt und störimpulse einfängt. In der phpklingel.sh wird als id=xy die id des zu schalteten Schaltelements im SHC angegeben.
      SHC Master B2+ WLAN sowie 1 Slave B2+, 2 Slave B+ und 2 Slave Raspi B. 5x Pi Cam; Imac mit OSX El Capitan; Iphone 6 plus; Ipad mini; Lenovo Android Tablet.

      The post was edited 1 time, last by rmjspa ().