DoorPa

Aus FHEMWiki
Wechseln zu: Navigation, Suche

WORK IN PROGRESS


DoorPa
Zweck / Funktion
Das Modul erlaubt die Verwendung eines Raspberry Pi als IP-Türsprechstelle
Allgemein
Typ Hilfsmodul
Details
Dokumentation EN / DE
Support (Forum) Automatisierung
Modulname 70_DoorPa.pm
Ersteller Prof. Dr. Peter A. Henning
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!

Auf dieser Seite wird beschrieben, wie man man auf Basis eines Raspberry Pi eine IP-Türsprechstelle baut und in FHEM integriert. Diese ist ein vollwertiger Ersatz für das ältere Projekt DoorPi und FHEM, da dessen Kernsoftware DoorPi nicht mehr weiterentwickelt wird. Das neue Projekt läuft auf derselben Hardware wie das ältere Projekt, ebenso auf der als DoorPiBoard bezeichneten kompakten Platine.

Weitere Bestandteile des Gesamtsystems sind ein Garagentoröffner und eine Hoftür mit selbstverriegelndem Panikschloss. Zur Beschreibung der beiden letztgenannten Teilprojekte verweise ich auf das Buch Smart Home Hacks.

Doorpi all s.png

Funktion

Doorpi block.pngDoorpi completes.pngDoorpi completeb.png

Hardware

Randbedingung des Projektes DoorPa ist, dass es auf derselben Hardware wie DoorPi laufen soll.

Arbeitsaufwand und Kosten

Raspberry Pi

Verwendet wird

  • ein Raspberry Pi 3, der ein integriertes WLAN-Modul besitzt. Falls man seiner eigenen WLAN-Bandbreite nicht traut: Für ca. 25 € bekommt man einen Satz Powerline-Adapter, mit denen man eine sehr stabile Verbindung zwischen dem Raspberry Pi (Innenwand neben der Tür) und dem Rest des Hauses aufbauen kann.
  • eine Zusatzkarte mit jeweils mindestens 8 digitalen Ein- und Ausgängen. Ursprünglich wurde hier das Raspberry Pi-Erweiterungsmodul PiFace 2 verwendet, das neue System lässt sich aber mit ganz unterschiedlicher Hardware aufbauen. Einzige Anforderung an diese Hardware ist, dass beim Betätigen eines der Eingänge (= Verbindung mit GND) in FHEM ein Befehl
set <DoorPa-Device> call key<Pin-Nummer>

ausgeführt wird

PiFace 2

Auf dem Raspberry Pi läuft ein Mini-Programm pifint.py als Schleife und löst einen FHEM-Befehl aus, sobald einer der digitalen Eingänge des PiFace 2 betätigt wird. Damit das Programm beim Systemstart automatisch gestartet wird, muss in die Datei rc.local des Raspberry Pi die Zeile

 python3 <Pfad zum Programm>/pifint.py -[i <IP-Addresse des FHEM-Servers>] -d <DoorPa-Device> [-k <Prfäfix des Events>]&

eingetragen werden. Die IP-Adresse kann entfallen, wenn es sich um denselben Raspberry Pi handelt, der Defaultwert für den Präfix lautet key. Beispielsweise kann dieser Aufruf lauten

 python3 /opt/fhem/pifint.py -d <DoorPa-Device>

Der Quellcode ist dem nachstehenden Listing zu entnehmen.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
########################################################################################
#
# PIFACE event handler pifint.py 
#
# Prof. Dr. Peter A. Henning, 2019
# 
# $Id: pifint.py 2019-06 - pahenning $
#
########################################################################################

import sys, getopt
import pifacedigitalio
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError

ip = '127.0.0.1:8083'
device = ''
key = 'key'

def call_fhem(event):
    url = "http://" + ip + "/fhem?XHR=1&cmd=set%20" + device + "%20call%20" + key + str(event.pin_num)
	#if "@" in url:
    #    nurl = urlparse.urlsplit(url)
    #    username = nurl.username
    #    password = nurl.password
    #    url = url.replace(username + ':' + password + '@', '')
    url = url.replace(" ", "%20")
    try:
       response = urlopen(url)
    except HTTPError as e:
       # do something
       print('Error code: ', e.code)
    except URLError as e:
       # do something
       print('Reason: ', e.reason)
    else:
       # do something
       html = response.read()
    return False
    return False

def main(argv):
   global device
   try:
      opts, args = getopt.getopt(argv,"hi:d:k:",["ip=","device=","key="])
   except getopt.GetoptError:
      print('pifint.py -i <ip-address> -d <device> -k <key>')
      sys.exit(2)
   for opt, arg in opts:
      if opt == '-h':
         print('pifint.py -i <ip-address> -d <device> -k <key>')
         sys.exit()
      elif opt in ("-i", "--ip"):
         ip = arg
      elif opt in ("-d", "--device"):
         device = arg
      elif opt in ("-k", "--key"):
         key = arg
    
   pifacedigital = pifacedigitalio.PiFaceDigital()
   listener = pifacedigitalio.InputEventListener(chip=pifacedigital)
   listener.register(0, pifacedigitalio.IODIR_FALLING_EDGE, call_fhem)
   listener.register(1, pifacedigitalio.IODIR_FALLING_EDGE, call_fhem)
   listener.register(2, pifacedigitalio.IODIR_FALLING_EDGE, call_fhem)
   listener.register(3, pifacedigitalio.IODIR_FALLING_EDGE, call_fhem)
   listener.register(4, pifacedigitalio.IODIR_FALLING_EDGE, call_fhem)
   listener.register(5, pifacedigitalio.IODIR_FALLING_EDGE, call_fhem)
   listener.register(6, pifacedigitalio.IODIR_FALLING_EDGE, call_fhem)
   listener.register(7, pifacedigitalio.IODIR_FALLING_EDGE, call_fhem)
   listener.activate()
   
if __name__ == "__main__":
   main(sys.argv[1:])

GPIO-Pins des Raspberry Pi

Von der Verwendung der GPIO-Pins des Raspberry Pi rate ich eher ab, da diese über keinen integrierten Schutz verfügen. Fehlerströme und Spannungsspitzen können deshalb gleich die gesamte Hardware lahmlegen.

Software

Die Software besteht aus verschiedenen Bestandteilen

  • Event-Handler für die verwendete I/O-Hardware (z.B. PiFace 2), dieser wird in im Abschnitt [Hardware] beschrieben.
  • Auf dem Nextion-Display sind so genannte Seiten mit Bildern, Texten und aktiven Elementen (Widgets) gespeichert, diese werden mit dem zugehörigen Nextion-Editor des Herstellers erzeugt und entweder über serielle Schnittstelle oder über eine Micro-SD-Karte auf das Nextion übertragen.
  • Auf dem Arduino läuft ein kleines Programm in einer Endlosschleife. Es führt die Abfrage des iButton-Lesers durch und steuert den Seitenwechel des Nextion-Displays, verarbeitet auch dessen Bedienvorgänge. Das Programm (Sketch in der Arduino-Terminologie) wird mit Hife der Arduino-Entwicklungsumgebung übersetzt und auf diesen übertragen.
  • Auf dem Raspberry Pi muss eine aktuelle Version von FHEM laufen.

Nextion-Subsystem

Siehe [Nextion-Subsystem von DoorPi und FHEM]

Arduino

Siehe [Arduino bei DoorPi und FHEM]

FHEM

Aufseiten von FHEM müssen die Perl-Module JSON und Test::JSON installiert werden. Ferner muss die Datei 70_DoorPa.pm ggf. noch in das Hauptverzeichnis von FHEM geschoben werden. Eine beispielhafte Konfiguration in FHEM lautet dann:

define DoorStation DoorPa local

wenn die Hardware für die IP-Türsprechstelle direkt an diese FHEM-Instanz angekoppelt ist (also FHEM direkt auf dem DoorPa-Raspberry läuft), oder

define DoorStation DoorPa <IP-Adresse des DoorPa-FHEM>

Klingelknöpfe

DoorPa kann mit einer beliebig großen Anzahl von Klingelknöpfen und zugeordneten Ziel-Telefonnummern arbeiten. Damit diese Zuordnung erkannt wird, muss für jeden Klingelknopf als Attributblock des DoorPa-Devices gesetzt werden

attr DoorStation ringkey<Nummer des Buttons> <Präfix><Nummer des I/O-Kanals>
attr DoorStation ringbutton<Nummer des Buttons> <Name des Buttons, z.B. einfach "Klingel">
attr DoorStation ringtarget<Nummer des Buttons> <Telefonnummer>
attr DoorStation ringcmd<Nummer des Buttons> <zusätzlich auszuführendes FHEM-Kommando>

Wenn beispielsweise beim Betätigen des Klingelknopfes "Klingel" durch den Event-Handler der I/O-Hardware an FHEM der Befehl set DoorStation call key0 abgesendet wird, nach Empfang dieses Befehls von DoorPa die Telefonnummer 123456 angerufen sowie das FHEM-Kommando {`mpg123 -q /opt/fhem/sounds/klangschale.mp3`} ausgeführt werden soll, muss dieser Attributblock lauten

 
attr DoorStation ringkey0 key0
attr DoorStation ringbutton0 Klingel
attr DoorStation ringtarget0 123456
attr DoorStation ringcmd0 {`mpg123 -q /opt/fhem/sounds/klangschale.mp3`}

Türen

Gegenwärtig ist DoorPa so gebaut, dass es nur eine Tür bedienen kann. Dafür müssen verschiedene Attribute gesetzt werden

attr DoorStation doorbutton <Name der Tür, z.B. einfach "Tür">
attr DoorStation doorlockcmd <FHEM-Kommando zum Abschließen der Tür>
attr DoorStation doorunlockcmd <FHEM-Kommando zum Aufschließen der Tür>
attr DoorStation dooropendelay <Zeitverzögerung in Sekunden zwischen Aufschließen und Türöffnung>
attr DoorStation dooropenoncmd <FHEM-Kommando für das Einschalten des Türöffners>
attr DoorStation dooropenduration <Zeitdauer in Sekunden für die Türöffnung>
attr DoorStation dooropenoffcmd <FHEM-Kommando für das Ausschalten des Türöffners>

Ferner kann DoorPa zwei verschiedene Kommandos vom Arduino empfangen, nämlich

  • softlock, wenn durch Antippen des Nextion-Displays ein kompletter Abschließvorgang gestartet werden soll, sowie
  • doorunlockandopen, wenn von dem Arduino ein gültiger iButton sowie eine gültige Pin erkannt worden ist.

Beide Kommandos werden in der Form set DoorStation call <key> empfangen. Zur Erkennung muss gesetzt werden

attr DoorPa doorsoftlockkey <key>
attr DoorPa doorunlockandopenkey <key>