feat: add percent-based delta option
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
Features:
|
Features:
|
||||||
* Polls `/api/states/<sensor_id>` via curl with a long-lived token and trims the base URL to avoid duplicate slashes.
|
* Polls `/api/states/<sensor_id>` via curl with a long-lived token and trims the base URL to avoid duplicate slashes.
|
||||||
* Debounces HUD spam by only re-rendering when watt deltas exceed `min_delta_watts` or when `force_refresh_interval` elapses.
|
* Debounces HUD spam by only re-rendering when watt deltas exceed `min_delta_watts` (or `min_delta_percent`) or when `force_refresh_interval` elapses.
|
||||||
* Survives flaky networks with capped exponential backoff, optional HUD error messages, and redraws of the last known value after OSD clears.
|
* Survives flaky networks with capped exponential backoff, optional HUD error messages, and redraws of the last known value after OSD clears.
|
||||||
|
|
||||||
Configuration:
|
Configuration:
|
||||||
@@ -16,6 +16,7 @@ local CONFIG = {
|
|||||||
ha_token = "REPLACE_WITH_LONG_LIVED_TOKEN",
|
ha_token = "REPLACE_WITH_LONG_LIVED_TOKEN",
|
||||||
poll_interval = 3, -- seconds between successful polls
|
poll_interval = 3, -- seconds between successful polls
|
||||||
min_delta_watts = 5, -- only show when change ≥ delta
|
min_delta_watts = 5, -- only show when change ≥ delta
|
||||||
|
min_delta_percent = 0, -- optional % change relative to last reading
|
||||||
force_refresh_interval = 30, -- seconds, even if delta small
|
force_refresh_interval = 30, -- seconds, even if delta small
|
||||||
display_label = "AC Power",
|
display_label = "AC Power",
|
||||||
units_label = "W",
|
units_label = "W",
|
||||||
@@ -123,6 +124,36 @@ local function ensure_poll_timer(delay, fn)
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function meets_delta_threshold(value)
|
||||||
|
if not value then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
if not last_watts then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local delta = math.abs(value - last_watts)
|
||||||
|
if delta >= CONFIG.min_delta_watts then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
if CONFIG.min_delta_percent > 0 then
|
||||||
|
local baseline = math.abs(last_watts)
|
||||||
|
if baseline < 1e-6 then
|
||||||
|
baseline = math.abs(value)
|
||||||
|
end
|
||||||
|
if baseline < 1e-6 then
|
||||||
|
baseline = 1
|
||||||
|
end
|
||||||
|
local percent_delta = (delta / baseline) * 100
|
||||||
|
if percent_delta >= CONFIG.min_delta_percent then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
local function handle_success(value, payload)
|
local function handle_success(value, payload)
|
||||||
backoff_failures = 0
|
backoff_failures = 0
|
||||||
local now = mp.get_time()
|
local now = mp.get_time()
|
||||||
@@ -130,8 +161,7 @@ local function handle_success(value, payload)
|
|||||||
local unit = sensor_units(payload)
|
local unit = sensor_units(payload)
|
||||||
local force_due = CONFIG.force_refresh_interval > 0
|
local force_due = CONFIG.force_refresh_interval > 0
|
||||||
and (now - last_display_ts) >= CONFIG.force_refresh_interval
|
and (now - last_display_ts) >= CONFIG.force_refresh_interval
|
||||||
local significant_change = value
|
local significant_change = meets_delta_threshold(value)
|
||||||
and (not last_watts or math.abs(value - last_watts) >= CONFIG.min_delta_watts)
|
|
||||||
|
|
||||||
if significant_change or force_due or last_watts == nil then
|
if significant_change or force_due or last_watts == nil then
|
||||||
show_value(printable, unit)
|
show_value(printable, unit)
|
||||||
|
|||||||
Reference in New Issue
Block a user