-
Notifications
You must be signed in to change notification settings - Fork 4
/
L_VirtualGenericSensor1.lua
104 lines (78 loc) · 3.41 KB
/
L_VirtualGenericSensor1.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
------------------------------------------------------------------------
-- Copyright (c) 2019-2023 Daniele Bochicchio
-- License: MIT License
-- Source Code: https://github.com/dbochicchio/Vera-VirtualDevices
------------------------------------------------------------------------
module("L_VirtualGenericSensor1", package.seeall)
local MYSID = "urn:bochicchio-com:serviceId:VirtualGenericSensor1"
local SECURITYSID = "urn:micasaverde-com:serviceId:SecuritySensor1"
local HASID = "urn:micasaverde-com:serviceId:HaDevice1"
local COMMANDS_TRIPPED = "SetTrippedURL"
local COMMANDS_UNTRIPPED = "SetUnTrippedURL"
local COMMANDS_ARMED = "SetArmedURL"
local COMMANDS_UNARMED = "SetUnArmedURL"
-- implementation
function actionArmed(devNum, state)
state = tostring(state or "0")
lib.D(devNum, "actionArmed(%1,%2,%3)", devNum, state, state == "1" and COMMANDS_ARMED or COMMANDS_UNARMED)
lib.setVar(SECURITYSID, "Armed", state, devNum)
-- no need to update ArmedTripped, it will be automatic
-- send command
lib.sendDeviceCommand(MYSID, state == "1" and COMMANDS_ARMED or COMMANDS_UNARMED, state, devNum)
end
function actionTripped(devNum, state)
-- no need to update LastTrip, it will be automatic
state = tostring(state or "0")
lib.D(devNum, "actionTripped(%1,%2,%3)", devNum, state, state == "1" and COMMANDS_TRIPPED or COMMANDS_UNTRIPPED)
-- send command
lib.sendDeviceCommand(MYSID, state == "1" and COMMANDS_TRIPPED or COMMANDS_UNTRIPPED, state, devNum)
end
-- Watch callback
function sensorWatch(devNum, sid, var, oldVal, newVal)
lib.D(devNum, "sensorWatch(%1,%2,%3,%4,%5)", devNum, sid, var, oldVal, newVal)
if oldVal == newVal then return end
if sid == SECURITYSID then
if var == "Tripped" then
actionTripped(devNum, newVal or "0")
end
end
end
function startPlugin(devNum)
lib = require("L_VirtualLibrary")
lib.startup(devNum, MYSID)
-- enumerate children
local children = lib.getChildren(devNum)
for k, deviceID in pairs(children) do
lib.L(devNum, "Child #%1 - %2", deviceID, luup.devices[deviceID].description)
-- generic init
lib.initVar(MYSID, "DebugMode", 0, deviceID)
-- sensors init
lib.initVar(SECURITYSID, "Armed", "0", deviceID)
lib.initVar(SECURITYSID, "Tripped", "0", deviceID)
-- commands init
local commandTripped = lib.initVar(MYSID, COMMANDS_TRIPPED, lib.DEFAULT_ENDPOINT, deviceID)
local commandArmed = lib.initVar(MYSID, COMMANDS_ARMED, lib.DEFAULT_ENDPOINT, deviceID)
-- upgrade code
lib.initVar(MYSID, COMMANDS_UNTRIPPED, commandTripped, deviceID)
lib.initVar(MYSID, COMMANDS_UNARMED, commandArmed, deviceID)
-- set at first run, then make it configurable
if luup.attr_get("category_num", deviceID) == nil then
local category_num = 4
luup.attr_set("category_num", category_num, deviceID) -- security sensor
end
-- set at first run, then make it configurable
local subcategory_num = luup.attr_get("subcategory_num", deviceID) or 0
if subcategory_num == 0 then
luup.attr_set("subcategory_num", "1", deviceID) -- door sensor
end
-- watches
luup.variable_watch("sensorWatch", SECURITYSID, "Tripped", deviceID)
--luup.variable_watch("sensorWatch", SECURITYSID, "Armed", deviceID)
-- status
luup.set_failure(0, deviceID)
lib.setVar(HASID, "Configured", 1, deviceID)
lib.setVar(HASID, "CommFailure", 0, deviceID)
lib.D(devNum, "Plugin start (completed): child #%1", deviceID)
end
return true, "Ready", lib._PLUGIN_NAME
end