Commit Graph

310 Commits (d4f60b85808ecc95b277d6611a976e5c3ce5f660)

Author SHA1 Message Date
SchiZzA 10717aba8b
Add stall sensor detection. 2026-07-25 21:47:50 +02:00
SchiZzA 6363351d9c
fix: coordinator reuse, route dispatcher, binary sensor translations & test suite alignment
- Reuse existing `WeatherDataUpdateCoordinator` instance across reloads instead of
  creating a new one; routes keep pointing to the same coordinator, so entities
  stay subscribed and updates never silently drop
- `update_listener` now skips full reload when only `SENSORS_TO_LOAD` changes
  (auto-discovery); avoids the "frozen UI" window caused by temporary platform unload
- Replaced direct `route._handler` mutation with a proper `Routes` dispatcher;
  all aiohttp routes are registered once and an internal dispatcher decides which
  handler is active — safe to switch at runtime without touching the router
- Fixed `self.config_entry` / `self.config` inconsistency in coordinator

- `BatteryBinarySensor` now carries correct `device_info` (same identifiers as
  `WeatherSensor`) → single device card in UI instead of two
- Translations for binary sensors must live under `entity.binary_sensor.*`,
  not `entity.sensor.*`

- Fixed all tests broken by new `register_path(hass, coordinator, coordinator_h, entry)` signature
- Updated `_RouterStub` to accept `name=` kwargs and return objects with `.method`
- Added `async post()` to `_RequestStub` stubs
- Aligned `Routes` tests with new `method:path` dispatch key format and `show_enabled()` output
- Replaced `WindyApiKeyError` with `WindyPasswordMissing` to match actual exceptions
- Updated `_FakeResponse` to use HTTP status codes instead of response text strings
- Patched `persistent_notification.create` in Windy push tests to avoid `SimpleNamespace` errors
2026-07-25 21:47:50 +02:00
SchiZzA e3d00389de
fix: Fixed type errors 2026-07-25 21:47:50 +02:00
SchiZzA 16a593e2a0
fix DEV_DBG as constant not string literal 2026-07-25 21:47:50 +02:00
SchiZzA e843e39ae4
fix bool truthy 2026-07-25 21:47:50 +02:00
SchiZzA 047bd5f6c7
hmac compare ID / KEY 2026-07-25 21:47:49 +02:00
SchiZzA 4b251b5998
fixed: Menu options 2026-07-25 21:47:49 +02:00
SchiZzA f00f1e9860
fix value in wslink sensors
Fix VOCLevel value
2026-07-25 21:47:49 +02:00
SchiZzA ddfd75d985
Ecowitt support
Update setiing (config_flow and translations) for Ecowitt settings.
Also updated utils.py to accept None for value.
2026-07-25 21:47:49 +02:00
SchiZzA fda7555e81
Updated config flow
Updated config flow's initial setup.
Ecowitt stations does not require `API_ID` and `API_KEY`, so we need to
separate Ecowitt setup from PWS/WSLink setup.
2026-07-25 21:47:49 +02:00
schizza cf8b0d122c
```
docs: Update README for Ecowitt pre-release, expanded sensor support, and guidance

Update the README to reflect current development and provide clearer user guidance:
- Announce active Ecowitt support in the v2.0.0pre1 pre-release version.
- Expand the "Supported sensors" section with details on WSLink protocol specific sensors,
  including additional channels (CH2/CH3), WBGT, heat index, wind chill,
  sensor battery levels, and HCHO/VOC air-quality sensors (WH46).
- Clarify WSLink configuration, warnings, and quick recommendations.
- Correct the manual installation path for custom components and improve general readability.
```
2026-07-25 21:47:49 +02:00
SchiZzA 7bba644bec
Add HCHO / VOC air-quality sensors (T9 module)
Support the WSLink t9 air-quality module:
  - t9hcho (formaldehyde, ppb),
  - t9voclv (VOC level 1-5 -> ENUM state)
  - t9bat (0-5 battery -> percentage).

  The t9hcho/t9voclv/t9bat values are dropped when
  t9cn reports the module as disconnected,
  so no empty entities are created.

  - const: HCHO/VOC/T9_BATTERY keys, VOCLevel enum +
  VOC_LEVEL_MAP, BATTERY_NON_BINARY, CONNECTION_GATED_SENSORS,
  REMAP_WSLINK_ITEMS entries
  - utils: voc_level_to_text(),
  battery_5step_to_pct(), connection gating
  - sensors_wslink: HCHO / VOC / T9_BATTERY entity
  descriptions
  - translations (en, cs): hcho, voc (+ states),
  t9_battery
  - tests: tests/conftest.py +
  tests/test_t9_air_quality.py
2026-07-25 21:47:49 +02:00
SchiZzA c71d1b33b5
Introduce SWSRuntimeData dataclass for typed entry.runtime_data.
Adds the SWSRuntimeData dataclass and SWSConfigEntry type alias so
  per-entry state can move from loosely-typed hass.data[DOMAIN][entry_id]
  dicts to HA 2025+ typed entry.runtime_data. The legacy ENTRY_* string
  keys are kept in place for now so callers can be migrated incrementally.

  This commit is not final update. Just preparing for future complete refactor.
2026-07-25 21:47:48 +02:00
SchiZzA 7025d8e193
Typos corrected. 2026-07-25 21:47:48 +02:00
schizza 0d8a5a884a
Add test-station-server as a submodule.
Include the test station server tool in the tools directory to facilitate local development and testing of weather station protocols.
2026-07-25 21:47:48 +02:00
schizza 9c9bca0c70
Implement Ecowitt protocol support and dynamic binary sensor discovery.
- Integrate aioecowitt to parse incoming weather station payloads and map sensors to the SWS pipeline.
- Add a new webhook endpoint at /weatherhub/{webhook_id} with support for dynamic route resolution.
- Expand battery binary sensor definitions and implement logic for dynamic entity creation.
- Bump version to 2.0.0-pre1.
2026-07-25 21:47:48 +02:00
SchiZzA dc69d20c3b
Add Ecowitt compatibility and deprecate legacy battery sensors. 2026-07-25 21:47:48 +02:00
SchiZzA 527162ded9
Update version to 2.0.pre0 2026-07-25 21:47:48 +02:00
SchiZzA e6d0c49e81
Use configured WSLink add-on port for health/status endpoints. 2026-07-25 21:47:47 +02:00
SchiZzA 1486238c5c
Improve sensor value parsing and add battery binary sensors.
- Introduce `to_int`/`to_float` helpers to safely handle None/blank payload values.
- Use the converters across weather/wslink sensor descriptions and simplify wind direction handling.
- Add low-battery binary sensor entities and definitions.
2026-07-25 21:47:47 +02:00
SchiZzA 64a5bdb1d7
Add configuration options for WSLink Addon port. 2026-07-25 21:47:47 +02:00
SchiZzA affd26e7a5
Add health diagnostics coordinator and routing snapshot
Track ingress/forwarding status, expose detailed health sensors and translations, and include redacted diagnostics data.
2026-07-25 21:47:47 +02:00
SchiZzA 95b3452318
Update constants to more readable form. 2026-07-25 21:47:47 +02:00
SchiZzA f0d24ebde3
Make routes method-aware and update related tests
Include HTTP method in route keys and dispatch, and fix
Routes.show_enabled.
Update register_path to accept a HealthCoordinator and adjust router
stubs in tests. Update WindyPush tests to use response objects
(status/text)
and adapt related exception/notification expectations.
2026-07-25 21:47:47 +02:00
SchiZzA 56950b5e1a
Improve Windy error handling and retry logic 2026-07-25 21:47:47 +02:00
SchiZzA 970828320b
Add multiple health sensors and device info
Introduce HealthSensorEntityDescription and a tuple of sensor
descriptions for integration status, source IP, base URL and addon
response. Instantiate one HealthDiagnosticSensor per description in
async_setup_entry. Update HealthDiagnosticSensor to accept a
description, derive unique_id from description.key and add a cached
device_info returning a SERVICE-type device. Adjust imports.
2026-07-25 21:47:46 +02:00
SchiZzA 8ecbc8c38d
Validate hass data with py_typecheck.checked
Replace manual isinstance checks and casts with py_typecheck.checked()
to validate hass and entry data and return early on errors. Simplify
add_new_sensors by unwrapping values, renaming vars, and passing the
coordinator to WeatherSensor
2026-07-25 21:47:46 +02:00
SchiZzA fa5d268004
Replace casts with checked type helpers
Use checked and checked_or to validate option and hass.data types,
remove unsafe typing.cast calls, simplify coordinator and entry_data
handling, and cache boolean option flags for Windy and Pocasí checks
2026-07-25 21:47:46 +02:00
SchiZzA 0f9bb0dab7
Removed extended debugging info from sensors. Added descriptive method on route info. 2026-07-25 21:47:46 +02:00
SchiZzA 68555160c7
Add WSLink support for additional sensor channels
- Extend constants and WSLink key remapping for channels 3–8 (temp, humidity, battery and connection)
- Add new WSLink sensor entity descriptions for the extra channel readings
- Update English translations for the newly added channel sensors and battery states
2026-07-25 21:47:46 +02:00
SchiZzA 38854698af
Align Windy resend with Stations API response handling
- Add WINDY_MAX_RETRIES constant and use it consistently when deciding to disable resending
- Refactor Windy response verification to rely on HTTP status codes per stations.windy.com API
- Improve error handling for missing password, duplicate payloads and rate limiting
- Enhance retry logging and disable Windy resend via persistent notification on repeated failures
2026-07-25 21:47:46 +02:00
SchiZzA 9ed0a10ffa
Stabilize webhook routing and config updates
- Register aiohttp webhook routes once and switch the active dispatcher handler on option changes
- Make the internal route registry method-aware (GET/POST) and improve enabled-route logging
- Fix OptionsFlow initialization by passing the config entry and using safe defaults for credentials
- Harden Windy resend by validating credentials early, auto-disabling the feature on invalid responses, and notifying the user
- Update translations for Windy credential validation errors
2026-07-25 21:47:45 +02:00
SchiZzA 03d4e43a08
Organize imports in `__init__.py` 2026-07-25 21:45:08 +02:00
SchiZzA dfd2a2c05a
Added support for GET and POST endpoints. 2026-07-25 21:45:08 +02:00
SchiZzA 0060369d8a
Add health diagnostic sensor and extensive tests for sws12500
integration

- Introduce HealthDiagnosticSensor for device health status reporting
- Add new constants and data keys for health sensor integration
- Wire health_sensor module into sensor platform setup
- Refactor sensor descriptions to improve derived sensor handling
- Implement pytest fixtures and comprehensive tests covering:
  - Config flows and options validation
  - Data reception and authentication
  - Sensor platform setup and dynamic sensor addition
  - Push integration with Pocasi.cz and Windy API
  - Route dispatching and error handling
  - Utilities, conversions, and translation functions
2026-07-25 21:45:08 +02:00
SchiZzA 56c73a46a2
Remove numpy dependency and simplify range checks in heat_index function 2026-07-25 21:45:08 +02:00
SchiZzA 8aaa1aa2df
Fix typo in fallback handler name from unregistred to unregistered 2026-07-25 21:45:08 +02:00
SchiZzA 68302c3cfb
Anonymize data payload in PocasiPush logging 2026-07-25 21:45:08 +02:00
SchiZzA e6e173e229
Remove verify_ssl=False from async_get_clientsession calls 2026-07-25 21:45:07 +02:00
SchiZzA aff850492d
Update Windy integration to use station ID and password authentication
- Replace API key with station ID and password for authentication
- Change Windy API endpoint to v2 observation update
- Adapt data conversion for WSLink to Windy format
- Update config flow and translations accordingly
2026-07-25 21:45:07 +02:00
SchiZzA 2cbc198fd0
Update README.md 2026-07-25 21:45:07 +02:00
schizza 078af9a325
Cherry pick README.md 2026-07-25 21:45:07 +02:00
SchiZzA 144108fba1
Refactor SWS12500 integration for push-based updates
- Add detailed architecture overview in __init__.py
- Introduce shared runtime keys in data.py to avoid key conflicts
- Implement dual route dispatcher for webhook endpoint selection
- Enhance sensor platform for dynamic sensor addition without reloads
- Rename battery level "unknown" to "drained" with updated icons
- Improve utils.py with centralized helpers for remapping and discovery
- Update translations and strings for consistency
2026-07-25 21:45:07 +02:00
SchiZzA 42e7225477
Improve data validation and error logging in utils.py 2026-07-25 21:45:07 +02:00
SchiZzA 21e1b81bb8
Rename battery_level_to_text to battery_level and update docstring 2026-07-25 21:45:06 +02:00
SchiZzA c530a74503
Fix logging of unregistered route to include path 2026-07-25 21:45:06 +02:00
SchiZzA d814c9942d
Improve type safety, add data validation, and refactor route handling
- Add typing and runtime checks with py_typecheck for config options and
  incoming data
- Enhance authentication validation and error handling in data
  coordinator
- Refactor Routes class with better dispatch logic and route
  enabling/disabling
- Clean up async functions and improve logging consistency
- Add type hints and annotations throughout the integration
- Update manifest to include typecheck-runtime dependency
2026-07-25 21:45:06 +02:00
SchiZzA 35fd0585f9
Config_flow for Ecowitt 2026-07-25 21:45:06 +02:00
SchiZzA aaaab107de
Refactor config_flow, add support for Ecowitt configuration 2026-07-25 21:45:06 +02:00
SchiZzA 7582f1e9b4
fix: Corrected RAIN and DAILYRAIN for PWS protocol.
The `RAININ` suppose to be accumulated rainfall in 60 minutes. So the
unit must be in `mm/h` or `in/h`.
In the opposite `DAILYRAIN` is rain in the day do far, represented in
accumulated `mm` or `in`.
2026-05-18 20:49:01 +02:00