Siri @home

Danke für den Denkanstoss!
Seit gestern ist die Heizungs- und Lichtsteuerung über SIRI möglich. :cool:

Ich hab noch das Problem das bei SIRI nur in einer Sprache antwortet, ich habe hier zwei iPhones mit verschiedener Spracheinstellung. Gibt’s da eine Property die ich im Plugin Script abfragen kann?

Hallo Michael, hallo Siri Freaks :wink:

kannst mir hier einer ein paar Tipps geben was ich wie an meine Umgebung anpassen muss ? der Proxy läuft und ich habe deine Anleitung wie oben befolgt. Ich kann so gut wie kein php, daher meine Fragen.

Hier mal ein Auszug aus dem Proxy wenn ich nach der Temperatur im Arbeitszimmer frage: (Er gibt mir dann aber nur irgendeine Temperatur warscheinlich eines Ortes das Arbeitszimmer heißt. Aber er checkt zumindest so wie es aussieht schonmal das Plugin ^^


zlib(finalizer): the stream was freed prematurely.
zlib(finalizer): the stream was freed prematurely.
[Info - Plugin Manager] Processing 'Wie ist die Temperatur im Arbeitszimmer '
[Info - Plugin Manager] Processing plugin #<SiriProxy::Plugin::Example:0x9070be4>
[Info - Plugin Manager] No matches for 'Wie ist die Temperatur im Arbeitszimmer '
[Info - Guzzoni] Received Object: AddViews
[Info - Guzzoni] Received Object: AddViews
[Info - Guzzoni] Received Object: RequestCompleted

Was macht denn dein Script (siri.php) ? Oder was muss ich noch so anpassen ?
Sorry… das weicht soweit vom Standard ab, dass ich mir hier nicht zu helfen weiß. Und googeln ist schlecht, da es nicht so viele kranke Leute wie uns gibt :wink:

Dem Plugin muss ja z.b. das Wort „Arbeitszimmer“ oder „Küche Hauptlicht“ wie in IPS vorhanden bekannt gemacht werden ?! Nur wie ?!

Gruß
Christian

Hallo.

Einen Rückkanal von IPS zu Siri habe ich noch nicht umgesetzt. Siri gibt IPS bei mir bisher nur Anweisungen.
Die siri.php wertet die Befehle aus die von dem Proxy an IPS übergeben werden. Das sieht für Homematic bei mir z.b. so aus:

<?php

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

// Variable setzen
if ($type == "VAR")
{
    SetValue($id, $state);
}

?>

Ich übergeben vom Proxy den Typ der Aktion, die IPS-ID der Instanz/Variable und den Wert. Definieren tust Du das auf dem SiriProxy in der siriproxy-ips.rb.
Ein kleiner Ausschnitt:


  listen_for(/LED.*Wohnzimmer.*aus/i) { led_wohnzimmer_off }
 
  def led_wohnzimmer_off
    Thread.new {
	result = HTTParty.get("http://#{self.host}/user/siri/siri.php?type=VAR&id=57924&state=20")
       say "L E D Leuchten im Wohnzimmer sind aus."
    request_completed #always complete your request! Otherwise the phone will "spin" at the user!
    }    
  end

Die LED-Farbe wird bei mir über eine Variable (mit ID 57924) mit entsprechende Variablenprofil gesteuert (20 = aus, 1=weiss, usw.). Der Befehl lautet daher VAR für Variabe setzten, dann die ID und dann der Wert.

Achtung - Änderungen in dieser Datei werden erst umgesetzt wenn der SiriProxy neu gestartet worden ist.

Ich hoffe das hilft Dir weiter.

Das sieht ja schon sehr gut aus :slight_smile:

Kann jemand mal ein komplettes Beispiel posten, wie man z.B. ein Licht einschaltet per Siri ?

Vielen Dank für eure Ideen und Hilfe !

siri.php von oben nehmen.

siriproxy-ips.rb für einen HM-Schaltaktor sähe dann z.b. so aus:


require 'httparty'

class SiriProxy::Plugin::IPS < SiriProxy::Plugin
  attr_accessor :host

  def initialize(config = {})
    self.host = config["host"]
  end

  #capture light status
  listen_for(/Licht.*Badezimmer.*an/i) { licht_badezimmer_on }
  listen_for(/Licht.*Badezimmer.*aus/i) { licht_badezimmer_off }


  def licht_badezimmer_on
    Thread.new {
 result = HTTParty.get("http://#{self.host}/user/siri/siri.php?type=HM&id=59009&state=1")
       say "Das Licht im Badezimmer ist an."
    request_completed #always complete your request! Otherwise the phone will "spin" at the user!
    }    
  end

  def licht_badezimmer_off
    Thread.new {
 result = HTTParty.get("http://#{self.host}/user/siri/siri.php?type=HM&id=59009&state=0")
       say "Das Licht im Badezimmer ist aus."
    request_completed #always complete your request! Otherwise the phone will "spin" at the user!
    }    
  end
  
end

Danke !

Hmmm habe dein letztes Beispiel mal ausprobiert und nur aus „BAdezimmer“ „Wohnzimmer“ gemacht und die Instanz ID eingetragen. Kommt folgender Fehler.


Create server for iPhone connection
start conn #<SiriProxy::Connection::Iphone:0x888f678 @signature=9, @processed_headers=false, @output_buffer="", @input_buffer="", @unzipped_input="", @unzipped_output="", @unzip_stream=#<Zlib::Inflate:0x888f4c0>, @zip_stream=#<Zlib::Deflate:0x888f448>, @consumed_ace=false, @name="iPhone", @ssled=false>
[Info - Plugin Manager] Plugins laoded: [#<SiriProxy::Plugin::Example:0x888e804 @manager=#<SiriProxy::PluginManager:0x888ef70 @plugins=[...]>>]

Ne Idee woran es liegt ?

Hast Du das IPS-Plugin in der Config vom Siri-Proxy entsprechend eingebunden?
Wenn es da in der siriproxy-ips.rb einen Fehler gäbe dann würde sich der Proxy nämlich mit einer Fehlermeldung beenden.

Abgesehen davon würde eine Abarbeitung des IPS-Plugins einen solchen oder ähnlichen Eintrag ergeben:

[Info - Plugin Manager] Processing plugin #<SiriProxy::Plugin::IPS:0x9467b1c>

Da bei Dir kein IPS-Plugin mit angegeben wird vermute ich mal stark es ist gar nicht eingebunden.

Ach ja - gerade noch gesehen:

[Info - Plugin Manager] Plugins laoded: [#<SiriProxy::Plugin::Example:0x888e804 @manager=#<SiriProxy::PluginManager:0x888ef70 @plugins=[…]>>]

Da zeigt er auch nichts davon an, dass das IPS-Plugin geladen worden wäre.

ok, mal zum testen. vielleicht muss ich den proxy mal neustarten. wie geht das ? :wink:
Mit „rvmsudo siriproxy server“ starte ich ihn ja nur wenn er noch nicht gestartet wäre

Beende den proxY mit strg+c dann wieder starten

Danke das beenden hat geklappt ^^ So komme ich wieder zu meinem vorherigem Problem.


The path `/home/thezepter/.rvm/gems/ruby-1.9.3-p0@SiriProxy/gems/siriproxy-0.3.0/plugins/siriproxy-ips` does not exist.

Das hatte ich schonmal und hab ihn dann wieder neu installiert. Immer wenn ich den einmal beendet habe kann ich ihn nicht mehr starten :confused:

Der Pfad in der Fehlermeldung kommt mir komisch vor… wieso „gems/siriproxy-0.3.0/plugins/siriproxy-ips“ ???

MOMENT… ich glaub ich hab einen Fehler gefunden… meine config.yml lag unter Plugins… muss in Siri Proxy direkt rein oder ?

ok, mal zum testen. vielleicht muss ich den proxy mal neustarten. wie geht das ? :wink:
Mit „rvmsudo siriproxy server“ starte ich ihn ja nur wenn er noch nicht gestartet wäre

Du hast von Linux ebenso viel Plan wie ich :smiley:

Was mich dann mal zu einer Gegenfrage führt. Ich habe das auf Ubunutu aufgesetzt. Sind Linux-Cracks anwesend die aus dem Stegreif wissen wie ich den Proxy automatisch beim hochfahren der VM starten lassen kann?

Hatte ich auch mal. Solltest Du das selbe How-To wie ich verwendet haben dann musst Du glaube ich vorher noch

[[ -s „$HOME/.rvm/scripts/rvm“ ]] && . „$HOME/.rvm/scripts/rvm“
echo ‚[[ -s „$HOME/.rvm/scripts/rvm“ ]] && . „$HOME/.rvm/scripts/rvm“ # Load RVM function‘ >> ~/.bash_profile

ausführen.

Das hatte ich gemacht… jetzt zur Sicherheit noch mal… aber funzt trotzdem nicht ^^
Komisch ist das

Ok. Nachdem ich mir mit diversem rumprobieren eine blutige Nase geholt hatte habe ich Nägel mit Köpfen gemacht und die VM komplett neu aufgesetzt. Dann einen Snapshot gemacht und davon ausgehend den Proxy buchstabengetreu nach dieser Anleitung neu aufgesetzt:

How to Install Siri Proxy Tutorial [Video]

Das hat mich dann zum Ziel geführt und der Proxy lief und konnte restartet werden. Wahrscheinlich hatte ich bei der rumprobiererei (hatte ich meine fundierten Linux-Kenntnisse schon erwähnt?) einiges nicht zum Guten verbogen.
Jetzt muss ich noch rausbekommen wie man die notwendigen Befehle in ein Skript verpackt und dies automatisch startet.

Hier mal die Anleitung die ich benutzt habe:



#Here's what I did to get to the point where I'm at:

#-Install Ubuntu 11.10
#-Get all available updates
#-Add the VirtualBox add-ons and video driver
#-Set up SSH (for the SCP at the end)
#
# I have done nothing else to this virtual machine.

# On my iPhone, I set the DNS server to 192.168.2.131 (the IP of the virtual machine)
#
# That's all the pre-setup that was done on the iPhone (the certificate is installed as part of the process)

# Here are the exact steps steps I followed:

#Install all the prerequisites
sudo apt-get install dnsmasq ruby build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion

#edit the dnsmasq conf
sudo vi /etc/dnsmasq.conf

# Keystrokes in vi:
# /address=
# A <enter> address=/guzzoni.apple.com/192.168.2.131 <--This is the IP of the VM
# <esc> :wq!

#Restart dnsmasq
sudo /etc/init.d/dnsmasq restart

#Install RVM
bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)

#Set RVM path
[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"

#Set the RVM path to be set up every time I log in
echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function' >> ~/.bash_profile

#Install Ruby 1.9.3 -- This will take several minutes
rvm install 1.9.3

#Use ruby 1.9.3 as the default (and current) version of ruby
rvm use 1.9.3 --default

#clone the SiriProxy repo
git clone git://github.com/plamoni/SiriProxy.git

#Enter the SiriProxy directory
cd SiriProxy

#Install SiriProxy -- Can take a minute or two
rake install

#Make the .siriproxy directory in my home directory
mkdir ~/.siriproxy

#Copy the example config
cp ./config.example.yml ~/.siriproxy/config.yml

#Generate the certificates
siriproxy gencerts


#Install the certificate on the phone.
# The way I do it in the video is through dropbox on my host machine.
# You can email the certificate to yourself, or whatever floats your boat.
# Here's the SCP command I use in the video. It's probably 100% worthless to anyone else
#
# scp 192.168.2.131:~/.siriproxy/ca.pem ~/Dropbox/Public/siri.vm.pem

#Bundle SiriProxy (this installs the plugins and whatnot)
siriproxy bundle

#Start the server
rvmsudo siriproxy server


jepp… genau dein HowTo hatte ich auch schon durch… waren aber ein paar Fehler drin…
Das was ich eben gepostet habe ist zu 99% ähnlich. ich fang glaube ich auch noch mal an. Habe noch ein Snapshot der VM :wink:

Ohh mann :confused::confused::confused:

Ich hab ihn grad neu aufgesetzt und vorm ersten Start das IPS script hinzugefügt.
Sobald ich ihn starten will:

The path `/home/thezepter/.rvm/gems/ruby-1.9.3-p0@SiriProxy/gems/siriproxy-0.3.0/plugins/siriproxy-ips` does not exist.

Sobald ich aber aus der config.yml den Teil für das IPS Script entferne, startet er.

folgendes steht in meiner config.yml wenn er nicht startet:



port: 443
log_level: 1
plugins:
    # NOTE: run bundle after changing plugin configurations to update required gems

    #- name: 'Example'
    #  path: './plugins/siriproxy-example'

     - name: 'IPS'
       path: './plugins/siriproxy-ips'
       host: '192.168.2.22:82'
.usw
.usw
.
.

Ich frag mich warum er mit dem Code integriert nicht startet ?! :confused:

In der config.yml steht folgendes:

# NOTE: run bundle after changing plugin configurations to update required gems

Wenn ich nun aber

siriproxy bundle

ausführe kommt die Fehlermeldung:

The path `/home/thezepter/.rvm/gems/ruby-1.9.3-p0@SiriProxy/gems/siriproxy-0.3.0/plugins/siriproxy-ips` does not exist.

Probier mal


    - name: 'IPS'
      path: '/home/DEIN_USER_VERZEICHNIS/SiriProxy/plugins/siriproxy-ips'
      host: '192.168.2.22:82' 

Und vergiß das Plugin nicht zu bundlen.

Geil, genau auf die Idee bin ich auch grad gekommen… danach musste ich noch „siriproxy bundle“ ausführen und danach konnte ich den proxy starten… jetzt kommt sobald ich das Wohnzimmer Licht anmachen möchte:

Create server for iPhone connection
start conn #<SiriProxy::Connection::Iphone:0x8f08b1c @signature=3, @processed_headers=false, @output_buffer="", @input_buffer="", @unzipped_input="", @unzipped_output="", @unzip_stream=#<Zlib::Inflate:0x8f08a40>, @zip_stream=#<Zlib::Deflate:0x8f08a2c>, @consumed_ace=false, @name="iPhone", @ssled=false>
[Info - Plugin Manager] Plugins laoded: [#<SiriProxy::Plugin::IPS:0x8bb86b0 @host="192.168.2.22:82", @manager=#<SiriProxy::PluginManager:0x8f08770 @plugins=[...]>>]