Inhoudsopgave:

Alexa Raspberry Pi-relaiscontroller - Ajarnpa
Alexa Raspberry Pi-relaiscontroller - Ajarnpa

Video: Alexa Raspberry Pi-relaiscontroller - Ajarnpa

Video: Alexa Raspberry Pi-relaiscontroller - Ajarnpa
Video: Make "Alexa" Control ANYTHING! 2024, Juli-
Anonim
Alexa Raspberry Pi-relaiscontroller
Alexa Raspberry Pi-relaiscontroller
Alexa Raspberry Pi-relaiscontroller
Alexa Raspberry Pi-relaiscontroller
Alexa Raspberry Pi-relaiscontroller
Alexa Raspberry Pi-relaiscontroller

Ik heb deze Instructable gemaakt om mijn ervaringen te delen met het integreren van IOT-apparaten met Amazon's Alexa.

Met dit project kan een relaisbord dat is aangesloten op een Raspberry Pi worden bestuurd vanaf een smarthome-controller.

Het is getest met Alexa, maar lijkt ook goed te werken met Samsung Smartthings en andere besturingsinterfaces, omdat het een reeks Belkin Wemo-sockets emuleert.

Er zijn VEEL voorbeelden gebaseerd op de uitstekende FAUXMO-code, maar dit betekende het leren van python en gaf me niet de gedetailleerde controle die ik nodig had voor mijn apparaten en dus besloot ik er een helemaal opnieuw te maken met C als mijn basiscodeertaal.

Ik wilde ook niet naar de diepten van lambda-code op Amazon.com gaan, dus ik heb het heel eenvoudig gehouden.

Ik heb de bron en opmerkingen op Github geplaatst:

github.com/Switchdoctorstu/StuPiMo

De tutorial is eigenlijk bedoeld om te beschrijven hoe je het kunt laten werken en om mijn aantekeningen te publiceren voor het geval het anderen helpt.

Stap 1: Benodigdheden en aansluitingen

Benodigdheden en aansluitingen
Benodigdheden en aansluitingen
Benodigdheden en aansluitingen
Benodigdheden en aansluitingen
Benodigdheden en aansluitingen
Benodigdheden en aansluitingen

De dingen die je nodig hebt, zijn direct beschikbaar op Amazon / EBay:

  • Frambozen PI *
  • Pi-voeding
  • Dupont-connectoren
  • Relaiskaart
  • Oude micro-USB-kabel (om te halveren voor stroomvoorziening voor de relaiskaart)

Elke Raspberry Pi zal werken, ik heb dit getest op een Model B en Zero.

*Als je Pi Zero gebruikt, heb je een OTG-netwerkadapter nodig (tenzij je de 'W'-versie koopt met ingebouwde wifi)

Je moet de Pi verbinden met het netwerk.

Gebruik de dupont-connectoren om de relaiskaart op de Pi aan te sluiten.

Merk op dat de relaiskaart externe voeding moet gebruiken (verwijder de link en maak verbinding met externe 5v). Het zal werken vanuit de PI, maar het wordt niet aanbevolen voor productie.

Voor mijn setup heb ik een extern gevoede USB HUB gebruikt. Dit levert de stroom aan de PI.

Ik heb ook het uiteinde van een oude USB-kabel doorgeknipt en de relais van stroom voorzien vanaf een 2e USB-verbinding naar de hub om veilig te blijven. Mijn 'productie' versie gebruikt een kleine 5V 5A schakelende voeding. Nogmaals, ik heb zojuist een USB-kabel doormidden gesneden om de Pi via Micro-USB van stroom te voorzien en twee van de dupont-connectoren om de relaiskaart van stroom te voorzien. Er zitten 4 draden in de USB-kabel, de meeste gebruiken rood/zwart om de 5v-voeding aan te duiden, maar gebruik bij twijfel een meter om ervoor te zorgen dat u de juiste draden krijgt.

De relaispinnen op het bord zijn verbonden met de relevante GPIO-pinnen op de PI-header.

Met de code kun je de GPIO-pinnen kiezen, maar de standaard die ik gebruikte was:

  1. Relais Pin 1 - Massa
  2. Relais Pin 2 - Relais 1 - GPIO 0
  3. Relais Pin 3 - Relais 2 - GPIO 1
  4. Relais Pin 4 - Relais 3 - GPIO 2
  5. Relais Pin 5 - Relais 4 - GPIO 3
  6. Relais Pin 6 - Relais 5 - GPIO 4
  7. Relais Pin 7 - Relais 6 - GPIO 5
  8. Relais Pin 8 - Relais 7 - GPIO 6
  9. Relais Pin 9 - Relais 8 - GPIO 7
  10. Relais Pin 10 - +5v voor logica

Stap 2: PI-configuratie

Ik ga geen zelfstudie opnieuw maken over hoe u uw PI in gebruik kunt nemen en kunt verbinden met het netwerk.

Er zijn veel gidsen, waaronder een uitstekende instructable op:

www.instructables.com/id/Ultimate-Raspberr…

U moet zover komen dat de PI zichtbaar is op het netwerk en u er verbinding mee kunt maken.

Het maakt niet uit of dit via Ethernet of Wireless is.

Dit project kan worden voltooid met alleen de Raspberry PI met behulp van de Geany Programmers Editor, maar ik vind het persoonlijk gemakkelijker om mijn code voor te bereiden op een pc met Visual Studio of Eclipse (of zelfs Notepad ++) en deze vervolgens naar de PI te uploaden voor foutopsporing met een VNC-verbinding. Nogmaals, ik ga dat hier niet behandelen, want er zijn veel uitstekende instructables over het instellen van VNC op een RPi.

Het enige dat u nodig hebt, is het punt bereiken waarop u de code kunt uploaden en compileren.

Een opmerking die belangrijk is, is dat aangezien de UPNP-handler UDP-multicast vereist, de gebruikte interfaces moeten worden ingesteld op 'Promiscuous'-modus.

Dit kan op de opdrachtregel:

pi@raspberrypi:~ $ ifconfig eth0 promisc

en/of

pi@raspberrypi:~ $ ifconfig wlan0 promisc

Dit moet permanent worden gemaakt, dus ik heb de /etc/rc.local. bewerkt

sudo nano \etc\rc.local

om de regel op te nemen:

sudo ifconfig eth0 promisc

na de eerste set banner # regels om ervoor te zorgen dat de interfaces zijn ingesteld bij het opstarten.

Stap 3: De code downloaden en compileren

De code zelf staat in mijn Github-repository;

github.com/Switchdoctorstu/StuPiMo/blob/ma…

terwijl er 'juiste' manieren zijn om de repository te klonen. ik vond het gemakkelijker om de Geany-editor op het Pi-bureaublad te openen en de code erin te plakken.

Evenzo, als u de opdrachtregel gebruikt;

Een nieuwe map maken

mkdir Stu

Verander ernaar

cd Stu

Maak een nieuw tekstbestand

nano StuPiMo.c

Kopieer de code van de Github raw en plak deze in het nieuwe bestand

Opslaan en afsluiten.

Zodra u het bestand als een C-broncodeobject hebt, kunt u het compileren met

gcc -o StuPiMo StuPiMo.c -l bedradingPi

let op de "-l bedradingPi" is nodig om ervoor te zorgen dat de compiler naar de vereiste bedradingPi-bibliotheek linkt.

De code kan dan worden uitgevoerd met

./StuPiMo

Nogmaals, als u wilt dat dit bij het opstarten wordt uitgevoerd, gebruikt u de opdracht:

sudo nano /etc/rc.local

om de volgende regel toe te voegen:

sudo /home/pi/Stu/StuPiMo &

naar uw /etc/rc.local-bestand. Vergeet bij afsluiten niet uw bestand op te slaan.

Merk op dat de '&' essentieel is om ervoor te zorgen dat een subproces wordt voortgebracht om ervoor te zorgen dat het script op dit punt niet wordt geblokkeerd.

Stap 4: Het gebruiken

Zodra je de code hebt uitgevoerd, vraag je alexa om 'Apparaten te ontdekken' en ze zou alle 8 virtuele Wemo-apparaten moeten vinden.

Dan is het gewoon een kwestie van zeggen: "Alexa zet socket 1 aan" of "Alexa zet socket 6 uit" enz. en het betreffende relais wordt gewijzigd.

Stap 5: Hoe de code werkt

De code werkt door een reeks Belkin Wemo-socketapparaten te emuleren.

Om dit te bereiken moet het 2 belangrijke functies aankunnen:

  • een UPNP discovery-uitzendingshandler
  • een 'device handler' (één per virtueel apparaat) om de opdrachten die naar het apparaat worden gestuurd en de vereiste antwoorden te beheren.

Een 'bonus'-functie is dat het ook een webpagina publiceert om controle over de apparaten mogelijk te maken.

UPNP-handler

De UPNP-handler opent een socket om SSDP-protocolpakketten op 239.255.255.250 poort 1900 te bewaken.

Het reageert op alle 'M-SEARCH'-vragen die binnenkomen met een ontdekkingsantwoordpakket dat de individuele wemo-emulators bekendmaakt aan iedereen die erom vraagt.

Apparaathandler

De apparaathandlers (één per virtueel apparaat) bewaken een reeks IP-poorten en reageren op verzoeken.

Het zal een setup.xml-antwoord geven wanneer daarom wordt gevraagd

Het zal een evenementbeschrijvingsbestand weergeven wanneer daarom wordt gevraagd

Het zal reageren op een GETBINARYSTATE-verzoek

Het zal een SETBINARYSTATE-verzoek verwerken en beantwoorden

Web Server

De webserver is een eenvoudige routine die een HTML-formulier bouwt met een knop per relais.

Het zal reageren op de knoppen die worden ingedrukt en de status van het relais dienovereenkomstig wijzigen.

Stap 6: Aanpassing en vriendelijke namen

Aanpassing en vriendelijke namen
Aanpassing en vriendelijke namen

Ik ben niet gek geworden met de code om het eenvoudig en bewerkbaar te houden.

De basis kan per definitie worden aangepast aan het begin van de code:

// global definitions#define WEBPORT 5353 // poort om de webserver op te draaien

#define NUMDEVICES 8 // Aantal virtuele apparaten dat moet worden gemaakt

#define PORTBASE 43450 // basis IP-poort om vanaf te verhogen

WEBPORT is het poortnummer waarop de ingebouwde webserver draait. Dit zou op 80 kunnen worden gezet om dingen gemakkelijk te maken, maar ik ontdekte dat het in strijd was met Tomcat of andere lokale services.

NUMDEVICES definieert het aantal individuele WEMO-emulators dat moet worden gestart. Als u een relaiskaart met 2 poorten hebt, stel deze dan in op 2, 4 poorten = 4 enz.

De beschrijvende namen voor de apparaten worden ingesteld in een routine genaamd setup_names:

int setup_names(char friendly[NUMDEVICES][NAMELEN]) {int i = 0;

// gebruik deze lus

voor (i = 0; ik < NUMMERS; i++) {

sprintf(vriendelijk, "Socket %d", i + 1);

}

// of de volgende handmatige tabel om apparaatnamen in te vullen

/*

strcpy(vriendelijk[0], "TV in de slaapkamer");

strcpy(vriendelijk[1], "Elektrische Deken");

strcpy(vriendelijk[2], "Slaapkamerlamp");

strcpy(vriendelijk[3], "Socket 4");

strcpy(vriendelijk[4], "Socket 5");

strcpy(vriendelijk[5], "Socket 6");

strcpy(vriendelijk[6], "Socket 7");

strcpy(vriendelijk[7], "Socket 8");

*/

retour ik;

}

Ik heb een lus gebruikt om elk van de apparaten 'Socket n' te noemen, maar je kunt deze lus verwijderen en in plaats daarvan je eigen beschrijvende namen toevoegen (zorg ervoor dat je hetzelfde nummer toevoegt als NUMDEVICES) als je de /* */ verwijdert

Vergeet niet om de code opnieuw te compileren als u wijzigingen aanbrengt.

Aanbevolen: