mirror of
https://github.com/jpawlowski/hass.tibber_prices.git
synced 2026-03-30 05:13:40 +00:00
refactor(services): remove gradient_stop, use fixed 50% gradient
Implementation flaw discovered: gradient_stop calculated as `(avg - min) / (max - min)` for combined data produces one value applied to ALL series. Each series (VERY_CHEAP, NORMAL, VERY_EXPENSIVE) has different min/max ranges, so the same gradient stop position represents a different absolute price in each series. Example failure case: - VERY_CHEAP: 10-20 ct → 50% at 15 ct (below overall avg!) - VERY_EXPENSIVE: 40-50 ct → 50% at 45 ct (above overall avg!) Conclusion: Gradient shows middle of each series range, not average price position. Solution: Fixed 50% gradient purely for visual appeal. Semantic information provided by: - Series colors (CHEAP/NORMAL/EXPENSIVE) - Grid lines (implicitly show average) - Dynamic Y-axis bounds (optimal scaling via chart_metadata sensor) Changes: - sensor/chart_metadata.py: Remove gradient_stop extraction - services/get_apexcharts_yaml.py: Fixed gradient at [50, 100] - custom_translations/*.json: Remove gradient_stop references Impact: Honest visualization with no false semantic signals. Feature was never released, clean removal without migration.
This commit is contained in:
parent
6922e52368
commit
f92fc3b444
7 changed files with 16 additions and 29 deletions
|
|
@ -451,8 +451,8 @@
|
|||
},
|
||||
"chart_metadata": {
|
||||
"description": "Leichtgewichtige Metadaten für Diagrammkonfiguration",
|
||||
"long_description": "Liefert wesentliche Diagrammkonfigurationswerte als Sensor-Attribute. Nützlich für jede Diagrammkarte, die Y-Achsen-Grenzen oder Gradientenpositionierung benötigt. Der Sensor ruft get_chartdata im Nur-Metadaten-Modus auf (keine Datenverarbeitung) und extrahiert: yaxis_min, yaxis_max (vorgeschlagener Y-Achsenbereich) und gradient_stop (durchschnittliche Preisposition 0-100%). Der Status spiegelt das Service-Call-Ergebnis wider: 'ready' bei Erfolg, 'error' bei Fehler, 'pending' während der Initialisierung.",
|
||||
"usage_tips": "Konfiguriere über configuration.yaml unter tibber_prices.chart_metadata_config (optional: day, minor_currency, resolution). Der Sensor aktualisiert sich automatisch bei Preisdatenänderungen. Greife auf Metadaten aus Attributen zu: yaxis_min, yaxis_max, gradient_stop. Verwende mit config-template-card oder jedem Tool, das Entity-Attribute liest - perfekt für dynamische Diagrammkonfiguration ohne manuelle Berechnungen."
|
||||
"long_description": "Liefert wesentliche Diagrammkonfigurationswerte als Sensor-Attribute. Nützlich für jede Diagrammkarte, die Y-Achsen-Grenzen benötigt. Der Sensor ruft get_chartdata im Nur-Metadaten-Modus auf (keine Datenverarbeitung) und extrahiert: yaxis_min, yaxis_max (vorgeschlagener Y-Achsenbereich für optimale Skalierung). Der Status spiegelt das Service-Call-Ergebnis wider: 'ready' bei Erfolg, 'error' bei Fehler, 'pending' während der Initialisierung.",
|
||||
"usage_tips": "Konfiguriere über configuration.yaml unter tibber_prices.chart_metadata_config (optional: day, minor_currency, resolution). Der Sensor aktualisiert sich automatisch bei Preisdatenänderungen. Greife auf Metadaten aus Attributen zu: yaxis_min, yaxis_max. Verwende mit config-template-card oder jedem Tool, das Entity-Attribute liest - perfekt für dynamische Diagrammkonfiguration ohne manuelle Berechnungen."
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
|
|
|
|||
|
|
@ -483,8 +483,8 @@
|
|||
},
|
||||
"chart_metadata": {
|
||||
"description": "Lightweight metadata for chart configuration",
|
||||
"long_description": "Provides essential chart configuration values as sensor attributes. Useful for any chart card that needs Y-axis bounds or gradient positioning. The sensor calls get_chartdata with metadata-only mode (no data processing) and extracts: yaxis_min, yaxis_max (suggested Y-axis range), and gradient_stop (average price position 0-100%). The state reflects the service call result: 'ready' when successful, 'error' on failure, 'pending' during initialization.",
|
||||
"usage_tips": "Configure via configuration.yaml under tibber_prices.chart_metadata_config (optional: day, minor_currency, resolution). The sensor automatically refreshes when price data updates. Access metadata from attributes: yaxis_min, yaxis_max, gradient_stop. Use with config-template-card or any tool that reads entity attributes - perfect for dynamic chart configuration without manual calculations."
|
||||
"long_description": "Provides essential chart configuration values as sensor attributes. Useful for any chart card that needs Y-axis bounds. The sensor calls get_chartdata with metadata-only mode (no data processing) and extracts: yaxis_min, yaxis_max (suggested Y-axis range for optimal scaling). The state reflects the service call result: 'ready' when successful, 'error' on failure, 'pending' during initialization.",
|
||||
"usage_tips": "Configure via configuration.yaml under tibber_prices.chart_metadata_config (optional: day, minor_currency, resolution). The sensor automatically refreshes when price data updates. Access metadata from attributes: yaxis_min, yaxis_max. Use with config-template-card or any tool that reads entity attributes - perfect for dynamic chart configuration without manual calculations."
|
||||
}
|
||||
},
|
||||
"home_types": {
|
||||
|
|
|
|||
|
|
@ -451,8 +451,8 @@
|
|||
},
|
||||
"chart_metadata": {
|
||||
"description": "Lettvekts metadata for diagramkonfigurasjon",
|
||||
"long_description": "Gir essensielle diagramkonfigurasjonsverdier som sensorattributter. Nyttig for ethvert diagramkort som trenger Y-aksegrenser eller gradientposisjonering. Sensoren kaller get_chartdata med kun-metadata-modus (ingen databehandling) og trekker ut: yaxis_min, yaxis_max (foreslått Y-akseområde) og gradient_stop (gjennomsnittlig prisposisjon 0-100%). Status reflekterer tjenestekallresultatet: 'ready' ved suksess, 'error' ved feil, 'pending' under initialisering.",
|
||||
"usage_tips": "Konfigurer via configuration.yaml under tibber_prices.chart_metadata_config (valgfritt: day, minor_currency, resolution). Sensoren oppdateres automatisk når prisdata endres. Få tilgang til metadata fra attributter: yaxis_min, yaxis_max, gradient_stop. Bruk med config-template-card eller ethvert verktøy som leser entitetsattributter - perfekt for dynamisk diagramkonfigurasjon uten manuelle beregninger."
|
||||
"long_description": "Gir essensielle diagramkonfigurasjonsverdier som sensorattributter. Nyttig for ethvert diagramkort som trenger Y-aksegrenser. Sensoren kaller get_chartdata med kun-metadata-modus (ingen databehandling) og trekker ut: yaxis_min, yaxis_max (foreslått Y-akseområde for optimal skalering). Status reflekterer tjenestekallresultatet: 'ready' ved suksess, 'error' ved feil, 'pending' under initialisering.",
|
||||
"usage_tips": "Konfigurer via configuration.yaml under tibber_prices.chart_metadata_config (valgfritt: day, minor_currency, resolution). Sensoren oppdateres automatisk når prisdata endres. Få tilgang til metadata fra attributter: yaxis_min, yaxis_max. Bruk med config-template-card eller ethvert verktøy som leser entitetsattributter - perfekt for dynamisk diagramkonfigurasjon uten manuelle beregninger."
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
|
|
|
|||
|
|
@ -451,8 +451,8 @@
|
|||
},
|
||||
"chart_metadata": {
|
||||
"description": "Lichtgewicht metadata voor diagramconfiguratie",
|
||||
"long_description": "Biedt essentiële diagramconfiguratiewaarden als sensorattributen. Nuttig voor elke grafiekkaart die Y-as-grenzen of gradiëntpositionering nodig heeft. De sensor roept get_chartdata aan in alleen-metadata-modus (geen dataverwerking) en extraheert: yaxis_min, yaxis_max (gesuggereerd Y-asbereik) en gradient_stop (gemiddelde prijspositie 0-100%). De status weerspiegelt het service-aanroepresultaat: 'ready' bij succes, 'error' bij fouten, 'pending' tijdens initialisatie.",
|
||||
"usage_tips": "Configureer via configuration.yaml onder tibber_prices.chart_metadata_config (optioneel: day, minor_currency, resolution). De sensor wordt automatisch bijgewerkt bij prijsgegevenswijzigingen. Krijg toegang tot metadata vanuit attributen: yaxis_min, yaxis_max, gradient_stop. Gebruik met config-template-card of elk hulpmiddel dat entiteitsattributen leest - perfect voor dynamische diagramconfiguratie zonder handmatige berekeningen."
|
||||
"long_description": "Biedt essentiële diagramconfiguratiewaarden als sensorattributen. Nuttig voor elke grafiekkaart die Y-as-grenzen nodig heeft. De sensor roept get_chartdata aan in alleen-metadata-modus (geen dataverwerking) en extraheert: yaxis_min, yaxis_max (gesuggereerd Y-asbereik voor optimale schaling). De status weerspiegelt het service-aanroepresultaat: 'ready' bij succes, 'error' bij fouten, 'pending' tijdens initialisatie.",
|
||||
"usage_tips": "Configureer via configuration.yaml onder tibber_prices.chart_metadata_config (optioneel: day, minor_currency, resolution). De sensor wordt automatisch bijgewerkt bij prijsgegevenswijzigingen. Krijg toegang tot metadata vanuit attributen: yaxis_min, yaxis_max. Gebruik met config-template-card of elk hulpmiddel dat entiteitsattributen leest - perfect voor dynamische diagramconfiguratie zonder handmatige berekeningen."
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
|
|
|
|||
|
|
@ -451,8 +451,8 @@
|
|||
},
|
||||
"chart_metadata": {
|
||||
"description": "Lättviktig metadata för diagramkonfiguration",
|
||||
"long_description": "Tillhandahåller väsentliga diagramkonfigurationsvärden som sensorattribut. Användbart för vilket diagramkort som helst som behöver Y-axelgränser eller gradientpositionering. Sensorn anropar get_chartdata med endast-metadata-läge (ingen databehandling) och extraherar: yaxis_min, yaxis_max (föreslagen Y-axelomfång) och gradient_stop (genomsnittlig prisposition 0-100%). Statusen återspeglar tjänstanropsresultatet: 'ready' vid framgång, 'error' vid fel, 'pending' under initialisering.",
|
||||
"usage_tips": "Konfigurera via configuration.yaml under tibber_prices.chart_metadata_config (valfritt: day, minor_currency, resolution). Sensorn uppdateras automatiskt vid pris dataändringar. Få tillgång till metadata från attribut: yaxis_min, yaxis_max, gradient_stop. Använd med config-template-card eller vilket verktyg som helst som läser entitetsattribut - perfekt för dynamisk diagramkonfiguration utan manuella beräkningar."
|
||||
"long_description": "Tillhandahåller väsentliga diagramkonfigurationsvärden som sensorattribut. Användbart för vilket diagramkort som helst som behöver Y-axelgränser. Sensorn anropar get_chartdata med endast-metadata-läge (ingen databehandling) och extraherar: yaxis_min, yaxis_max (föreslagen Y-axelomfång för optimal skalning). Statusen återspeglar tjänstanropsresultatet: 'ready' vid framgång, 'error' vid fel, 'pending' under initialisering.",
|
||||
"usage_tips": "Konfigurera via configuration.yaml under tibber_prices.chart_metadata_config (valfritt: day, minor_currency, resolution). Sensorn uppdateras automatiskt vid pris dataändringar. Få tillgång till metadata från attribut: yaxis_min, yaxis_max. Använd med config-template-card eller vilket verktyg som helst som läser entitetsattribut - perfekt för dynamisk diagramkonfiguration utan manuella beräkningar."
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
|
|
|
|||
|
|
@ -124,8 +124,6 @@ def build_chart_metadata_attributes(
|
|||
# These are the universal chart metadata fields useful for any chart card
|
||||
if metadata:
|
||||
yaxis_suggested = metadata.get("yaxis_suggested", {})
|
||||
price_stats = metadata.get("price_stats", {})
|
||||
combined_stats = price_stats.get("combined", {})
|
||||
|
||||
# Add yaxis bounds (useful for all chart cards)
|
||||
if "min" in yaxis_suggested:
|
||||
|
|
@ -133,11 +131,6 @@ def build_chart_metadata_attributes(
|
|||
if "max" in yaxis_suggested:
|
||||
attributes["yaxis_max"] = yaxis_suggested["max"]
|
||||
|
||||
# Add gradient stop position (useful for gradient-based charts)
|
||||
if "avg_position" in combined_stats:
|
||||
avg_position = combined_stats["avg_position"]
|
||||
attributes["gradient_stop"] = round(avg_position * 100)
|
||||
|
||||
# Add currency info (useful for labeling)
|
||||
if "currency" in metadata:
|
||||
attributes["currency"] = metadata["currency"]
|
||||
|
|
|
|||
|
|
@ -662,10 +662,11 @@ async def handle_apexcharts_yaml(call: ServiceCall) -> dict[str, Any]: # noqa:
|
|||
# Sensor not found - will show notification
|
||||
metadata_warning = True
|
||||
|
||||
# Fixed gradient stop at 50% (visual appeal, no semantic meaning)
|
||||
gradient_stops = [50, 100]
|
||||
|
||||
# Set fallback values if sensor not used
|
||||
if not use_sensor_metadata:
|
||||
gradient_stop = 50
|
||||
|
||||
# Build yaxis config (only include min/max if not None)
|
||||
yaxis_price_config = {
|
||||
"id": "price",
|
||||
|
|
@ -677,7 +678,6 @@ async def handle_apexcharts_yaml(call: ServiceCall) -> dict[str, Any]: # noqa:
|
|||
},
|
||||
}
|
||||
|
||||
gradient_stops = [gradient_stop, 100]
|
||||
entities_list = trigger_entities
|
||||
else:
|
||||
# Use template variables to read sensor dynamically
|
||||
|
|
@ -697,8 +697,6 @@ async def handle_apexcharts_yaml(call: ServiceCall) -> dict[str, Any]: # noqa:
|
|||
},
|
||||
}
|
||||
|
||||
gradient_stops = ["${v_gradient_stop}", 100]
|
||||
|
||||
# Build variables dict
|
||||
variables_dict = {"v_graph_span": template_graph_span}
|
||||
if use_sensor_metadata:
|
||||
|
|
@ -707,7 +705,6 @@ async def handle_apexcharts_yaml(call: ServiceCall) -> dict[str, Any]: # noqa:
|
|||
{
|
||||
"v_yaxis_min": f"states['{chart_metadata_sensor}'].attributes.yaxis_min",
|
||||
"v_yaxis_max": f"states['{chart_metadata_sensor}'].attributes.yaxis_max",
|
||||
"v_gradient_stop": f"states['{chart_metadata_sensor}'].attributes.gradient_stop",
|
||||
}
|
||||
)
|
||||
|
||||
|
|
@ -828,10 +825,11 @@ async def handle_apexcharts_yaml(call: ServiceCall) -> dict[str, Any]: # noqa:
|
|||
# Sensor not found - will show notification
|
||||
metadata_warning = True
|
||||
|
||||
# Fixed gradient stop at 50% (visual appeal, no semantic meaning)
|
||||
gradient_stops = [50, 100]
|
||||
|
||||
# Set fallback values if sensor not used
|
||||
if not use_sensor_metadata:
|
||||
gradient_stop = 50
|
||||
|
||||
# Build yaxis config (only include min/max if not None)
|
||||
yaxis_price_config = {
|
||||
"id": "price",
|
||||
|
|
@ -843,7 +841,6 @@ async def handle_apexcharts_yaml(call: ServiceCall) -> dict[str, Any]: # noqa:
|
|||
},
|
||||
}
|
||||
|
||||
gradient_stops = [gradient_stop, 100]
|
||||
entities_list = [tomorrow_data_sensor]
|
||||
else:
|
||||
# Use template variables to read sensor dynamically
|
||||
|
|
@ -863,8 +860,6 @@ async def handle_apexcharts_yaml(call: ServiceCall) -> dict[str, Any]: # noqa:
|
|||
},
|
||||
}
|
||||
|
||||
gradient_stops = ["${v_gradient_stop}", 100]
|
||||
|
||||
# Build variables dict
|
||||
variables_dict = {"v_offset": template_value}
|
||||
if use_sensor_metadata:
|
||||
|
|
@ -873,7 +868,6 @@ async def handle_apexcharts_yaml(call: ServiceCall) -> dict[str, Any]: # noqa:
|
|||
{
|
||||
"v_yaxis_min": f"states['{chart_metadata_sensor}'].attributes.yaxis_min",
|
||||
"v_yaxis_max": f"states['{chart_metadata_sensor}'].attributes.yaxis_max",
|
||||
"v_gradient_stop": f"states['{chart_metadata_sensor}'].attributes.gradient_stop",
|
||||
}
|
||||
)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue