--- name: power-usage description: >- Analyze where the power is going across the install — load vs PV generation vs grid vs battery flow, plus EVSE charging sessions. Use when the user asks "why is my battery draining / how much am I using / where are the watts going / is the car charging / what's my solar production / power consumption", or wants an energy balance or breakdown. Read-only; this skill measures and explains, it does not change anything. --- # power-usage ## 0. Load context Shell cwd is the repo root; anchor paths there: ```bash ROOT="$(git rev-parse --show-toplevel)"; SNAP="$ROOT/.claude/skills/lib/solar-snapshot" ``` Read `$ROOT/.claude/skills/REFERENCE.md` for entity names. Key sign conventions: pack `pack_current` is signed (**+ = charging, − = discharging**); inverter `mppt*_input_power` is PV in (W); `ac_output_active_power` is load out (W). ## 1. Instantaneous energy balance ```bash # Generation (PV) + load, per inverter: "$SNAP" -w 10 -g 'lvx6048_[12]_(mppt1_input_power|mppt2_input_power|ac_output_active_power|grid_voltage|device_mode)/' 'homeassistant/sensor/+/state' # Battery flow, per pack (sum the pack_power = V×I yourself): "$SNAP" -w 16 -g 'lifepower4_[1-6]_(pack_voltage|pack_current|soc)/' 'homeassistant/sensor/+/state' # EV charger: "$SNAP" -w 8 'openevse/status' 'openevse/power' 'openevse/amp' 'openevse/voltage' 'openevse/session_energy' ``` Then state the balance in words: - **PV in** = sum of all `mppt*_input_power`. - **Battery** = sum of (pack_voltage × pack_current) over 6 packs. Negative total = discharging (load exceeds PV+grid); positive = charging. - **Load out** = sum of inverter `ac_output_active_power`. - **EVSE** = `openevse/power` — and the EVSE load is a *subset* of total load, so a draining battery with the car plugged usually explains itself here. - **Grid**: `device_mode` Bypass/Line means grid is carrying/supplementing; Battery mode means running off the bank. The LVX6048 has no clean grid-power entity, so infer grid = load − PV − battery_discharge. Sanity: PV + grid + battery_discharge ≈ load (within metering noise). A big residual means one feed is mis-reported — note it (e.g. the known `lvx6048_1_battery_voltage` ~10 V glitch will corrupt any pack-power math that uses the *inverter's* battery reading; always use the **pack** entities for battery flow). ## 2. "Why is the battery draining?" Walk the chain: is PV low (night/shade/§5 of troubleshoot-inverter dead string)? Is load high (check `ac_output_active_power` and EVSE `power`)? Is the inverter in Battery mode instead of using grid (`device_mode`)? Pin the drain on the largest negative contributor and say which. ## 3. EVSE sessions ```bash "$SNAP" -w 10 'openevse/status' 'openevse/state' 'openevse/session_energy' 'openevse/total_energy' 'openevse/vehicle' 'openevse/pilot' 'openevse/max_current' ``` - `status` active = charging; sleeping/disabled = not drawing. `vehicle` = plugged. - `session_energy` (Wh) this plug-in; `pilot`/`max_current` = the current cap the EVSE is signalling. Idle EVSE publishes little — a short empty capture is normal. - For history/trends (daily kWh, past sessions), the data lives in **Home Assistant's recorder**, not on MQTT — direct the user to the HA Energy dashboard / `sensor.openevse_total_day|week|month`. PI18 has no per-day inverter energy (memory `project_lvx6048_no_daily_energy_query`); only `ET` lifetime Wh exists. ## 4. Report Give the live balance (PV / load / battery / grid / EVSE, with numbers and signs), the headline ("you're pulling X W from the bank because load Y W > PV Z W, car is taking W W"), and point at HA recorder for anything historical. This skill never changes settings — if the answer is "shift charging to solar hours" etc., suggest it as advice, don't actuate.