Same here. Just discovered it.
If that is the issue, then there is a fixed merged into ESPHOME dev about an hour ago it seems
can someone please post the latest working esp32 config for ESPHome 2025.6.0?
Hi People,
I have a dedicated esp32 for the powerpal HACS intergration. It’s all up and running, my bluetooth proxy can see the powerpal device . But i don’t get any readings. All the entities read as unknown. Been like this for days. I got some readings for half a day, got all excited and nothing since then. Tried with the powerpal app on,off, working int he background, completely removed from phone, I’m not sure what to do from here. Any help would be greatly appreciated.
I’m using the HACS from @muneeb1990.
Easy fix for now until a fix for the unknown error is found would be to downgrade your esphome to 2025.5.3 version.
That’s what I did for now.
Can confirm that ESPHOME 2025.6.1 has the fixes. All working fine for me.
can you please post your esp32 yaml for the node?
Could you share your YAML?
esphome:
name: powerpal-gateway
friendly_name: Powerpal Gateway #THE FRIENDLY NAME OF YOUR ESP Device
on_boot:
then:
- lambda: |-
id(powerpal_ble_sensor)->daily_pulses_ = id(powerpal_daily_pulses_backup);
esp32:
board: esp32dev
framework:
type: arduino
external_components:
- source:
type: git
url: https://github.com/muneeb1990/esphome
ref: powerpal_ble
components: [ powerpal_ble ]
time:
- platform: homeassistant
id: homeassistant_time
ble_client:
- mac_address: XX:XX:XX:XX:XX:XX #PUT YOUR MAC ADDRESS HERE - NO QUOTES IS IMPORTANT
id: powerpal
button:
- platform: restart
name: "Restart"
icon: "mdi:restart"
globals:
- id: powerpal_daily_pulses_backup
type: int
restore_value: true
http_request:
id: powerpal_cloud_uploader
verify_ssl: false
sensor:
- platform: powerpal_ble
id: powerpal_ble_sensor
ble_client_id: powerpal
power:
name: "Powerpal Power"
daily_energy:
name: "Powerpal Daily Energy"
daily_pulses:
name: "Powerpal Daily Pulses"
energy:
name: "Powerpal Total Energy"
battery_level:
name: "Powerpal Battery"
watt_hours:
name: "Powerpal Watt Hours_json"
cost:
name: "Powerpal Cost_json"
timestamp:
name: "Powerpal Timestamp_json"
pulses:
name: "Powerpal Pulses_json"
pairing_code: XXXXXX #PUT THE PAIRING CODE FOUND WITH YOUR POWERPAL HERE
notification_interval: 1
pulses_per_kwh: 1000
time_id: homeassistant_time
#powerpal_apikey: XXX
# powerpal_device_id: XXX
# http_request_id: powerpal_cloud_uploader
# cost_per_kwh: 0.30 #dollars per kWh
- platform: homeassistant
id: ha_daily_pulses
entity_id: sensor.powerpal_daily_pulses
on_value:
then:
- globals.set:
id: powerpal_daily_pulses_backup
value: !lambda 'return int(x);'
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: !secret esphome_api_encryption_key
ota:
platform: esphome
password: “XXX”
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Powerpal Fallback Hotspot"
password: “XXX”
preferences:
flash_write_interval: 10min
I never did manage to get uploader working but it’s working fine otherwise.
NOTE 2025.6.0 was broken for me, 2025.6.1 has the fixes introduced.
Since the upgrade, the intergration only works when a device that uses high amount of energy like dishwasher or washing machine is turned on. I get readings for about 3 or 4 hours and then nothing. Wish it would just work 24/7. Getting fed up and ready to ditch this project.
That’s unlikely to be esphome version related. You can always downgrade the esphome version to test your theory.
I did have an issue with my electricity metre where it stopped flashing the light for a good 6 months or more. I got 2 warranty replacement powerpals to during that time then gave up on it completely.
Until I was doing a manual metre check a few months later and noticed the light was back to normal flashing mode.
Hi Guys,
i was using the powerpal cloud uploader automation using the rest_command feature which was working perfectly fine until now.
After upgrading HA to 2025.7.0 and ESPHome to 2025.6.3 I realised the cloud uploader has stopped working.
i am getting a 400 Bad Request error in the logs. is anyone else getting it too?
[homeassistant.components.rest_command] Error. Url: https://readings.powerpal.net/api/v1/meter_reading/0004xxxx. Status code 400. Payload: b'[ {"cost":"0.0","is_peak": false, "pulses":"0.0", "timestamp": 1751591220, "watt_hours": "0.0" } ]'
rest_command:
my_request:
url: https://readings.powerpal.net/api/v1/meter_reading/0004xxxx
method: POST
headers:
authorization: "authorization key"
accept: ""
payload: >-
[ {"cost":{{ states.sensor.esphome_powerpal_cost_json.state | to_json }},"is_peak": false, "pulses":{{ states.sensor.esphome_powerpal_pulses_json.state | to_json }}, "timestamp": {{ as_timestamp(now(),0) | int(0) | to_json }}, "watt_hours": {{ states.sensor.esphome_powerpal_watt_hours_json.state | to_json }} } ]
content_type: "application/json"
verify_ssl: true
Yes, I am on HA core 2025.7.1 and ESPHome 2025.6.3 and I have been seeing multiple reports of a similar error over the past couple of days …
Error. Url: https://readings.powerpal.net/api/v1/meter_reading/0002XXxX. Status code 400. Payload: b'[ {"cost":0.00323840021155775,"is_peak": false, "pulses":16.0, "timestamp": 1751693160 , "watt_hours": 16.0 } ]'
I have no idea what it really means, nor how to fix it … ![]()
ok good, so it’s not a local issue to me.
I had an issue last night where I had a very large spike in consumption being reported in Home Assistant Energy dashboard. Turns out it is the Powerpal ESP home sensor being reset to zero suddenly, then jumping back up to its correct accumulated daily consumption value a minute later.
The Energy dashboard gets confused thinking I consumed the days worth of energy AGAIN in a single minute and basically doubles the total kWh used for the day.
Anyone else seen these types of erroneous readings from the Powerpal ESPHome sensor?
Ideally, any readings which are below the previous count would be dropped in the powerpal_ble component at GitHub - muneeb1990/esphome: ESPHome is a system to control your ESP8266/ESP32 by simple yet powerful configuration files and control them remotely through Home Automation systems. I can alternatively handle this in Home Asistant by adding another sensor and filtering out any readings that are not equal or above the previous reading but it is clearly mroe elegant to have it happen prior to reporting it to HASS.
It looks like there was a change in the http handler in this version and it broke a few other integrations too.
Those seem to have been fixed before 2025.7.0 was released but this on is still failing.
Someone should really raise a GitHub issue for this on the rest integration otherwise it’s unlikely to get noticed by the devs
How did you manage to get the values to go back to the original value? I tried setting that up but on every esp restart it just resets back to 0
I chose to ignore it as daily stats are still accurate just the current total reading is out till the next day.
I have done nothing. I was only alerted because HASS was showing a whopping day’s consumption and there was a big spike in usage between 9pm and 10pm when there should have been very litle.
I’ve chased it a bit with ChatGPT.
This SQL works in the SQLite Web addon to show when it has happened in the past that the sensor has reported a reduced value.
WITH powerpal_states AS (
SELECT
s.state_id,
sm.entity_id,
s.state,
s.last_updated_ts,
ROW_NUMBER() OVER (PARTITION BY sm.entity_id ORDER BY s.last_updated_ts) AS row_num
FROM states s
JOIN states_meta sm ON s.metadata_id = sm.metadata_id
WHERE sm.entity_id = 'sensor.powerpal_gateway_powerpal_total_energy'
AND s.state IS NOT NULL
AND s.state != ''
AND s.state NOT IN ('unavailable', 'unknown')
)
SELECT
curr.state_id AS drop_state_id,
datetime(curr.last_updated_ts, 'unixepoch') AS drop_time,
datetime(prev.last_updated_ts, 'unixepoch') AS previous_time,
curr.state AS new_state,
prev.state AS previous_state,
ROUND(CAST(curr.state AS FLOAT) - CAST(prev.state AS FLOAT), 5) AS delta
FROM powerpal_states curr
JOIN powerpal_states prev
ON curr.row_num = prev.row_num + 1
WHERE CAST(curr.state AS FLOAT) < CAST(prev.state AS FLOAT)
ORDER BY drop_time DESC
LIMIT 50;