⚠️ USE AT YOUR OWN RISKSVOTC 3.0 Features may change without prior notice, bugs may occur, and configuration details may change in future releases. Do not use in production unless you fully understand the risks. You are responsible for any consequences affecting your heating system.
The biggest change in SVOTC 3.0.0 is that the system has been simplified into a new Core v1 architecture.
This is not a drop-in upgrade from 2.x.x.
Several previous subsystems have been removed or merged into a smaller and more transparent core. The old 2.x structure and logic should not be reused without review.
- Replaced multi-layer system (Price FSM, brake phases, learning) with a single-engine design
- All decisions are now made in one central control loop
- Introduced PI controller (Proportional + Integral)
- Used in:
Comfortmode- Comfort guard
- Overtemperature braking
- Integral state is persisted via
input_number.svotc_pi_integral_state - Deadband added to prevent oscillation
- Derivative (D) term intentionally not used
- Removed
20_price_fsm.yaml - Introduced simplified forward price state:
cheapneutralprebrakehold(bridge between brake blocks)brake
prebrakeis no longer exposed as a separate reason code- Both
brakeandprebrakemap to:PRICE_BRAKE(reason level)
- Clear separation between:
requested_offsetapplied_offset
- Added rate limiting to avoid aggressive changes
- Smoother behavior towards heat pump
- Integrated directly into engine:
- Comfort guard
- Overtemperature protection
- Fail-safe
- Strict priority order enforced
- Triggered when inputs are invalid/unavailable
- Forces safe neutral operation
- Optional notification after 5 minutes (
30_notify.yaml)
- Deterministic startup:
- Reason reset to
INIT - PI integral reset
- Latches cleared
- Reason reset to
- No dependency on historical runtime state
- Removed:
20_price_fsm.yaml22_engine.yaml30_learning.yaml
- Replaced with:
20_engine.yaml(unified engine)
- Reduced total system complexity
- Reduced number of user-facing tuning parameters
- Focus on:
- Simplicity
- Predictability
- “Works out of the box” behavior
/config/packages/svotc/
├── 00_helpers.yaml
├── 10_sensors.yaml
├── 20_price_fsm.yaml
├── 22_engine.yaml
├── 30_learning.yaml
└── 40_notify.yaml
/config/packages/svotc/
├── 00_helpers.yaml ← User controls and internal helper states
├── 10_sensors.yaml ← Temperatures, price thresholds, price states, health
├── 20_engine.yaml ← Main control loop, requested/applied offset, reason code
└── 30_notify.yaml ← Optional FAIL_SAFE notification
✅ The first three files are required.
30_notify.yamlis optional but recommended.
Remove or archive old files such as:
20_price_fsm.yaml
22_engine.yaml
30_learning.yaml
40_notify.yaml
If you previously used a single-file setup, also remove:
/config/packages/svotc.yaml
If you previously ran SVOTC 2.x.x, some template sensors may still exist in Home Assistant’s entity registry.
If left behind, Home Assistant may create duplicate entities like:
sensor.svotc_virtual_outdoor_temperature_2
sensor.svotc_forward_price_state_2
To avoid this, remove old entities before starting SVOTC 3.0.0.
Steps:
- Go to Settings → Devices & Services → Entities
- Search for
svotc - Remove entities belonging to the old 2.x setup
- Restart Home Assistant
- Start SVOTC 3.0.0
This ensures correct naming for new sensors.
/config/packages/svotc/
00_helpers.yaml
10_sensors.yaml
20_engine.yaml
30_notify.yaml
homeassistant:
packages: !include_dir_named packagesSet these helpers after restart:
input_text.svotc_source_indoor_tempinput_text.svotc_source_outdoor_tempinput_text.svotc_source_price
Example:
sensor.indoor_temperature
sensor.outdoor_temperature
sensor.nordpool_kwh_se3
Check:
binary_sensor.svotc_inputs_healthy→ ONsensor.svotc_forward_price_state→neutral,cheap,prebrake,hold (bridge between brake blocks), orbrakeinput_text.svotc_reason_code→ e.g.NEUTRALsensor.svotc_virtual_outdoor_temperature→ reasonable value
SVOTC 3.0.0 replaces the previous layered control system with a single core engine.
The core includes a lightweight PI controller for temperature regulation used in:
- Comfort mode
- Comfort guard
- Overtemperature protection
A central decision loop replaces:
- Price FSM
- Brake phases
- Learning logic
This makes the system:
- Easier to understand
- Easier to debug
- Easier to maintain
- More predictable
Only four core files are used, reducing complexity and improving upgrade clarity.
- Requested offset — what the logic wants
- Applied offset — what is actually sent after rate limiting
This prevents abrupt changes and protects hardware.
Forward price state:
cheapneutralprebrakehold(bridge between brake blocks)brake
The engine handles:
- Comfort guard
- Overtemperature brake
- Fail-safe
All evaluated in strict priority order.
SVOTC uses a simple PI controller (Proportional + Integral).
Used in:
- Comfort mode
- Comfort guard
- Overtemperature braking
The controller:
- Reacts instantly (P term)
- Corrects over time (I term)
- Uses a deadband for stability
Derivative (D) is not used since buildings are inherently slow systems.
PI works together with ramp limiting to ensure smooth behavior.
A notification can be triggered if the system remains in FAIL_SAFE for more than 5 minutes.
20_price_fsm.yamlremoved22_engine.yamlreplaced30_learning.yamlremoved40_notify.yamlreplaced
Operating modes:
OffSmartComfort
Core v1 is designed to be:
- Cleaner
- Safer
- More hardware-friendly
- Easier to debug
- Easier to maintain
The goal is stability — not added complexity.
SVOTC 3.0.0 intentionally avoids exposing too many advanced parameters.
In most cases, you only need to configure:
- Indoor temperature
- Outdoor temperature
- Electricity price
- Comfort target
The system handles:
- Price response
- Brake behavior
- Comfort protection
- Overtemperature protection
👉 Works out of the box
- Remove old files
- Install Core v1
- Verify inputs
- Check sensors
SVOTC controls your heat pump indirectly.
Misconfiguration may affect:
- Comfort
- Operation
- Efficiency
Recommendations:
- Monitor
reason_code - Keep a fallback ready
Version: SVOTC 3.0 Core: Core v1 License: MIT