Files
smart-oil-heating-control-s…/README.md
2026-01-10 18:51:33 +01:00

157 lines
5.9 KiB
Markdown

# Smart Oil Heating Control System
ESP32-based control system for oil-fired central heating with schedule-based temperature management, safety monitoring, and Prometheus metrics export.
## Features
- **Schedule Control**: Day/night temperature targets per weekday
- **Summer Mode**: Automatic heating disable based on outdoor temperature
- **Safety Monitoring**: Sensor sanity checks with automatic safe-state fallback
- **Prometheus Metrics**: HTTP endpoint at port 9100
## System Overview
```mermaid
flowchart TB
subgraph OUTSIDE[" "]
OT[/"🌡️ Outdoor Temp<br/>DS18B20"/]
end
subgraph BURNER["OIL BURNER"]
CT[/"🌡️ Chamber Temp<br/>DS18B20"/]
BF[["⚠️ Burner Fault<br/>GPIO19 INPUT"]]
BR(["🔥 Burner Relay<br/>GPIO14"])
SC(["🔌 Safety Contact<br/>GPIO12"])
end
subgraph CIRCUIT["HEATING CIRCUIT"]
IT[/"🌡️ Inlet Temp<br/>DS18B20"/]
CP(["💧 Circulation Pump<br/>GPIO27"])
RT[/"🌡️ Return Temp<br/>DS18B20"/]
end
RAD["🏠 Radiators"]
BURNER -->|"hot water"| IT
IT --> CP
CP --> RAD
RAD --> RT
RT -->|"cold water"| BURNER
```
### Prometheus Metrics
`curl http://X.X.X.X:9100/metrics`
#### Example
```
burner_fault_pending 1
circulation_pump_enabled 1
burner_enabled 0
safety_contact_enabled 1
chamber_temperature 37.312500
chamber_temperature_avg10 37.393749
chamber_temperature_avg60 37.689583
chamber_temperature_damped 38.058098
chamber_temperature_pred60 36.697266
inlet_flow_temperature 34.562500
inlet_flow_temperature_avg10 34.587502
inlet_flow_temperature_avg60 34.880207
inlet_flow_temperature_damped 35.255993
inlet_flow_temperature_pred60 33.910374
outdoor_temperature 1.812500
outdoor_temperature_avg10 1.825000
outdoor_temperature_avg60 1.821875
outdoor_temperature_damped 2.390663
outdoor_temperature_pred60 1.840263
return_flow_temperature 34.125000
return_flow_temperature_avg10 34.162498
return_flow_temperature_avg60 34.304165
return_flow_temperature_damped 31.430506
return_flow_temperature_pred60 33.858772
chamber_temperature_state 0
outdoor_temperature_state 0
inlet_flow_temperature_state 0
return_flow_temperature_state 0
safety_state 0
control_state 3
control_current_weekday 5
control_current_entry_time 24300
control_current_entry_chamber_temperature 80.000000
control_current_entry_return_flow_temperature 30.000000
sntp_state 0
system_unixtime 1768067412
uptime_seconds 344878
wifi_rssi -59
```
#### Status Encoding
##### Digital Themperatur Sensor DS10B20
- chamber_temperature_state
- outdoor_temperature_state
- inlet_flow_temperature_state
- return_flow_temperature_state
| Enum eSensorErrorState in [safety.h](main/safety.h) | Value | Description |
|-----------------------------------------------------|-------|---------------------|
| SENSOR_NO_ERROR | 0 | |
| SENSOR_TOO_HIGH | 1 | Sanity check failed |
| SENSOR_TOO_LOW | 2 | Sanity check failed |
| SENSOR_UNCHANGED | 3 | Sanity check failed |
| SENSOR_NOT_FOUND | 4 | No Communication |
##### Safety Loop
- safety_state
| Enum eSafetyState in [safety.h](main/safety.h) | Value | Description |
|------------------------------------------------|-------|----------------------------|
| SAFETY_NO_ERROR | 0 | |
| SAFETY_SENSOR_ERROR | 1 | At least one sensor failed |
| SAFETY_INTERNAL_ERROR | 2 | Internal error |
##### Control Loop
- control_state
| Enum eControlState in [control.h](main/control.h) | Value | Description |
|---------------------------------------------------|-------|--------------------------------------------------|
| CONTROL_STARTING | 0 | |
| CONTROL_HEATING | 1 | Burner running |
| CONTROL_OUTDOOR_TOO_WARM | 2 | Heating not needed |
| CONTROL_RETURN_FLOW_TOO_WARM | 3 | Heating not needed |
| CONTROL_FAULT_BURNER | 4 | Burner reported fault after threshold is reached |
| CONTROL_FAULT_SAFETY | 5 | Unable to control due safety fault |
| CONTROL_FAULT_SNTP | 6 | Unable to control due SNTP fault |
##### SNTP Client
- sntp_state
| Enum eSntpState in [sntp.h](main/sntp.h) | Value | Description |
|------------------------------------------|-------|-------------|
| SYNC_SUCCESSFUL | 0 | |
| SYNC_NOT_STARTED | 1 | |
| SYNC_FAILED | 2 | |
## Hardware
| Function | ESP32 | PLC ES32C14 |
|---------------------------------------|-------|-------------------|
| Output CirculationPump | IO27 | Relay 1 NC1 |
| Output Burner Fire Signal | IO14 | Relay 2 NC2 |
| Output Safety Contact (powers Burner) | IO12 | Relay 3 NC2 |
| Input Burner Fault | IO19 | Digital Input IN1 |
| Input Temperature DS10B20 | IO04 | 1-Wire |
## Configuration
All parameters configurable via `idf.py menuconfig`:
- WiFi credentials and static IP
- GPIO pin assignments
- 1-Wire sensor addresses
- Temperature thresholds and limits
- Heating schedule (day/night per weekday)
- Damping factors
## Building
```bash
idf.py set-target esp32
idf.py menuconfig # Configure settings
idf.py build flash monitor
```