200 files
This commit is contained in:
1 parent
ff4156dc89
commit
8769f3b12b
201 files changed
+5190
-24141
No files matched your search
@@ -21,6 +21,7 @@ from ..const import (
|
||||
CONF_NOTIFICATIONS_ENABLED,
|
||||
CONF_NOTIFY_DUE_SOON_ENABLED,
|
||||
CONF_NOTIFY_DUE_SOON_INTERVAL,
|
||||
CONF_NOTIFY_EVENT_ONLY,
|
||||
CONF_NOTIFY_OVERDUE_ENABLED,
|
||||
CONF_NOTIFY_OVERDUE_INTERVAL,
|
||||
CONF_NOTIFY_SERVICE,
|
||||
@@ -804,8 +805,13 @@ class NotificationManager:
|
||||
if not target_services and self.notify_service:
|
||||
target_services = [self.notify_service]
|
||||
if not target_services:
|
||||
_LOGGER.warning("No notification services available")
|
||||
return False
|
||||
if self.event_only:
|
||||
# #173: "only fire the event" needs no notify service — the
|
||||
# automation IS the delivery. One event, empty target.
|
||||
target_services = [""]
|
||||
else:
|
||||
_LOGGER.warning("No notification services available")
|
||||
return False
|
||||
|
||||
success = False
|
||||
for service in target_services:
|
||||
@@ -845,6 +851,17 @@ class NotificationManager:
|
||||
"""Get the configured notify service."""
|
||||
return str(self._global_options.get(CONF_NOTIFY_SERVICE, ""))
|
||||
|
||||
@property
|
||||
def _has_target(self) -> bool:
|
||||
"""A send has somewhere to go: a notify service, or event-only mode
|
||||
(#173), where the event itself is the delivery."""
|
||||
return bool(self.notify_service) or self.event_only
|
||||
|
||||
@property
|
||||
def event_only(self) -> bool:
|
||||
"""#165/#173: the user routes every notification through the event."""
|
||||
return bool(self._global_options.get(CONF_NOTIFY_EVENT_ONLY, False))
|
||||
|
||||
@property
|
||||
def title_style(self) -> str:
|
||||
"""v1.4.0 (#44): how to format the notification title.
|
||||
@@ -1213,7 +1230,7 @@ class NotificationManager:
|
||||
) -> None:
|
||||
"""Send a single bundled notification summarising multiple tasks."""
|
||||
self.async_verify_configured_service()
|
||||
if not self.enabled or not self.notify_service:
|
||||
if not self.enabled or not self._has_target:
|
||||
return
|
||||
|
||||
if self._is_quiet_hours():
|
||||
@@ -1282,7 +1299,7 @@ class NotificationManager:
|
||||
hour the user chose by enabling the digest).
|
||||
"""
|
||||
self.async_verify_configured_service()
|
||||
if not self.enabled or not self.notify_service:
|
||||
if not self.enabled or not self._has_target:
|
||||
return
|
||||
lang = self._lang
|
||||
service_data = _service_payload(
|
||||
@@ -1303,7 +1320,7 @@ class NotificationManager:
|
||||
a scheduled once-a-day send that skips rate-limit / quiet-hours gating.
|
||||
"""
|
||||
self.async_verify_configured_service()
|
||||
if not self.enabled or not self.notify_service or not names:
|
||||
if not self.enabled or not self._has_target or not names:
|
||||
return
|
||||
lang = self._lang
|
||||
service_data = _service_payload(
|
||||
@@ -1401,7 +1418,7 @@ class NotificationManager:
|
||||
currency_symbol: str = "€",
|
||||
) -> None:
|
||||
"""Send a budget threshold alert notification."""
|
||||
if not self.enabled or not self.notify_service:
|
||||
if not self.enabled or not self._has_target:
|
||||
return
|
||||
|
||||
if self._is_quiet_hours():
|
||||
|
||||
@@ -233,11 +233,18 @@ SIGNATURES: dict[str, IntegrationSignature] = {
|
||||
),
|
||||
"ha_washdata": IntegrationSignature(
|
||||
name="WashData (smart-plug cycles)",
|
||||
verified="2026-08-02 @ 3dg1luk43/ha_washdata main sensor.py + const.py (HACS default)",
|
||||
verified="2026-09-10 @ 3dg1luk43/ha_washdata main (0.5.5) + branch 0.5.6 sensor.py/manager.py (HACS default)",
|
||||
source=(
|
||||
"HACS ha_washdata: tk 'cycle_count' (unit 'cycles') — lifetime "
|
||||
"count of appliance cycles DETECTED from smart-plug power "
|
||||
"monitoring. The integration ships its OWN maintenance taxonomy "
|
||||
"HACS ha_washdata: tk 'cycle_count' (unit 'cycles'). CAVEAT up to "
|
||||
"0.5.5: the sensor is len(stored cycle records), capped at "
|
||||
"DEFAULT_MAX_PAST_CYCLES=200 and lowered when a record is deleted "
|
||||
"— a delta task freezes once the cap is reached (our D#172, "
|
||||
"upstream discussion 414). From 0.5.6 (PR #420) the SAME entity "
|
||||
"reports the monotonic lifetime odometer (old value in attribute "
|
||||
"'stored_cycles'; state_class total, user-correctable downward), "
|
||||
"so the value jumps once on that update — a Reset re-anchors the "
|
||||
"task. Cycles are DETECTED from smart-plug power monitoring. The "
|
||||
"integration ships its OWN maintenance taxonomy "
|
||||
"(MAINTENANCE_EVENT_TYPES + DEFAULT_MAINTENANCE_REMINDER_CYCLES: "
|
||||
"descale 30 / filter_clean 50 / drum_clean 100), but shows it "
|
||||
"only inside its panel — no due-entity, no notifications. These "
|
||||
|
||||
Reference in new issue
Block a user