Doorberry-SIP Sprechanlage HowTo PiFace Teil 2

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Michael Rene Maurer
    LoxBus Spammer
    • 25.08.2015
    • 220

    Doorberry-SIP Sprechanlage HowTo PiFace Teil 2

    DoorBerry PiFace Version

    Hallo,

    habe nun endlich Zeit gehabt, die sip.py umzuschreiben für PiFace. Somit werden beim Drücken der Tasten nicht andauernd Befehle an die Lox gesendet. Leider habe ich keine Lox zum Testen, aber laut Netzwerk sniffer sollte es hinhauen. Einfach die sip.py austauschen.
    1. Button ist Licht
    2. Button ist Klingel
    4. Button beendet den Service.

    Zusätzlich kann am Anfang des Files der Loxserver, Logfile und UDP Port geändert werden. Also vorher checken ob alles richtig eingestellt ist.

    Viel Spass, damit...

    Edit:

    Habe auch die sip_intercom UDP Eingänge als extra python file für PiFace geändert (alte: sip_intercom_GPIO_17). Dh. Loxone schickt über UDP Port 7005 den Befehl "ein" und das LED 4 + Relay 1 schalten sich beim Raspi ein und bei "off" aus. Somit kann zum Beispiel Lichter/Öffner usw. über Raspi und Loxgesteuert werden. Das ganze sollte dann natürlich als Startscript ausgeführt werden. Also wer sich spielen will hat damit schon eine gute Ausgangsbasis. Viel Spass



    Angehängte Dateien Angehängte Dateien

    sip.zip
    sip_intercom_piface.zip
    LG MRM
  • ToB204
    Smart Home'r
    • 27.08.2015
    • 54

    #2
    Hallo Michael,
    erst einmal danke ! Hat gleich auf Anhieb funktioniert! Nur brauche ich für meine Klingelanlage 3 Klingeltaster und 1 Lichttaster. Das heißt ich muss Dein "Service beenden Butten" rauswerfen. Brauch ich dehn überhaupt? Wenn ja, vielleicht kann man irgendwie den Butten anderst umsetzen. Wäre für Tipps dankbar!

    Kommentar


    • Michael Rene Maurer
      Michael Rene Maurer kommentierte
      Kommentar bearbeiten
      Hi,... Ich habe den beenden Button belassen, dieser ist tief in der Prog verankert!, das heißt, wenn du diesen löscht dann funktioniert es nicht mehr!!!
      Nachdem du ja ein Piface hast, hast du ja auch 8 'Ein und Ausgänge' welche du beschalten kannst! Auch ich habe sie erweitert! Postkasterl usw...
  • ToB204
    Smart Home'r
    • 27.08.2015
    • 54

    #3
    Hallo, als Erstes möchte ich euch allen, noch ein gutes neues Jahr wünschen!

    Hab mir in letzter Zeit, mal die Piface sip.py vorgenommen und auf meine Bedürfnisse angepasst.
    Ich möchte mir ein Fingerprint mit in meine Klingelanlage integrieren, mich stört aber das rote blinken vom Fingerprint beim warten auf den Finger. Daher würde ich gerne, mit dem Lichttaster (also Taster 4) bei langem tasten druck mein Script ausführen und bei normalem drücken den udp Befehl senden. Ich bin leider ein totaler Anfänger im Programmieren mit Python und bekomme es einfach nicht zum laufen. Aber vielleicht hat ja jemand von euch Profis Lust mal über mein sip.py zu schauen .
    Code:
    #!/usr/bin/python
    
    # Module:      SIP Intercom Piface Version
    # Version:     1.1
    #
    # Author:      Christoph Vorhauer v1.1
    # Date:        2014-09-05
    # Description: SIP Intercom on RPI using PIFace and PJSIP to communicate with Loxone miniserver's
    #          
    # Copyright:   Copyright (C) 2014 Christoph Vorhauer [EMAIL_REMOVED]
    #
    # Credits:     PJSIP/PJSUA:
    #              Inspired by the call.py sample of the PSJIP distribution, http://www.pjsip.org
    #
    #              Raspberry Pi as Intercom:
    #              Inspired by the door-berry project from Marco Pozzato, http://marpoz.blogspot.de
    #              and https://github.com/mpodroid/door-berry.
    #
    #              Raspberry Pi to Loxone:
    #              Inspired by SIP Intercom project from Michael Maurer <michael.rene.maurer@gmail.com>
    
    import pjsua as pj
    from time import sleep
    import RPi.GPIO as GPIO
    import pifacedigitalio
    import threading
    import socket
    import atexit
    import logging
    import time
    
    # global variables
    lib = None
    acc = None
    transport = None
    pfd = None
    listener = None
    outSocket = None
    current_call = None
    
    LOG_LEVEL = 3
    LOG_FILE = "/home/pi/sip_intercom/sip.log"
    LOX_UDP_OUT_PORT=7003 # port for outgoing commands
    LOX_SERVER="192.168.2.4" # ip address of loxone server
    
    global n
    n = 5
    global count
    count = 0
    
    # Logging callback
    def log_cb(level, str, len):
        logging.debug(str)
    
    # Callback to receive events from account
    class SipAccountCallback(pj.AccountCallback):
    
        def __init__(self, account=None):
            pj.AccountCallback.__init__(self, account)
    
        # Notification on incoming call
        def on_incoming_call(self, call):
            global current_call
            if current_call:
                call.answer(486, "Busy")
                return
    
            print "Incoming call from ", call.info().remote_uri
            current_call = call
    
            call_cb = SipCallCallback(current_call)
            current_call.set_callback(call_cb)
            current_call.answer(200)
    
    
    # Callback to receive events from Call
    class SipCallCallback(pj.CallCallback):
    
        def __init__(self, call=None):
            pj.CallCallback.__init__(self, call)
    
        # Notification when call state has changed
        def on_state(self):
            global current_call
            print "Call with", self.call.info().remote_uri,
            print "is", self.call.info().state_text,
            print "last code =", self.call.info().last_code,
            print "(" + self.call.info().last_reason + ")"
    
            if self.call.info().state == pj.CallState.DISCONNECTED:
                current_call = None
                print 'Current call is', current_call
    
        # Notification when call's media state has changed.
        def on_media_state(self):
            if self.call.info().media_state == pj.MediaState.ACTIVE:
                # Connect the call to sound device
                call_slot = self.call.info().conf_slot
                pj.Lib.instance().conf_connect(call_slot, 0)
                pj.Lib.instance().conf_connect(0, call_slot)
                print "Media is now active"
            else:
                print "Media is inactive"
    
    
    # SIP Intercom listener class
    class SipIntercom:
    
        # Constructor
        def __init__(self):
            # Initialize logging
            logging.basicConfig(filename=LOG_FILE, level=logging.INFO, format='%(asctime)s %(levelname)s %(threadName)-10s %(message)s')
            logging.debug("initialized!")
    
        # Actions for Button listener
        def btn_action(tmp, event):
            global outSocket
            try:
                # activate socket
                s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
                if (event.pin_num == 0):
                    s.sendto("? #10 ?", (LOX_SERVER, LOX_UDP_OUT_PORT))
                    logging.debug("Klingeltaste 1")
                elif (event.pin_num == 1):
                    if not (current_call):
                        s.sendto("? #20 ?", (LOX_SERVER, LOX_UDP_OUT_PORT))
                        logging.debug("Klingeltaste 2")
                elif (event.pin_num == 2):
                    s.sendto("? #30 ?", (LOX_SERVER, LOX_UDP_OUT_PORT))
                    logging.debug("Klingeltaste 3")
                if (event.pin_num == 4):
                    for count in range(0,n):
                    count = count + 1
                    time.sleep(1)
                    if (count <= 3 and event.pin_num == 4):
                        s.sendto("? #40 ?", (LOX_SERVER, LOX_UDP_OUT_PORT))
                        logging.debug("Lichttaste 1 kurz")
                        break
                    if (count >= 4 and event.pin_num == 4):
                        execfile("/home/pi/example_loxone.py")
                        logging.debug("Lichttaste 1 lang")
                        break
                count = 0
    
    
            except pj.Error, e:
                logging.error("Exception: " + str(e))
    
        # Run SIP client and react to GPIO inputs by sending UDP telegrams
        def run(self):
            # Globals
            global lib
            global transport
            global acc
            global pfd
            global listener
    
            # Create library instance
            lib = pj.Lib()
    
            try:
                # Init library with default config and some customized logging config.
                lib.init(log_cfg=pj.LogConfig(level=LOG_LEVEL, callback=log_cb))
    
                # Create UDP transport which listens port 5060
                transport = lib.create_transport(pj.TransportType.UDP, pj.TransportConfig(5060))
                #print "\nListening on", transport.info().host,
                #print "port", transport.info().port, "\n"
    
                # Start the library
                lib.start()
    
                # Create local account
                acc = lib.create_account_for_transport(transport, cb=SipAccountCallback())
    
                # Local SIP information
                my_sip_uri = "sip:" + transport.info().host + ":" + str(transport.info().port)
    
                # init piface
                pifacedigitalio.init()
                pfd = pifacedigitalio.PiFaceDigital()
                # turn on led to show that system is running
                pfd.leds[7].turn_on()
    
                # init button listener for udp transfers
                listener = pifacedigitalio.InputEventListener(chip=pfd)
                listener.register(0, pifacedigitalio.IODIR_RISING_EDGE, self.btn_action)
                listener.register(1, pifacedigitalio.IODIR_RISING_EDGE, self.btn_action)
                listener.register(2, pifacedigitalio.IODIR_RISING_EDGE, self.btn_action)
                listener.register(4, pifacedigitalio.IODIR_RISING_EDGE, self.btn_action)
                listener.activate()
    
                logging.info("SIP Intercom started!")
                logging.info("SIP address: " + my_sip_uri)
                logging.debug("pjsua started")
    
                # Menu loop
                while True:
                    # This button quits the loop and exits the SIP listener
                    if (pfd.input_pins[3].value == 1):
                        break
                    sleep(10)
    
                # Cleanup resources before leaving the function
                shutdown()
            except pj.Error, e:
                logging.error("Exception: " + str(e))
                lib.destroy()
                lib = None
    
    
    # Cleanup resources on service shutdown
    def shutdown():
        # Globals
        global lib
        global transport
        global acc
        global pfd
        global listener
        global outSocket
    
        try:
            logging.debug("start destruction...")
    
            if (pfd):
                pfd.leds[7].turn_off()
            pifacedigitalio.deinit()
            if (listener):
                listener.deactivate()
            if (outSocket):
                outSocket.close()
            listener = None
            outSocket = None
            # PJSIP
            transport = None
            if (acc):
                acc.delete()
            acc = None
            if (lib):
                lib.destroy()
            lib = None
    
            logging.info("SIP Intercom terminated!")
            logging.debug("destroyed")
        except pj.Error, e:
            logging.error("Exception: " + str(e))
            lib.destroy()
            lib = None
    
    
    atexit.register(shutdown)
    .
    Zuletzt geändert von zeki; 09.01.2020, 17:55.

    Kommentar

    • Gast

      #4
      Marked !!

      Kommentar

      Lädt...