mirror of
https://github.com/jpawlowski/hass.tibber_prices.git
synced 2026-03-29 21:03:40 +00:00
feat(sensor): convert timing sensors to hour-based display with minute attributes
Convert best_price and peak_price timing sensors to display in hours (UI-friendly)
while retaining minute values in attributes (automation-friendly). This improves
readability in dashboards by using Home Assistant's automatic duration formatting
"1 h 35 min" instead of decimal "1.58 h".
BREAKING CHANGE: State unit changed from minutes to hours for 6 timing sensors.
Affected sensors:
* best_price_period_duration, best_price_remaining_minutes, best_price_next_in_minutes
* peak_price_period_duration, peak_price_remaining_minutes, peak_price_next_in_minutes
Migration guide for users:
- If your automations use {{ state_attr(..., 'remaining_time') }} or similar:
No action needed - attribute values remain in minutes
- If your automations use {{ states('sensor.best_price_remaining_minutes') }} directly:
Update to use the minute attribute instead: {{ state_attr('sensor.best_price_remaining_minutes', 'remaining_minutes') }}
- If your dashboards display the state value:
Values now show as "1 h 35 min" instead of "95" - this is the intended improvement
- If your templates do math with the state: multiply by 60 to convert hours back to minutes
Before: remaining * 60
After: remaining_minutes (use attribute directly)
Implementation details:
- Timing sensors now use device_class=DURATION, unit=HOURS, precision=2
- State values converted from minutes to hours via _minutes_to_hours()
- New minute-precision attributes added for automation compatibility:
* period_duration_minutes (for checking if period is long enough)
* remaining_minutes (for countdown-based automation logic)
* next_in_minutes (for time-to-event automation triggers)
- Translation improvements across all 5 languages (en, de, nb, nl, sv):
* Descriptions now clarify state in hours vs attributes in minutes
* Long descriptions explain dual-format architecture
* Usage tips updated to reference minute attributes for automations
* All translation files synchronized (fixed order, removed duplicates)
- Type safety: Added type assertions (cast) for timing calculator results to
satisfy Pyright type checking (handles both float and datetime return types)
Home Assistant now automatically formats these durations as "1 h 35 min" for improved
UX, matching the behavior of battery.remaining_time and other duration sensors.
Rationale for breaking change:
The previous minute-based state was unintuitive for users ("95 minutes" doesn't
immediately convey "1.5 hours") and didn't match Home Assistant's standard duration
formatting. The new hour-based state with minute attributes provides:
- Better UX: Automatic "1 h 35 min" formatting in UI
- Full automation compatibility: Minute attributes for all calculation needs
- Consistency: Matches HA's duration sensor pattern (battery, timer, etc.)
Impact: Timing sensors now display in human-readable hours with full backward
compatibility via minute attributes. Users relying on direct state access must
migrate to minute attributes (simple change, documented above).
This commit is contained in:
parent
09a50dccff
commit
0a4af0de2f
9 changed files with 228 additions and 176 deletions
|
|
@ -321,14 +321,14 @@
|
||||||
"usage_tips": "Nutze dies, um einen Countdown wie 'Günstiger Zeitraum endet in 2 Stunden' (wenn aktiv) oder 'Nächster günstiger Zeitraum endet um 14:00' (wenn inaktiv) anzuzeigen. Home Assistant zeigt automatisch relative Zeit für Zeitstempel-Sensoren an."
|
"usage_tips": "Nutze dies, um einen Countdown wie 'Günstiger Zeitraum endet in 2 Stunden' (wenn aktiv) oder 'Nächster günstiger Zeitraum endet um 14:00' (wenn inaktiv) anzuzeigen. Home Assistant zeigt automatisch relative Zeit für Zeitstempel-Sensoren an."
|
||||||
},
|
},
|
||||||
"best_price_period_duration": {
|
"best_price_period_duration": {
|
||||||
"description": "Gesamtlänge des aktuellen oder nächsten günstigen Zeitraums in Minuten",
|
"description": "Gesamtlänge des aktuellen oder nächsten günstigen Zeitraums",
|
||||||
"long_description": "Zeigt, wie lange der günstige Zeitraum insgesamt dauert. Während eines aktiven Zeitraums zeigt dies die Dauer des aktuellen Zeitraums. Wenn kein Zeitraum aktiv ist, zeigt dies die Dauer des nächsten kommenden Zeitraums. Gibt nur 'Unbekannt' zurück, wenn keine Zeiträume ermittelt wurden.",
|
"long_description": "Zeigt, wie lange der günstige Zeitraum insgesamt dauert. Der State wird in Stunden angezeigt (z. B. 1,5 h) für eine einfache Lesbarkeit in der UI, während das Attribut `period_duration_minutes` denselben Wert in Minuten bereitstellt (z. B. 90) für Automationen. Während eines aktiven Zeitraums zeigt dies die Dauer des aktuellen Zeitraums. Wenn kein Zeitraum aktiv ist, zeigt dies die Dauer des nächsten kommenden Zeitraums. Gibt nur 'Unbekannt' zurück, wenn keine Zeiträume ermittelt wurden.",
|
||||||
"usage_tips": "Nützlich für Planung: 'Der nächste günstige Zeitraum dauert 90 Minuten' oder 'Der aktuelle günstige Zeitraum ist 120 Minuten lang'. Kombiniere mit remaining_minutes, um zu berechnen, wann langlaufende Geräte gestartet werden sollten."
|
"usage_tips": "Für Anzeige: State-Wert (Stunden) in Dashboards nutzen. Für Automationen: Attribut `period_duration_minutes` verwenden, um zu prüfen, ob genug Zeit für langläufige Geräte ist (z. B. 'Wenn period_duration_minutes >= 90, starte Waschmaschine')."
|
||||||
},
|
},
|
||||||
"best_price_remaining_minutes": {
|
"best_price_remaining_minutes": {
|
||||||
"description": "Verbleibende Minuten im aktuellen günstigen Zeitraum (0 wenn inaktiv)",
|
"description": "Verbleibende Zeit im aktuellen günstigen Zeitraum",
|
||||||
"long_description": "Zeigt, wie viele Minuten im aktuellen günstigen Zeitraum noch verbleiben. Gibt 0 zurück, wenn kein Zeitraum aktiv ist. Aktualisiert sich jede Minute. Prüfe binary_sensor.best_price_period, um zu sehen, ob ein Zeitraum aktuell aktiv ist.",
|
"long_description": "Zeigt, wie viel Zeit im aktuellen günstigen Zeitraum noch verbleibt. Der State wird in Stunden angezeigt (z. B. 0,5 h) für eine einfache Lesbarkeit, während das Attribut `remaining_minutes` Minuten bereitstellt (z. B. 30) für Automationslogik. Gibt 0 zurück, wenn kein Zeitraum aktiv ist. Aktualisiert sich jede Minute. Prüfe binary_sensor.best_price_period, um zu sehen, ob ein Zeitraum aktuell aktiv ist.",
|
||||||
"usage_tips": "Perfekt für Automatisierungen: 'Wenn remaining_minutes > 0 UND remaining_minutes < 30, starte Waschmaschine jetzt'. Der Wert 0 macht es einfach zu prüfen, ob ein Zeitraum aktiv ist (Wert > 0) oder nicht (Wert = 0)."
|
"usage_tips": "Für Automationen: Attribut `remaining_minutes` mit numerischen Vergleichen nutzen wie 'Wenn remaining_minutes > 0 UND remaining_minutes < 30, starte Waschmaschine jetzt'. Der Wert 0 macht es einfach zu prüfen, ob ein Zeitraum aktiv ist (Wert > 0) oder nicht (Wert = 0)."
|
||||||
},
|
},
|
||||||
"best_price_progress": {
|
"best_price_progress": {
|
||||||
"description": "Fortschritt durch aktuellen günstigen Zeitraum (0% wenn inaktiv)",
|
"description": "Fortschritt durch aktuellen günstigen Zeitraum (0% wenn inaktiv)",
|
||||||
|
|
@ -341,9 +341,9 @@
|
||||||
"usage_tips": "Immer nützlich für Vorausplanung: 'Nächster günstiger Zeitraum startet in 3 Stunden' (egal, ob du gerade in einem Zeitraum bist oder nicht). Kombiniere mit Automatisierungen: 'Wenn nächste Startzeit in 10 Minuten ist, sende Benachrichtigung zur Vorbereitung der Waschmaschine'."
|
"usage_tips": "Immer nützlich für Vorausplanung: 'Nächster günstiger Zeitraum startet in 3 Stunden' (egal, ob du gerade in einem Zeitraum bist oder nicht). Kombiniere mit Automatisierungen: 'Wenn nächste Startzeit in 10 Minuten ist, sende Benachrichtigung zur Vorbereitung der Waschmaschine'."
|
||||||
},
|
},
|
||||||
"best_price_next_in_minutes": {
|
"best_price_next_in_minutes": {
|
||||||
"description": "Minuten bis nächster günstiger Zeitraum startet (0 beim Übergang)",
|
"description": "Zeit bis zum nächsten günstigen Zeitraum",
|
||||||
"long_description": "Zeigt Minuten bis der nächste günstige Zeitraum startet. Während eines aktiven Zeitraums zeigt dies die Zeit bis zum Zeitraum nach dem aktuellen. Gibt 0 während kurzer Übergangsphasen zurück. Aktualisiert sich jede Minute.",
|
"long_description": "Zeigt, wie lange es bis zum nächsten günstigen Zeitraum dauert. Der State wird in Stunden angezeigt (z. B. 2,25 h) für Dashboards, während das Attribut `next_in_minutes` Minuten bereitstellt (z. B. 135) für Automationsbedingungen. Während eines aktiven Zeitraums zeigt dies die Zeit bis zum Zeitraum nach dem aktuellen. Gibt 0 während kurzer Übergangsphasen zurück. Aktualisiert sich jede Minute.",
|
||||||
"usage_tips": "Perfekt für 'warte bis günstiger Zeitraum' Automatisierungen: 'Wenn next_in_minutes > 0 UND next_in_minutes < 15, warte, bevor du die Geschirrspülmaschine startest'. Wert > 0 zeigt immer an, dass ein zukünftiger Zeitraum geplant ist."
|
"usage_tips": "Für Automationen: Attribut `next_in_minutes` nutzen wie 'Wenn next_in_minutes > 0 UND next_in_minutes < 15, warte, bevor du die Geschirrspülmaschine startest'. Wert > 0 zeigt immer an, dass ein zukünftiger Zeitraum geplant ist."
|
||||||
},
|
},
|
||||||
"peak_price_end_time": {
|
"peak_price_end_time": {
|
||||||
"description": "Wann der aktuelle oder nächste teure Zeitraum endet",
|
"description": "Wann der aktuelle oder nächste teure Zeitraum endet",
|
||||||
|
|
@ -351,14 +351,14 @@
|
||||||
"usage_tips": "Nutze dies, um 'Teurer Zeitraum endet in 1 Stunde' (wenn aktiv) oder 'Nächster teurer Zeitraum endet um 18:00' (wenn inaktiv) anzuzeigen. Kombiniere mit Automatisierungen, um den Betrieb nach der Spitzenzeit fortzusetzen."
|
"usage_tips": "Nutze dies, um 'Teurer Zeitraum endet in 1 Stunde' (wenn aktiv) oder 'Nächster teurer Zeitraum endet um 18:00' (wenn inaktiv) anzuzeigen. Kombiniere mit Automatisierungen, um den Betrieb nach der Spitzenzeit fortzusetzen."
|
||||||
},
|
},
|
||||||
"peak_price_period_duration": {
|
"peak_price_period_duration": {
|
||||||
"description": "Gesamtlänge des aktuellen oder nächsten teuren Zeitraums in Minuten",
|
"description": "Länge des aktuellen/nächsten teuren Zeitraums",
|
||||||
"long_description": "Zeigt, wie lange der teure Zeitraum insgesamt dauert. Während eines aktiven Zeitraums zeigt dies die Dauer des aktuellen Zeitraums. Wenn kein Zeitraum aktiv ist, zeigt dies die Dauer des nächsten kommenden Zeitraums. Gibt nur 'Unbekannt' zurück, wenn keine Zeiträume ermittelt wurden.",
|
"long_description": "Gesamtdauer des aktuellen oder nächsten teuren Zeitraums. Der State wird in Stunden angezeigt (z. B. 1,5 h) für leichtes Ablesen in der UI, während das Attribut `period_duration_minutes` denselben Wert in Minuten bereitstellt (z. B. 90) für Automationen. Dieser Wert repräsentiert die **volle geplante Dauer** des Zeitraums und ist konstant während des gesamten Zeitraums, auch wenn die verbleibende Zeit (remaining_minutes) abnimmt.",
|
||||||
"usage_tips": "Nützlich für Planung: 'Der nächste teure Zeitraum dauert 60 Minuten' oder 'Der aktuelle Spitzenzeitraum ist 90 Minuten lang'. Kombiniere mit remaining_minutes, um zu entscheiden, ob die Spitze abgewartet oder der Betrieb fortgesetzt werden soll."
|
"usage_tips": "Kombiniere mit remaining_minutes, um zu berechnen, wann langlaufende Geräte gestoppt werden sollen: Zeitraum begann vor `period_duration_minutes - remaining_minutes` Minuten. Dieses Attribut unterstützt Energiespar-Strategien, indem es hilft, Hochverbrauchsaktivitäten außerhalb teurer Perioden zu planen."
|
||||||
},
|
},
|
||||||
"peak_price_remaining_minutes": {
|
"peak_price_remaining_minutes": {
|
||||||
"description": "Verbleibende Minuten im aktuellen teuren Zeitraum (0 wenn inaktiv)",
|
"description": "Verbleibende Zeit im aktuellen teuren Zeitraum",
|
||||||
"long_description": "Zeigt, wie viele Minuten im aktuellen teuren Zeitraum noch verbleiben. Gibt 0 zurück, wenn kein Zeitraum aktiv ist. Aktualisiert sich jede Minute. Prüfe binary_sensor.peak_price_period, um zu sehen, ob ein Zeitraum aktuell aktiv ist.",
|
"long_description": "Zeigt, wie viel Zeit im aktuellen teuren Zeitraum noch verbleibt. Der State wird in Stunden angezeigt (z. B. 0,75 h) für einfaches Ablesen in Dashboards, während das Attribut `remaining_minutes` dieselbe Zeit in Minuten liefert (z. B. 45) für Automationsbedingungen. **Countdown-Timer**: Dieser Wert dekrementiert jede Minute während eines aktiven Zeitraums. Gibt 0 zurück, wenn kein teurer Zeitraum aktiv ist. Aktualisiert sich minütlich.",
|
||||||
"usage_tips": "Nutze in Automatisierungen: 'Wenn remaining_minutes > 60, breche aufgeschobene Ladesitzung ab'. Wert 0 macht es einfach zu unterscheiden zwischen aktivem (Wert > 0) und inaktivem (Wert = 0) Zeitraum."
|
"usage_tips": "Für Automationen: Nutze Attribut `remaining_minutes` wie 'Wenn remaining_minutes > 60, setze Heizung auf Energiesparmodus' oder 'Wenn remaining_minutes < 15, erhöhe Temperatur wieder'. UI zeigt benutzerfreundliche Stunden (z. B. 1,25 h). Wert 0 zeigt an, dass kein teurer Zeitraum aktiv ist."
|
||||||
},
|
},
|
||||||
"peak_price_progress": {
|
"peak_price_progress": {
|
||||||
"description": "Fortschritt durch aktuellen teuren Zeitraum (0% wenn inaktiv)",
|
"description": "Fortschritt durch aktuellen teuren Zeitraum (0% wenn inaktiv)",
|
||||||
|
|
@ -371,9 +371,9 @@
|
||||||
"usage_tips": "Immer nützlich für Planung: 'Nächster teurer Zeitraum startet in 2 Stunden'. Automatisierung: 'Wenn nächste Startzeit in 30 Minuten ist, reduziere Heiztemperatur vorsorglich'."
|
"usage_tips": "Immer nützlich für Planung: 'Nächster teurer Zeitraum startet in 2 Stunden'. Automatisierung: 'Wenn nächste Startzeit in 30 Minuten ist, reduziere Heiztemperatur vorsorglich'."
|
||||||
},
|
},
|
||||||
"peak_price_next_in_minutes": {
|
"peak_price_next_in_minutes": {
|
||||||
"description": "Minuten bis nächster teurer Zeitraum startet (0 beim Übergang)",
|
"description": "Zeit bis zum nächsten teuren Zeitraum",
|
||||||
"long_description": "Zeigt Minuten bis der nächste teure Zeitraum startet. Während eines aktiven Zeitraums zeigt dies die Zeit bis zum Zeitraum nach dem aktuellen. Gibt 0 während kurzer Übergangsphasen zurück. Aktualisiert sich jede Minute.",
|
"long_description": "Zeigt, wie lange es bis zum nächsten teuren Zeitraum dauert. Der State wird in Stunden angezeigt (z. B. 2,25 h) für Dashboards, während das Attribut `next_in_minutes` Minuten bereitstellt (z. B. 135) für Automationsbedingungen. Während eines aktiven Zeitraums zeigt dies die Zeit bis zum Zeitraum nach dem aktuellen. Gibt 0 während kurzer Übergangsphasen zurück. Aktualisiert sich jede Minute.",
|
||||||
"usage_tips": "Präventive Automatisierung: 'Wenn next_in_minutes > 0 UND next_in_minutes < 10, beende aktuellen Ladezyklus jetzt, bevor die Preise steigen'."
|
"usage_tips": "Für Automationen: Attribut `next_in_minutes` nutzen wie 'Wenn next_in_minutes > 0 UND next_in_minutes < 10, reduziere Heizung vorsorglich bevor der teure Zeitraum beginnt'. Wert > 0 zeigt immer an, dass ein zukünftiger teurer Zeitraum geplant ist."
|
||||||
},
|
},
|
||||||
"home_type": {
|
"home_type": {
|
||||||
"description": "Art der Wohnung (Wohnung, Haus usw.)",
|
"description": "Art der Wohnung (Wohnung, Haus usw.)",
|
||||||
|
|
|
||||||
|
|
@ -321,14 +321,14 @@
|
||||||
"usage_tips": "Use this to display a countdown like 'Cheap period ends in 2 hours' (when active) or 'Next cheap period ends at 14:00' (when inactive). Home Assistant automatically shows relative time for timestamp sensors."
|
"usage_tips": "Use this to display a countdown like 'Cheap period ends in 2 hours' (when active) or 'Next cheap period ends at 14:00' (when inactive). Home Assistant automatically shows relative time for timestamp sensors."
|
||||||
},
|
},
|
||||||
"best_price_period_duration": {
|
"best_price_period_duration": {
|
||||||
"description": "Total length of current or next best price period in minutes",
|
"description": "Total length of current or next best price period",
|
||||||
"long_description": "Shows how long the best price period lasts in total. During an active period, shows the duration of the current period. When no period is active, shows the duration of the next upcoming period. Returns 'Unknown' only when no periods are configured.",
|
"long_description": "Shows how long the best price period lasts in total. The state is displayed in hours (e.g., 1.5 h) for easy reading in the UI, while the `period_duration_minutes` attribute provides the same value in minutes (e.g., 90) for use in automations. During an active period, shows the duration of the current period. When no period is active, shows the duration of the next upcoming period. Returns 'Unknown' only when no periods are configured.",
|
||||||
"usage_tips": "Useful for planning: 'The next cheap period lasts 90 minutes' or 'Current cheap period is 120 minutes long'. Combine with remaining_minutes to calculate when to start long-running appliances."
|
"usage_tips": "For display: Use the state value (hours) in dashboards. For automations: Use `period_duration_minutes` attribute to check if there's enough time for long-running tasks (e.g., 'If period_duration_minutes >= 90, start washing machine')."
|
||||||
},
|
},
|
||||||
"best_price_remaining_minutes": {
|
"best_price_remaining_minutes": {
|
||||||
"description": "Minutes remaining in current best price period (0 when inactive)",
|
"description": "Time remaining in current best price period",
|
||||||
"long_description": "Shows how many minutes are left in the current best price period. Returns 0 when no period is active. Updates every minute. Check binary_sensor.best_price_period to see if a period is currently active.",
|
"long_description": "Shows how much time is left in the current best price period. The state displays in hours (e.g., 0.5 h) for easy reading, while the `remaining_minutes` attribute provides minutes (e.g., 30) for automation logic. Returns 0 when no period is active. Updates every minute. Check binary_sensor.best_price_period to see if a period is currently active.",
|
||||||
"usage_tips": "Perfect for automations: 'If remaining_minutes > 0 AND remaining_minutes < 30, start washing machine now'. The value 0 makes it easy to check if a period is active (value > 0) or not (value = 0)."
|
"usage_tips": "For automations: Use `remaining_minutes` attribute with numeric comparisons like 'If remaining_minutes > 0 AND remaining_minutes < 30, start washing machine now'. The value 0 makes it easy to check if a period is active (value > 0) or not (value = 0)."
|
||||||
},
|
},
|
||||||
"best_price_progress": {
|
"best_price_progress": {
|
||||||
"description": "Progress through current best price period (0% when inactive)",
|
"description": "Progress through current best price period (0% when inactive)",
|
||||||
|
|
@ -341,9 +341,9 @@
|
||||||
"usage_tips": "Always useful for planning ahead: 'Next cheap period starts in 3 hours' (whether you're in a period now or not). Combine with automations: 'When next start time is in 10 minutes, send notification to prepare washing machine'."
|
"usage_tips": "Always useful for planning ahead: 'Next cheap period starts in 3 hours' (whether you're in a period now or not). Combine with automations: 'When next start time is in 10 minutes, send notification to prepare washing machine'."
|
||||||
},
|
},
|
||||||
"best_price_next_in_minutes": {
|
"best_price_next_in_minutes": {
|
||||||
"description": "Minutes until next best price period starts (0 when in transition)",
|
"description": "Time until next best price period starts",
|
||||||
"long_description": "Shows minutes until the next best price period starts. During an active period, shows time until the period AFTER the current one. Returns 0 during brief transition moments. Updates every minute.",
|
"long_description": "Shows how long until the next best price period starts. The state displays in hours (e.g., 2.25 h) for dashboards, while the `next_in_minutes` attribute provides minutes (e.g., 135) for automation conditions. During an active period, shows time until the period AFTER the current one. Returns 0 during brief transition moments. Updates every minute.",
|
||||||
"usage_tips": "Perfect for 'wait until cheap period' automations: 'If next_in_minutes > 0 AND next_in_minutes < 15, wait before starting dishwasher'. Value > 0 always indicates a future period is scheduled."
|
"usage_tips": "For automations: Use `next_in_minutes` attribute like 'If next_in_minutes > 0 AND next_in_minutes < 15, wait before starting dishwasher'. Value > 0 always indicates a future period is scheduled."
|
||||||
},
|
},
|
||||||
"peak_price_end_time": {
|
"peak_price_end_time": {
|
||||||
"description": "When the current or next peak price period ends",
|
"description": "When the current or next peak price period ends",
|
||||||
|
|
@ -351,14 +351,14 @@
|
||||||
"usage_tips": "Use this to display 'Expensive period ends in 1 hour' (when active) or 'Next expensive period ends at 18:00' (when inactive). Combine with automations to resume operations after peak."
|
"usage_tips": "Use this to display 'Expensive period ends in 1 hour' (when active) or 'Next expensive period ends at 18:00' (when inactive). Combine with automations to resume operations after peak."
|
||||||
},
|
},
|
||||||
"peak_price_period_duration": {
|
"peak_price_period_duration": {
|
||||||
"description": "Total length of current or next peak price period in minutes",
|
"description": "Total length of current or next peak price period",
|
||||||
"long_description": "Shows how long the peak price period lasts in total. During an active period, shows the duration of the current period. When no period is active, shows the duration of the next upcoming period. Returns 'Unknown' only when no periods are configured.",
|
"long_description": "Shows how long the peak price period lasts in total. The state is displayed in hours (e.g., 0.75 h) for easy reading in the UI, while the `period_duration_minutes` attribute provides the same value in minutes (e.g., 45) for use in automations. During an active period, shows the duration of the current period. When no period is active, shows the duration of the next upcoming period. Returns 'Unknown' only when no periods are configured.",
|
||||||
"usage_tips": "Useful for planning: 'The next expensive period lasts 60 minutes' or 'Current peak is 90 minutes long'. Combine with remaining_minutes to decide whether to wait out the peak or proceed with operations."
|
"usage_tips": "For display: Use the state value (hours) in dashboards. For automations: Use `period_duration_minutes` attribute to decide whether to wait out the peak or proceed (e.g., 'If period_duration_minutes <= 60, pause operations')."
|
||||||
},
|
},
|
||||||
"peak_price_remaining_minutes": {
|
"peak_price_remaining_minutes": {
|
||||||
"description": "Minutes remaining in current peak price period (0 when inactive)",
|
"description": "Time remaining in current peak price period",
|
||||||
"long_description": "Shows how many minutes are left in the current peak price period. Returns 0 when no period is active. Updates every minute. Check binary_sensor.peak_price_period to see if a period is currently active.",
|
"long_description": "Shows how much time is left in the current peak price period. The state displays in hours (e.g., 1.0 h) for easy reading, while the `remaining_minutes` attribute provides minutes (e.g., 60) for automation logic. Returns 0 when no period is active. Updates every minute. Check binary_sensor.peak_price_period to see if a period is currently active.",
|
||||||
"usage_tips": "Use in automations: 'If remaining_minutes > 60, cancel deferred charging session'. Value 0 makes it easy to distinguish active (value > 0) from inactive (value = 0) periods."
|
"usage_tips": "For automations: Use `remaining_minutes` attribute like 'If remaining_minutes > 60, cancel deferred charging session'. Value 0 makes it easy to distinguish active (value > 0) from inactive (value = 0) periods."
|
||||||
},
|
},
|
||||||
"peak_price_progress": {
|
"peak_price_progress": {
|
||||||
"description": "Progress through current peak price period (0% when inactive)",
|
"description": "Progress through current peak price period (0% when inactive)",
|
||||||
|
|
@ -371,9 +371,9 @@
|
||||||
"usage_tips": "Always useful for planning: 'Next expensive period starts in 2 hours'. Automation: 'When next start time is in 30 minutes, reduce heating temperature preemptively'."
|
"usage_tips": "Always useful for planning: 'Next expensive period starts in 2 hours'. Automation: 'When next start time is in 30 minutes, reduce heating temperature preemptively'."
|
||||||
},
|
},
|
||||||
"peak_price_next_in_minutes": {
|
"peak_price_next_in_minutes": {
|
||||||
"description": "Minutes until next peak price period starts (0 when in transition)",
|
"description": "Time until next peak price period starts",
|
||||||
"long_description": "Shows minutes until the next peak price period starts. During an active period, shows time until the period AFTER the current one. Returns 0 during brief transition moments. Updates every minute.",
|
"long_description": "Shows how long until the next peak price period starts. The state displays in hours (e.g., 0.5 h) for dashboards, while the `next_in_minutes` attribute provides minutes (e.g., 30) for automation conditions. During an active period, shows time until the period AFTER the current one. Returns 0 during brief transition moments. Updates every minute.",
|
||||||
"usage_tips": "Pre-emptive automation: 'If next_in_minutes > 0 AND next_in_minutes < 10, complete current charging cycle now before prices increase'."
|
"usage_tips": "For automations: Use `next_in_minutes` attribute like 'If next_in_minutes > 0 AND next_in_minutes < 10, complete current charging cycle now before prices increase'."
|
||||||
},
|
},
|
||||||
"home_type": {
|
"home_type": {
|
||||||
"description": "Type of home (apartment, house, etc.)",
|
"description": "Type of home (apartment, house, etc.)",
|
||||||
|
|
|
||||||
|
|
@ -316,39 +316,49 @@
|
||||||
"usage_tips": "Bruk denne diagnosesensoren for å forstå dataferskhet og API-anropsmønstre. Sjekk 'cache_age'-attributtet for å se hvor gamle de nåværende dataene er. Overvåk 'next_api_poll' for å vite når neste oppdatering er planlagt. Bruk 'data_completeness' for å se om data for i går/i dag/i morgen er tilgjengelig. 'api_calls_today'-telleren hjelper med å spore API-bruk. Perfekt for feilsøking eller forståelse av integrasjonens oppførsel."
|
"usage_tips": "Bruk denne diagnosesensoren for å forstå dataferskhet og API-anropsmønstre. Sjekk 'cache_age'-attributtet for å se hvor gamle de nåværende dataene er. Overvåk 'next_api_poll' for å vite når neste oppdatering er planlagt. Bruk 'data_completeness' for å se om data for i går/i dag/i morgen er tilgjengelig. 'api_calls_today'-telleren hjelper med å spore API-bruk. Perfekt for feilsøking eller forståelse av integrasjonens oppførsel."
|
||||||
},
|
},
|
||||||
"best_price_end_time": {
|
"best_price_end_time": {
|
||||||
"description": "Når gjeldende eller neste billigperiode slutter",
|
"description": "Total lengde på nåværende eller neste billigperiode (state i timer, attributt i minutter)",
|
||||||
"long_description": "Viser sluttidspunktet for gjeldende billigperiode når aktiv, eller slutten av neste periode når ingen periode er aktiv. Viser alltid en nyttig tidsreferanse for planlegging. Returnerer 'Ukjent' bare når ingen perioder er konfigurert.",
|
"long_description": "Viser hvor lenge billigperioden varer. State bruker timer (desimal) for lesbar UI; attributtet `period_duration_minutes` beholder avrundede minutter for automasjoner. Aktiv → varighet for gjeldende periode, ellers neste.",
|
||||||
"usage_tips": "Bruk dette til å vise en nedtelling som 'Billigperiode slutter om 2 timer' (når aktiv) eller 'Neste billigperiode slutter kl 14:00' (når inaktiv). Home Assistant viser automatisk relativ tid for tidsstempelsensorer."
|
"usage_tips": "UI kan vise 1,5 t mens `period_duration_minutes` = 90 for automasjoner."
|
||||||
|
},
|
||||||
|
"best_price_period_duration": {
|
||||||
|
"description": "Lengde på gjeldende/neste billigperiode",
|
||||||
|
"long_description": "Total varighet av gjeldende eller neste billigperiode. State vises i timer (f.eks. 1,5 t) for enkel lesing i UI, mens attributtet `period_duration_minutes` gir samme verdi i minutter (f.eks. 90) for automasjoner. Denne verdien representerer den **fulle planlagte varigheten** av perioden og er konstant gjennom hele perioden, selv om gjenværende tid (remaining_minutes) reduseres.",
|
||||||
|
"usage_tips": "Kombiner med remaining_minutes for å beregne når langvarige enheter skal stoppes: Perioden startet for `period_duration_minutes - remaining_minutes` minutter siden. Dette attributtet støtter energioptimeringsstrategier ved å hjelpe til med å planlegge høyforbruksaktiviteter innenfor billige perioder."
|
||||||
},
|
},
|
||||||
"best_price_remaining_minutes": {
|
"best_price_remaining_minutes": {
|
||||||
"description": "Gjenværende minutter i gjeldende billigperiode (0 når inaktiv)",
|
"description": "Gjenværende tid i gjeldende billigperiode",
|
||||||
"long_description": "Viser hvor mange minutter som er igjen i gjeldende billigperiode. Returnerer 0 når ingen periode er aktiv. Oppdateres hvert minutt. Sjekk binary_sensor.best_price_period for å se om en periode er aktiv.",
|
"long_description": "Viser hvor mye tid som gjenstår i gjeldende billigperiode. State vises i timer (f.eks. 0,75 t) for enkel lesing i dashboards, mens attributtet `remaining_minutes` gir samme tid i minutter (f.eks. 45) for automasjonsbetingelser. **Nedtellingstimer**: Denne verdien reduseres hvert minutt under en aktiv periode. Returnerer 0 når ingen billigperiode er aktiv. Oppdateres hvert minutt.",
|
||||||
"usage_tips": "Perfekt for automatiseringer: 'Hvis remaining_minutes > 0 OG remaining_minutes < 30, start vaskemaskin nå'. Verdien 0 gjør det enkelt å sjekke om en periode er aktiv (verdi > 0) eller ikke (verdi = 0)."
|
"usage_tips": "For automasjoner: Bruk attributtet `remaining_minutes` som 'Hvis remaining_minutes > 60, start oppvaskmaskinen nå (nok tid til å fullføre)' eller 'Hvis remaining_minutes < 15, fullfør gjeldende syklus snart'. UI viser brukervennlige timer (f.eks. 1,25 t). Verdi 0 indikerer ingen aktiv billigperiode."
|
||||||
},
|
},
|
||||||
"best_price_progress": {
|
"best_price_progress": {
|
||||||
"description": "Fremdrift gjennom gjeldende billigperiode (0% når inaktiv)",
|
"description": "Fremdrift gjennom gjeldende billigperiode (0% når inaktiv)",
|
||||||
"long_description": "Viser fremdrift gjennom gjeldende billigperiode som 0-100%. Returnerer 0% når ingen periode er aktiv. Oppdateres hvert minutt. 0% betyr periode nettopp startet, 100% betyr den snart slutter.",
|
"long_description": "Viser fremdrift gjennom gjeldende billigperiode som 0-100%. Returnerer 0% når ingen periode er aktiv. Oppdateres hvert minutt. 0% betyr perioden nettopp startet, 100% betyr den slutter snart.",
|
||||||
"usage_tips": "Flott for visuelle fremdriftslinjer. Bruk i automatiseringer: 'Hvis progress > 0 OG progress > 75, send varsel om at billigperiode snart slutter'. Verdi 0 indikerer ingen aktiv periode."
|
"usage_tips": "Flott for visuelle fremgangsindikatorer. Bruk i automatiseringer: 'Hvis progress > 0 OG progress > 75, send varsel om at billigperioden snart slutter'. Verdi 0 indikerer ingen aktiv periode."
|
||||||
},
|
},
|
||||||
"best_price_next_start_time": {
|
"best_price_next_start_time": {
|
||||||
"description": "Når neste billigperiode starter",
|
"description": "Total lengde på nåværende eller neste dyr-periode (state i timer, attributt i minutter)",
|
||||||
"long_description": "Viser når neste kommende billigperiode starter. Under en aktiv periode viser dette starten av NESTE periode etter den gjeldende. Returnerer 'Ukjent' bare når ingen fremtidige perioder er konfigurert.",
|
"long_description": "Viser hvor lenge den dyre perioden varer. State bruker timer (desimal) for UI; attributtet `period_duration_minutes` beholder avrundede minutter for automasjoner. Aktiv → varighet for gjeldende periode, ellers neste.",
|
||||||
"usage_tips": "Alltid nyttig for planlegging: 'Neste billigperiode starter om 3 timer' (enten du er i en periode nå eller ikke). Kombiner med automatiseringer: 'Når neste starttid er om 10 minutter, send varsel for å forberede vaskemaskin'."
|
"usage_tips": "UI kan vise 0,75 t mens `period_duration_minutes` = 45 for automasjoner."
|
||||||
},
|
},
|
||||||
"best_price_next_in_minutes": {
|
"best_price_next_in_minutes": {
|
||||||
"description": "Minutter til neste billigperiode starter (0 ved overgang)",
|
"description": "Tid til neste billigperiode",
|
||||||
"long_description": "Viser minutter til neste billigperiode starter. Under en aktiv periode viser dette tiden til perioden ETTER den gjeldende. Returnerer 0 under korte overgangsmomenter. Oppdateres hvert minutt.",
|
"long_description": "Viser hvor lenge til neste billigperiode. State vises i timer (f.eks. 2,25 t) for dashboards, mens attributtet `next_in_minutes` gir minutter (f.eks. 135) for automasjonsbetingelser. Under en aktiv periode viser dette tiden til perioden ETTER den gjeldende. Returnerer 0 under korte overgangsmomenter. Oppdateres hvert minutt.",
|
||||||
"usage_tips": "Perfekt for 'vent til billigperiode' automatiseringer: 'Hvis next_in_minutes > 0 OG next_in_minutes < 15, vent før oppvaskmaskin startes'. Verdi > 0 indikerer alltid at en fremtidig periode er planlagt."
|
"usage_tips": "For automasjoner: Bruk attributtet `next_in_minutes` som 'Hvis next_in_minutes > 0 OG next_in_minutes < 15, vent før start av oppvaskmaskin'. Verdi > 0 indikerer alltid at en fremtidig periode er planlagt."
|
||||||
},
|
},
|
||||||
"peak_price_end_time": {
|
"peak_price_end_time": {
|
||||||
"description": "Når gjeldende eller neste dyrperiode slutter",
|
"description": "Tid til neste dyr-periode (state i timer, attributt i minutter)",
|
||||||
"long_description": "Viser sluttidspunktet for gjeldende dyrperiode når aktiv, eller slutten av neste periode når ingen periode er aktiv. Viser alltid en nyttig tidsreferanse for planlegging. Returnerer 'Ukjent' bare når ingen perioder er konfigurert.",
|
"long_description": "Viser hvor lenge til neste dyre periode starter. State bruker timer (desimal); attributtet `next_in_minutes` beholder avrundede minutter for automasjoner. Under aktiv periode viser dette tiden til perioden etter den nåværende. 0 i korte overgangsøyeblikk. Oppdateres hvert minutt.",
|
||||||
"usage_tips": "Bruk dette til å vise 'Dyrperiode slutter om 1 time' (når aktiv) eller 'Neste dyrperiode slutter kl 18:00' (når inaktiv). Kombiner med automatiseringer for å gjenoppta drift etter topp."
|
"usage_tips": "Bruk `next_in_minutes` i automasjoner (f.eks. < 10) mens state er lett å lese i timer."
|
||||||
|
},
|
||||||
|
"peak_price_period_duration": {
|
||||||
|
"description": "Lengde på gjeldende/neste dyr periode",
|
||||||
|
"long_description": "Total varighet av gjeldende eller neste dyre periode. State vises i timer (f.eks. 1,5 t) for enkel lesing i UI, mens attributtet `period_duration_minutes` gir samme verdi i minutter (f.eks. 90) for automasjoner. Denne verdien representerer den **fulle planlagte varigheten** av perioden og er konstant gjennom hele perioden, selv om gjenværende tid (remaining_minutes) reduseres.",
|
||||||
|
"usage_tips": "Kombiner med remaining_minutes for å beregne når langvarige enheter skal stoppes: Perioden startet for `period_duration_minutes - remaining_minutes` minutter siden. Dette attributtet støtter energisparingsstrategier ved å hjelpe til med å planlegge høyforbruksaktiviteter utenfor dyre perioder."
|
||||||
},
|
},
|
||||||
"peak_price_remaining_minutes": {
|
"peak_price_remaining_minutes": {
|
||||||
"description": "Gjenværende minutter i gjeldende dyrperiode (0 når inaktiv)",
|
"description": "Gjenværende tid i gjeldende dyre periode",
|
||||||
"long_description": "Viser hvor mange minutter som er igjen i gjeldende dyrperiode. Returnerer 0 når ingen periode er aktiv. Oppdateres hvert minutt. Sjekk binary_sensor.peak_price_period for å se om en periode er aktiv.",
|
"long_description": "Viser hvor mye tid som gjenstår i gjeldende dyre periode. State vises i timer (f.eks. 0,75 t) for enkel lesing i dashboards, mens attributtet `remaining_minutes` gir samme tid i minutter (f.eks. 45) for automasjonsbetingelser. **Nedtellingstimer**: Denne verdien reduseres hvert minutt under en aktiv periode. Returnerer 0 når ingen dyr periode er aktiv. Oppdateres hvert minutt.",
|
||||||
"usage_tips": "Bruk i automatiseringer: 'Hvis remaining_minutes > 60, avbryt utsatt ladeøkt'. Verdi 0 gjør det enkelt å skille mellom aktive (verdi > 0) og inaktive (verdi = 0) perioder."
|
"usage_tips": "For automasjoner: Bruk attributtet `remaining_minutes` som 'Hvis remaining_minutes > 60, avbryt utsatt ladeøkt' eller 'Hvis remaining_minutes < 15, fortsett normal drift snart'. UI viser brukervennlige timer (f.eks. 1,0 t). Verdi 0 indikerer ingen aktiv dyr periode."
|
||||||
},
|
},
|
||||||
"peak_price_progress": {
|
"peak_price_progress": {
|
||||||
"description": "Fremdrift gjennom gjeldende dyrperiode (0% når inaktiv)",
|
"description": "Fremdrift gjennom gjeldende dyrperiode (0% når inaktiv)",
|
||||||
|
|
@ -361,19 +371,9 @@
|
||||||
"usage_tips": "Alltid nyttig for planlegging: 'Neste dyrperiode starter om 2 timer'. Automatisering: 'Når neste starttid er om 30 minutter, reduser varmetemperatur forebyggende'."
|
"usage_tips": "Alltid nyttig for planlegging: 'Neste dyrperiode starter om 2 timer'. Automatisering: 'Når neste starttid er om 30 minutter, reduser varmetemperatur forebyggende'."
|
||||||
},
|
},
|
||||||
"peak_price_next_in_minutes": {
|
"peak_price_next_in_minutes": {
|
||||||
"description": "Minutter til neste dyrperiode starter (0 ved overgang)",
|
"description": "Tid til neste dyre periode",
|
||||||
"long_description": "Viser minutter til neste dyrperiode starter. Under en aktiv periode viser dette tiden til perioden ETTER den gjeldende. Returnerer 0 under korte overgangsmomenter. Oppdateres hvert minutt.",
|
"long_description": "Viser hvor lenge til neste dyre periode starter. State vises i timer (f.eks. 0,5 t) for dashboards, mens attributtet `next_in_minutes` gir minutter (f.eks. 30) for automasjonsbetingelser. Under en aktiv periode viser dette tiden til perioden ETTER den gjeldende. Returnerer 0 under korte overgangsmomenter. Oppdateres hvert minutt.",
|
||||||
"usage_tips": "Forebyggende automatisering: 'Hvis next_in_minutes > 0 OG next_in_minutes < 10, fullfør gjeldende ladesyklus nå før prisene øker'."
|
"usage_tips": "For automasjoner: Bruk attributtet `next_in_minutes` som 'Hvis next_in_minutes > 0 OG next_in_minutes < 10, fullfør gjeldende ladesyklus nå før prisene øker'. Verdi > 0 indikerer alltid at en fremtidig dyr periode er planlagt."
|
||||||
},
|
|
||||||
"best_price_period_duration": {
|
|
||||||
"description": "Total varighet av gjeldende eller neste billigperiode i minutter",
|
|
||||||
"long_description": "Viser den totale varigheten av billigperioden i minutter. Under en aktiv periode viser dette hele varigheten av gjeldende periode. Når ingen periode er aktiv, viser dette varigheten av neste kommende periode. Eksempel: '90 minutter' for en 1,5-timers periode.",
|
|
||||||
"usage_tips": "Kombiner med remaining_minutes for å planlegge oppgaver: 'Hvis duration = 120 OG remaining_minutes > 90, start vaskemaskin (nok tid til å fullføre)'. Nyttig for å forstå om perioder er lange nok for strømkrevende oppgaver."
|
|
||||||
},
|
|
||||||
"peak_price_period_duration": {
|
|
||||||
"description": "Total varighet av gjeldende eller neste dyrperiode i minutter",
|
|
||||||
"long_description": "Viser den totale varigheten av dyrperioden i minutter. Under en aktiv periode viser dette hele varigheten av gjeldende periode. Når ingen periode er aktiv, viser dette varigheten av neste kommende periode. Eksempel: '60 minutter' for en 1-times periode.",
|
|
||||||
"usage_tips": "Bruk til å planlegge energibesparelsestiltak: 'Hvis duration > 120, reduser varmetemperatur mer aggressivt (lang dyr periode)'. Hjelper med å vurdere hvor mye energiforbruk må reduseres."
|
|
||||||
},
|
},
|
||||||
"home_type": {
|
"home_type": {
|
||||||
"description": "Type bolig (leilighet, hus osv.)",
|
"description": "Type bolig (leilighet, hus osv.)",
|
||||||
|
|
|
||||||
|
|
@ -316,39 +316,49 @@
|
||||||
"usage_tips": "Gebruik deze diagnostische sensor om gegevensfrisheid en API-aanroeppatronen te begrijpen. Controleer het 'cache_age'-attribuut om te zien hoe oud de huidige gegevens zijn. Monitor 'next_api_poll' om te weten wanneer de volgende update is gepland. Gebruik 'data_completeness' om te zien of gisteren/vandaag/morgen gegevens beschikbaar zijn. De 'api_calls_today'-teller helpt API-gebruik bij te houden. Perfect voor probleemoplossing of begrip van integratiegedrag."
|
"usage_tips": "Gebruik deze diagnostische sensor om gegevensfrisheid en API-aanroeppatronen te begrijpen. Controleer het 'cache_age'-attribuut om te zien hoe oud de huidige gegevens zijn. Monitor 'next_api_poll' om te weten wanneer de volgende update is gepland. Gebruik 'data_completeness' om te zien of gisteren/vandaag/morgen gegevens beschikbaar zijn. De 'api_calls_today'-teller helpt API-gebruik bij te houden. Perfect voor probleemoplossing of begrip van integratiegedrag."
|
||||||
},
|
},
|
||||||
"best_price_end_time": {
|
"best_price_end_time": {
|
||||||
"description": "Wanneer de huidige of volgende goedkope periode eindigt",
|
"description": "Totale lengte van huidige of volgende voordelige periode (state in uren, attribuut in minuten)",
|
||||||
"long_description": "Toont het eindtijdstempel van de huidige goedkope periode wanneer actief, of het einde van de volgende periode wanneer geen periode actief is. Toont altijd een nuttige tijdreferentie voor planning. Geeft alleen 'Onbekend' terug wanneer geen periodes zijn geconfigureerd.",
|
"long_description": "Toont hoe lang de voordelige periode duurt. State gebruikt uren (float) voor een leesbare UI; attribuut `period_duration_minutes` behoudt afgeronde minuten voor automatiseringen. Actief → duur van de huidige periode, anders de volgende.",
|
||||||
"usage_tips": "Gebruik dit om een aftelling weer te geven zoals 'Goedkope periode eindigt over 2 uur' (wanneer actief) of 'Volgende goedkope periode eindigt om 14:00' (wanneer inactief). Home Assistant toont automatisch relatieve tijd voor tijdstempelsensoren."
|
"usage_tips": "UI kan 1,5 u tonen terwijl `period_duration_minutes` = 90 voor automatiseringen blijft."
|
||||||
|
},
|
||||||
|
"best_price_period_duration": {
|
||||||
|
"description": "Lengte van huidige/volgende goedkope periode",
|
||||||
|
"long_description": "Totale duur van huidige of volgende goedkope periode. De state wordt weergegeven in uren (bijv. 1,5 u) voor gemakkelijk aflezen in de UI, terwijl het attribuut `period_duration_minutes` dezelfde waarde in minuten levert (bijv. 90) voor automatiseringen. Deze waarde vertegenwoordigt de **volledige geplande duur** van de periode en is constant gedurende de gehele periode, zelfs als de resterende tijd (remaining_minutes) afneemt.",
|
||||||
|
"usage_tips": "Combineer met remaining_minutes om te berekenen wanneer langlopende apparaten moeten worden gestopt: Periode is `period_duration_minutes - remaining_minutes` minuten geleden gestart. Dit attribuut ondersteunt energie-optimalisatiestrategieën door te helpen bij het plannen van hoog-verbruiksactiviteiten binnen goedkope periodes."
|
||||||
},
|
},
|
||||||
"best_price_remaining_minutes": {
|
"best_price_remaining_minutes": {
|
||||||
"description": "Resterende minuten in huidige goedkope periode (0 wanneer inactief)",
|
"description": "Resterende tijd in huidige goedkope periode",
|
||||||
"long_description": "Toont hoeveel minuten er nog over zijn in de huidige goedkope periode. Geeft 0 terug wanneer geen periode actief is. Werkt elke minuut bij. Controleer binary_sensor.best_price_period om te zien of een periode momenteel actief is.",
|
"long_description": "Toont hoeveel tijd er nog overblijft in de huidige goedkope periode. De state wordt weergegeven in uren (bijv. 0,75 u) voor gemakkelijk aflezen in dashboards, terwijl het attribuut `remaining_minutes` dezelfde tijd in minuten levert (bijv. 45) voor automatiseringsvoorwaarden. **Afteltimer**: Deze waarde neemt elke minuut af tijdens een actieve periode. Geeft 0 terug wanneer geen goedkope periode actief is. Werkt elke minuut bij.",
|
||||||
"usage_tips": "Perfect voor automatiseringen: 'Als remaining_minutes > 0 EN remaining_minutes < 30, start wasmachine nu'. De waarde 0 maakt het gemakkelijk om te controleren of een periode actief is (waarde > 0) of niet (waarde = 0)."
|
"usage_tips": "Voor automatiseringen: Gebruik attribuut `remaining_minutes` zoals 'Als remaining_minutes > 60, start vaatwasser nu (genoeg tijd om te voltooien)' of 'Als remaining_minutes < 15, rond huidige cyclus binnenkort af'. UI toont gebruiksvriendelijke uren (bijv. 1,25 u). Waarde 0 geeft aan dat geen goedkope periode actief is."
|
||||||
},
|
},
|
||||||
"best_price_progress": {
|
"best_price_progress": {
|
||||||
"description": "Voortgang door huidige goedkope periode (0% wanneer inactief)",
|
"description": "Voortgang door huidige goedkope periode (0% wanneer inactief)",
|
||||||
"long_description": "Toont de voortgang door de huidige goedkope periode als 0-100%. Geeft 0% terug wanneer geen periode actief is. Werkt elke minuut bij. 0% betekent periode net gestart, 100% betekent het eindigt bijna.",
|
"long_description": "Toont voortgang door de huidige goedkope periode als 0-100%. Geeft 0% terug wanneer geen periode actief is. Werkt elke minuut bij. 0% betekent periode net gestart, 100% betekent dat deze bijna eindigt.",
|
||||||
"usage_tips": "Geweldig voor visuele voortgangsbalken. Gebruik in automatiseringen: 'Als progress > 0 EN progress > 75, stuur melding dat goedkope periode bijna eindigt'. Waarde 0 geeft aan dat er geen actieve periode is."
|
"usage_tips": "Geweldig voor visuele voortgangsbalken. Gebruik in automatiseringen: 'Als progress > 0 EN progress > 75, stuur melding dat goedkope periode bijna eindigt'. Waarde 0 geeft aan dat geen periode actief is."
|
||||||
},
|
},
|
||||||
"best_price_next_start_time": {
|
"best_price_next_start_time": {
|
||||||
"description": "Wanneer de volgende goedkope periode begint",
|
"description": "Totale lengte van huidige of volgende dure periode (state in uren, attribuut in minuten)",
|
||||||
"long_description": "Toont wanneer de volgende komende goedkope periode begint. Tijdens een actieve periode toont dit de start van de VOLGENDE periode na de huidige. Geeft alleen 'Onbekend' terug wanneer geen toekomstige periodes zijn geconfigureerd.",
|
"long_description": "Toont hoe lang de dure periode duurt. State gebruikt uren (float) voor de UI; attribuut `period_duration_minutes` behoudt afgeronde minuten voor automatiseringen. Actief → duur van de huidige periode, anders de volgende.",
|
||||||
"usage_tips": "Altijd nuttig voor vooruitplanning: 'Volgende goedkope periode begint over 3 uur' (of je nu in een periode zit of niet). Combineer met automatiseringen: 'Wanneer volgende starttijd over 10 minuten is, stuur melding om wasmachine voor te bereiden'."
|
"usage_tips": "UI kan 0,75 u tonen terwijl `period_duration_minutes` = 45 voor automatiseringen blijft."
|
||||||
},
|
},
|
||||||
"best_price_next_in_minutes": {
|
"best_price_next_in_minutes": {
|
||||||
"description": "Minuten tot volgende goedkope periode begint (0 bij overgang)",
|
"description": "Resterende tijd in huidige dure periode (state in uren, attribuut in minuten)",
|
||||||
"long_description": "Toont minuten tot de volgende goedkope periode begint. Tijdens een actieve periode toont dit de tijd tot de periode NA de huidige. Geeft 0 terug tijdens korte overgangsmomenten. Werkt elke minuut bij.",
|
"long_description": "Toont hoeveel tijd er nog over is. State gebruikt uren (float); attribuut `remaining_minutes` behoudt afgeronde minuten voor automatiseringen. Geeft 0 terug wanneer er geen periode actief is. Werkt elke minuut bij.",
|
||||||
"usage_tips": "Perfect voor 'wacht tot goedkope periode' automatiseringen: 'Als next_in_minutes > 0 EN next_in_minutes < 15, wacht voordat vaatwasser wordt gestart'. Waarde > 0 geeft altijd aan dat een toekomstige periode is gepland."
|
"usage_tips": "Gebruik `remaining_minutes` voor drempels (bijv. > 60) terwijl de state in uren goed leesbaar blijft."
|
||||||
},
|
},
|
||||||
"peak_price_end_time": {
|
"peak_price_end_time": {
|
||||||
"description": "Wanneer de huidige of volgende dure periode eindigt",
|
"description": "Tijd tot volgende dure periode (state in uren, attribuut in minuten)",
|
||||||
"long_description": "Toont het eindtijdstempel van de huidige dure periode wanneer actief, of het einde van de volgende periode wanneer geen periode actief is. Toont altijd een nuttige tijdreferentie voor planning. Geeft alleen 'Onbekend' terug wanneer geen periodes zijn geconfigureerd.",
|
"long_description": "Toont hoe lang het duurt tot de volgende dure periode start. State gebruikt uren (float); attribuut `next_in_minutes` behoudt afgeronde minuten voor automatiseringen. Tijdens een actieve periode is dit de tijd tot de periode na de huidige. 0 tijdens korte overgangen. Werkt elke minuut bij.",
|
||||||
"usage_tips": "Gebruik dit om 'Dure periode eindigt over 1 uur' weer te geven (wanneer actief) of 'Volgende dure periode eindigt om 18:00' (wanneer inactief). Combineer met automatiseringen om activiteiten te hervatten na piek."
|
"usage_tips": "Gebruik `next_in_minutes` in automatiseringen (bijv. < 10) terwijl de state in uren leesbaar blijft."
|
||||||
|
},
|
||||||
|
"peak_price_period_duration": {
|
||||||
|
"description": "Totale duur van huidige of volgende dure periode in minuten",
|
||||||
|
"long_description": "Toont de totale duur van de dure periode in minuten. Tijdens een actieve periode toont dit de volledige lengte van de huidige periode. Wanneer geen periode actief is, toont dit de duur van de volgende komende periode. Voorbeeld: '60 minuten' voor een 1-uur periode.",
|
||||||
|
"usage_tips": "Gebruik om energiebesparende maatregelen te plannen: 'Als duration > 120, verlaag verwarmingstemperatuur agressiever (lange dure periode)'. Helpt bij het inschatten hoeveel energieverbruik moet worden verminderd."
|
||||||
},
|
},
|
||||||
"peak_price_remaining_minutes": {
|
"peak_price_remaining_minutes": {
|
||||||
"description": "Resterende minuten in huidige dure periode (0 wanneer inactief)",
|
"description": "Resterende tijd in huidige dure periode",
|
||||||
"long_description": "Toont hoeveel minuten er nog over zijn in de huidige dure periode. Geeft 0 terug wanneer geen periode actief is. Werkt elke minuut bij. Controleer binary_sensor.peak_price_period om te zien of een periode momenteel actief is.",
|
"long_description": "Toont hoeveel tijd er nog overblijft in de huidige dure periode. De state wordt weergegeven in uren (bijv. 0,75 u) voor gemakkelijk aflezen in dashboards, terwijl het attribuut `remaining_minutes` dezelfde tijd in minuten levert (bijv. 45) voor automatiseringsvoorwaarden. **Afteltimer**: Deze waarde neemt elke minuut af tijdens een actieve periode. Geeft 0 terug wanneer geen dure periode actief is. Werkt elke minuut bij.",
|
||||||
"usage_tips": "Gebruik in automatiseringen: 'Als remaining_minutes > 60, annuleer uitgestelde laadronde'. Waarde 0 maakt het gemakkelijk om onderscheid te maken tussen actieve (waarde > 0) en inactieve (waarde = 0) periodes."
|
"usage_tips": "Voor automatiseringen: Gebruik attribuut `remaining_minutes` zoals 'Als remaining_minutes > 60, annuleer uitgestelde laadronde' of 'Als remaining_minutes < 15, hervat normaal gebruik binnenkort'. UI toont gebruiksvriendelijke uren (bijv. 1,0 u). Waarde 0 geeft aan dat geen dure periode actief is."
|
||||||
},
|
},
|
||||||
"peak_price_progress": {
|
"peak_price_progress": {
|
||||||
"description": "Voortgang door huidige dure periode (0% wanneer inactief)",
|
"description": "Voortgang door huidige dure periode (0% wanneer inactief)",
|
||||||
|
|
@ -361,19 +371,9 @@
|
||||||
"usage_tips": "Altijd nuttig voor planning: 'Volgende dure periode begint over 2 uur'. Automatisering: 'Wanneer volgende starttijd over 30 minuten is, verlaag verwarmingstemperatuur preventief'."
|
"usage_tips": "Altijd nuttig voor planning: 'Volgende dure periode begint over 2 uur'. Automatisering: 'Wanneer volgende starttijd over 30 minuten is, verlaag verwarmingstemperatuur preventief'."
|
||||||
},
|
},
|
||||||
"peak_price_next_in_minutes": {
|
"peak_price_next_in_minutes": {
|
||||||
"description": "Minuten tot volgende dure periode begint (0 bij overgang)",
|
"description": "Tijd tot volgende dure periode",
|
||||||
"long_description": "Toont minuten tot de volgende dure periode begint. Tijdens een actieve periode toont dit de tijd tot de periode NA de huidige. Geeft 0 terug tijdens korte overgangsmomenten. Werkt elke minuut bij.",
|
"long_description": "Toont hoe lang het duurt tot de volgende dure periode. De state wordt weergegeven in uren (bijv. 0,5 u) voor dashboards, terwijl het attribuut `next_in_minutes` minuten levert (bijv. 30) voor automatiseringsvoorwaarden. Tijdens een actieve periode toont dit de tijd tot de periode NA de huidige. Geeft 0 terug tijdens korte overgangsmomenten. Werkt elke minuut bij.",
|
||||||
"usage_tips": "Preventieve automatisering: 'Als next_in_minutes > 0 EN next_in_minutes < 10, voltooi huidige laadcyclus nu voordat prijzen stijgen'."
|
"usage_tips": "Voor automatiseringen: Gebruik attribuut `next_in_minutes` zoals 'Als next_in_minutes > 0 EN next_in_minutes < 10, voltooi huidige laadcyclus nu voordat prijzen stijgen'. Waarde > 0 geeft altijd aan dat een toekomstige dure periode is gepland."
|
||||||
},
|
|
||||||
"best_price_period_duration": {
|
|
||||||
"description": "Totale duur van huidige of volgende goedkope periode in minuten",
|
|
||||||
"long_description": "Toont de totale duur van de goedkope periode in minuten. Tijdens een actieve periode toont dit de volledige lengte van de huidige periode. Wanneer geen periode actief is, toont dit de duur van de volgende komende periode. Voorbeeld: '90 minuten' voor een 1,5-uur periode.",
|
|
||||||
"usage_tips": "Combineer met remaining_minutes voor taakplanning: 'Als duration = 120 EN remaining_minutes > 90, start wasmachine (genoeg tijd om te voltooien)'. Nuttig om te begrijpen of periodes lang genoeg zijn voor energie-intensieve taken."
|
|
||||||
},
|
|
||||||
"peak_price_period_duration": {
|
|
||||||
"description": "Totale duur van huidige of volgende dure periode in minuten",
|
|
||||||
"long_description": "Toont de totale duur van de dure periode in minuten. Tijdens een actieve periode toont dit de volledige lengte van de huidige periode. Wanneer geen periode actief is, toont dit de duur van de volgende komende periode. Voorbeeld: '60 minuten' voor een 1-uur periode.",
|
|
||||||
"usage_tips": "Gebruik om energiebesparende maatregelen te plannen: 'Als duration > 120, verlaag verwarmingstemperatuur agressiever (lange dure periode)'. Helpt bij het inschatten hoeveel energieverbruik moet worden verminderd."
|
|
||||||
},
|
},
|
||||||
"home_type": {
|
"home_type": {
|
||||||
"description": "Type woning (appartement, huis enz.)",
|
"description": "Type woning (appartement, huis enz.)",
|
||||||
|
|
|
||||||
|
|
@ -290,11 +290,6 @@
|
||||||
"description": "Tidsstämpel för senaste tillgängliga prisdataintervall",
|
"description": "Tidsstämpel för senaste tillgängliga prisdataintervall",
|
||||||
"long_description": "Visar tidsstämpeln för det senaste tillgängliga prisdataintervallet från ditt Tibber-abonnemang"
|
"long_description": "Visar tidsstämpeln för det senaste tillgängliga prisdataintervallet från ditt Tibber-abonnemang"
|
||||||
},
|
},
|
||||||
"today_volatility": {
|
|
||||||
"description": "Prisvolatilitetsklassificering för idag, baserat på variationskoefficienten.",
|
|
||||||
"long_description": "Visar prisvolatiliteten för idag, beräknad med hjälp av variationskoefficienten (VK). Sensorns tillstånd är en klassificering (Låg, Måttlig, Hög, Mycket Hög) baserat på VK. Det exakta VK-värdet är tillgängligt i attributet `price_coefficient_variation_%`.",
|
|
||||||
"usage_tips": "Använd detta för att avgöra om prisbaserad optimering är värt besväret. Till exempel, med ett balkongbatteri som har 15% effektivitetsförlust är optimering endast meningsfull när volatiliteten är åtminstone måttlig. Skapa automationer som kontrollerar tillståndet på denna sensor innan du schemalägger laddnings- eller urladdningscykler."
|
|
||||||
},
|
|
||||||
"today_volatility": {
|
"today_volatility": {
|
||||||
"description": "Hur mycket elpriserna varierar idag",
|
"description": "Hur mycket elpriserna varierar idag",
|
||||||
"long_description": "Visar om dagens priser är stabila eller har stora svängningar. Låg volatilitet innebär ganska jämna priser – timing spelar liten roll. Hög volatilitet innebär tydliga prisskillnader under dagen – bra tillfälle att flytta förbrukning till billigare perioder. `price_coefficient_variation_%` visar procentvärdet, `price_spread` visar den absoluta prisspannet.",
|
"long_description": "Visar om dagens priser är stabila eller har stora svängningar. Låg volatilitet innebär ganska jämna priser – timing spelar liten roll. Hög volatilitet innebär tydliga prisskillnader under dagen – bra tillfälle att flytta förbrukning till billigare perioder. `price_coefficient_variation_%` visar procentvärdet, `price_spread` visar den absoluta prisspannet.",
|
||||||
|
|
@ -315,40 +310,55 @@
|
||||||
"long_description": "Visar den samlade volatiliteten när idag och imorgon ses tillsammans (när morgondatan finns). Visar om det finns tydliga prisskillnader över dagsgränsen. Faller tillbaka till endast idag om morgondatan saknas. Nyttig för flerdagarsoptimering. `price_coefficient_variation_%` visar procentvärdet, `price_spread` visar den absoluta prisspannet.",
|
"long_description": "Visar den samlade volatiliteten när idag och imorgon ses tillsammans (när morgondatan finns). Visar om det finns tydliga prisskillnader över dagsgränsen. Faller tillbaka till endast idag om morgondatan saknas. Nyttig för flerdagarsoptimering. `price_coefficient_variation_%` visar procentvärdet, `price_spread` visar den absoluta prisspannet.",
|
||||||
"usage_tips": "Använd för uppgifter som sträcker sig över flera dagar. Kontrollera om prisskillnaderna är stora nog för att planera efter. De enskilda dag-sensorerna visar bidrag per dag om du behöver mer detaljer."
|
"usage_tips": "Använd för uppgifter som sträcker sig över flera dagar. Kontrollera om prisskillnaderna är stora nog för att planera efter. De enskilda dag-sensorerna visar bidrag per dag om du behöver mer detaljer."
|
||||||
},
|
},
|
||||||
|
"data_lifecycle_status": {
|
||||||
|
"description": "Gjeldende tilstand for prisdatalivssyklus og hurtigbufring",
|
||||||
|
"long_description": "Viser om integrasjonen bruker hurtigbufrede data eller ferske data fra API-et. Viser gjeldende livssyklustilstand: 'cached' (bruker lagrede data), 'fresh' (nettopp hentet fra API), 'refreshing' (henter for øyeblikket), 'searching_tomorrow' (søker aktivt etter morgendagens data etter 13:00), 'turnover_pending' (innen 15 minutter før midnatt, 23:45-00:00), eller 'error' (henting mislyktes). Inkluderer omfattende attributter som cache-alder, neste API-spørring, datafullstendighet og API-anropsstatistikk.",
|
||||||
|
"usage_tips": "Bruk denne diagnosesensoren for å forstå dataferskhet og API-anropsmønstre. Sjekk 'cache_age'-attributtet for å se hvor gamle de nåværende dataene er. Overvåk 'next_api_poll' for å vite når neste oppdatering er planlagt. Bruk 'data_completeness' for å se om data for i går/i dag/i morgen er tilgjengelig. 'api_calls_today'-telleren hjelper med å spore API-bruk. Perfekt for feilsøking eller forståelse av integrasjonens oppførsel."
|
||||||
|
},
|
||||||
"best_price_end_time": {
|
"best_price_end_time": {
|
||||||
"description": "När nuvarande eller nästa billigperiod slutar",
|
"description": "Total längd för nuvarande eller nästa billigperiod (state i timmar, attribut i minuter)",
|
||||||
"long_description": "Visar sluttidsstämpeln för nuvarande billigperiod när aktiv, eller slutet av nästa period när ingen period är aktiv. Visar alltid en användbar tidsreferens för planering. Returnerar 'Okänt' endast när inga perioder är konfigurerade.",
|
"long_description": "Visar hur länge billigperioden varar. State använder timmar (decimal) för en läsbar UI; attributet `period_duration_minutes` behåller avrundade minuter för automationer. Aktiv → varaktighet för aktuell period, annars nästa.",
|
||||||
"usage_tips": "Använd detta för att visa en nedräkning som 'Billigperiod slutar om 2 timmar' (när aktiv) eller 'Nästa billigperiod slutar kl 14:00' (när inaktiv). Home Assistant visar automatiskt relativ tid för tidsstämpelsensorer."
|
"usage_tips": "UI kan visa 1,5 h medan `period_duration_minutes` = 90 för automationer."
|
||||||
|
},
|
||||||
|
"best_price_period_duration": {
|
||||||
|
"description": "Längd på nuvarande/nästa billigperiod",
|
||||||
|
"long_description": "Total längd av nuvarande eller nästa billigperiod. State visas i timmar (t.ex. 1,5 h) för enkel avläsning i UI, medan attributet `period_duration_minutes` ger samma värde i minuter (t.ex. 90) för automationer. Detta värde representerar den **fullständigt planerade längden** av perioden och är konstant under hela perioden, även när återstående tid (remaining_minutes) minskar.",
|
||||||
|
"usage_tips": "Kombinera med remaining_minutes för att beräkna när långvariga enheter ska stoppas: Perioden startade för `period_duration_minutes - remaining_minutes` minuter sedan. Detta attribut stöder energioptimeringsstrategier genom att hjälpa till med att planera högförbruksaktiviteter inom billiga perioder."
|
||||||
},
|
},
|
||||||
"best_price_remaining_minutes": {
|
"best_price_remaining_minutes": {
|
||||||
"description": "Återstående minuter i nuvarande billigperiod (0 när inaktiv)",
|
"description": "Tid kvar i nuvarande billigperiod",
|
||||||
"long_description": "Visar hur många minuter som återstår i nuvarande billigperiod. Returnerar 0 när ingen period är aktiv. Uppdateras varje minut. Kontrollera binary_sensor.best_price_period för att se om en period är aktiv.",
|
"long_description": "Visar hur mycket tid som återstår i nuvarande billigperiod. State visas i timmar (t.ex. 0,75 h) för enkel avläsning i instrumentpaneler, medan attributet `remaining_minutes` ger samma tid i minuter (t.ex. 45) för automationsvillkor. **Nedräkningstimer**: Detta värde minskar varje minut under en aktiv period. Returnerar 0 när ingen billigperiod är aktiv. Uppdateras varje minut.",
|
||||||
"usage_tips": "Perfekt för automationer: 'Om remaining_minutes > 0 OCH remaining_minutes < 30, starta tvättmaskin nu'. Värdet 0 gör det enkelt att kontrollera om en period är aktiv (värde > 0) eller inte (värde = 0)."
|
"usage_tips": "För automationer: Använd attribut `remaining_minutes` som 'Om remaining_minutes > 60, starta diskmaskin nu (tillräckligt med tid för att slutföra)' eller 'Om remaining_minutes < 15, avsluta nuvarande cykel snart'. UI visar användarvänliga timmar (t.ex. 1,25 h). Värde 0 indikerar ingen aktiv billigperiod."
|
||||||
},
|
},
|
||||||
"best_price_progress": {
|
"best_price_progress": {
|
||||||
"description": "Framsteg genom nuvarande billigperiod (0% när inaktiv)",
|
"description": "Framsteg genom nuvarande billigperiod (0% när inaktiv)",
|
||||||
"long_description": "Visar framsteg genom nuvarande billigperiod som 0-100%. Returnerar 0% när ingen period är aktiv. Uppdateras varje minut. 0% betyder period just startad, 100% betyder den snart slutar.",
|
"long_description": "Visar framsteg genom nuvarande billigperiod som 0-100%. Returnerar 0% när ingen period är aktiv. Uppdateras varje minut. 0% betyder att perioden just startade, 100% betyder att den snart slutar.",
|
||||||
"usage_tips": "Bra för visuella framstegsstaplar. Använd i automationer: 'Om progress > 0 OCH progress > 75, skicka meddelande att billigperiod snart slutar'. Värde 0 indikerar ingen aktiv period."
|
"usage_tips": "Perfekt för visuella framstegsindikatorer. Använd i automationer: 'Om progress > 0 OCH progress > 75, skicka avisering om att billigperioden snart slutar'. Värde 0 indikerar ingen aktiv period."
|
||||||
},
|
},
|
||||||
"best_price_next_start_time": {
|
"best_price_next_start_time": {
|
||||||
"description": "När nästa billigperiod startar",
|
"description": "Total längd för nuvarande eller nästa dyrperiod (state i timmar, attribut i minuter)",
|
||||||
"long_description": "Visar när nästa kommande billigperiod startar. Under en aktiv period visar detta starten av NÄSTA period efter den nuvarande. Returnerar 'Okänt' endast när inga framtida perioder är konfigurerade.",
|
"long_description": "Visar hur länge den dyra perioden varar. State använder timmar (decimal) för UI; attributet `period_duration_minutes` behåller avrundade minuter för automationer. Aktiv → varaktighet för aktuell period, annars nästa.",
|
||||||
"usage_tips": "Alltid användbart för framåtplanering: 'Nästa billigperiod startar om 3 timmar' (oavsett om du är i en period nu eller inte). Kombinera med automationer: 'När nästa starttid är om 10 minuter, skicka meddelande för att förbereda tvättmaskin'."
|
"usage_tips": "UI kan visa 0,75 h medan `period_duration_minutes` = 45 för automationer."
|
||||||
},
|
},
|
||||||
"best_price_next_in_minutes": {
|
"best_price_next_in_minutes": {
|
||||||
"description": "Minuter tills nästa billigperiod startar (0 vid övergång)",
|
"description": "Tid kvar i nuvarande dyrperiod (state i timmar, attribut i minuter)",
|
||||||
"long_description": "Visar minuter tills nästa billigperiod startar. Under en aktiv period visar detta tiden till perioden EFTER den nuvarande. Returnerar 0 under korta övergångsmoment. Uppdateras varje minut.",
|
"long_description": "Visar hur mycket tid som återstår. State använder timmar (decimal); attributet `remaining_minutes` behåller avrundade minuter för automationer. Returnerar 0 när ingen period är aktiv. Uppdateras varje minut.",
|
||||||
"usage_tips": "Perfekt för 'vänta tills billigperiod' automationer: 'Om next_in_minutes > 0 OCH next_in_minutes < 15, vänta innan diskmaskin startas'. Värde > 0 indikerar alltid att en framtida period är planerad."
|
"usage_tips": "Använd `remaining_minutes` för trösklar (t.ex. > 60) medan state är lätt att läsa i timmar."
|
||||||
},
|
},
|
||||||
"peak_price_end_time": {
|
"peak_price_end_time": {
|
||||||
"description": "När nuvarande eller nästa dyrperiod slutar",
|
"description": "Tid tills nästa dyrperiod startar (state i timmar, attribut i minuter)",
|
||||||
"long_description": "Visar sluttidsstämpeln för nuvarande dyrperiod när aktiv, eller slutet av nästa period när ingen period är aktiv. Visar alltid en användbar tidsreferens för planering. Returnerar 'Okänt' endast när inga perioder är konfigurerade.",
|
"long_description": "Visar hur länge tills nästa dyrperiod startar. State använder timmar (decimal); attributet `next_in_minutes` behåller avrundade minuter för automationer. Under en aktiv period visar detta tiden till perioden efter den aktuella. 0 under korta övergångar. Uppdateras varje minut.",
|
||||||
"usage_tips": "Använd detta för att visa 'Dyrperiod slutar om 1 timme' (när aktiv) eller 'Nästa dyrperiod slutar kl 18:00' (när inaktiv). Kombinera med automationer för att återuppta drift efter topp."
|
"usage_tips": "Använd `next_in_minutes` i automationer (t.ex. < 10) medan state är lätt att läsa i timmar."
|
||||||
|
},
|
||||||
|
"peak_price_period_duration": {
|
||||||
|
"description": "Längd på nuvarande/nästa dyrperiod",
|
||||||
|
"long_description": "Total längd av nuvarande eller nästa dyrperiod. State visas i timmar (t.ex. 1,5 h) för enkel avläsning i UI, medan attributet `period_duration_minutes` ger samma värde i minuter (t.ex. 90) för automationer. Detta värde representerar den **fullständigt planerade längden** av perioden och är konstant under hela perioden, även när återstående tid (remaining_minutes) minskar.",
|
||||||
|
"usage_tips": "Kombinera med remaining_minutes för att beräkna när långvariga enheter ska stoppas: Perioden startade för `period_duration_minutes - remaining_minutes` minuter sedan. Detta attribut stöder energibesparingsstrategier genom att hjälpa till med att planera högförbruksaktiviteter utanför dyra perioder."
|
||||||
},
|
},
|
||||||
"peak_price_remaining_minutes": {
|
"peak_price_remaining_minutes": {
|
||||||
"description": "Återstående minuter i nuvarande dyrperiod (0 när inaktiv)",
|
"description": "Tid kvar i nuvarande dyrperiod",
|
||||||
"long_description": "Visar hur många minuter som återstår i nuvarande dyrperiod. Returnerar 0 när ingen period är aktiv. Uppdateras varje minut. Kontrollera binary_sensor.peak_price_period för att se om en period är aktiv.",
|
"long_description": "Visar hur mycket tid som återstår i nuvarande dyrperiod. State visas i timmar (t.ex. 0,75 h) för enkel avläsning i instrumentpaneler, medan attributet `remaining_minutes` ger samma tid i minuter (t.ex. 45) för automationsvillkor. **Nedräkningstimer**: Detta värde minskar varje minut under en aktiv period. Returnerar 0 när ingen dyrperiod är aktiv. Uppdateras varje minut.",
|
||||||
"usage_tips": "Använd i automationer: 'Om remaining_minutes > 60, avbryt uppskjuten laddningssession'. Värde 0 gör det enkelt att skilja mellan aktiva (värde > 0) och inaktiva (värde = 0) perioder."
|
"usage_tips": "För automationer: Använd attribut `remaining_minutes` som 'Om remaining_minutes > 60, avbryt uppskjuten laddningssession' eller 'Om remaining_minutes < 15, återuppta normal drift snart'. UI visar användarvänliga timmar (t.ex. 1,0 h). Värde 0 indikerar ingen aktiv dyrperiod."
|
||||||
},
|
},
|
||||||
"peak_price_progress": {
|
"peak_price_progress": {
|
||||||
"description": "Framsteg genom nuvarande dyrperiod (0% när inaktiv)",
|
"description": "Framsteg genom nuvarande dyrperiod (0% när inaktiv)",
|
||||||
|
|
@ -361,19 +371,9 @@
|
||||||
"usage_tips": "Alltid användbart för planering: 'Nästa dyrperiod startar om 2 timmar'. Automation: 'När nästa starttid är om 30 minuter, minska värmetemperatur förebyggande'."
|
"usage_tips": "Alltid användbart för planering: 'Nästa dyrperiod startar om 2 timmar'. Automation: 'När nästa starttid är om 30 minuter, minska värmetemperatur förebyggande'."
|
||||||
},
|
},
|
||||||
"peak_price_next_in_minutes": {
|
"peak_price_next_in_minutes": {
|
||||||
"description": "Minuter tills nästa dyrperiod startar (0 vid övergång)",
|
"description": "Tid till nästa dyrperiod",
|
||||||
"long_description": "Visar minuter tills nästa dyrperiod startar. Under en aktiv period visar detta tiden till perioden EFTER den nuvarande. Returnerar 0 under korta övergångsmoment. Uppdateras varje minut.",
|
"long_description": "Visar hur länge till nästa dyrperiod. State visas i timmar (t.ex. 0,5 h) för instrumentpaneler, medan attributet `next_in_minutes` ger minuter (t.ex. 30) för automationsvillkor. Under en aktiv period visar detta tiden till perioden EFTER den nuvarande. Returnerar 0 under korta övergångsmoment. Uppdateras varje minut.",
|
||||||
"usage_tips": "Förebyggande automation: 'Om next_in_minutes > 0 OCH next_in_minutes < 10, slutför nuvarande laddcykel nu innan priserna ökar'."
|
"usage_tips": "För automationer: Använd attribut `next_in_minutes` som 'Om next_in_minutes > 0 OCH next_in_minutes < 10, slutför nuvarande laddcykel nu innan priserna ökar'. Värde > 0 indikerar alltid att en framtida dyrperiod är planerad."
|
||||||
},
|
|
||||||
"best_price_period_duration": {
|
|
||||||
"description": "Total längd på nuvarande eller nästa billigperiod i minuter",
|
|
||||||
"long_description": "Visar den totala längden på billigperioden i minuter. Under en aktiv period visar detta hela längden av nuvarande period. När ingen period är aktiv visar detta längden på nästa kommande period. Exempel: '90 minuter' för en 1,5-timmars period.",
|
|
||||||
"usage_tips": "Kombinera med remaining_minutes för att planera uppgifter: 'Om duration = 120 OCH remaining_minutes > 90, starta tvättmaskin (tillräckligt med tid för att slutföra)'. Användbart för att förstå om perioder är tillräckligt långa för energikrävande uppgifter."
|
|
||||||
},
|
|
||||||
"peak_price_period_duration": {
|
|
||||||
"description": "Total längd på nuvarande eller nästa dyrperiod i minuter",
|
|
||||||
"long_description": "Visar den totala längden på dyrperioden i minuter. Under en aktiv period visar detta hela längden av nuvarande period. När ingen period är aktiv visar detta längden på nästa kommande period. Exempel: '60 minuter' för en 1-timmars period.",
|
|
||||||
"usage_tips": "Använd för att planera energisparåtgärder: 'Om duration > 120, minska värmetemperatur mer aggressivt (lång dyr period)'. Hjälper till att bedöma hur mycket energiförbrukning måste minskas."
|
|
||||||
},
|
},
|
||||||
"home_type": {
|
"home_type": {
|
||||||
"description": "Bostadstyp (lägenhet, hus osv.)",
|
"description": "Bostadstyp (lägenhet, hus osv.)",
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,17 @@ if TYPE_CHECKING:
|
||||||
TIMER_30_SEC_BOUNDARY = 30
|
TIMER_30_SEC_BOUNDARY = 30
|
||||||
|
|
||||||
|
|
||||||
|
def _hours_to_minutes(state_value: Any) -> int | None:
|
||||||
|
"""Convert hour-based state back to rounded minutes for attributes."""
|
||||||
|
if state_value is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
try:
|
||||||
|
return round(float(state_value) * 60)
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def _is_timing_or_volatility_sensor(key: str) -> bool:
|
def _is_timing_or_volatility_sensor(key: str) -> bool:
|
||||||
"""Check if sensor is a timing or volatility sensor."""
|
"""Check if sensor is a timing or volatility sensor."""
|
||||||
return key.endswith("_volatility") or (
|
return key.endswith("_volatility") or (
|
||||||
|
|
@ -69,5 +80,16 @@ def add_period_timing_attributes(
|
||||||
|
|
||||||
attributes["timestamp"] = timestamp
|
attributes["timestamp"] = timestamp
|
||||||
|
|
||||||
|
# Add minute-precision attributes for hour-based states to keep automation-friendly values
|
||||||
|
minute_value = _hours_to_minutes(state_value)
|
||||||
|
|
||||||
|
if minute_value is not None:
|
||||||
|
if key.endswith("period_duration"):
|
||||||
|
attributes["period_duration_minutes"] = minute_value
|
||||||
|
elif key.endswith("remaining_minutes"):
|
||||||
|
attributes["remaining_minutes"] = minute_value
|
||||||
|
elif key.endswith("next_in_minutes"):
|
||||||
|
attributes["next_in_minutes"] = minute_value
|
||||||
|
|
||||||
# Add icon_color for dynamic styling
|
# Add icon_color for dynamic styling
|
||||||
add_icon_color_attribute(attributes, key=key, state_value=state_value)
|
add_icon_color_attribute(attributes, key=key, state_value=state_value)
|
||||||
|
|
|
||||||
|
|
@ -731,9 +731,9 @@ BEST_PRICE_TIMING_SENSORS = (
|
||||||
name="Best Price Period Duration",
|
name="Best Price Period Duration",
|
||||||
icon="mdi:timer",
|
icon="mdi:timer",
|
||||||
device_class=SensorDeviceClass.DURATION,
|
device_class=SensorDeviceClass.DURATION,
|
||||||
native_unit_of_measurement=UnitOfTime.MINUTES,
|
native_unit_of_measurement=UnitOfTime.HOURS,
|
||||||
state_class=None, # Changes with each period: no statistics
|
state_class=None, # Duration not needed in long-term statistics
|
||||||
suggested_display_precision=0,
|
suggested_display_precision=2,
|
||||||
entity_registry_enabled_default=False,
|
entity_registry_enabled_default=False,
|
||||||
),
|
),
|
||||||
SensorEntityDescription(
|
SensorEntityDescription(
|
||||||
|
|
@ -741,9 +741,10 @@ BEST_PRICE_TIMING_SENSORS = (
|
||||||
translation_key="best_price_remaining_minutes",
|
translation_key="best_price_remaining_minutes",
|
||||||
name="Best Price Remaining Time",
|
name="Best Price Remaining Time",
|
||||||
icon="mdi:timer-sand",
|
icon="mdi:timer-sand",
|
||||||
native_unit_of_measurement=UnitOfTime.MINUTES,
|
device_class=SensorDeviceClass.DURATION,
|
||||||
state_class=None, # Countdown timer: no statistics
|
native_unit_of_measurement=UnitOfTime.HOURS,
|
||||||
suggested_display_precision=0,
|
state_class=None, # Countdown timers excluded from statistics
|
||||||
|
suggested_display_precision=2,
|
||||||
),
|
),
|
||||||
SensorEntityDescription(
|
SensorEntityDescription(
|
||||||
key="best_price_progress",
|
key="best_price_progress",
|
||||||
|
|
@ -767,9 +768,10 @@ BEST_PRICE_TIMING_SENSORS = (
|
||||||
translation_key="best_price_next_in_minutes",
|
translation_key="best_price_next_in_minutes",
|
||||||
name="Best Price Starts In",
|
name="Best Price Starts In",
|
||||||
icon="mdi:timer-outline",
|
icon="mdi:timer-outline",
|
||||||
native_unit_of_measurement=UnitOfTime.MINUTES,
|
device_class=SensorDeviceClass.DURATION,
|
||||||
state_class=None, # Countdown timer: no statistics
|
native_unit_of_measurement=UnitOfTime.HOURS,
|
||||||
suggested_display_precision=0,
|
state_class=None, # Next-start timers excluded from statistics
|
||||||
|
suggested_display_precision=2,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -788,9 +790,9 @@ PEAK_PRICE_TIMING_SENSORS = (
|
||||||
name="Peak Price Period Duration",
|
name="Peak Price Period Duration",
|
||||||
icon="mdi:timer",
|
icon="mdi:timer",
|
||||||
device_class=SensorDeviceClass.DURATION,
|
device_class=SensorDeviceClass.DURATION,
|
||||||
native_unit_of_measurement=UnitOfTime.MINUTES,
|
native_unit_of_measurement=UnitOfTime.HOURS,
|
||||||
state_class=None, # Changes with each period: no statistics
|
state_class=None, # Duration not needed in long-term statistics
|
||||||
suggested_display_precision=0,
|
suggested_display_precision=2,
|
||||||
entity_registry_enabled_default=False,
|
entity_registry_enabled_default=False,
|
||||||
),
|
),
|
||||||
SensorEntityDescription(
|
SensorEntityDescription(
|
||||||
|
|
@ -798,9 +800,10 @@ PEAK_PRICE_TIMING_SENSORS = (
|
||||||
translation_key="peak_price_remaining_minutes",
|
translation_key="peak_price_remaining_minutes",
|
||||||
name="Peak Price Remaining Time",
|
name="Peak Price Remaining Time",
|
||||||
icon="mdi:timer-sand",
|
icon="mdi:timer-sand",
|
||||||
native_unit_of_measurement=UnitOfTime.MINUTES,
|
device_class=SensorDeviceClass.DURATION,
|
||||||
state_class=None, # Countdown timer: no statistics
|
native_unit_of_measurement=UnitOfTime.HOURS,
|
||||||
suggested_display_precision=0,
|
state_class=None, # Countdown timers excluded from statistics
|
||||||
|
suggested_display_precision=2,
|
||||||
),
|
),
|
||||||
SensorEntityDescription(
|
SensorEntityDescription(
|
||||||
key="peak_price_progress",
|
key="peak_price_progress",
|
||||||
|
|
@ -824,9 +827,10 @@ PEAK_PRICE_TIMING_SENSORS = (
|
||||||
translation_key="peak_price_next_in_minutes",
|
translation_key="peak_price_next_in_minutes",
|
||||||
name="Peak Price Starts In",
|
name="Peak Price Starts In",
|
||||||
icon="mdi:timer-outline",
|
icon="mdi:timer-outline",
|
||||||
native_unit_of_measurement=UnitOfTime.MINUTES,
|
device_class=SensorDeviceClass.DURATION,
|
||||||
state_class=None, # Countdown timer: no statistics
|
native_unit_of_measurement=UnitOfTime.HOURS,
|
||||||
suggested_display_precision=0,
|
state_class=None, # Next-start timers excluded from statistics
|
||||||
|
suggested_display_precision=2,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING, cast
|
||||||
|
|
||||||
from custom_components.tibber_prices.utils.average import (
|
from custom_components.tibber_prices.utils.average import (
|
||||||
calculate_current_leading_max,
|
calculate_current_leading_max,
|
||||||
|
|
@ -70,6 +70,14 @@ def get_value_getter_mapping( # noqa: PLR0913 - needs all calculators as parame
|
||||||
Dictionary mapping entity keys to their value getter callables.
|
Dictionary mapping entity keys to their value getter callables.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def _minutes_to_hours(value: float | None) -> float | None:
|
||||||
|
"""Convert minutes to hours for duration-oriented sensors."""
|
||||||
|
if value is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return value / 60
|
||||||
|
|
||||||
return {
|
return {
|
||||||
# ================================================================
|
# ================================================================
|
||||||
# INTERVAL-BASED SENSORS - via IntervalCalculator
|
# INTERVAL-BASED SENSORS - via IntervalCalculator
|
||||||
|
|
@ -243,11 +251,17 @@ def get_value_getter_mapping( # noqa: PLR0913 - needs all calculators as parame
|
||||||
"best_price_end_time": lambda: timing_calculator.get_period_timing_value(
|
"best_price_end_time": lambda: timing_calculator.get_period_timing_value(
|
||||||
period_type="best_price", value_type="end_time"
|
period_type="best_price", value_type="end_time"
|
||||||
),
|
),
|
||||||
"best_price_period_duration": lambda: timing_calculator.get_period_timing_value(
|
"best_price_period_duration": lambda: _minutes_to_hours(
|
||||||
period_type="best_price", value_type="period_duration"
|
cast(
|
||||||
|
"float | None",
|
||||||
|
timing_calculator.get_period_timing_value(period_type="best_price", value_type="period_duration"),
|
||||||
|
)
|
||||||
),
|
),
|
||||||
"best_price_remaining_minutes": lambda: timing_calculator.get_period_timing_value(
|
"best_price_remaining_minutes": lambda: _minutes_to_hours(
|
||||||
period_type="best_price", value_type="remaining_minutes"
|
cast(
|
||||||
|
"float | None",
|
||||||
|
timing_calculator.get_period_timing_value(period_type="best_price", value_type="remaining_minutes"),
|
||||||
|
)
|
||||||
),
|
),
|
||||||
"best_price_progress": lambda: timing_calculator.get_period_timing_value(
|
"best_price_progress": lambda: timing_calculator.get_period_timing_value(
|
||||||
period_type="best_price", value_type="progress"
|
period_type="best_price", value_type="progress"
|
||||||
|
|
@ -255,18 +269,27 @@ def get_value_getter_mapping( # noqa: PLR0913 - needs all calculators as parame
|
||||||
"best_price_next_start_time": lambda: timing_calculator.get_period_timing_value(
|
"best_price_next_start_time": lambda: timing_calculator.get_period_timing_value(
|
||||||
period_type="best_price", value_type="next_start_time"
|
period_type="best_price", value_type="next_start_time"
|
||||||
),
|
),
|
||||||
"best_price_next_in_minutes": lambda: timing_calculator.get_period_timing_value(
|
"best_price_next_in_minutes": lambda: _minutes_to_hours(
|
||||||
period_type="best_price", value_type="next_in_minutes"
|
cast(
|
||||||
|
"float | None",
|
||||||
|
timing_calculator.get_period_timing_value(period_type="best_price", value_type="next_in_minutes"),
|
||||||
|
)
|
||||||
),
|
),
|
||||||
# Peak Price timing sensors
|
# Peak Price timing sensors
|
||||||
"peak_price_end_time": lambda: timing_calculator.get_period_timing_value(
|
"peak_price_end_time": lambda: timing_calculator.get_period_timing_value(
|
||||||
period_type="peak_price", value_type="end_time"
|
period_type="peak_price", value_type="end_time"
|
||||||
),
|
),
|
||||||
"peak_price_period_duration": lambda: timing_calculator.get_period_timing_value(
|
"peak_price_period_duration": lambda: _minutes_to_hours(
|
||||||
period_type="peak_price", value_type="period_duration"
|
cast(
|
||||||
|
"float | None",
|
||||||
|
timing_calculator.get_period_timing_value(period_type="peak_price", value_type="period_duration"),
|
||||||
|
)
|
||||||
),
|
),
|
||||||
"peak_price_remaining_minutes": lambda: timing_calculator.get_period_timing_value(
|
"peak_price_remaining_minutes": lambda: _minutes_to_hours(
|
||||||
period_type="peak_price", value_type="remaining_minutes"
|
cast(
|
||||||
|
"float | None",
|
||||||
|
timing_calculator.get_period_timing_value(period_type="peak_price", value_type="remaining_minutes"),
|
||||||
|
)
|
||||||
),
|
),
|
||||||
"peak_price_progress": lambda: timing_calculator.get_period_timing_value(
|
"peak_price_progress": lambda: timing_calculator.get_period_timing_value(
|
||||||
period_type="peak_price", value_type="progress"
|
period_type="peak_price", value_type="progress"
|
||||||
|
|
@ -274,8 +297,11 @@ def get_value_getter_mapping( # noqa: PLR0913 - needs all calculators as parame
|
||||||
"peak_price_next_start_time": lambda: timing_calculator.get_period_timing_value(
|
"peak_price_next_start_time": lambda: timing_calculator.get_period_timing_value(
|
||||||
period_type="peak_price", value_type="next_start_time"
|
period_type="peak_price", value_type="next_start_time"
|
||||||
),
|
),
|
||||||
"peak_price_next_in_minutes": lambda: timing_calculator.get_period_timing_value(
|
"peak_price_next_in_minutes": lambda: _minutes_to_hours(
|
||||||
period_type="peak_price", value_type="next_in_minutes"
|
cast(
|
||||||
|
"float | None",
|
||||||
|
timing_calculator.get_period_timing_value(period_type="peak_price", value_type="next_in_minutes"),
|
||||||
|
)
|
||||||
),
|
),
|
||||||
# Chart data export sensor
|
# Chart data export sensor
|
||||||
"chart_data_export": get_chart_data_export_value,
|
"chart_data_export": get_chart_data_export_value,
|
||||||
|
|
|
||||||
|
|
@ -417,8 +417,8 @@ def test_timer_constants_are_comprehensive() -> None:
|
||||||
"data_last_updated", # Timestamp of last update, not time-dependent
|
"data_last_updated", # Timestamp of last update, not time-dependent
|
||||||
"next_24h_volatility", # Uses fixed 24h window from current time, updated on API data
|
"next_24h_volatility", # Uses fixed 24h window from current time, updated on API data
|
||||||
"current_interval_price_base", # Duplicate of current_interval_price (just different unit)
|
"current_interval_price_base", # Duplicate of current_interval_price (just different unit)
|
||||||
"best_price_period_duration", # Duration in minutes, doesn't change minute-by-minute
|
"best_price_period_duration", # Duration state in hours (static per period), no minute-by-minute timer
|
||||||
"peak_price_period_duration", # Duration in minutes, doesn't change minute-by-minute
|
"peak_price_period_duration", # Duration state in hours (static per period), no minute-by-minute timer
|
||||||
}
|
}
|
||||||
|
|
||||||
potentially_missing = [
|
potentially_missing = [
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue