Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Siri Proxy (Experimental)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Neues Plugin: Siri Proxy (Experimental)

    Hallo Kollegen,

    ich habe ein neues Plugin in Github gestellt mit dem es möglich ist, die Sprachassistentin Siri in sh.py zu integrieren. Ihr findet es im Branch "siri": https://github.com/mknx/smarthome/tree/siri

    Das Plugin ist eine Ableitung des "sirious" Projekts von Will Broyce: https://github.com/wrboyce/sirious

    Da sirious iOS6 (noch) nicht unterstützt habe ich zum generieren der notwendigen Zertifikate das Script von pysiriproxy verwendet: https://code.google.com/p/pysiriprox...nfig%2Fscripts

    Die Zertifikate müssen dann nach /usr/local/smarthome/plugins/siri/certificates kopiert und in server.crt, server.key und ca.pem umbenannt werden. Außerdem muss natürlich der lokale DNS Server (z.B. dnsmasq) den Namen kryten.apple.com und guzzoni.apple.com auf den sh.py Server umbiegen. Im pysiriproxy Projekt von oben findet ihr auch ein Shell Skript, dass die notwendigen Anpassungen in dnsmasq vornimmt. Um das notwendige Client Zertifikat auf's iOS Device zu bekommen reicht es aus, dass man später bei laufendem sh.py auf dem iOS Device die URL https://kryten.apple.com aufruft (Achtung: https, also SSL). Ist der Pfad im DNS korrekt umgebogen fordert euch Safari auf, ob ihr das Zertifikat installieren wollt... es muss also nicht extra per Mail geschickt werden.

    Wichtig ist auch, dass sh.py mit root Rechten gestartet werden muss, da das Plugin den Port 443 verwendet, was leider nur als root geht:

    Code:
    sudo bin/smarthome.py
    Das Plugin unterstützt bisher nur Items vom type boolean, also type=bool (wird aber natürlich noch erweitert). Um ein Item via Siri schalten zu können muss beim Item das Attribut "siri=" angegeben werden. Beispiel:

    Code:
    [living_room]
        [[light]]
            type=bool
            siri="Wohnzimmer Licht (an|aus)"
    Es handelt sich dabei um einen regulären Ausdruck. Das Plugin versucht das Item auszusteuern, wenn dieser reguläre Ausdruck von Siri erkannt wurde. In diesem Fall also entweder bei "Wohnzimmer Licht an" oder bei "Wohnzimmer Licht aus". Derzeit können im Ausdruck nur deutsche Kommandos verarbeitet werden. "an", "ein" und "runter" wird bisher auf True gemapped, alles andere auf False. Also "Wohnzimmer Licht an" oder "Schlafzimmer Rollladen runter" setzen das entsprechende Item auf True sonst auf False.

    Aktiviert wird das Plugin ganz normal in der etc/plugin.conf:

    Code:
    [siri]
        class_name = Siri
        class_path = plugins.siri
    Notwendige Abhängigkeiten sind 'biplist', 'pyopenssl' und 'twisted' die natürlich installiert sein müssen:

    Code:
    sudo easy_install biplist
    sudo easy_install pyopenssl
    sudo easy_install twisted
    [ACHTUNG]Seit iOS6 versucht Siri neben Wifi auch über 3G den Apple Server zu erreichen. Zum Testen sollte man also erstmal in den Flugmodus gehen und dann lediglich Wifi wieder aktivieren. (Danke an Thorsten für den Tipp)[/ACHTUNG]

    Wer wie ich eine FritzBox hat und daher dem iOS Device nicht so einfach einen eigenen DNS mitteilen kann, der kann einfach in den Einstellungen des iOS Devices bei seinem WLAN Netzwerk auf den blauen Pfeil tippen und unter DNS die IP selber eingeben.

    Ich teste derzeit noch verschiedene Konstellationen um das iPhone auch bei aktiviertem 3G auf den eigenen DNS festzunageln. Bisher hat das noch nicht so funktioniert. Ich habe zwar Dank OpenVPN es hinbekommen, dass ein Lookup auf kryten.apple.com das VPN aktiviert, aber scheinbar nutzt das iPhone dennoch zusätzlich den DNS des Mobilfunkproviders. Was ich noch testen möchte ist, im iPhone Konfigurationstool die IP des Apple Servers übers VPN zu routen, mal sehen ob das klappt.

    TODO

    An die, die sich mit Regexp unter Python auskennen: Was mein Wunschzustand wäre, dass man beim Attribut "siri=" beliebige Strings angeben kann und über Namen dann auf den eigentlichen Wert und die Möglichkeiten im Regexp zugreifen kann. Das ich es quasi so definieren kann:

    Code:
    [living_room]
        [[light]]
            type=bool
            siri="(Wohnen|Wohnzimmer) (Deckenspots|Spots|Licht) (?P<value>an|aus)"
    Um es dann irgendwie so abzufragen (Achtung Pseudocode):

    Code:
    if val is re.groups('value')[0]:
        item(True)
    else:
        item(False)
    Also das ich beim Auswerten das entsprechende Item auf True setze, wenn die erste Option der entsprechenden Gruppe gesprochen wurde, andernfalls auf False. Hat hier jemand eine Idee wie ich das erreiche? Auch Ideen wie man Prozentwerte etc. via Regexp verarbeiten könnte sind gerne willkommen!

    [WICHTIG]Bitte in diesem Thread nur über Bugs/Anregungen zum Plugin selber diskutieren. Fragen rund um das Thema Siri Proxy und wie man DNS etc. umbiegt sollten an anderer Stelle (evtl. hier) gestellt werden.[/WICHTIG]

    Und nun, viel Spass beim Testen
    Mit freundlichen Grüßen
    Niko Will

    Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
    - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

    #2
    Zwar konnte ich es von unterwegs noch nicht testen, aber ich hab mal noch ne kleine Erweiterung vorgenommen. Die Strings für das Siri Attribut müssen nun wie folgt aufgebaut sein. Für boolean Werte:

    Code:
    Wohnzimmer (Licht|Spots|Deckenlicht|Deckenspots|Lampe) [COLOR="Red"][B](?P<True>an|ein)[/B][/COLOR]|(aus)
    Wichtig hier ist das rot markierte. Jeglicher String der den regulären Ausdruck matched setzt das entsprechende Item auf False, es sei denn es matched ein String aus der Gruppe mit dem Namen "True". Dadurch kann jetzt der Text in einer beliebigen Sprache angegeben werden, da man selber festlegen kann, welche Wörter True entsprechen.

    Ähnlich ist es für numerische Werte:

    Code:
    Wohnzimmer (Licht|Deckenspots|Deckenlicht|Spots) [COLOR="red"][B](?P<Num>[0-9]{1,2}|100)[/B][/COLOR] %
    Auch hier ist wieder die rote Gruppe von entscheidender Bedeutung. Sobald in einem "siri=" Attribut eine benannte Gruppe mit dem Namen "Num" vorkommt wird das Item mit dem numerischen Wert dieser Gruppe gesetzt. Also bei "Wohnzimmer Licht 80 %" wird das Item auf 80 gesetzt. Kommt die Gruppe "Num" nicht vor wird der Wert des Items nicht verändert.

    Hier kann man übrigens schön reguläre Ausdrücke testen, gerade auch die benannten Gruppen: re-try
    Mit freundlichen Grüßen
    Niko Will

    Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
    - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

    Kommentar


      #3
      Jetzt konnte ich die obige Änderung testen und muss sagen... das funktioniert richtig gut. Okay, es ist immer noch experimental und produziert manchmal seltsame oder wiederholende Antworten in Siri, aber prinzipiell funktioniert es und macht richtig Spass!

      Jetzt muss ich es nur noch durchs VPN bekommen
      Mit freundlichen Grüßen
      Niko Will

      Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
      - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

      Kommentar


        #4
        Certificates?

        Hallo 2ndsky,

        versuche gerade siriproxy mit smarthome zu installieren.
        Jetzt mal die Frage zu den Zertifikaten:
        ...
        Da sirious iOS6 (noch) nicht unterstützt habe ich zum generieren der notwendigen Zertifikate das Script von pysiriproxy verwendet: https://code.google.com/p/pysiriprox...nfig%2Fscripts
        ...
        Wie hast Du die Zertifikate generiert? Pysiriproxy komplett installiert?

        Grüße

        Frank

        Kommentar


          #5
          Hallo Frank,

          Freut mich, dass es noch andere gibt die damit experimentieren.

          ja, ich hatte pysiriproxy installiert, da ich noch nicht genau wusste von welchem Projekt ich den Code für mein Plugin ableite. IMHO solltest du das Script zum Generieren der Zertifikate von pysiriproxy Projekt aber auch ohne installiertes pysiriproxy verwenden können. Anstatt es über pysiriproxy aufzurufen rufst du es einfach direkt im Ordner auf.

          hth
          Mit freundlichen Grüßen
          Niko Will

          Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
          - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

          Kommentar


            #6
            Certificates

            Hallo 2ndsky,

            leider klappt das mit dem Zerifikate erstellen überhaupt nicht!
            Irgendwie lässt sich pysiriproxy nicht installieren bzw. es kommen immer folgende Meldungen:
            Terminal Meldungen:
            Code:
            root@smarthome:/opt/siri/pysiriproxy/pysiriproxy/config/scripts# ./gen_certs.sh
            Creating CA directory
            Generating 'SiriProxyCA' CA request
            Self-signing 'SiriProxyCA' CA
            Generating *.apple.com certificate request
            Generating 'SiriProxyCA' CA request
            Generating *.apple.com certificate
            Removing passphrase from *.apple.com key
            Cleaning up...
            mv: cannot stat `/tmp/newcert.pem': No such file or directory
            mv: cannot stat `/tmp/siriCA/cacert.pem': No such file or directory
            Done! (For details on any errors, check '/root/.pysiriproxy/certificates/cert.log')
            -------------------------------------------------------------
            Please install /root/.pysiriproxy/certificates/ca.pem onto your phone!
            (Note: You can do this by emailing the file to yourself)
            -------------------------------------------------------------
            und in der cert.log steht:

            Code:
            error on line -1 of /scripts/openssl.cnf
            3069695184:error:02001002:system library:fopen:No such file or directory:bss_fil
            e.c:169:fopen('/scripts/openssl.cnf','rb')
            3069695184:error:2006D080:BIO routines:BIO_new_file:no such file:bss_file.c:172:
            3069695184:error:0E078072:configuration file routines:DEF_LOAD:no such file:conf
            _def.c:197:
            Using configuration from /scripts/openssl.cnf
            error loading the config file '/scripts/openssl.cnf'
            3070067920:error:02001002:system library:fopen:No such file or directory:bss_fil
            e.c:169:fopen('/scripts/openssl.cnf','rb')
            3070067920:error:2006D080:BIO routines:BIO_new_file:no such file:bss_file.c:172:
            3070067920:error:0E078072:configuration file routines:DEF_LOAD:no such file:conf
            _def.c:197:
            error on line -1 of /scripts/openssl.cnf
            3070043344:error:02001002:system library:fopen:No such file or directory:bss_fil
            e.c:169:fopen('/scripts/openssl.cnf','rb')
            3070043344:error:2006D080:BIO routines:BIO_new_file:no such file:bss_file.c:172:
            3070043344:error:0E078072:configuration file routines:DEF_LOAD:no such file:conf
            _def.c:197:
            Using configuration from /scripts/openssl.cnf
            error loading the config file '/scripts/openssl.cnf'
            3069764816:error:02001002:system library:fopen:No such file or directory:bss_fil
            e.c:169:fopen('/scripts/openssl.cnf','rb')
            3069764816:error:2006D080:BIO routines:BIO_new_file:no such file:bss_file.c:172:
            3069764816:error:0E078072:configuration file routines:DEF_LOAD:no such file:conf
            _def.c:197:
            Error opening Private Key /tmp/newkey.pem
            3069719760:error:02001002:system library:fopen:No such file or directory:bss_fil
            e.c:398:fopen('/tmp/newkey.pem','r')
            3069719760:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:
            unable to load Private Key
            Hast Du da vielleicht einen Ansatzpunkt?

            Grüße

            Frank

            Kommentar


              #7
              Auf die Schnelle: vielleicht verwendet das Script irgendwelche Pfade, die bei der Installation von pysiriproxy gesetzt werden und bei mir hat es funktioniert, weil ich es installiert hatte. Wenn es dir nichts aus macht dann installiere es einfach und versuche es dann nochmal. Ansonsten kann ich mir das Script mal ansehen und schauen, ob man da was abändern kann. Aus beruflichen Gründen könnte das aber einige Tage (wenn nicht sogar Wochen) dauern, sorry.
              Mit freundlichen Grüßen
              Niko Will

              Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
              - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

              Kommentar

              Lädt...
              X