Indholdsfortegnelse:

WebApp Controlled Gate Operator Add-on (IoT): 20 trin (med billeder)
WebApp Controlled Gate Operator Add-on (IoT): 20 trin (med billeder)

Video: WebApp Controlled Gate Operator Add-on (IoT): 20 trin (med billeder)

Video: WebApp Controlled Gate Operator Add-on (IoT): 20 trin (med billeder)
Video: 📱 What is the Purpose of a Brilliant Control Panel? Unraveling the Magic of Total Home Control! 2024, November
Anonim
WebApp Controlled Gate Operator Add-on (IoT)
WebApp Controlled Gate Operator Add-on (IoT)
WebApp Controlled Gate Operator Add-on (IoT)
WebApp Controlled Gate Operator Add-on (IoT)
WebApp Controlled Gate Operator Add-on (IoT)
WebApp Controlled Gate Operator Add-on (IoT)

Jeg har en klient, der havde et lukket område, hvor mange mennesker skulle komme og gå. De ville ikke bruge et tastatur på ydersiden og havde kun et begrænset antal fjernbetjeningssendere. Det var svært at finde en overkommelig kilde til yderligere fjernbetjeninger. Jeg tænkte, at det ville være en fantastisk mulighed for at opgradere denne Liftmaster gate -operatør til at være IoT -kompatibel med brugerdefineret hardware, web -API og webapp -grænseflade. Dette løste ikke kun masseadgangsproblemet, det åbnede også ekstra funktionalitet!

På det sidste foto ovenfor er den testenhed, som jeg havde kørt i næsten et år i en lynlåspose. Jeg troede, det var tid til en opgradering!

Dette er en fuldt fungerende løsning med al den kode, hardwareinformation og design, der er angivet her.

Alle projektfilerne er også hostet på GitHub: github.com/ThingEngineer/IoT-Gate-Operator-Addon

Et eksempel på CodeIgniter WebApp -grænsefladen er hostet her: projects.ajillion.com/gate Denne forekomst er ikke forbundet til en live gate, men er den nøjagtige grænseflade og kode, der kører på portene (minus nogle sikkerhedsfunktioner).

--

For endnu større integration kan du bruge IFTTT -biblioteket til Electric Imp.

Trin 1: Saml delene

Saml delene
Saml delene
  • Du skal bruge en elektrisk IMP med mindst 4 GPIO'er til rådighed, jeg bruger IMP001 med et april -breakout -kort.
  • En regulator til at sænke kildespændingen til 5V. Jeg bruger et DC-DC Buck Converter Step Down-modul. eBoot's MP1584EN -version fra Amazon.
  • Et dobbelt (eller flere) relæmodul eller lignende koblingsenhed, der fungerer med IMP -udgangen. Jeg bruger dette ene JBtek 4 -kanals DC 5V relæmodul fra Amazon.
  • En 4 -leder skrueterminal. Jeg bruger denne 5Pcs 2 Rows 12P Wire Connector Screw Terminal Barrier Block 300V 20A fra Amazon.

Trin 2: Forbrugsvarer

Forbrugsvarer
Forbrugsvarer

Du skal også bruge:

  • Adgang til en 3D -printer eller en lille projektboks
  • 4 små skruer ca. 4 mm x 6 mm til kabinettets låg
  • Tilslutningstråd
  • Trådskærere
  • Wire strippere
  • Små skruetrækkere
  • Loddekolbe
  • Varm lim eller silikone
  • Lynlåse

Trin 3: Størrelse af sagen

Størrelse på sagen
Størrelse på sagen

Layout dine dele for at afgøre, hvilken størrelse sag du skal bruge. Med et layout som afbildet skal jeg bruge en kasse, der er omkring 140 mm bred, 70 mm dyb og 30 mm høj.

Trin 4: Wire DC-DC-konverter

Wire DC-DC-omformer
Wire DC-DC-omformer

Skær 3 par røde og sorte tilslutningskabler til strømforbindelser ind og ud af DC-DC-omformerkortet.

  • Indgang: 100 mm
  • Output til IMP: 90 mm
  • Udgang til relæmodul: 130 mm

Lod dem til dit bræt som vist.

Trin 5: Tilslut strøm til enheder

Led strøm til enheder
Led strøm til enheder
  • Tilslut DC-DC-omformerens indgang til to af punkterne på skrueklemmen.
  • Lod de korte 5V udgangstråde til IMP.
  • Lod de længere 5V udgangstråde til relæmodulet.

Trin 6: Wire Relay Module Inputs

Trådrelæ modulindgange
Trådrelæ modulindgange
  • Klip 4 x 90 mm ledninger til relæmodulets inputforbindelser. Jeg brugte 4 separate farver til let reference senere under kodning.
  • Lod lodningerne til relæmodulets input 1-4 derefter til de første 4 IMP GPIO-punkter (henholdsvis Pin1, 2, 5 og 7).

Trin 7: IMP Power Jumper

IMP Power Jumper
IMP Power Jumper

Du skal muligvis bruge USB -strøm, mens du i første omgang programmerer og tester din IMP. Når du er færdig, skal du flytte power -jumperen til BAT -siden.

Trin 8: Wire Gate -statusindgange

Wire Gate -statusindgange
Wire Gate -statusindgange
  • Klip 2 x 80 mm ledninger til statusindgangene.
  • Tilslut ledninger til de resterende 2 skrueterminaler.
  • Lodde ledninger til den næste til henholdsvis IMP GPIO spots (Pin8 & 9).

Trin 9: Udskriv eller køb en sag

Udskriv eller køb en sag
Udskriv eller køb en sag

Du kan downloade min. STL eller. F3D til denne sag på GitHub eller Thingiverse

Hvis du ikke har adgang til en 3D -printer, fungerer en lille generisk projektkasse.

Trin 10: Dekorer din sag

Dekorer din sag
Dekorer din sag

Fordi!

Jeg lagde lidt indrykket tekst på min og farvede den bare med en sort skarp. Hvis du føler dig eventyrlysten, kan du bruge akrylmaling, neglelak eller noget andet for at gøre det endnu glattere.

Trin 11: Bor hul til ledninger

Borehul til ledninger
Borehul til ledninger

Bor et lille hul 10-15 mm på siden nær midten af hvor alle ledninger kommer sammen.

Jeg brugte en Unibit til et rent, glat hul i plasten.

Trin 12: Forbered og installer tilslutningskabler

Forbered og installer tilslutningskabler
Forbered og installer tilslutningskabler
Forbered og installer tilslutningskabler
Forbered og installer tilslutningskabler

Klip 9 x 5-600 mm ledninger til tilslutning af vores enhed til portens operatørkort.

  • 2 til 24V effektindgang
  • 3 til portstatus (2 indgange og fælles grund)
  • 2 for signalet om åben port
  • 2 for signalet om lukkeport

Vrid hver af grupperne ovenfor sammen ved hjælp af en boremaskine. Dette vil gøre alt lettere og se bedre ud.

Strip og tilslut hver af ledningerne til de respektive terminaler som vist.

Trin 13: Rutetilslutningstråde

Rute tilslutningskabler
Rute tilslutningskabler

Før tilslutningstrådene gennem hullet som vist.

Trin 14: Monter komponenter

Monter komponenter
Monter komponenter

Placer og monter komponenterne med en lille perle varm lim eller silikone. Brug ikke for meget, hvis du skal fjerne en del. Brug lige nok til at sikre dem.

Jeg ville oprindeligt udskrive sagen med clips/faner for at holde brædderne på plads, men jeg havde brug for at få dette installeret og havde ikke tid. Tilføjelse af brætklip til din sag ville være et godt strejf.

Trin 15: Forsegl tilslutningstråde

Forsegl tilslutningstråde
Forsegl tilslutningstråde

Forsegl tilslutningstrådene med varm lim eller silikone.

Trin 16: Luk sagen

Luk sagen
Luk sagen

Jeg brugte små ~ 4 mm skruer på listen over denne 3D -trykte sag. Hvis du er bekymret for snavs eller fugt, skal du placere en perle af silikone eller varm lim rundt om låget, før du lukker det op.

Trin 17: Installer i Gate Operator

Installer i Gate Operator
Installer i Gate Operator
Installer i Gate Operator
Installer i Gate Operator

På hovedtavlen:

  • Hægt de to ledninger tilsluttet relæudgang 1 til Open Gate -terminalen. (rød/brun på fotos)
  • Hægt de to ledninger tilsluttet relæudgang 2 til Close Gate -terminalen. (gul/blå på fotos)
  • Tilslut de to ledninger, der er forbundet til DC-DC-konverterindgangen til 24V-tilbehørsklemmerne (rød/sort på fotos)

På udvidelseskortet

  • Jumper relæets almindelige skrueterminaler sammen med et lille stykke ledning
  • Tilslut den fælles jord til en af relæets fælles skrueterminaler (grøn på fotos)
  • Tilslut de 2 portstatusindgange (IMP Pin8 & 9) til relæets normale åbne (NO) skrueterminaler (grå/gul på fotos)

Før ledningerne, lynlås dem for at se pæne ud og find et sted at montere eller indstille din sag.

Der er yderligere fotos i fuld opløsning, der er hostet på GitHub -depotet.

Trin 18: Indstil Aux Relay Mode

Indstil Aux Relay Mode
Indstil Aux Relay Mode

Indstil hjælpe -relækontakterne som vist på billedet.

Dette vil give IMP de signaler, den har brug for for at afgøre, om porten er lukket, åbner, åbner eller lukker.

Trin 19: IMP -agent og enhedskode

IMP -agent og enhedskode
IMP -agent og enhedskode

Kode til elektrisk imp -agent:

  • Opret en ny model i Electric Imp IDE:
  • Erstat URL for at pege på din server

// HTTP -handler -funktion

funktion httpHandler (req, resp) {try {local d = http.jsondecode (req.body); //server.log(d.c); hvis (d.c == "btn") {//server.log(d.val); device.send ("btn", d.val); resp.send (200, "OK"); }} catch (ex) {// Hvis der var en fejl, skal du sende den tilbage i svarserveren.log ("fejl:" + ex); resp.send (500, "Intern serverfejl:" + ex); }}} // Registrer HTTP -handler http.onrequest (httpHandler); // GateStateChange -handlerfunktionsfunktion gateStateChangeHandler (data) {// URL til webtjeneste lokal url = "https://projects.ajillion.com/save_gate_state"; // Indstil Content-Type header til json local headers = {"Content-Type": "application/json"}; // Koder modtagne data og log lokalt organ = http.jsonencode (data); server.log (krop); // Send dataene til din webtjeneste http.post (url, headers, body).sendsync (); } // Registrer gateStateChange handler device.on ("gateStateChange", gateStateChangeHandler);

Kode til elektrisk imp -agent:

  • Tildel en Imp -enhed til din model
  • Kontroller, at hardware -pins er Alias som tilsluttet

// Debouce bibliotek

#require "Button.class.nut: 1.2.0" // Alias for gateOpen GPIO pin (active low) gateOpen <- hardware.pin2; // Alias til gateLuk kontrol GPIO pin (aktiv lav) gateLuk <- hardware.pin7; // Konfigurer 'gateOpen' til at være en digital udgang med en startværdi på digital 1 (høj) gateOpen.configure (DIGITAL_OUT, 1); // Konfigurer 'gateClose' til at være et digitalt output med en startværdi på digital 1 (høj) gateClose.configure (DIGITAL_OUT, 1); // Alias for GPIO-pin, der angiver, at porten bevæger sig (N. O.) gateMovingState <- Knap (hardware.pin8, DIGITAL_IN_PULLUP); // Alias for GPIO-pin, der angiver, at porten er helt åben (N. O.) gateOpenState <- Knap (hardware.pin9, DIGITAL_IN_PULLUP); // Global variabel til at holde gate -tilstanden (Open = 1 / Closed = 0) lokal lastGateOpenState = 0; // Latch Timer -objekt lokalt latchTimer = null agent.on ("btn", funktion (data) {switch (data.cmd) {case "open": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (1, releaseOpen); server.log ("Open kommando modtaget"); break case "latch30m": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (1800, releaseOpen); server.log ("Latch30m kommando modtaget"); break case "latch8h": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (28800, releaseOpen); server.log ("Latch8h -kommando modtaget"); break case "close": if (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); gateClose.write (0); latchTimer = imp.wakeup (1, releaseClose); server.log ("Luk nu kommando modtaget"); break default: server.log ("Knapkommando genkendes ikke");}}); function releaseOpen () {if (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); //server.log("Timer frigivet gateOpen switch contact "); } funktion releaseClose () {if (latchTimer) imp.cancelwakeup (latchTimer); gateClose.write (1); //server.log("Timer frigivet gateLuk kontaktkontakt "); } gateMovingState.onPress (funktion () {// Relæet er aktiveret, gate bevæger sig //server.log("Gate åbner "); lokale data = {" gatestate ": 1," timer ": hardware.millis ()}; agent.send ("gateStateChange", data);}). onRelease (funktion () {// Relæet frigives, gate er i ro //server.log("Gate er lukket "); lokale data = {"gatestate": 0, "timer": hardware.millis ()}; agent.send ("gateStateChange", data);}); gateOpenState.onPress (funktion () {// Relæet er aktiveret, porten er helt åben //server.log("Gate er åben "); lokale data = {" gatestate ": 2," timer ": hardware.millis ()}; agent.send ("gateStateChange", data);}). onRelease (funktion () {// Relæet frigives, gate er ikke helt åben //server.log("Gate lukker "); lokale data = {"gatestate": 3, "timer": hardware.millis ()}; agent.send ("gateStateChange", data);});

Trin 20: Web Service PHP -kode

Web Service PHP -kode
Web Service PHP -kode

Jeg skrev denne kode til CodeIgniter -rammen, fordi jeg føjede den til et gammelt eksisterende projekt. Controlleren og visningskoden kan let tilpasses den ramme, du ønsker.

For at holde tingene enkle gemte jeg JSON -data i en flad fil til datalagring. Hvis du har brug for logning eller mere komplekse datarelaterede funktioner, skal du bruge en database.

Det ajax-bibliotek, jeg skrev og brugte i dette projekt, kan downloades fra GitHub-depotet: ThingEngineer/Codeigniter-jQuery-Ajax

PHP Controller -kode:

  • app/controllere/projects.php
  • Sørg for, at datastien er tilgængelig med dit PHP -script, både placering og læse-/skrive -privilegier.

load-> hjælper (array ('fil', 'dato'));

$ data = json_decode (read_file ('../ app/logs/gatestate.data'), TRUE); switch ($ data ['gatestate']) {case 0: $ view_data ['gatestate'] = 'Lukket'; pause; case 1: $ view_data ['gatestate'] = 'Åbner …'; pause; case 2: $ view_data ['gatestate'] = 'Åben'; pause; case 3: $ view_data ['gatestate'] = 'Lukker …'; pause; } $ last_opened = json_decode (read_file ('../ app/logs/projects/gateopened.data'), TRUE); $ view_data ['last_opened'] = tidsrum ($ last_opened ['last_opened'], time ()). ' siden'; // Load View $ t ['data'] = $ view_data; $ this-> load-> view ('gate_view', $ t); } funktion save_gate_state () {$ this-> load-> hjælper ('fil'); $ data = file_get_contents ('php: // input'); write_file ('../ app/logs/projects/gatestate.data', $ data); $ data = json_decode ($ data, TRUE); hvis ($ data ['gatestate'] == 1) {$ last_opened = array ('last_opened' => time ()); write_file ('../ app/logs/projects/gateopened.data', json_encode ($ last_opened)); }} funktion get_gate_state () {$ this-> load-> helper (array ('fil', 'dato')); $ this-> load-> bibliotek ('ajax'); $ data = json_decode (read_file ('../ app/logs/projects/gatestate.data'), TRUE); $ last_opened = json_decode (read_file ('../ app/logs/projects/gateopened.data'), TRUE); $ data ['last_opened'] = tidsrum ($ last_opened ['last_opened'], time ()). ' siden'; $ this-> ajax-> output_ajax ($ data, 'json', FALSE); // Send json -data, håndhæv ikke ajax -anmodning}}/ * Slut på filprojekter.php *// * Placering:./application/controllers/projects.php */

PHP View Code:

Jeg brugte Bootstrap til front-end, fordi den er hurtig, let og lydhør. Du kan downloade det her: https://getbootstrap.com (jQuery er inkluderet)

  • app/controllere/gate_view.php
  • Erstat DIN-AGENT-KODEN med din Electric Imp agent-kode

IoT Gate Opperator Addon IoT Gate Opperator Addon

  • Hjem
  • Admin

Open Gate Latch Åben i 30 min Latch Open i 8 timer Luk nu Gate Status: Sidst åbnet $ (dokument).ready (funktion () {resetStatus ();}) funktion sendJSON (JSONout) {var url = 'https:// agent.electricimp.com/YOUR-AGENT-CODE '; $.post (url, JSONout); } $ ("#open_gate"). klik (function () {var JSONout = '{"c": "btn", "val": {"cmd": "open"}}'; sendJSON (JSONout); $ ("#status"). tekst ("Åbner …");}); $ ("#latch30m_gate"). klik (function () {var JSONout = '{"c": "btn", "val": {"cmd": "latch30m"}}'; sendJSON (JSONout); $ ("#status"). tekst ("Åbner …");}); $ ("#latch8h_gate"). klik (function () {var JSONout = '{"c": "btn", "val": {"cmd": "latch8h"}}'; sendJSON (JSONout); $ ("#status"). tekst ("Åbner …");}); $ ("#close_gate"). klik (function () {var JSONout = '{"c": "btn", "val": {"cmd": "close"}}'; sendJSON (JSONout); $ ("#status"). tekst ("Lukker …");}); function resetStatus () {// Target url var target = 'https://projects.ajillion.com/get_gate_state'; // Anmod om var data = {agent: 'app'}; // Send ajax -postanmodning $.ajax ({url: target, dataType: 'json', type: 'POST', data: data, success: function (data, textStatus, XMLHttpRequest) {switch (data.gatestate) {case 0: $ ("#status"). Tekst ('Lukket'); pause; sag 1: $ ("#status"). Tekst ('Åbning …'); pause; sag 2: $ ("#status").text ('Open'); break; case 3: $ ("#status"). text ('Closing …'); break; default: $ ("#status"). text ('Error');} $ ("#last_opened"). tekst (data.last_opened);}, fejl: funktion (XMLHttpRequest, textStatus, errorThrown) {// Fejlmeddelelse $ ("#status"). tekst ('Serverfejl');}})); setTimeout (resetStatus, 3000); }

Anbefalede: