-
Notifications
You must be signed in to change notification settings - Fork 4
/
L_VirtualAlarmPartition1.lua
119 lines (94 loc) · 4.48 KB
/
L_VirtualAlarmPartition1.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
------------------------------------------------------------------------
-- Copyright (c) 2019-2023 Daniele Bochicchio
-- License: MIT License
-- Source Code: https://github.com/dbochicchio/Vera-VirtualDevices
------------------------------------------------------------------------
module("L_VirtualAlarmPartition1", package.seeall)
local MYSID = "urn:bochicchio-com:serviceId:VirtualAlarmPartition1"
local SECURITYSID = "urn:micasaverde-com:serviceId:SecuritySensor1"
local HASID = "urn:micasaverde-com:serviceId:HaDevice1"
local ALARMSID = "urn:micasaverde-com:serviceId:AlarmPartition2"
local ALTUISID = "urn:upnp-org:serviceId:altui1"
local COMMANDS_ARM = "SetRequestArmModeURL"
local COMMANDS_PANICMODE = "SetRequestPanicModeURL"
-- implementation
local function setVerboseDisplay(devNum, line1, line2)
if line1 ~= nil then lib.setVar(ALTUISID, "DisplayLine1", line1 or "", devNum) end
if line2 ~= nil then lib.setVar(ALTUISID, "DisplayLine2", line2 or "", devNum) end
end
function actionRequestArmMode(devNum, state, pinCode)
lib.D(devNum, "actionArmed(%1,%2,%3,%4)", devNum, state, pinCode, COMMANDS_ARM)
-- send command
lib.sendDeviceCommand(MYSID, COMMANDS_ARM, {state or "Disarmed", pinCode or ""}, devNum, function()
local simpleState = state ~= "Disarmed" and "Armed" or "Disarmed"
lib.setVar(ALARMSID, "ArmMode", simpleState, devNum)
lib.setVar(ALARMSID, "DetailedArmMode", state or simpleState, devNum)
end)
end
function actionRequestPanicMode(devNum, state)
lib.D(devNum, "actionTripped(%1,%2,%3)", devNum, state, state == "1" and COMMANDS_TRIPPED or COMMANDS_UNTRIPPED)
-- send command
lib.sendDeviceCommand(MYSID, COMMANDS_PANICMODE, state, devNum, function()
--lib.setVar(ALARMSID, "ArmMode", state, devNum)
end)
end
function updateStatus(devNum)
local vendorStatus = (lib.getVar(ALARMSID, "VendorStatus", "", devNum)) or ""
local lastUser = (lib.getVar(ALARMSID, "LastUser", "", devNum)) or ""
local state = (lib.getVar(ALARMSID, "DetailedArmMode", "", devNum)) or ""
local simpleState = state ~= "Disarmed" and "Armed" or "Disarmed"
lib.L(devNum, "updateStatus(%1) - (%2,%3,%4,%5)", devNum, vendorStatus, lastUser, state, simpleState)
setVerboseDisplay(devNum,
string.format('Status: %s%s', simpleState, simpleState == "Disarmed" and "" or (" (" .. state .. ")")),
string.format('%s - %s', vendorStatus, lastUser))
end
-- Watch callback
function alarmSensorWatch(devNum, sid, var, oldVal, newVal)
lib.L(devNum, "alarmSensorWatch(%1,%2,%3,%4,%5)", devNum, sid, var, oldVal, newVal)
if oldVal == newVal then return end
if sid == ALARMSID then
if var == "Alarm" and (newVal or "false") == "true" then
setVerboseDisplay(devNum, nil, 'Alarm: triggered')
elseif var == "VendorStatus" or var == "LastUser" or var == "DetailedArmMode" then
updateStatus(devNum)
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(ALARMSID, "Alarm", "None", deviceID)
lib.initVar(ALARMSID, "ArmMode", "Disarmed", deviceID)
lib.initVar(ALARMSID, "DetailedArmMode", "Ready", deviceID)
lib.initVar(ALARMSID, "LastAlarmActive", "0", deviceID)
lib.initVar(ALARMSID, "VendorStatus", "Disarmed", deviceID)
lib.initVar(ALARMSID, "VendorStatusCode", "", deviceID)
lib.initVar(ALARMSID, "LastUser", "", deviceID)
-- commands init
lib.initVar(MYSID, COMMANDS_ARM, lib.DEFAULT_ENDPOINT, deviceID)
lib.initVar(MYSID, COMMANDS_PANICMODE, lib.DEFAULT_ENDPOINT, deviceID)
-- set at first run, then make it configurable
if luup.attr_get("category_num", deviceID) == nil then
local category_num = 23
luup.attr_set("category_num", category_num, deviceID)
end
lib.setVar(HASID, "Configured", 1, deviceID)
lib.setVar(HASID, "CommFailure", 0, deviceID)
-- watches
luup.variable_watch("alarmSensorWatch", ALARMSID, "Alarm", deviceID)
luup.variable_watch("alarmSensorWatch", ALARMSID, "LastUser", deviceID)
luup.variable_watch("alarmSensorWatch", ALARMSID, "VendorStatus", deviceID)
luup.variable_watch("alarmSensorWatch", ALARMSID, "DetailedArmMode", deviceID)
-- status
luup.set_failure(0, deviceID)
lib.D(devNum, "Plugin start (completed): child #%1", deviceID)
end
return true, "Ready", lib._PLUGIN_NAME
end