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

Idag visar jag dig hur du ställer in röstmeddelanden på ditt Sonos-system, med hjälp av IFTTT-recept, OpenHAB-integreringar och mer.

Idag visar jag dig hur du ställer in röstmeddelanden på ditt Sonos-system, med hjälp av IFTTT-recept, OpenHAB-integreringar och mer.
Annons

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 dock göra det med ett Sonos-system och lite DIY Raspberry Pi magic. 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 använda 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 den kan ansluta 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:

node -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 node-v5.12.0-linux-armv7l sudo cp -R * /usr/local 

Bekräfta igen genom att skriva:

 node -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 install -g npm sudo npm install -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 webbadress med ett meddelande för att meddela om en Sonos (och för att styra den på distans om du vill, men den här handledningen fokuserar bara på röstmeddelandeaspekten).

 git clone https://github.com/jishi/node-sonos-http-api.git sonos cd sonos npm install --production npm start 

Om du ser ett meddelande om en sådan modul hittades inte, gör bara en annan npm-installation och modulnamnet, och försök sedan starta igen. Om du upplever fel som hänför sig till "kräver en C ++ 11-kompilator", åtgärda med följande kommandon:

 sudo apt-get install gcc-4.8 g++-4.8 sudo update-alternatives --install/usr/bin/gccgcc/usr/bin/gcc-4.6 20 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 20 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50 

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

sonos-http-api arbetar

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 "say" -kommandot, som 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 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ången 0 :

 sudo node /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. Det här är ett vanligt fall för att aktivera ljus, men det kan hända att du också vill ha en röstmeddelande 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.

 rule "Garden motion detected" when Item Garden_Motion changed then var String message = "You have a visitor" sendHttpGetRequest("http://localhost:5005/kitchen/say/"+message.encode("UTF-8")+"/en-gb") end 

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 Todays_Weather till vad du än namngav strängen):

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

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

mitt exportkonto för openhab-objekt

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.

ifttt väderleksrapport

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] [ooimiMyOpenHABServiceImpl] - Received command Mostly Cloudy today! With a high of 7C and a low of 1C. Repeat. Conditions will be Mostly Cloudy today, with a high of 7C and a low of 1C. for item Todays_Weather 2016-02-27 10:28:01.697 [DEBUG] [ooimiMyOpenHABServiceImpl] - store(Todays_Weather), state = Mostly Cloudy today! With a high of 7C and a low of 1C. Repeat. Conditions will be Mostly Cloudy today, with a high of 7C and a low of 1C. 

Därefter behöver vi en OpenHAB-regel för att skicka denna variabel till Sonos "say" -adress. Följande bör göra det:

 rule "Announce daily weather report" when Item Todays_Weather received update then sendHttpGetRequest("http://localhost:5005/kitchen/say/"+Todays_Weather.state.toString.encode("UTF-8")+"/en-gb") end 

Detta är enkelt nog: när variabeln Todays_Weather uppdateras (vilken kommer den automatiskt, klockan 8 på varje dag), pingadressen. Vi använder kodningsfunktionen ("UTF-8") 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=Cloudy, with a chance of meatballs. 

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.

router config port vidarebefordran

Nu installerar du den sista biten av serverns programvara.

 https://github.com/sebauer/if-this-then-node.git cd if-this-then-node/ npm install node server.js 

Du bör se följande.

om detta då nod standardvärden fel

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

om det här då nod server körs

Bra. Testa att 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 allting fungerar, kommer meddelandet "IFTTN - om-det-då-node Version 2.0.1 är igång!" Visas i din webbläsare. Återigen, för att göra det här skriptet köra vid start, redigera filen /etc/rc.local och lägg till:

 sudo node /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 modulen.

 npm install request 

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 den speciella "sayall" -åtgärden, som skickar meddelandet till varje Sonos-enhet.

 request('http://localhost:5005/sayall/'+params.message+'/en-gb', function (error, response, body) 

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

 request('http://localhost:5005/'+params.device+'/say/'+params.message+'/en-gb', function (error, response, body) 

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

För att testa detta ut använder jag IFTTT "Do" -knappen app. Skapa ett nytt recept, bläddra till kanaler och välj Maker- kanalen.

gör-knappen

Skapa ett nytt recept. Ange i webbadressen du konfigurerat tidigare från en ledig DNS-leverantör (inklusive / ifttn / i slutet av webbadressen. Glöm inte de här snedstreckningarna). Välj POST- förfrågan, ansökan / json- innehållet 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":"Incoming message for everyone: Dinner is ready! Repeat. Dinner is ready. Get your asses upstairs now." } 

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.

webbservern hack försök

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

In this article