Page 1 of 1
Plans(Timers) switching ON/OFF on Selector Switch
Posted: Sunday 17 February 2019 14:25
by Kamil
Hello everybody,
is it possible to turn ON and OFF plans on selector switch using dzVents script?
For example I have one selector switch named "Heater" and I created plans for it.
On level "0" I want to have option that will disable all plans events on this switch and on level "10" it will enable them. The rest of levels will set temperature on it (temperature handling I already got).
For example:
Code: Select all
return {
on = {
devices = {
'Heater'
}
},
execute = function(domoticz, device)
if domoticz.device('Heater').switchSelector(0) then
-- !!! and here I don't now how to appeal to plans !!!
end
}
Anyone can help?
Thank You in advance.
Re: Plans switching ON/OFF on Selector Switch
Posted: Sunday 17 February 2019 17:49
by waaren
Kamil wrote: ↑Sunday 17 February 2019 14:25
is it possible to turn ON and OFF plans on selector switch using dzVents script?
For example I have one selector switch named "Heater" and I created plans for it.
On level "0" I want to have option that will disable all plans events on this switch and on level "10" it will enable them. The rest of levels will set temperature on it (temperature handling I already got).
can you elaborate a bit on the plans stuff and what you how you set the temperatures ?
Generic approach could be something like
Code: Select all
return
{
on = {
devices = {
'Heater'
}
},
logging = {
level = domoticz.LOG_DEBUG,
marker = "heater",
},
execute = function(dz, device)
heaterLevel = device.level
local function logWrite(str,level)
dz.log(tostring(str),level or dz.LOG_DEBUG)
end
local function makeActionTable(actionsString)
local t = {}
local i = 0
for str in actionsString:gmatch("[^|%s]+") do
t[i*10] = str
i = i + 1
end
return t
end
local actionTable = makeActionTable(device.levelActions)
logWrite(device.name .. " level: " .. heaterLevel .. "; level Name: " .. device.levelName .. "; level Action: " .. actionTable[heaterLevel])
if heaterLevel == 0 then
logWrite("Action for level " .. heaterLevel )
elseif heaterLevel == 10 then
logWrite("Action for level " .. heaterLevel )
elseif heaterLevel == 20 then
logWrite("Action for level " .. heaterLevel )
elseif heaterLevel == 30 then
logWrite("Action for level " .. heaterLevel )
end
end
}
Re: Plans switching ON/OFF on Selector Switch
Posted: Sunday 17 February 2019 18:39
by Kamil
Well...I'm using Bluetooth thermostats, so I'm connecting to them using external library and script.
For example:
script:///home/pi/eq3/eq3.exp XX:XX:XX:XX:XX:XX temp 5.0
- Switch events.jpg (165.89 KiB) Viewed 1217 times
so temperature settings on thermostat is solved by this script calling from Selector Switch(dummy switch) settings.
Now I need just dzVents for disabling plans (Timers) on this switch (for example when I'm going to holiday). I do not want to unselect every single event in switch Timers.
- Timers.jpg (107.37 KiB) Viewed 1217 times
So the question is how to call to Timers from Selector Switch in dzVents to turn them On and OFF with just one click (best way using one of Selector levels)?
Is my explanation clear?
Re: Plans(Timers) switching ON/OFF on Selector Switch
Posted: Monday 18 February 2019 1:45
by waaren
Yes is, clear.
create two extra levels in Heater device, named "Disable timers" and "Enable timers". These are used to trigger the actions from this script.
Code: Select all
-- manageTimers
local httpResponses = "manageTimers"
return {
on = {
devices = { "Heater" },
httpResponses = { httpResponses .. "*" }
},
logging = {
level = domoticz.LOG_ERROR,
marker = httpResponse
},
execute = function(dz, item)
local function logWrite(str,level)
dz.log(tostring(str),level or dz.LOG_DEBUG)
end
local function triggerJSON(url, response, delay)
local response = response or ""
local delay = delay or 0
dz.openURL({ url = url,
method = "GET",
callback = response }).afterSec(delay)
end
local function actOnTimers(rt,action,id)
for key in ipairs(rt) do
logWrite(rt[key].DeviceRowID)
if tonumber(rt[key].DeviceRowID) == tonumber(id) then
triggerJSON(dz.settings['Domoticz url'] .. "/json.htm?type=command¶m=" .. action .. "timer&idx=" .. rt[key].TimerID)
logWrite(action:gsub("^%l", string.upper) .. "d " .. rt[key].TimerTypeStr .." timer (id:" .. rt[key].TimerID .. ") for ".. rt[key].DevName,dz.LOG_FORCE )
end
end
end
local function makeJSON(action,idx)
return dz.settings['Domoticz url'] .. "/json.htm?type=schedules&filter=device",httpResponses .. "_" .. action .. "_" .. idx
end
local function extractFromResponse(str)
return str:match("_([^_]+)"), str:match("%d+") -- Extract action and idx from response
end
if not item.isHTTPResponse then
if item.levelName:find("able timers") then
triggerJSON(makeJSON(item.levelName:lower():match("%a+"),item.id)) -- add action and device id to callback and get all deviceTimers
end
elseif item.ok then -- statusCode == 2xx
logWrite(item.trigger)
actOnTimers(item.json.result,extractFromResponse(item.trigger)) -- get action and device id from callback and act on it
else
logWrite("Could not get (good) data from domoticz. Error (" .. (item.statusCode or 999) .. ")" ,dz.LOG_ERROR)
logWrite(item.data)
end
end
}
Re: Plans(Timers) switching ON/OFF on/by Selector Switch
Posted: Monday 18 February 2019 8:25
by Kamil
waaren wrote: ↑Monday 18 February 2019 1:45
Yes is, clear.
create two extra levels in Heater device, named "Disable timers" and "Enable timers". These are used to trigger the actions from this script.
Code: Select all
-- manageTimers
local httpResponses = "manageTimers"
return {
on = {
devices = { "Heater" },
httpResponses = { httpResponses .. "*" }
},
logging = {
level = domoticz.LOG_ERROR,
marker = httpResponse
},
execute = function(dz, item)
local function logWrite(str,level)
dz.log(tostring(str),level or dz.LOG_DEBUG)
end
local function triggerJSON(url, response, delay)
local response = response or ""
local delay = delay or 0
dz.openURL({ url = url,
method = "GET",
callback = response }).afterSec(delay)
end
local function actOnTimers(rt,action,id)
for key in ipairs(rt) do
logWrite(rt[key].DeviceRowID)
if tonumber(rt[key].DeviceRowID) == tonumber(id) then
triggerJSON(dz.settings['Domoticz url'] .. "/json.htm?type=command¶m=" .. action .. "timer&idx=" .. rt[key].TimerID)
logWrite(action:gsub("^%l", string.upper) .. "d " .. rt[key].TimerTypeStr .." timer (id:" .. rt[key].TimerID .. ") for ".. rt[key].DevName,dz.LOG_FORCE )
end
end
end
local function makeJSON(action,idx)
return dz.settings['Domoticz url'] .. "/json.htm?type=schedules&filter=device",httpResponses .. "_" .. action .. "_" .. idx
end
local function extractFromResponse(str)
return str:match("_([^_]+)"), str:match("%d+") -- Extract action and idx from response
end
if not item.isHTTPResponse then
if item.levelName:find("able timers") then
triggerJSON(makeJSON(item.levelName:lower():match("%a+"),item.id)) -- add action and device id to callback and get all deviceTimers
end
elseif item.ok then -- statusCode == 2xx
logWrite(item.trigger)
actOnTimers(item.json.result,extractFromResponse(item.trigger)) -- get action and device id from callback and act on it
else
logWrite("Could not get (good) data from domoticz. Error (" .. (item.statusCode or 999) .. ")" ,dz.LOG_ERROR)
logWrite(item.data)
end
end
}
Good morning Waaren!
Thank You for Your response!
Looks really promising. Can You show in Your code where is connection between script and those two levels in selector switch?
Or please give me small explanation what exactly happening here:
Code: Select all
local function actOnTimers(rt,action,id)
for key in ipairs(rt) do
logWrite(rt[key].DeviceRowID)
if tonumber(rt[key].DeviceRowID) == tonumber(id) then
triggerJSON(dz.settings['Domoticz url'] .. "/json.htm?type=command¶m=" .. action .. "timer&idx=" .. rt[key].TimerID)
logWrite(action:gsub("^%l", string.upper) .. "d " .. rt[key].TimerTypeStr .." timer (id:" .. rt[key].TimerID .. ") for ".. rt[key].DevName,dz.LOG_FORCE )
end
end
end
Thank You in advance!
Re: Plans(Timers) switching ON/OFF on Selector Switch
Posted: Monday 18 February 2019 10:05
by waaren
If you are not yet familiar with dzvents then please look at the 10 lines
using dzVents with Domoticz for an intro to dzVents and howto get this script active in domoticz.
The connection is in the line
Code: Select all
if item.levelName:find("able timers") then
So if the device is switched to either "Disable timers" or to "Enable timers" it will do the required.
Code: Select all
local function actOnTimers(rt,action,id)
for key in ipairs(rt) do
logWrite(rt[key].DeviceRowID)
if tonumber(rt[key].DeviceRowID) == tonumber(id) then
triggerJSON(dz.settings['Domoticz url'] .. "/json.htm?type=command¶m=" .. action .. "timer&idx=" .. rt[key].TimerID)
logWrite(action:gsub("^%l", string.upper) .. "d " .. rt[key].TimerTypeStr .." timer (id:" .. rt[key].TimerID .. ") for ".. rt[key].DevName,dz.LOG_FORCE )
end
end
end
rt: the table from domoticz with all timers for all devices
action: "enable" or "disable"
id: id of your selector device
Looping through the table this function looks for timer records with the id of your selector device and for every found one, it triggers an API to domoticz to enable or disable it.