-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path__init__.py
More file actions
134 lines (98 loc) · 4.46 KB
/
__init__.py
File metadata and controls
134 lines (98 loc) · 4.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
"""
EcoFlow PowerOcean Plus — Home Assistant Integration.
Diese Integration ermöglicht die Überwachung einer EcoFlow PowerOcean Plus
Photovoltaikanlage in Home Assistant. Sie kommuniziert über die EcoFlow
Private Cloud API (MQTT) und verarbeitet die Protobuf-kodierten Gerätedaten.
Unterstützte Geräte:
- EcoFlow PowerOcean Plus 15 kW (Seriennummer beginnt mit R37)
- Bis zu 9 EcoFlow Batterie-Packs
Kommunikationsweg:
HA ──HTTPS──► api.ecoflow.com (Login + MQTT-Credentials)
HA ──MQTTS──► mqtt-e.ecoflow.com:8883 (Echtzeit-Gerätedaten)
Gerät ──────► mqtt-e.ecoflow.com (Gerät sendet von sich aus)
Einschränkungen:
- Benötigt aktive Internetverbindung (Cloud-abhängig)
- Die EcoFlow Developer API (Open API) unterstützt den PowerOcean Plus
derzeit nicht vollständig (Error 1006 bei /device/quota/all)
- Lokaler Zugriff nur über Modbus TCP Port 502 möglich (noch nicht implementiert)
"""
from __future__ import annotations
import logging
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady
from .const import CONF_DEBUG_MODE, DEFAULT_DEBUG_MODE, DOMAIN, PLATFORMS
from .coordinator import EcoFlowCoordinator
_LOGGER = logging.getLogger(__name__)
def _apply_debug_logging(entry: ConfigEntry) -> None:
"""
Aktiviert/deaktiviert Debug-Logging für diese Integration.
Hinweis:
Der Schalter wirkt auf den Integrations-Logger-Namespace
`custom_components.ecoflow_powerocean`.
"""
debug_mode = bool(entry.options.get(CONF_DEBUG_MODE, DEFAULT_DEBUG_MODE))
integration_logger = logging.getLogger("custom_components.ecoflow_powerocean")
integration_logger.setLevel(logging.DEBUG if debug_mode else logging.NOTSET)
async def _async_update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None:
"""Lädt die Integration neu wenn Options geändert wurden."""
await hass.config_entries.async_reload(entry.entry_id)
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""
Richtet einen Config Entry ein.
Wird aufgerufen wenn die Integration geladen wird (HA-Start oder manuelle
Aktivierung). Erstellt den Coordinator, baut die Verbindung auf und
registriert alle Sensor-Plattformen.
Args:
hass: Home Assistant Instanz.
entry: Konfigurationseintrag mit Zugangsdaten.
Returns:
True bei Erfolg.
Raises:
ConfigEntryNotReady: Wenn die Verbindung nicht hergestellt werden kann.
"""
hass.data.setdefault(DOMAIN, {})
_apply_debug_logging(entry)
coordinator = EcoFlowCoordinator(hass, entry)
# Verbindung aufbauen (Login + MQTT)
try:
await coordinator.async_setup()
except Exception as exc:
raise ConfigEntryNotReady(
f"Verbindung zu EcoFlow PowerOcean Plus fehlgeschlagen: {exc}"
) from exc
# Ersten Datenabzug durchführen (wartet auf MQTT-Daten mit Timeout)
await coordinator.async_config_entry_first_refresh()
# Coordinator im globalen HA-State speichern
hass.data[DOMAIN][entry.entry_id] = coordinator
# Sensor-Plattform initialisieren
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
# Bei Options-Änderungen Integration neu laden
entry.async_on_unload(entry.add_update_listener(_async_update_listener))
_LOGGER.info(
"EcoFlow PowerOcean Plus Integration gestartet (SN: %s, debug_mode=%s)",
coordinator.serial_number,
bool(entry.options.get(CONF_DEBUG_MODE, DEFAULT_DEBUG_MODE)),
)
return True
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""
Entlädt einen Config Entry.
Wird aufgerufen wenn die Integration deaktiviert, neu geladen oder
entfernt wird. Trennt die MQTT-Verbindung sauber und gibt Ressourcen frei.
Args:
hass: Home Assistant Instanz.
entry: Zu entladender Konfigurationseintrag.
Returns:
True wenn alle Plattformen erfolgreich entladen wurden.
"""
coordinator: EcoFlowCoordinator = hass.data[DOMAIN].get(entry.entry_id)
# Plattformen entladen
unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
# MQTT-Verbindung trennen
if coordinator:
await coordinator.async_shutdown()
# Daten aus HA-State entfernen
if unload_ok:
hass.data[DOMAIN].pop(entry.entry_id, None)
return unload_ok