@plugge thanks for pointing me to use persistent data.
Using a
Shelly Plus 1 PM device (example) and this code your batteries will no longer be charged up to 100% which will hopefully result in a longer battery life.
The code is heavily filled with debugging info.
You can either delete those lines or set debugging to domoticz.LOG_ERROR
Some devices start with high charging rates and these rates drop after a short while.
To prevent inadverted switching off the code eliminates the first data and starts regulating after 3 minutes.
For testing purposes I started with capturing 10 minutes of data.
The code works fine with 8 minutes interval for testing.
Superfluous lines can be deleted.
The time span for comparision and sensibility can be set with this part of the code.
Code: Select all
if domoticz.data.value_8 > 1.33 * domoticz.data.value_0 then
-- switch off shelly like switchoff Groene lampjes
domoticz.devices(CHARGER_SWITCH).switchOff()
end
The full code:
Code: Select all
-- Shelly get power (watt)
-- Howto at Luftdaten https://www.domoticz.com/forum/viewtopic.php?f=72&t=23406&hilit=luftdaten
-- Call Shelly with http://192.168.x.x/status
-- local Shelly = 'Shelly 21-0'
local CHARGER_SWITCH = 'Groene lampjes' -- switch device (Green lights)
return {
active = true,
on = {
timer = { 'every minute' },
httpResponses = { 'Shelly21Retrieved' } -- matches callback string below
},
data = {
counter = {initial = 0 },
switch_state = {initial = 'Off'},
value_10 = { initial = 0 },
value_9 = { initial = 0 },
value_8 = { initial = 0 },
value_7 = { initial = 0 },
value_6 = { initial = 0 },
value_5 = { initial = 0 },
value_4 = { initial = 0 },
value_3 = { initial = 0 },
value_2 = { initial = 0 },
value_1 = { initial = 0 },
value_0 = { initial = 0 },
},
logging =
{
-- level: This is the log level you want for this script.
-- Can be domoticz.LOG_INFO, domoticz.LOG_MODULE_EXEC_INFO, domoticz.LOG_DEBUG or domoticz.LOG_ERROR
-- marker: A string that is prefixed before each log message.
level = domoticz.LOG_INFO and domoticz.LOG_DEBUG,
marker = "BATTERY CHARGER",
},
execute = function(domoticz, item)
if (item.isTimer) then
domoticz.openURL({
url = 'http://192.168.2.21/status',
method = 'GET',
callback = 'Shelly21Retrieved'
})
elseif (item.isHTTPResponse) then
if (item.ok and item.isJSON) then
-- domoticz.utils.dumpTable(item.json) -- dumpTable shows all values, nice for debugging
domoticz.devices('Shelly 21').updateCustomSensor(item.json.meters[1].power)
-- domoticz.devices('Shelly 21').updateCustomSensor(item.json.meters[2].power)
-- domoticz.notify('Power ' .. item.json.meters[1].power, domoticz.PRIORITY_HIGH)
-- domoticz.notify('Is_valid ' .. item.json.meters[1].is_valid, domoticz.PRIORITY_LOW) --howto display TRUE or FALSE?
-- domoticz.log(item.json.meters[1].power, domoticz.LOG_ERROR)
-- domoticz.notify('Timestamp ' .. item.json.meters[1].timestamp, domoticz.PRIORITY_LOW) -- success
-- domoticz.utils.dumpTable(item.json) -- dumpTable laat alle waarden zien, mooi voor debugging
-- collect all input data
local switch_state = domoticz.devices(CHARGER_SWITCH).state
local power_usage = item.json.meters[1].power
if switch_state == 'On' then
domoticz.data.counter = domoticz.data.counter + 1
elseif switch_state == 'Off' then
domoticz.data.counter = 0
domoticz.data.value_0 = 0
domoticz.data.value_1 = 0
domoticz.data.value_2 = 0
domoticz.data.value_3 = 0
domoticz.data.value_4 = 0
domoticz.data.value_5 = 0
domoticz.data.value_6 = 0
domoticz.data.value_7 = 0
domoticz.data.value_8 = 0
domoticz.data.value_9 = 0
domoticz.data.value_10 = 0
-- for testing there were 10 values, 6 seem to be enough
end
-- Some devices start charging with high values, which drop after a few minutes
-- That is why dat from the first minutes are eliminated
if switch_state == 'On' and domoticz.data.counter == 4 then
domoticz.log('domoticz.data.counter in de loop : ' .. domoticz.data.counter, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes value_4 : ' .. domoticz.data.value_4, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes value_3 : ' .. domoticz.data.value_3, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes value_2 : ' .. domoticz.data.value_2, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes value_1 : ' .. domoticz.data.value_1, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes value_0 : ' .. domoticz.data.value_0, domoticz.LOG_DEBUG)
-- clear the first 3 data because charging sometimes starts with a bump
domoticz.data.value_0 = 0
domoticz.data.value_1 = 0
domoticz.data.value_2 = 0
domoticz.data.value_3 = 0
end
domoticz.log('Groene lampjes status : ' .. switch_state, domoticz.LOG_DEBUG)
domoticz.log('counter : ' .. domoticz.data.counter, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes Watt : ' .. power_usage, domoticz.LOG_DEBUG)
domoticz.data.value_10 = domoticz.data.value_9
domoticz.data.value_9 = domoticz.data.value_8
domoticz.data.value_8 = domoticz.data.value_7
domoticz.data.value_7 = domoticz.data.value_6
domoticz.data.value_6 = domoticz.data.value_5
domoticz.data.value_5 = domoticz.data.value_4
domoticz.data.value_4 = domoticz.data.value_3
domoticz.data.value_3 = domoticz.data.value_2
domoticz.data.value_2 = domoticz.data.value_1
domoticz.data.value_1 = domoticz.data.value_0
domoticz.data.value_0 = power_usage
domoticz.log('domoticz.data.counter : ' .. domoticz.data.counter, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes value_10: ' .. domoticz.data.value_10, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes value_9 : ' .. domoticz.data.value_9, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes value_8 : ' .. domoticz.data.value_8, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes value_7 : ' .. domoticz.data.value_7, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes value_6 : ' .. domoticz.data.value_6, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes value_5 : ' .. domoticz.data.value_5, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes value_4 : ' .. domoticz.data.value_4, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes value_3 : ' .. domoticz.data.value_3, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes value_2 : ' .. domoticz.data.value_2, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes value_1 : ' .. domoticz.data.value_1, domoticz.LOG_DEBUG)
domoticz.log('Groene lampjes value_0 : ' .. domoticz.data.value_0, domoticz.LOG_DEBUG)
if domoticz.data.value_8 > 1.33 * domoticz.data.value_0 then
-- switch off shelly like switchoff Groene lampjes
domoticz.devices(CHARGER_SWITCH).switchOff()
end
else
-- oops
domoticz.log('Error fetching Shelly data', domoticz.LOG_ERROR)
domoticz.log(item.data, domoticz.LOG_ERROR)
end
end
end
}

- Capture.JPG (22.54 KiB) Viewed 688 times
Left line is a device that starts with a high value that drops, right line is a device that charges with a continuous level.
Bugs bug me.