Files
2026-04-27 06:50:04 -04:00

3.7 KiB

lvx-control

Tiny daemon that bridges Home-Assistant-friendly MQTT topics to powermon's adhoc-command queue, so HA buttons / selects / numbers can drive the LVX6048 pair without anyone touching the LCD or the shell.

What it does

HA dashboard (mqtt button)
    │
    │  payload "solar_battery_utility"
    ▼
solar/control/lvx6048/output_priority           (subscribed by lvx-control)
    │
    │  validates against the allow-list, encodes to PI18
    │  e.g. "POP01"  (output source = solar -> battery -> utility)
    ▼
powermon/lvx6048_1/addcommand     ┐  mirrored to BOTH inverters in
powermon/lvx6048_2/addcommand     ┘  the same publish so the parallel
                                     cluster never desyncs (fault 86)
    │
    ▼
powermon services execute the command on each unit; result lands in
powermon/lvx6048_{1,2}/result for HA to confirm

Supported actions

Friendly topic suffix → PI18 setter:

Topic suffix Payload values PI18
output_priority solar_utility_battery | solar_battery_utility POP
charger_priority solar_first | solar_and_utility | solar_only PCP
solar_power_priority battery_load_utility_ac | load_battery_utility PSP
max_charging_current 10,20,30,40,50,60,70,80 (combined solar+AC, A) MCHGC
max_utility_charging_current 2,10,20,30,40,50,60,70,80 (grid-side, A) MUCHGC

Risky setters (battery thresholds, type, output mode, factory reset) are intentionally not exposed here — those should go through lvx-flash/flash.py apply with an explicit profile and confirmation.

Known limitation

max_charging_current (MCHGC) and max_utility_charging_current (MUCHGC) return Failed via PI18 when the inverter is actively charging (mode 06) — the firmware appears to lock these setters during charge cycles. Other setters (POP / PCP / PSP / PEI / PDI) work in all observed modes. If you need to reliably change the charge-current caps, either:

  • wait for the inverter to settle into Standby (mode 01) and retry, or
  • change via the LCD (Programs 02 / 11), or
  • use lvx-flash/flash.py apply (it stops the powermon services first, giving exclusive USB access).

Track the result topic to see the actual outcome of each command.

Quick test

# subscribe to results in another terminal
mosquitto_sub -h <broker> -u mqtt -P <pass> -v \
    -t 'powermon/lvx6048_1/result' \
    -t 'powermon/lvx6048_2/result'

# fire a control command
mosquitto_pub -h <broker> -u mqtt -P <pass> \
    -t 'solar/control/lvx6048/charger_priority' \
    -m 'solar_first'

You should see the encoded PCP0,0 show up at the inverters' result topics within ~1 second, and the existing PIRI sensor in HA will reflect the new state on the next 5-minute cycle.

Files

lvx-control/lvx-control               <-- single-file Python (PEP-723 deps)
lvx-control/README.md                 <-- this file
etc/systemd/system/lvx-control.service

install.sh copies the script to /usr/local/bin/lvx-control and enables the systemd unit. Broker credentials are read from ~/.config/powermon/powermon.yaml (no separate secret file).