Page 1 of 1
Script to track usage time per day/week
Posted: Saturday 22 June 2019 14:32
by felix63
I have a switch that (Alivechecker) to see whether or not a PS4 is on. Now I want to have a simple way of keeping track of daily and weekly usage. Preferably in such a way that I can trigger some alerts/actions if daily/weekly quota is being exceeded.
As I have a predisposition to laziness I was wondering if someone out there already did something similar?
Re: Script to track usage time per day/week
Posted: Saturday 22 June 2019 22:42
by waaren
felix63 wrote: Saturday 22 June 2019 14:32
I have a switch that (Alivechecker) to see whether or not a PS4 is on. Now I want to have a simple way of keeping track of daily and weekly usage. Preferably in such a way that I can trigger some alerts/actions if daily/weekly quota is being exceeded.
This script could be a start. Not full tested but the basics works.
Code: Select all
-- track usage.lua
local trackDevice = 'Alivechecker' -- name of device to be checked
return
{
on = { timer = { 'every 15 minutes', 'at 23:59','at 00:01' },
devices = { trackDevice }},
logging = { level = domoticz.LOG_INFO, marker = "tracker" },
data = { tracker = { initial = {} }},
execute = function(dz, item)
local trackDevice = dz.devices(trackDevice)
local weekUsage, dayUsage = 0, 0
local dayLimit = 3600 -- daily limit in seconds
local weekLimit = 7 * dayLimit -- weekly limit in seconds
local function initPersistent()
if not(dz.data.tracker.lastState) then
dz.data.tracker.lastState = item.state
dz.data.tracker.dDate = dz.time.dDate
dz.data.tracker.notified = 0
dz.data.tracker.days = {}
dz.data.tracker.days[dz.time.dayAbbrOfWeek] = 0
dz.log('persistent data initialized; system can now be used', dz.LOG_FORCE )
return true -- initialized now
end
return false
end
local function checkUsage()
local activeSeconds = dz.time.dDate - dz.data.tracker.dDate
for key, value in pairs (dz.data.tracker.days) do
weekUsage = weekUsage + value
end
return (weekUsage + activeSeconds), (( dz.data.tracker.days[dz.time.dayAbbrOfWeek] or 0) + activeSeconds )
end
local function updateUsage(seconds)
if seconds then
dz.data.tracker.days[dz.time.dayAbbrOfWeek] = ( dz.data.tracker.days[dz.time.dayAbbrOfWeek] or 0 ) + seconds
else
dz.data.tracker.days[dz.time.dayAbbrOfWeek] = 0
end
dz.data.tracker.dDate = dz.time.dDate
end
local function notify()
local function managedNotify(message)
if not dz.data.tracker.notified then -- max 1 notification per day
dz.notify('usage tracker',message)
dz.log('usage tracker ' .. message,dz.LOG_FORCE)
dz.data.tracker.notified = 1
end
end
if dayUsage > dayLimit then
managedNotify('Daylimit (' .. dz.utils.round(dayLimit/60) .. ' minutes) reached. Total active minutes today: ' .. dz.utils.round(dayUsage/60 ) )
elseif weekUsage > weekLimit then
managedNotify('Weeklimit (' .. dz.utils.round(weekLimit/3600,1) .. ' hours) reached. Total active hours last 7 days: ' .. dz.utils.round(weekUsage/3600,1))
end
dz.log('dayUsage (seconds): ' .. dayUsage,dz.LOG_INFO)
dz.log('weekUsage (seconds): ' .. weekUsage,dz.LOG_INFO)
end
if initPersistent() then -- One time initialize persistent data
return
elseif item.isTimer and dz.time.matchesRule('at 23:59') and dz.data.tracker.lastState == 'On'then
updateUsage(dz.time.dDate - dz.data.tracker.dDate)
elseif item.isTimer and dz.time.matchesRule('at 00:01') then
updateUsage()
dz.data.tracker.notified = nil
elseif item.isTimer and trackDevice.active then -- check actual usage when device is active
weekUsage, dayUsage = checkUsage()
notify()
elseif item.isDevice and item.active and dz.data.tracker.lastState ~= 'On' then
dz.data.tracker.lastState = 'On'
dz.data.tracker.dDate = dz.time.dDate
elseif item.isDevice and not(item.active) and dz.data.tracker.lastState == 'On' then
dz.data.tracker.lastState = 'Off'
updateUsage(dz.time.dDate - dz.data.tracker.dDate)
end
end
}