Releases: nodomain/ha-rain-warner
Releases · nodomain/ha-rain-warner
Release list
v0.7.0 — Camera entity, interactive radar map, robust motion tracking
Highlights
- Radar camera entity (
camera.radarbild) — a rendered local radar crop with a motion-direction arrow, color-coded by intensity. - Interactive Leaflet radar map — dark basemap + DWD WMS overlay (same-origin proxy, no API key) with a geo-scaled motion arrow projecting the rain field up to 6 h, with hour ticks and arrival timestamps. Scales with zoom.
- Fullscreen map view — tap the "Radarkarte" heading to open the map full-screen for better overview.
- Robust motion tracking — multi-pair TREC estimation with parabolic sub-pixel refinement, search-boundary railing rejection, outlier filtering, and temporal EMA smoothing. The arrow no longer jitters between updates.
Fixed
- Alarm fatigue:
rain_imminentno longer fires on trace radar echoes. The "raining" threshold is now 0.1 mm/h (WMO measurable precipitation) and the imminent alert requires a forecasted peak of >= 0.3 mm/h within 30 min. - WMS proxy 502 when DWD returns a
Content-Typewith a charset parameter.
Full changelog: https://github.com/nodomain/ha-rain-warner/blob/main/CHANGELOG.md
v0.6.7 — Path-based cache busting for the Lovelace card
Changed
- The Lovelace card is now deployed under a content-hashed filename (
/config/www/rain-warner-card.<hash>.js) and the registered Lovelace resource URL points at that exact path — no more?v=<hash>query string. Aggressive PWA / mobile-app caches (notably the HA Companion app on iOS) sometimes ignore query parameters when matching cached responses, so the only reliable way to force a re-fetch is a different filename. deploy.shnow also removes stale hashed copies and the legacy unhashed file fromwww/on every deploy so nothing piles up over time.tools/ha_update_card_resource.pynow takes a stem URL (/local/rain-warner-card) instead of a full filename and reconciles whichever variant is currently registered (legacy unhashed, old query-string cache-bust, or older hashed path) into the new hashed path. Idempotent on repeat runs.- Bumped
CARD_VERSIONin the card source to1.0.1so the console banner reflects the change.
Full Changelog: v0.6.6...v0.6.7
v0.6.6 — Stop retrying failed pysteps installs every boot
Changed
- When the auto-install of pysteps fails on
async_setup_entry, the integration now persists a stickypysteps_install_failedflag in the entry's options and skips the install attempt on subsequent reloads / restarts. This avoids a wasted ~30 s wheel-build (and the resulting error spam in the log) every time HA boots on a system where pysteps cannot be built — most notably HA OS on Python 3.14 with Alpine's noexec/tmp, where pysteps has no musllinux wheels and source builds fail at Cython load time. - The simple engine fallback continues to work as before, so sensors keep producing data.
- Submitting the Configure dialog again clears the flag and retries the install on the next reload — useful after a HA OS upgrade or a pysteps wheel release.
Documentation
- README now explicitly calls out the Python 3.14 + Alpine HA OS incompatibility and explains how to retry the install once a compatible wheel is available.
Full Changelog: v0.6.5...v0.6.6
v0.6.5 — Actually fix the options-flow 500
Fixed
- The Configure cog still 500'd in 0.6.4 because
async_get_options_flowwas still callingRainWarnerOptionsFlow(config_entry). With the constructor gone, the parentOptionsFlow.__init__(=object.__init__) rejects the positional argument and raisesTypeError: RainWarnerOptionsFlow() takes no arguments. Modern Home Assistant injectsself.config_entryon the handler itself, so the factory now returnsRainWarnerOptionsFlow()with no args and the options dialog finally opens.
Verified live: POST /api/config/config_entries/options/flow now returns HTTP 200 with the expected schema (data_source / radius / nowcast_engine).
Full Changelog: v0.6.4...v0.6.5
v0.6.4 — Fix 500 in options flow on modern HA
v0.6.4 — Fix 500 in options flow on modern HA
Fixed
- Removing
__init__from the options flow handler. Modern Home
Assistant (2024.11+) injectsself.config_entryitself and writing
to that attribute from our own constructor produced a 500 error
when the user clicked the Configure cog. With the constructor gone
the framework wires everything up correctly and the options dialog
loads as expected.
v0.6.3 — Options flow for switching engines / data sources
v0.6.3 — Options flow for switching engines / data sources
Added
- The integration now exposes an OptionsFlow so existing config
entries can be reconfigured via Settings → Devices & Services → Rain
Warner → Configure. Switching the nowcast engine, data source or
monitoring radius no longer requires deleting and re-adding the
integration (which would wipe the persisted rain statistics). Picking
the pysteps engine here triggers the same automatic dependency
install introduced in 0.6.2.
v0.6.2 — Auto-install pysteps on HA OS
v0.6.2 — Auto-install pysteps on HA OS
Changed
- Selecting the pysteps engine now triggers an automatic dependency
install via Home Assistant'sasync_process_requirementsAPI.
HA OS / Supervised / Container users no longer need shell access to
pip install pysteps— picking the engine in the config flow is
enough. First install takes 30–60 s on x86 (numpy + scipy + opencv
wheels download). Subsequent restarts reuse the installed package.
Falls back to the simple engine and logs a warning if the install
fails (e.g. missing wheel for an unusual architecture). - README and config-flow help text updated to reflect the new
zero-shell install path.
v0.6.1 — Robust notification card templates
v0.6.1 — Robust notification card templates
Fixed
- The walldisplay notification cards now read values from the
triggering binary sensor's own attributes rather than from
separate sensor entities. The integration writes the alert flag and
its supporting attributes in the same coordinator pass, so the card
never has to handle a half-populated state. Also fixes the
empty-card render that happened when manually overriding the alert
state for testing. - Templates fall back gracefully ("Regen ab gleich" / "Glatteis-Risiko"
without temperature) when an attribute is unexpectedly missing,
rather than blowing up silently.
How to test
In Developer Tools → States, set
binary_sensor.rain_warner_rain_imminent to on with attributes:
rain_starts_in_minutes: 18
rain_starts_at: "2026-06-04T21:38:00+00:00"The notification card should appear within a second showing
"🟦 🌧️ Regen ab 23:38 (in 18 min)".
v0.6.0 — Alert binary sensors, walldisplay cards, iPhone push, mDNS deploy fix
v0.6.0 — Alert binary sensors, walldisplay cards, iPhone push, mDNS deploy fix
Added
- Four derived alert binary sensors that pre-compute the
conditions users actually want to react to:binary_sensor.rain_warner_rain_imminent— dry now, rain in ≤ 30 minbinary_sensor.rain_warner_severe_weather— heavy / violent rain or hail likelihoodbinary_sensor.rain_warner_winter_weather— snow / sleet / freezing rainbinary_sensor.rain_warner_extended_dry_spell— ≥ 7 days dry with no rain in the 6 h forecast
automations/rain-warner-push.yaml— reference iOS push
automations forrain_imminentandsevere_weather. Both use
interruption-level: time-sensitive, share arain-warnertag
group so iOS stacks notifications, and are gated to 07:00–22:00
local time so nothing wakes you up at night.dashboard/notification-cards.yaml— four conditional markdown
cards (🌧️ rain coming / ⛈️ severe / ❄️ winter / 🌵 dry spell) that
drop into any walldisplay notification stack. Each card stays
invisible until its alert flag flips on.- New
alerts.pymodule with the pure-stdlib flag logic, separated
from the coordinator so it's unit-testable without HA imports.
Fixed
deploy.sh --restartno longer falsely reports a recovery timeout
on macOS hosts with flaky mDNS. The script now resolves the HA
hostname to an IP once at startup and uses that for every
subsequent probe, dashboard push and cache-bust.
v0.5.1 — Hide rain-start/-end tiles when irrelevant
v0.5.1 — Hide rain-start/-end tiles when irrelevant
Fixed
- The 'Regen ab' tile no longer shows 'Unbekannt' while it's already
raining — it's hidden via avisibilitycondition (raining = off).
Symmetric treatment for 'Regen endet' (visible only when raining =
on). Cleaner than chasing sentinel values in the sensor itself.