Siri unter IOS 8 in IPS Nutzen

Hallo ich weiß nicht ob das schon jemand gesehen hat aber anscheinend gibt es eine Möglichkeit Siri wieder unter iOS 8 für unsere Zwecke zu nutzen. Es wird nicht wie früher direkt über einen Siri Proxy gemacht. Sondern dass man mit Siri eine Notiz schreibt und die sobald die Ein Schlüsselwort enthält, ausgewertet wird und somit ein Befehl Extern verwendet werden kann.

Hier Github

HcDevel/SiriAPI8 · GitHub

Und hier der Blogeintrag
blog.smartnoob.de - Error #403

Ich habe es bis jetzt selber nur gelesen somit kann ich null Erfahrung oder Support liefern. Aber so wie es klingt scheint es eine sehr interessante Sache zu sein.

Hallo Mastershort

Yep läuft ohne Probleme und ist sehr einfach einzurichten, auch fuer mich als nicht Programmierprofi :slight_smile:

Man muss nur Python installieren und SiriAPI8 und das wars. Das Script nutzt die Notiz Funktion von iOS (IMAP) und sollte auch mit iOS 6 oder späteren iOS Versionen funktionieren.

Ich habe es auf dem IPS Server (Windows) installiert und es läuft ohne Probleme auf Anhieb. Läuft wohl gem. Beschreibung auch unter Linux und Mac

Installation fuer Windows PC:

iOS Device:

1.) Als erstes muss man auf der iOS Device die iCloud Notiz Sync Funktion einschalten. Einstellungen -> iCloud -> Notizen aktivieren
2.) Des weiteren unter Einstellungen -> Notizen schauen das als Standard Account nun die iCloud ausgewählt ist.

IPS Server:

1.) Aktuelle Python Version herunterladen und installieren hier
2.) SiriAPI8 hier herunterladen und wie in meinem Bsp. in C: entpacken.
3.) Nun muss die SiriAPI8 installiert werden. Dazu in Windows über das DOS Terminal (CMD) zum Installationspfad wo Ihr die SiriAPI8 entpackt habt navigieren: In meinem Fall cd c:/SiriAPI8-master/ und danach „C:\Python34\python.exe“ setup.py install eingeben.
4.) Nun kann man die example.py aus dem SiriAPI8 Verzeichnis bearbeiten. Ich habe mir z.B. eine IPS.py angelegt mit folgendem Inhalt:

from SiriAPI8.SiriAPI import *

import urllib.request
import json

def request (url): #HTTP request
    f = urllib.request.urlopen(url)
    return(f.read().decode('utf-8'))

def light_toggle(q, wildcards):
    request("http://IPS-SERVER-IP-ADRESSE:PORT/user/living_light.php")
    print("Living Room Light switched on or off")

SiriAPI = SiriAPI("email@icloud.com", "password")
SiriAPI.set_keyword('IPS')
SiriAPI.action.add([['living room', '*']], light_toggle)

print ("Version: " + SiriAPI.get_version())
SiriAPI.connect()
input("Press any key...
")
SiriAPI.disconnect()

5.) Im Code unter IPS-SERVER-IP-ADRESSE und PORT auf Euere IP ändern. Kann auch ein entfernter IPS Server sein.
6.) Im Code unter („email@icloud.com“, „password“) Euere iCloud Email Adresse und Passwort eingeben.
7.) Danach im DOS Terminal das file laden Bsp. cd c:/SiriAPI8-master/ und danach „C:\Python34\python.exe“ IPS.py ausführen. Nun sollte im DOS Fenster Version 8.0.1 und danach Press any key… erscheinen.
8.) Nun kann ich auf dem iPad SIRI öffnen und sagen „create note IPS living room“ und im Hintergrund wird meine im IPS User Verzeichnis hinterlegte Datei living_light.php aufgerufen. Diese enthält meinen PHP Script um die Living Room Lampe ein- und auszuschalten.

Wenn Euer iPhone oder iPad auf Deutsch eingestellt ist muesst Ihr glaube ich sagen „Notiz anlegen IPS …“ In diesem Fall wäre es besser oben Wohnzimmer als Living Room zu nutzen, damit Siri Euch versteht.

Die SiriAPI8 hat als standard Keywort 'iPhone" was aber wie oben im Code ersichtlich auch geändert werden kann. In meinem Beispiel SiriAPI.set_keyword(‚IPS‘).

Also mit URL Request funktioniert es prima. Nun die Herausforderung an unsere Json RPC Freaks/Spezis wie könnte man das mit RPC integrieren ?. Vorteil wäre das man nicht lauter zusätzliche Scripte im User Verzeichnis anlegen muss.

Bsp.:

$rpc = new JSONRPC("http://IPS-LIZENZ-NAME:REMOTE-PASSWORT@IP-ADRESSE:PORT/api/");
    $rpc->ENO_SwitchMode(38371, true)

Dem ersten der es mit JSONRPC Aufruf im obigen IPS.py Code schafft, dem gebe ich ein Bier aus. :loveips:

 $rpc = new JSONRPC("http://user".chr(64)."domain.de:Fernzugriffkennwort@192.168.178.41:82/api/");
$result = $rpc->IPS_GetKernelDir();
echo "KernelVersion: ".$result;

Das „@“ im Lizenz-Benutzernamen durch „.chr(64).“ ersetzen…

Firewall auf Port 82 freischalten nicht vergessen!

Joachim

Hi ich habe alles so wie beschrieben gemacht aber ich bekomme immer diese Fehlermeldung :

C:\SiriAPI8-master>"C:\Python34\python.exe" IPS.py
Version: 8.0.1
Traceback (most recent call last):
  File "C:\SiriAPI8-master\SiriAPI8\SiriAPI.py", line 37, in connect
    self.connection.login(self.username, self.password) #Login
  File "C:\Python34\lib\imaplib.py", line 538, in login
    raise self.error(dat[-1])
imaplib.error: b'[AUTHENTICATIONFAILED] Authentication failed'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "IPS.py", line 19, in <module>
    SiriAPI.connect()
  File "C:\SiriAPI8-master\SiriAPI8\SiriAPI.py", line 39, in connect
    raise Exception("Login to iCloud failed. Check user credentials")
Exception: Login to iCloud failed. Check user credentials

Habe es getestet, unter icloud.com komme ohne Probleme mit den Logindaten aus dem Script rein ?

Ich habe die 2 Faktor Autorisierung!

Hat einer eine Idee warum das nicht klappen will :frowning:

Hi Drapple

Es koennte eventuell daran liegen:

1.) Als ich in der iCloud das Sync fuer Notes aktiviert habe, hat mich Apple aufgefordert eine neue email Adresse anzulegen xxxx@icloud.com und Passwort. Wenn ich diese nun im Script nutze funktioniert auch die Verbindung. Nutze ich die normale Apple ID geht es nicht.

Überprüfe auch ob Du auf Deiner iOS device unter Einstellungen unter Notizen iCloud als Standardkonto ausgewählt ist. Wenn man die iCloud offen hat sieht man schoen wenn alles funktioniert wie die Notiz angelegt wird.

Hoffe das hilft.

Hi Joachim

Danke fuer die Hilfe. Wenn ich Dein Code mit oben in das Python File mit reinnehme (habe 0,00% Ahnung von Python) und lade bekomme ich gleich ein Syntax Error.

Das IPS_GetKernelDir gibt mir ja auch nur den IPS Pfad zurück, aber wo ist mein Schaltbefehl ENO_SwitchMode(38371, true) geblieben.

…sollte ja nur ein Beispiel sein, wie es überhaupt klappt…(aber die von Dir beschriebene Antwort zeigt ja das „Du drin bist“!:D)

$rpc = new JSONRPC("http://user".chr(64)."domain.de:Fernzugriffkennwort@192.168.178.41:82/api/");
$rpc->ENO_SwitchMode(38371, true)

…von dem Code in diesem Projekt habe ich (noch) keine Ahnung…:smiley:
(Ist aber sehr interessant - mal sehen ob ich mich das auch mal umsetze, hatte ja auf das AppleHomekit gehofft)

Joachim

Mich hat es weniger als 15 min gekostet alles zu installieren. Es lohnt sich also mal auszuprobieren.

Wenn ich mir überlege wie kompliziert alles das alle mit Siri Proxy war.

Wie gesagt jetzt noch eine Anbindung via JsonRpc wäre nahezu perfekt.

So ich habe den Login hinbekommen. Ich musste ein App Kennwort einrichten, dann hat es geklappt.

Ich bekomme es aber nicht hin, das er einen Befehl ausführt:

SiriAPI8 error: No action defined for Computer K=C3=BCche=

und in der ips.ps steht:

SiriAPI.set_keyword('Computer')
SiriAPI.action.add([['K=C3=BCche', '*']], light_toggle)

Was mache ich falsch ?

Moin…

… kann mir mal einer helfen und sagen, wie ich das python-skript nach einen reboot auf dem PI automatisch starten kann.
!?

Ich habe es per cron versucht:


@reboot python3 /home/pi/SiriAPI8/ips.py
oder
@reboot sudo python3 /home/pi/SiriAPI8/ips.py

Beides ohne Erfolg. Das Verzeichnis stimmt und wenn ich es manuell per Terminal so starte funktioniert der Spaß:


cd /home/pi/SiriAPI8

anschließend
 
python3 ips.py

Meine Linux-Kennisse laufen gegen Null… hab das alles von Herrn Google!!!

Danke,
Peter

Hi Drapple

Ich denke Du solltest es mal mit einem einfacheren Wort als „K=C3=BCche“ probieren. Wie wäre es mit Wohnzimmer oder Living Room falls EN als Grundeinstellung.

Hier auch noch ein Hinweis fuer Deutsche User bezüglich Umlaute:

https://github.com/HcDevel/SiriAPI8/issues/8

Hi „Wohnzimmer“ hatte zuerst aber war genau das selbe…

K=C3=BCche = Küche :wink:

Siehst Du den im DOS Fenster wenn Du die IPS.py ausfuehrst…

Version 8.0.1
Press any key …

Wenn ich nun wie in meinem Bsp. sage „create note IPS living room“ erscheint im DOS Fenster:

„Living Room Light switched on or off“

Sage ich ein Keyword der nicht definiert ist erscheint:

„SiriAPI8 error: No action defined for IPS“

Hi ja das steht so bei mir auch :

Version 8.0.1
Press any key …

Aber egal was ich als Action für ein Wort nehme er will es nicht ;-(

Ok. Ich habe es getestet das ich mich parallel in der iCloud am Compi eingeloggt habe. Dort kann ich schoen sehen ob iOS meine neue Notiz überhaupt anlegt. Legt er sie nicht an dann ist etwas an den Einstellungen verkehrt a) ist Sync zur iCloud aktiviert b) is die iCloud als Kontotyp fuer Notizen ausgewählt.

Das ist schon nun einmal Standard iOS Funktion und hat nix mit dem SiriAPI8 zu tun.

Laeuf alles sauber und ich sage den Befehl fuer mein Wohnzimmer Licht legt er die die Notiz an und loescht sie danach wieder.

Tja mehr kann ich Dir dann nicht helfen.

Hi,
danke für die Info!
Hab es auch mal schnell eingerichtet.
Gefällt mir zwar eigentlich nicht wirklich, da a) „Erstelle Notiz“ und das Keyword mir zuviel Gelaber ist und b) es keine Rückmeldung über Siri geben kann.

Aber egal… war wirklich in 20min eingerichtet, vielleicht brauche ich es ja doch mal.

@drapple: hatte das selbe Problem. Muss irgendein Syntax-Fehler sein; ich kenne mich in Python jedoch nicht so gut aus. ich hab mir das „my-personal-example.py“ Skript vorgenommen und für mich angepasst. Dann lief es.

Bzgl den JSON-Profis:
Wäre zwar klasse, wenn hier jemand was tut. Ich nehme aber einfach meine alte siri.php aus SiriProxy-Zeiten. Damit kann man auch so sehr einfach ein lauffähiges Konstrukt aufbauen.

siri.php:

<?php

 $id = intval($_GET['id']);
 $type = $_GET['type'];

 // HOMEMATIC
 if ($type == "HM")
 {
 $state = $_GET['state'];
 if ($state == 1) 
 {
 HM_WriteValueBoolean($id, "STATE", true);
 }
 elseif ($state == 0) 
 {
 HM_WriteValueBoolean($id, "STATE", false);
 } 
 }

 // HOMEMATIC-DIMMER
 if ($type == "HM-DIM")
 {
 $state = $_GET['state'];
 HM_WriteValueFloat($id, "RAMP_TIME", 5);
 HM_WriteValueFloat($id, "LEVEL", floatval($state)); 
 }

 // Variable setzen
 if ($type == "SETVAR")
 {
 $state = $_GET['state'];
 SetValue($id, $state);
 }

 // Variable auslesen
 if ($type == "READVAR")
 {
 $Var = GetValue($id);
 echo $Var;
 }

 // Skript starten
 if ($type == "RUNSCRIPT")
 {
 IPS_RunScript($id);
 }

?>

und dazu meine IPS.py:


from SiriAPI8.SiriAPI import *

import urllib.request
import json

def request (url):
    f = urllib.request.urlopen(url)
    return(f.read().decode('utf-8'))

def licht_toggle(q, wildcards):
    if (wildcards[0].lower() in ["an", "ein", "einschalten"]):
      request("http://127.0.0.1:82/user/siri/siri.php?type=HM&id=55815&state=1")
      print("Erledigt. Licht an." + wildcards)
    else:
      request("http://127.0.0.1:82/user/siri/siri.php?type=HM&id=55815&state=0")
      print("Erledigt. Licht aus." + wildcards)

SiriAPI = SiriAPI("blabla@icloud.com", "password")
SiriAPI.set_keyword('Technik')
SiriAPI.action.add([['licht', '*'], ['lampe', '*'], ['schalte den', '*'], ['schalte das', '*'], ['schalte die', '*'], ['schalte den', '*'], ['schalte', '*'], ['schalte', '*']], licht_toggle) 

print ("Version: " + SiriAPI.get_version())
SiriAPI.connect()
input("Press any key...
")
SiriAPI.disconnect()

Hallo ika,

Dein Skript läuft wunderbar auf meinen Raspberry.
Vielen Dank für die Idee.

Kannst Du mir eventuell verraten, wie ich die Werte für den Dimmer übergeben kann.
Zur Zeit steuere ich den Dimmer analog zu einem Schalter nur mit 0 und 100.
Beliebige Werte würden mich natürlich auch für die Heizungssteuerung interessieren.

Gruß

Axel

Hi Axel,

wie du siehst ist die Funktion „HM-DIM“ ja drin.
Wie man jetzt eingesprochene Zahl übergibt, müsste ich auch erstmal erarbeiten. Geht aber sicher.

Der Einfachheit halber kannst du aber natürlich auf jeden Fall in der IPS.py einfach mehrere Fälle abfangen.
Also je eine Anweisung für z.B. „schalte auf 50 Prozent“, „schalte auf 70 Prozent“, schalte auf 100 Prozent" usw.

Hallo Ika,

vielen Dank für die Antwort.

Mit entsprechend vielen Szenarien habe ich mein Problem dank Deines Skriptes bereits erfolgreich umgesetzt.
Mein Wunsch besteht trotzdem noch, wenn möglich, einen eleganten Weg zu finden um jede beliebige Prozentzahl übergeben zu können. Diese Funktion würde ich dann auch gerne für die Heizungssteuerung verwenden.
Sollte also jemand hierzu noch eine Idee haben, könnten wir beide davon profitieren.

Gruß

Axel

Schön zu sehen, dass mein Projekt auch Anwendung gefunden hat.

Also wenn ich dein Problem richtig verstanden habe, dann willst du aus SiriAPI8 die Prozentzahl abfragen? Das geht relativ einfach über wildards:

SiriAPI.action.add([['setze auf', '*', 'prozent']], licht_toggle)  

In der entsprechenden Funktion kannst du die Wildcard dann wie gefolgt nutzen:


def dimmen(q, wildcards):
     request('http://irendwohin?prozent='+wildcards[0])

Ich habe mir jetzt nicht angesehen, wie die Übergabe an das php Script ablaufen würde, aber es muss nur noch die URL geändert werden.

Robin