Siri API – Siri Befehle an Heimautomatisierung übergeben

Achtung: Unter iOS8 funktioniert diese Version nicht. Es gibt aber inzwischen ein Update, das hier zu finden ist.

Da ich bei meiner Heimautomatisierung von Anfang an eine Sprachsteuerung eingeplant hatte, ich aber nicht so recht wusste, wie ich das umsetzen sollte, kam mir Siri auf Apples iPhone gerade recht. Allerdings bietet Siri keine offene API an um mit anderen Apps oder gar Webanwendungen zu kommunizieren. Mit Jailbreak ging mal hier und da was, auch verschiedene Siri Proxys, die es ermöglichen sollten die Eingaben abzufangen, haben sich inzwischen zurückgezogen, nachdem Apple mit iOS 7 das Protokoll offenbar grundlegend überarbeitet hat.

Nachdem ich also fast 4 Stunden damit verbracht hatte nicht funktionierende Siri Proxys ans laufen zu bekommen, wollte ich endlich Erfolge sehen. Das Ergebnis waren 3 weitere Tage herumspielen mit dem Squid Proxy und einige verkürzte Nächte 😉 Jetzt kann ich aber sagen: Es funktioniert.

Der Trick ist denkbar einfach: Siri ermöglicht Google Suchanfragen. Also greife ich nicht mehr irgendwo im Siri Protokoll ein, sondern ich lasse den HTTPS Traffic von Google über den Proxy laufen. Mit einem gefälschten Zertifikat, dass nur einmal auf dem iPhone akzeptiert werden muss, kann ich den Proxy im sogennanten transparent Modus betreiben und so mitlesen, welche URL mein iPhone anfordert.

Um allerdings nicht jede Google Suchanfrage direkt auflaufen zu lassen – ich möchte Google ja weiterhin verwenden – muss ein vorher definiertes Schlüsselwort in der Anfrage enthalten sein, damit der Proxy den Traffic überhaupt zu gesicht bekommt. Anderfalls steuert eine per PAC (automatische Proxykonfiguration) gesteuerte Umleitung den Traffic an meinem Proxy vorbei, direkt zu Google.  Mann muss dann zwar immer Google + Schlüsselwort und dann seinen Befehl sagen, das ist mir allerdings allemal lieber als ein Jailbreak oder ein Siri Proxy der nach dem nächsten Update nicht mehr funktioniert.

Der Proxy leitet dann die Anfrage an einen HTTP Server weiter, der komplett in Python geschrieben ist. Dieser nimmt dann die Auswertung vor und kann z.B. das Licht einschalten. Dass das funktioniert ist in dem folgendem Video zu sehen:

Mir ist der Dienst GoogolPlex zwar zuvor gekommen und zwar mit der gleichen Lösung, allerdings wollte ich meinen eigenen Dienst haben und nicht auf einen externen zurückgreifen müssen. Außerdem habe ich den Dienst erst gefunden, nachdem ich die HTTP Umleitung schon fertig hatte.

Den Quellcode habe ich (mal ausnahmsweise gut dokumentiert) unter https://github.com/HcDevel/Siri-API online gestellt. Die dazugehörige Dokumentation ist unter https://github.com/HcDevel/Siri-API/wiki/_pages zu finden.

Wer Fragen oder Probleme hat, kann sich damit gerne in den Kommentaren melden, allerdings würde ich es bevorzugen, wenn diese im Git als Issue auf Englisch gestellt werden könnten. Je nachdem, wie groß das Projekt noch wird, könnte ich mir damit eventuell ein wenig Arbeit ersparen.

25 thoughts on “Siri API – Siri Befehle an Heimautomatisierung übergeben”

  1. Sehr coole Geschichte, muss ich mal ausprobieren! Danke für die Doku!

    Squid compiliert gerade auf meinem RasPi…

    1. Seit ein paar Tagen nun erfolgreich im Einsatz. Nett wäre es, wenn Worte nicht nur genau in Reihenfolge erkannt würden, sondern in beliebiger Folge.

      Bsp:

      Alle Rollos schließen
      Rollos alle schließen

      Ist das möglich?

      Danke für das nette Tool!!

      1. Ich arbeite momentan sowieso an einer saubereren Version mit mehr Funktionen in der Suche. Somit müsste ich es nur einbauen. Es gab auch schon den Wunsch die Überprüfung von Groß- und Kleinschreibung abzuschalten.
        Möglich ist das auf jeden Fall und gar nicht mal so schwer. Bis ich das hinzugefügt habe, könntest du einfach mehrere Bedingungen angeben. Also [“alle rollos schließen”],[“Rollos alle schließen”].

  2. Hallo,

    war lange auf der Suche nach einer Alternative für SiriProxy :). Super Job, den Du da machst! Welche Hardware hast du denn für die Hausautomation im Einsatz? Möchte das nämlich gern nachbauen.

    Danke

    1. Meine Heimautomatisierung habe ich unter hier zusammengefasst. Ich lasse alles über einen Raspberry Pi laufen. Die Steuerung der Funksteckdosen habe ich mit dem TinkerForge Remote Switch Bricklet bzw. dem Industrial Quad Relay Bricklet umgesetzt.

    1. Ich hatte ja bereits angekündigt, dass ich eine neue Version entwickle, die sauberer sein sollte. Allerdings ist die Entwicklung aus Zeitmangel aktuell etwas ins Stocken geraten. Die neue Version ist zwar fast fertig aber ein paar Ecken müssen noch rund geschliffen werden. So ruht die Version seit Mitte der Sommerferien auf meiner Festplatte bzw. im entsprechenden GitHub branch. Da ich seit Schulanfang noch keine richtige Zeiteinteilung für meine Projekte gefunden habe, bin ich da seitdem auch nicht weiter gekommen.
      Deshalb habe ich mich dazu entschieden erstmal die Arbeit ruhen zu lassen, bis iOS 8 erscheint. Wenn SiriAPI dann immer noch funktioniert, dann werde ich das Update auf jeden Fall früher oder später rausbringen. Ansonsten kann es sein, dass ich die Arbeit an dem Projekt einstelle. Ich denke am 17. September kann ich da mehr zu sagen.

      1. Also, so wie es aussieht wird SiriAPI auch unter iOS 8 noch funktionieren. Ich habe heute einen entsprechenden Pull Request auf GitHub bekommen, den ich auch schon gemerged habe. Er ist allerdings noch ungetestet. In meinen ersten Tests lief Siri API unter iOS 8 nicht, der Fix könnte das aber lösen.
        Die Chancen stehen gut, dass ich die neue Version spätestens in den Herbstferien freigeben kann.

        1. Hey Robin,

          tolle Arbeit! Ich würde SiriAPI gerne unter iOS 8 nutzen.
          Bist du mit der Entwicklung schon weitergekommen?

          Gruß,
          Marcus.

          1. Hallo Marcus,

            erhlich gesagt: Nein. Ich weiß nicht so ganz, wie ich die zusätzliche Sicherheitsprüfung umgehen könnte und bin mir nicht mal sicher, ob das überhaupt noch funktioniert. Betterthansiri hat das eventuell anders gelöst aber da kommuniziert man halt immer mit deren Servern. Ich werde mir mal ansehen, ob dieser Dienst noch mit iOS 8 funktioniert. Wenn nicht, dann kann ich die Entwicklung wohl aufgeben ;(. Ansonsten werde ich wenn ersten Arbeiten geschrieben sind mal versuchen herauszufinden, wie die das gelöst haben.

  3. Hi, endlich alternative zum Siri Proxy gefunden 🙂 ich hoffe die Version für die IOS8 funktioniert bald 😉 oder wurde die Arbeit schon eingestellt?

    mfg

    nice job

    1. Ich habe die Arbeit zwar nicht eingestellt, habe aber keine Lösung für das Problem. Wenn mir jemand sagen würde, wie ich das Problem lösen könnte, dann würde ich es implementieren nur leider hatte bisher auch auf GitHub niemand eine Idee. Deshalb gehe ich zurzeit davon aus, dass es keine iOS 8 Version geben wird.

  4. Hallo,

    Bin gerade auf deine Seite gestoßen,
    Versuche jetzt schon seit Tagen Sprachbefehle vom iPhone (iOS 8) am Raspberry zu geben aber leider ohne Erfolg 🙁

    Bist du denn schon weiter gekommen?
    Oder ist die eine Alternative bekannt?

    Gruß
    Matt

  5. cooles Projekt!:D zu schade das es nicht mehr unter ios8 funktioniert. Neulich ist mir beim erstellen einer Notiz mit Siri aufgefallen dass diese innerhalb von Sekunden durch die iCloud mit anderen Geräten syncronisiert wird. Ich als blutiger Python Anfänger habe leider keinen blassen Schimmer, aber ist es irgendwie möglich, mithilfe der pyicloud libary (https://github.com/picklepete/pyicloud) einen Raspberry Pi iCloud-Notizen auslesen/auswerten zulassen? Danke im vorraus..

    1. Die Idee ist gut. Sie baut ja im Grunde wieder auf das Originalkonzept auf irgendeinen Apple Dienst zu missbrauchen um Siri für eigene Anwendungen nutzen zu können. Da ließe sich sicher etwas umsetzen. Ich bin mir allerdings nicht sicher, ob es nicht eine zu große Verzögerung zwischen Erstellung und Reaktion geben würde und was Apple dazu sagt, wenn 24/7 irgendwas auf das Interface zugreift. Dafür müsste ich mir die API aber mal genauer ansehen. Interessant ist es auf jeden Fall!

    2. Also: Mal ein kurzes Update. Ich kann die Notizen tatsächlich für meine Zwecke missbrauchen. Ich nutze dafür allerdings IMAP. Das kann Apple theoretisch nicht wieder blockieren aber das habe bei iOS 7 ja auch schon gesagt 😉 Ich bin natürlich noch weit von irgendwas Brauchbarem entfernt, aber bin zuversichtlich, dass ich bald eine neue Version veröffentlichen kann. Nochmal danke für die Idee

      1. Ich habe mich in den letzen Tagen auch mal etwas rumprobiert und bin zu einer funktionierenden, aber äußerst unvorteilhaft und ‘primitiven’ Lösung gekommen. Mal abgesehen von den fast peinlichen Python-Skills die ich mir da zusammen gegoogelt habe ist hier auch das Problem das permanent auf Apples Server zugegriffen wird. Dieses Skript (http://pastebin.com/9FEdSMeg)
        läuft auf meinem Pi zusammen mit der inotes.py (https://github.com/xme/inotes.py). Die inotes.py ließt soweit ich das verstanden habe alle Notizen irgendwie per IMAP aus und durch den Parameter die oben in meinen Skript angegeben sind bekomme ich eine schöne Liste aller meiner Notizen. Danach läuft eine Schleife in der immer wieder die Letzen zeichen abgeglichen werden und bei Übereinstimmung ein paar Zeilen ausgibt. Die Notizen werden nicht gelöscht und häufen sich an, aber ist auch mehr proof of concept momentan :D. Vielleicht findest du ja eine bessere Lösung :D… Einem deinem ursprünglichen Ansatz sehr ähnlichem Prinzip währe vielleicht wenn man es irgendwie schafft alle Yahoo!-Suchanfragen abzufangen, denn über Yahoo! lässt sich ebenfalls per Siri suchen. Die Suchanfrage hängt dann ja direkt hinter der URL und irgendwie könnte man das ganze ja von HTTPs nach HTTP ‘umleiten’ um dann irgendwie per lokalem DNS-Server an einen eigenen Server übergeben tut.:D mfg Yannick

        1. Yahoo Anfragen hatte ich auch schon in der letzten pre Release Version drin. Das Problem war damals unter iOS 7 allerdings, dass das nicht zuverlässig funktioniert hat. Irgendwo hat da vermutlich das Caching der Proxy PAC versagt.
          Meine Implementierung ist inzwischen soweit fertig. Sie löscht alte Notizen auch von alleine. Bis ich sie aber freigeben kann muss ich noch ein bisschen Dokumentation schreiben und Langzeittests durchführen. Dadurch dass es zur Zeit auch noch kein error Handling gibt läuft das auch alles noch nicht
          Wirklich stabil. Ich sollte es eigentlich schaffen die im Laufe nächster woche freizugeben

          1. achsoo… Genial! Das freut mich zuhören :D. Erstmal einen großen Dank und Respekt für deine Mühe!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.