Welche Events verwendet ihr?

  • Hallo zusammen,


    kurz vor dem sonnigen Wochenende, was ich vermutlich durchgehend am Grill verbringen werde anstatt am Computer, noch einen Post zum Thema DoorPi EVents. Welche Ereignisse werden vom DoorPi denn genau unterstützt und welche verwendet man am besten für die weiter unten beschriebenen Aufgaben?


    Aber von vorne. Im Admin Interface bei mir gibt es ja die Liste aller Events Unter anderem steht dort bei mir: "OnKeyUp_onboardpins.133 -> MailtoAction with args () and kwargs {'smtp_text': 'OnKeyPressed', 'smtp_subject':'DoorPi', 'smtp_snapshot': 'True', 'smtp_to': '********'}"


    In dieser Liste sind also alle von mir verwendeten Events, die ich mir in der DoorPi.ini konfiguriert habe.



    Im Web habe ich diese Aufstellung von linphone Events gefunden, wo auch andere Ereigbnisse auftauchen. Lassen sich diese Events auch im DoorPi verwenden?




    OnSipPhoneCreateDas SIP-Phone wurde erstellt und kann gestartet werden.
    OnSipPhoneStartDas SIP-Phone wurde gestartet und ist jetzt einsatzbereit.
    OnSipPhoneDestroyDas SIP-Phone soll beendet werden.
    OnSipPhoneRecorderCreateEs wurde eine Recorder erstellt wurde und bereit ist Anrufe aufzuzeichnen.
    OnSipPhoneRecorderDestroyEs wurde ein Recorder gestoppt und es sind keine weiteren Aufnamen .
    BeforeSipPhoneMakeCallKurz bevor ein Gespräch von DoorPi aus gestartet wird.
    OnSipPhoneMakeCallEs wird ein Gespräch von DoorPi aus gestartet.
    OnSipPhoneMakeCallFailedEs ist ein Fehler aufgetreten, als ein Gespräch von DoorPi aus gestartet werden sollte.
    AfterSipPhoneMakeCallDas Gespräch wurde hergestellt und es klingelt an der Gegenstelle
    OnSipPhoneCallTimeoutNoResponseDas Gespräch wurde beendet, da die Gegenstelle nicht abgenommen hat (Parameter call_timeout)
    OnSipPhoneCallTimeoutMaxCalltimeDas Gespräch wurde beendet, da das Gespräch länger als erlaubt lief (Parameter max_call_time)
    OnPlayerCreatedEs wurde ein Player erstellt und es kann beim nächsten Anruf eine Sounddatei als Wartemusik abgespielt werden (Parameter dialtone)
    OnCallMediaStateChangeDie Nutzung der Ein- un Ausgabegeräte (Audio und Video) hat sich geändert.
    OnMediaRequiredEs existiert ein Call und es wird das Media-Gerät benötigt. Kann z.B. genutzt werden um Verstärker zu aktivieren.
    OnMediaNotRequiredEs existiert kein Call (mehr) und es wird das Media-Gerät nicht (mehr) benötigt. Kann z.B. genutzt werden um Verstärker zu deaktivieren.
    OnCallStateChangeDer Status eines Anrufs hat sich verändert
    OnCallStateConnectDer Stauts eines Gespräches ist jetzt wieder auf verbunden (Connected, Resuming oder Updating)
    AfterCallStateConnectDas Gespräch wurde aufgebaut, die Media-Verbindung besteht
    OnCallStateDisconnectDas Gespräch wurde beendet
    AfterCallStateDisconnect[nicht mehr belegt]
    OnCallStateDismissedEs sollte angerufen werden, jedoch sit die Gegenstelle besetzt.
    OnCallStateRejectDas Gespräch wurde von der Gegenstelle abgelehnt.
    OnCallStartInitialisierung der Call-Back Funktionen
    BeforeCallIncomingWenn ein Gespräch ankommt, und noch nicht weiter bearbeitet wurde
    OnCallReconnectWenn bereits ein Gespräch exisitert und ein Gespräch zur gleichen Nummer erneut aufgebaut wird.
    AfterCallReconnectNachdem bereits ein Gespräch exisitert hat und ein Gespräch zur gleichen Nummer erneut aufgebaut wurde.
    OnCallBusyWenn DoorPi gerade beschäftigt ist und kein weitere Gespräch annehmen kann.
    AfterCallBusyNachdem DoorPi ein ankommendes Gespräch abgelehnt hat, da bereits ein anderes Gespräch geführt wird.
    OnCallIncomingBevor ein ankommendes Gespräch angenommen wird (ist eine Admin-Nummer)
    AfterCallIncomingNachdem ein ankommendes Gespräch angenommen wurde (ist eine Admin-Nummer)
    OnCallRejectBevor ein ankommendes Gespräch abgelehnt wird (keine Admin-Nummer)
    AfterCallRejectNachdem ein ankommendes Gespräch abgelehnt wurde (keine Admin-Nummer)
    OnPlayerStartedDie Wiedergabe vom DialTone wurde gestartet
    OnPlayerStoppedDie Wiedergabe vom DialTone wurde gestoppt
    OnRecorderStartedDie Aufnahme des Gespräches wurde gestartet
    OnRecorderStoppedDie Aufnahme des Gespräches wurde gestoppt
    OnRecorderCreatedEs wurde eine Recorder erstellt wurde und bereit ist Anrufe aufzuzeichnen.')


    Ich frage das aus folgendem Hintergrund. Aktuell würde ich gerne einen sauberen Ablauf verschiedener Aktionen definieren.


    Beispiel:


    A: Es klingelt
    1. mjpg-streamer starten
    2. Verstärker einschalten
    3. interner Gruppenruf
    4. Push Nachricht verschicken


    B: Gespräch wurde beendet:
    1. mjpg-streamer stoppen
    2. Verstärker ausschalten


    C: Es klingelt und keiner geht ran nach "T"
    1. Audiodatei abspielen oder Handy anrufen


    D: Ich lehne das Klingeln ab
    1. Audiodatei abspielen


    Zu diesen Schritten suche ich aktuell die richtigen Events.
    das könnten neben OnKeyPressed auch die Events "OnCallIncoming", "BeforeCallIncoming " oder "onCallRejected" aus der Liste sein


    Bei Schritt B wäre das "OnCallStateDisconnect "


    Wie macht ihr denn das?
    grüße
    Marcus

    Cheers,
    Marcus
    -------------------------------------------------------
    Mein DoorPi (Eingebaut und in Betrieb)

    Einmal editiert, zuletzt von MarcusS () aus folgendem Grund: Typo

  • An der Stelle - die Actions pro Event werden syncron ausgeführt. Das bedeutet, wenn die erste Aktion 10 Sekunden benötigt, dann werden alle anderen Aktionen so lange auch nicht ausgeführt.
    Am Beispiel:
    A: Es klingelt
    1. mjpg-streamer starten (3 sec)
    2. Verstärker einschalten (1 sec)
    3. interner Gruppenruf (2 sec)
    4. Push Nachricht verschicken (2 sec)


    Es würde erst nach 3 Sekunden angefangen, den Gruppen-Anruf zu starten. Eventuell würde erst nach 5 Sekunden das Telefon wirklich klingeln. Klar sind das nur Sekunden, aber verglichen mit einer alten analogen Klingelanlage ist das einfach 3-5 Sekunden später als vorher.



    Außerdem gibt es Events, die asyncron abgefeuert werden (Fire&Forget) und es gibt syncrone Events. Ungefähr 99% sollten asyncron sein.
    Wenn an einem solchen syncronen Event Actions definiert sind, wird die weitere Verarbeitung von DoorPi angehalten, bis alle Aktions erledigt sind.
    Am Beispiel:

    Python
    1. self.event_handler.fire_event('BeforeShutdown', __name__)
    2. self.event_handler.fire_event_synchron('OnShutdown', __name__)
    3. self.event_handler.fire_event('AfterShutdown', __name__)


    Python
    1. self.event_handler.fire_event('BeforeStartup', __name__)
    2. self.event_handler.fire_event_synchron('OnStartup', __name__)
    3. self.event_handler.fire_event('AfterStartup', __name__)

    Jemand nutzt das Event OnStartup oder OnShutdown und will dabei eine Push Nachricht verschicken, der Netzanbieter streikt aber und DoorPi wartet auf ein http Timeout. Dann würde DoorPi an diesen beiden Stellen für z.B. 30 Sekunden bis zum Timeout stehen bleiben.


    Syncrone Events sind mit Absicht nicht in Bereichen zu finden, die zeitkritisch sind. Aber ich möchte darauf hinweisen und es ins Bewusstsein holen, wie DoorPi arbeiten würde.

  • Guter Punkt und wichtg zu wissen.


    Wenn ich dich und den Code richtig verstehe, dann sind alle Events die ich oben in der Tabelle gepostet habe vorhanden. Du erweiterst die noch mit eigenen. Richtig?



    https://github.com/motom001/DoorPi/blob/master/doorpi/doorpi.py#L134


    Python
    1. # register own events
    2. self.event_handler.register_event('BeforeStartup', __name__)
    3. self.event_handler.register_event('OnStartup', __name__)
    4. self.event_handler.register_event('AfterStartup', __name__)
    5. self.event_handler.register_event('BeforeShutdown', __name__)
    6. self.event_handler.register_event('OnShutdown', __name__)
    7. self.event_handler.register_event('AfterShutdown', __name__)
    8. self.event_handler.register_event('OnTimeTick', __name__)
    9. self.event_handler.register_event('OnTimeTickRealtime', __name__)


    Man müsste also nur aufpassen mit der Synchronität

  • Kann man irgendwo genau sehen welche asynchron oder synchron sind (außer im Code meine ich)?


    Das ist ja durchaus wichtig, z.B. in deinem obigen Szenario würde man dann ja vermutlich so eine Push Nachricht von z.B. OnStartup nach AfterStartup verschieben wenn ich das richtig verstanden habe?

  • Ähm, ich verstehe nicht, warum du den mjpg-streamer und den Verstärker erst starten willst wenn es klingelt.
    Die können doch permanent laufen. Bei mir verbraucht der Pi2 grade mal 3W mit PiCam und Verstärker.


    Außerdem finde ich es Klasse ab und zu mal von unterwegs per VPN mit dem Smartphone einen Blick auf den Eingangsbereich zu werfen.
    Weiterhin zeichnet Zoneminder bei mir jedesmal mehrere Bilder auf, wenn jemand die von mir erfasste Zone betritt.
    Theoretisch könnte DoorPi dann sogar den Gast per espeak mit "Guten Tag!" begrüßen :-)

  • Tag auch...
    hab erst heute mit DoorPi angefangen.
    Stehe also noch komplett am Anfang (Prototyping)
    Mich würde mal interessieren, wie man einen frei definierbaren Konsolenbefehl beim Klingeln absendet.
    Konkret:
    Es klingelt und der Pi jagt ein

    Code
    1. wget -O - http://192.168.x.x/control/message?popup=Es%20klingelt%20an%20der%20Pforte


    raus, was ein PopUp-Window auf meinem Sat-Receiver (Neutrino) erzeugt. Theoretisch geht das natürlich auch mit Enigma oder Kodi.
    Man könnte sogar drüber nachdenken, auf der Box etwas mehr als nur ein PopUp zu bauen. Wäre ja auch möglich, den Snapshot der Cam, darstellen zu lassen und mit einer Farbtaste den Summer über den Pi zu aktivieren.