Compare commits

...

3 commits

Author SHA1 Message Date
Julian Pawlowski
2a08515ba0 fix(sensors): use consistent rounding for trend duration calculations
Some checks are pending
Lint / Ruff (push) Waiting to run
Validate / Hassfest validation (push) Waiting to run
Validate / HACS validation (push) Waiting to run
Replaced int(time.minutes_until()) with time.minutes_until_rounded()
in trend calculator (3 locations). The int() call truncated values
(14.7 → 14) while timing sensors used standard rounding (14.7 → 15).

All duration sensors now use the same rounding method
(math.floor(seconds/60 + 0.5)), matching HA's timestamp rendering
behavior.

Impact: Trend countdown values may differ by ±1 minute compared to
previous behavior. Consistency across all duration sensors improved.
2026-04-10 09:13:32 +00:00
Julian Pawlowski
faa3b2b71a feat(sensors)!: use native minutes for all duration sensors
Changed native_unit_of_measurement from HOURS to MINUTES for all 7
duration sensors. HA auto-converts to hours for display via
suggested_unit_of_measurement=HOURS.

Sensors affected:
- next_price_trend_change_in
- 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

Removed _minutes_to_hours() conversion function — calculator values
(minutes) are now passed through directly.

BREAKING CHANGE: State values for all duration sensors change from
hours to minutes (e.g. 1.5 → 90). The display unit remains hours
(suggested_unit_of_measurement). Automations using numeric state
comparisons must be updated (multiply old thresholds by 60).

Impact: Users with automations comparing duration sensor states
numerically need to update thresholds. Dashboard display is unchanged
for new installations. Existing installations retain their configured
display unit but the underlying numeric value changes.
2026-04-10 09:08:38 +00:00
Julian Pawlowski
b1b41be9aa feat(sensors)!: rename trend change countdown sensor for naming consistency
Renamed trend_change_in_minutes → next_price_trend_change_in to align
with its sibling sensor next_price_trend_change (timestamp variant).

Follows the established best/peak price naming pattern where related
sensors share a common prefix (e.g. best_price_next_start_time /
best_price_next_in_minutes).

Updated entity key, translation key, friendly names (all 5 languages),
custom translations, coordinator constants, attribute routing, and
cache-clear mapping.

BREAKING CHANGE: Entity ID changes from
sensor.<home>_trend_change_in_minutes to
sensor.<home>_next_price_trend_change_in. Automations and dashboards
referencing the old entity ID must be updated.

Impact: Users with automations or dashboard cards referencing the old
sensor name need to update references. The sensor retains identical
functionality and attributes.
2026-04-10 09:08:27 +00:00
16 changed files with 54 additions and 74 deletions

View file

@ -117,6 +117,6 @@ MINUTE_UPDATE_ENTITY_KEYS = frozenset(
"peak_price_progress",
"peak_price_next_in_minutes",
# Trend change countdown sensor (needs minute updates)
"trend_change_in_minutes",
"next_price_trend_change_in",
}
)

View file

@ -312,10 +312,10 @@
"long_description": "Scannt die nächsten 24 Stunden (96 Intervalle), um zu finden, wann sich die Preistrend-Richtung ändern wird. Nur Richtungswechsel zählen: steigend/stark steigend bilden eine Gruppe, fallend/stark fallend eine andere, stabil ist eigenständig. Ein Wechsel von steigend zu stark steigend ist KEIN Trendwechsel. Verwendet volatilitätsadaptive Schwellwerte (Standard: ±3%/±9%) mit Hysterese (Standard: 3 aufeinanderfolgende Intervalle). Gibt den Zeitstempel zurück, wann die Änderung erwartet wird.",
"usage_tips": "Ereignisbasierte Automation: Aktionen WENN Trend wechselt auslösen, nicht IN X Stunden. Beispiel: 'E-Auto laden wenn nächste Trendänderung fallende Preise zeigt' oder 'Spülmaschine vor Preisanstieg starten'. Ergänzt Zeitfenster-Sensoren (price_trend_Xh), die beantworten 'WERDEN Preise in X Stunden höher sein?'"
},
"trend_change_in_minutes": {
"next_price_trend_change_in": {
"description": "Zeit bis zur nächsten Preistrend-Änderung",
"long_description": "Zeigt an, wie lange es bis zur nächsten bedeutenden Preistrend-Änderung dauert. Der Wert wird in Stunden angezeigt (z.B. 2,25 h) für Dashboards. Teilt die gleiche Analyse wie der Zeitstempel-Sensor 'Nächste Trendänderung', stellt sie aber als Countdown-Dauer dar. Aktualisiert sich jede Minute für präzise Countdowns. Zeigt 'Unbekannt' wenn keine Trendänderung in den nächsten 24 Stunden erwartet wird.",
"usage_tips": "Dashboard-Countdown: Zeige 'Trendänderung in 1,5 h' als Live-Countdown. Für Automationen: 'Wenn trend_change_in_minutes < 0,25 (15 Min), auf Preisrichtungswechsel vorbereiten'. Ergänzt 'Nächste Trendänderung' (Zeitstempel) — verwende den Zeitstempel für 'WANN' und diesen Sensor für 'WIE LANGE'."
"usage_tips": "Dashboard-Countdown: Zeige 'Trendänderung in 1,5 h' als Live-Countdown. Für Automationen: 'Wenn next_price_trend_change_in < 0,25 (15 Min), auf Preisrichtungswechsel vorbereiten'. Ergänzt 'Nächste Trendänderung' (Zeitstempel) — verwende den Zeitstempel für 'WANN' und diesen Sensor für 'WIE LANGE'."
},
"daily_rating": {
"description": "Wie sich die heutigen Preise mit historischen Daten vergleichen",

View file

@ -312,10 +312,10 @@
"long_description": "Scans the next 24 hours (96 intervals) to find when the price trend direction will change. Only direction changes count: rising/strongly_rising are one group, falling/strongly_falling another, stable is its own. A change from rising to strongly_rising is NOT a trend change. Uses volatility-adaptive thresholds (default: ±3%/±9%) with hysteresis (default: 3 consecutive intervals). Returns the timestamp when the change is expected.",
"usage_tips": "Event-based automation: Trigger actions WHEN trend changes, not IN X hours. Example: 'Charge EV when next trend change shows falling prices' or 'Run dishwasher before prices start rising'. More accurate than simple future comparison because it knows if you're already in a trend. Complements time-window sensors (price_trend_Xh) which answer 'WILL prices be higher in X hours?'"
},
"trend_change_in_minutes": {
"next_price_trend_change_in": {
"description": "Time until the next price trend change",
"long_description": "Shows how long until the next significant price trend change occurs. The state displays in hours (e.g., 2.25 h) for dashboards. Shares the same analysis as the Next Price Trend Change timestamp sensor but presents it as a countdown duration. Updates every minute for accurate countdowns. Returns unknown when no trend change is expected in the next 24 hours.",
"usage_tips": "Dashboard countdown: Show 'Trend changes in 1.5 h' as a live countdown. For automations: 'If trend_change_in_minutes state < 0.25 (15 min), prepare for price direction change'. Pairs with Next Price Trend Change (timestamp) — use the timestamp for 'WHEN' and this sensor for 'HOW LONG'."
"usage_tips": "Dashboard countdown: Show 'Trend changes in 1.5 h' as a live countdown. For automations: 'If next_price_trend_change_in state < 0.25 (15 min), prepare for price direction change'. Pairs with Next Price Trend Change (timestamp) — use the timestamp for 'WHEN' and this sensor for 'HOW LONG'."
},
"daily_rating": {
"description": "How today's prices compare to historical data",

View file

@ -312,10 +312,10 @@
"long_description": "Skanner de neste 24 timene (96 intervaller) for å finne når pristrend-retningen vil endre seg. Kun retningsendringer teller: stigende/sterkt stigende er én gruppe, fallende/sterkt fallende en annen, stabil er egen. En endring fra stigende til sterkt stigende er IKKE en trendendring. Bruker volatilitetstilpassede terskelverdier (standard: ±3%/±9%) med hysterese (standard: 3 påfølgende intervaller). Returnerer tidsstempelet når endringen forventes.",
"usage_tips": "Hendelsesbasert automatisering: Utløs handlinger NÅR trenden endres, ikke OM X timer. Eksempel: 'Lad EV når neste trendendring viser synkende priser' eller 'Start oppvaskmaskin før prisene stiger'. Kompletterer tidsvindu-sensorer (price_trend_Xh) som svarer på 'VIL prisene være høyere om X timer?'"
},
"trend_change_in_minutes": {
"next_price_trend_change_in": {
"description": "Tid til neste pristrendendring",
"long_description": "Viser hvor lenge det er til neste betydelige pristrendendring inntreffer. Verdien vises i timer (f.eks. 2,25 t) for dashboards. Deler samme analyse som tidsstempel-sensoren 'Neste trendendring', men presenterer den som en nedtellingsvarighet. Oppdateres hvert minutt for nøyaktige nedtellinger. Viser 'Ukjent' når ingen trendendring forventes i løpet av de neste 24 timene.",
"usage_tips": "Dashboard-nedtelling: Vis 'Trendendring om 1,5 t' som live nedtelling. For automatiseringer: 'Hvis trend_change_in_minutes < 0,25 (15 min), forbered på prisretningsendring'. Kompletterer 'Neste trendendring' (tidsstempel) — bruk tidsstempelet for 'NÅR' og denne sensoren for 'HVOR LENGE'."
"usage_tips": "Dashboard-nedtelling: Vis 'Trendendring om 1,5 t' som live nedtelling. For automatiseringer: 'Hvis next_price_trend_change_in < 0,25 (15 min), forbered på prisretningsendring'. Kompletterer 'Neste trendendring' (tidsstempel) — bruk tidsstempelet for 'NÅR' og denne sensoren for 'HVOR LENGE'."
},
"daily_rating": {
"description": "Hvordan dagens priser sammenlignes med historiske data",

View file

@ -312,10 +312,10 @@
"long_description": "Scant de komende 24 uur (96 intervallen) om te vinden wanneer de prijstrend-richting zal veranderen. Alleen richtingswijzigingen tellen: stijgend/sterk stijgend vormen één groep, dalend/sterk dalend een andere, stabiel is apart. Een verandering van stijgend naar sterk stijgend is GEEN trendwijziging. Gebruikt volatiliteit-adaptieve drempelwaarden (standaard: ±3%/±9%) met hysterese (standaard: 3 opeenvolgende intervallen). Retourneert het tijdstempel wanneer de wijziging wordt verwacht.",
"usage_tips": "Gebeurtenisgestuurde automatisering: Trigger acties WANNEER trend wijzigt, niet OVER X uur. Voorbeeld: 'Laad EV wanneer volgende trendwijziging dalende prijzen toont' of 'Start vaatwasser voordat prijzen stijgen'. Vult tijdvenster-sensors aan (price_outlook_Xh) die beantwoorden 'ZULLEN prijzen over X uur hoger zijn?'"
},
"trend_change_in_minutes": {
"next_price_trend_change_in": {
"description": "Tijd tot de volgende prijstrendwijziging",
"long_description": "Toont hoe lang het duurt tot de volgende significante prijstrendwijziging plaatsvindt. De waarde wordt weergegeven in uren (bijv. 2,25 u) voor dashboards. Deelt dezelfde analyse als de tijdstempel-sensor 'Volgende Prijstrend Wijziging', maar presenteert het als een aftelduur. Wordt elke minuut bijgewerkt voor nauwkeurige aftellingen. Toont 'Onbekend' wanneer geen trendwijziging wordt verwacht in de komende 24 uur.",
"usage_tips": "Dashboard-aftelling: Toon 'Trendwijziging over 1,5 u' als live aftelling. Voor automatiseringen: 'Als trend_change_in_minutes < 0,25 (15 min), bereid je voor op prijsrichtingswijziging'. Vult 'Volgende Prijstrend Wijziging' (tijdstempel) aan — gebruik het tijdstempel voor 'WANNEER' en deze sensor voor 'HOE LANG'."
"usage_tips": "Dashboard-aftelling: Toon 'Trendwijziging over 1,5 u' als live aftelling. Voor automatiseringen: 'Als next_price_trend_change_in < 0,25 (15 min), bereid je voor op prijsrichtingswijziging'. Vult 'Volgende Prijstrend Wijziging' (tijdstempel) aan — gebruik het tijdstempel voor 'WANNEER' en deze sensor voor 'HOE LANG'."
},
"daily_rating": {
"description": "Hoe de prijzen van vandaag zich verhouden tot historische gegevens",

View file

@ -312,10 +312,10 @@
"long_description": "Skannar de nästa 24 timmarna (96 intervaller) för att hitta när pristrend-riktningen kommer att ändras. Bara riktningsändringar räknas: stigande/kraftigt stigande är en grupp, fallande/kraftigt fallande en annan, stabil är egen. En ändring från stigande till kraftigt stigande är INTE en trendändring. Använder volatilitetsadaptiva tröskelvärden (standard: ±3%/±9%) med hysteres (standard: 3 på varandra följande intervaller). Returnerar tidstämpeln när ändringen förväntas.",
"usage_tips": "Händelsestyrd automatisering: Utlös åtgärder NÄR trenden ändras, inte OM X timmar. Exempel: 'Ladda EV när nästa trendändring visar fallande priser' eller 'Starta diskmaskin innan priserna stiger'. Kompletterar tidsfönster-sensorer (price_outlook_Xh) som svarar på 'KOMMER priserna att vara högre om X timmar?'"
},
"trend_change_in_minutes": {
"next_price_trend_change_in": {
"description": "Tid till nästa pristrendändring",
"long_description": "Visar hur lång tid det är kvar till nästa betydande pristrendändring inträffar. Värdet visas i timmar (t.ex. 2,25 h) för dashboards. Delar samma analys som tidstämpel-sensorn 'Nästa pristrendändring' men presenterar det som en nedtellningsvaraktighet. Uppdateras varje minut för noggranna nedtellningar. Visar 'Okänd' när ingen trendändring förväntas inom de närmaste 24 timmarna.",
"usage_tips": "Dashboard-nedtellning: Visa 'Trendändring om 1,5 h' som live nedtellning. För automatiseringar: 'Om trend_change_in_minutes < 0,25 (15 min), förbered för prisriktningsändring'. Kompletterar 'Nästa pristrendändring' (tidstämpel) — använd tidstämpeln för 'NÄR' och denna sensor för 'HUR LÄNGE'."
"usage_tips": "Dashboard-nedtellning: Visa 'Trendändring om 1,5 h' som live nedtellning. För automatiseringar: 'Om next_price_trend_change_in < 0,25 (15 min), förbered för prisriktningsändring'. Kompletterar 'Nästa pristrendändring' (tidstämpel) — använd tidstämpeln för 'NÄR' och denna sensor för 'HUR LÄNGE'."
},
"daily_rating": {
"description": "Hur dagens priser jämförs med historiska data",

View file

@ -39,6 +39,6 @@ def _add_cached_trend_attributes(attributes: dict, key: str, cached_data: dict)
# Add cached attributes (timestamp already set by platform)
# State contains the timestamp of the trend change itself
attributes.update(cached_data["trend_change_attributes"])
elif key == "trend_change_in_minutes" and cached_data.get("trend_change_attributes"):
elif key == "next_price_trend_change_in" and cached_data.get("trend_change_attributes"):
# Duration sensor shares same cached attributes as the timestamp sensor
attributes.update(cached_data["trend_change_attributes"])

View file

@ -606,13 +606,13 @@ class TibberPricesTrendCalculator(TibberPricesBaseCalculator):
if trend_start_time:
time = self.coordinator.time
# Duration is negative of minutes_until (time in the past)
trend_duration_minutes = -int(time.minutes_until(trend_start_time))
trend_duration_minutes = -time.minutes_until_rounded(trend_start_time)
# Calculate minutes until change
minutes_until_change = None
if next_change_time:
time = self.coordinator.time
minutes_until_change = int(time.minutes_until(next_change_time))
minutes_until_change = time.minutes_until_rounded(next_change_time)
result = {
"current_trend_state": current_trend_state,
@ -891,7 +891,7 @@ class TibberPricesTrendCalculator(TibberPricesBaseCalculator):
change_time = time.get_interval_time(change_interval)
if change_time:
change_price = float(change_interval["total"])
minutes_until = int(time.minutes_until(change_time))
minutes_until = time.minutes_until_rounded(change_time)
factor = get_display_unit_factor(self.config_entry)
vf = first_change["vol_factor"]

View file

@ -344,7 +344,7 @@ class TibberPricesSensor(TibberPricesEntity, RestoreSensor):
elif self.entity_description.key in (
"current_price_trend",
"next_price_trend_change",
"trend_change_in_minutes",
"next_price_trend_change_in",
):
self._trend_calculator.clear_calculation_cache()

View file

@ -519,11 +519,11 @@ FUTURE_TREND_SENSORS = (
),
# Trend change countdown sensor (how long until trend changes?)
SensorEntityDescription(
key="trend_change_in_minutes",
translation_key="trend_change_in_minutes",
key="next_price_trend_change_in",
translation_key="next_price_trend_change_in",
icon="mdi:timer-outline",
device_class=SensorDeviceClass.DURATION,
native_unit_of_measurement=UnitOfTime.HOURS,
native_unit_of_measurement=UnitOfTime.MINUTES,
suggested_unit_of_measurement=UnitOfTime.HOURS,
state_class=None, # Countdown timer: no statistics
suggested_display_precision=2,
@ -766,7 +766,7 @@ BEST_PRICE_TIMING_SENSORS = (
translation_key="best_price_period_duration",
icon="mdi:timer",
device_class=SensorDeviceClass.DURATION,
native_unit_of_measurement=UnitOfTime.HOURS,
native_unit_of_measurement=UnitOfTime.MINUTES,
suggested_unit_of_measurement=UnitOfTime.HOURS,
state_class=None, # Duration not needed in long-term statistics
suggested_display_precision=2,
@ -777,7 +777,7 @@ BEST_PRICE_TIMING_SENSORS = (
translation_key="best_price_remaining_minutes",
icon="mdi:timer-sand",
device_class=SensorDeviceClass.DURATION,
native_unit_of_measurement=UnitOfTime.HOURS,
native_unit_of_measurement=UnitOfTime.MINUTES,
suggested_unit_of_measurement=UnitOfTime.HOURS,
state_class=None, # Countdown timers excluded from statistics
suggested_display_precision=2,
@ -802,7 +802,7 @@ BEST_PRICE_TIMING_SENSORS = (
translation_key="best_price_next_in_minutes",
icon="mdi:timer-outline",
device_class=SensorDeviceClass.DURATION,
native_unit_of_measurement=UnitOfTime.HOURS,
native_unit_of_measurement=UnitOfTime.MINUTES,
suggested_unit_of_measurement=UnitOfTime.HOURS,
state_class=None, # Next-start timers excluded from statistics
suggested_display_precision=2,
@ -822,7 +822,7 @@ PEAK_PRICE_TIMING_SENSORS = (
translation_key="peak_price_period_duration",
icon="mdi:timer",
device_class=SensorDeviceClass.DURATION,
native_unit_of_measurement=UnitOfTime.HOURS,
native_unit_of_measurement=UnitOfTime.MINUTES,
suggested_unit_of_measurement=UnitOfTime.HOURS,
state_class=None, # Duration not needed in long-term statistics
suggested_display_precision=2,
@ -833,7 +833,7 @@ PEAK_PRICE_TIMING_SENSORS = (
translation_key="peak_price_remaining_minutes",
icon="mdi:timer-sand",
device_class=SensorDeviceClass.DURATION,
native_unit_of_measurement=UnitOfTime.HOURS,
native_unit_of_measurement=UnitOfTime.MINUTES,
suggested_unit_of_measurement=UnitOfTime.HOURS,
state_class=None, # Countdown timers excluded from statistics
suggested_display_precision=2,
@ -858,7 +858,7 @@ PEAK_PRICE_TIMING_SENSORS = (
translation_key="peak_price_next_in_minutes",
icon="mdi:timer-outline",
device_class=SensorDeviceClass.DURATION,
native_unit_of_measurement=UnitOfTime.HOURS,
native_unit_of_measurement=UnitOfTime.MINUTES,
suggested_unit_of_measurement=UnitOfTime.HOURS,
state_class=None, # Next-start timers excluded from statistics
suggested_display_precision=2,

View file

@ -70,14 +70,6 @@ def get_value_getter_mapping( # noqa: PLR0913 - needs all calculators as parame
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 {
# ================================================================
# INTERVAL-BASED SENSORS - via IntervalCalculator
@ -205,7 +197,7 @@ def get_value_getter_mapping( # noqa: PLR0913 - needs all calculators as parame
# Current and next trend change sensors
"current_price_trend": trend_calculator.get_current_trend_value,
"next_price_trend_change": trend_calculator.get_next_trend_change_value,
"trend_change_in_minutes": lambda: _minutes_to_hours(trend_calculator.get_trend_change_in_minutes_value()),
"next_price_trend_change_in": trend_calculator.get_trend_change_in_minutes_value,
# Price outlook sensors (current price vs average of next Xh)
"price_outlook_1h": lambda: trend_calculator.get_price_outlook_value(hours=1),
"price_outlook_2h": lambda: trend_calculator.get_price_outlook_value(hours=2),
@ -260,17 +252,13 @@ def get_value_getter_mapping( # noqa: PLR0913 - needs all calculators as parame
"best_price_end_time": lambda: timing_calculator.get_period_timing_value(
period_type="best_price", value_type="end_time"
),
"best_price_period_duration": lambda: _minutes_to_hours(
cast(
"float | None",
timing_calculator.get_period_timing_value(period_type="best_price", value_type="period_duration"),
)
"best_price_period_duration": lambda: cast(
"float | None",
timing_calculator.get_period_timing_value(period_type="best_price", value_type="period_duration"),
),
"best_price_remaining_minutes": lambda: _minutes_to_hours(
cast(
"float | None",
timing_calculator.get_period_timing_value(period_type="best_price", value_type="remaining_minutes"),
)
"best_price_remaining_minutes": lambda: 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(
period_type="best_price", value_type="progress"
@ -278,27 +266,21 @@ def get_value_getter_mapping( # noqa: PLR0913 - needs all calculators as parame
"best_price_next_start_time": lambda: timing_calculator.get_period_timing_value(
period_type="best_price", value_type="next_start_time"
),
"best_price_next_in_minutes": lambda: _minutes_to_hours(
cast(
"float | None",
timing_calculator.get_period_timing_value(period_type="best_price", value_type="next_in_minutes"),
)
"best_price_next_in_minutes": lambda: cast(
"float | None",
timing_calculator.get_period_timing_value(period_type="best_price", value_type="next_in_minutes"),
),
# Peak Price timing sensors
"peak_price_end_time": lambda: timing_calculator.get_period_timing_value(
period_type="peak_price", value_type="end_time"
),
"peak_price_period_duration": lambda: _minutes_to_hours(
cast(
"float | None",
timing_calculator.get_period_timing_value(period_type="peak_price", value_type="period_duration"),
)
"peak_price_period_duration": lambda: cast(
"float | None",
timing_calculator.get_period_timing_value(period_type="peak_price", value_type="period_duration"),
),
"peak_price_remaining_minutes": lambda: _minutes_to_hours(
cast(
"float | None",
timing_calculator.get_period_timing_value(period_type="peak_price", value_type="remaining_minutes"),
)
"peak_price_remaining_minutes": lambda: 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(
period_type="peak_price", value_type="progress"
@ -306,11 +288,9 @@ def get_value_getter_mapping( # noqa: PLR0913 - needs all calculators as parame
"peak_price_next_start_time": lambda: timing_calculator.get_period_timing_value(
period_type="peak_price", value_type="next_start_time"
),
"peak_price_next_in_minutes": lambda: _minutes_to_hours(
cast(
"float | None",
timing_calculator.get_period_timing_value(period_type="peak_price", value_type="next_in_minutes"),
)
"peak_price_next_in_minutes": lambda: 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": get_chart_data_export_value,

View file

@ -782,8 +782,8 @@
"next_price_trend_change": {
"name": "Nächste Trendänderung"
},
"trend_change_in_minutes": {
"name": "Trendänderung in"
"next_price_trend_change_in": {
"name": "Nächste Trendänderung in"
},
"daily_rating": {
"name": "Tägliche Preisbewertung"

View file

@ -782,8 +782,8 @@
"next_price_trend_change": {
"name": "Next Price Trend Change"
},
"trend_change_in_minutes": {
"name": "Trend Change In"
"next_price_trend_change_in": {
"name": "Next Price Trend Change In"
},
"daily_rating": {
"name": "Daily Price Rating"

View file

@ -782,8 +782,8 @@
"next_price_trend_change": {
"name": "Neste trendendring"
},
"trend_change_in_minutes": {
"name": "Trendendring om"
"next_price_trend_change_in": {
"name": "Neste trendendring om"
},
"daily_rating": {
"name": "Daglig prisvurdering"

View file

@ -782,8 +782,8 @@
"next_price_trend_change": {
"name": "Volgende Prijstrend Wijziging"
},
"trend_change_in_minutes": {
"name": "Trendwijziging over"
"next_price_trend_change_in": {
"name": "Volgende Prijstrend Wijziging over"
},
"daily_rating": {
"name": "Dagelijkse Prijsbeoordeling"

View file

@ -782,8 +782,8 @@
"next_price_trend_change": {
"name": "Nästa pristrendändring"
},
"trend_change_in_minutes": {
"name": "Trendändring om"
"next_price_trend_change_in": {
"name": "Nästa pristrendändring om"
},
"daily_rating": {
"name": "Dagligt prisbetyg"