So, a weird thing happened over the last couple of days, and my Tesla Powerwalls weren't working properly, or, at all, actually... What's even more strange is that Tesla has been completely silent about this and hasn't made a single announcement about the issue that I can find, and I haven't been notified.

My Home Setup
You can read various posts on my blog about how I automate almost all of my home with Home Assistant, and more recently there were two Tesla Powerwall posts [1][2] about bringing the final pieces of the puzzle together. I have everything working almost exactly how I want it to, with the one outstanding question on how I can control the charge rate of the Powerwalls, which I will be answering later!
First, though, this recent Tesla outage that I've seen absolutely nothing from Tesla about... Regular readers will know I automate my Powerwalls via Home Assistant using the Teslemetry service.

I can control when the Powerwalls are charging or not based on the current cost for electricity import, and I can also control when they're exporting to the grid if I have excess capacity for the day. Things were going really quite well, until I woke up one morning and the batteries were basically empty. I woke up on the morning of the 7th August and we hadn't charged the batteries in the cheap off-peak tariff that we get overnight, which is really the main point of the batteries. Fill up on the cheap stuff overnight, avoid the expensive stuff during the day.

I tried to enable grid charging to see if I could just get some power back in to the batteries so they weren't sat on such a low SoC, but it wouldn't enable. I wondered if Teslemetry were having an issue, but nothing was reported on their side. I disabled the integration and went directly to the official Tesla app and tried to enable grid charging there, but again, it wouldn't enable. After some searching, it seems it wasn't just me having the issue and anyone with a Powerwall setup seemed to be having the exact same problem. Shortly after, an incident went up on the Teslemetry status page saying that the issue was with the Tesla API.

It wasn't just Teslemetry, either. Other services that also allow for control of Tesla Powerwalls were having issues and reporting similar problems on their status pages too, like NetZero.

As you can see from the graph above, I did manage to capture some excess solar production during the day and charge the batteries a little, but it was almost 24 hours later when the issue finally resolved and the button to enable grid charging started magically working again! I enabled the Teslemetry integration and we were back in business.
So what's up with that?..
I genuinely do find it staggering that a trillion dollar company can't notify customers who are actively using their product of an issue such as this! It's pretty crazy when you think about it that there was an issue that effectively rendered Powerwalls useless, and there have been no notifications, updates, or a post-mortem, nothing... This is really poor from Tesla and I think this issue deserves more attention.
Part of me is also wondering if there might be a problem with enabling a huge amount of Powerwalls to be able to grid charge again all at once. Could it have an impact on the grid? Was that part of the problem and they staggered the rollout of the fix? What was the problem? I just want to know!
Update 11th Aug 15:17 BST: Tesla responded to my support ticket with the following:
We are reaching out regarding your inquiry that grid charging turns it self off automatically. Our App Team is aware of this issue and is currently working on resolving it.
Please rest assured, we will resolve it within the next Tesla App updates.
Controlling how fast your Powerwalls charge
One of the last things I had to address in my previous blog post was controlling how fast my Powerwalls were charging. Once you set them to charge, they charge up at full power, which isn't really necessary. Charging them at such a high rate isn't necessary as I have a long time to charge them, and charging at a higher rate is worse for the battery, and it leaves it sat at 100% for a longer period overnight, which is also worse for the battery! Overall that's a bad pair of options, but what if you could change the rate at which the batteries draw power when charging? Well, you can!
This is super easy to do thanks to my use of Home Assistant and Teslemetry, and it's worth pointing out that one of the options below won't be available to you if you're not using a service like Teslemetry as it's not available in the Tesla app! It turns out that when the batteries are in a different mode, they charge at a different rate. Here is the operation mode you need to set in Teslemetry, and in brackets is the name of that mode in the Tesla app.
Operation Mode | Total Draw | Per Battery |
---|---|---|
Autonomous (Time-Based Control) | 15kW | 5kW |
Self-consumption (Self-Powered) | 5.7kW | 1.9kW |
Backup (not available) | 11.1kW | 3.7kW |
I have 3 x Powerwalls so the above numbers show my total grid power draw when charging, and what the breakdown is per Powerwall. I've always been using "Autonomous" mode, which is known as "Time-Based Control" in the Tesla app, and that results in the batteries charging at their maximum rate of 5kW each!
It turns out that if you put the Powerwalls in "Self-consumption" mode, which is known as "Self-Powered" in the Tesla app, they only charge at 1.9kW each. That might be helpful to you, but for me, it's not enough. The Powerwalls have an official usable capacity of 13.5kWh, and mine are reporting a usable capacity of either 13.7kWh or 13.8kWh via the API. My cheap rate tariff applies from 23:30 to 05:30 giving me 6 hours and unfortunately, 6 hours x 1.9kW = 11.4kWh, which is not enough to fully recharge them.
The good news is that because I'm using the Teslemetry integration, it gives me access to the "Backup" mode, which isn't available in the Tesla app, and it sees the batteries charge at ~3.7kW, which works out quite well because 13.8kWh / 3.7kW = 3.7 hours (3hrs 45min). That means the batteries can charge at a lower rate and take a longer time to hit 100% SoC, but still be comfortably ready by 05:30 even if I need to go from 0% to 100%. Another bonus is that Backup mode will automatically set the Backup Reserve to 100% too! For comparison, here is the charging curve before and after the change, showing that slightly gentler curve now I'm using Backup mode.


My current automations
Given the above issue with the Tesla API, I wanted to avoid turning Grid Charging on and off because I might find myself in a position where I can't turn it back on again at some point in the future... Going forwards, I'm going to control charging by toggling the operation mode between Autonomous and Backup, whilst setting the Backup Reserve to the appropriate level too. I will also provide a copy of my export automation for completeness too. Here is the battery charging automation:
alias: Powerwall - Dynamic Battery Charging Control
description: |
Sets Shireburn operation mode and backup reserve based on price and SoC.
- Cheap & below target SoC => backup @ 100%
- Expensive or above target SoC => autonomous @ target SoC
triggers:
- trigger: time_pattern
minutes: /5
conditions: []
actions:
- choose:
- conditions:
- condition: numeric_state
entity_id: >-
sensor.octopus_energy_electricity_snip_current_rate
below: input_number.electricity_cost_threshold
- condition: numeric_state
entity_id: sensor.shireburn_charge
below: input_number.powerwall_soc_threshold
sequence:
- condition: or
conditions:
- condition: template
value_template: "{{ states('select.shireburn_operation_mode') != 'backup' }}"
- condition: template
value_template: "{{ states('number.shireburn_backup_reserve') | int != 100 }}"
- action: select.select_option
target:
entity_id: select.shireburn_operation_mode
data:
option: backup
- action: number.set_value
target:
entity_id: number.shireburn_backup_reserve
data:
value: 100
- conditions:
- condition: numeric_state
entity_id: >-
sensor.octopus_energy_electricity_snip_current_rate
above: input_number.electricity_cost_threshold
sequence:
- condition: or
conditions:
- condition: template
value_template: >-
{{ states('select.shireburn_operation_mode') != 'autonomous'
}}
- condition: template
value_template: "{{ states('number.shireburn_backup_reserve') | int != 0 }}"
- action: select.select_option
target:
entity_id: select.shireburn_operation_mode
data:
option: autonomous
- action: number.set_value
target:
entity_id: number.shireburn_backup_reserve
data:
value: 0
mode: single
Here is the export automation:
alias: Dynamic Battery Export Control
description: >-
Adjust export setting and export mode display based on battery SoC and
time-of-day
triggers:
- minutes: /5
trigger: time_pattern
actions:
- variables:
now_ts: "{{ now().timestamp() }}"
today: "{{ now().date().isoformat() }}"
start_ts: "{{ (today ~ 'T05:30:00') | as_datetime | as_timestamp }}"
end_ts: "{{ (today ~ 'T23:30:00') | as_datetime | as_timestamp }}"
end_for_target_ts: "{{ (today ~ 'T23:15:00') | as_datetime | as_timestamp }}"
current_soc: "{{ states('sensor.shireburn_charge') | float(0) }}"
- choose:
- conditions:
- condition: template
value_template: "{{ now_ts < start_ts or now_ts > end_ts }}"
sequence:
- target:
entity_id: input_number.target_soc
data:
value: 100
action: input_number.set_value
- target:
entity_id: input_text.export_mode_state
data:
value: No Export
action: input_text.set_value
- condition: template
value_template: "{{ states('select.shireburn_allow_export') != 'never' }}"
- target:
entity_id: select.shireburn_allow_export
data:
option: never
action: select.select_option
default:
- variables:
total_secs: "{{ end_for_target_ts - start_ts }}"
elapsed_secs: "{{ now_ts - start_ts }}"
progress: >-
{{ (elapsed_secs / total_secs) if elapsed_secs < total_secs else 1.0
}}
target_soc: "{{ 100 - (95 * (progress ** 1.5)) }}"
- target:
entity_id: input_number.target_soc
data:
value: "{{ target_soc | round(0) }}"
action: input_number.set_value
- choose:
- conditions:
- condition: template
value_template: |
{% set hour = now().hour %} {% if hour < 23 %}
{{ current_soc > (target_soc + 5) }}
{% else %}
{{ current_soc > target_soc }}
{% endif %}
sequence:
- target:
entity_id: input_text.export_mode_state
data:
value: Battery + Solar Export
action: input_text.set_value
- condition: template
value_template: "{{ states('select.shireburn_allow_export') != 'battery_ok' }}"
- target:
entity_id: select.shireburn_allow_export
data:
option: battery_ok
action: select.select_option
- conditions:
- condition: template
value_template: "{{ current_soc < (target_soc - 5) }}"
sequence:
- target:
entity_id: input_text.export_mode_state
data:
value: No Export
action: input_text.set_value
- condition: template
value_template: "{{ states('select.shireburn_allow_export') != 'never' }}"
- target:
entity_id: select.shireburn_allow_export
data:
option: never
action: select.select_option
default:
- target:
entity_id: input_text.export_mode_state
data:
value: Solar Export
action: input_text.set_value
- condition: template
value_template: "{{ states('select.shireburn_allow_export') != 'pv_only' }}"
- target:
entity_id: select.shireburn_allow_export
data:
option: pv_only
action: select.select_option
mode: single
Hopefully they will be useful and perhaps we might know more about the Tesla API outage soon!..