# smart-oil-heating-control-system

## Software
### Design

```mermaid
classDiagram
Inputs <|-- Control
Outputs <|-- Control
Sntp <|-- Control
Inputs <|-- Safety
Outputs <|--|> Safety

Inputs <|-- Metrics
Outputs <|-- Metrics
Control <|-- Metrics
Safety <|-- Metrics
Sntp <|-- Metrics

    class Inputs{
        +initInputs()
        -taskInput()
        +getChamberTemperature()
        +getOutdoorTemperature()
        +getInletFlowTemperature()
        +getReturnFlowTemperature()
        +getBurnerError()
    }

    class Outputs{
        +initOutputs()
        +getCirculationPumpState()
        +setCirculationPumpState()
        +getBurnerState()
        +setBurnerState()
        +getSafetyControlState()
        +setSafetyControlState()
    }

    class Control{
        +taskControl()
        -controlTable
        +getControlState()
    }

    class Safety{
        +initSafety()
        -taskSafety()
        -setSafeState()
        -checkSensorSanity()
        +getSensorSanityStates()
        +getSafetyState()
    }


    class Wifi{
        +initWifi()
    }

    class Sntp{
        +initSntp()
        +getSntpState()
    }

    class Metrics{
        +initMetrics()
        -taskMetrics()
        -metrics
        +event_handler()
        +connect_wifi()
        +setMetrics()
    }
```

### 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 0
chamber_temperature 58.750000
chamber_temperature_avg10 58.931252
chamber_temperature_avg60 59.190475
chamber_temperature_pred60 55.870998
inlet_flow_temperature 53.875000
inlet_flow_temperature_avg10 53.900002
inlet_flow_temperature_avg60 53.994320
inlet_flow_temperature_pred60 52.848743
outdoor_temperature 18.000000
outdoor_temperature_avg10 18.006250
outdoor_temperature_avg60 18.002840
outdoor_temperature_pred60 18.050785
return_flow_temperature 48.625000
return_flow_temperature_avg10 48.718750
return_flow_temperature_avg60 48.846592
return_flow_temperature_pred60 47.383083
chamber_temperature_state 0
outdoor_temperature_state 0
inlet_flow_temperature_state 0
return_flow_temperature_state 0
safety_state 0
control_state 3
sntp_state 0
system_unixtime 1735242392
uptime_seconds 40
wifi_rssi -74
```

#### 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            |