Så här skickar du röstmeddelanden till Sonos-högtalare

Så här skickar du röstmeddelanden till Sonos-högtalare / Smart hem

Drömmen om någon smart hementusiast är ett hem du kan prata med, men verkligheten är långt ifrån det.

Amazon Echo, till exempel, låter dig använda alla typer av röststyrda funktioner, men dialog måste initieras av dig med en fråga - du kan inte bara få henne att meddela ett viktigt budskap.

Du kan gör detta med ett Sonos-system men, och lite DIY Raspberry Pi magi. Idag visar jag dig hur du sätter upp röstmeddelanden på ditt Sonos-system, introducerar ett par användbara IFTTT-recept, OpenHAB-integreringar och mer, för att utnyttja anmälningsfunktionen.

Observera att det finns en naturlig Sonos-bindning för OpenHAB, men det är känt att det orsakar minnesproblem på grund av ett felaktigt uPnP-bibliotek. Jag föreslår att du hoppar över det för nu och använder metoden i den här handledningen istället.

En Raspberry Pi som kör Raspian Linux är idealisk för den här handledningen, men den ska också fungera på alla Linux-baserade hemmeserier som du har kört. I det här fallet använder jag samma Raspberry Pi som kör OpenHAB, open source hemautomationssystem Komma igång med OpenHAB Hemautomatisering på Raspberry Pi Komma igång med OpenHAB Hemautomatisering på Raspberry Pi OpenHAB är en mogen, öppen källkodsautomatiseringsplattform som körs på en mängd olika hårdvaror och är protokoll agnostic, vilket innebär att det kan anslutas till nästan vilken hemautomatiseringsutrustning som helst på marknaden idag. Läs mer . Resten av denna handledning förutsätter att du även kör detta på en Raspberry Pi och antingen har ett lokalt terminalfönster öppet på skrivbordet, eller är inloggad på distans med SSH. Ställa in din Raspberry Pi för huvudlös användning med SSH. Raspberry Pi för huvudlös användning med SSH Raspberry Pi kan acceptera SSH-kommandon när den är ansluten till ett lokalt nätverk (antingen via Ethernet eller Wi-Fi), så att du enkelt kan konfigurera det. Fördelarna med SSH går utöver att störa den dagliga skärningen ... Läs mer .

Du kommer att behöva

  • Raspberry Pi 2 (äldre modeller ska fungera, men kontrollera efter specifika ändringar i instruktionerna)
  • Minst en Sonos-högtalare (andra ljudsystem stöds inte, det här är en handledning för Sonos)
  • Gratis konto på VoiceRSS.org. Registrera sedan hitta din API-nyckel, som vi behöver senare för att generera röstmeddelandena.

Installera noden senaste

Kontrollera vilken version av nod du har genom att skriva:

nod -v 

Observera att version 6 inte stöds. Om du har Node 6 ska du först ta bort den och följ sedan instruktionerna nedan för att installera v5.5.

Om du inte har v5 eller om du inte hittar ett fel, följ dessa anvisningar för att installera nod. Följande kommando förutsätter en Raspberry Pi 2; För äldre modeller, använd armv6l istället för armv7l.

wget https://nodejs.org/download/release/latest-v5.x/node-v5.12.0-linux-armv7l.tar.gz tar -xvf node-v5.12.0-linux-armv7l.tar.gz cd-nod -v5.12.0-linux-armv7l sudo cp -R * / usr / local 

Bekräfta igen genom att skriva:

nod -v

Och du borde se v5.12 (eller det senaste var det du hämtade).

Därefter har vi några Node-moduler att installera. Vi vill också ha Node Package Manager.

sudo apt-get install npm sudo npm installera -g npm sudo npm installera -g node-gyp 

Det är förutbestämmelserna ur vägen, nu på de roliga grejerna.

Sonos HTTP API

Sonos HTTP API skapar en webbserver på det lokala nätverket, vilket gör det möjligt för oss att pinga en URL med ett meddelande för att annonsera på en Sonos (och för att styra den på distans om du vill, men den här handledningen fokuserar bara på röstmeddelandeaspekten).

git klon https://github.com/jishi/node-sonos-http-api.git sonos cd sonos npm installera --produktion npm starta 

Om du ser ett meddelande om en sådan modul hittades inte, gör bara en annan npm installera och modulnamnet, försök sedan npm start igen. Om du upplever fel relaterade till “kräver en C ++ 11 kompilator”, fixa med följande kommandon:

sudo apt-get install gcc-4.8 g ++ - 4.8 sudo uppdateringsalternativ - installera / usr / bin / gccgcc / usr / bin / gcc-4.6 20 sudo uppdateringsalternativ - installera / usr / bin / gcc gcc / usr / bin / gcc-4.8 50 sudo uppdateringsalternativ - installera / usr / bin / g ++ g ++ /usr/bin/g++-4.6 20 sudo uppdateringsalternativ - installera / usr / bin / g ++ g ++ / usr / bin / g ++ - 4,8 50 

Så småningom borde du se något så här:

Servern är nu igång, gränsar till Sonos. Formatet för detta API är enkelt:

http: // [SERVER IP]: 5005 / [ROOM NAME] / [ACTION]

Eller som ett specifikt exempel:

http://192.168.1.99:5005/kitchen/playlist/chillout

Åtgärden vi är intresserade av är “säga” kommando, används enligt följande:

http://192.168.1.99:5005/kitchen/say/make%20use%20of%20is%20awesome/en-gb

Du hör ett felmeddelande om att du måste registrera dig på en API-nyckel på VoiceRSS.org. Du borde redan ha gjort det här, skriv ut följande och klistra in i din API-nyckel som appropirate:

nano settings.json
 "voicerss": "YOURAPIKEY"

(Hit CTRL-X, Y, för att spara filen)

Starta om servern och pinga URL-adressen igen. Efter några sekunder borde du höra en härlig engelsk röst (även om du ändrar slutet på webbadressen till en-us om du hellre vill). För att starta Sonos HTTP API-servern igen när Pi startas om:

sudo nano /etc/rc.local

Lägg till en rad före utgång 0:

sudo nod /home/pi/sonos/server.js < /dev/null &

Du har nu möjlighet att skapa ett röstmeddelande från var som helst på det lokala nätverket helt enkelt genom att pinga en webbadress, så möjligheterna är öppna vid den här tiden. Om du kämpar för idéer, läs vidare om några användbara meddelanden som jag har satt upp.

OpenHAB-meddelanden om händelser

Låt oss ta ett enkelt exempel först: rörelsedetektering. Detta är ett vanligt användningsfall för att aktivera ljus, men du kanske vill ha en röstmeddelande också om det är en rörelsessensor i ett område med låg trafik eller kanske som en advarsel om att någon kommer upp på trädgården.

regel "Garden motion detected" när Item Garden_Motion ändras sedan var String message = "Du har en besökare" sendHttpGetRequest ("http: // localhost: 5005 / kitchen / say /" + message.encode ("UTF-8") + / en-gb ") slutet 

Du bör se hur du kan integrera dessa enkla röstmeddelanden till någon av dina regler, men låt oss försöka något lite mer komplext.

Daglig väderrapport från IFTTT till OpenHAB till Sonos

I detta recept får vi Sonos tillkännage en daglig väderleksrapport vid din föredragna tid.

Du behöver My.OpenHAB-bindningen aktiverad eftersom det här skapar en säker anslutning mellan din interna OpenHAB-server och den externa IFTTT-tjänsten. Sätta upp det om du inte redan har det - du kan hänvisa till del 1 i vår OpenHAB-guide Komma igång med OpenHABs hemautomation på Raspberry Pi Komma igång med OpenHAB Hemautomation på Raspberry Pi OpenHAB är en mogen, öppen källkodsautomatiseringsplattform som körs på en mängd olika hårdvaror och är protokoll agnostic, vilket innebär att den kan ansluta till nästan vilken hemautomatiseringsutrustning som helst på marknaden idag. Läs mer för fullständiga instruktioner, annars antar du att du redan har den inställd med uthållighet aktiverad för alla objekt.

Skapa sedan ett nytt String-objekt i din OpenHAB-installation, som lagrar den dagliga väderrapporteringen. Innan det här syns i My.OpenHAB-kanalen måste vi initiera den med en viss standardvariabel. Ping följande URL (ändra raspberrypi.local till din OpenHAB-server, eller använd bara den IP-adressen och Dagens väder till vad du än namngav strängen):

http: //raspberrypi.local: 8080 / CMD Todays_Weather = Sunny 

Logga in på My.OpenHAB och kolla på artiklar lista för att säkerställa att variabeln nu har exporterats.

Tillbaka på IFTTT, skapa ett nytt recept och använd Väderkanalen som utlösare på din föredragna tidpunkt. Du måste ange din plats först om du aldrig använt den tidigare.

Välj My.OpenHAB som åtgärd, och välj Todays_Weather som variabel för att uppdatera.

För nu, välj bara nästa halvtimme för testning - du kan uppdatera receptet senare när du vet att det fungerar.

Visst nog, vid testtiden (faktiskt lite tidigare) fick jag dagens prognos uppdaterad med framgång.

2016-02-27 10: 28: 01.689 [DEBUG] [o.o.i.m.i.MyOpenHABServiceImpl] - Mottaget kommando Övervägande molnigt idag! Med en hög av 7C och en låg av 1C. Upprepa. Villkoren kommer att vara Överväxlande idag, med högt 7C och lågt på 1C. för föremål Todays_Weather 2016-02-27 10: 28: 01.697 [DEBUG] [o.o.i.m.i.MyOpenHABServiceImpl] - butik (Todays_Weather), state = Övervägande idag! Med en hög av 7C och en låg av 1C. Upprepa. Villkoren kommer att vara Överväxlande idag, med högt 7C och lågt på 1C. 

Därefter behöver vi en OpenHAB-regel för att skicka denna variabel till Sonos “säga” URL. Följande bör göra det:

regel "Meddela dagliga väderleksrapport" när objektet Todays_Weather mottog uppdatering och skicka sedanHttpGetRequest ("http: // localhost: 5005 / kitchen / say /" + Todays_Weather.state.toString.encode ("UTF-8") + "/ sv-gb ") slutet 

Detta är enkelt nog: när variabeln Todays_Weather uppdateras (vilken kommer den automatiskt, klockan 8 på varje dag), pingadressen. Vi använder koda(“UTF-8”) String funktion för att göra meningen från IFTTT lämplig för användning i en URL. För att manuellt testa den här delen av systemet, använd bara OpenHAB HTTP API igen:

http: //raspberrypi.local: 8080 / CMD? Todays_Weather = Molnigt, med chans att köttbullar. 

Anslut till IFTTT utan OpenHAB, Använd If-This-Then-Node

Slutligen, låt oss titta på hur man ansluter från något IFTTT-recept utan OpenHAB-förmedlaren. I stället installerar vi en annan webbserver och exponerar det för det öppna Internetet. Det här är inte utan risk: någon form av öppen server är en säkerhetsrisk, men vi mildrar detta genom att inte köra en komplett server stack, bara en liten specifik tjänst som bara accepterar vissa kommandon i ett säkert JSON datapaketformat (så nej SQL-injektion eller autentiseringsattacker är möjliga). När vi är klara har du en allmän webbadress där du kan skicka meddelanden från IFTTT Maker-kanalen.

Börja med att konfigurera en av de många kostnadsfria, dynamiska DNS-tjänsterna. 5 Bästa dynamiska DNS-leverantörer som du kan leta efter gratis idag. 5 Bästa dynamiska DNS-leverantörer som du kan leta efter gratis idag. DynDNS var alltid ett toppnämnande när gratis dynamiska DNS-filer togs upp. Men nu är det borta, finns det några bra alternativ? Det är säkert. Läs mer där ute - Jag rekommenderar DuckDNS, speciellt för att det ger en enkel uppsättning instruktioner för Raspberry Pi, så att den kan uppdatera din IP-adddress automatiskt. Följ med dessa och kom ihåg din webbadress för nästa steg. Din router kan också ha en dynamisk DNS-funktion inbyggd, så kontrollera det först. I mitt fall kan jag få en * .mynetgear.com URL gratis, så jag har använt det.

Nästa, hitta din router port vidarebefordran Vad är port vidarebefordran och hur kan det hjälpa mig? [MakeUseOf Explains] Vad är port vidarebefordran och hur kan det hjälpa mig? [MakeUseOf Explains] Skriker du lite inuti när någon säger att det finns ett portproblem och det är därför att din glänsande nya app inte fungerar? Din Xbox låter dig inte spela spel, dina torrentladdningar vägrar ... Läs mer konfigurationssida; Det är här vi ska berätta vad vi ska göra med inkommande förfrågningar. Vidarebefordra alla HTTP-förfrågningar (port 80) till port 1337 på din Raspberry Pi-server. Jag antar att du har en IP-adress som redan är reserverad för din Raspberry Pi - om du inte har det, kolla din routers konfigurationssida för reserverade IP-adresser medan du är där, eftersom du inte ändrar nästa vecka och för servern att plötsligt sluta fungera.

Nu installerar du den sista biten av serverns programvara.

https://github.com/sebauer/if-this-then-node.git cd om-detta-då-nod / npm installationsnod server.js 

Du bör se följande.

Det är okej, det betyder bara att vi behöver uppdatera våra uppgifter. Öppna config.js i Nano och redigera dessa detaljer till något annat än standard, spara sedan. När du kör servern igen bör du se detta:

Bra. Testa din maskin är tillgänglig från omvärlden genom att skriva in ditt dynamiska DNS-värdnamn och lägga till /ifttn / till slutet av webbadressen. Om allt fungerar, meddelandet “IFTTN-if-this-then-node Version 2.0.1 är igång!” kommer att visas i din webbläsare. Återigen, för att göra det här skriptet köra vid start, redigera /etc/rc.local fil och lägg till:

sudo nod /home/pi/if-this-then-node/server.js < /dev/null &

Om-This-Then-Node fungerar via plugins - det finns några standardleveranser, men det är inte av intresse för oss. Istället hämtar du den här anpassade plugin som jag har skrivit för dig med följande kommandon.

cd-plugins wget https://gist.githubusercontent.com/jamesabruce/4af8db24ba3452b94877/raw/d11c1cff3aa44dbb6a738eeb15202f3db461de75/sonos.js 

Du måste också installera begäran modul.

npm installationsförfrågan 

Starta om servern igen. Pluggen är ganska enkel, men lite annorlunda än den URL som vi hittills använt. I det här fallet har jag använt specialen “sayall” åtgärd som skickar meddelandet till varje Sonos-enhet.

begäran ('http: // localhost: 5005 / sayall /' + params.message + '/ en-gb', funktion (fel, svar, kropp) 

Om du hellre skulle kunna rikta in specifika enheter ersätter du den här raden med:

begäran ('http: // localhost: 5005 /' + params.device + '/ say /' + params.message + '/ en-gb', funktion (fel, svar, kropp) 

Lägg till en annan radparameter som heter anordning till JSON-förfrågan nedan för att ange Sonos-enhetens namn.

För att testa detta ut använder jag IFTTT “Do” knapp app. Skapa ett nytt recept, bläddra till kanaler och välj Tillverkare kanalisera.

Skapa ett nytt recept. Ange i webbadressen du konfigurerat tidigare från en kostnadsfri, dynamisk DNS-leverantör (inklusive / Ifttn / i slutet av webbadressen. Glöm inte dessa snedstreck). Välj POSTA begäran, application / json innehåll och meddelandets kropp enligt följande, ersätta alla variabler efter behov med de som du tidigare konfigurerat:

"action": "sonos", "user": "YOURUSER", "pw": "YOURPASSWORD", "message": "Inkommande meddelande till alla: Middag är klart! Upprepa. Middag är klart. ."  

Nu har jag en lättillgänglig knapp som meddelar meddelandet på varje Sonos-enhet i huset. Du kan självklart koppla det här med vilken IFTTT-kanal du vill göra ett anpassat meddelande med hjälp av variabler från den kanalen. Du bör även kunna replikera väderrapporterna ovanifrån utan att använda OpenHAB nu, men det tog extra ansträngning att installera en annan server.

Obs! Hackare kommer automatiskt att skanna dig. Detta händer hela tiden, men om du tittar på loggar kan det verka alarmerande. Nedan ser du att någon systematiskt försökte kontrollera om någon av de vanliga PHPMyAdmin-gränssnitten var tillgänglig. Vilket de inte var. Var inte orolig om du ser något liknande. Det är internetets motsvarighet till kalla kalla telefonnummer för att se om någon är där.

Vad kommer du att meddela?

Du borde nu ha verktygen och kwowledge att hela tiden bada hela ditt hus i röstmeddelanden om allt du kan tänka dig. Vem behöver musik? Din enda gräns är 350 dagliga förfrågningar från VoiceRSS.org - men det handlar om ungefär var 4: e minut, så du borde vara bra.

Så vad ska du göra med detta? Dela dina idéer eller IFTTT-recept i kommentarerna!

Bildkrediter: kaffe och kvinna av S_Photo via Shutterstock

Utforska mer om: Hemautomatisering, Sonos.