/api/import-config verlangte bisher zwingend modbus_ip fuer jedes Geraet in der
importierten Config — der neue GROWATT_WIFI_X-Typ (ha_entity) hat aber keins,
nutzt stattdessen ha_entity_prefix. Import schlug dadurch mit 400 fehl, sobald
so ein Geraet enthalten war. Validierung jetzt protokollabhaengig.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Statt selbst per Modbus/UDP zu pollen, kann ShineBridge jetzt einen Wechselrichter
einbinden, der bereits per ESPHome nativ in Home Assistant läuft — nützlich für
die ShineWifi-X-Variante, die keine eigene Modbus-TCP-Schnittstelle hat.
- Neuer ha_entity_client.py: liest Sensor-Werte über die interne Supervisor-API
(http://supervisor/core/api), braucht dafür 'homeassistant_api: true' in
config.yaml (neu gesetzt — Add-on muss dafür einmal neu installiert werden)
- Neuer Geräte-Typ 'GROWATT_WIFI_X' in inverters.py, protocol='ha_entity'
- Feste Suffix-Zuordnung (dcpower→pv_power, acpower→ac_power, energytoday→
energy_today, ...) passend zur esphome-growatt-Komponente aus
growatt-diagnose-tool/ShineWifi-X — Entity-Id ergibt sich als
sensor.<prefix>_<suffix>
- Neues Feld 'HA Entity-Prefix' im Geräte-Dialog statt Modbus-IP/Port/Adresse,
blendet sich abhängig vom gewählten Gerätetyp ein/aus
- Läuft danach durch dieselbe Aggregations-/Dashboard-Logik wie jedes andere
Gerät (kein Sonderfall in EMS/Finanzen nötig, da Netzbezug bereits über den
bestehenden Zähler erfasst wird — dieser Wechselrichter liefert nur PV-Werte)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Chart-Logik in buildCostChart() ausgelagert, wiederverwendbar für echte und
Beispiel-Daten
- Neu: bei Erstinstallation (noch keine echten Daten) zeigt die Finanzen-Seite
jetzt ein klar als 'BEISPIEL' markiertes, entsättigtes Vorschau-Diagramm mit
frei erfundenen (deterministischen) Werten statt nur eines Texthinweises —
keine echt aussehenden Fantasiezahlen, bewusst gedämpfte Farben + Badge
- Umschaltung Tage→Wochen jetzt an 14 Wochen (98 Tage) Historie geknüpft statt
schon nach 21 Tagen — bis dahin rollierendes Tages-Fenster, danach
rollierendes Wochen-Fenster (älteste Periode wandert raus sobald neue dazukommt)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Statt die SVG per viewBox unbegrenzt mitwachsen zu lassen (wurde am Desktop
riesig) oder sie bei einer festen max-width zu kappen (ließ rechts Leerraum),
wird jetzt die tatsächliche Container-Breite gemessen und in echten Pixeln
gerendert — Höhe bleibt dabei komplett unabhängig fix.
Zusätzlich: auf breiten Screens werden mehr Wochen gezeigt statt derselben
14 Balken künstlich zu verbreitern (Zielbreite ~24px/Periode, min. 10, max.
28 Perioden) — nutzt den zusätzlichen Platz sinnvoll für mehr Historie statt
für aufgeblähte Einzelbalken.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
width:100% ohne max-width lässt die SVG auf breiten Desktop-Bildschirmen
ungebremst mit dem Container mitwachsen (Text/Balken/Höhe proportional riesig).
max-width:640px begrenzt das, bleibt auf Handy weiterhin voll fluid.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Zeigt nur noch die letzten 14 Balken (statt aller Perioden im Abrechnungsjahr)
— genug für einen Trend, ohne dass Labels sich gegenseitig überlappen
- SVG jetzt echt responsiv (viewBox + width:100%, Mobile-first dimensioniert)
statt fester Pixelbreite mit Scrollbalken — passt sich Handy wie Desktop an
- X-Achsen-Labels um -40° gedreht statt horizontal — brauchen dadurch deutlich
weniger Platz pro Balken, alle 14 bleiben lesbar
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-25 14:02:33 +02:00
5 changed files with 272 additions and 105 deletions
<divstyle="font-size:11px;color:var(--muted);margin-top:3px">Ohne "sensor."-Präfix — z.B. bei <code>sensor.growatt_wifi_x_1_dcpower</code> ist der Wert <code>growatt_wifi_x_1</code>. Braucht ein bereits per ESPHome in HA eingebundenes Gerät, keinen direkten Netzwerkzugriff.</div></div>
<div style="font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--text-dim);margin-bottom:14px">Kosten je ${bucketLabel}${rangeNote}</div>
<div style="font-weight:600;margin-bottom:6px;color:var(--text)">Noch keine echten Daten</div>
<div style="font-size:13px">Der Tracker sammelt ab morgen täglich Daten.<br>Abrechnungsjahr ab ${period_start}. Unten siehst du, wie die Ansicht dann aussieht.</div>
</div>
${exampleChart}
</div>`;
return;
}
@@ -796,92 +923,7 @@ async function loadFinance() {
<div style="font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--text-dim);margin-bottom:14px">Kosten je ${bucketLabel}</div>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.