Arduino Garage Controller (7 / 8 steg)
Steg 7: Vera koden
För att använda min Garage Controller med min Vera2, jag var tvungen att skriva en "plugin". Men att lägga till din egen plugin för Vera är inte lätt. Först, föga dokumentationen som finns på deras Wiki är inaktuellt eller inte. Det finns också ett forum där du kan se vad andra människor har gjort och ställa frågor.Vera använder en kombination av UPnP och LUA heter Luup. Du behöver minst två filer, en "definition" fil och en "genomförande" fil. Problemet är att genomförandet filen är en kombination av XML- och LUA. Det enda sättet att testa din LUA kod (åtminstone att jag är medveten om för Mac), är att ladda filen genomförande och hoppas det går. Ladda dina filer och starta om Luup motorn tar en minut eller mer, så processen är långsam. Det finns ingen debugger och din enda felsökningsverktyg är skogsavverkning anläggning. Du Visa loggen, du kan antingen köra SSH till Vera eller Använd följande URL: < yourVeraIp > / cgi-bin/cmh/log.sh? Device = LuaUPnP ". Om det finns lättare sätt, har jag inte hittat dem än.
Såvida inte din enhet är en "välkända" UPnP, kommer alla mobiltelefon fjärrkontroll apps inte att kunna styra enheten. Eftersom jag vill göra fjärrkontrollen, visas mitt Garage styrenhet som en "Garage Controller" som har följande underordnade enheter:
- En dimbar ljus för att styra garageporten (kom ihåg, jag vill delvis öppna dörren)
- Tre ljus Strömställare för var och en av reläer som styr min bevattning zoner.
Så är här den definitionsfil (Spara som "D_GarageController1.xml"):
<? XML-version = "1.0"? >
< root xmlns = "urn: schemas-upnp-org:device-1-0" >
< specVersion >
< stora > 1 < / stora >
< mindre > 0 < / mindre >
< / specVersion >
< enhet >
< deviceType > urn: schemas-aram-perez-com:device:GarageController:1 < / deviceType >
< friendlyName > Garage Controller < / friendlyName >
< modelNumber > 1,0 < / modelNumber >
< protokoll > crlf < / protokollet >
< handleChildren > 1 < / handleChildren >
< implementationList >
< implementationFile > I_GarageController1.xml < / implementationFile >
< / implementationList >
< / enhet >
< / root >
Och här är implementeringsfilen (Spara som "I_GarageController1.xml"):
<? XML-version = "1.0"? >
< tillämpning >
< funktioner >
lokala GC = "Garage Controller, enhet:"
lokala GC_SID = "urn: schemas-aram-perez-com:device:GarageController:1"
lokala SP_SID = "urn: upnp-org:serviceId:SwitchPower1"
lokala DIM_SID = "urn: upnp-org:serviceId:Dimming1"
lokala CR = string.char(13)
lokala FIXED_LEVEL = "30"
lokala CSI = string.char (27, 91)--ESC + [
lokala parentDevice
lokala garageDoorStatus
-- -------------------------------------------------------------------------
--Logga in med färg
funktionen Log (enhet, msg)
luup.log (CSI... "35m"... GC... toString(Device)... ", " .. MSG... CSI... "0 m")
slutet
funktion LogL1 (enhet, msg)
luup.log (CSI... "35m"... GC... toString(Device)... ", " .. MSG... CSI... "0 m", 1)
slutet
funktion LogL2 (enhet, msg)
luup.log (CSI... "35m"... GC... toString(Device)... ", " .. MSG... CSI... "0 m", 2)
slutet
funktion startup(lul_device)
lokal enhet = luup.devices[lul_device]
lokala IP-adress, ignorera, ipPort = string.match (device.ip, "^ ([% w%.%-]+) (:? () %d-))$")
om (IP-adress ~ = "") sedan
parentDevice = lul_device
om (ipPort == nil) eller (ipPort == "") sedan
om (device.port == nil) eller (device.port == "") sedan
ipPort = 23.
slutet
slutet
Log (lul_device, ("startar upp, ansluter till"... IP-adress... ", port"... ipPort))
luup.IO.Open (lul_device, IP-adress, ipPort)
child_devices = luup.chdev.start(lul_device);
luup.ChDev.append (lul_device, child_devices, "GD", "Garage Door", "urn: schemas-upnp-org:device:DimmableLight:1", "D_DimmableLight1.xml", "", "", sant)
luup.ChDev.append (lul_device, child_devices, "Z1", "bevattning zon 1", "urn: schemas-upnp-org:device:BinaryLight:1", "D_BinaryLight1.xml", "", "", sant)
luup.ChDev.append (lul_device, child_devices, "Z2", "bevattning zon 2", "urn: schemas-upnp-org:device:BinaryLight:1", "D_BinaryLight1.xml", "", "", sant)
luup.ChDev.append (lul_device, child_devices, "Z3", "bevattning zonplanerar 3", "urn: schemas-upnp-org:device:BinaryLight:1", "D_BinaryLight1.xml", "", "", sant)
luup.ChDev.Sync(lul_device,child_devices)
lokala värde = luup.variable_get (GC_SID, "DelayPartialOpen", lul_device + 1)
om (värde == nil) eller (värde == "") sedan
luup.variable_set (GC_SID, "DelayPartial öppna", "3", lul_device + 1)
slutet
--Anta alla bevattning reläer är avstängda
luup.variable_set (GC_SID, "Status", "0", lul_device + 2)
luup.variable_set (GC_SID, "Status", "0", lul_device + 3)
luup.variable_set (GC_SID, "Status", "0", lul_device + 4)
annat
lokala err = "fel: ingen IP-adress hittas"
LogL2(lul_device, err)
returnera false, fela, "Garage Controller"
slutet
luup.IO.write("g?")
return true, "Ok", "Garage Controller"
slutet
funktion partialOpen(data)
luup.IO.write("GB")
slutet
< / funktioner >
< Autostart > Start < / Start >
< inkommande >
< lua >
Log (lul_device, ("upplysningar:".. toString(lul_data)))
lokala ch = lul_data:sub(1,1)
om ch == 'g' då
lokala status
CH = lul_data:sub(2,2)
om ch == ' o ' då
garageDoorStatus = ch
status = "100"
luup.variable_set (SP_SID, "Status", "1", lul_device + 1)
ElseIf ch == "c" och sedan
garageDoorStatus = ch
status = "0"
luup.variable_set (SP_SID, "Status", "0", lul_device + 1)
ElseIf ch == "p" och sedan
garageDoorStatus = ch
status = FIXED_LEVEL
luup.variable_set (SP_SID, "Status", "1", lul_device + 1)
annat
Log (lul_device, "okänd mottagna data")
skicka tillbaka slutet
slutet
luup.variable_set (DIM_SID, "LoadLevelStatus", status, lul_device + 1)
ElseIf ch == "r" och sedan
CH = lul_data:sub(2,2)
om (ch & gt; '0') och (ch & lt; "4") sedan
luup.variable_set (SP_SID, "Status", lul_data:sub (3,3), lul_device + ch + 1)
annat
LogL1 (lul_device, ("Ogiltig området nr:".. toString(Device)))
slutet
annat
LogL2 (lul_device, "okänd data")
slutet
< / lua >
< / inkommande >
< actionList >
< åtgärder >
< serviceId > urn: upnp-org:serviceId:Dimming1 < / serviceId >
< namn > SetLoadLevelTarget < / namn >
< kör >
lokala garageLevel = lul_settings.newLoadlevelTarget
luup.variable_set (DIM_SID, "LoadLevelTarget", garageLevel, lul_device)
Log (lul_device, ("ställa in dörren nivå"... garageLevel))
lokala status = luup.variable_get (SP_SID, "Status", lul_device)
om garageLevel == status sedan
returnera sant
slutet
om luup.io.write("gb") == false sedan
LogL1 (lul_device, ("fel skicka kommandot"))
luup.set_failure(true)
returnera false
slutet
om (garageLevel ~ = "0") och (garageLevel ~ = "100") sedan
lokala dröjsmål = luup.variable_get (GC_SID, "DelayPartialOpen", lul_device)
luup.call_delay ("partialOpen", dröjsmål, garageLevel)
slutet
returnera sant
< / run >
< / action >
< åtgärder >
< serviceId > urn: upnp-org:serviceId:SwitchPower1 < / serviceId >
< namn > SetTarget < / namn >
< kör >
lokala relä = lul_device - parentDevice
om (relä & lt; 1) eller (relä & gt; 4) sedan
LogL1 (lul_device, ("inte ett giltigt relay tal:".. relä))
returnera false
slutet
Relay = relä - 1
lokala newTarget = tostring(lul_settings.newTargetValue)
lokala kommandot = ""
lokala status = luup.variable_get (SP_SID, "Status", lul_device)
om status == noll då
status = "?"
slutet
om reläet == 0 då
om status ~ = newTarget sedan
kommandot = "gb"
slutet
annat
kommandot = "r"... Relay... newTarget
slutet
Log (lul_device, ("Skicka:".. kommandot))
luup.variable_set (SP_SID, "Mål", newTarget, lul_device)
Om kommandot == "" sedan
returnera sant
slutet
om luup.io.write(command) == false sedan
LogL1 (lul_device, "fel vid sändning kommandot")
luup.set_failure(true)
returnera false
slutet
returnera sant
< / run >
< / action >
< / åtgärdslista >
< / genomförandet >
På Vera UI5 (jag har testat detta med tidigare UIs), klicka på fliken program, klicka på fliken "Utveckla Apps" sub och sedan på "Luup filer" till vänster. Du kommer att se en lista över aktuella och en plats att välja filer att ladda upp. När du har överfört filerna kan du klicka på "Skapa enhet" till vänster och fyll i informationen. Jag ange under "Beskrivning" "zGarage Controller" så att det visas som den sista enheten på gränssnittet UI5. När enheten skapas så rekommenderar jag att du "ladda om" så att alla underordnade enheter visas på rätt sätt.
Du kan lägga till scheman att öppna/stänga din garageport och zonerna bevattning. Du kan hämta Vera mobila appar till din mobiltelefon och hantera garage dörren och bevattning zonerna från var som helst i världen!