Script to track usage time per day/week

Easy to use, 100% Lua-based event scripting framework.

Moderator: leecollings

Post Reply
User avatar
felix63
Posts: 244
Joined: Monday 07 December 2015 9:30
Target OS: Raspberry Pi / ODroid
Domoticz version: 2020.1
Location: Gouda
Contact:

Script to track usage time per day/week

Post 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?
User avatar
waaren
Posts: 6028
Joined: Tuesday 03 January 2017 14:18
Target OS: Linux
Domoticz version: Beta
Location: Netherlands
Contact:

Re: Script to track usage time per day/week

Post 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
}
Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest