feat: add percent-based delta option

This commit is contained in:
2025-11-09 02:47:19 +01:00
parent f04c42fa6e
commit 155030054a

View File

@@ -3,7 +3,7 @@
Features:
* 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.
Configuration:
@@ -16,6 +16,7 @@ local CONFIG = {
ha_token = "REPLACE_WITH_LONG_LIVED_TOKEN",
poll_interval = 3, -- seconds between successful polls
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
display_label = "AC Power",
units_label = "W",
@@ -123,6 +124,36 @@ local function ensure_poll_timer(delay, fn)
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)
backoff_failures = 0
local now = mp.get_time()
@@ -130,8 +161,7 @@ local function handle_success(value, payload)
local unit = sensor_units(payload)
local force_due = CONFIG.force_refresh_interval > 0
and (now - last_display_ts) >= CONFIG.force_refresh_interval
local significant_change = value
and (not last_watts or math.abs(value - last_watts) >= CONFIG.min_delta_watts)
local significant_change = meets_delta_threshold(value)
if significant_change or force_due or last_watts == nil then
show_value(printable, unit)