Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
128ffbe
docs: add Enphase cloud integration design spec and plan
springfall2008 Jul 11, 2026
cfb4374
feat: add Enphase cloud component skeleton and registration
springfall2008 Jul 11, 2026
b3dd76f
feat: Enphase Enlighten login flow with lockout guard rails
springfall2008 Jul 11, 2026
11d1348
Fix: Enphase _login_rejected must not signal fatal on transient rejec…
springfall2008 Jul 11, 2026
6224c1a
feat: Enphase request helper with retries and 401 re-login
springfall2008 Jul 11, 2026
ce193b4
feat: Enphase cloud reads, parsers and polling loop
springfall2008 Jul 11, 2026
8db7f9e
Enphase: remove dead profile_label field from battery_status
springfall2008 Jul 11, 2026
c299542
feat: Enphase monitoring sensors with derived power estimates
springfall2008 Jul 11, 2026
f6b3764
feat: Enphase schedule control entities and HA event handling
springfall2008 Jul 11, 2026
f9d34fc
feat: Enphase battery schedule write path with settle confirmation
springfall2008 Jul 11, 2026
191e051
Fix TypeError in schedules_equal() when cloud limit is None
springfall2008 Jul 11, 2026
927e365
feat: EnphaseCloud inverter definition and automatic configuration
springfall2008 Jul 11, 2026
0ddf12a
docs: Enphase cloud component documentation
springfall2008 Jul 11, 2026
dd0263e
Fix Enphase derived-power inflation and harden None user_id params
springfall2008 Jul 11, 2026
2fe1755
feat: add standalone test harness to enphase.py
springfall2008 Jul 11, 2026
76d8218
fix: Enphase login false-reject + tolerate 'N/A' numeric fields
springfall2008 Jul 11, 2026
b2ebd0b
fix: Enphase single-site operation, dedupe sites, graceful no-battery…
springfall2008 Jul 11, 2026
2a8f4fb
feat: verbose Enphase API-call logging (debug_api)
springfall2008 Jul 11, 2026
d0982e7
fix: Enphase energy units (Wh->kWh), CFG-support gate, real schedules…
springfall2008 Jul 11, 2026
1cc4a51
feat: source Enphase today totals + instantaneous power from /today e…
springfall2008 Jul 11, 2026
bf6637e
Comment
springfall2008 Jul 11, 2026
1bb5be9
fix: Enphase parsing corrected against real battery-account responses
springfall2008 Jul 12, 2026
b311b3e
fix: seed Enphase control entities from real cloud schedule/reserve
springfall2008 Jul 12, 2026
07ed301
perf: refresh Enphase SOC on the fast tier, config on the slow tier
springfall2008 Jul 12, 2026
20a9774
feat: Enphase system-status + inverter-time (liveness) sensors; quiet…
springfall2008 Jul 12, 2026
e8bff28
fix: drive Enphase freeze-export from the export target, drop the fre…
springfall2008 Jul 12, 2026
1629c64
feat: require DTG (export) support for Enphase auto-config; drop dtg …
springfall2008 Jul 12, 2026
5ccc372
fix: don't hardwire Enphase export_limit; let the user configure it
springfall2008 Jul 12, 2026
f67e667
[pre-commit.ci lite] apply automatic fixes
pre-commit-ci-lite[bot] Jul 12, 2026
24f029e
feat: Enphase siteSettings + XSRF-refresh; safe reserve write harness
springfall2008 Jul 12, 2026
28e96e6
fix: don't let login-wall cookies corrupt the Enphase session
springfall2008 Jul 12, 2026
e60bcb2
fix: Enphase write 403 - supply XSRF as double-submit (cookie + header)
springfall2008 Jul 12, 2026
7686597
refactor: Enphase writes cache the written value and move on
springfall2008 Jul 12, 2026
3ea4f1e
fix: apply Enphase reserve immediately on the number change, like Fox
springfall2008 Jul 12, 2026
58b57b2
fix: clamp Enphase DTG export floor to at least the reserve
springfall2008 Jul 12, 2026
dae3332
revert: remove IOG charge-skew changes accidentally included on this …
springfall2008 Jul 12, 2026
93e646e
docs: fix stale Enphase component docs (freeze switch, DTG gating, wr…
springfall2008 Jul 12, 2026
3066782
docs: fix stale DTG-optional wording in inverter-setup.md
springfall2008 Jul 12, 2026
c68b880
docs: correct design spec's energy-read endpoint to match implementation
springfall2008 Jul 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions .cspell/custom-dictionary-workspace.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ activepower
adata
adbase
afci
agentic
AIO
AIO's
aiofiles
Expand Down Expand Up @@ -63,6 +64,7 @@ compareform
configform
connack
Consolas
cooldown
coro
cprofile
creds
Expand Down Expand Up @@ -102,21 +104,32 @@ docstrings
dstamp
dstart
dwindow
eauth
Eddi
elif
emqx
emszzzz
Encharge
enctype
endfor
endhour
endminute
endswith
endt
Energi
Energidata
Energidataservice
energydataservice
energythroughput
enho
Enlighten
enlm
enphase
enphaseenergy
Enpower
entrez
epod
etok
euids
EVDC
evergen
Expand Down Expand Up @@ -166,6 +179,7 @@ hainterface
halfhourly
hanres
HAOS
hasattr
hass
hassapi
hassio
Expand All @@ -181,6 +195,7 @@ husforbrukning
hypervolt
iboost
idag
idef
idetails
idxs
iflux
Expand All @@ -189,8 +204,10 @@ inday
INTELLI
intelligentdevice
interp
intraday
invbatpower
invname
isinstance
isoformat
isort
itemtype
Expand All @@ -199,6 +216,7 @@ jedlix
jsyaml
kaiming
keepalive
khtml
killall
kopt
Kostal
Expand All @@ -224,6 +242,7 @@ lockstep
logdata
loglines
lookback
lstrip
luxpower
markdownlint
matplotlib
Expand Down Expand Up @@ -257,12 +276,14 @@ mppt
mprn
mpxn
mqtt
mtok
mult
myenergi
mypy
nattribute
ncalls
nearr
newtok
njpwerner
nobat
nocharge
Expand Down Expand Up @@ -293,6 +314,7 @@ pbat
pbgw
pdata
pdetails
pendings
perc
percnt
peterhaban
Expand Down Expand Up @@ -322,6 +344,7 @@ pvwatts
pwindow
pyjwt
pylint
pypi
pyproject
pytest
pytz
Expand All @@ -330,9 +353,11 @@ rarr
reactivepower
recp
redownload
Referer
refetches
regionid
regname
relogin
remainings
remotecontrol
resetmidnight
Expand All @@ -342,6 +367,7 @@ rname
Roboto
rowspan
rstart
rstrip
rtype
ruamel
Rvrt
Expand All @@ -357,6 +383,9 @@ Selfrun
Selfuse
semodbus
Sergoe
sess
setattr
setdefault
SFMB
sigcloud
sigen
Expand Down Expand Up @@ -391,6 +420,7 @@ stepline
Stromligning
strptime
Strømligning
subclassing
submessage
substep
sunspec
Expand Down Expand Up @@ -424,12 +454,15 @@ tottime
trapz
Trefor
treforsiphone
treforsouthwell
tunables
twinx
tzfile
tzpath
unconfigured
unsmoothed
unstaged
urlsafe
useid
userinterface
varh
Expand Down
31 changes: 31 additions & 0 deletions apps/predbat/components.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
from ha import HAInterface, HAHistory
from db_manager import DatabaseManager
from fox import FoxAPI
from enphase import EnphaseAPI
from kraken import KrakenAPI
from web_mcp import PredbatMCPServer

Expand Down Expand Up @@ -240,6 +241,36 @@
},
"phase": 1,
},
"enphase": {
"class": EnphaseAPI,
"name": "Enphase API",
"event_filter": "predbat_enphase_",
"args": {
"username": {
"required": True,
"config": "enphase_username",
},
"password": {
"required": True,
"config": "enphase_password",
},
"site_id": {
"required": False,
"config": "enphase_site_id",
},
"automatic": {
"required": False,
"default": False,
"config": "enphase_automatic",
},
"automatic_ignore_pv": {
"required": False,
"default": False,
"config": "enphase_automatic_ignore_pv",
},
},
"phase": 1,
},
"kraken": {
"class": KrakenAPI,
"name": "Kraken Energy (EDF/E.ON)",
Expand Down
34 changes: 34 additions & 0 deletions apps/predbat/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -1917,6 +1917,35 @@
"charge_discharge_with_rate": False,
"target_soc_used_for_discharge": True,
},
"EnphaseCloud": {
"name": "EnphaseCloud",
"has_rest_api": False,
"has_mqtt_api": False,
"output_charge_control": "none",
"charge_control_immediate": False,
"has_charge_enable_time": True,
"has_discharge_enable_time": True,
"has_target_soc": True,
"has_reserve_soc": True,
"has_timed_pause": False,
"charge_time_format": "HH:MM:SS",
"charge_time_entity_is_option": True,
"soc_units": "%",
"num_load_entities": 1,
"has_ge_inverter_mode": False,
"has_ge_eco_toggle": False,
"has_fox_inverter_mode": False,
"time_button_press": True,
"clock_time_format": "%Y-%m-%d %H:%M:%S",
"write_and_poll_sleep": 2,
"has_time_window": False,
"support_charge_freeze": True,
"support_discharge_freeze": True,
"has_idle_time": False,
"can_span_midnight": False,
"charge_discharge_with_rate": False,
"target_soc_used_for_discharge": True,
},
"SolaxCloud": {
"name": "SolaxCloud",
"has_rest_api": False,
Expand Down Expand Up @@ -2200,6 +2229,11 @@
"fox_auth_method": {"type": "string", "empty": False},
"fox_token_expires_at": {"type": "string", "empty": False},
"fox_token_hash": {"type": "string", "empty": False},
"enphase_username": {"type": "string", "empty": False},
"enphase_password": {"type": "string", "empty": False},
"enphase_site_id": {"type": "string", "empty": False},
"enphase_automatic": {"type": "boolean"},
"enphase_automatic_ignore_pv": {"type": "boolean"},
"octopus_intelligent_slot": {"type": "sensor|sensor_list", "sensor_type": "boolean|action", "entries": "num_cars", "optional_entries": True},
"octopus_ready_time": {"type": "sensor|sensor_list", "sensor_type": "string", "entries": "num_cars", "optional_entries": True},
"octopus_charge_limit": {"type": "sensor|sensor_list", "sensor_type": "float", "entries": "num_cars", "optional_entries": True},
Expand Down
Loading
Loading