Custom ioBroker Adapter fuer go-e Gemini Charger mit deterministischer Lade-Logik, klaren Datenpunkten und robustem HTTP/MQTT Betrieb.
- Drei Betriebsmodi:
1 = PV only2 = PV only (go-e = priority)3 = grid mode
- Direkte Laufzeit-Steuerung ueber ioBroker States (
control.*) - Sofortiger Not-Stopp (
control.emergencyStop) mit Prioritaet vor allen anderen Freigaben - Start-/Stop-Verzoegerung gegen Flattern (
startDelaySec,stopDelaySec) - Dynamische Phasenwahl mit Hysterese + Mindesthaltezeit
- Optionales SoC-Limit fuer das Fahrzeug (
targetSocEnabled,targetSocPercent) - Eingangsdaten-Freshness-Pruefung mit Blockierung bei veralteten/missing Werten
- Simulation/Dry-Run Modus ohne reale Schreibbefehle
- HTTP und MQTT als Lese-/Schreibtransport (auch Hybrid beim Lesen)
- Diagnostik- und Entscheidungs-States fuer transparentes Debugging
Externe Zaehler/PV/Batterie States
|
v
inputs.* + Freshness Check
|
v
Entscheidungslogik
(Modus, Limits, Delays, Safety)
|
v
control -> effectiveAllow/current/phase
|
v
go-e Befehle (HTTP/MQTT)
|
v
status.* / diagnostics.* Rueckmeldung
Berechnung:
availablePowerW = pvPowerW - (houseConsumptionW - chargerPowerW) - reservePowerW
Zusatzbedingungen:
- Hausakku muss als "voll" gelten:
homeBatterySocPercent >= batteryFullSocPercent - Netzbezug und Akku-Entladung muessen innerhalb des Puffers liegen:
gridImportW <= pvOnlyFlowBufferWhomeBatteryDischargeW <= pvOnlyFlowBufferW
- Bei aktivem
maxGridImportWwird Ueberschreitung direkt vonavailablePowerWabgezogen.
Berechnung:
availablePowerW = pvPowerW - (houseConsumptionW - chargerPowerW) - reservePowerW
Zusatzbedingungen:
- Kein Akku-Voll-Kriterium
- Netzbezug und Akku-Entladung muessen innerhalb des Puffers liegen
- Optionaler
maxGridImportWwird ebenfalls eingerechnet
- Keine PV-Leistungsformel
- Verwendet direkte Sollwerte:
control.gridManual.currentAcontrol.gridManual.phaseMode
control.allowChargingist der globale Master-Switch.control.emergencyStophat immer Prioritaet und stoppt sofort (ohne Start/Stop-Delay).- Effektive Freigabe:
effectiveAllow = emergencyStop ? false : delayed(rawAllow)
Dabei enthaelt rawAllow alle fachlichen Bedingungen (Modus, Leistung, SoC, Freshness, Buffer, usw.).
- Status lesen:
/status(v1)- optional
/api/statusmit Filter (v2)
- Befehle schreiben:
- v1:
/mqtt?payload=key=value - v2 Phasenmodus:
/api/set?psm=...
- v1:
- Status Topic:
<prefix>/<serial>/status - Command Topic:
<prefix>/<serial>/cmd/req - Standard Prefix:
go-eCharger
chargerHost: IP/Hostname des ChargerspollIntervalSec: Poll-Intervall (auch bei Hybrid relevant)httpTimeoutMs: Timeout fuer HTTP RequestsreadTransport:http | mqtt | hybridwriteTransport:http | mqttenableApiV2: noetig fuer v2-Features (z.B.psm)
mqttBrokerUrl,mqttUsername,mqttPasswordmqttTopicPrefix,mqttSerial
Konzept: positive-only Modell, getrennte Werte fuer Import/Export und Charge/Discharge.
gridImportObjectIdgridExportObjectIdpvPowerObjectIdhouseConsumptionObjectIdhomeBatteryDischargeObjectIdhomeBatteryChargeObjectIdhomeBatterySocObjectIdcarSocObjectId
Hinweis:
- Die Regelung verwendet aktiv vor allem
pvPower,houseConsumption,gridImport,homeBatteryDischarge,homeBatterySoc(Modus-abhaengig). gridExportundhomeBatteryChargewerden eingelesen und als Inputs gespiegelt, sind aber aktuell nicht Kernbestandteil der Freigabeformel.
reservePowerWphaseSwitchUpThresholdWphaseSwitchHysteresisWphaseSwitchMinHoldSecstartDelaySec,stopDelaySecmaxInputAgeSecmaxGridImportW(-1deaktiviert)pvOnlyFlowBufferWbatteryFullSocPercentminCurrentA,maxCurrentAcommandMinIntervalMs
defaultModedefaultGridCurrentAdefaultGridPhaseModedefaultTargetSocEnableddefaultTargetSocPercentdefaultSimulationMode
control.allowChargingcontrol.emergencyStopcontrol.simulationModecontrol.modecontrol.gridManual.currentAcontrol.gridManual.phaseModecontrol.minCurrentAcontrol.maxCurrentAcontrol.targetSocEnabledcontrol.targetSocPercent
status.connectionstatus.activeModestatus.effectiveAllowChargingstatus.targetPhaseMode,status.actualPhaseModestatus.chargerPowerW,status.chargerCurrentAstatus.setCurrentA,status.setCurrentVolatileAstatus.lastCommand,status.lastCommandAtstatus.sessionActive,status.sessionEnergyWh,status.sessionEnergyKWhstatus.decision(wichtigster Debug-State)
diagnostics.lastErrordiagnostics.inputsStalediagnostics.staleInputListdiagnostics.oldestInputAgeSecdiagnostics.httpReadFailStreakdiagnostics.readSource
status.decisionlesen (enthaelt Trigger + Blockgruende)diagnostics.inputsStaleunddiagnostics.staleInputListpruefenstatus.effectiveAllowChargingmitcontrol.allowChargingundcontrol.emergencyStopabgleichenstatus.lastCommand/status.lastCommandAtauf gesendete Befehle pruefen
Optionaler Doku-Ordner fuer weitere Screenshots:
docs/screenshots/README.md
- Laedt nicht trotz PV:
status.decisionauf Buffer-, SoC- oder Freshness-Blocker pruefen.
- Keine Befehle am Charger:
status.transportWritepruefen, MQTT Verbindung oder HTTP Erreichbarkeit testen.
- Werte "springen":
startDelaySec,stopDelaySec,phaseSwitchMinHoldSecerhoehen.
- Unerwarteter Netzbezug:
reservePowerWerhoehen,maxGridImportWaktivieren/justieren.
MIT

