{"id":49203002,"url":"https://github.com/mavnezz/charge44","last_synced_at":"2026-04-23T16:01:00.642Z","repository":{"id":353342451,"uuid":"1218938839","full_name":"mavnezz/charge44","owner":"mavnezz","description":"Home Assistant custom integration: zero-export regulation for Zendure SolarFlow 800 Pro + Shelly 3EM Pro via local MQTT, with Tibber-priced cheap charging and Forecast.Solar smart-skip","archived":false,"fork":false,"pushed_at":"2026-04-23T14:23:10.000Z","size":23,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-23T14:35:07.848Z","etag":null,"topics":["hacs","home-assistant","mqtt","photovoltaic","shelly","solarflow","tibber","zendure","zero-export"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mavnezz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-23T11:16:11.000Z","updated_at":"2026-04-23T14:23:14.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mavnezz/charge44","commit_stats":null,"previous_names":["mavnezz/charge44"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/mavnezz/charge44","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mavnezz%2Fcharge44","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mavnezz%2Fcharge44/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mavnezz%2Fcharge44/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mavnezz%2Fcharge44/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mavnezz","download_url":"https://codeload.github.com/mavnezz/charge44/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mavnezz%2Fcharge44/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32187404,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-23T15:28:30.493Z","status":"ssl_error","status_checked_at":"2026-04-23T15:28:29.972Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hacs","home-assistant","mqtt","photovoltaic","shelly","solarflow","tibber","zendure","zero-export"],"created_at":"2026-04-23T16:00:40.027Z","updated_at":"2026-04-23T16:01:00.636Z","avatar_url":"https://github.com/mavnezz.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# charge44\n\n[![Release](https://img.shields.io/github/v/release/mavnezz/charge44?style=for-the-badge)](https://github.com/mavnezz/charge44/releases)\n[![License](https://img.shields.io/github/license/mavnezz/charge44?style=for-the-badge)](LICENSE)\n[![HACS](https://img.shields.io/badge/HACS-Custom-orange.svg?style=for-the-badge)](https://hacs.xyz)\n[![Validate](https://img.shields.io/github/actions/workflow/status/mavnezz/charge44/validate.yaml?branch=main\u0026style=for-the-badge\u0026label=validate)](https://github.com/mavnezz/charge44/actions/workflows/validate.yaml)\n\nHome Assistant Custom Integration zur Steuerung einer **Zendure SolarFlow 800 Pro** per lokalem MQTT. Kombiniert dynamische Nulleinspeisung (Regelung gegen einen Shelly 3EM Pro) mit preisbasiertem Netzladen (Tibber) und Solar-Prognose-Abgleich (Forecast.Solar).\n\nKeine Cloud, keine Zwischenschicht — direkt auf dem eigenen MQTT-Broker.\n\n## Was kann das Plugin\n\n### 1. Nulleinspeisung (Regelung)\nLiest die Live-Netzleistung vom Shelly 3EM Pro und regelt `outputLimit` der Zendure so, dass der Bezug/die Einspeisung in der Nähe eines konfigurierbaren Zielwerts bleibt (Default 0 W).\n\n### 2. Preisbasiertes Netzladen (Cheap-Charge)\nMit Tibber-API-Token holt das Plugin die Strompreise der nächsten 24 Stunden. In den N günstigsten Stunden wird die Zendure auf **Input mode** geschaltet und mit `inputLimit` aus dem Netz geladen — vorausgesetzt der Spread zwischen aktuellem Preis und Tagesmax lohnt sich unter Berücksichtigung des Wirkungsgrads.\n\n### 3. Smart-Skip via Solar-Prognose\nWenn die `forecast_solar`-Integration in HA installiert ist, wird die erwartete Solarerzeugung des Resttages gegen den Ladebedarf gerechnet. **Reicht die Sonne alleine zum Erreichen des Ziel-SOC → kein Netzladen, auch wenn der Preis gerade günstig ist.**\n\n## Hardware-Voraussetzungen\n\n- Zendure SolarFlow 800 Pro mit aktivierter lokaler MQTT-Konfiguration (direkt am Gerät eingetragen). Das Gerät muss auf Topics wie `Zendure/sensor/\u003cSN\u003e/...` publizieren und auf `.../set` lauschen.\n- Shelly 3EM Pro (oder kompatibel), der `total_act_power` in `\u003cdevice_id\u003e/events/rpc` publiziert.\n- Beide Geräte am selben MQTT-Broker wie Home Assistant.\n- (Optional) Tibber-Account + API-Token für preisbasiertes Laden.\n- (Optional) Forecast.Solar-Integration für Smart-Skip.\n\n## Installation\n\n### HACS (empfohlen)\n1. HACS → Integrationen → ⋮ → **Benutzerdefinierte Repositories**\n2. URL `https://github.com/mavnezz/charge44` als Typ *Integration* hinzufügen\n3. charge44 in der Liste auswählen und installieren\n4. Home Assistant neu starten\n5. Einstellungen → Geräte \u0026 Dienste → **Integration hinzufügen** → charge44\n\n### Manuell\nOrdner `custom_components/charge44/` nach `\u003cHA_config\u003e/custom_components/charge44/` kopieren, HA neu starten.\n\n## Einrichtung\n\nDrei Schritte im Config-Flow:\n\n1. **Geräte** — Das Plugin scannt MQTT 3 Sekunden lang und bietet gefundene Zendure-SNs und Shelly-IDs als Dropdown an. Manuelle Eingabe möglich falls nicht erkannt.\n2. **Tibber + Solar-Prognose** (beide optional) — Token eingeben und Solar-Sensor auswählen. Leer lassen, wenn nur Nulleinspeisung genutzt werden soll.\n3. **Tibber-Zuhause** — nur wenn mehrere Homes am Account hängen.\n\n## Entitäten\n\n### Sensoren\n| Entity | Beschreibung |\n|---|---|\n| `sensor.charge44_grid_power` | Netz-Saldo (Shelly) |\n| `sensor.charge44_grid_import` / `_export` | Nur positiver Bezug/Export, für Energy Dashboard |\n| `sensor.charge44_battery_soc` | SOC % |\n| `sensor.charge44_battery_charging` / `_discharging` / `_net_flow` | Batterie-Fluss (W) |\n| `sensor.charge44_solar_input` | PV-Eingang |\n| `sensor.charge44_output_to_home` | Zendure → Haus |\n| `sensor.charge44_output_limit_device` | aktueller Zendure-Setpoint |\n| `sensor.charge44_regulation_setpoint` / `_error` | Plugin-Regler |\n| `sensor.charge44_pack_state`, `_temperature` | Status + Temperatur |\n| `sensor.charge44_current_price` | Aktueller Strompreis (ct/kWh) |\n| `sensor.charge44_cheap_hour` | \"yes\"/\"no\" — aktuelle Stunde im Cheap-Fenster |\n| `sensor.charge44_cheap_charge_active` | \"on\"/\"off\" — Gerät gerade im Ladezyklus |\n| `sensor.charge44_next_cheap_window` | Timestamp der nächsten Cheap-Stunde |\n| `sensor.charge44_solar_forecast_remaining` | kWh Sonne bis Tagesende |\n| `sensor.charge44_grid_charge_needed` | Shortfall zum Erreichen des Ziel-SOC |\n| `sensor.charge44_today_min_price` / `_max_price` | Tagesmin/-max (ct/kWh) |\n| `sensor.charge44_spread_now` | aktuelle Differenz Tagesmax − jetzt |\n| `sensor.charge44_required_spread` | benötigter Spread laut Min-Spread + Break-Even |\n| `sensor.charge44_charge_profitable` | \"yes\"/\"no\" — Laden würde sich lohnen |\n\n### Einstellungen (Number)\n| Entity | Default | Bedeutung |\n|---|---|---|\n| `number.charge44_grid_bias_target` | 0 W | Sollwert des Netzsaldos (negativ = leichte Einspeisung erlaubt) |\n| `number.charge44_max_output` | 800 W | Obergrenze für outputLimit |\n| `number.charge44_minimum_soc` | 10 % | Plugin-seitige Entlade-Untergrenze |\n| `number.charge44_controller_gain_kp` | 0,5 | P-Regler-Verstärkung |\n| `number.charge44_cheap_hours_per_day` | 6 | Wie viele günstigste Stunden pro 24h zählen als \"cheap\" |\n| `number.charge44_charge_target_soc` | 80 % | Obergrenze für Cheap-Charge |\n| `number.charge44_cheap_charge_power` | 800 W | `inputLimit` beim Netzladen |\n| `number.charge44_min_price_spread` | 10 ct/kWh | Mindestspread (Tagesmax − aktuell) für Lohnenswert |\n| `number.charge44_round_trip_efficiency` | 85 % | Wirkungsgrad für Break-Even-Berechnung |\n| `number.charge44_battery_capacity` | 1,92 kWh | Akkukapazität (für Ladebedarf-Schätzung) |\n\n### Schalter\n- `switch.charge44_regulation` — Nulleinspeisung an/aus\n- `switch.charge44_cheap_charge` — Automatisches Cheap-Charging an/aus\n\n## Logik im Detail\n\n### Regelung (pro Shelly-Tick, ~5 s)\n```\nerror  = grid_power - grid_bias\nsetpoint += error × Kp\nsetpoint  = clamp(0, max_output)\n→ Zendure/number/\u003cSN\u003e/outputLimit/set\n```\nHysterese: nur publizieren wenn Änderung \u003e Deadzone (5 W) UND letzter Publish ≥ 3 s her.\n\n### Cheap-Charge-Entscheidung (pro Minute)\n```\ncheap_hour      = current_price ist in N günstigsten der nächsten 24 h\nspread_now      = today_max - current_price\nbreak_even      = current_price × (1 / efficiency - 1)\nrequired_spread = max(min_spread_ct, break_even)\nprofitable      = spread_now ≥ required_spread\n\nneeded_kwh      = (target_soc - soc) / 100 × battery_capacity\nforecast_kwh    = Forecast.Solar-Sensor (kWh remaining today)\ngap             = max(0, needed_kwh - forecast_kwh)\n\ncharge, wenn:   cheap_charge_enabled\n              ∧ cheap_hour\n              ∧ profitable\n              ∧ soc \u003c target_soc\n              ∧ gap \u003e 0\n```\n\n### Modus-Wechsel\nBeim Eintritt in Cheap-Charge publiziert das Plugin:\n```\nZendure/select/\u003cSN\u003e/acMode/set        → \"Input mode\"\nZendure/number/\u003cSN\u003e/inputLimit/set    → charge_power\n```\nBeim Verlassen umgekehrt. Die Nulleinspeisungs-Regelung pausiert während Cheap-Mode aktiv ist.\n\n## Bekannte Einschränkungen\n\n- Einzelne Instanz (single_instance_allowed)\n- Aktuell nur für **Zendure 800 Pro** + **Shelly 3EM Pro** getestet; andere Geräte mit gleicher Topic-Struktur sollten funktionieren, sind aber nicht verifiziert\n- Keine Options-Flow-Nachkonfiguration; zum Ändern von Tibber-Token oder Forecast-Entity aktuell Integration entfernen und neu hinzufügen\n\n## Versionen\n\nSiehe [GitHub Releases](https://github.com/mavnezz/charge44/releases).\n\n## Lizenz\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmavnezz%2Fcharge44","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmavnezz%2Fcharge44","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmavnezz%2Fcharge44/lists"}