Liebe Leserinnen und Leser!
Heute möchte ich euch zeigen, wie ihr die „Voice Control“-App um einige Funktionen erweitern könnt. Damit könnt ihr euch im Prinzip ein eigenes Siri-System für Android basteln. Als Server dient mir hier wieder der Raspberry Pi, auf dem ich das PHP-Backend des Systems bereits installiert habe.
Als Erweiterungsbeispiele zeige ich euch hier, wie ihr Wetterdaten über die Yahoo-Wetter-API abfragen könnt und die aktuelle Temperatur des Raspberry Pi über Sprache erfragen und ausgeben könnt. Es lässt sich natürlich noch viel mehr mit dieser App machen, die Funktionen lassen sich beliebig erweitern. Die folgenden Beispiele sollen ein Anstoß sein, eigene Plugins für die Anwendung zu entwickeln. Gerne könnt ihr mir eure eigenen Erweiterungen auch zukommen lassen, sodass sie hier veröffentlicht werden.
Nun aber zum ersten Beispiel ;)
Wetter-Plugin (via Yahoo-Weather-API)
Zur Nutzung der Yahoo-Weather-API habe ich ein kleines Python-Script geschrieben, das mit ein paar aktuelle Wetterdaten zurückgibt. Was ihr euch genau ausgeben lassen wollt und über welche Befehle, ist euch überlassen. Ich habe mir mal einen Satz ausgeben lassen, der die aktuelle Temperatur, Windgeschwindigkeit und Luftfeuchtigkeit ausgibt. Diese Daten werden beim Absenden des Befehls direkt von der Yahoo-Weather-API ausgelesen. In der Variable „url“ müsst ihr noch die WOEID eures Ortes eintragen. Diese kann man z.B. hier ermitteln. Ich habe das Script mal etwas kommentiert, es sollte allerdings nicht allzu schwer verständlich sein, da es sich im Prinzip nur um ein Script handelt, das eine XML-Datei parst und bestimmte Werte in einem string zurückgibt. Wie ihr sicher selbst feststellt, habe ich nicht alle Dinge aus der Wetter-API von Yahoo ausgelesen und auch nicht alle ausgelesenen Werte bei dem zurückgegebenen Satz verwendet. Das liegt daran, dass ich das Script ursprünglich nur zum Test der Wetter-API geschrieben habe, mir aber dann eingefallen ist, dass es sich auch ganz nett in das „Voice Control“-System einfügen lässt. Ich habe diese Dinge mal drinnen gelassen, damit ihr es einfacher an eure eigenen Bedürfnisse anpassen könnt. Hier also das Python-Script für die Yahoo-Wetter-API:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | # -*- coding: utf-8 -*- import urllib2 from xml.dom.minidom import parseString url = 'http://weather.yahooapis.com/forecastrss?w=xxxxxx&u=c' req = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"}) file = urllib2.urlopen( req ) data = file.read() file.close() dom = parseString(data) ###Doing stuff with condition-element### ylist_condition = dom.getElementsByTagName("yweather:condition") yref_cond = ylist_condition[0] ##Read out temperature## temp = yref_cond.attributes["temp"] temperature = temp.value ##Read out condition-code## ccode = yref_cond.attributes["code"] condition = ccode.value ###Doing stuff with astronomy-element### ylist_astronomy = dom.getElementsByTagName("yweather:astronomy") yref_astro = ylist_astronomy[0] ##Read out sunrise## srise = yref_astro.attributes["sunrise"] sunrise = srise.value ##Read out sunset## sset = yref_astro.attributes["sunset"] sunset = sset.value ###Doing stuff with atmosphere-element### ylist_atmosphere = dom.getElementsByTagName("yweather:atmosphere") yref_atmo = ylist_atmosphere[0] ##Read out humidity## hum = yref_atmo.attributes["humidity"] humidity = hum.value ###Doing stuff with wind-element### ylist_wind = dom.getElementsByTagName("yweather:wind") yref_wi = ylist_wind[0] ##Read out speed## spd = yref_wi.attributes["speed"] speed = spd.value speed_comma = speed.replace(".",",") text = "Die aktuelle Temperatur liegt bei "+str(temperature)+" Grad Celsius bei einer Windgeschwindigkeit von "+str(speed_comma)+" Kilometern pro Stunde und einer Luftfeuchtigkeit von "+str(humidity)+" Prozent" print text |
Folgendes müsst ihr zur Benutzung des Scripts in dem Voice-Control-System in der dazugehörigen detect.php noch einfügen:
1 2 3 | if ($results == "wie ist das wetter"){ echo exec("python /media/usbstick/weather/yahoo_weather.py"); } |
Natürlich an dieser Stelle nicht vergessen, den Pfad entsprechend zu ändern, damit das Script auch von der Sprachsteuerung gefunden werden kann.
Nun zum nächsten Beispiel.
Rückgabe der aktuellen Temperatur des Raspberry Pi
Für dieses Beispiel braucht ihr kein Python-Script, es lässt sich rein in die detect.php einpflegen. Bekannterweise lässt die (CPU-) Temperatur des Raspberry Pi ganz leicht über die Konsole mit dem Befehl sudo vcgencmd measure_temp auslesen. Das zurückgelieferte Ergebnis muss natürlich zur Sprachrückgabe etwas „aufgehübscht“ werden, also das „temp“ am Anfang entfernt werden und die Grad-Celsius-Zeichen am Ende entfernt werden, dass nur noch die Zahl als solches übrigbleibt. Das lässt sich in PHP ganz einfach über die Funktion „substr“ erledigen. Anschließend sollte noch der Punkt zwischen den Zahlen durch ein Komma ersetzt werden, damit sich die Sprachrückgabe besser anhört (zumindest gefällt mir „Komma“ besser als „dot“). Als letztes könnt ihr um die Zahl noch einen schönen Satz bilden, der zurückgegeben wird. Bei mir kommt als Endresultat sowas wie „Meine Temperatur liegt gerade bei 35,9 Grad Celsius“ raus. Hier der dazugehörige PHP-Code, den ihr direkt in die detect.php einfügen könnt (unter die anderen Befehle / if-cases):
1 2 3 4 5 6 7 8 9 | if ($results == "wie ist deine temperatur"){ $temperature = substr(exec("sudo vcgencmd measure_temp"),5,-2); $temp_comma = str_replace(".",",",$temperature); $firstpart = "Meine Temperatur liegt gerade bei "; $lastpart = " Grad Celsius"; $middlepart = (string)$temp_comma; $output = $firstpart.$middlepart.$lastpart; echo $output; } |
Das waren jetzt mal 2 triviale Beispiele, die zeigen, wie ihr das System ganz einfach erweitern könnt. Ich hoffe, ich konnte sie verständlich erklären und euch die Funktionsweisen nahebringen. So könnt ihr das System nämlich selbstständig weiterentwickeln und um zahlreiche Funktionen ergänzen, je nachdem was euch euer Pi sagen soll.
Habt ihr Fragen oder Anregungen dazu? Immer her damit, die Kommentarfunktion gehört euch ;)
Super Ideen!
Die einfache Erweiterbarkeit macht das Projekt erst richtig interessant. Hab mit mit den Anleitungen hier gleich ein paar Python-Scripte zusammengebastelt, ging echt einfach.