Plošná ryba Spot (PR-SPOT)
Device page · Flash firmware from the browser
A traffic light for the spot electricity price. The LED ring glows green, yellow or red depending on the current price, the display shows the price and how long until it changes. Useful wherever you decide whether to start the washing machine, dishwasher or car charging now or wait.
- Ring of 12 WS2812B LEDs
- 1.3" OLED display (SH1106, 128x64)
- Price from Home Assistant, with a direct internet fallback when HA is not running
- Traffic light thresholds set from Home Assistant
- Handles 15-minute and hourly blocks (the OTE day-ahead market runs in 15-minute intervals since 1 October 2025)
- Powered from USB
What is in the box
- Jádro board
- Head with the LED ring and OLED display (ring on the HEAD connector, display on Qwiic)
- Enclosure
- USB-C cable
- Card with a link to this guide
A USB 5 V adapter is not included. Any common adapter rated at least 1 A will do.
Installation
- Plug the ring into the HEAD connector and the display with the Qwiic cable into either Qwiic connector on the board (if not connected from the factory).
- Put Spot where you will see it: kitchen, hallway, next to the washing machine.
- Connect the USB-C cable to the adapter. The ring needs 5 V from USB, it does not light up on battery.
Price from Home Assistant
Spot does not know the price by itself, it reads it from an entity in Home Assistant. You need an integration that brings OTE prices into HA. We mainly expect the community integration Czech Energy Spot Prices (installed through HACS):
- In HACS search for Czech Energy Spot Prices, install it and restart HA.
- Settings, Devices and services, Add integration, Czech Energy Spot Prices.
- Choose currency CZK and unit kWh. With 15-minute prices the entity gets the suffix
_15min.
By default Spot reads the entity sensor.current_spot_electricity_price. If your entity has a different ID, you have three options:
- Rename the entity in HA: Settings, Entities, open the price entity, gear icon, change the entity ID to
sensor.current_spot_electricity_price. The simplest way. - Template helper: create a template sensor with this ID that converts another entity, for example from CZK/MWh to CZK/kWh (
{{ states('sensor.my_price') | float / 1000 }}). - Own build: adopt the device in the ESPHome dashboard and add
substitutions: cena_entita: sensor.your_entityto the YAML.
Any other integration works too, as long as it provides a number in CZK/kWh (or the unit you set the thresholds in).
The device does not need permission to perform HA actions. Reading an entity state is enough.
Fallback without Home Assistant
When Home Assistant is not running or does not provide a price, Spot downloads prices itself from the public Energy-Charts API (Fraunhofer ISE, api.energy-charts.info), bidding zone CZ.
- According to Energy-Charts the data is licensed under CC BY 4.0 (source Bundesnetzagentur | SMARD.de), and use requires crediting Energy-Charts.info as the source. The device shows the source in the Price source entity. Status checked on 2026-10-22.
- Energy-Charts publishes prices in EUR/MWh. Spot converts them to CZK/kWh using the EUR/CZK rate entity. Update the rate now and then, a difference of 1 CZK moves the price by about 4 %.
- It downloads only when the HA price is missing, at most once every 10 minutes, and only as much data as needed (from now to 36 hours ahead). The API allows 2 requests per minute from one address.
- The device takes the time from the internet (SNTP), so the fallback needs working WiFi with internet access.
- Turn the fallback off with the Internet price fallback switch.
Fallback prices are the plain exchange price without VAT, distribution and supplier fees. If your HA integration calculates the final price, the values will differ, so set the thresholds accordingly.
Connecting to WiFi
- From the browser over USB: open https://plosnaryba.cz/firmware in Chrome or Edge, connect Spot to the computer with a USB-C cable, click Connect and enter your WiFi name and password (Improv).
- Over Bluetooth in Home Assistant: if HA has Bluetooth (an adapter or an ESPHome Bluetooth proxy), it offers the new device for WiFi setup. Enter the details and confirm the pairing by pressing the BOOT button on Spot. Without the BOOT press the device does not accept WiFi credentials, so nobody can set it up without having it in hand.
The device has no fallback WiFi network and no default password. 2.4 GHz only.
The status LED on the board is on while Spot is not connected to WiFi (waiting for setup). It is off in normal operation. The LED ring is the traffic light, not the status LED.
Adding to Home Assistant
- Settings, Devices and services. The ESPHome device Plošná ryba Spot is listed as discovered. Click Add.
- Confirm. If HA offers to set an encryption key, accept it.
- Assign an area (for example Kitchen). Entities appear on their own.
Settings
On the device page in HA, in the Configuration section:
| Setting | Default | What it does |
|---|---|---|
| Cheap price threshold | 2.00 CZK/kWh | green below this price |
| Expensive price threshold | 4.00 CZK/kWh | red from this price, yellow in between |
| Price block length | 15 min | 15 min or 60 min, how often the price changes |
| EUR/CZK rate | 24.30 | only for the internet fallback |
| Automatic ring colour | on | off = you control the ring yourself as a light |
| Internet price fallback | on | download prices when HA is missing |
Set the ring brightness like any light (the Ring entity). You can also turn the ring off and keep only the display. Without a price the ring glows blue.
Display
- Top: the label Spot price and the clock
- Middle: the current price in large digits, unit and level (Cheap, Medium, Expensive) on the right
- Bottom: time until the price changes (minutes:seconds) and the next price, if known (from the internet fallback)
Entities
Home Assistant builds the entity ID from the device name and the entity name, typically sensor.plosna_ryba_spot_current_price. The table lists the suffix after the device name (English firmware build).
| Type | Suffix | Meaning | Unit |
|---|---|---|---|
| sensor | current_price |
price that drives the traffic light | CZK/kWh |
| sensor | next_price |
price in the next block (only when known from the fallback) | CZK/kWh |
| text_sensor | price_level |
Cheap, Medium, Expensive, Unknown | |
| text_sensor | price_source |
Home Assistant, Energy-Charts.info (CC BY 4.0), None | |
| light | ring |
LED ring | |
| number | cheap_price_threshold |
green threshold | CZK/kWh |
| number | expensive_price_threshold |
red threshold | CZK/kWh |
| number | eur_czk_rate |
rate for the fallback conversion | CZK/EUR |
| select | price_block_length |
15 min or 60 min | |
| switch | automatic_ring_colour |
traffic light controls the ring colour | |
| switch | internet_price_fallback |
fallback from Energy-Charts | |
| sensor | wifi_signal |
signal strength | dBm |
| sensor | uptime |
time since start | s |
| text_sensor | firmware_version, ip_address |
diagnostics | |
| button | restart |
restart | |
| light | status_led |
status LED on the board | |
| binary_sensor | boot_button |
BOOT button, usable in automations | |
| sensor | battery_voltage, battery |
Spot runs on USB, values are meaningless | V, % |
Automations
Boiler on cheap electricity. Turns on when the price is cheap, off when it stops being cheap. Replace switch.boiler with your switch.
automation:
- alias: "Boiler: heat on cheap electricity"
triggers:
- trigger: state
entity_id: sensor.plosna_ryba_spot_price_level
actions:
- choose:
- conditions:
- condition: state
entity_id: sensor.plosna_ryba_spot_price_level
state: "Cheap"
sequence:
- action: switch.turn_on
target:
entity_id: switch.boiler
default:
- action: switch.turn_off
target:
entity_id: switch.boiler
The level text depends on the firmware language (Levná in the Czech build). For a language independent automation use a numeric condition:
automation:
- alias: "Boiler: on below 1.50 CZK/kWh"
triggers:
- trigger: numeric_state
entity_id: sensor.plosna_ryba_spot_current_price
below: 1.5
actions:
- action: switch.turn_on
target:
entity_id: switch.boiler
A boiler with a thermostat controls its temperature by itself, the automation only enables its power. The boiler switch must be rated for it and installed by an electrician (230 V, high current).
The BOOT button as a quick control, for example to toggle the ring:
automation:
- alias: "Spot: BOOT toggles the ring"
triggers:
- trigger: state
entity_id: binary_sensor.plosna_ryba_spot_boot_button
to: "on"
actions:
- action: light.toggle
target:
entity_id: light.plosna_ryba_spot_ring
Troubleshooting
| Problem | What to try |
|---|---|
| Display shows Waiting for price | The price entity does not exist in HA or has no number (check the ID, see Price from Home Assistant). Without HA: is the fallback on and does the device have internet? |
| Price source stays Energy-Charts while HA runs | Spot does not read the HA entity: wrong entity ID, or the device is not added to HA. |
| Price is a thousand times too high | The integration provides CZK/MWh. Switch it to kWh or use a template sensor that divides by 1000. |
| Time to change is wrong | Set Price block length to match the integration (15 or 60 min). |
| Ring is dark | Is the Ring entity on? Only USB powers it. A weak adapter or a long thin cable can reset the ring. |
| Ring shows a different colour than I want | Automatic ring colour overrides the colour when the level changes. Turn it off to control the ring yourself. |
| Display is dark | Check the Qwiic cable. The display has address 0x3C, the device log lists the I2C bus. |
Safety
- No mains voltage: Spot runs on USB 5 V only. Do not connect anything from the 230 V mains to it. Switch appliances like a boiler through HA and properly installed switches made for that.
- Spot is meant for dry indoor spaces.
- Prices are for guidance. The final price is set by your contract with your supplier.