mirror of
https://github.com/jpawlowski/hass.tibber_prices.git
synced 2026-05-28 18:43:40 +00:00
feat(services): add price_source parameter to get_chartdata and get_apexcharts_yaml
Add a `price_source` field (total | energy | tax, default: total) to both
services, allowing users to choose which price component is used as the
primary chart series.
- get_chartdata: all 9 interval.get("total") calls now use price_source
- get_apexcharts_yaml: price_source forwarded through all 4 JS
data_generator calls; yaxis template variables resolve to
yaxis_min_energy / yaxis_min_tax when price_source != "total"
- Metadata-only path: always computes yaxis_suggested_energy and
yaxis_suggested_tax alongside the main yaxis bounds so the
chart_metadata sensor can expose the correct axis scale for any source
- chart_metadata sensor: exposes yaxis_min_energy, yaxis_max_energy,
yaxis_min_tax, yaxis_max_tax as new attributes
- services.yaml + all 5 language files (en, de, nb, nl, sv): price_source
field and selector options added
Impact: Users can now chart the raw energy (spot) price or the tax component separately, with correct Y-axis scaling in ApexCharts.
Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
parent
75d7e20a22
commit
dc4933ec5c
9 changed files with 277 additions and 97 deletions
|
|
@ -138,6 +138,14 @@ def build_chart_metadata_attributes(
|
|||
if "max" in yaxis_suggested:
|
||||
attributes["yaxis_max"] = yaxis_suggested["max"]
|
||||
|
||||
# Add per-source yaxis bounds (for energy/tax price_source in charts)
|
||||
for source in ("energy", "tax"):
|
||||
yaxis_extra = metadata.get(f"yaxis_suggested_{source}", {})
|
||||
if "min" in yaxis_extra:
|
||||
attributes[f"yaxis_min_{source}"] = yaxis_extra["min"]
|
||||
if "max" in yaxis_extra:
|
||||
attributes[f"yaxis_max_{source}"] = yaxis_extra["max"]
|
||||
|
||||
# Add currency info (useful for labeling)
|
||||
if "currency" in metadata:
|
||||
attributes["currency"] = metadata["currency"]
|
||||
|
|
|
|||
|
|
@ -56,6 +56,17 @@ get_apexcharts_yaml:
|
|||
- interval
|
||||
- hourly
|
||||
translation_key: resolution
|
||||
price_source:
|
||||
required: false
|
||||
default: total
|
||||
example: energy
|
||||
selector:
|
||||
select:
|
||||
options:
|
||||
- total
|
||||
- energy
|
||||
- tax
|
||||
translation_key: price_source
|
||||
highlight_best_price:
|
||||
required: false
|
||||
default: true
|
||||
|
|
@ -100,6 +111,17 @@ get_chartdata:
|
|||
- interval
|
||||
- hourly
|
||||
translation_key: resolution
|
||||
price_source:
|
||||
required: false
|
||||
default: total
|
||||
example: energy
|
||||
selector:
|
||||
select:
|
||||
options:
|
||||
- total
|
||||
- energy
|
||||
- tax
|
||||
translation_key: price_source
|
||||
filters:
|
||||
collapsed: true
|
||||
fields:
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@ APEXCHARTS_SERVICE_SCHEMA = vol.Schema(
|
|||
vol.Optional("day"): vol.In(["yesterday", "today", "tomorrow", "rolling_window", "rolling_window_autozoom"]),
|
||||
vol.Optional("level_type", default="rating_level"): vol.In(["rating_level", "level"]),
|
||||
vol.Optional("resolution", default="interval"): vol.In(["interval", "hourly"]),
|
||||
vol.Optional("price_source", default="total"): vol.In(["total", "energy", "tax"]),
|
||||
vol.Optional("highlight_best_price", default=True): cv.boolean,
|
||||
vol.Optional("highlight_peak_price", default=False): cv.boolean,
|
||||
}
|
||||
|
|
@ -288,6 +289,7 @@ async def handle_apexcharts_yaml(call: ServiceCall) -> dict[str, Any]: # noqa:
|
|||
day = call.data.get("day") # Can be None (rolling window mode)
|
||||
level_type = call.data.get("level_type", "rating_level")
|
||||
resolution = call.data.get("resolution", "interval")
|
||||
price_source = call.data.get("price_source", "total")
|
||||
highlight_best_price = call.data.get("highlight_best_price", True)
|
||||
highlight_peak_price = call.data.get("highlight_peak_price", False)
|
||||
|
||||
|
|
@ -366,7 +368,7 @@ async def handle_apexcharts_yaml(call: ServiceCall) -> dict[str, Any]: # noqa:
|
|||
f"return_response: true, "
|
||||
f"service_data: {{ entry_id: '{entry_id}', {day_param}"
|
||||
f"period_filter: 'best_price', resolution: '{resolution}', "
|
||||
f"output_format: 'array_of_arrays', insert_nulls: 'segments', subunit_currency: {subunit_param} }} }}); "
|
||||
f"output_format: 'array_of_arrays', insert_nulls: 'segments', subunit_currency: {subunit_param}, price_source: '{price_source}' }} }}); "
|
||||
f"const originalData = response.response.data; "
|
||||
f"return originalData.map((point, i) => {{ "
|
||||
f"const result = [point[0], point[1] === null ? null : 1]; "
|
||||
|
|
@ -410,7 +412,7 @@ async def handle_apexcharts_yaml(call: ServiceCall) -> dict[str, Any]: # noqa:
|
|||
f"return_response: true, "
|
||||
f"service_data: {{ entry_id: '{entry_id}', {day_param}"
|
||||
f"period_filter: 'peak_price', resolution: '{resolution}', "
|
||||
f"output_format: 'array_of_arrays', insert_nulls: 'segments', subunit_currency: {subunit_param} }} }}); "
|
||||
f"output_format: 'array_of_arrays', insert_nulls: 'segments', subunit_currency: {subunit_param}, price_source: '{price_source}' }} }}); "
|
||||
f"const originalData = response.response.data; "
|
||||
f"return originalData.map((point, i) => {{ "
|
||||
f"const result = [point[0], point[1] === null ? null : 1]; "
|
||||
|
|
@ -472,7 +474,7 @@ async def handle_apexcharts_yaml(call: ServiceCall) -> dict[str, Any]: # noqa:
|
|||
f"return_response: true, "
|
||||
f"service_data: {{ entry_id: '{entry_id}', {day_param}{filter_param}, resolution: '{resolution}', "
|
||||
f"output_format: 'array_of_arrays', insert_nulls: 'segments', subunit_currency: {subunit_param}, "
|
||||
f"connect_segments: true }} }}); "
|
||||
f"price_source: '{price_source}', connect_segments: true }} }}); "
|
||||
f"return response.response.data;"
|
||||
)
|
||||
else:
|
||||
|
|
@ -485,7 +487,7 @@ async def handle_apexcharts_yaml(call: ServiceCall) -> dict[str, Any]: # noqa:
|
|||
f"return_response: true, "
|
||||
f"service_data: {{ entry_id: '{entry_id}', {day_param}{filter_param}, resolution: '{resolution}', "
|
||||
f"output_format: 'array_of_arrays', insert_nulls: 'segments', subunit_currency: {subunit_param}, "
|
||||
f"connect_segments: true }} }}); "
|
||||
f"price_source: '{price_source}', connect_segments: true }} }}); "
|
||||
f"return response.response.data;"
|
||||
)
|
||||
# Configure show options based on level_type and level_key
|
||||
|
|
@ -820,10 +822,12 @@ async def handle_apexcharts_yaml(call: ServiceCall) -> dict[str, Any]: # noqa:
|
|||
variables_dict = {"v_graph_span": template_graph_span}
|
||||
if use_sensor_metadata:
|
||||
# Add dynamic metadata variables from sensor
|
||||
# Use price-source-specific yaxis attrs when not using 'total'
|
||||
yaxis_attr_suffix = f"_{price_source}" if price_source != "total" else ""
|
||||
variables_dict.update(
|
||||
{
|
||||
"v_yaxis_min": f"states['{chart_metadata_sensor}'].attributes.yaxis_min",
|
||||
"v_yaxis_max": f"states['{chart_metadata_sensor}'].attributes.yaxis_max",
|
||||
"v_yaxis_min": f"states['{chart_metadata_sensor}'].attributes.yaxis_min{yaxis_attr_suffix}",
|
||||
"v_yaxis_max": f"states['{chart_metadata_sensor}'].attributes.yaxis_max{yaxis_attr_suffix}",
|
||||
}
|
||||
)
|
||||
|
||||
|
|
@ -985,10 +989,12 @@ async def handle_apexcharts_yaml(call: ServiceCall) -> dict[str, Any]: # noqa:
|
|||
variables_dict = {"v_offset": template_value}
|
||||
if use_sensor_metadata:
|
||||
# Add dynamic metadata variables from sensor
|
||||
# Use price-source-specific yaxis attrs when not using 'total'
|
||||
yaxis_attr_suffix = f"_{price_source}" if price_source != "total" else ""
|
||||
variables_dict.update(
|
||||
{
|
||||
"v_yaxis_min": f"states['{chart_metadata_sensor}'].attributes.yaxis_min",
|
||||
"v_yaxis_max": f"states['{chart_metadata_sensor}'].attributes.yaxis_max",
|
||||
"v_yaxis_min": f"states['{chart_metadata_sensor}'].attributes.yaxis_min{yaxis_attr_suffix}",
|
||||
"v_yaxis_max": f"states['{chart_metadata_sensor}'].attributes.yaxis_max{yaxis_attr_suffix}",
|
||||
}
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -279,6 +279,7 @@ CHARTDATA_SERVICE_SCHEMA: Final = vol.Schema(
|
|||
vol.Optional("include_level", default=False): bool,
|
||||
vol.Optional("include_rating_level", default=False): bool,
|
||||
vol.Optional("include_average", default=False): bool,
|
||||
vol.Optional("price_source", default="total"): vol.In(["total", "energy", "tax"]),
|
||||
vol.Optional("include_energy", default=False): bool,
|
||||
vol.Optional("include_tax", default=False): bool,
|
||||
vol.Optional("level_filter"): vol.All(
|
||||
|
|
@ -380,6 +381,7 @@ async def handle_chartdata(call: ServiceCall) -> dict[str, Any]: # noqa: C901
|
|||
subunit_currency = data.get("subunit_currency", False)
|
||||
metadata = data.get("metadata", "include")
|
||||
round_decimals = data.get("round_decimals")
|
||||
price_source = data.get("price_source", "total")
|
||||
include_level = data.get("include_level", False)
|
||||
include_rating_level = data.get("include_rating_level", False)
|
||||
include_average = data.get("include_average", False)
|
||||
|
|
@ -453,7 +455,7 @@ async def handle_chartdata(call: ServiceCall) -> dict[str, Any]: # noqa: C901
|
|||
chart_data_for_meta = []
|
||||
for interval in all_intervals:
|
||||
start_time = interval.get("startsAt")
|
||||
price = interval.get("total")
|
||||
price = interval.get(price_source)
|
||||
if start_time is not None and price is not None:
|
||||
# Convert price to requested currency
|
||||
converted_price = round(price * 100, 2) if subunit_currency else round(price, 4)
|
||||
|
|
@ -474,6 +476,33 @@ async def handle_chartdata(call: ServiceCall) -> dict[str, Any]: # noqa: C901
|
|||
subunit_currency=subunit_currency,
|
||||
)
|
||||
|
||||
# Always add yaxis bounds for energy and tax sources so the chart_metadata
|
||||
# sensor can expose them regardless of which price_source was requested.
|
||||
# This lets get_apexcharts_yaml pick the right axis when price_source != "total".
|
||||
def _yaxis_for_source(source: str) -> dict[str, float] | None:
|
||||
prices = [
|
||||
(round(float(iv[source]) * 100, 2) if subunit_currency else round(float(iv[source]), 4))
|
||||
for iv in all_intervals
|
||||
if iv.get(source) is not None
|
||||
]
|
||||
if not prices:
|
||||
return None
|
||||
data_range = max(prices) - min(prices)
|
||||
padding_below = data_range * 0.08
|
||||
padding_above = data_range * 0.15
|
||||
if data_range == 0:
|
||||
padding_below = abs(prices[0]) * 0.08 or (0.8 if subunit_currency else 0.008)
|
||||
padding_above = abs(prices[0]) * 0.15 or (1.5 if subunit_currency else 0.015)
|
||||
if subunit_currency:
|
||||
return {"min": round(min(prices) - padding_below, 1), "max": round(max(prices) + padding_above, 1)}
|
||||
return {"min": round(min(prices) - padding_below, 2), "max": round(max(prices) + padding_above, 2)}
|
||||
|
||||
for extra_source in ("energy", "tax"):
|
||||
if extra_source != price_source:
|
||||
yaxis_extra = _yaxis_for_source(extra_source)
|
||||
if yaxis_extra:
|
||||
metadata[f"yaxis_suggested_{extra_source}"] = yaxis_extra
|
||||
|
||||
result_meta: dict[str, Any] = {"metadata": metadata}
|
||||
if resolved_refs:
|
||||
result_meta["_resolved"] = resolved_refs
|
||||
|
|
@ -601,7 +630,7 @@ async def handle_chartdata(call: ServiceCall) -> dict[str, Any]: # noqa: C901
|
|||
|
||||
# Calculate average if requested
|
||||
if include_average:
|
||||
prices = [p["total"] for p in day_intervals if p.get("total") is not None]
|
||||
prices = [p[price_source] for p in day_intervals if p.get(price_source) is not None]
|
||||
if prices:
|
||||
avg = sum(prices) / len(prices)
|
||||
# Apply same transformations as to regular prices
|
||||
|
|
@ -652,7 +681,7 @@ async def handle_chartdata(call: ServiceCall) -> dict[str, Any]: # noqa: C901
|
|||
# No data for this timestamp - skip entirely
|
||||
continue
|
||||
|
||||
price = interval.get("total")
|
||||
price = interval.get(price_source)
|
||||
if price is None:
|
||||
continue
|
||||
|
||||
|
|
@ -704,7 +733,7 @@ async def handle_chartdata(call: ServiceCall) -> dict[str, Any]: # noqa: C901
|
|||
|
||||
for interval in all_prices:
|
||||
start_time = interval.get("startsAt")
|
||||
price = interval.get("total")
|
||||
price = interval.get(price_source)
|
||||
|
||||
if start_time is None or price is None:
|
||||
continue
|
||||
|
|
@ -760,8 +789,8 @@ async def handle_chartdata(call: ServiceCall) -> dict[str, Any]: # noqa: C901
|
|||
next_interval = all_prices[i + 1]
|
||||
|
||||
start_time = interval.get("startsAt")
|
||||
price = interval.get("total")
|
||||
next_price = next_interval.get("total")
|
||||
price = interval.get(price_source)
|
||||
next_price = next_interval.get(price_source)
|
||||
next_start_time = next_interval.get("startsAt")
|
||||
|
||||
if start_time is None or price is None:
|
||||
|
|
@ -770,7 +799,7 @@ async def handle_chartdata(call: ServiceCall) -> dict[str, Any]: # noqa: C901
|
|||
interval_value = interval.get(filter_field)
|
||||
next_value = next_interval.get(filter_field)
|
||||
prev_value = all_prices[i - 1].get(filter_field) if i > 0 else None
|
||||
prev_price = all_prices[i - 1].get("total") if i > 0 else None
|
||||
prev_price = all_prices[i - 1].get(price_source) if i > 0 else None
|
||||
|
||||
# Check if current interval matches filter
|
||||
if interval_value in filter_values: # type: ignore[operator]
|
||||
|
|
@ -921,7 +950,7 @@ async def handle_chartdata(call: ServiceCall) -> dict[str, Any]: # noqa: C901
|
|||
if all_prices:
|
||||
last_interval = all_prices[-1]
|
||||
last_start_time = last_interval.get("startsAt")
|
||||
last_price = last_interval.get("total")
|
||||
last_price = last_interval.get(price_source)
|
||||
last_value = last_interval.get(filter_field)
|
||||
|
||||
if last_start_time and last_price is not None and last_value in filter_values: # type: ignore[operator]
|
||||
|
|
@ -975,7 +1004,7 @@ async def handle_chartdata(call: ServiceCall) -> dict[str, Any]: # noqa: C901
|
|||
# Mode 'none' (default): Only return matching intervals, no NULL insertion
|
||||
for interval in all_prices:
|
||||
start_time = interval.get("startsAt")
|
||||
price = interval.get("total")
|
||||
price = interval.get(price_source)
|
||||
|
||||
if start_time is not None and price is not None:
|
||||
# Apply period filter if specified
|
||||
|
|
|
|||
|
|
@ -195,6 +195,17 @@
|
|||
},
|
||||
"submit": "↩ Speichern & Zurück"
|
||||
},
|
||||
"price_level": {
|
||||
"title": "🏷️ Preisniveau-Einstellungen (von Tibber API)",
|
||||
"description": "**Konfiguriere die Stabilisierung für Tibbers Preisniveau-Klassifizierung (sehr günstig/günstig/normal/teuer/sehr teuer).**\n\nTibbers API liefert ein Preisniveau-Feld für jedes Intervall. Diese Einstellung glättet kurze Schwankungen, um Instabilität in Automatisierungen zu verhindern.{entity_warning}",
|
||||
"data": {
|
||||
"price_level_gap_tolerance": "Gap-Toleranz"
|
||||
},
|
||||
"data_description": {
|
||||
"price_level_gap_tolerance": "Maximale Anzahl aufeinanderfolgender Intervalle, die 'geglättet' werden können, wenn sie von umgebenden Preisniveaus abweichen. Kleine isolierte Niveauänderungen werden mit dem dominanten Nachbarblock zusammengeführt. Beispiel: 1 bedeutet, dass ein einzelnes 'normal'-Intervall, umgeben von 'günstig'-Intervallen, zu 'günstig' korrigiert wird. Auf 0 setzen zum Deaktivieren. Standard: 1"
|
||||
},
|
||||
"submit": "↩ Speichern & Zurück"
|
||||
},
|
||||
"best_price": {
|
||||
"title": "💚 Bestpreis-Zeitraum Einstellungen",
|
||||
"description": "**Konfiguration für den Bestpreis-Zeitraum mit den niedrigsten Strompreisen.**{entity_warning}{override_warning}\n\n---",
|
||||
|
|
@ -375,17 +386,6 @@
|
|||
"confirm_reset": "Ja, alles auf Werkseinstellungen zurücksetzen"
|
||||
},
|
||||
"submit": "Jetzt zurücksetzen"
|
||||
},
|
||||
"price_level": {
|
||||
"title": "🏷️ Preisniveau-Einstellungen (von Tibber API)",
|
||||
"description": "**Konfiguriere die Stabilisierung für Tibbers Preisniveau-Klassifizierung (sehr günstig/günstig/normal/teuer/sehr teuer).**\n\nTibbers API liefert ein Preisniveau-Feld für jedes Intervall. Diese Einstellung glättet kurze Schwankungen, um Instabilität in Automatisierungen zu verhindern.{entity_warning}",
|
||||
"data": {
|
||||
"price_level_gap_tolerance": "Gap-Toleranz"
|
||||
},
|
||||
"data_description": {
|
||||
"price_level_gap_tolerance": "Maximale Anzahl aufeinanderfolgender Intervalle, die 'geglättet' werden können, wenn sie von umgebenden Preisniveaus abweichen. Kleine isolierte Niveauänderungen werden mit dem dominanten Nachbarblock zusammengeführt. Beispiel: 1 bedeutet, dass ein einzelnes 'normal'-Intervall, umgeben von 'günstig'-Intervallen, zu 'günstig' korrigiert wird. Auf 0 setzen zum Deaktivieren. Standard: 1"
|
||||
},
|
||||
"submit": "↩ Speichern & Zurück"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
|
|
@ -395,11 +395,11 @@
|
|||
"cannot_connect": "Verbindung fehlgeschlagen",
|
||||
"invalid_access_token": "Ungültiges Zugriffstoken",
|
||||
"different_home": "Der Zugriffstoken ist nicht gültig für die Home ID, für die diese Integration konfiguriert ist.",
|
||||
"invalid_period_length": "Die Periodenlänge muss mindestens 15 Minuten betragen (Vielfache von 15).",
|
||||
"invalid_flex": "Flexibilitätsprozentsatz muss zwischen -50% und +50% liegen",
|
||||
"invalid_best_price_distance": "Distanzprozentsatz muss zwischen -50% und 0% liegen (negativ = unter Durchschnitt)",
|
||||
"invalid_peak_price_distance": "Distanzprozentsatz muss zwischen 0% und 50% liegen (positiv = über Durchschnitt)",
|
||||
"invalid_min_periods": "Mindestanzahl der Zeiträume muss zwischen 1 und 10 liegen",
|
||||
"invalid_period_length": "Die Periodenlänge muss mindestens 15 Minuten betragen (Vielfache von 15).",
|
||||
"invalid_gap_count": "Lückentoleranz muss zwischen 0 und 8 liegen",
|
||||
"invalid_relaxation_attempts": "Lockerungsversuche müssen zwischen 1 und 12 liegen",
|
||||
"invalid_price_rating_low": "Untere Preis-Bewertungsschwelle muss zwischen -50% und -5% liegen",
|
||||
|
|
@ -1389,6 +1389,14 @@
|
|||
"name": "Stufen-Typ",
|
||||
"description": "Wähle, welche Preisstufen-Klassifizierung visualisiert werden soll: 'rating_level' (niedrig/normal/hoch basierend auf deinen konfigurierten Schwellenwerten) oder 'level' (Tibber-API-Stufen: sehr günstig/günstig/normal/teuer/sehr teuer)."
|
||||
},
|
||||
"resolution": {
|
||||
"name": "Auflösung",
|
||||
"description": "Zeitauflösung für die Diagrammdaten. 'interval' (Standard): Originale 15-Minuten-Intervalle (96 Punkte pro Tag). 'hourly': Aggregierte Stundenwerte mit einem rollierenden 60-Minuten-Fenster (24 Punkte pro Tag) für ein übersichtlicheres Diagramm."
|
||||
},
|
||||
"price_source": {
|
||||
"name": "Preisquelle",
|
||||
"description": "Welche Preiskomponente als Hauptpreis verwendet werden soll. 'total' (Standard): Gesamtpreis inkl. Energie, Steuern und Gebühren. 'energy': Nur der reine Spot-/Energiepreis (ohne Steuern und Gebühren). 'tax': Nur Steuer- und Gebührenanteil."
|
||||
},
|
||||
"highlight_best_price": {
|
||||
"name": "Bestpreis-Zeiträume hervorheben",
|
||||
"description": "Füge eine halbtransparente grüne Überlagerung hinzu, um die Bestpreis-Zeiträume im Diagramm hervorzuheben. Dies erleichtert die visuelle Identifizierung der optimalen Zeiten für den Energieverbrauch."
|
||||
|
|
@ -1396,10 +1404,6 @@
|
|||
"highlight_peak_price": {
|
||||
"name": "Spitzenpreis-Zeiträume hervorheben",
|
||||
"description": "Füge eine halbtransparente rote Überlagerung hinzu, um die Spitzenpreis-Zeiträume im Diagramm hervorzuheben. Dies erleichtert die visuelle Identifizierung der Zeiten, in denen Energie am teuersten ist."
|
||||
},
|
||||
"resolution": {
|
||||
"name": "Auflösung",
|
||||
"description": "Zeitauflösung für die Diagrammdaten. 'interval' (Standard): Originale 15-Minuten-Intervalle (96 Punkte pro Tag). 'hourly': Aggregierte Stundenwerte mit einem rollierenden 60-Minuten-Fenster (24 Punkte pro Tag) für ein übersichtlicheres Diagramm."
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -1449,6 +1453,10 @@
|
|||
"name": "Auflösung",
|
||||
"description": "Zeitauflösung für die zurückgegebenen Daten. Optionen: 'interval' (Standard, 15-Minuten-Intervalle, 96 Datenpunkte pro Tag), 'hourly' (stündliche Durchschnitte, 24 Datenpunkte pro Tag)."
|
||||
},
|
||||
"price_source": {
|
||||
"name": "Preisquelle",
|
||||
"description": "Welche Preiskomponente als Hauptpreis verwendet werden soll. 'total' (Standard): Gesamtpreis inkl. Energie, Steuern und Gebühren. 'energy': Nur der reine Spot-/Energiepreis (ohne Steuern und Gebühren). 'tax': Nur Steuer- und Gebührenanteil."
|
||||
},
|
||||
"output_format": {
|
||||
"name": "Ausgabeformat",
|
||||
"description": "Ausgabeformat für die zurückgegebenen Daten. Optionen: 'array_of_objects' (Standard, Array von Objekten mit anpassbaren Feldnamen), 'array_of_arrays' (Array von [Zeitstempel, Preis]-Arrays mit abschließendem Null-Punkt für Stepline-Charts)."
|
||||
|
|
@ -1465,6 +1473,10 @@
|
|||
"name": "Dezimalstellen runden",
|
||||
"description": "Anzahl der Dezimalstellen, auf die Preise gerundet werden sollen (0-10). Falls nicht angegeben, wird die Standardgenauigkeit verwendet (4 Dezimalstellen für Basiswährung, 2 für Unterwährungseinheit)."
|
||||
},
|
||||
"data_key": {
|
||||
"name": "Daten-Schlüssel",
|
||||
"description": "Benutzerdefinierter Name für den obersten Datenschlüssel in der Antwort. Standard ist 'data', falls nicht angegeben."
|
||||
},
|
||||
"include_level": {
|
||||
"name": "Preisniveau einschließen",
|
||||
"description": "Fügt das Tibber-Preisniveau (sehr günstig/günstig/normal/teuer/sehr teuer) zu jedem Datenpunkt hinzu."
|
||||
|
|
@ -1544,10 +1556,6 @@
|
|||
"metadata": {
|
||||
"name": "Metadaten",
|
||||
"description": "Steuerung der Metadaten-Einbindung in der Antwort. 'include' (Standard): Gibt Chart-Daten und Metadaten mit Preisstatistiken, Währungsinformationen, Y-Achsen-Vorschlägen und Zeitbereich zurück. 'only': Gibt nur Metadaten zurück ohne Chart-Daten zu verarbeiten (schnell, nützlich für dynamische Y-Achsen-Konfiguration). 'none': Gibt nur Chart-Daten ohne Metadaten zurück."
|
||||
},
|
||||
"data_key": {
|
||||
"name": "Daten-Schlüssel",
|
||||
"description": "Benutzerdefinierter Name für den obersten Datenschlüssel in der Antwort. Standard ist 'data', falls nicht angegeben."
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -2364,6 +2372,16 @@
|
|||
"description": "Limit how many separate charging segments may be used per day. The planner keeps the cheapest segments within this limit."
|
||||
}
|
||||
}
|
||||
},
|
||||
"debug_clear_tomorrow": {
|
||||
"name": "Debug: Morgendaten löschen",
|
||||
"description": "DEBUG/TESTING: Entfernt die Preisdaten für morgen aus dem Interval-Pool-Cache. Verwende dies, um den Aktualisierungszyklus für Morgendaten zu testen, ohne auf den nächsten Tag zu warten. Nach dem Aufruf dieses Dienstes zeigt der Lifecycle-Sensor 'searching_tomorrow' (nach 13:00 Uhr) an und der nächste Timer-#1-Zyklus lädt neue Daten von der API.",
|
||||
"fields": {
|
||||
"entry_id": {
|
||||
"name": "Eintrag-ID",
|
||||
"description": "Optionale Konfigurationseintrag-ID. Wenn sie nicht angegeben ist, wird der erste verfügbare Eintrag verwendet."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"selector": {
|
||||
|
|
@ -2428,6 +2446,13 @@
|
|||
"peak_price": "Spitzenpreis-Zeiträume"
|
||||
}
|
||||
},
|
||||
"price_source": {
|
||||
"options": {
|
||||
"total": "Gesamt (inkl. Steuern & Gebühren)",
|
||||
"energy": "Nur Energiepreis",
|
||||
"tax": "Nur Steuern & Gebühren"
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"options": {
|
||||
"include": "Einbeziehen (Daten + Metadaten)",
|
||||
|
|
|
|||
|
|
@ -1389,6 +1389,14 @@
|
|||
"name": "Level Type",
|
||||
"description": "Select which price level classification to visualize: 'rating_level' (low/normal/high based on your configured thresholds) or 'level' (Tibber API levels: very cheap/cheap/normal/expensive/very expensive)."
|
||||
},
|
||||
"resolution": {
|
||||
"name": "Resolution",
|
||||
"description": "Time resolution for the chart data. 'interval' (default): Original 15-minute intervals (96 points per day). 'hourly': Aggregated hourly values using a rolling 60-minute window (24 points per day) for a cleaner, less cluttered chart."
|
||||
},
|
||||
"price_source": {
|
||||
"name": "Price Source",
|
||||
"description": "Which price component to use as the main price series. 'total' (default): Total price incl. energy, taxes, and fees. 'energy': Raw spot/energy price only (excluding taxes and fees). 'tax': Taxes and fees only."
|
||||
},
|
||||
"highlight_best_price": {
|
||||
"name": "Highlight Best Price Periods",
|
||||
"description": "Add a semi-transparent green overlay to highlight the best price periods on the chart. This makes it easy to visually identify the optimal times for energy consumption."
|
||||
|
|
@ -1396,10 +1404,6 @@
|
|||
"highlight_peak_price": {
|
||||
"name": "Highlight Peak Price Periods",
|
||||
"description": "Add a semi-transparent red overlay to highlight the peak price periods on the chart. This makes it easy to visually identify times when energy is most expensive."
|
||||
},
|
||||
"resolution": {
|
||||
"name": "Resolution",
|
||||
"description": "Time resolution for the chart data. 'interval' (default): Original 15-minute intervals (96 points per day). 'hourly': Aggregated hourly values using a rolling 60-minute window (24 points per day) for a cleaner, less cluttered chart."
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -1449,6 +1453,10 @@
|
|||
"name": "Resolution",
|
||||
"description": "Time resolution for the returned data. Options: 'interval' (default, 15-minute intervals, 96 points per day), 'hourly' (hourly averages, 24 points per day)."
|
||||
},
|
||||
"price_source": {
|
||||
"name": "Price Source",
|
||||
"description": "Which price component to use as the primary price. 'total' (default): Full price including energy, taxes and fees. 'energy': Raw spot/energy price only (excluding taxes and fees). 'tax': Tax and fee component only."
|
||||
},
|
||||
"output_format": {
|
||||
"name": "Output Format",
|
||||
"description": "Output format for the returned data. Options: 'array_of_objects' (default, array of objects with customizable field names), 'array_of_arrays' (array of [timestamp, price] arrays with trailing null point for stepline charts)."
|
||||
|
|
@ -2438,6 +2446,13 @@
|
|||
"peak_price": "Peak Price Periods"
|
||||
}
|
||||
},
|
||||
"price_source": {
|
||||
"options": {
|
||||
"total": "Total (incl. taxes & fees)",
|
||||
"energy": "Energy price only",
|
||||
"tax": "Tax & fees only"
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"options": {
|
||||
"include": "Include (data + metadata)",
|
||||
|
|
|
|||
|
|
@ -195,6 +195,17 @@
|
|||
},
|
||||
"submit": "↩ Lagre & tilbake"
|
||||
},
|
||||
"price_level": {
|
||||
"title": "🏷️ Prisnivå-innstillinger",
|
||||
"description": "**Konfigurer stabilisering for Tibbers prisnivå-klassifisering (veldig billig/billig/normal/dyr/veldig dyr).**\n\nTibbers API gir et prisnivå-felt for hvert intervall. Denne innstillingen jevner ut korte svingninger for å forhindre ustabilitet i automatiseringer.{entity_warning}",
|
||||
"data": {
|
||||
"price_level_gap_tolerance": "Gap-toleranse"
|
||||
},
|
||||
"data_description": {
|
||||
"price_level_gap_tolerance": "Maksimalt antall påfølgende intervaller som kan 'jevnes ut' hvis de avviker fra omkringliggende prisnivåer. Små isolerte nivåendringer slås sammen med den dominerende nabogruppen. Eksempel: 1 betyr at et enkelt 'normal'-intervall omgitt av 'billig'-intervaller korrigeres til 'billig'. Sett til 0 for å deaktivere. Standard: 1"
|
||||
},
|
||||
"submit": "↩ Lagre & tilbake"
|
||||
},
|
||||
"best_price": {
|
||||
"title": "💚 Beste Prisperiode Innstillinger",
|
||||
"description": "**Konfigurer innstillinger for Beste Prisperiode binærsensor. Denne sensoren er aktiv i perioder med de laveste strømprisene.**{entity_warning}{override_warning}\n\n---",
|
||||
|
|
@ -375,17 +386,6 @@
|
|||
"confirm_reset": "Ja, tilbakestill alt til standard"
|
||||
},
|
||||
"submit": "Tilbakestill nå"
|
||||
},
|
||||
"price_level": {
|
||||
"title": "🏷️ Prisnivå-innstillinger",
|
||||
"description": "**Konfigurer stabilisering for Tibbers prisnivå-klassifisering (veldig billig/billig/normal/dyr/veldig dyr).**\n\nTibbers API gir et prisnivå-felt for hvert intervall. Denne innstillingen jevner ut korte svingninger for å forhindre ustabilitet i automatiseringer.{entity_warning}",
|
||||
"data": {
|
||||
"price_level_gap_tolerance": "Gap-toleranse"
|
||||
},
|
||||
"data_description": {
|
||||
"price_level_gap_tolerance": "Maksimalt antall påfølgende intervaller som kan 'jevnes ut' hvis de avviker fra omkringliggende prisnivåer. Små isolerte nivåendringer slås sammen med den dominerende nabogruppen. Eksempel: 1 betyr at et enkelt 'normal'-intervall omgitt av 'billig'-intervaller korrigeres til 'billig'. Sett til 0 for å deaktivere. Standard: 1"
|
||||
},
|
||||
"submit": "↩ Lagre & tilbake"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
|
|
@ -395,11 +395,11 @@
|
|||
"cannot_connect": "Kunne ikke koble til",
|
||||
"invalid_access_token": "Ugyldig tilgangstoken",
|
||||
"different_home": "Tilgangstokenet er ikke gyldig for hjem-ID-en denne integrasjonen er konfigurert for.",
|
||||
"invalid_period_length": "Periodelengden må være minst 15 minutter (multipler av 15).",
|
||||
"invalid_flex": "Fleksibilitetsprosent må være mellom -50% og +50%",
|
||||
"invalid_best_price_distance": "Avstandsprosent må være mellom -50% og 0% (negativ = under gjennomsnitt)",
|
||||
"invalid_peak_price_distance": "Avstandsprosent må være mellom 0% og 50% (positiv = over gjennomsnitt)",
|
||||
"invalid_min_periods": "Minimumsantall perioder må være mellom 1 og 10",
|
||||
"invalid_period_length": "Periodelengden må være minst 15 minutter (multipler av 15).",
|
||||
"invalid_gap_count": "Gaptoleranse må være mellom 0 og 8",
|
||||
"invalid_relaxation_attempts": "Lempingsforsøk må være mellom 1 og 12",
|
||||
"invalid_price_rating_low": "Lav prisvurderingsgrense må være mellom -50% og -5%",
|
||||
|
|
@ -1389,6 +1389,14 @@
|
|||
"name": "Nivåtype",
|
||||
"description": "Velg hvilken prisnivåklassifisering som skal visualiseres: 'rating_level' (lav/normal/høy basert på dine konfigurerte terskelverdier) eller 'level' (Tibber API-nivåer: veldig billig/billig/normal/dyr/veldig dyr)."
|
||||
},
|
||||
"resolution": {
|
||||
"name": "Oppløsning",
|
||||
"description": "Tidsoppløsning for diagramdata. 'interval' (standard): Opprinnelige 15-minutters intervaller (96 punkter per dag). 'hourly': Aggregerte timeverdier med et rullende 60-minutters vindu (24 punkter per dag) for et ryddigere og mindre rotete diagram."
|
||||
},
|
||||
"price_source": {
|
||||
"name": "Priskilde",
|
||||
"description": "Hvilken priskomponent som skal brukes som hovedpris. 'total' (standard): Totalpris inkl. energi, skatter og avgifter. 'energy': Kun rå spot-/energipris (uten skatter og avgifter). 'tax': Kun skatter og avgifter."
|
||||
},
|
||||
"highlight_best_price": {
|
||||
"name": "Fremhev beste prisperioder",
|
||||
"description": "Legg til et halvgjennomsiktig grønt overlegg for å fremheve de beste prisperiodene i diagrammet. Dette gjør det enkelt å visuelt identifisere de optimale tidene for energiforbruk."
|
||||
|
|
@ -1396,10 +1404,6 @@
|
|||
"highlight_peak_price": {
|
||||
"name": "Fremhev høyeste prisperioder",
|
||||
"description": "Legg til et halvgjennomsiktig rødt overlegg for å fremheve de høyeste prisperiodene i diagrammet. Dette gjør det enkelt å visuelt identifisere tidene når energi er dyrest."
|
||||
},
|
||||
"resolution": {
|
||||
"name": "Oppløsning",
|
||||
"description": "Tidsoppløsning for diagramdata. 'interval' (standard): Opprinnelige 15-minutters intervaller (96 punkter per dag). 'hourly': Aggregerte timeverdier med et rullende 60-minutters vindu (24 punkter per dag) for et ryddigere og mindre rotete diagram."
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -1449,6 +1453,10 @@
|
|||
"name": "Oppløsning",
|
||||
"description": "Tidsoppløsning for de returnerte dataene. Alternativer: 'interval' (standard, 15-minutters intervaller, 96 datapunkter per dag), 'hourly' (timegjennomsnitt, 24 datapunkter per dag)."
|
||||
},
|
||||
"price_source": {
|
||||
"name": "Priskilde",
|
||||
"description": "Hvilken priskomponent som skal brukes som hovedpris. 'total' (standard): Totalpris inkl. energi, skatter og avgifter. 'energy': Kun rå spot-/energipris (uten skatter og avgifter). 'tax': Kun skatter og avgifter."
|
||||
},
|
||||
"output_format": {
|
||||
"name": "Utdataformat",
|
||||
"description": "Utdataformat for de returnerte dataene. Alternativer: 'array_of_objects' (standard, array av objekter med tilpassbare feltnavn), 'array_of_arrays' (array av [tidsstempel, pris]-arrays med avsluttende null-punkt for stepline-diagrammer)."
|
||||
|
|
@ -1465,6 +1473,10 @@
|
|||
"name": "Rund desimaler",
|
||||
"description": "Antall desimalplasser å runde priser til (0-10). Hvis ikke angitt, brukes standard presisjon (4 desimaler for basisvaluta, 2 for underenhet valuta)."
|
||||
},
|
||||
"data_key": {
|
||||
"name": "Datanøkkel",
|
||||
"description": "Tilpasset navn for datanøkkelen på toppnivå i svaret. Standard er 'data' hvis ikke angitt."
|
||||
},
|
||||
"include_level": {
|
||||
"name": "Inkluder prisnivå",
|
||||
"description": "Inkluder Tibber-prisnivåfeltet (veldig billig/billig/normal/dyr/veldig dyr) i hvert datapunkt."
|
||||
|
|
@ -1544,10 +1556,6 @@
|
|||
"metadata": {
|
||||
"name": "Metadata",
|
||||
"description": "Kontroller metadata-inkludering i svaret. 'include' (standard): Returnerer både diagramdata og metadata med prisstatistikk, valutainformasjon, Y-akse forslag og tidsperiode. 'only': Returnerer bare metadata uten å behandle diagramdata (raskt, nyttig for dynamisk Y-akse konfigurasjon). 'none': Returnerer bare diagramdata uten metadata."
|
||||
},
|
||||
"data_key": {
|
||||
"name": "Datanøkkel",
|
||||
"description": "Tilpasset navn for datanøkkelen på toppnivå i svaret. Standard er 'data' hvis ikke angitt."
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -2364,6 +2372,16 @@
|
|||
"description": "Limit how many separate charging segments may be used per day. The planner keeps the cheapest segments within this limit."
|
||||
}
|
||||
}
|
||||
},
|
||||
"debug_clear_tomorrow": {
|
||||
"name": "Debug: Tøm morgendata",
|
||||
"description": "DEBUG/TESTING: Fjerner morgendagens prisdata fra interval pool-cachen. Bruk dette for å teste oppdateringssyklusen for morgendata uten å vente til neste dag. Etter at denne tjenesten er kalt, vil lifecycle-sensoren vise 'searching_tomorrow' (etter kl. 13:00), og neste Timer #1-syklus vil hente nye data fra API-et.",
|
||||
"fields": {
|
||||
"entry_id": {
|
||||
"name": "Oppførings-ID",
|
||||
"description": "Valgfri konfigurasjonsoppførings-ID. Hvis den ikke er angitt, brukes den første tilgjengelige oppføringen."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"selector": {
|
||||
|
|
@ -2428,6 +2446,13 @@
|
|||
"peak_price": "Topp prisperioder"
|
||||
}
|
||||
},
|
||||
"price_source": {
|
||||
"options": {
|
||||
"total": "Totalt (inkl. skatter og avgifter)",
|
||||
"energy": "Kun energipris",
|
||||
"tax": "Kun skatter og avgifter"
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"options": {
|
||||
"include": "Inkluder (data + metadata)",
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
"data": {
|
||||
"home_id": "Huis"
|
||||
},
|
||||
"title": "Kies een Huis",
|
||||
"title": "Kies een huis",
|
||||
"submit": "Huis selecteren"
|
||||
},
|
||||
"finish": {
|
||||
|
|
@ -195,6 +195,17 @@
|
|||
},
|
||||
"submit": "↩ Opslaan & Terug"
|
||||
},
|
||||
"price_level": {
|
||||
"title": "🏷️ Prijsniveau-instellingen",
|
||||
"description": "**Configureer stabilisatie voor Tibbers prijsniveau-classificatie (zeer goedkoop/goedkoop/normaal/duur/zeer duur).**\n\nTibbers API levert een prijsniveau-veld voor elk interval. Deze instelling egaliseer korte fluctuaties om instabiliteit in automatiseringen te voorkomen.{entity_warning}",
|
||||
"data": {
|
||||
"price_level_gap_tolerance": "Gap-tolerantie"
|
||||
},
|
||||
"data_description": {
|
||||
"price_level_gap_tolerance": "Maximaal aantal opeenvolgende intervallen dat 'afgevlakt' kan worden als ze afwijken van omringende prijsniveaus. Kleine geïsoleerde niveauwijzigingen worden samengevoegd met het dominante aangrenzende blok. Voorbeeld: 1 betekent dat een enkel 'normaal'-interval omringd door 'goedkoop'-intervallen wordt gecorrigeerd naar 'goedkoop'. Stel in op 0 om uit te schakelen. Standaard: 1"
|
||||
},
|
||||
"submit": "↩ Opslaan & terug"
|
||||
},
|
||||
"best_price": {
|
||||
"title": "💚 Beste Prijs Periode Instellingen",
|
||||
"description": "**Configureer instellingen voor de Beste Prijs Periode binaire sensor. Deze sensor is actief tijdens periodes met de laagste elektriciteitsprijzen.**{entity_warning}{override_warning}\n\n---",
|
||||
|
|
@ -375,17 +386,6 @@
|
|||
"confirm_reset": "Ja, reset alles naar standaardwaarden"
|
||||
},
|
||||
"submit": "Nu Resetten"
|
||||
},
|
||||
"price_level": {
|
||||
"title": "🏷️ Prijsniveau-instellingen",
|
||||
"description": "**Configureer stabilisatie voor Tibbers prijsniveau-classificatie (zeer goedkoop/goedkoop/normaal/duur/zeer duur).**\n\nTibbers API levert een prijsniveau-veld voor elk interval. Deze instelling egaliseer korte fluctuaties om instabiliteit in automatiseringen te voorkomen.{entity_warning}",
|
||||
"data": {
|
||||
"price_level_gap_tolerance": "Gap-tolerantie"
|
||||
},
|
||||
"data_description": {
|
||||
"price_level_gap_tolerance": "Maximaal aantal opeenvolgende intervallen dat 'afgevlakt' kan worden als ze afwijken van omringende prijsniveaus. Kleine geïsoleerde niveauwijzigingen worden samengevoegd met het dominante aangrenzende blok. Voorbeeld: 1 betekent dat een enkel 'normaal'-interval omringd door 'goedkoop'-intervallen wordt gecorrigeerd naar 'goedkoop'. Stel in op 0 om uit te schakelen. Standaard: 1"
|
||||
},
|
||||
"submit": "↩ Opslaan & terug"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
|
|
@ -1389,17 +1389,21 @@
|
|||
"name": "Niveautype",
|
||||
"description": "Selecteer welke prijsniveauclassificatie gevisualiseerd moet worden: 'rating_level' (laag/normaal/hoog op basis van jouw geconfigureerde drempelwaarden) of 'level' (Tibber API-niveaus: zeer goedkoop/goedkoop/normaal/duur/zeer duur)."
|
||||
},
|
||||
"resolution": {
|
||||
"name": "Resolutie",
|
||||
"description": "Tijdresolutie voor de grafiekdata. 'interval' (standaard): Originele 15-minutenintervallen (96 punten per dag). 'hourly': Geaggregeerde uurwaarden met een rollend 60-minutenvenster (24 punten per dag) voor een overzichtelijkere grafiek."
|
||||
},
|
||||
"price_source": {
|
||||
"name": "Prijsbron",
|
||||
"description": "Welke prijscomponent als hoofdprijs gebruikt wordt. 'total' (standaard): Totaalprijs incl. energie, belastingen en kosten. 'energy': Alleen de ruwe spot-/energieprijs (exclusief belastingen en kosten). 'tax': Alleen belastingen en kosten."
|
||||
},
|
||||
"highlight_best_price": {
|
||||
"name": "Beste prijsperiodes markeren",
|
||||
"description": "Voeg een halfdo0rzichtige groene overlay toe om de beste prijsperiodes in de grafiek te markeren. Dit maakt het gemakkelijk om visueel de optimale tijden voor energieverbruik te identificeren."
|
||||
"description": "Voeg een halfdoorzichtige groene overlay toe om de beste prijsperiodes in de grafiek te markeren. Dit maakt het gemakkelijk om visueel de optimale tijden voor energieverbruik te identificeren."
|
||||
},
|
||||
"highlight_peak_price": {
|
||||
"name": "Piekprijsperiodes markeren",
|
||||
"description": "Voeg een halfdoorzichtige rode overlay toe om de piekprijsperiodes in de grafiek te markeren. Dit maakt het gemakkelijk om visueel de tijden te identificeren wanneer energie het duurst is."
|
||||
},
|
||||
"resolution": {
|
||||
"name": "Resolutie",
|
||||
"description": "Tijdresolutie voor de grafiekdata. 'interval' (standaard): Originele 15-minutenintervallen (96 punten per dag). 'hourly': Geaggregeerde uurwaarden met een rollend 60-minutenvenster (24 punten per dag) voor een overzichtelijkere grafiek."
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -1449,6 +1453,10 @@
|
|||
"name": "Resolutie",
|
||||
"description": "Tijdsresolutie voor de geretourneerde gegevens. Opties: 'interval' (standaard, 15-minuten intervallen, 96 datapunten per dag), 'hourly' (uurgemiddelden, 24 datapunten per dag)."
|
||||
},
|
||||
"price_source": {
|
||||
"name": "Prijsbron",
|
||||
"description": "Welke prijscomponent als hoofdprijs gebruikt wordt. 'total' (standaard): Totaalprijs incl. energie, belastingen en kosten. 'energy': Alleen de ruwe spot-/energieprijs (exclusief belastingen en kosten). 'tax': Alleen belastingen en kosten."
|
||||
},
|
||||
"output_format": {
|
||||
"name": "Uitvoerformaat",
|
||||
"description": "Uitvoerformaat voor de geretourneerde gegevens. Opties: 'array_of_objects' (standaard, array van objecten met aanpasbare veldnamen), 'array_of_arrays' (array van [tijdstempel, prijs]-arrays met afsluitend null-punt voor stepline-grafieken)."
|
||||
|
|
@ -1465,6 +1473,10 @@
|
|||
"name": "Decimalen afronden",
|
||||
"description": "Aantal decimalen om prijzen op af te ronden (0-10). Indien niet opgegeven, wordt de standaardprecisie gebruikt (4 decimalen voor basisvaluta, 2 voor subeenheid valuta)."
|
||||
},
|
||||
"data_key": {
|
||||
"name": "Gegevenssleutel",
|
||||
"description": "Aangepaste naam voor de gegevenssleutel op het hoogste niveau in het antwoord. Standaard is 'data' als niet opgegeven."
|
||||
},
|
||||
"include_level": {
|
||||
"name": "Prijsniveau opnemen",
|
||||
"description": "Voeg het Tibber-prijsniveauveld (zeer goedkoop/goedkoop/normaal/duur/zeer duur) toe aan elk gegevenspunt."
|
||||
|
|
@ -1544,10 +1556,6 @@
|
|||
"metadata": {
|
||||
"name": "Metadata",
|
||||
"description": "Beheer metadata-opname in het antwoord. 'include' (standaard): Retourneert zowel grafiekdata als metadata met prijsstatistieken, valuta-info, Y-as suggesties en tijdsbereik. 'only': Retourneert alleen metadata zonder grafiekdata te verwerken (snel, handig voor dynamische Y-as configuratie). 'none': Retourneert alleen grafiekdata zonder metadata."
|
||||
},
|
||||
"data_key": {
|
||||
"name": "Gegevenssleutel",
|
||||
"description": "Aangepaste naam voor de gegevenssleutel op het hoogste niveau in het antwoord. Standaard is 'data' als niet opgegeven."
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -2364,6 +2372,16 @@
|
|||
"description": "Limit how many separate charging segments may be used per day. The planner keeps the cheapest segments within this limit."
|
||||
}
|
||||
}
|
||||
},
|
||||
"debug_clear_tomorrow": {
|
||||
"name": "Debug: Morgengegevens wissen",
|
||||
"description": "DEBUG/TESTEN: Verwijdert de prijsgegevens voor morgen uit de interval-poolcache. Gebruik dit om de vernieuwingscyclus voor morgengegevens te testen zonder op de volgende dag te wachten. Na het aanroepen van deze service toont de lifecycle-sensor 'searching_tomorrow' (na 13:00) en haalt de volgende Timer #1-cyclus nieuwe gegevens op via de API.",
|
||||
"fields": {
|
||||
"entry_id": {
|
||||
"name": "Item-ID",
|
||||
"description": "Optionele config-item-ID. Als die niet is opgegeven, wordt het eerste beschikbare item gebruikt."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"selector": {
|
||||
|
|
@ -2428,6 +2446,13 @@
|
|||
"peak_price": "Piekprijs Periodes"
|
||||
}
|
||||
},
|
||||
"price_source": {
|
||||
"options": {
|
||||
"total": "Totaal (incl. belastingen & kosten)",
|
||||
"energy": "Alleen energieprijs",
|
||||
"tax": "Alleen belastingen & kosten"
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"options": {
|
||||
"include": "Inbegrepen (data + metadata)",
|
||||
|
|
|
|||
|
|
@ -195,6 +195,17 @@
|
|||
},
|
||||
"submit": "↩ Spara & tillbaka"
|
||||
},
|
||||
"price_level": {
|
||||
"title": "🏷️ Prisnivå-inställningar",
|
||||
"description": "**Konfigurera stabilisering för Tibbers prisnivå-klassificering (mycket billig/billig/normal/dyr/mycket dyr).**\n\nTibbers API tillhandahåller ett prisnivå-fält för varje intervall. Denna inställning jämnar ut korta fluktuationer för att förhindra instabilitet i automatiseringar.{entity_warning}",
|
||||
"data": {
|
||||
"price_level_gap_tolerance": "Gap-tolerans"
|
||||
},
|
||||
"data_description": {
|
||||
"price_level_gap_tolerance": "Maximalt antal på varandra följande intervaller som kan 'jämnas ut' om de avviker från omgivande prisnivåer. Små isolerade nivåförändringar sammanfogas med det dominerande grannblocket. Exempel: 1 betyder att ett enstaka 'normal'-intervall omgivet av 'billig'-intervaller korrigeras till 'billig'. Sätt till 0 för att inaktivera. Standard: 1"
|
||||
},
|
||||
"submit": "↩ Spara & tillbaka"
|
||||
},
|
||||
"best_price": {
|
||||
"title": "💚 Bästa Prisperiod-inställningar",
|
||||
"description": "**Konfigurera inställningar för binärsensorn Bästa Prisperiod. Denna sensor är aktiv under perioder med lägsta elpriserna.**{entity_warning}{override_warning}\n\n---",
|
||||
|
|
@ -375,17 +386,6 @@
|
|||
"confirm_reset": "Ja, återställ allt till standard"
|
||||
},
|
||||
"submit": "Återställ nu"
|
||||
},
|
||||
"price_level": {
|
||||
"title": "🏷️ Prisnivå-inställningar",
|
||||
"description": "**Konfigurera stabilisering för Tibbers prisnivå-klassificering (mycket billig/billig/normal/dyr/mycket dyr).**\n\nTibbers API tillhandahåller ett prisnivå-fält för varje intervall. Denna inställning jämnar ut korta fluktuationer för att förhindra instabilitet i automatiseringar.{entity_warning}",
|
||||
"data": {
|
||||
"price_level_gap_tolerance": "Gap-tolerans"
|
||||
},
|
||||
"data_description": {
|
||||
"price_level_gap_tolerance": "Maximalt antal på varandra följande intervaller som kan 'jämnas ut' om de avviker från omgivande prisnivåer. Små isolerade nivåförändringar sammanfogas med det dominerande grannblocket. Exempel: 1 betyder att ett enstaka 'normal'-intervall omgivet av 'billig'-intervaller korrigeras till 'billig'. Sätt till 0 för att inaktivera. Standard: 1"
|
||||
},
|
||||
"submit": "↩ Spara & tillbaka"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
|
|
@ -1389,6 +1389,14 @@
|
|||
"name": "Nivåtyp",
|
||||
"description": "Välj vilken prisnivåklassificering som ska visualiseras: 'rating_level' (låg/normal/hög baserat på dina konfigurerade tröskelvärden) eller 'level' (Tibber API-nivåer: mycket billigt/billigt/normalt/dyrt/mycket dyrt)."
|
||||
},
|
||||
"resolution": {
|
||||
"name": "Upplösning",
|
||||
"description": "Tidsupplösning för diagramdata. 'interval' (standard): Ursprungliga 15-minutersintervall (96 punkter per dag). 'hourly': Aggregerade timvärden med ett rullande 60-minutersfönster (24 punkter per dag) för ett renare och mindre rörigt diagram."
|
||||
},
|
||||
"price_source": {
|
||||
"name": "Priskälla",
|
||||
"description": "Vilken priskomponent som används som huvudpris. 'total' (standard): Totalpris inkl. energi, skatter och avgifter. 'energy': Enbart rå spot-/energipris (exkl. skatter och avgifter). 'tax': Enbart skatter och avgifter."
|
||||
},
|
||||
"highlight_best_price": {
|
||||
"name": "Markera bästa prisperioder",
|
||||
"description": "Lägg till ett halvtransparent grönt överlag för att markera de bästa prisperioderna i diagrammet. Detta gör det enkelt att visuellt identifiera de optimala tiderna för energiförbrukning."
|
||||
|
|
@ -1396,10 +1404,6 @@
|
|||
"highlight_peak_price": {
|
||||
"name": "Markera högsta prisperioder",
|
||||
"description": "Lägg till ett halvtransparent rött överlag för att markera de högsta prisperioderna i diagrammet. Detta gör det enkelt att visuellt identifiera tiderna när energi är som dyrast."
|
||||
},
|
||||
"resolution": {
|
||||
"name": "Upplösning",
|
||||
"description": "Tidsupplösning för diagramdata. 'interval' (standard): Ursprungliga 15-minutersintervall (96 punkter per dag). 'hourly': Aggregerade timvärden med ett rullande 60-minutersfönster (24 punkter per dag) för ett renare och mindre rörigt diagram."
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -1449,6 +1453,10 @@
|
|||
"name": "Upplösning",
|
||||
"description": "Tidsupplösning för returnerad data. Alternativ: 'interval' (standard, 15-minutersintervall, 96 punkter per dag), 'hourly' (timmedelvärden, 24 punkter per dag)."
|
||||
},
|
||||
"price_source": {
|
||||
"name": "Priskälla",
|
||||
"description": "Vilken priskomponent som används som huvudpris. 'total' (standard): Totalpris inkl. energi, skatter och avgifter. 'energy': Enbart rå spot-/energipris (exkl. skatter och avgifter). 'tax': Enbart skatter och avgifter."
|
||||
},
|
||||
"output_format": {
|
||||
"name": "Utdataformat",
|
||||
"description": "Utdataformat för returnerad data. Alternativ: 'array_of_objects' (standard, array av objekt med anpassningsbara fältnamn), 'array_of_arrays' (array av [tidstämpel, pris]-arrays med avslutande null-punkt för stegdiagram)."
|
||||
|
|
@ -2364,6 +2372,16 @@
|
|||
"description": "Limit how many separate charging segments may be used per day. The planner keeps the cheapest segments within this limit."
|
||||
}
|
||||
}
|
||||
},
|
||||
"debug_clear_tomorrow": {
|
||||
"name": "Debug: Rensa morgondagens data",
|
||||
"description": "DEBUG/TEST: Tar bort morgondagens prisdata från interval pool-cachen. Använd detta för att testa uppdateringscykeln för morgondagens data utan att vänta till nästa dag. Efter att tjänsten har anropats visar livscykelsensorn 'searching_tomorrow' (efter 13:00) och nästa Timer #1-cykel hämtar nya data från API:et.",
|
||||
"fields": {
|
||||
"entry_id": {
|
||||
"name": "Entry-ID",
|
||||
"description": "Valfritt config entry-ID. Om det inte anges används den första tillgängliga posten."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"selector": {
|
||||
|
|
@ -2428,6 +2446,13 @@
|
|||
"peak_price": "Topprisperioder"
|
||||
}
|
||||
},
|
||||
"price_source": {
|
||||
"options": {
|
||||
"total": "Totalt (inkl. skatter & avgifter)",
|
||||
"energy": "Enbart energipris",
|
||||
"tax": "Enbart skatter & avgifter"
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"options": {
|
||||
"include": "Inkludera (data + metadata)",
|
||||
|
|
|
|||
Loading…
Reference in a new issue