Ankündigung

Einklappen
Keine Ankündigung bisher.

Siri-Proxy - wer hat know how und will mitbasteln?

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

  • ThorstenGehrig
    antwortet
    Mensch Niko,
    imho bist du gerade mittden in der Bauphase und hast noch gar kein 4S.
    Eigentlich darfst du garkeine Zeit haben für Democode
    Daher ein extragroßes Danke

    Zum Code: Pharsen -> genau da müssen wir hin
    Schlüsselwort: nö. Taste drücken UND Schlüsselwort finde ich nicht schön. Wie wäre es denn beim Pharsen die Anzahl der "bekannten" Befehle zu zählen und nur bei mehr als 2 bekannten Worten in die Auswertung überzugehen.
    Also "Licht an": 2 Treffer -> weiter
    "Das Wohnzimmer ist schön": 1 Treffer -> nicht weiter
    "Wohnzimmer an: 2 Treffer -> weiter

    Dürfte - so mal schnell drüber nachgedacht - auch nicht allzu viele falschinterpretationen erzeugen.

    Gruß
    Thorsten

    BTW: Die iOS 5.1 beta ist gerade erschienen... mal schauen ob damit der Proxy noch funktioniert...

    Einen Kommentar schreiben:


  • 2ndsky
    antwortet
    Wenn es nicht gleich ein komplexer Algorithmus werden soll, der kontextbezogene Informationen verarbeiten kann hätte ich da eine Idee. Wenn man die Befehle analysiert, sieht man schnell, dass sie immer einen ähnlichen Aufbau haben.

    <<Raum>> <<Gewerk>> <<Aktion>>

    Daher würde ich eine Liste mit Räumen, Gewerken und Aktionen erstellen. Jeden Befehl parsen um die einzelnen Bestandteile zu extrahieren. Wenn ein Bestandteil fehlt, also z.B. nur "Licht an" gesprochen wird, kann man gezielt nach dem Raum Fragen bzw. "Wohnzimmer Licht" fragt entsprechend "Was soll ich damit machen?" oder sowas. Problem hierbei, es muss eine Unterscheidung zwischen KNX Steuerbefehlen und sonstigen Befehlen erfolgen. Ich würde daher ein Magic Keyword einführen. Ist dieses im Befehl enthalten verrichtet der Proxy seine arbeit, wenn nicht wird die Anfrage normal von Siri beantwortet. Hier mal in Pseudocode:

    Code:
    var rooms = { "Wohnzimmer", "Schlafzimmer", "Küche" ... }
    var crafts = { "Licht", "Jalousie", "Rolladen", "Steckdose" ... }
    var actions = { "an", "aus", "hell", "dunkel", "auf", "ab" ... }
    var keyword = "computer"
    
    var parts = String.split(command);
    
    if parts contains keyword then
      var room
      var craft
      var action
    
      foreach part in parts
        if rooms contains part
          room = part
        if crafts contains part
          craft = part
        if actions contains part
          action = part
    
      if room is null
        // abfrage raum
    
      else if craft is null
        // abfrage gewerk
    
      else if action is null
        // abfrage aktion
    
      else
        // führe Aktion action für Gewerk craft in Raum room aus
    
    else
      normal siri processing
    Mit ein bißchen Hirnschmalz könnte man dem Parser auch noch variable Aktionen wie "Licht auf x Prozent" beibringen, ebenso wie man mehrere Räume leicht umsetzen könnte, also "Wohnzimmer und Küche Jalousien ab". Durch das Parsen müssten die Befehle auch nicht mehr genau gesprochen werden. Es würde reichen zu sagen: "kannst du bitte das Licht im Wohnzimmer auf 75 Prozent Helligkeit anmachen". Daraus würde dann nur "Licht", "Wohnzimmer" und "75 Prozent" herausgelesen und ausgeführt. Voraussetzung, dass das funktioniert, ist aber ein Schlüsselwort, das in jedem Befehl vorkommen muss.

    Einen Kommentar schreiben:


  • ThorstenGehrig
    antwortet
    Hi
    @Berliner: ja... das haben wir auch schon gefunden ;-)
    (darin furwerken wir gerade rum... bequemer als ein neues Plugin anzulegen).
    Die Plugins für Twitter oder XMBC sind da deutlich schwerer zu lesen

    @RalMue: danke für das Beispiel.
    Die Frage ist: wie macht man das er NUR Fragt wenn man keinen Raum angegeben hat? Und wenn man einen Raum angegeben hat - direkt einschaltet. Mit statischen "listen for" anweisungen ist das sicherlich nur suboptimal zu lösen (jede mögliche variante abfangen...).
    Da müsste man schon "listen for licht", dann auswerten ob (irgendwo im satz) ein Raum angegeben wird - wenn nicht: nachfragen und auswerten ob "ein, an, aktivieren, hell" bzw "aus, deaktivieren, dunkel" gesagt wurde (sonst fragen: an oder aus?).

    Ich denke das "request completed" darf erst kommen wenn man alles hinterfragt hat, oder?
    => DAS sind für mich die spannenden Fragen... (bisher war "nur" das bereits existierende selbst zum fliegen zu bekommen)

    Gruß
    Thorsten

    Einen Kommentar schreiben:


  • Berliner
    antwortet
    Hier gibts jede Menge Erläuterungen und Tipps, auch zu geschachtelten Abfragen usw..

    Code:
    require 'cora'
    require 'siri_objects'
    
    #######
    # This is a "hello world" style plugin. It simply intercepts the phrase "text siri proxy" and responds
    # with a message about the proxy being up and running (along with a couple other core features). This 
    # is good base code for other plugins.
    # 
    # Remember to add other plugins to the "config.yml" file if you create them!
    ######
    
    class SiriProxy::Plugin::Example < SiriProxy::Plugin
      def initialize(config)
        #if you have custom configuration options, process them here!
      end
    
      listen_for /test siri proxy/i do
        say "Siri Proxy is up and running!" #say something to the user!
        
        request_completed #always complete your request! Otherwise the phone will "spin" at the user!
      end
    
      #demonstrate state change
      listen_for /siri proxy test state/i do
        set_state :some_state #set a state... this is useful when you want to change how you respond after certain conditions are met!
        say "I set the state, try saying 'confirm state change'"
        
        request_completed #always complete your request! Otherwise the phone will "spin" at the user!
      end
      
      listen_for /confirm state change/i, within_state: :some_state do #this only gets processed if you're within the :some_state state!
        say "State change works fine!"
        set_state nil #clear out the state!
        
        request_completed #always complete your request! Otherwise the phone will "spin" at the user!
      end
      
      #demonstrate asking a question
      listen_for /siri proxy test question/i do
        response = ask "Is this thing working?" #ask the user for something
        
        if(response =~ /yes/i) #process their response
          say "Great!" 
        else
          say "You could have just said 'yes'!"
        end
        
        request_completed #always complete your request! Otherwise the phone will "spin" at the user!
      end
      
      #demonstrate capturing data from the user (e.x. "Siri proxy number 15")
      listen_for /siri proxy number ([0-9,]*[0-9])/i do |number|
        say "Detected number: #{number}"
        
        request_completed #always complete your request! Otherwise the phone will "spin" at the user!
      end
      
      #demonstrate injection of more complex objects without shortcut methods.
      listen_for /test map/i do
        add_views = SiriAddViews.new
        add_views.make_root(last_ref_id)
        map_snippet = SiriMapItemSnippet.new
        map_snippet.items << SiriMapItem.new
        utterance = SiriAssistantUtteranceView.new("Testing map injection!")
        add_views.views << utterance
        add_views.views << map_snippet
        
        #you can also do "send_object object, target: :guzzoni" in order to send an object to guzzoni
        send_object add_views #send_object takes a hash or a SiriObject object
        
        request_completed #always complete your request! Otherwise the phone will "spin" at the user!
      end
    end
    FIndet sich im Verzeichnis plugins/siriproxy-example/lib..

    Einen Kommentar schreiben:


  • RalMue
    antwortet
    @Thorsten: Hier ist mal was ich jetzt mal schnell gebastelt habe. Ein einfacher Dialog lässt sich ja so recht gut bauen. Habe das bis jetzt einfach in der siriproxy-example.rb

    Code:
     
       #Kombination mit Frage welches Licht
      listen_for /Schalte das Licht an/i do
        response = ask "In welchem Zimmer soll das Licht angeschalten werden?" #ask the user for something
    
    	room = case response
    	   	when "Wohnzimmer " then 
    			#Anweisungscode
    			say "Das Wohnzimmerlicht ist an"
       		when "Schlafzimmer " then 
    	   		#Anweisungscode 
    			say "Das Schlafzimmerlicht ist an"
    		else say "Dieser Raum existiert nicht!"
    	end
        request_completed #always complete your request! Otherwise the phone will "spin" at the user!
      end
    Grüße

    Einen Kommentar schreiben:


  • RalMue
    antwortet
    Hallo,

    danke schonmal für die Antworten. Bei mir scheint es an der Verbindung Mac zu guzzoni.apple.com zu liegen. Zertifikat ist auf dem iPhone, iPhone hat DNS entsprechend auf Mac umgebogen. Starte ich Siri sehe ich im Terminal auch die Meldungen

    Code:
    Create server for iPhone connection
    start conn #<SiriProxy::Connection::Iphone:0x007fdce21ee918 @signature=7, @processed_headers=false, @output_buffer="", @input_buffer="", @unzipped_input="", @unzipped_output="", @unzip_stream=#<Zlib::Inflate:0x007fdce21e8068>, @zip_stream=#<Zlib::Deflate:0x007fdce21e82c0>, @consumed_ace=false, @name="iPhone", @ssled=false>
    Dann ist aber Feierabend, Siri sagt es gibt keine Verbindung zum Internet. Dnsmasq ist nach den gängigen Tutorien konfiguriert und gestartet.

    Danke & Grüße

    -----

    Edit: Es funktioniert. DNSMasq neu installiert und konfiguriert und neue Zertifikate erzeugt. Super, dann mal weiter :-) Danke für die Hilfe!

    Einen Kommentar schreiben:


  • ThorstenGehrig
    antwortet
    So - Upload fertig.
    Wer das VM Image möchte: mail an Thorsten@Gehrig.info

    Gruß
    Thorsten

    Einen Kommentar schreiben:


  • ThorstenGehrig
    antwortet
    Hi
    also mit KNX kannst du wunderbar mit dem HS und Wago sprechen...
    Stabil, standard-Debugmechanissmen funktionieren usw. usf. :-)
    Aber jeder wie er will ;-)

    Was mich jetzt interessiert: wie baut man am besten die Plugins für unseren Zweck.
    Einfache Befehle sind ja leicht - aber ein bisschen intelligenz...
    Sowas wie an/einschalten/hell haben die selbe bedeutung
    aus/dunkel/auschalten
    hoch,öffnen
    runter, schliessen
    Rolladen/jalousie
    Licht/beleuchtung

    und wenn angaben fehlen (z.b. welcher raum) nachfragen...

    Gruß
    Thorsten

    Einen Kommentar schreiben:


  • muerlemann
    antwortet
    Hallo.
    @RalMue: Das Problem bei mir war die umsetzung von guzzoni.apple.com auf die IP des Proxys. Hab nun in der Firewall eingetragen, dass alles was an guzzoni.apple.com geht an den Proxy weitergeleitet wird. Und dann funktioniert es. Sogar über VPN!!

    @Thorsten: Sorry zu spät gesehen. War grad dabei eibd zu installieren.
    UDP oder TCP befehle wären aber trotz dem interessant.... gerade um HS, WAGO, CRESTRON, usw. anzusteuern.

    Einen Kommentar schreiben:


  • ThorstenGehrig
    antwortet
    So - knapp 500 MB ist das Image groß (nicht optimiert auf größe ).
    Upload läuft.
    Gruß
    Thorsten

    Einen Kommentar schreiben:


  • ThorstenGehrig
    antwortet
    Hi
    für alle die "scharf" drauf sind: ich bin gerade dabei eine VM aufzusetzen.
    Ein Debian Squeeze minimalinstallation mit dem Siri-Proxy und dem eibd.
    Ich habe KEINEN dnsMasq installiert.
    Man sollte wissen:
    • wie man seinen dns (guzzoni.apple.com) auf die VM umbiegt.
    • wie man Debian oder ein Linux halbwegs bedient
    • wie man eibd / groupswrite / groupwrite bedient

    Falls man das nicht weiß - bitte an anderer stelle suchen (Google ist dein Freund).

    Dürfte in ein paar "Minuten" Fertig sein.
    Bitte per eMail (thorsten@gehrig.info) info wer interesse hat - ABER: gewünscht ist
    a) Feedback
    b) Bastelwille an den Scripts - auch mit Feedback

    Gruß
    Thorsten

    Nachtrag:
    hier die Basics für die VM
    root-passwort ist "siri"
    starten des Proxy
    su rubyuser
    cd /home/rubyuser/siri-proxy/plamoni-SiriProxy-5982ab6/
    rvm use 1.9.3
    rvmsudo ruby start.rb

    Und nicht vergessen: das ca.pem (aus /home/rubyuser/siri-proxy/plamoni-SiriProxy-5982ab6/ca.pem) auf dem iPhone installieren

    @RalMue: hast du das Zertifikat auf dem iPhone installiert? Dnsmasq passend? Die änderung des DNS auf die IP (wie oben beschrieben)?

    Einen Kommentar schreiben:


  • RalMue
    antwortet
    Hallo zusammen,

    ich habe das gleiche Problem wie muerlemann. Alles läuft, nur die Verbindung zum Apple Server scheint über den Proxy nicht zu gehen.

    Kann mir jemand weiterhelfen?

    Danke & Grüße,

    Ralph

    Einen Kommentar schreiben:


  • ThorstenGehrig
    antwortet
    Hi
    @Muerlemann: wollte gerade deine Mails beantworten... hat sich ja jetzt erledigt :-)
    Kannst du die VM Sharen? (wollte auch gerade anfangen eine zu bauen!).
    Kommunikation zum HS über TCP/UDP????
    Warum nimmst du kein eibd? Das ist für mich der richtige Weg um mit dem HS - oder auch direkt mit allen Komponenten zu kommunizieren!

    Ein eibd ist bei Debian auch schnell aufgesetzt...

    @StefanW: ups?? Zensur bei uns?? (so schlimm war deine Mail in meinen Augen nicht...)

    @Berliner: nö - openwrt wird wohl nicht die richtige Plattform für Ruby sein. Sicherlich könnte man einen Proxy (in c# oder was auch immer) für den openwrt compilieren - nur macht das wohl gerade keiner. Eine VM (mit minimalanforderungen) kriegt man doch aber schnell mal auf jeder Plattform ans laufen.

    Gruß
    Thorsten

    Einen Kommentar schreiben:


  • muerlemann
    antwortet
    Hallo!
    Bin gerade dabei eine Kommunikation zu HS aufzubauen.
    Über TCP oder UDP Befehle.
    Hat einer ne Idee wie der Sript zum öffnen der Verbindung aussehen muss?

    Einen Kommentar schreiben:


  • muerlemann
    antwortet
    Ich muss jetzt auch Jubeln!!

    :-)

    Hab's bei mir auf ner Linux VM aufgesetzt.
    Funktioniert einwandfrei!

    @Thorsten: lag alles nur am Netzwerk.
    Danke für die Hilfe!

    Einen Kommentar schreiben:

Lädt...
X