SIRI steuert FHEM

Begonnen von RaVini, 27 Februar 2013, 16:01:50

Vorheriges Thema - Nächstes Thema

RaVini

Moin zusammen,

nach ein paar schlaflosen Nächten ist es mir gelungen, eine eigentlich ganz einfache Sache hinzubekommen. Mein iPhone 5 steuert nun mein FHEM mittels Spracheingabe durch SIRI.

Es ist auf dem iPhone KEIN Jailbreak nötig!
Es ist aber einiges an Konfiguration und  Anpassung nötig, weshalb ich Anfängern davon abraten möchte. Man sollte sich zudem mit einem Linux oder iMAC in der Befehlsebene gut auskennen.

Meine Systemkomponenten :

- FB 7390 mit FHEM
- iMAC 27" late 2011 mit Mountain Lion als OS
- Siri-Proxy
- iPhone 5, iPhone 4s mit funktionierendem SIRI. Alle anderen iPhones, auf denen KEIN SIRI läuft, funktionieren nicht!

1. Auf dem iMac muss ein SIRI-Proxy installiert werden, Anleitung findet man hier

Wenn man den SIRI-Proxy zum Laufen bekommen hat, ist der Rest ein Kinderspiel.
Man muss im GEM noch das HTTParty.gem und das JSON.gem hinzufügen. Dazu in der Konsole einfach "gem install httparty" aufrufen und das Gleiche mit dem JSON machen.

2. In der Datei siriproxy-example.gemspec unten folgendes hinzufügen :

# specify any dependencies here; for example:
  # s.add_development_dependency "rspec"
  # s.add_runtime_dependency "rest-client"
  s.add_runtime_dependency "httparty"              <---- diese Zeile einfügen


Jetzt kann man zu Schritt 3. gehen und fröhlich im RUBY Script HTTP putten und getten, wie man möchte :

3. Man nimmt das beigefügte siri-proxy-example.rb und fügt z.B. zum Schalten einer FS20-ST folgenden Code ein :

# FHEM Fernseher einschalten
  listen_for /fernseher (an|ein|einschalten|anschalten)/i do
  say "Gerne, ich werde den Fernseher im Wohnzimmer einschalten."
    page = HTTParty.get("http://192.168.1.1:8083/fhem?cmd.Fernseher=set%20Fernseher%20on&room=Wohnzimmer").body rescue nil
  say "Bitteschoen!"
    request_completed
  end


Erklärung:
Die Zeile die mit "page" beginnt, steuert die FHEM Weboberfläche. 192.168.1.1 ist in diesem Fall der Webserver, auf dem FHEM läuft, hier meine Fritz!Box 7390. Mit der einfachen URL : http://192.168.1.1:8083/fhem?cmd.Fernseher=set%20Fernseher%20on&room=Wohnzimmer wird jetzt der Actor Fernseher, der mit "define Fernseher FS20 1234" in FHEM festgelegt wurde, geschaltet. Das %20 ersetzt in der URL ein Leerzeichen.

Das wars, Server neustarten und den neuen Befehl "Fernseher ein" bei SIRI sagen und staunen.
Auch Abfragen der einzelnen Stati von unterschiedlichen Komponenten des FS20 Systems sind möglich. Hier werde ich eine Lösung mit JSON erarbeiten und wenn alles ohne Fehler läuft, hier ebenfalls posten.

Viel Spaß und Erfolg beim nachbauen :)

RaVini

MarkusN

Hallo Ravini,

im Bereich Raspberry-Pi haben wir uns bereits mit diesem Thema beschäftigt (siehe hier).

Da meine FHEM-Umgebung auch immer weiter wächst möchte ich mich auch mit dem SiriProxy wieder näher beschäftigen, insbesondere damit alles nicht so generisch ist.

Bisher hab ich zwei Usecases abgedeckt (Fernseher einschalten (incl. sämtlichen zugehörigen A/V Geräten und Sat-Receiver) und Aquariumbeleuchtung manuell schalten) die auch prima funktionieren.

Grüße,

Markus

hixhupf

Hi,

ich habe das nun auch alles bei mir aufgesetzt und konfiguriert. Der Siriproxy läuft, meine Befehle werden bestätigt, aber der HTTP-Request scheint nicht ausgeführt zu werden. Im FHEM-Log kommt kein Request an, im Sirilog sehe ich auch keine Fehler.

[Info - Guzzoni] Received Object: SpeechRecognized
[Info - Plugin Manager] Processing 'Licht Anschalten '
[Info - Plugin Manager] Processing plugin #<SiriProxy::Plugin::Example:0x007f97f474f700>
[Info - Plugin Manager] Matches (?i-mx:licht (an|ein|einschalten|anschalten))
[Info - Plugin Manager] Applicable states:
[Info - Plugin Manager] Current state:
[Info - Plugin Manager] Matches, executing block
[Info - Plugin Manager] Say: Gerne, ich werde das Licht im Wohnzimmer einschalten.
[Info - Plugin Manager] Say: Bitteschoen!
[Info - Plugin Manager] Sending Request Completed


Irgendeine Idee?

Danke!
Sascha

RaVini

Hey Sascha,

Hast Du die IP Adresse an Deine Fritzbox bzw. An den Server angepasst der die FHEM Webseiten hostet?

Poste ansonsten bitte mal beide Sources

Gruß
RaVini

hixhupf

Hi RaVini,

ja, die Adressen habe ich angepasst. Hier ist mein Ruby-Befehl (in meiner Datei ist das eine Zeile, hier wird es umgebrochen dargestellt):
 # FHEM Licht aus
  listen_for /licht (aus|ausschalten)/i do
    say "Gerne, ich werde das Licht im Wohnzimmer ausschalten."
    page = HTTParty.get("http://192.168.18.70:8083/fhem?cmd.Deckenleuchte=set%20Deckenleuchte%20off&room=Wohnzimmer").body rescue nil
    say "Bitteschoen!"
    request_completed
  end

An der Siri-Console wird das auch abgearbeitet:

>> Licht aus
=> Gerne, ich werde das Licht im Wohnzimmer ausschalten.
=> Bitteschoen!

Welche Source brauchst du noch? Achso, wenn ich das HTTP-Kommando manuell per wget an einem Rechner ausführe wird auch korrekt geschaltet, daran liegt es also nicht ...

Danke!
Sascha

RaVini

Hey Sascha,

hast Du die GEM sourcen von HTTParty eingecheckt? Und hast Du in der *.gemspec Datei den HTTParty included, so wie ich es oben beschrieben habe?

Es sieht auf den ersten Blick so aus, als wird der HTTParty nicht ausgeführt.

Erscheinen irgendwelche Fehler in der Siri-Proxy Konsole?

Hast Du den Siri-Proxy mal neu gestartet?

Wenn Du das mit dem HTTParty nicht hinbekommst, versuche die andere Methode mit Telnet, die nach meinem Post beschrieben worden ist. Du kannst mir auch gerne Deinen kompletten Ruby Code zuschicken, dann schaue ich nochmals rein und probiere ihn aus.

LG
RaVini

hixhupf

Hi,

über den Telnet-Ansatz funktioniert es. Ich habe die Datei siriproxy-example.rb im Verzeichnis siriproxy/plugins/siriproxy-example angepasst und um den httparty-Eintrag ergänzt.

Anbei mal die beiden Dateien, die ich modifiziert habe.

Danke,
Sascha

VolkerS

Hallo Sascha,

ich habe das gleiche Problem wie Du.
Eine Lösung scheint zu sein, im siriproxy-example.rb die beiden Module zu laden, die am Anfang nach installiert wurden.

require 'httparty'
require 'json'

Danach hat bei mir die Methode mit page = HTTPart.get("http...... funktioniert.

Grüße

VolkerS

hixhupf

Hi Volker, danke für den Hinweis! Habe heute meinen Raspberry PI bekommen und werde damit alles neu aufsetzen (wollte den Mac nicht ständig laufen lassen). Bin gespannt :)

Grüße,
Sascha

Kai

so, nach acht Stunden läuft der Siriproxy auch bei mir ( einfach ist wirklich was anderes...), aber nun gut.
Was habe ich geschafft : -> auf die Frage "Test siri proxy" gibt es auch die entsprechende Antwort.
Auch die Frage "you don´t say" aus der siriproxy-example.rb wird "beantwortet".
In meinem Terminal sehe ich auch die Anfragen rein kommen und die entsprechenden Reaktionen.
Hier mal ein Ausschnitt :
[Info - iPhone] Received Object: SpeechPacket
[Info - iPhone] Received Object: SpeechPacket
[Info - iPhone] Received Object: SpeechPacket
[Info - iPhone] Received Object: FinishSpeech
[Info - Guzzoni] Received Object: SpeechRecognized
[Info - Plugin Manager] Processing 'Test einschalten'
[Info - Plugin Manager] Processing plugin Example
[Info - Plugin Manager] No matches for 'Test einschalten'
[Info - Guzzoni] Received Object: AddViews
[Info - Guzzoni] Received Object: RequestCompleted
[Info - iPhone] Received Object: Metrics


Ich habe herausgefunden durch ändern der siriproxy-example.rb, dass irgendwie mein siriproxyserver was anderes verarbeitet als die siriproxy-example.rb
ich habe in der entsprechendern siriproxy-example.rb mal die antwort verändert, die ausgegeben werden soll, siri antwortet aber immer noch mit der standart Antwort.
Meine siriproxy-example.rb vor der Änderung habe ich mal beigefügt

Anbei auch noch mal das log aus der Startsequenz, dort sind wohl warnungen, die verstehe ich allerdings nicht..

Warning: can not check `/etc/sudoers` for `secure_path`, falling back to call via `/usr/bin/env`, this breaks rules from `/etc/sudoers`. export rvmsudo_secure_path=1 to avoid the warning.[Info - Configuration] Loading plugins -- If any fail to load, run `siriproxy bundle` (not `bundle install`) to resolve.
[Notice - Server] ======================= WARNING: Running as root =============================
[Notice - Server] You should use -l or the config.yml to specify and non-root user to run under
[Notice - Server] Running the server as root is dangerous.
[Notice - Server] ==============================================================================




Dann noch eine Frage : Leider habe ich nicht herausgefunden wie man den Siriproxy neu startet ?! Ich mache immer die "harte" Variante und einen kompletten Neustart des Rechners?! Ist das richtig so ? -> gefunden ! Frage hat sicher erledigt ! rvmsudo siriproxy update .
rvmsudo siriproxy server.

Aber gibt es auch eine Variante den Server vorher zu stoppen ?
Im Terminal kann ich nichts mehr eingeben, wenn der erst mal läuft


Danke im Voraus

wolfram

liebe community,

ich weiß, das ist ein bisschen off-topic, aber trotzdem stelle ich hier mal die frage ob mir jemand helfen kann.
der siriproxy, bzw irgendwas stürzt bei mir regelmäßig bei definierten nachfragen ab.
ich vermute irgenetwas mit den rechten, komm aber nicht weiter.

die erste benutzeranfrage an meinen siri-proxy wird noch ausgeführt, aber dann stürzt es ab...

das ganze ist installiert auf einem MacMini OS 10.6.8 mit macports.

[Info - Plugin Manager] No matches for 'Schlafzimmer Licht an'
[Info - Guzzoni] Received Object: AddViews
[Info - Guzzoni] Received Object: AddViews
[Info - Guzzoni] Received Object: RequestCompleted
^C/Users/morpheus/.rvm/gems/ruby-1.9.3-p429@SiriProxy (ruby-1.9.3-p429@SiriProxy)/gems/eventmachine-1.0.3/lib/eventmachine.rb:187:in `run_machine': Interrupt
   from /Users/morpheus/.rvm/gems/ruby-1.9.3-p429@SiriProxy (ruby-1.9.3-p429@SiriProxy)/gems/eventmachine-1.0.3/lib/eventmachine.rb:187:in `run'
   from /Users/morpheus/siriproxi/lib/siriproxy.rb:17:in `initialize'
   from /Users/morpheus/siriproxi/lib/siriproxy/command_line.rb:106:in `new'
   from /Users/morpheus/siriproxi/lib/siriproxy/command_line.rb:106:in `start_server'
   from /Users/morpheus/siriproxi/lib/siriproxy/command_line.rb:90:in `run_server'
   from /Users/morpheus/siriproxi/lib/siriproxy/command_line.rb:39:in `initialize'
   from ./siriproxy:6:in `new'
   from ./siriproxy:6:in `<main>'
zlib(finalizer): the stream was freed prematurely.
zlib(finalizer): the stream was freed prematurely.

über eine idee würde ich mich sehr freuen.
danke

neo