diff --git a/ENTSO-E-PRICES-MIGRATION.md b/ENTSO-E-PRICES-MIGRATION.md index 27365d8..9a27bd9 100644 --- a/ENTSO-E-PRICES-MIGRATION.md +++ b/ENTSO-E-PRICES-MIGRATION.md @@ -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 \ No newline at end of file +- [ ] 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