Smarta uttag är det enklaste sättet att automatisera ditt hem, men ungefär $ 40 för en Wi-Fi eller ZWave-baserad uttag, är det osannolikt att du köper mer än några.
Du kanske redan har några billiga RF-baserade uttag - det slag som levereras med egen anpassad fjärrkontroll, och har vissa kanal- och ID-väljare på baksidan. Tyvärr finns det inga smarta hubbar på marknaden Slaget vid Smart Home Hubs: Vad är ute och vad kommer det? Slaget vid Smart Home Hubs: Vad är ute och vad kommer det? Läs mer som arbetar med dem. Skulle det inte vara bra om du kunde länka dem till ditt DIY smarta hemsystem på något sätt? Tja, du kan - ganska enkelt faktiskt - med ungefär $ 10 i delar.
Med lite mer arbete kan du också integrera några andra skräddarsydda RF-baserade fjärrhårdvaror, som denna budgetfilmskärm.
Vad du behöver:
- ESP8266 NodeMCU v12E dev board (exakt modell spelar ingen roll, v1 eller v3 ska också vara bra). Anledningen till att vi använder ett NodeMCU-kort är att vi vill ha den enkla Wi-Fi-anslutningen senare. Länken är för ett paket med 2, som går ut på $ 7 vardera.
- Paket med 433Mhz sändare och mottagare (ca $ 3).
- RCSwitch och MQTT-bibliotek, och vår kod - alla tillgängliga att ladda ner från Github.
- En MQTT-server, lokal eller fjärrkontroll.
- Vissa RF-kontrollerade uttag körs på 433 MHz-bandet (det ska säga på fjärrkontrollen). Jag köpte min från Maplin som ett paket med 3 för ca £ 20 ($ 25.89).
Om det här är första gången du programmerar NodeMCU-styrelsen måste du ladda ner Arduino plugins för det: följ med den första delen av vår Arduino Killer introduktionsguide. Möt Arduino Killer: ESP8266 Möt Arduino Killer: ESP8266 Vad händer om jag sa till dig att det finns en Arduino-kompatibel dev-kort med inbyggd Wi-Fi för mindre än $ 10? Jo, det finns det. Läs mer för NodeMCU / ESP8266-chipet. Du behöver också CH430-drivrutiner . Du kan hitta signerade MacOS CH430 drivrutiner här, eller Windows här.
Jag har använt v1.6.5 i Arduino eftersom något högre introducerar fler problem än det löser. Nedgradera om du inte redan har det.
Innan du fortsätter kommer jag att anta en grundläggande kunskap om Arduino programmering Arduino Programmering för nybörjare: Trafikljusregulatorn Arduino Programmering för nybörjare: Trafikljuskontrollen Förra veckan lärde vi oss om den grundläggande strukturen i ett Arduino-program och tog en närmare titt på "blink" -exemplet. Förhoppningsvis tog du tillfället i akt att experimentera med kod, justera tidpunkterna. Den här gången, ... Läs mer, och att du har din NodeMCU-inställning i styrelsen, och kan korrekt ladda upp någon demokod. Du borde också ha lagt till de bibliotek som ingår i vår nedladdning till din Arduino / bibliotek mapp.
Om du har ett befintligt PubSubClient- eller MQTT-bibliotek, säkerhetskopiera det och ta bort det. Den som jag har med i nedladdningen är den enda där jag på ett tillförlitligt sätt kunde få meddelanden på NodeMCU, och jag försökte mycket !
RF Sniffing (valfritt)
Det här steget behövs inte om du bara vill styra DIP-switchar eller urvalskontaktuttag - de stöds ut ur rutan och minimal kodändring behövs (det här är fortfarande intressant att göra först, men så du " Jag förstår vad som händer bakom kulisserna).
Om du har andra RF-fjärrkontroller som du vill försöka lägga till måste du först siffra RF-koderna som överförs. För att göra det laddar du upp ReceiveDemo_Advanced skiss från menyn -> Exempel -> RCSwitch- mappen och ändrar följande rad från 0
mySwitch.enableReceive(0); // Receiver on interrupt 0 =>that is pin #2
till 2.
mySwitch.enableReceive(2); // Receiver on GPIO 2 / D4.
Dra upp mottagningsmodulen enligt följande. Titta på framsidan av mottagarkortet (det är ju längre av de två, sändaren är fyrkantig) - sidan med komponenterna på:
- Längst till höger är GND. Anslut till GND på NodeMCU-kortet.
- Längst till vänster är VCC. Anslut till VIN på NodeMCU-kortet.
- Mellan två pinnar är signalen. Anslut antingen en till D4 på NodeMCU (de är anslutna ihop, så det spelar ingen roll vilken).
Ladda nu upp modifierad ReceiveDemo_Advanced, och när det är klart, öppna seriell bildskärm och börja trycka på knapparna på fjärrkontrollerna. Kopiera decimaltalet (inklusive bitlängd), pulslängd och protokoll när du trycker på en knapp.
Efter att ha gjort det såg jag att min projektors skärm använde
- SKÄRM UPP: Mottagen 8694273 / 24bit; Pulslängd: 355 eller 356; Protokoll: 1
- SKÄR NED: Mottagen 8694276 / 24bit; Pulslängd: 355 eller 356; Protokoll: 1
Fortsätt så många knappar som du behöver.
Testa sändaren
Därefter ska vi försöka skicka koder med sändaren. Wire sändarmodulen (den fyrkantiga) som följer. Var försiktig: märkningen på dessa stift är avskyvärda .
VCC-stiftet är faktiskt i mitten, inte på vänster sida. Jag förstörde en modul i processen att räkna ut detta. Den sak som säger "ATAD" är faktiskt "DATA", stavad bakåt. Återigen går data till D4, VCC till VIN och GND till GND (ta bort mottagningsmodulen, du behöver inte längre det).
Ladda upp exemplen -> RCSwitch -> TypeB_WithRotaryOrSlidingSwitches, och igen, ändra datapinnen:
mySwitch.enableTransmit(10);
till
mySwitch.enableTransmit(2);
Observera att en mängd olika exempel finns med i biblioteket, och vilken som fungerar för dig beror på exakt vilken typ av omkopplare du har. Typ A (dipbrytare) och B (rattar eller reglage) är de vanligaste - se bilderna på RCSwitch-sidan. För typ B är det enkelt att slå på och stänga av ett uttag:
mySwitch.switchOn(1, 4); mySwitch.switchOff(1, 4);
där 1 är kanal ID (den övre ratten) och 4 är uttaget ID (den undre ratten). Dessa skrevs i romerska siffror på mina uttag. Maximalt 16 enskilda uttag kan därför lösas, men flera uttag kan använda samma adress om du har flera enheter att sätta på samtidigt.
Men min projektors skärm var lite annorlunda - den använde en annan pulslängd. Så för att driva dem arbetade följande. Observera att du också kan definiera ett annat protokoll om fjärrkontrollen behöver det, men se till att du definierar protokollet innan pulslängden. Pulslängden skrivs över när protokollet ändras.
// Note that my screen actually requires TWO button presses (not a long press, but two physical presses), so I'm delaying a bit then sending the same signal again void screenUp(){ mySwitch.setPulseLength(358); mySwitch.send(8694273, 24); // (decimal code, number of bits) delay(2000); mySwitch.send(8694273, 24); } void screenDown(){ mySwitch.setPulseLength(358); mySwitch.send(8694276, 24); delay(2000); mySwitch.send(8694276, 24); }
Testa alla dina koder fungerar först innan du går vidare till nästa steg.
Styrning via MQTT
Öppna den skiss du laddat ner från Github heter mqtt_rcswitch.ino, och börja med att ändra SSID och lösenord för ditt hem. Ändra sedan kanalnamnet om du vill, och ställ in MQTT-servern. Om du inte redan har en MQTT-server som körs på din OpenHAB-installation, läs del 2 i vår OpenHAB-nybörjarhandbok. OpenHAB Beginners Guide Del 2: ZWave, MQTT, Regler och kartläggning OpenHAB Beginners Guide Del 2: ZWave, MQTT, Regler och kartläggning OpenHAB, open source-hemautomatiseringsprogrammet, överträffar kapaciteten hos andra hemautomatiseringssystem på marknaden - men det är inte lätt att få igång. Faktum är att det kan vara rättvist frustrerande. Läs mer . Observera att min kod är konstruerad för socklar av typ B (roterande brytare), men du kan också enkelt ändra den för DIP-omkopplare.
Den viktigaste delen av koden är funktionen MessageReceived (), som svarar på inkommande MQTT-kommandon. I den här funktionen kontrollerar vi först det stora sökordet - jag valde "switch" och "screen". När det gäller "switch", analyserar vi sedan kanal- och plug-ID; Kontrollera sedan nyttolastkroppen för kommandot.
void messageReceived(String topic, String payload, char * bytes, unsigned int length) { if (topic.indexOf("switch")>=0){ //switch control, parse out the channel and plug id int channel = getValue(topic, '/', 3).toInt(); int plug = getValue(topic, '/', 4).toInt(); if(payload == "on"){ mySwitch.switchOn(channel, plug); } else{ mySwitch.switchOff(channel, plug); } } else if (topic.indexOf("screen")>=0){ //screen control if(payload == "up"){ screenUp(); } else if(payload == "down"){ screenDown(); } } /* add another else if here to listen for more commands (or just modify the one above if you dont want screen) */ }
Som standard fungerar följande MQTT-kommandon:
vardagsrum / kontroll / switch / X / Y (där X är kanal och Y är plug-ID, med meddelandekroppen på eller av)
vardagsrum / kontroll / skärm (med meddelandekroppen upp eller ner)
Använd kommandoraden eller en GUI MQTT-klient för att testa dina enheter innan du lägger till OpenHAB.
Lägger till OpenHAB
Som ett sista steg behöver vi bara skapa några saker för dessa växlar i OpenHAB. Jag har definierat följande föremål för nu, men du borde kunna räkna ut hur man lägger till mer:
/ * RF433mHz enheter * / Switch CinemaScreen "Screen" (Cinema) {mqtt = "> [mäklare: vardagsrum / kontroll / skärm: kommando: PÅ: ned], > [mäklare: vardagsrum / kontroll / skärm: kommando: ] "} Switch Switch41" Switch41 "(Cinema) {mqtt ="> [mäklare: vardagsrum / kontroll / switch / 4/1: kommando: ON: on], > [mäklare: vardagsrum / kontroll / switch / 4/1: kommando: OFF: av] "} Switch Switch42" Switch42 "(Cinema) {mqtt ="> [mäklare: vardagsrum / kontroll / switch / 4/2: kommando: ON: on], > [mäklare: vardagsrum / kontroll / strömbrytare / 4/2: kommando: oFF: off] "}
Du borde nu kunna styra dina RF-enheter från OpenHAB! En sak som jag blev positivt överraskad av var sortimentet - en enda nod kunde täcka det mesta av mitt hus. Du kan naturligtvis lägga till en annan nod, lyssna på samma kanal, som helt enkelt upprepar samma kommandon om du behöver ytterligare täckning.
Den enda begränsningen att komma ihåg är att själva uttagen inte kan rapportera sin status, så om du använder den ursprungliga fjärrkontrollen, kan statusen för uttaget inte reflekteras korrekt i OpenHAB. Håll dig till att använda bara OpenHAB-gränssnittet och du borde ha det bra.
Frågor eller problem? Fråga i kommentarerna, och jag gör mitt bästa för att hjälpa . Om du vill förbättra min kod, var god och skicka in en dröjförfrågan.