Page 5 of 17
Timed events get lost
Posted: Tuesday 15 March 2016 10:44
by commodore white
Hi. I've been trying to debug my phones presence detection script and been confused by its behaviour on several occasions. Today I noticed that a per-minute event was missed completely. Here is an extract from the log:
Code: Select all
2016-03-15 10:31:00.695 LUA: =====================================================
2016-03-15 10:31:00.696 LUA: >>> Handler: devicetest
2016-03-15 10:31:00.696 LUA: .....................................................
2016-03-15 10:31:00.696 LUA: dzVents Phones:Peter's phone found 0h 1m ago
2016-03-15 10:31:00.697 LUA: dzVents Phones:Rita's phone found 6h 18m ago
2016-03-15 10:31:00.697 LUA: .....................................................
2016-03-15 10:31:00.697 LUA: <<< Done
2016-03-15 10:31:00.697 LUA: -----------------------------------------------------
2016-03-15 10:31:12.978 (RFXCOM) Energy (Electric Meter)
2016-03-15 10:31:47.659 (RFXCOM) Temp (envKitchen)
2016-03-15 10:31:48.110 (RFXCOM) Humidity (envKitchen)
2016-03-15 10:32:00.276 LUA: Handle timer events
2016-03-15 10:32:12.980 (RFXCOM) Energy (Electric Meter)
2016-03-15 10:32:46.732 (RFXCOM) Temp (envKitchen)
2016-03-15 10:32:47.297 (RFXCOM) Humidity (envKitchen)
2016-03-15 10:33:00.061 LUA: Handle timer events
2016-03-15 10:33:00.216 LUA: =====================================================
2016-03-15 10:33:00.216 LUA: >>> Handler: devicetest
2016-03-15 10:33:00.216 LUA: .....................................................
2016-03-15 10:33:00.217 LUA: dzVents Phones:Peter's phone found 0h 3m ago
2016-03-15 10:33:00.217 LUA: dzVents Phones:Rita's phone found 6h 20m ago
2016-03-15 10:33:00.217 LUA: .....................................................
2016-03-15 10:33:00.217 LUA: <<< Done
2016-03-15 10:33:00.217 LUA: -----------------------------------------------------
2016-03-15 10:33:12.979 (RFXCOM) Energy (Electric Meter)
The timed event for 10:32 was completely dropped. Not yet sure if this is a dzVents issue or a domoticz one. How might I track down the problem?
Peter
Re: Introducing dzVents - Domoticz Lua file based event scripting made e-z!
Posted: Tuesday 15 March 2016 11:32
by dannybloe
thorbj wrote:Thanks!
Does the "domoticz.variables['USERVAR'].set(no_motion_time)" string have to be inside an if statement, or can it be after
end - before a new
if?
I can't see that the uservar is changing.
I put a
Code: Select all
if (presenceDevice==nil) then
-- timer was triggered, get my switch
presenceDevice = domoticz.devices[MOTION,CELL_ONE,CELL_TWO]
end
in my script. Maybe that broke it?
First of all, this isn't valid Lua:
Code: Select all
presenceDevice = domoticz.devices[MOTION,CELL_ONE,CELL_TWO]
you can put only one thing between the [ ].
And the set command can be done anywhere you like. As soon as you do a set() it will push the command on the command list that is sent back to Domoticz.
(make sure you use the latest version from github)
Re: Introducing dzVents - Domoticz Lua file based event scripting made e-z!
Posted: Tuesday 15 March 2016 19:34
by commodore white
Hi. Attached is my dzVents mobile phone presence detector. Its taken a while to convert from my raw LUA prototype but I've tried to use some of the more recent dzVents features to push myself up the learning curve.
If you can offer any improvements I'd like to hear. Enjoy.
Peter
Code: Select all
--[[ lua/scripts/phones.lua by commodore white
This dzVents script implements an android phone presence detector using the Domoticz System Alive
Checker (Ping) feature.
For each phone being monitored, you need two virtual devices, one that you bind to the System
Alive Checker, and another that keeps you informed of the phones' proximity. I needed the second
because our phones kept losing and regaining connectivity as we moved around the house or we went outside
for a few minutes perhaps to the washing line.
The script is in two parts, the first responds to sucessfull or failed pings while the second implements
a 'grace period' during which time a phone can be out of earshot for a short while without raising the alarm.
The script also maintains another virtual device called "AnyPhone" which is On whenever any phone is
in reach.
My virtual devices are called:
Peter and pingPeter
Rita and pingRita, and
AnyPhone
... that is, 2n+1 virtual devices in total.
--]]
return {
on = { "ping*", "timer" },
active = true,
execute = function(domoticz, ping)
local phone
local pingPhone
local GRACE = 5 -- five minutes
local lost_or_found
local AnyPhone
local _AnyPhone
local _phone
local _pingPhone
printf = function(s,...) return print("dzVents Phones: " .. s:format(...)) end
_AnyPhone = domoticz.devices["AnyPhone"]
if ping ~= nil then
phone = ping.name:sub(5,99)
_phone = domoticz.devices[phone]
if ping.state == "On" and _phone.state == "Off"
then _phone.switchOn()
if _AnyPhone.state == "Off" then _AnyPhone.switchOn() end
end
else
AnyPhone = "Off" -- assume no phones found
domoticz.devices.forEach(function(_pingPhone)
if (_pingPhone.name:sub(1,4) == "ping") then
phone = _pingPhone.name:sub(5,99) _phone = domoticz.devices[phone]
m_phone = _phone.lastUpdate.minutesAgo m_pingPhone = _pingPhone.lastUpdate.minutesAgo
if _phone.state == "On" then -- recently seen
if _pingPhone.state == "Off" -- but currently not seen
and m_pingPhone > GRACE -- and has been so for several minutes
then _phone.switchOff()
printf("%s's phone lost %um ago", phone, m_pingPhone%60)
else
printf("%s's phone found %uh %um ago", phone, m_phone/60, m_phone%60)
AnyPhone = "On"
end
else
printf("%s's phone lost %uh %um ago", phone, (m_phone+GRACE)/60, (m_phone+GRACE)%60)
end -- if phone.state
end
end) -- for each
if AnyPhone ~= _AnyPhone.state then _AnyPhone.setState(AnyPhone) end
end -- if ping
end -- function
} -- return
Re: Timed events get lost
Posted: Tuesday 15 March 2016 20:11
by dannybloe
commodore white wrote:
The timed event for 10:32 was completely dropped. Not yet sure if this is a dzVents issue or a domoticz one. How might I track down the problem?
Peter
That's indeed weird. As you can see the script_time_main was triggered at 10:32 but nothing was printed afterwards. Are you running 0.9.12? That was has a fix so errors are printed again. That's the only thing I can think of. What you can do is either set the loglevel to 3 in the settings file (debug level) but that might give you too much information. Other option is put some print statements in the script_time.main.lua file and see which one isn't executed (then it fails somewhere before).
Re: Introducing dzVents - Domoticz Lua file based event scripting made e-z!
Posted: Tuesday 15 March 2016 20:13
by dannybloe
commodore white wrote:Hi. Attached is my dzVents mobile phone presence detector. Its taken a while to convert from my raw LUA prototype but I've tried to use some of the more recent dzVents features to push myself up the learning curve.
If you can offer any improvements I'd like to hear. Enjoy.
Peter
I don't see anything special Maybe I'd name the variables a bit more descriptive but that's about it.
I just learned that there's a System Alive Checker. Thanks
I can use that for a couple of my esp8266 sensors.
Re: Introducing dzVents - Domoticz Lua file based event scripting made e-z!
Posted: Tuesday 15 March 2016 21:39
by commodore white
Hi. Definitely running the latest version. However, for some reason, errors raised because of coding errors are not reported which make the software development process a bit protracted. Takes me back to the old days when coding was done on punched cards and you were lucky if you could pass your code through a compiler once a day. It became really important to cosy up to the computer operators, who, if memory serves, never had to buy a pint in the pub!
At least punched cards were easier to edit compared to punched paper tape, it is until you dropped the whole deck of cards on the floor or worse still, in a puddle.
Sigh. Them were the days.
Re: Introducing dzVents - Domoticz Lua file based event scripting made e-z!
Posted: Wednesday 16 March 2016 8:57
by thorbj
dannybloe wrote:First of all, this isn't valid Lua:
Code: Select all
presenceDevice = domoticz.devices[MOTION,CELL_ONE,CELL_TWO]
you can put only one thing between the [ ].
And the set command can be done anywhere you like. As soon as you do a set() it will push the command on the command list that is sent back to Domoticz.
(make sure you use the latest version from github)
Again, big thanks!
Your latest version with errorlogging is great!
Re: Introducing dzVents - Domoticz Lua file based event scripting made e-z!
Posted: Wednesday 16 March 2016 10:21
by dakipro
while on the subject of "punched paper tape" programming of Lua scripts...
How does one debug and tests the scripts and code?
I f.eks. bind script to one of the motion sensors and then I keep waving hands like a windmill in the living room each time I update the code and watch the log in domotics. Or I have to wait for a minute trigger to come by, and then at the end rebind the script to the actual device I want to use and test again.
Do you guys use the dummy/virtual switches or some more convenient method of testing? I am not still discovering possibilities of domoticz
Re: Introducing dzVents - Domoticz Lua file based event scripting made e-z!
Posted: Wednesday 16 March 2016 12:41
by commodore white
I keep a PIR sensor close by and use that to trigger scripts as 'tis quicker than going to a domoticz switch screen and pressing a button. An alternative might be to get a wireless front door bell push button and keep it handy (only just thought of that so I'll redeploy my PIR and stop looking like I'm having some sort of fit).
You could also change a script trigger to include "*", that is 'any device'. Your script will be triggered almost continuously esp if your system includes hardware sensors, CPU, memory, hard disk and the like.
My dzVents installation still doesn't display errors raised by coding errors, despite others experiences, so I'm resorting to more intensive code review and random distribution of print statements.
I'm hoping dzVents gains traction. My scripts seem much more wordy. Perhaps thats not a bad thing.
Peter (looking for his ASR33 and hoping to fix the "Glue Out" indicator on its papertape punch backspace mechanism).
Suggestion: per-script logging level
Posted: Wednesday 16 March 2016 14:13
by commodore white
Hows about an addition parameter at the beginning of scripts to define its logging level, c.f:
Code: Select all
return {
active = true,
on = { 'timer' },
log = domoticz.LOG_INFO,
execute = function(domoticz)
whatever
This would allow developers to have comprehensive logging for the script they're working on, and eliminating the clutter from those they're not.
Just a thought.
Peter
Re: Introducing dzVents - Domoticz Lua file based event scripting made e-z!
Posted: Thursday 17 March 2016 9:41
by thorbj
When using this time table:
Code: Select all
['timer'] = {'at 23:*', 'at 00:*', 'at 01:*', 'at 02:*', 'at 03:*', 'at 04:*'},
I get the following error:
Code: Select all
2016-03-17 09:32:59.443 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_device_main.lua: /home/pi/domoticz/scripts/lua/script_device_main.lua:30: bad argument #1 to 'find' (string expected, got table)
In the manual it says that I can use time tables:
Code: Select all
-- and last but not least, you can create a table with multiples:
['timer'] = {'at 13:45', 'at 18:37', 'every 3 minutes'},
What am I missing here?
Re: Introducing dzVents - Domoticz Lua file based event scripting made e-z!
Posted: Thursday 17 March 2016 14:34
by mcmacpl
Exactly the same issue:
Script:
Code: Select all
return {
active = true,
on = {
['timer'] = { 'at 14:25', 'at 14:30' }
},
execute =
function(domoticz)
if (domoticz.devices[35].bState) then
domoticz.devices[35].switchOff()
end
end
}
Result:
Code: Select all
2016-03-17 14:31:00.025 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_device_main.lua: /home/pi/domoticz/scripts/lua/script_device_main.lua:30: bad argument #1 to 'find' (string expected, got table)
2016-03-17 14:31:00.533 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_main.lua: /home/pi/domoticz/scripts/lua/event_helpers.lua:300: attempt to call global 'checkTimeDefs' (a nil value)
With only
on = { ['timer'] = 'at 14:25' }
it was working well
Re: Introducing dzVents - Domoticz Lua file based event scripting made e-z!
Posted: Thursday 17 March 2016 14:56
by thorbj
I tried the following. No errors in the log yet:
Code: Select all
on = {
['timer'] = 'at 23:*',
['timer'] = 'at 00:*',
['timer'] = 'at 01:*',
['timer'] = 'at 02:*',
['timer'] = 'at 03:*',
['timer'] = 'at 04:*',
},
Example script entrancelight (Portieklicht)
Posted: Friday 18 March 2016 12:47
by NietGiftig
A small contribution for the examples directory, entrancelight (for me Portieklicht).
Tried to send it with Github, but that a new challenge for me, so i do it here
Code: Select all
-- prerequisite: LUX reader, Entrancelight (SONOFF), Virtual switch for manual ON
--LUX reader (homemade ESP8266 with ESPEasy ) placed facing the outside world
--Entrancelight (switched with SONOFF switch with ESPEasy firmware)
--settings
local waitingMinutes = 4 -- Anti Hysteresis (fast switch flip flop)
-- No need for fast reaction
local minimumAmbientLight = 350 --LUX Adjust to your own preference
local luxdevice_idx = 55 --Adjust to your own settings
local entrancelight_idx = 70 --Adjust to your own settings
local manualON_idx = 79 --Adjust to your own settings
return {
active = true, -- set to true to activate this script
on = {
['timer'] = 'every ' .. waitingMinutes .. ' minutes',
manualON_idx
},
execute = function(domoticz)
--initialize variables
local luxValue = domoticz.devices[luxdevice_idx].lux
local entrancelight = domoticz.devices[entrancelight_idx]
local manualON = domoticz.devices[manualON_idx]
print('LUX outside = ' .. luxValue .. ' - Minimum = ' .. minimumAmbientLight )
if (entrancelight.state == 'Off') then
if (luxValue < minimumAmbientLight) or (manualON.state == 'On') then
-- LUX below minimum or Manual ON
print('Entrancelight ON' .. ' Manual ' .. manualON.state)
entrancelight.switchOn()
end
else
if (manualON.state == 'Off') then
if (luxValue > minimumAmbientLight) then
-- LUX above minimum
print('Entrancelight OFF')
entrancelight.switchOff()
end
end
end
end
}
Re: Introducing dzVents - Domoticz Lua file based event scripting made e-z!
Posted: Friday 18 March 2016 23:11
by mcmacpl
thorbj wrote:I tried the following. No errors in the log yet:
Code: Select all
on = {
['timer'] = 'at 23:*',
['timer'] = 'at 00:*',
['timer'] = 'at 01:*',
['timer'] = 'at 02:*',
['timer'] = 'at 03:*',
['timer'] = 'at 04:*',
},
Yes, but for me it will be switched only at 04:*.
Re: Introducing dzVents - Domoticz Lua file based event scripting made e-z!
Posted: Saturday 19 March 2016 17:07
by dannybloe
Crap, I didn't get any notifications again for this forum thread.. Quite annoying. Sorry that I missed these message. Will read up.
Re: Introducing dzVents - Domoticz Lua file based event scripting made e-z!
Posted: Saturday 19 March 2016 17:29
by dannybloe
thorbj wrote:I tried the following. No errors in the log yet:
Code: Select all
on = {
['timer'] = 'at 23:*',
['timer'] = 'at 00:*',
['timer'] = 'at 01:*',
['timer'] = 'at 02:*',
['timer'] = 'at 03:*',
['timer'] = 'at 04:*',
},
I just made a
small release that fixes this bug. Sorry for the inconvenience.
Currently I am writing loads of unit test in the master branch to make it more stable (than it already is
). Fortunately, while writing these tests, this problem was found by one of my tests
.
Anyhow... you should use the other syntax here:
Code: Select all
on = {
['timer'] = { .., .., ..}
}
Let me know if this works now. Again sorry for this.
Re: Example script entrancelight (Portieklicht)
Posted: Saturday 19 March 2016 17:31
by dannybloe
NietGiftig wrote:A small contribution for the examples directory, entrancelight (for me Portieklicht).
Tried to send it with Github, but that a new challenge for me, so i do it here
Code: Select all
['timer'] = 'every ' .. waitingMinutes .. ' minutes',
That's interesting indeed.. Didn't come up with this kind of dynamic trigger myself.. might add some tests that makes sure this keeps working.
Re: Introducing dzVents - Domoticz Lua file based event scripting made e-z!
Posted: Sunday 20 March 2016 10:18
by dakipro
Hi, is there a toggle function?
Does it exists in domoticz, I think it can be triggered using the json url, but can it be "toggled" using the lua?
Re: Introducing dzVents - Domoticz Lua file based event scripting made e-z!
Posted: Sunday 20 March 2016 10:31
by dannybloe
dakipro wrote:Hi, is there a toggle function?
Does it exists in domoticz, I think it can be triggered using the json url, but can it be "toggled" using the lua?
I don't know other than a couple of if statements checking for the current state. I can easily make a toggle function that encapsulates this. If that's what you mean.