Summary
With ohme_automatic: true, ohme_control off and a tariff that is not Octopus Intelligent, Predbat builds its own car charging plan and models it as load, but nothing carries that plan out: Ohme keeps charging to its own schedule. The plan Predbat shows can be completely different from what the charger will do.
When Predbat is not controlling the charger, the car plan should come from Ohme. Today there is no configuration that does this without also treating the slots as Octopus Intelligent dispatches.
What happens
OhmeAPI.automatic_config() sets:
car_charging_planned → binary_sensor.predbat_ohme_connected (on whenever a car is plugged in and wants charge)
car_charging_soc → sensor.predbat_ohme_battery_percent
octopus_intelligent_slot is only pointed at binary_sensor.predbat_ohme_slot_active when octopus_intelligent_wanted() is true (Intelligent tariff detected, or ohme_automatic_octopus_intelligent: true). Otherwise fetch_sensor_data_car_planning() takes the elif self.car_charging_planned[car_n] or self.car_charging_now[car_n] branch and calls plan_car_charging().
So on any other tariff, plugging the car in makes Predbat plan a charge from the Ohme SoC to the limit, starting in the first available low-rate window. With ohme_control off, that plan is never sent to the charger.
Example (one install, 5 Oct 2026, Cosy-style three-rate tariff, v9.3.x)
Ohme's own session, as published on binary_sensor.predbat_ohme_slot_active:
planned_dispatches: [{start: 2026-10-05T01:18:17+0100, end: 2026-10-05T08:37:28+0100, energy: -56.22, location: AT_HOME}]
sensor.predbat_ohme_status = plugged_in, sensor.predbat_ohme_mode = max_charge, sensor.predbat_ohme_power_watts = 0
Predbat's plan at 08:10 the same morning:
Car 0 plan charging from 28.0kWh to 100.0% (100.0kWh), with slots [...], ready by 07:00:00
Car 0 charging plan is: [{'start': 490, 'end': 780, 'kwh': 35.767, 'average': 31.56, 'cost': 1128.8, 'octopus': False},
{'start': 780, 'end': 960, 'kwh': 22.2, 'average': 15.48, 'cost': 343.66, 'octopus': False},
{'start': 1140, 'end': 1305, 'kwh': 20.295, 'average': 31.56, 'cost': 640.5, 'octopus': False}]
That is 78 kWh and about £21 of car charging in the plan, with "hold for car" on most of the day's slots, while the charger is drawing 0 W and Ohme's own session ends at 08:37. The plan re-forms every cycle for as long as the car stays plugged in.
Two things make it worse, though neither is the cause:
car_charging_battery_size was left at the 100 kWh default, so 28 % was read as 72 kWh to add.
- The Ohme battery percent is an estimate. On this install it sat at exactly 19 for six days, and read 28 the morning after a 21 kWh session.
Why the existing options do not cover it
Proposal
When ohme_automatic is on, ohme_control is off and the Intelligent wiring is not in use, take the car charging slots from Ohme's session (planned_dispatches on binary_sensor.predbat_ohme_slot_active) as car load only, with no change to import rates, instead of calling plan_car_charging().
This could be the default for that combination, or sit behind a new option (for example ohme_automatic_plan: true) if changing the default is too risky. Either way the docs for ohme_automatic should say which plan the user is looking at.
If Ohme has no session slots, Predbat should plan no car charge, and leave a car that is charging anyway to the existing dynamic load handling.
Related
Code references checked against main at ee401ec: apps/predbat/ohme.py (automatic_config, octopus_intelligent_wanted, control_charge), apps/predbat/fetch.py (fetch_sensor_data_car_planning), apps/predbat/plan.py (plan_car_charging).
Summary
With
ohme_automatic: true,ohme_controloff and a tariff that is not Octopus Intelligent, Predbat builds its own car charging plan and models it as load, but nothing carries that plan out: Ohme keeps charging to its own schedule. The plan Predbat shows can be completely different from what the charger will do.When Predbat is not controlling the charger, the car plan should come from Ohme. Today there is no configuration that does this without also treating the slots as Octopus Intelligent dispatches.
What happens
OhmeAPI.automatic_config()sets:car_charging_planned→binary_sensor.predbat_ohme_connected(on whenever a car is plugged in and wants charge)car_charging_soc→sensor.predbat_ohme_battery_percentoctopus_intelligent_slotis only pointed atbinary_sensor.predbat_ohme_slot_activewhenoctopus_intelligent_wanted()is true (Intelligent tariff detected, orohme_automatic_octopus_intelligent: true). Otherwisefetch_sensor_data_car_planning()takes theelif self.car_charging_planned[car_n] or self.car_charging_now[car_n]branch and callsplan_car_charging().So on any other tariff, plugging the car in makes Predbat plan a charge from the Ohme SoC to the limit, starting in the first available low-rate window. With
ohme_controloff, that plan is never sent to the charger.Example (one install, 5 Oct 2026, Cosy-style three-rate tariff, v9.3.x)
Ohme's own session, as published on
binary_sensor.predbat_ohme_slot_active:Predbat's plan at 08:10 the same morning:
That is 78 kWh and about £21 of car charging in the plan, with "hold for car" on most of the day's slots, while the charger is drawing 0 W and Ohme's own session ends at 08:37. The plan re-forms every cycle for as long as the car stays plugged in.
Two things make it worse, though neither is the cause:
car_charging_battery_sizewas left at the 100 kWh default, so 28 % was read as 72 kWh to add.Why the existing options do not cover it
ohme_control: truemakes the plan real, but hands the charger to Predbat. A user who wants Ohme to keep scheduling the car has no use for it.ohme_automatic_octopus_intelligent: truedoes take the slots from Ohme, but throughoctopus_intelligent_slot, sorate_add_io_slots()also prices them as cheap dispatch windows. That is wrong on a non-Intelligent tariff (see Ohme: session slots priced as Octopus dispatch windows, and watts x duration overstates energy 2.5x #4952 for the same pricing concern).Proposal
When
ohme_automaticis on,ohme_controlis off and the Intelligent wiring is not in use, take the car charging slots from Ohme's session (planned_dispatchesonbinary_sensor.predbat_ohme_slot_active) as car load only, with no change to import rates, instead of callingplan_car_charging().This could be the default for that combination, or sit behind a new option (for example
ohme_automatic_plan: true) if changing the default is too risky. Either way the docs forohme_automaticshould say which plan the user is looking at.If Ohme has no session slots, Predbat should plan no car charge, and leave a car that is charging anyway to the existing dynamic load handling.
Related
watts x hours, which overstates what Ohme expects to deliver. The 56.22 kWh above is that calculation (7.68 kW x 7.32 h), so this proposal depends on that being fixed to give a sensible load.Code references checked against main at ee401ec:
apps/predbat/ohme.py(automatic_config,octopus_intelligent_wanted,control_charge),apps/predbat/fetch.py(fetch_sensor_data_car_planning),apps/predbat/plan.py(plan_car_charging).