Stap 7: De Vera Code
Wilt u mijn Garage-Controller met mijn Vera2, moest ik schrijven van een "plugin". Maar het toevoegen van uw eigen plugin voor de Vera is niet gemakkelijk. Ten eerste, de weinig documentatie op hun Wiki bestaat is onvolledig of verouderd. Er is ook een forum waar u zien kunt wat andere mensen hebben gedaan en vragen.Vera gebruikt een combinatie van UPnP en LUA Luupgenoemd. U moet ten minste twee bestanden, een "definitie" bestand en een "uitvoering"-bestand. Het probleem is dat de uitvoering-bestand een combinatie van XML- en LUA is. De enige manier om te testen uw LUA code (ten minste dat ik besef voor de Mac), is het laden van het bestand uitvoering en hoop dat het wordt uitgevoerd. Laden van uw bestanden en het opnieuw starten van de motor Luup duurt een minuut of meer, zodat het proces traag verloopt. Er is geen debugger en uw enige debugging hulpmiddel is de faciliteit van de logboekregistratie. U het logboek bekijkt, kunt u beide SSH in de Vera of gebruik de volgende URL: < yourVeraIp > / cgi-bin/cmh/log.sh? Apparaat LuaUPnP = ". Als er eenvoudigere manieren zijn, hebben ik nog niet gevonden hen.
Tenzij uw apparaat een "bekende" UPnP-type is, zal alle GSM afstandsbediening apps niet kunnen om uw apparaat te controleren. Omdat ik wil doen van de afstandsbediening, mijn Garage-Controller wordt weergegeven als een "Garage-Controller", die de volgende onderliggende apparaten heeft:
- Een dimbaar licht voor het beheersen van de garagedeur (herinner me, ik wil gedeeltelijk openen de deur)
- Drie licht Switches voor elk van de steunpunten die mijn irrigatie-zones.
Dus is hier het definitiebestand (opslaan als "D_GarageController1.xml"):
<? xml version = "1.0"? >
< wortel xmlns = "urn: schemas-upnp-org:device-1-0" >
< specVersion >
< grote > 1 < / grote >
< kleine > 0 < / kleine >
< / specVersion >
< apparaat >
< deviceType > urn: schemas-aram-perez-com:device:GarageController:1 < / deviceType >
< friendlyName > Garage Controller < / friendlyName >
< modelnummer > 1.0 < / modelnummer >
< protocol > crlf < / protocol >
< handleChildren > 1 < / handleChildren >
< implementationList >
< implementationFile > I_GarageController1.xml < / implementationFile >
< / implementationList >
< / apparaat >
< / root >
En hiernaartoe is het vijl uitvoering (opslaan als "I_GarageController1.xml"):
<? xml version = "1.0"? >
< toepassing >
< functies >
lokale GC = "Garage Controller, apparaat:"
lokale GC_SID = "urn: schemas-aram-perez-com:device:GarageController:1"
lokale SP_SID = "urn: upnp-org:serviceId:SwitchPower1"
lokale DIM_SID = "urn: upnp-org:serviceId:Dimming1"
lokale CR = string.char(13)
lokale FIXED_LEVEL = "30"
lokale CSI = string.char (27, 91)--ESC + [
lokale parentDevice
lokale garageDoorStatus
-- -------------------------------------------------------------------------
--Meld u met kleur
functie Log (apparaat, msg)
luup.log (CSI... "35m..." GC... toString(Device)... ", " .. msg... CSI... "0 m")
einde
functie LogL1 (apparaat, msg)
luup.log (CSI... "35m..." GC... toString(Device)... ", " .. msg... CSI... "0 m", 1)
einde
functie LogL2 (apparaat, msg)
luup.log (CSI... "35m..." GC... toString(Device)... ", " .. msg... CSI... "0 m", 2)
einde
functie startup(lul_device)
lokale apparaat = luup.devices[lul_device]
lokale IPAdres, negeren, ipPort = string.match (device.ip, "^ ([% w%.%-]+) (:? () %d-))$")
Als (IPAdres ~ = "") dan
parentDevice = lul_device
Als (ipPort == nihil) of (ipPort == "") dan
Als (device.port == nihil) of (device.port == "") dan
ipPort = 23;
einde
einde
Log (lul_device, ("opstarten, verbinding maken met".. IP-adres... ", poort"... ipPort))
luup.io.Open (IP-adres, lul_device, ipPort)
child_devices = luup.chdev.start(lul_device);
luup.chdev.Append (lul_device, child_devices, "GD", "garagedeur", "urn: schemas-upnp-org:device:DimmableLight:1", "D_DimmableLight1.xml", "", "", true)
luup.chdev.Append (lul_device, child_devices, "Z1", "irrigatie Zone 1", "urn: schemas-upnp-org:device:BinaryLight:1", "D_BinaryLight1.xml", "", "", true)
luup.chdev.Append (lul_device, child_devices, "Z2", "irrigatie Zone 2", "urn: schemas-upnp-org:device:BinaryLight:1", "D_BinaryLight1.xml", "", "", true)
luup.chdev.Append (lul_device, child_devices, "Z3", "irrigatie Zone 3", "urn: schemas-upnp-org:device:BinaryLight:1", "D_BinaryLight1.xml", "", "", true)
luup.chdev.Sync(lul_device,child_devices)
lokale waarde = luup.variable_get (GC_SID, "DelayPartialOpen", lul_device + 1)
Als (waarde == nihil) of (waarde == "") dan
luup.variable_set (GC_SID, "DelayPartial Open", "3", lul_device + 1)
einde
--Nemen alle irrigatie Relais zijn uitgeschakeld
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)
anders
lokale err = "fout: geen IP-adres gevonden"
LogL2(lul_device, err)
geretourneerd als false, err, "Garage Controller"
einde
luup.io.write("g?")
retourneren true, "Ok", "Garage Controller"
einde
functie partialOpen(data)
luup.io.write("GB")
einde
< / functies >
< startup > opstarten < / opstarten >
< binnenkomende >
< lua >
Log (lul_device, ("ontvangen gegevens:".. toString(lul_data)))
lokale ch = lul_data:sub(1,1)
als ch == dan 'g'
de status van de lokale
CH = lul_data:sub(2,2)
als ch == ' o ' dan
garageDoorStatus = ch
status = "100"
luup.variable_set (SP_SID, "Status", "1", lul_device + 1)
elseif ch == 'c' dan
garageDoorStatus = ch
status = "0"
luup.variable_set (SP_SID, "Status", "0", lul_device + 1)
elseif ch == 'p' dan
garageDoorStatus = ch
status = FIXED_LEVEL
luup.variable_set (SP_SID, "Status", "1", lul_device + 1)
anders
Log (lul_device, "onbekende ontvangen gegevens")
einde kan retourneren
einde
luup.variable_set (DIM_SID, "LoadLevelStatus", status, lul_device + 1)
elseif ch == 'r' dan
CH = lul_data:sub(2,2)
Als (ch & gt; '0') en (ch & lt; '4')
luup.variable_set (SP_SID, "Status", lul_data:sub (3,3), lul_device + ch + 1)
anders
LogL1 (lul_device, ("ongeldig nummer:".. toString(Device)))
einde
anders
LogL2 (lul_device, "onbekende gegevens")
einde
< / lua >
< / inkomende >
< actionList >
< actie >
< serviceId > urn: upnp-org:serviceId:Dimming1 < / serviceId >
< naam > SetLoadLevelTarget < / naam >
< uitvoeren >
lokale garageLevel = lul_settings.newLoadlevelTarget
luup.variable_set (DIM_SID, "LoadLevelTarget", garageLevel, lul_device)
Log (lul_device, ("setting deur niveau to"... garageLevel))
lokale status = luup.variable_get (SP_SID, "Status", lul_device)
Als garageLevel == status dan
true retourneren
einde
Als luup.io.write("gb") == false dan
LogL1 (lul_device, ("fout bij verzenden van de opdracht"))
luup.set_failure(true)
resultaat false
einde
Als (garageLevel ~ = "0") en (garageLevel ~ = "100") dan
lokale vertraging = luup.variable_get (GC_SID, "DelayPartialOpen", lul_device)
luup.call_delay ("partialOpen", vertraging, garageLevel)
einde
true retourneren
< / run >
< / actie >
< actie >
< serviceId > urn: upnp-org:serviceId:SwitchPower1 < / serviceId >
< naam > SetTarget < / naam >
< uitvoeren >
lokale relay = lul_device - parentDevice
Als (Relais & lt; 1) of (Relais & gt; 4) dan
LogL1 (lul_device, ("geen geldige relay nummer:".. estafette))
resultaat false
einde
relay relay - 1 =
lokale newTarget = tostring(lul_settings.newTargetValue)
lokale command = ""
lokale status = luup.variable_get (SP_SID, "Status", lul_device)
als status == nihil dan
status = "?"
einde
als relay == 0 dan
als status ~ = newTarget then
Command = "gb"
einde
anders
Command = "r"... estafette... newTarget
einde
Log (lul_device, ("verzenden:".. opdracht))
luup.variable_set (SP_SID, "Target", newTarget, lul_device)
If opdracht == "" dan
true retourneren
einde
Als luup.io.write(command) == false dan
LogL1 (lul_device, "fout bij het verzenden van de opdracht")
luup.set_failure(true)
resultaat false
einde
true retourneren
< / run >
< / actie >
< / actionList >
< / uitvoering >
Op de Vera UI5 (ik heb dit getest met eerdere UIs), klik op het tabblad APPS en het "Ontwikkelen Apps" sub tabblad en vervolgens op "Luup bestanden" aan de linkerkant. Hier ziet u een lijst van huidige en een plaats om bestanden te uploaden te selecteren. Zodra u de twee bestanden uploaden, u klik op "Create apparaat" aan de linkerkant en vul de informatie. Ik voer onder "Omschrijving" "zGarage Controller" zodat het wordt weergegeven als het laatste apparaat van de UI5 interface. Zodra het apparaat is gemaakt, aanbevelen ik dat u "Reload" zodat alle onderliggende apparaten correct worden weergegeven.
U kunt planningen te openen/sluiten uw garagedeur en uw irrigatie zones toevoegen. U kunt Vera mobiele apps downloaden naar uw mobiele telefoon en de garage deur en irrigatie zones van overal in de wereld!