mirror of
https://github.com/Legolas-2025/EPrices.git
synced 2026-08-18 12:44:51 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
420a745129 | ||
|
|
70c0abcf9e | ||
|
|
8c68afdc80 | ||
|
|
951d99bca1 |
+69
-8
@@ -1,5 +1,65 @@
|
||||
# EPrices – Changelog
|
||||
|
||||
## v1.2.1 — 2026-04-07
|
||||
|
||||
### ESP32 main task stack size increase
|
||||
|
||||
Increased the FreeRTOS main application task stack from the ESP-IDF default
|
||||
of 8192 bytes to 16384 bytes. This eliminates the stack overflow scenario
|
||||
that most likely caused the spontaneous reboot observed in production on
|
||||
2026-04-06, where the FreeRTOS idle task faulted following memory pressure
|
||||
during a simultaneous NVS load and HTTP fetch/parse cycle.
|
||||
|
||||
The 8 KB cost is well within the ESP32's 320 KB available RAM.
|
||||
|
||||
**Changed location in `eprices.yaml`:**
|
||||
- `esp32: framework: sdkconfig_options:` — added
|
||||
`CONFIG_ESP_MAIN_TASK_STACK_SIZE: "16384"`
|
||||
|
||||
---
|
||||
|
||||
### Price vector heap pre-allocation at boot
|
||||
|
||||
Pre-allocated capacity for all four price vectors at boot using `.reserve(96)`.
|
||||
Previously, each vector started empty and grew incrementally on every NVS load
|
||||
and HTTP fetch, triggering repeated heap reallocations and leaving the heap
|
||||
fragmented before the first fetch cycle completed.
|
||||
|
||||
With capacity reserved upfront, no reallocation occurs during any subsequent
|
||||
NVS load or HTTP parse operation. This reduces heap fragmentation and peak
|
||||
allocation spikes, particularly during the boot sequence where NVS load and
|
||||
the first HTTP fetch can overlap.
|
||||
|
||||
**Vectors pre-allocated:**
|
||||
- `price_timestamps_today`
|
||||
- `price_values_today`
|
||||
- `price_timestamps_tomorrow`
|
||||
- `price_values_tomorrow`
|
||||
|
||||
**Changed location in `eprices.yaml`:**
|
||||
- `on_boot:` lambda — added `.reserve(96)` on all four price vectors
|
||||
|
||||
---
|
||||
|
||||
### Hourly JSON sensor cleared state unified with 15-min sensors
|
||||
|
||||
The two hourly JSON text sensors previously published `"[]"` when cleared
|
||||
(at midnight bridge and on `clear_today_prices` / `clear_tomorrow_prices`).
|
||||
The six 15-minute JSON sensors already published `""` in the same situation.
|
||||
All eight JSON sensors now publish `""` when cleared, giving consistent
|
||||
behaviour across the full sensor set.
|
||||
|
||||
**Affected sensors:**
|
||||
- `Today JSON Hourly Prices EUR⁄kWh`
|
||||
- `Tomorrow JSON Hourly Prices EUR⁄kWh`
|
||||
|
||||
**Changed locations in `eprices.yaml`:**
|
||||
- `clear_today_prices` script — `"[]"` → `""`
|
||||
- `clear_tomorrow_prices` script — `"[]"` → `""`
|
||||
- `midnight_bridge_promotion` script — `"[]"` → `""` (where applicable)
|
||||
|
||||
---
|
||||
|
||||
## v1.2 — 2026-04-06
|
||||
|
||||
### HTTP fetch stuck-flag watchdog
|
||||
@@ -179,10 +239,10 @@ eprices_vat_rate # e.g. "0.22" (VAT rate as decimal multiplier)
|
||||
|
||||
| Name | Entity ID | Notes |
|
||||
|---|---|---|
|
||||
| Today JSON Hourly Prices EUR⁄kWh | `sensor.eprices_today_json_hourly_prices_eur_kwh` | JSON array, 24 values |
|
||||
| Today JSON 15-Min Prices EUR⁄kWh (P1 00:00-07:45) | `sensor.eprices_today_json_15_min_prices_eur_kwh_p1_00_00_07_45` | JSON array, 32 values |
|
||||
| Today JSON 15-Min Prices EUR⁄kWh (P2 08:00-15:45) | `sensor.eprices_today_json_15_min_prices_eur_kwh_p2_08_00_15_45` | JSON array, 32 values |
|
||||
| Today JSON 15-Min Prices EUR⁄kWh (P3 16:00-23:45) | `sensor.eprices_today_json_15_min_prices_eur_kwh_p3_16_00_23_45` | JSON array, 32 values |
|
||||
| Today JSON Hourly Prices EUR⁄kWh | `sensor.eprices_today_json_hourly_prices_eur_kwh` | JSON array, 24 values; `""` when no data |
|
||||
| Today JSON 15-Min Prices EUR⁄kWh (P1 00:00-07:45) | `sensor.eprices_today_json_15_min_prices_eur_kwh_p1_00_00_07_45` | JSON array, 32 values; `""` when no data |
|
||||
| Today JSON 15-Min Prices EUR⁄kWh (P2 08:00-15:45) | `sensor.eprices_today_json_15_min_prices_eur_kwh_p2_08_00_15_45` | JSON array, 32 values; `""` when no data |
|
||||
| Today JSON 15-Min Prices EUR⁄kWh (P3 16:00-23:45) | `sensor.eprices_today_json_15_min_prices_eur_kwh_p3_16_00_23_45` | JSON array, 32 values; `""` when no data |
|
||||
| Today Highest Price Time | `sensor.eprices_today_highest_price_time` | HH:MM |
|
||||
| Today Lowest Price Time | `sensor.eprices_today_lowest_price_time` | HH:MM |
|
||||
| Today Highest Hourly Price Time | `sensor.eprices_today_highest_hourly_price_time` | HH:00 |
|
||||
@@ -194,10 +254,10 @@ eprices_vat_rate # e.g. "0.22" (VAT rate as decimal multiplier)
|
||||
| Today Price Update Status Message | `sensor.eprices_today_price_update_status_message` | Detailed status string; diagnostic |
|
||||
| Today API Fetch Attempts | `sensor.eprices_today_api_fetch_attempts` | HTTP fetch count; resets at midnight; diagnostic |
|
||||
| Today Entry Count | `sensor.eprices_today_entry_count` | Number of stored price points; diagnostic |
|
||||
| Tomorrow JSON Hourly Prices EUR⁄kWh | `sensor.eprices_tomorrow_json_hourly_prices_eur_kwh` | JSON array, 24 values |
|
||||
| Tomorrow JSON 15-Min Prices EUR⁄kWh (P1 00:00-07:45) | `sensor.eprices_tomorrow_json_15_min_prices_eur_kwh_p1_00_00_07_45` | JSON array, 32 values |
|
||||
| Tomorrow JSON 15-Min Prices EUR⁄kWh (P2 08:00-15:45) | `sensor.eprices_tomorrow_json_15_min_prices_eur_kwh_p2_08_00_15_45` | JSON array, 32 values |
|
||||
| Tomorrow JSON 15-Min Prices EUR⁄kWh (P3 16:00-23:45) | `sensor.eprices_tomorrow_json_15_min_prices_eur_kwh_p3_16_00_23_45` | JSON array, 32 values |
|
||||
| Tomorrow JSON Hourly Prices EUR⁄kWh | `sensor.eprices_tomorrow_json_hourly_prices_eur_kwh` | JSON array, 24 values; `""` when no data |
|
||||
| Tomorrow JSON 15-Min Prices EUR⁄kWh (P1 00:00-07:45) | `sensor.eprices_tomorrow_json_15_min_prices_eur_kwh_p1_00_00_07_45` | JSON array, 32 values; `""` when no data |
|
||||
| Tomorrow JSON 15-Min Prices EUR⁄kWh (P2 08:00-15:45) | `sensor.eprices_tomorrow_json_15_min_prices_eur_kwh_p2_08_00_15_45` | JSON array, 32 values; `""` when no data |
|
||||
| Tomorrow JSON 15-Min Prices EUR⁄kWh (P3 16:00-23:45) | `sensor.eprices_tomorrow_json_15_min_prices_eur_kwh_p3_16_00_23_45` | JSON array, 32 values; `""` when no data |
|
||||
| Tomorrow Highest Price Time | `sensor.eprices_tomorrow_highest_price_time` | HH:MM |
|
||||
| Tomorrow Lowest Price Time | `sensor.eprices_tomorrow_lowest_price_time` | HH:MM |
|
||||
| Tomorrow Highest Hourly Price Time | `sensor.eprices_tomorrow_highest_hourly_price_time` | HH:00 |
|
||||
@@ -238,3 +298,4 @@ eprices_vat_rate # e.g. "0.22" (VAT rate as decimal multiplier)
|
||||
- **API fetch times** reset to `Never` at midnight bridge and on `clear_tomorrow_prices`
|
||||
- **API fetch attempt counters** reset to `0` at midnight and publish `0` immediately on boot
|
||||
- **Uptime** displayed as human-readable string: `45 s` / `5 min` / `3 h 22 min` / `12 d 4 h` / `4 months 12 d`
|
||||
- **JSON sensors** publish `""` (empty string) when no data is available — all eight JSON sensors behave consistently
|
||||
|
||||
+102
-76
@@ -85,96 +85,114 @@ The goal of EPrices was to:
|
||||
| Manual force update | Button | Button (unchanged) |
|
||||
| Midnight bridge | External HA automation at 00:00 | On-device `on_time: 00:00:00` |
|
||||
|
||||
---
|
||||
|
||||
### Sensor naming
|
||||
|
||||
All sensors were renamed with a systematic **Today / Tomorrow** prefix.
|
||||
The words "electricity" and "energy" were removed from all sensor names.
|
||||
"Next Day" was replaced with "Tomorrow" throughout.
|
||||
|
||||
> **Note on entity ID slugs:** HA derives entity IDs by lower-casing the
|
||||
> sensor name and replacing spaces and special characters with underscores.
|
||||
> The `⁄` character in JSON sensor names may have been rendered differently
|
||||
> by older ESPHome versions — verify those specific IDs against your actual
|
||||
> HA instance if needed.
|
||||
|
||||
---
|
||||
|
||||
#### Numeric sensors
|
||||
|
||||
| entso-e-prices v4.3.1 name | EPrices v1.0 name |
|
||||
|---|---|
|
||||
| `Current Electricity Price` | `Today Current Price` |
|
||||
| `Next Electricity Price` | `Today Next Price` |
|
||||
| `Average Electricity Price Today` | `Today Average Price` |
|
||||
| `Highest Electricity Price Today` | `Today Highest Price` |
|
||||
| `Lowest Electricity Price Today` | `Today Lowest Price` |
|
||||
| `Current Hourly Electricity Price` | `Today Current Hourly Price` |
|
||||
| `Next Hourly Electricity Price` | `Today Next Hourly Price` |
|
||||
| `Highest Hourly Electricity Price Today` | `Today Highest Hourly Price` |
|
||||
| `Lowest Hourly Electricity Price Today` | `Today Lowest Hourly Price` |
|
||||
| `Current Max Hourly Price Percentage` | `Today Current Max Hourly Price Percentage` |
|
||||
| `Daily Price Update Attempts` | `Today API Fetch Attempts` *(moved to text_sensor)* |
|
||||
| `Today Entry Count` | `Today Entry Count` *(moved to text_sensor)* |
|
||||
| `Next Day Current Electricity Price` | `Tomorrow Current Price` |
|
||||
| `Next Day Next Electricity Price` | `Tomorrow Next Price` |
|
||||
| `Average Electricity Price Tomorrow` | `Tomorrow Average Price` |
|
||||
| `Highest Electricity Price Tomorrow` | `Tomorrow Highest Price` |
|
||||
| `Lowest Electricity Price Tomorrow` | `Tomorrow Lowest Price` |
|
||||
| `Current Hourly Electricity Price Tomorrow` | `Tomorrow Current Hourly Price` |
|
||||
| `Next Hourly Electricity Price Tomorrow` | `Tomorrow Next Hourly Price` |
|
||||
| `Highest Hourly Electricity Price Tomorrow` | `Tomorrow Highest Hourly Price` |
|
||||
| `Lowest Hourly Electricity Price Tomorrow` | `Tomorrow Lowest Hourly Price` |
|
||||
| `Next Day Current Max Hourly Price Percentage` | `Tomorrow Current Max Hourly Price Percentage` |
|
||||
| `Next Day Price Update Attempts` | `Tomorrow API Fetch Attempts` *(moved to text_sensor)* |
|
||||
| `Tomorrow Entry Count` | `Tomorrow Entry Count` *(moved to text_sensor)* |
|
||||
| entso-e-prices v4.3.1 name | v4.3.1 entity ID | EPrices v1.2 name | EPrices v1.2 entity ID |
|
||||
|---|---|---|---|
|
||||
| `Current Electricity Price` | `sensor.entso_e_prices_current_electricity_price` | `Today Current Price` | `sensor.eprices_today_current_price` |
|
||||
| `Next Electricity Price` | `sensor.entso_e_prices_next_electricity_price` | `Today Next Price` | `sensor.eprices_today_next_price` |
|
||||
| `Average Electricity Price Today` | `sensor.entso_e_prices_average_electricity_price_today` | `Today Average Price` | `sensor.eprices_today_average_price` |
|
||||
| `Highest Electricity Price Today` | `sensor.entso_e_prices_highest_electricity_price_today` | `Today Highest Price` | `sensor.eprices_today_highest_price` |
|
||||
| `Lowest Electricity Price Today` | `sensor.entso_e_prices_lowest_electricity_price_today` | `Today Lowest Price` | `sensor.eprices_today_lowest_price` |
|
||||
| `Current Hourly Electricity Price` | `sensor.entso_e_prices_current_hourly_electricity_price` | `Today Current Hourly Price` | `sensor.eprices_today_current_hourly_price` |
|
||||
| `Next Hourly Electricity Price` | `sensor.entso_e_prices_next_hourly_electricity_price` | `Today Next Hourly Price` | `sensor.eprices_today_next_hourly_price` |
|
||||
| `Highest Hourly Electricity Price Today` | `sensor.entso_e_prices_highest_hourly_electricity_price_today` | `Today Highest Hourly Price` | `sensor.eprices_today_highest_hourly_price` |
|
||||
| `Lowest Hourly Electricity Price Today` | `sensor.entso_e_prices_lowest_hourly_electricity_price_today` | `Today Lowest Hourly Price` | `sensor.eprices_today_lowest_hourly_price` |
|
||||
| `Current Max Hourly Price Percentage` | `sensor.entso_e_prices_current_max_hourly_price_percentage` | `Today Current Max Hourly Price Percentage` | `sensor.eprices_today_current_max_hourly_price_percentage` |
|
||||
| `Daily Price Update Attempts` | `sensor.entso_e_prices_daily_price_update_attempts` | `Today API Fetch Attempts` *(moved to text_sensor)* | `sensor.eprices_today_api_fetch_attempts` |
|
||||
| `Today Entry Count` | `sensor.entso_e_prices_today_entry_count` | `Today Entry Count` *(moved to text_sensor)* | `sensor.eprices_today_entry_count` |
|
||||
| `Next Day Current Electricity Price` | `sensor.entso_e_prices_next_day_current_electricity_price` | `Tomorrow Current Price` | `sensor.eprices_tomorrow_current_price` |
|
||||
| `Next Day Next Electricity Price` | `sensor.entso_e_prices_next_day_next_electricity_price` | `Tomorrow Next Price` | `sensor.eprices_tomorrow_next_price` |
|
||||
| `Average Electricity Price Tomorrow` | `sensor.entso_e_prices_average_electricity_price_tomorrow` | `Tomorrow Average Price` | `sensor.eprices_tomorrow_average_price` |
|
||||
| `Highest Electricity Price Tomorrow` | `sensor.entso_e_prices_highest_electricity_price_tomorrow` | `Tomorrow Highest Price` | `sensor.eprices_tomorrow_highest_price` |
|
||||
| `Lowest Electricity Price Tomorrow` | `sensor.entso_e_prices_lowest_electricity_price_tomorrow` | `Tomorrow Lowest Price` | `sensor.eprices_tomorrow_lowest_price` |
|
||||
| `Current Hourly Electricity Price Tomorrow` | `sensor.entso_e_prices_current_hourly_electricity_price_tomorrow` | `Tomorrow Current Hourly Price` | `sensor.eprices_tomorrow_current_hourly_price` |
|
||||
| `Next Hourly Electricity Price Tomorrow` | `sensor.entso_e_prices_next_hourly_electricity_price_tomorrow` | `Tomorrow Next Hourly Price` | `sensor.eprices_tomorrow_next_hourly_price` |
|
||||
| `Highest Hourly Electricity Price Tomorrow` | `sensor.entso_e_prices_highest_hourly_electricity_price_tomorrow` | `Tomorrow Highest Hourly Price` | `sensor.eprices_tomorrow_highest_hourly_price` |
|
||||
| `Lowest Hourly Electricity Price Tomorrow` | `sensor.entso_e_prices_lowest_hourly_electricity_price_tomorrow` | `Tomorrow Lowest Hourly Price` | `sensor.eprices_tomorrow_lowest_hourly_price` |
|
||||
| `Next Day Current Max Hourly Price Percentage` | `sensor.entso_e_prices_next_day_current_max_hourly_price_percentage` | `Tomorrow Current Max Hourly Price Percentage` | `sensor.eprices_tomorrow_current_max_hourly_price_percentage` |
|
||||
| `Next Day Price Update Attempts` | `sensor.entso_e_prices_next_day_price_update_attempts` | `Tomorrow API Fetch Attempts` *(moved to text_sensor)* | `sensor.eprices_tomorrow_api_fetch_attempts` |
|
||||
| `Tomorrow Entry Count` | `sensor.entso_e_prices_tomorrow_entry_count` | `Tomorrow Entry Count` *(moved to text_sensor)* | `sensor.eprices_tomorrow_entry_count` |
|
||||
|
||||
---
|
||||
|
||||
#### Text sensors
|
||||
|
||||
| entso-e-prices v4.3.1 name | EPrices v1.0 name |
|
||||
|---|---|
|
||||
| `ENTSO-E Hourly Prices EUR⁄kWh JSON` | `Today JSON Hourly Prices EUR⁄kWh` |
|
||||
| `ENTSO-E 15-Min Prices EUR⁄kWh JSON (P1 00:00-07:45)` | `Today JSON 15-Min Prices EUR⁄kWh (P1 00:00-07:45)` |
|
||||
| `ENTSO-E 15-Min Prices EUR⁄kWh JSON (P2 08:00-15:45)` | `Today JSON 15-Min Prices EUR⁄kWh (P2 08:00-15:45)` |
|
||||
| `ENTSO-E 15-Min Prices EUR⁄kWh JSON (P3 16:00-23:45)` | `Today JSON 15-Min Prices EUR⁄kWh (P3 16:00-23:45)` |
|
||||
| `Time Of Highest Energy Price Today` | `Today Highest Price Time` |
|
||||
| `Time Of Lowest Energy Price Today` | `Today Lowest Price Time` |
|
||||
| `Time Of Highest Hourly Energy Price Today` | `Today Highest Hourly Price Time` |
|
||||
| `Time Of Lowest Hourly Energy Price Today` | `Today Lowest Hourly Price Time` |
|
||||
| `Price Update Status` | `Today Price Update Status` |
|
||||
| `Last Price Update Time` | `Today Data Loaded Time` |
|
||||
| `Price Update Status Message` | `Today Price Update Status Message` |
|
||||
| `Current Price Status` | `Today Current Price Status` |
|
||||
| `ENTSO-E Next Day Hourly Prices EUR⁄kWh JSON` | `Tomorrow JSON Hourly Prices EUR⁄kWh` |
|
||||
| `ENTSO-E Next Day 15-Min Prices EUR⁄kWh JSON (P1 00:00-07:45)` | `Tomorrow JSON 15-Min Prices EUR⁄kWh (P1 00:00-07:45)` |
|
||||
| `ENTSO-E Next Day 15-Min Prices EUR⁄kWh JSON (P2 08:00-15:45)` | `Tomorrow JSON 15-Min Prices EUR⁄kWh (P2 08:00-15:45)` |
|
||||
| `ENTSO-E Next Day 15-Min Prices EUR⁄kWh JSON (P3 16:00-23:45)` | `Tomorrow JSON 15-Min Prices EUR⁄kWh (P3 16:00-23:45)` |
|
||||
| `Time Of Highest Energy Price Tomorrow` | `Tomorrow Highest Price Time` |
|
||||
| `Time Of Lowest Energy Price Tomorrow` | `Tomorrow Lowest Price Time` |
|
||||
| `Time Of Highest Hourly Energy Price Tomorrow` | `Tomorrow Highest Hourly Price Time` |
|
||||
| `Time Of Lowest Hourly Energy Price Tomorrow` | `Tomorrow Lowest Hourly Price Time` |
|
||||
| `Next Day Price Update Status` | `Tomorrow Price Update Status` |
|
||||
| `Next Day Last Price Update Time` | `Tomorrow Data Loaded Time` |
|
||||
| `Next Day Price Update Status Message` | `Tomorrow Price Update Status Message` |
|
||||
| `Next Day Current Price Status` | `Tomorrow Current Price Status` |
|
||||
| `ENTSO-E Last Reboot` | `Last Reboot` |
|
||||
| `Entso-E Today NVS Status` | `Today NVS Status` |
|
||||
| `Entso-E Tomorrow NVS Status` | `Tomorrow NVS Status` |
|
||||
| `ENTSO-E Last Update Source` | `Last Update Source` |
|
||||
| `Today Data Date` | `Today Data Date` *(unchanged)* |
|
||||
| `Tomorrow Data Date` | `Tomorrow Data Date` *(unchanged)* |
|
||||
| entso-e-prices v4.3.1 name | v4.3.1 entity ID | EPrices v1.2 name | EPrices v1.2 entity ID |
|
||||
|---|---|---|---|
|
||||
| `ENTSO-E Hourly Prices EUR⁄kWh JSON` | `sensor.entso_e_prices_entso_e_hourly_prices_eur_kwh_json` | `Today JSON Hourly Prices EUR⁄kWh` | `sensor.eprices_today_json_hourly_prices_eur_kwh` |
|
||||
| `ENTSO-E 15-Min Prices EUR⁄kWh JSON (P1 00:00-07:45)` | `sensor.entso_e_prices_entso_e_15_min_prices_eur_kwh_json_p1_00_00_07_45` | `Today JSON 15-Min Prices EUR⁄kWh (P1 00:00-07:45)` | `sensor.eprices_today_json_15_min_prices_eur_kwh_p1_00_00_07_45` |
|
||||
| `ENTSO-E 15-Min Prices EUR⁄kWh JSON (P2 08:00-15:45)` | `sensor.entso_e_prices_entso_e_15_min_prices_eur_kwh_json_p2_08_00_15_45` | `Today JSON 15-Min Prices EUR⁄kWh (P2 08:00-15:45)` | `sensor.eprices_today_json_15_min_prices_eur_kwh_p2_08_00_15_45` |
|
||||
| `ENTSO-E 15-Min Prices EUR⁄kWh JSON (P3 16:00-23:45)` | `sensor.entso_e_prices_entso_e_15_min_prices_eur_kwh_json_p3_16_00_23_45` | `Today JSON 15-Min Prices EUR⁄kWh (P3 16:00-23:45)` | `sensor.eprices_today_json_15_min_prices_eur_kwh_p3_16_00_23_45` |
|
||||
| `Time Of Highest Energy Price Today` | `sensor.entso_e_prices_time_of_highest_energy_price_today` | `Today Highest Price Time` | `sensor.eprices_today_highest_price_time` |
|
||||
| `Time Of Lowest Energy Price Today` | `sensor.entso_e_prices_time_of_lowest_energy_price_today` | `Today Lowest Price Time` | `sensor.eprices_today_lowest_price_time` |
|
||||
| `Time Of Highest Hourly Energy Price Today` | `sensor.entso_e_prices_time_of_highest_hourly_energy_price_today` | `Today Highest Hourly Price Time` | `sensor.eprices_today_highest_hourly_price_time` |
|
||||
| `Time Of Lowest Hourly Energy Price Today` | `sensor.entso_e_prices_time_of_lowest_hourly_energy_price_today` | `Today Lowest Hourly Price Time` | `sensor.eprices_today_lowest_hourly_price_time` |
|
||||
| `Price Update Status` | `sensor.entso_e_prices_price_update_status` | `Today Price Update Status` | `sensor.eprices_today_price_update_status` |
|
||||
| `Last Price Update Time` | `sensor.entso_e_prices_last_price_update_time` | `Today Data Loaded Time` | `sensor.eprices_today_data_loaded_time` |
|
||||
| `Price Update Status Message` | `sensor.entso_e_prices_price_update_status_message` | `Today Price Update Status Message` | `sensor.eprices_today_price_update_status_message` |
|
||||
| `Current Price Status` | `sensor.entso_e_prices_current_price_status` | `Today Current Price Status` | `sensor.eprices_today_current_price_status` |
|
||||
| `ENTSO-E Next Day Hourly Prices EUR⁄kWh JSON` | `sensor.entso_e_prices_entso_e_next_day_hourly_prices_eur_kwh_json` | `Tomorrow JSON Hourly Prices EUR⁄kWh` | `sensor.eprices_tomorrow_json_hourly_prices_eur_kwh` |
|
||||
| `ENTSO-E Next Day 15-Min Prices EUR⁄kWh JSON (P1 00:00-07:45)` | `sensor.entso_e_prices_entso_e_next_day_15_min_prices_eur_kwh_json_p1_00_00_07_45` | `Tomorrow JSON 15-Min Prices EUR⁄kWh (P1 00:00-07:45)` | `sensor.eprices_tomorrow_json_15_min_prices_eur_kwh_p1_00_00_07_45` |
|
||||
| `ENTSO-E Next Day 15-Min Prices EUR⁄kWh JSON (P2 08:00-15:45)` | `sensor.entso_e_prices_entso_e_next_day_15_min_prices_eur_kwh_json_p2_08_00_15_45` | `Tomorrow JSON 15-Min Prices EUR⁄kWh (P2 08:00-15:45)` | `sensor.eprices_tomorrow_json_15_min_prices_eur_kwh_p2_08_00_15_45` |
|
||||
| `ENTSO-E Next Day 15-Min Prices EUR⁄kWh JSON (P3 16:00-23:45)` | `sensor.entso_e_prices_entso_e_next_day_15_min_prices_eur_kwh_json_p3_16_00_23_45` | `Tomorrow JSON 15-Min Prices EUR⁄kWh (P3 16:00-23:45)` | `sensor.eprices_tomorrow_json_15_min_prices_eur_kwh_p3_16_00_23_45` |
|
||||
| `Time Of Highest Energy Price Tomorrow` | `sensor.entso_e_prices_time_of_highest_energy_price_tomorrow` | `Tomorrow Highest Price Time` | `sensor.eprices_tomorrow_highest_price_time` |
|
||||
| `Time Of Lowest Energy Price Tomorrow` | `sensor.entso_e_prices_time_of_lowest_energy_price_tomorrow` | `Tomorrow Lowest Price Time` | `sensor.eprices_tomorrow_lowest_price_time` |
|
||||
| `Time Of Highest Hourly Energy Price Tomorrow` | `sensor.entso_e_prices_time_of_highest_hourly_energy_price_tomorrow` | `Tomorrow Highest Hourly Price Time` | `sensor.eprices_tomorrow_highest_hourly_price_time` |
|
||||
| `Time Of Lowest Hourly Energy Price Tomorrow` | `sensor.entso_e_prices_time_of_lowest_hourly_energy_price_tomorrow` | `Tomorrow Lowest Hourly Price Time` | `sensor.eprices_tomorrow_lowest_hourly_price_time` |
|
||||
| `Next Day Price Update Status` | `sensor.entso_e_prices_next_day_price_update_status` | `Tomorrow Price Update Status` | `sensor.eprices_tomorrow_price_update_status` |
|
||||
| `Next Day Last Price Update Time` | `sensor.entso_e_prices_next_day_last_price_update_time` | `Tomorrow Data Loaded Time` | `sensor.eprices_tomorrow_data_loaded_time` |
|
||||
| `Next Day Price Update Status Message` | `sensor.entso_e_prices_next_day_price_update_status_message` | `Tomorrow Price Update Status Message` | `sensor.eprices_tomorrow_price_update_status_message` |
|
||||
| `Next Day Current Price Status` | `sensor.entso_e_prices_next_day_current_price_status` | `Tomorrow Current Price Status` | `sensor.eprices_tomorrow_current_price_status` |
|
||||
| `ENTSO-E Last Reboot` | `sensor.entso_e_prices_entso_e_last_reboot` | `Last Reboot` | `sensor.eprices_last_reboot` |
|
||||
| `Entso-E Today NVS Status` | `sensor.entso_e_prices_entso_e_today_nvs_status` | `Today NVS Status` | `sensor.eprices_today_nvs_status` |
|
||||
| `Entso-E Tomorrow NVS Status` | `sensor.entso_e_prices_entso_e_tomorrow_nvs_status` | `Tomorrow NVS Status` | `sensor.eprices_tomorrow_nvs_status` |
|
||||
| `ENTSO-E Last Update Source` | `sensor.entso_e_prices_entso_e_last_update_source` | `Last Update Source` | `sensor.eprices_last_update_source` |
|
||||
| `Today Data Date` | `sensor.entso_e_prices_today_data_date` | `Today Data Date` *(unchanged)* | `sensor.eprices_today_data_date` |
|
||||
| `Tomorrow Data Date` | `sensor.entso_e_prices_tomorrow_data_date` | `Tomorrow Data Date` *(unchanged)* | `sensor.eprices_tomorrow_data_date` |
|
||||
|
||||
---
|
||||
|
||||
#### Buttons
|
||||
|
||||
| entso-e-prices v4.3.1 name | EPrices v1.0 name |
|
||||
|---|---|
|
||||
| `Entso-E Force Update` | `Force Today's Update` |
|
||||
| `Entso-E Force Next Day Update` | `Force Tomorrow's Update` |
|
||||
| `Entso-E Reboot Device` | `Reboot Device` |
|
||||
| entso-e-prices v4.3.1 name | v4.3.1 entity ID | EPrices v1.2 name | EPrices v1.2 entity ID |
|
||||
|---|---|---|---|
|
||||
| `Entso-E Force Update` | `button.entso_e_prices_entso_e_force_update` | `Force Today's Update` | `button.eprices_force_today_s_update` |
|
||||
| `Entso-E Force Next Day Update` | `button.entso_e_prices_entso_e_force_next_day_update` | `Force Tomorrow's Update` | `button.eprices_force_tomorrow_s_update` |
|
||||
| `Entso-E Reboot Device` | `button.entso_e_prices_entso_e_reboot_device` | `Reboot Device` | `button.eprices_reboot_device` |
|
||||
|
||||
---
|
||||
|
||||
### New sensors in EPrices v1.0 (no equivalent in v4.3.1)
|
||||
|
||||
| Sensor | Purpose |
|
||||
|---|---|
|
||||
| `Today Last API Fetch Time` | Timestamp of last successful HTTP fetch for today |
|
||||
| `Tomorrow Last API Fetch Time` | Timestamp of last successful HTTP fetch for tomorrow |
|
||||
| `WiFi Signal` | RSSI in dBm |
|
||||
| `Uptime` | Human-readable uptime string |
|
||||
| EPrices v1.2 name | EPrices v1.2 entity ID | Purpose |
|
||||
|---|---|---|
|
||||
| `Today Last API Fetch Time` | `sensor.eprices_today_last_api_fetch_time` | Timestamp of last successful HTTP fetch for today |
|
||||
| `Tomorrow Last API Fetch Time` | `sensor.eprices_tomorrow_last_api_fetch_time` | Timestamp of last successful HTTP fetch for tomorrow |
|
||||
| `WiFi Signal` | `sensor.eprices_wifi_signal` | RSSI in dBm |
|
||||
| `Uptime` | `sensor.eprices_uptime` | Human-readable uptime string |
|
||||
|
||||
---
|
||||
|
||||
### Sensor output changes
|
||||
|
||||
| Sensor | v4.3.1 output | EPrices v1.0 output |
|
||||
| Sensor | v4.3.1 output | EPrices v1.2 output |
|
||||
|---|---|---|
|
||||
| `Last Reboot` | `Last reboot: 2026-04-04 20:10:10` | `2026-04-04 20:10:10` |
|
||||
| `Today NVS Status` | `Today NVS: Stored 96 pts for 2026-04-04` | `Stored 96 pts for 2026-04-04` |
|
||||
@@ -186,23 +204,30 @@ The words "electricity" and "energy" were removed from all sensor names.
|
||||
| `Today Current Price Status` | `Valid` / `Missing` | `Valid` / `Missing` / `Stale` |
|
||||
| `Today Data Loaded Time` | Stamped on HTTP fetch only | Stamped on NVS load and HTTP fetch |
|
||||
| `Tomorrow Data Loaded Time` | `Never` after NVS boot load | Stamped on NVS load and HTTP fetch |
|
||||
| `Tomorrow Price Update Status Message` | *(various)* | `"No data yet"` on boot / after reboot (v1.2) |
|
||||
|
||||
---
|
||||
|
||||
### HA entity ID changes
|
||||
|
||||
All entity IDs changed due to the node name change from `entso-e-prices` to `eprices`.
|
||||
|
||||
**Find and replace in all your automations and dashboards:**
|
||||
**Step 1 — bulk find and replace in all your automations and dashboards:**
|
||||
```
|
||||
sensor.entso_e_prices_ → sensor.eprices_
|
||||
button.entso_e_prices_ → button.eprices_
|
||||
```
|
||||
|
||||
Then apply the individual sensor name slug changes from the tables above.
|
||||
**Step 2 — apply the individual sensor name slug renames** from the tables above
|
||||
for sensors whose names changed (not just the prefix).
|
||||
|
||||
> **Tip:** After the bulk replace in Step 1, search for any remaining
|
||||
> `entso_e_prices_` strings to catch any that were missed.
|
||||
|
||||
### NVS data
|
||||
|
||||
The NVS namespace changed from `entsoe2` to `eprices`. On first boot after
|
||||
flashing EPrices v1.0 the device will not find any stored data and will
|
||||
flashing EPrices the device will not find any stored data and will
|
||||
trigger a fresh HTTP fetch automatically. This is expected and safe.
|
||||
No manual NVS erase is required.
|
||||
|
||||
@@ -211,9 +236,10 @@ No manual NVS erase is required.
|
||||
## Migration checklist
|
||||
|
||||
- [ ] Flash `eprices.yaml` to the device
|
||||
- [ ] Update `secrets.yaml` — rename all `entsoe_` keys to `eprices_`; add `eprices_prov_fee` and `eprices_vat_rate`
|
||||
- [ ] In all HA automations: replace `entso_e_prices_` with `eprices_` in all entity IDs
|
||||
- [ ] Apply individual sensor name slug renames from the tables above
|
||||
- [ ] Update `secrets.yaml` — rename all `entsoe_` keys to `eprices_`; add `eprices_prov_fee`, `eprices_vat_rate`, and `eprices_neg_prov_fee`
|
||||
- [ ] In all HA automations: bulk replace `sensor.entso_e_prices_` → `sensor.eprices_` and `button.entso_e_prices_` → `button.eprices_`
|
||||
- [ ] Apply individual sensor slug renames from the tables above for sensors whose names changed
|
||||
- [ ] Remove any external HA automations that handled midnight bridge, boot recovery, or fetch scheduling — these are now all on-device
|
||||
- [ ] Verify the device fetches fresh data on first boot (check `Today NVS Status` and `Today Price Update Status Message`)
|
||||
- [ ] Update any HA dashboard cards referencing old entity IDs
|
||||
- [ ] Verify the JSON sensor entity IDs in dashboards — the `⁄` character slug may differ from expected; check against actual HA entity registry if needed
|
||||
|
||||
+31
-2
@@ -1,5 +1,35 @@
|
||||
# EPrices – Version History
|
||||
|
||||
## v1.2.1 — 2026-04-07
|
||||
|
||||
Stability and housekeeping patch. No new sensors, no secrets changes,
|
||||
no entity ID changes. Drop-in replacement for v1.2.
|
||||
|
||||
### ESP32 main task stack size increase
|
||||
|
||||
Doubled the FreeRTOS main task stack from 8192 to 16384 bytes via
|
||||
`CONFIG_ESP_MAIN_TASK_STACK_SIZE`. Eliminates the stack overflow scenario
|
||||
most likely responsible for the spontaneous reboot observed in production
|
||||
on 2026-04-06 during a simultaneous NVS load + HTTP fetch/parse cycle.
|
||||
|
||||
### Price vector heap pre-allocation at boot
|
||||
|
||||
Added `.reserve(96)` on all four price vectors (`price_timestamps_today`,
|
||||
`price_values_today`, `price_timestamps_tomorrow`, `price_values_tomorrow`)
|
||||
in the `on_boot` lambda. Prevents repeated heap reallocation during NVS load
|
||||
and HTTP parse operations, reducing heap fragmentation and peak allocation
|
||||
pressure during the boot sequence.
|
||||
|
||||
### Hourly JSON sensor cleared state unified
|
||||
|
||||
`Today JSON Hourly Prices EUR⁄kWh` and `Tomorrow JSON Hourly Prices EUR⁄kWh`
|
||||
now publish `""` when cleared, matching the existing behaviour of all six
|
||||
15-minute JSON sensors. Previously they published `"[]"`.
|
||||
|
||||
See `CHANGELOG.md` for full implementation details.
|
||||
|
||||
---
|
||||
|
||||
## v1.2 — 2026-04-06
|
||||
|
||||
### HTTP fetch stuck-flag watchdog
|
||||
@@ -25,8 +55,7 @@ sensor to undercount after the first scheduled attempt at 13:25.
|
||||
### Status message improvements
|
||||
|
||||
- `tomorrow_update_status_message` initial value changed from
|
||||
`"Waiting for 13:20"` to `"No data yet"` — removes misleading time
|
||||
reference shown after afternoon reboots
|
||||
`"Waiting for 13:20"` to `"No data yet"`
|
||||
- `clear_tomorrow_prices` end message changed from
|
||||
`"Cleared – awaiting next 13:20 window"` to
|
||||
`"Cleared – awaiting fetch window"`
|
||||
|
||||
+22
-3
@@ -1,9 +1,20 @@
|
||||
# =============================================================================
|
||||
# ESPHome: EPrices v1.2
|
||||
# ESPHome: EPrices v1.2.1
|
||||
#
|
||||
# Electricity price data provided by Energy-Charts (https://energy-charts.info)
|
||||
# under CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/).
|
||||
#
|
||||
# v1.2.1 changes (2026-04-07):
|
||||
# - CONFIG_ESP_MAIN_TASK_STACK_SIZE raised from 8192 to 16384 bytes via
|
||||
# esp32: framework: sdkconfig_options — eliminates stack overflow scenario
|
||||
# observed in production during simultaneous NVS load + HTTP fetch/parse
|
||||
# - Price vectors pre-allocated at boot with .reserve(96) in on_boot lambda:
|
||||
# price_timestamps_today, price_values_today,
|
||||
# price_timestamps_tomorrow, price_values_tomorrow
|
||||
# prevents repeated heap reallocation during NVS load and HTTP parse cycles
|
||||
# - Hourly JSON sensors now publish "" when cleared (was "[]") —
|
||||
# consistent with all six 15-min JSON sensors
|
||||
#
|
||||
# v1.2 changes (2026-04-06):
|
||||
# - HTTP fetch stuck-flag watchdog (120 s) added to today and tomorrow workers:
|
||||
# if is_updating_today / is_updating_tomorrow stays true for >120 s (TCP
|
||||
@@ -86,11 +97,19 @@ esphome:
|
||||
} else {
|
||||
id(boot_time) = 0;
|
||||
}
|
||||
// Pre-allocate price vectors to avoid repeated heap reallocation
|
||||
// during NVS load and HTTP fetch/parse cycles
|
||||
id(price_timestamps_today).reserve(96);
|
||||
id(price_values_today).reserve(96);
|
||||
id(price_timestamps_tomorrow).reserve(96);
|
||||
id(price_values_tomorrow).reserve(96);
|
||||
|
||||
esp32:
|
||||
board: esp32dev
|
||||
framework:
|
||||
type: esp-idf
|
||||
sdkconfig_options:
|
||||
CONFIG_ESP_MAIN_TASK_STACK_SIZE: "16384"
|
||||
# No include_builtin_idf_components needed — nvs headers are always
|
||||
# available in esp-idf framework; eprices_nvs.h includes them directly.
|
||||
|
||||
@@ -2103,7 +2122,7 @@ script:
|
||||
id(today_current_max_hourly_price_percentage).publish_state(NAN);
|
||||
id(last_update_success) = false;
|
||||
id(update_status_message) = "Cleared – awaiting NVS or HTTP";
|
||||
id(json_hourly_prices_kwh).publish_state("[]");
|
||||
id(json_hourly_prices_kwh).publish_state("");
|
||||
id(json_15min_prices_kwh_p1_00_00_07_45).publish_state("");
|
||||
id(json_15min_prices_kwh_p2_08_00_15_45).publish_state("");
|
||||
id(json_15min_prices_kwh_p3_16_00_23_45).publish_state("");
|
||||
@@ -2136,7 +2155,7 @@ script:
|
||||
id(tomorrow_min_hourly_price).publish_state(NAN);
|
||||
id(tomorrow_max_hourly_price).publish_state(NAN);
|
||||
id(tomorrow_current_max_hourly_price_percentage).publish_state(NAN);
|
||||
id(json_tomorrow_hourly_prices_kwh).publish_state("[]");
|
||||
id(json_tomorrow_hourly_prices_kwh).publish_state("");
|
||||
id(json_tomorrow_15min_prices_kwh_p1_00_00_07_45).publish_state("");
|
||||
id(json_tomorrow_15min_prices_kwh_p2_08_00_15_45).publish_state("");
|
||||
id(json_tomorrow_15min_prices_kwh_p3_16_00_23_45).publish_state("");
|
||||
|
||||
Reference in New Issue
Block a user