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

    #46
    @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

    Kommentar


      #47
      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..

      Kommentar


        #48
        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
        Meine Inst.: 73 KNX-Geräte, 18 Rolläden, 36 Schaltkanäle, 22 Dimm-Kanäle, 12 Heizungskanäle, 16 PM, 18 Gruppentaster
        Wiregate: >50 x Temperaturfühler, 2 x Luftfeuchte, Transponderleser || Gira Homeserver: Visu: 98%, Logiken 98% || Heizung: Dimplex WP mit KNX || Sonstiges: 3xSqueezebox, Mobotix T24, Asterisk

        Kommentar


          #49
          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.
          Mit freundlichen Grüßen
          Niko Will

          Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
          - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

          Kommentar


            #50
            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...
            Meine Inst.: 73 KNX-Geräte, 18 Rolläden, 36 Schaltkanäle, 22 Dimm-Kanäle, 12 Heizungskanäle, 16 PM, 18 Gruppentaster
            Wiregate: >50 x Temperaturfühler, 2 x Luftfeuchte, Transponderleser || Gira Homeserver: Visu: 98%, Logiken 98% || Heizung: Dimplex WP mit KNX || Sonstiges: 3xSqueezebox, Mobotix T24, Asterisk

            Kommentar


              #51
              wenn man soviele Informationen aus dem Forum zieht wie ich, ist man froh auch etwas zurückgeben zu können. Würde mich ja gerne aktiver beteiligen, aber mangels 4s und Zeit geht das leider nicht.

              Der Ansatz mit mindestens zwei erkannten Wörtern wäre schon auch möglich, klar. Hängt halt auch maßgeblich davon ab, was will ich alles an Befehle verarbeiten und wie häufig kommen die in normalen Suchanfragen etc. vor. Aber die Umstellung auf ein Magic Keyword, falls man merkt, dass es häufig zu Fehlinterpretationen kommt, ist auch kein Problem mehr (wenn der Parser und der ganze Rest läuft).
              Mit freundlichen Grüßen
              Niko Will

              Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
              - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

              Kommentar


                #52
                Nur mal kurz laut gedacht am Beispiel Zimmerlicht:

                Wenn ich den Ausdruck per reguläre Ausdrücke etc. auf die eigentlich wichtigen Wörter im Satz (Wohnzimmer, Licht, an/aus) auswerte dann könnte ich schauen ob diese Wörter enthalten sind (wenn nicht nachfragen). Auch wäre es dann möglich "Schalte das Wohnzimmerlicht an" oder "Kannst du bitte das Wohnzimmerlicht anschalten" zu sagen.

                Das löst zwar noch nicht das Problem, dass "an" und "hell" das Gleiche ist, aber zumindest muss man den Befehl nicht wörtlich sagen und Siri kann nachfragen.

                Ich hab das nicht getestet, wäre nur mein Ansatz.

                Grüße

                Edit: Sehe gerade, das ist ein ähnlicher Ansatz wie 2ndsky. Aber in diese Richtung muss man weiterdenken :-)

                Kommentar


                  #53
                  jo, ist prinzipiell das selbe was ich meinte mit Befehle parsen. Wie die Befehle geparst werden hängt dabei von der masochistischen Veranlagung eines jeden einzelnen ab
                  Bevor ich mir reguläre Ausdrücke für diesen Anwendungsfall antue splitte ich lieber anhand des Leerzeichens und vergleiche jedes einzelne Wort mit dem möglichen Befehlssatz. Kommt ein neuer Befehl hinzu, musst du diesen nur in das Array einfügen und der Parser funktioniert weiterhin. Bei regulären Ausdrücken müsstest du diesen neuen Befehl in den Ausdruck packen. Aber, jeder wie er mag
                  Mit freundlichen Grüßen
                  Niko Will

                  Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
                  - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

                  Kommentar


                    #54
                    Zitat von 2ndsky Beitrag anzeigen
                    jo, ist prinzipiell das selbe was ich meinte mit Befehle parsen. Wie die Befehle geparst werden hängt dabei von der masochistischen Veranlagung eines jeden einzelnen ab
                    Bevor ich mir reguläre Ausdrücke für diesen Anwendungsfall antue splitte ich lieber anhand des Leerzeichens und vergleiche jedes einzelne Wort mit dem möglichen Befehlssatz. Kommt ein neuer Befehl hinzu, musst du diesen nur in das Array einfügen und der Parser funktioniert weiterhin. Bei regulären Ausdrücken müsstest du diesen neuen Befehl in den Ausdruck packen. Aber, jeder wie er mag
                    Jap, aber du könntest so auch "an" und "anschalten", "anmachen" etc. verarbeiten, da fehlt das Leerzeichen. Klar, das kann ins Array, aber das wird dann eventuell ja enorm.

                    Aber wie gesagt, in die Richtung muss es gehen, egal wie :-)

                    Kommentar


                      #55
                      Super, jetzt muss ich mir das iPhone 4S auch noch kaufen

                      Hoi

                      Grossen Respekt vor der Gemeinde.
                      Jetzt muss ich mir das iPhone 4s doch noch kaufen, mist, ich wollte eigentlich auf das 5'er warten. Ihr seid Schrecklich (guut).

                      Hoffentlich macht Apple uns keinen Riegel vor das Proxy-Spiel.
                      Naja wenn's die Umsatzzahlen antreibt und sonst keinen Schaden anrichtet würde ich ein Auge zu machen und die paar Spinner (ääh, Anwesende ausgenommen) durchaus mal machen lassen. (Wunschdenken)
                      Grüsse Bodo
                      Fragen gehören ins Forum, und nicht in mein Postfach;
                      EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

                      Kommentar


                        #56
                        Hi,
                        @Bodo: ich würde MINDESTENS mal warten ob die 5.1 (ist ja seit heute als Beta draußen) das noch zulässt.
                        Alternativ - falls du ein 4er hast - kannst du mal schauen was Sirius (der Cydia-Siri-Hack) für dein 4er so möglich macht...

                        @RalMue/2ndSky: auf das "pharsen" haben wir uns ja schonmal geeinigt :-)
                        Jetzt müsste beim Parsen eingentlich "nur" berücksichtigt werden das es für JEDEN Befehl/Gegenstand mehrere Begriffe gibt (=alle mit der gleichen Bedeutung).
                        Siri macht ja auch Wetter=Regenschirm=Regen=Regenmantel => alles ruft die Wettervorhersage auf... (da ist weniger "magie" dahiner als einem manchmal verkauft wird).
                        An=Anschalten=Anmachen=Hell=Heller=...
                        (wobei auch Heller = Dimmer+x% meinen könnte)
                        Aus=Auschalten=Ausmachen=Dunkel=Dunkler
                        Licht=Lampe=Beleuchtung="Funzel" ;-)
                        Rollladen=Jalousie=...
                        Hoch=Hochfahren=Auf=Öffnen
                        Runter=Schließen=Runterfahren=zu
                        Bad=Badezimmer=Klo=Nasszelle=....

                        Theoretisieren kann ich viel - leider brauche ich (mangels Programmierkentnisse) ein Grundgerüst.
                        Generell würde ich auch noch Sagen das bei Treffer >=2 oder Hotword=vorhanden die fehlenden parameter abgefragt werden sollten.

                        Ich glaub ich besuche mal einen Ruby-Schnellkurs ;-)

                        @An die VM-Nutzer: läuft die VM?

                        Gruß
                        Thorsten
                        Meine Inst.: 73 KNX-Geräte, 18 Rolläden, 36 Schaltkanäle, 22 Dimm-Kanäle, 12 Heizungskanäle, 16 PM, 18 Gruppentaster
                        Wiregate: >50 x Temperaturfühler, 2 x Luftfeuchte, Transponderleser || Gira Homeserver: Visu: 98%, Logiken 98% || Heizung: Dimplex WP mit KNX || Sonstiges: 3xSqueezebox, Mobotix T24, Asterisk

                        Kommentar


                          #57
                          VM läuft bei mir seit gestern Abend konstant durch.
                          Hab sie dann auf den ESX-Server aufgespielt.
                          War bisher immer erreichbar. Hab den Server auch nie neu gestartet.

                          Kommentar


                            #58
                            Hallo Thorsten,

                            läuft bei mir auch. Musste noch das keyboard layout anpassen
                            network config der VM läuft noch nicht (ist nicht sichtbar).

                            Zertifikat auf phone ist drauf, proxy gestartet.

                            config.yml noch nicht angepasst

                            Gruss
                            Marcel
                            seit: 11'08 KNX / 04'09 HS3 / 12'09 WG mit 21 Temp & 4 Feuchtesensoren / 10'10 Enocean mit 15 Fenstergriffe Hoppe / 02'11 MBus2Serial Gas-Wasserzähler
                            HS3: 99% / VISU: PV 99%, iPad 99%
                            60 Akt. Linie1 / 14 Akt. Linie2

                            Kommentar


                              #59
                              Hmm,

                              da die Apple Server von Siri eine Mischung aus Wahrscheinlichkeitsrechnung und Datenbank-Abfrage sein dürften, wird es wohl sehr schwer sowas ähnlich dem Wetter nachzubauen (Also "Ich will Licht hier" statt "Mach das Licht im Wohnzimmer an"). Das wird man wohl oder übel wo hinterlegen müssen, in einem Array bzw. besser in einer Datenbank.

                              Zudem hat Apple den Vorteil, dass Siri aus jeder Antwort lernt. Ich habe gelesen, dass sogar abgebrochene Befehle plus die folgenden ausgewertet werden, um sie effektiver zu machen.

                              Ich bin gerade dabei das mit einer Datenbank in Angriff zu nehmen, ich habe vor, da eine Liste mit Synonymen einzupflegen und dann das Matching darüber zu machen. Dürfte aber noch dauern, hoffentlich schalten die vorher den Server net um :-)

                              Kann man über diesen Siri Proxy auch auf die anderen Attribute zugreifen, die der Apple Server wohl zurück liefert? Habe da jetzt noch nichts gefunden. Anscheinend soll da noch der Timestamp aber auch, viel interessanter, die Wahrscheinlichkeit mit der das Wort erkannt wurde zurückgeliefert werden.

                              Kommentar


                                #60
                                Hi Marcel,

                                Zitat von marlan99 Beitrag anzeigen
                                Musste noch das keyboard layout anpassen
                                network config der VM läuft noch nicht (ist nicht sichtbar).

                                config.yml noch nicht angepasst
                                Die config.yml passt so wie sie ist - da ist nur das Demo-Script aktiv (in dem ich schon rumgefurwerkt habe).

                                Keyboard hatte ich nicht angepasst - ich kenne die US-Tastatur einigermaßen ;-) - bevor ich suchen muss: wie macht man das?

                                Und zur Netzwerk-Konfig: die war bei mir auf Bridgeing gestellt. Nat solltest du dafür nicht nehmen. Kann man eigentlich einstellen solange/wenn die VM nicht gestartet ist.

                                Gruß
                                Thorsten
                                Meine Inst.: 73 KNX-Geräte, 18 Rolläden, 36 Schaltkanäle, 22 Dimm-Kanäle, 12 Heizungskanäle, 16 PM, 18 Gruppentaster
                                Wiregate: >50 x Temperaturfühler, 2 x Luftfeuchte, Transponderleser || Gira Homeserver: Visu: 98%, Logiken 98% || Heizung: Dimplex WP mit KNX || Sonstiges: 3xSqueezebox, Mobotix T24, Asterisk

                                Kommentar

                                Lädt...
                                X