Spraakmeldingen verzenden naar Sonos-luidsprekers

Vandaag laat ik u zien hoe u gesproken meldingen instelt op uw Sonos-systeem, met behulp van IFTTT-recepten, OpenHAB-integraties en meer.

Vandaag laat ik u zien hoe u gesproken meldingen instelt op uw Sonos-systeem, met behulp van IFTTT-recepten, OpenHAB-integraties en meer.
Advertentie

De droom van een slimme thuisliefhebber is een huis waar je mee kunt praten, maar de realiteit is er nog lang niet van af.

Met Amazon Echo kun je bijvoorbeeld een onbeperkt aantal stemgestuurde functies gebruiken, maar het dialoogvenster moet door jou worden gestart met een vraag - je kunt haar niet zomaar een belangrijk bericht laten aankondigen.

Je kunt dit echter doen met een Sonos-systeem en met een beetje DIY Raspberry Pi-magie. Vandaag laat ik je zien hoe je stemmeldingen kunt instellen op je Sonos-systeem, een paar nuttige IFTTT-recepten, OpenHAB-integraties en meer kunt introduceren om gebruik te kunnen maken van de meldingsfunctie.

Merk op dat er een native Sonos-binding voor OpenHAB beschikbaar is, maar het is bekend dat deze geheugenproblemen veroorzaakt door een defecte uPnP-bibliotheek. Ik zou willen voorstellen dit voor nu over te slaan en in plaats hiervan de methode in deze tutorial te gebruiken.

Een Raspberry Pi met Raspian-linux is ideaal voor deze zelfstudie, maar deze moet ook werken op elke linux-gebaseerde basisserver die je hebt. In dit geval gebruik ik dezelfde Raspberry Pi die OpenHAB, het open-source domoticasysteem, gebruikt. Aan de slag met OpenHAB Home Automation op Raspberry Pi Aan de slag met OpenHAB Home Automation op Raspberry Pi OpenHAB is een volwassen, open source domoticaplatform dat op verschillende hardware draait en protocolonafhankelijk is, wat betekent dat het verbinding kan maken met bijna elke huisautomatiseringshardware die tegenwoordig op de markt is. Lees verder . De rest van deze tutorial gaat ervan uit dat je dit ook uitvoert op een Raspberry Pi en dat er een lokaal terminalvenster open is op het bureaublad of dat je op afstand bent ingelogd met behulp van SSH. Je Raspberry Pi instellen voor gebruik zonder hoofd met SSH. Raspberry Pi voor gebruik zonder hoofd met SSH De Raspberry Pi kan SSH-opdrachten accepteren wanneer deze is aangesloten op een lokaal netwerk (via Ethernet of Wi-Fi), zodat u deze eenvoudig kunt instellen. De voordelen van SSH gaan verder dan het verstoren van de dagelijkse screening ... Lees meer.

Je hebt nodig

  • Raspberry Pi 2 (oudere modellen zouden moeten werken, maar controleer op specifieke wijzigingen in de instructies)
  • Ten minste één Sonos-luidspreker (andere audiosystemen worden niet ondersteund, dit is een zelfstudie voor Sonos)
  • Gratis account op VoiceRSS.org. Registreer en vind dan uw API-sleutel, die we later nodig hebben om de spraakberichten te genereren.

Installeer Node Latest

Controleer welke versie van Node je hebt door te typen:

node -v 

Merk op dat versie 6 niet wordt ondersteund. Als u knooppunt 6 heeft, moet u het eerst verwijderen en vervolgens de onderstaande instructies volgen om v5.5 te installeren.

Als u geen v5 hebt of als u een niet gevonden foutmelding krijgt, volgt u deze instructies om Node te installeren. Het volgende commando gaat uit van een Raspberry Pi 2; voor oudere modellen gebruikt u armv6l in plaats van 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 

Bevestig nogmaals door te typen:

 node -v 

En je zou v5.12 moeten zien (of wat de laatste is die je hebt gedownload).

Vervolgens hebben we enkele Node-modules om te installeren. We willen ook de Node Package Manager.

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

Dat zijn de eerste vereisten uit de weg, nu op de leuke dingen.

Sonos HTTP API

De HTTP-API van Sonos maakt een webserver op het lokale netwerk waarmee we een URL kunnen pingen met een bericht dat op een Sonos kan worden aangekondigd (en om het op afstand te besturen als u dat wilt, hoewel deze zelfstudie zich alleen richt op het aspect stemmeldingen).

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

Als u een bericht over een dergelijke-en-dergelijke module niet vindt, hoeft u alleen nog een npm-installatie en de naam van de module uit te voeren, en probeert u dan opnieuw met npm . Als je fouten tegenkomt die betrekking hebben op "vereist een C ++ 11-compiler", herstel met de volgende opdrachten:

 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 

Uiteindelijk zou u zoiets als dit moeten zien:

sonos-http-api werkt

De server is nu actief en heeft een interface met Sonos. Het formaat van deze API is eenvoudig:

 http: // [SERVER IP]: 5005 / [RUIMTE NAAM] / [ACTIE] 

Of als een specifiek voorbeeld:

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

De actie die we interessant vinden is het "Zeg" -commando, dat als volgt wordt gebruikt:

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

U hoort een foutmelding over het moeten registreren bij een API-sleutel op VoiceRSS.org. U had dit al moeten doen, dus typ het volgende en plak in uw API-sleutel zoals vereist:

 nano settings.json 

{

 "voicerss":"YOURAPIKEY" } 

(Druk op CTRL-X, Y, om het bestand op te slaan)

Start de server opnieuw en ping de URL opnieuw. Na een paar seconden zou je een heerlijke Engelse stem moeten horen (hoewel je het einde van de URL verandert in en-us als je dat liever hebt). Om de Sonos HTTP API-server opnieuw te laten starten wanneer de Pi opnieuw wordt opgestart:

 sudo nano /etc/rc.local 

Voeg een regel toe vóór de uitgang 0 :

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

Je hebt nu de mogelijkheid om een ​​spraakbericht te maken vanaf elke plek in het lokale netwerk door simpelweg een URL te pingen, dus de mogelijkheden zijn op dit moment wijd open. Als je echter worstelt om ideeën, lees dan verder voor een paar nuttige meldingen die ik heb opgesteld.

OpenHAB-meldingen over evenementen

Laten we eerst een eenvoudig voorbeeld nemen: bewegingsdetectie. Dit is een standaard voor het activeren van verlichting, maar misschien wilt u ook een gesproken melding als het een bewegingssensor in een zone met weinig verkeer is, of misschien als een waarschuwing dat er iemand op het tuinpad komt.

 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 

Je zou moeten zien hoe je deze eenvoudige stemmeldingen kunt integreren in een van je regels, maar laten we iets ingewikkelder proberen.

Dagelijks weerbericht van IFTTT naar OpenHAB naar Sonos

In dit recept laten we Sonos een dagelijks weerbericht aankondigen op de door u gewenste tijd.

U moet de binding My.OpenHAB hebben ingeschakeld, omdat hierdoor een veilige verbinding tot stand wordt gebracht tussen uw interne OpenHAB-server en de externe IFTTT-service. Stel dat in als u dat nog niet hebt gedaan - u kunt deel 1 van onze OpenHAB-gids raadplegen Aan de slag met OpenHAB Home Automation op Raspberry Pi Aan de slag met OpenHAB Home Automation op Raspberry Pi OpenHAB is een volwassen, open source domoticaplatform dat wordt uitgevoerd op een verscheidenheid aan hardware en is protocol agnostisch, wat betekent dat het verbinding kan maken met bijna elke huisautomatiseringshardware die vandaag op de markt is. Lees Meer voor volledige instructies, anders ga ik ervan uit dat je het al hebt ingesteld met persistentie ingeschakeld voor alle items.

Maak vervolgens een nieuw String-item in uw OpenHAB-installatie, waarin het dagelijkse weerbericht wordt opgeslagen. Voordat dit zichtbaar is in het My.OpenHAB-kanaal, moeten we het initialiseren met een standaardvariabele. Ping de volgende URL (verander raspberrypi.local in je OpenHAB-server, of gebruik gewoon het IP-adres, en Todays_Weather naar wat je de String noemde):

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

Meld u aan bij My.OpenHAB en vink de lijst met items aan om te controleren of de variabele nu is geëxporteerd.

mijn exportcontrole op openhab-items

Terug op IFTTT, maak een nieuw recept en gebruik het Weerkanaal als trigger op het moment van uw voorkeur. U moet uw locatie eerst instellen als u deze nog nooit eerder hebt gebruikt.

Selecteer My.OpenHAB als de actie en kies de Todays_Weather als de variabele die moet worden bijgewerkt.

ifttt weerbericht

Voorlopig kiest u gewoon het volgende halfuur om te testen - u kunt het recept later bijwerken zodra u weet dat het werkt.

Zeker, op de testtijd (in feite een beetje eerder), kreeg ik de voorspelling van vandaag met succes bijgewerkt.

 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. 

Vervolgens hebben we een OpenHAB-regel nodig om deze variabele naar de Sonos-URL "say" te verzenden. Het volgende zou het moeten doen:

 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 

Dit is eenvoudig genoeg: wanneer de Todays_Weather-variabele wordt bijgewerkt (die het automatisch elke dag om 8 uur zal zijn), pingt u de URL. We gebruiken de coderings ("UTF-8") String-functie om de zin van IFTTT geschikt te maken voor gebruik in een URL. Om dit deel van het systeem handmatig te testen, gebruikt u de OpenHAB HTTP API opnieuw:

 http://raspberrypi.local:8080/CMD?Todays_Weather=Cloudy, with a chance of meatballs. 

Maak verbinding met IFTTT zonder OpenHAB, met behulp van If-this-then-Node

Laten we ten slotte eens kijken hoe we vanuit een IFTTT-recept verbinding kunnen maken zonder de tussenpersoon van OpenHAB. In plaats daarvan zullen we een andere webserver installeren en blootstellen aan het open internet. Dit is niet zonder risico: elke vorm van open server is een beveiligingsrisico, maar we beperken dit door geen volledige serverstack uit te voeren, slechts een kleine specifieke service die alleen bepaalde opdrachten in een veilig JSON-datapakketformaat accepteert (dus nee SQL-injectie of authenticatie-aanvallen zijn mogelijk). Zodra we klaar zijn, hebt u een openbare URL waarnaar u berichten kunt verzenden vanaf het IFTTT Maker-kanaal.

Begin met het instellen van een van de vele gratis dynamische DNS-services 5 Beste dynamische DNS-providers waar je gratis naar op zoek kunt zijn vandaag 5 Beste dynamische DNS-providers waar je vandaag gratis naar kunt zoeken DynDNS was altijd een topvermelding als er gratis dynamische DNS's ter sprake kwamen. Maar nu het weg is, zijn er goede alternatieven? Dat is het zeker. Lees meer daar - ik raad DuckDNS aan, specifiek omdat het een eenvoudige set instructies geeft voor Raspberry Pi, waardoor het uw IP-adreslijst automatisch kan bijwerken. Volg deze en volg uw URL voor de volgende stappen. Uw router heeft mogelijk ook een ingebouwde dynamische DNS-functie, dus controleer deze eerst. In mijn geval kan ik een * .mynetgear.com- URL gratis krijgen, dus ik heb dat gebruikt.

Zoek vervolgens naar de poort doorsturing van uw router Wat is poort doorsturen en hoe kan het mij helpen? [MakeUseOf Explains] Wat is Port Forwarding en hoe kan het mij helpen? [MakeUseOf Explains] Huil je een beetje naar binnen als iemand je vertelt dat er een probleem is met de poortdoorsturing en daarom zal je glanzende nieuwe app niet werken? Je Xbox laat je geen games spelen, je torrent downloads weigeren ... Lees Meer configuratiepagina; dit is waar we het zullen vertellen wat te doen met inkomende verzoeken. Stuur alle HTTP-aanvragen (poort 80) door naar poort 1337 op uw Raspberry Pi-server. Ik neem aan dat je een IP-adres hebt dat al is gereserveerd voor je Raspberry Pi - als je dat nog niet hebt gedaan, controleer dan de configuratiepagina van je router voor gereserveerde IP's terwijl je daar bent, omdat je het volgende week niet kunt veranderen en voor de server om plotseling te stoppen met werken.

router config port forwarding

Nu om het laatste stukje serversoftware te installeren.

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

Je zou het volgende moeten zien.

als dit dan node standaardwaarden fout

Dat is ok, dat betekent alleen dat we onze gegevens moeten bijwerken. Open config.js in Nano en bewerk die gegevens in iets anders dan de standaard en sla ze vervolgens op. Wanneer u de server opnieuw uitvoert, ziet u dit:

als dit dan knooppuntserver loopt

Super goed. Test uw machine is toegankelijk vanaf de buitenwereld door uw dynamische DNS-hostnaam in te typen en / ifttn / aan het einde van de URL toe te voegen. Als alles werkt, wordt het bericht "IFTTN - als-dit-dan-knooppunt versie 2.0.1 is in gebruik!" Weergegeven in uw browser. Nogmaals, om dit script bij het opstarten te laten draaien, moet je het bestand /etc/rc.local bewerken en toevoegen:

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

If-This-Then-Node werkt via plug-ins - er zijn een paar standaard-exemplaren meegeleverd, maar er zijn geen interesses voor ons. Download in plaats daarvan deze aangepaste plug-in die ik voor je heb geschreven met de volgende opdrachten.

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

U moet ook de verzoekmodule installeren.

 npm install request 

Start de server vervolgens opnieuw op. De plug-in is vrij eenvoudig, maar een beetje anders dan de URL die we tot nu toe hebben gebruikt. In dit geval heb ik de speciale "zegall" -actie gebruikt, die het bericht naar elk Sonos-apparaat verzendt.

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

Als u liever in staat bent om specifieke apparaten te targeten, vervangt u die regel door:

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

Voeg een nieuwe regelparameter toe met de naam apparaat aan het JSON-verzoek hieronder om de Sonos-apparaatnaam op te geven.

Om dit uit te testen, gebruik ik de IFTTT "Do" knop-app. Maak een nieuw recept, blader naar kanalen en selecteer het Maker- kanaal.

doe knop

Maak een nieuw recept. Voer de URL in die u eerder hebt geconfigureerd van een gratis dynamische DNS-provider (inclusief / ifttn / aan het einde van de URL. Vergeet deze schuine strepen niet). Selecteer POST- aanvraag, application / json- inhoud en de hoofdtekst van het bericht als volgt, waarbij alle variabelen worden vervangen door de variabelen die u eerder had geconfigureerd:

 { "action":"sonos", "user":"YOURUSER", "pw":"YOURPASSWORD", "message":"Incoming message for everyone: Dinner is ready! Repeat. Dinner is ready. Get your asses upstairs now." } 

Nu heb ik een gemakkelijk toegankelijke knop die het bericht op elk Sonos-apparaat in huis zal aankondigen. Je kunt dit natuurlijk koppelen met elk IFTTT-kanaal waarvoor je een aangepast bericht wilt maken met variabelen van dat kanaal. Je zou zelfs in staat moeten zijn om het weerbericht van bovenaf te repliceren zonder OpenHAB nu te gebruiken, hoewel het extra moeite kostte om een ​​andere server te installeren.

Opmerking: hackers zullen u automatisch scannen . Dit gebeurt de hele tijd, maar als u logboeken bekijkt, kan dit alarmerend lijken. Hieronder kunt u zien dat iemand systematisch probeerde vast te stellen of een van de standaard PHPMyAdmin-interfaces toegankelijk was. Wat ze niet waren. Wees niet ongerust als je iets soortgelijks ziet. Het is het internet-equivalent van cold calling willekeurige telefoonnummers om te zien of er iemand is.

webserver hackpogingen

Wat zal je melden?

Je zou nu de tools en kweeksel moeten hebben om je hele huis constant te baden in stemmeldingen over alles wat je maar kunt bedenken. Wie heeft muziek nodig? Je enige limiet is 350 dagelijkse verzoeken van VoiceRSS.org - maar dat is ongeveer elke 4 minuten, dus je zou goed moeten zijn.

Dus wat ga je hiermee doen? Deel uw ideeën of IFTTT-recept in de comments!

Image Credits: koffie en vrouw door S_Photo via Shutterstock

In this article