From 307278e67998021e87d9acb10f14c757632de49b08a8d6c2ff8663d32952c0b0 Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 25 Dec 2024 20:39:49 +0100 Subject: [PATCH 01/13] switch to single sensor config --- main/inputs.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/main/inputs.c b/main/inputs.c index c418164..6e7156b 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -14,10 +14,10 @@ static const char *TAG = "smart-oil-heater-control-system-inputs"; const uint8_t uBurnerFaultPin = 19U; const uint8_t uDS18B20Pin = 4U; -const onewire_addr_t uChamperTempSensorAddr = 0x3e0000001754be28; -const onewire_addr_t uOutdoorTempSensorAddr = 0x880000001648e328; -const onewire_addr_t uInletFlowTempSensorAddr = 0xe59cdef51e64ff28; -const onewire_addr_t uReturnFlowTempSensorAddr = 0xa7a8e1531f64ff28; +const onewire_addr_t uChamperTempSensorAddr = 0x78000000c6c2f728; +const onewire_addr_t uOutdoorTempSensorAddr = 0x78000000c6c2f728; +const onewire_addr_t uInletFlowTempSensorAddr = 0x78000000c6c2f728; +const onewire_addr_t uReturnFlowTempSensorAddr = 0x78000000c6c2f728; onewire_addr_t uOneWireAddresses[MAX_DN18B20_SENSORS]; float fDS18B20Temps[MAX_DN18B20_SENSORS]; @@ -163,14 +163,14 @@ void taskInput(void *pvParameters) if (ds18x20_measure_and_read_multi(uDS18B20Pin, uOneWireAddresses, sSensorCount, fDS18B20Temps) != ESP_OK) { ESP_LOGE(TAG, "1-Wire devices read error"); - vTaskDelay(PERIODIC_INTERVAL * 100U / portTICK_PERIOD_MS); //Wait 100ms if bus error occurred + vTaskDelay(PERIODIC_INTERVAL * 100U / portTICK_PERIOD_MS); // Wait 100ms if bus error occurred } else { for (int j = 0; j < sSensorCount; j++) { float temp_c = fDS18B20Temps[j]; - // ESP_LOGI(TAG, "Sensor: %08" PRIx64 " reports %lf°C", (uint64_t)uOneWireAddresses[j], temp_c); + ESP_LOGI(TAG, "Sensor: %08" PRIx64 " reports %lf°C", (uint64_t)uOneWireAddresses[j], temp_c); switch ((uint64_t)uOneWireAddresses[j]) { @@ -178,18 +178,15 @@ void taskInput(void *pvParameters) sChamperTemperature.fCurrentValue = temp_c; sChamperTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sChamperTemperature); - break; - case ((uint64_t)uOutdoorTempSensorAddr): + sOutdoorTemperature.fCurrentValue = temp_c; sOutdoorTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sOutdoorTemperature); - break; - case ((uint64_t)uInletFlowTempSensorAddr): + sInletFlowTemperature.fCurrentValue = temp_c; sInletFlowTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sInletFlowTemperature); - break; - case ((uint64_t)uReturnFlowTempSensorAddr): + sReturnFlowTemperature.fCurrentValue = temp_c; sReturnFlowTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sReturnFlowTemperature); -- 2.47.1 From ff16e601fb364c8e21e7626998d412ed5d19f57d3078206597a3de640d418f50 Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 25 Dec 2024 22:10:38 +0100 Subject: [PATCH 02/13] add prediction for 10s --- main/inputs.c | 36 +++++++++++++++++++++++++++++------- main/inputs.h | 12 ++++++++++++ main/metrics.c | 6 ++++++ 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/main/inputs.c b/main/inputs.c index 6e7156b..4ea353c 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -32,6 +32,7 @@ static sMeasurement sReturnFlowTemperature; void taskInput(void *pvParameters); void updateAverage(sMeasurement *pMeasurement); +void updatePrediction(sMeasurement *pMeasurement); void initInputs(void) { @@ -82,20 +83,15 @@ void updateAverage(sMeasurement *pMeasurement) pMeasurement->average10s.bufferCount++; } - if (pMeasurement->average10s.bufferCount == 0U) - { - pMeasurement->average10s.fValue = pMeasurement->fCurrentValue; - } - float sum = 0.0; - for (int i = 0; i < pMeasurement->average10s.bufferCount; i++) + for (int i = 0; i <= pMeasurement->average10s.bufferCount; i++) { sum += pMeasurement->average10s.samples[i]; } pMeasurement->average10s.fValue = sum / pMeasurement->average10s.bufferCount; - /* Average form the last 60sec */ + /* Average form the last 60sec pMeasurement->average60s.samples[pMeasurement->average60s.bufferIndex] = pMeasurement->fCurrentValue; pMeasurement->average60s.bufferIndex = (pMeasurement->average60s.bufferIndex + 1) % AVG60_SAMPLE_SIZE; @@ -116,6 +112,31 @@ void updateAverage(sMeasurement *pMeasurement) } pMeasurement->average60s.fValue = sum / pMeasurement->average60s.bufferCount; + */ +} + +void updatePrediction(sMeasurement *pMeasurement) +{ /* Prediction of the value in 10sec */ + pMeasurement->predict10s.samples[pMeasurement->predict10s.bufferIndex] = pMeasurement->fCurrentValue; + pMeasurement->predict10s.bufferIndex = (pMeasurement->predict10s.bufferIndex + 1) % PRED10_SAMPLE_SIZE; + + if (pMeasurement->predict10s.bufferCount < PRED10_SAMPLE_SIZE) + { + pMeasurement->predict10s.bufferCount++; + } + + if (pMeasurement->predict10s.bufferCount == 0U) + { + pMeasurement->predict10s.fValue = pMeasurement->fCurrentValue; + } + else + { + float delta = pMeasurement->predict10s.samples[(pMeasurement->predict10s.bufferIndex - 1) % PRED10_SAMPLE_SIZE] - pMeasurement->predict10s.samples[pMeasurement->predict10s.bufferIndex]; + if (delta != 0.0) + { + // pMeasurement->predict10s.fValue = pMeasurement->fCurrentValue + (delta * pMeasurement->predict10s.bufferCount); + } + } } void taskInput(void *pvParameters) @@ -178,6 +199,7 @@ void taskInput(void *pvParameters) sChamperTemperature.fCurrentValue = temp_c; sChamperTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sChamperTemperature); + // updatePrediction(&sChamperTemperature); sOutdoorTemperature.fCurrentValue = temp_c; sOutdoorTemperature.state = MEASUREMENT_NO_ERROR; diff --git a/main/inputs.h b/main/inputs.h index 2630507..76bdc75 100644 --- a/main/inputs.h +++ b/main/inputs.h @@ -3,6 +3,8 @@ #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define AVG10_SAMPLE_SIZE 10U #define AVG60_SAMPLE_SIZE 60U +#define PRED10_SAMPLE_SIZE 10U +#define PRED60_SAMPLE_SIZE 60U typedef enum _BurnerErrorState { @@ -24,11 +26,21 @@ typedef struct _Average size_t bufferCount; } sAverage; +typedef struct _Predict +{ + float fValue; + float samples[MAX(PRED10_SAMPLE_SIZE, PRED60_SAMPLE_SIZE)]; + size_t bufferIndex; + size_t bufferCount; +} sPredict; + typedef struct _Measurement { float fCurrentValue; sAverage average10s; sAverage average60s; + sPredict predict10s; + sPredict predict60s; eMeasurementErrorState state; } sMeasurement; diff --git a/main/metrics.c b/main/metrics.c index 278d2c2..afdcc6b 100644 --- a/main/metrics.c +++ b/main/metrics.c @@ -128,6 +128,12 @@ void taskMetrics(void *pvParameters) aMetrics[u16MetricCounter].fMetricValue = getChamberTemperature().average60s.fValue; u16MetricCounter++; + /*Chamber Temperature Predict 10s*/ + strcpy(aMetrics[u16MetricCounter].caMetricName, "chamber_temperature_pred10"); + aMetrics[u16MetricCounter].type = FLOAT; + aMetrics[u16MetricCounter].fMetricValue = getChamberTemperature().predict10s.fValue; + u16MetricCounter++; + /*Inlet Flow Temperature*/ strcpy(aMetrics[u16MetricCounter].caMetricName, "inlet_flow_temperature"); aMetrics[u16MetricCounter].type = FLOAT; -- 2.47.1 From e267e2be588c5b39ca7aaaad1da0cea6ed0fbef24a2f26deff90e9624941da7f Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 26 Dec 2024 10:36:42 +0100 Subject: [PATCH 03/13] disable changes --- main/inputs.c | 10 +++++----- main/metrics.c | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/main/inputs.c b/main/inputs.c index 4ea353c..7e11b6e 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -198,20 +198,20 @@ void taskInput(void *pvParameters) case ((uint64_t)uChamperTempSensorAddr): sChamperTemperature.fCurrentValue = temp_c; sChamperTemperature.state = MEASUREMENT_NO_ERROR; - updateAverage(&sChamperTemperature); - // updatePrediction(&sChamperTemperature); + // updateAverage(&sChamperTemperature); + // updatePrediction(&sChamperTemperature); sOutdoorTemperature.fCurrentValue = temp_c; sOutdoorTemperature.state = MEASUREMENT_NO_ERROR; - updateAverage(&sOutdoorTemperature); + // updateAverage(&sOutdoorTemperature); sInletFlowTemperature.fCurrentValue = temp_c; sInletFlowTemperature.state = MEASUREMENT_NO_ERROR; - updateAverage(&sInletFlowTemperature); + // updateAverage(&sInletFlowTemperature); sReturnFlowTemperature.fCurrentValue = temp_c; sReturnFlowTemperature.state = MEASUREMENT_NO_ERROR; - updateAverage(&sReturnFlowTemperature); + // updateAverage(&sReturnFlowTemperature); break; default: break; diff --git a/main/metrics.c b/main/metrics.c index afdcc6b..ef9b55e 100644 --- a/main/metrics.c +++ b/main/metrics.c @@ -128,11 +128,12 @@ void taskMetrics(void *pvParameters) aMetrics[u16MetricCounter].fMetricValue = getChamberTemperature().average60s.fValue; u16MetricCounter++; - /*Chamber Temperature Predict 10s*/ + /*Chamber Temperature Predict 10s strcpy(aMetrics[u16MetricCounter].caMetricName, "chamber_temperature_pred10"); aMetrics[u16MetricCounter].type = FLOAT; aMetrics[u16MetricCounter].fMetricValue = getChamberTemperature().predict10s.fValue; u16MetricCounter++; + */ /*Inlet Flow Temperature*/ strcpy(aMetrics[u16MetricCounter].caMetricName, "inlet_flow_temperature"); -- 2.47.1 From 80e48f632f86205ba3e3edb450b3a7b2a2697c310ea908a2d9104f50edb0894a Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 26 Dec 2024 11:01:25 +0100 Subject: [PATCH 04/13] fix mem fault --- main/control.c | 2 +- main/inputs.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/main/control.c b/main/control.c index 76ea7e7..eedc877 100644 --- a/main/control.c +++ b/main/control.c @@ -35,7 +35,7 @@ void initControl(void) BaseType_t taskCreated = xTaskCreate( taskControl, // Function to implement the task "taskControl", // Task name - 4096, // Stack size (in words, not bytes) + 8192, // Stack size (in words, not bytes) NULL, // Parameters to the task function (none in this case) 5, // Task priority (higher number = higher priority) NULL // Task handle (optional) diff --git a/main/inputs.c b/main/inputs.c index 7e11b6e..fdcee66 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -114,9 +114,9 @@ void updateAverage(sMeasurement *pMeasurement) pMeasurement->average60s.fValue = sum / pMeasurement->average60s.bufferCount; */ } - +/* void updatePrediction(sMeasurement *pMeasurement) -{ /* Prediction of the value in 10sec */ +{ Prediction of the value in 10sec pMeasurement->predict10s.samples[pMeasurement->predict10s.bufferIndex] = pMeasurement->fCurrentValue; pMeasurement->predict10s.bufferIndex = (pMeasurement->predict10s.bufferIndex + 1) % PRED10_SAMPLE_SIZE; @@ -138,6 +138,7 @@ void updatePrediction(sMeasurement *pMeasurement) } } } +*/ void taskInput(void *pvParameters) { -- 2.47.1 From 56f1831d8c7c18abbc014b263f54803d560ff735d47ac580fb8b106ca3456de8 Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 26 Dec 2024 11:20:07 +0100 Subject: [PATCH 05/13] pred10s --- main/inputs.c | 14 ++++++-------- main/metrics.c | 11 +++++++++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/main/inputs.c b/main/inputs.c index fdcee66..c678e53 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -91,7 +91,7 @@ void updateAverage(sMeasurement *pMeasurement) pMeasurement->average10s.fValue = sum / pMeasurement->average10s.bufferCount; - /* Average form the last 60sec + /* Average form the last 60sec */ pMeasurement->average60s.samples[pMeasurement->average60s.bufferIndex] = pMeasurement->fCurrentValue; pMeasurement->average60s.bufferIndex = (pMeasurement->average60s.bufferIndex + 1) % AVG60_SAMPLE_SIZE; @@ -106,17 +106,16 @@ void updateAverage(sMeasurement *pMeasurement) } sum = 0.0; - for (int i = 0; i < pMeasurement->average60s.bufferCount; i++) + for (int i = 0; i <= pMeasurement->average60s.bufferCount; i++) { sum += pMeasurement->average60s.samples[i]; } pMeasurement->average60s.fValue = sum / pMeasurement->average60s.bufferCount; - */ } -/* + void updatePrediction(sMeasurement *pMeasurement) -{ Prediction of the value in 10sec +{ /* Prediction of the value in 10sec */ pMeasurement->predict10s.samples[pMeasurement->predict10s.bufferIndex] = pMeasurement->fCurrentValue; pMeasurement->predict10s.bufferIndex = (pMeasurement->predict10s.bufferIndex + 1) % PRED10_SAMPLE_SIZE; @@ -138,7 +137,6 @@ void updatePrediction(sMeasurement *pMeasurement) } } } -*/ void taskInput(void *pvParameters) { @@ -199,8 +197,8 @@ void taskInput(void *pvParameters) case ((uint64_t)uChamperTempSensorAddr): sChamperTemperature.fCurrentValue = temp_c; sChamperTemperature.state = MEASUREMENT_NO_ERROR; - // updateAverage(&sChamperTemperature); - // updatePrediction(&sChamperTemperature); + updateAverage(&sChamperTemperature); + updatePrediction(&sChamperTemperature); sOutdoorTemperature.fCurrentValue = temp_c; sOutdoorTemperature.state = MEASUREMENT_NO_ERROR; diff --git a/main/metrics.c b/main/metrics.c index ef9b55e..3d00a7c 100644 --- a/main/metrics.c +++ b/main/metrics.c @@ -128,12 +128,19 @@ void taskMetrics(void *pvParameters) aMetrics[u16MetricCounter].fMetricValue = getChamberTemperature().average60s.fValue; u16MetricCounter++; - /*Chamber Temperature Predict 10s + // Chamber Temperature Predict 10s strcpy(aMetrics[u16MetricCounter].caMetricName, "chamber_temperature_pred10"); aMetrics[u16MetricCounter].type = FLOAT; aMetrics[u16MetricCounter].fMetricValue = getChamberTemperature().predict10s.fValue; u16MetricCounter++; - */ + /* + //Chamber Temperature Predict 60s + strcpy(aMetrics[u16MetricCounter].caMetricName, "chamber_temperature_pred90"); + aMetrics[u16MetricCounter].type = FLOAT; + aMetrics[u16MetricCounter].fMetricValue = getChamberTemperature().predict60s.fValue; + u16MetricCounter++; + + */ /*Inlet Flow Temperature*/ strcpy(aMetrics[u16MetricCounter].caMetricName, "inlet_flow_temperature"); -- 2.47.1 From 59eb36143106d0fcd1a3773e236c8e5afaf1c0840bc54383b496dc7e09f9862b Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 26 Dec 2024 11:25:50 +0100 Subject: [PATCH 06/13] get pred10s working --- main/inputs.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/main/inputs.c b/main/inputs.c index c678e53..943c910 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -124,17 +124,10 @@ void updatePrediction(sMeasurement *pMeasurement) pMeasurement->predict10s.bufferCount++; } - if (pMeasurement->predict10s.bufferCount == 0U) + float delta = pMeasurement->predict10s.samples[(pMeasurement->predict10s.bufferIndex - 1) % PRED10_SAMPLE_SIZE] - pMeasurement->predict10s.samples[pMeasurement->predict10s.bufferIndex]; + if (delta != 0.0) { - pMeasurement->predict10s.fValue = pMeasurement->fCurrentValue; - } - else - { - float delta = pMeasurement->predict10s.samples[(pMeasurement->predict10s.bufferIndex - 1) % PRED10_SAMPLE_SIZE] - pMeasurement->predict10s.samples[pMeasurement->predict10s.bufferIndex]; - if (delta != 0.0) - { - // pMeasurement->predict10s.fValue = pMeasurement->fCurrentValue + (delta * pMeasurement->predict10s.bufferCount); - } + pMeasurement->predict10s.fValue = pMeasurement->fCurrentValue + (delta * pMeasurement->predict10s.bufferCount); } } -- 2.47.1 From 655d890a0f698ae5f3b0d7eb3d36f965c00ecb7c1f7ceca1ca37761c3003369d Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 26 Dec 2024 13:07:03 +0100 Subject: [PATCH 07/13] chamber temp prediction metrics --- main/inputs.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/main/inputs.c b/main/inputs.c index 943c910..a4dc2ee 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -1,6 +1,7 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" +#include #include "esp_log.h" #include @@ -31,6 +32,7 @@ static sMeasurement sInletFlowTemperature; static sMeasurement sReturnFlowTemperature; void taskInput(void *pvParameters); +void initMeasurement(sMeasurement *pMeasurement); void updateAverage(sMeasurement *pMeasurement); void updatePrediction(sMeasurement *pMeasurement); @@ -54,6 +56,11 @@ void initInputs(void) } xSemaphoreGiveRecursive(xMutexAccessInputs); + initMeasurement(&sChamperTemperature); + initMeasurement(&sOutdoorTemperature); + initMeasurement(&sInletFlowTemperature); + initMeasurement(&sReturnFlowTemperature); + BaseType_t taskCreated = xTaskCreate( taskInput, // Function to implement the task "taskInput", // Task name @@ -73,6 +80,32 @@ void initInputs(void) } } +void initMeasurement(sMeasurement *pMeasurement) +{ + pMeasurement->state = MEASUREMENT_FAULT; + pMeasurement->fCurrentValue = 0.0f; + + pMeasurement->average10s.fValue = 0.0f; + pMeasurement->average10s.bufferCount = 0U; + pMeasurement->average10s.bufferIndex = 0U; + memset(pMeasurement->average10s.samples, 0U, AVG10_SAMPLE_SIZE); + + pMeasurement->average60s.fValue = 0.0f; + pMeasurement->average60s.bufferCount = 0U; + pMeasurement->average60s.bufferIndex = 0U; + memset(pMeasurement->average60s.samples, 0U, AVG60_SAMPLE_SIZE); + + pMeasurement->predict10s.fValue = 0.0f; + pMeasurement->predict10s.bufferCount = 0U; + pMeasurement->predict10s.bufferIndex = 0U; + memset(pMeasurement->predict10s.samples, 0U, PRED10_SAMPLE_SIZE); + + pMeasurement->predict60s.fValue = 0.0f; + pMeasurement->predict60s.bufferCount = 0U; + pMeasurement->predict60s.bufferIndex = 0U; + memset(pMeasurement->predict60s.samples, 0U, PRED60_SAMPLE_SIZE); +} + void updateAverage(sMeasurement *pMeasurement) { /* Average form the last 10sec */ pMeasurement->average10s.samples[pMeasurement->average10s.bufferIndex] = pMeasurement->fCurrentValue; @@ -124,10 +157,25 @@ void updatePrediction(sMeasurement *pMeasurement) pMeasurement->predict10s.bufferCount++; } - float delta = pMeasurement->predict10s.samples[(pMeasurement->predict10s.bufferIndex - 1) % PRED10_SAMPLE_SIZE] - pMeasurement->predict10s.samples[pMeasurement->predict10s.bufferIndex]; - if (delta != 0.0) + float delta10s = pMeasurement->predict10s.samples[(pMeasurement->predict10s.bufferIndex - 1) % PRED10_SAMPLE_SIZE] - pMeasurement->predict10s.samples[pMeasurement->predict10s.bufferIndex]; + if (delta10s != 0.0) { - pMeasurement->predict10s.fValue = pMeasurement->fCurrentValue + (delta * pMeasurement->predict10s.bufferCount); + pMeasurement->predict10s.fValue = pMeasurement->fCurrentValue + (delta10s * pMeasurement->predict10s.bufferCount); + } + + /* Prediction of the value in 60sec */ + pMeasurement->predict60s.samples[pMeasurement->predict60s.bufferIndex] = pMeasurement->fCurrentValue; + pMeasurement->predict60s.bufferIndex = (pMeasurement->predict60s.bufferIndex + 1) % PRED60_SAMPLE_SIZE; + + if (pMeasurement->predict60s.bufferCount < PRED60_SAMPLE_SIZE) + { + pMeasurement->predict60s.bufferCount++; + } + + float delta60s = pMeasurement->predict60s.samples[(pMeasurement->predict60s.bufferIndex - 1) % PRED60_SAMPLE_SIZE] - pMeasurement->predict60s.samples[pMeasurement->predict60s.bufferIndex]; + if (delta60s != 0.0) + { + pMeasurement->predict60s.fValue = pMeasurement->fCurrentValue + (delta60s * pMeasurement->predict60s.bufferCount); } } -- 2.47.1 From 29223c007077de66cc6fada35542a59461838d58f8d64567086b29715274e727 Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 26 Dec 2024 18:12:39 +0100 Subject: [PATCH 08/13] increase metrics task stack to support more metrics --- main/metrics.c | 63 +++++++++++++++++++++++++------------------------- main/metrics.h | 6 ++--- 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/main/metrics.c b/main/metrics.c index 3d00a7c..51bf772 100644 --- a/main/metrics.c +++ b/main/metrics.c @@ -32,7 +32,7 @@ void initMetrics(void) BaseType_t taskCreated = xTaskCreate( taskMetrics, // Function to implement the task "taskMetrics", // Task name - 16384, // Stack size (in words, not bytes) + 32768, // Stack size (in words, not bytes) NULL, // Parameters to the task function (none in this case) 5, // Task priority (higher number = higher priority) NULL // Task handle (optional) @@ -56,13 +56,13 @@ void taskMetrics(void *pvParameters) u16MetricCounter = 0U; - /*Burner Error State*/ + // Burner Error State strcpy(aMetrics[u16MetricCounter].caMetricName, "burner_fault_pending"); aMetrics[u16MetricCounter].type = INTEGER_U8; aMetrics[u16MetricCounter].u8MetricValue = getBurnerError(); u16MetricCounter++; - /*Circulation Pump State*/ + // Circulation Pump State if (getCirculationPumpState() == ENABLED) { strcpy(aMetrics[u16MetricCounter].caMetricName, "circulation_pump_enabled"); @@ -78,7 +78,7 @@ void taskMetrics(void *pvParameters) u16MetricCounter++; } - /*Burner State*/ + // Burner State if (getBurnerState() == ENABLED) { strcpy(aMetrics[u16MetricCounter].caMetricName, "burner_enabled"); @@ -94,7 +94,7 @@ void taskMetrics(void *pvParameters) u16MetricCounter++; } - /*Safety Contact State*/ + // Safety Contact State if (getSafetyControlState() == ENABLED) { strcpy(aMetrics[u16MetricCounter].caMetricName, "safety_contact_enabled"); @@ -110,19 +110,19 @@ void taskMetrics(void *pvParameters) u16MetricCounter++; } - /*Chamber Temperature*/ + // Chamber Temperature strcpy(aMetrics[u16MetricCounter].caMetricName, "chamber_temperature"); aMetrics[u16MetricCounter].type = FLOAT; aMetrics[u16MetricCounter].fMetricValue = getChamberTemperature().fCurrentValue; u16MetricCounter++; - /*Chamber Temperature Average 10s*/ + // Chamber Temperature Average 10s strcpy(aMetrics[u16MetricCounter].caMetricName, "chamber_temperature_avg10"); aMetrics[u16MetricCounter].type = FLOAT; aMetrics[u16MetricCounter].fMetricValue = getChamberTemperature().average10s.fValue; u16MetricCounter++; - /*Chamber Temperature Average 60s*/ + // Chamber Temperature Average 60s strcpy(aMetrics[u16MetricCounter].caMetricName, "chamber_temperature_avg60"); aMetrics[u16MetricCounter].type = FLOAT; aMetrics[u16MetricCounter].fMetricValue = getChamberTemperature().average60s.fValue; @@ -133,70 +133,68 @@ void taskMetrics(void *pvParameters) aMetrics[u16MetricCounter].type = FLOAT; aMetrics[u16MetricCounter].fMetricValue = getChamberTemperature().predict10s.fValue; u16MetricCounter++; - /* - //Chamber Temperature Predict 60s - strcpy(aMetrics[u16MetricCounter].caMetricName, "chamber_temperature_pred90"); - aMetrics[u16MetricCounter].type = FLOAT; - aMetrics[u16MetricCounter].fMetricValue = getChamberTemperature().predict60s.fValue; - u16MetricCounter++; - */ + // Chamber Temperature Predict 60s + strcpy(aMetrics[u16MetricCounter].caMetricName, "chamber_temperature_pred60"); + aMetrics[u16MetricCounter].type = FLOAT; + aMetrics[u16MetricCounter].fMetricValue = getChamberTemperature().predict60s.fValue; + u16MetricCounter++; - /*Inlet Flow Temperature*/ + // Inlet Flow Temperature strcpy(aMetrics[u16MetricCounter].caMetricName, "inlet_flow_temperature"); aMetrics[u16MetricCounter].type = FLOAT; aMetrics[u16MetricCounter].fMetricValue = getInletFlowTemperature().fCurrentValue; u16MetricCounter++; - /*Inlet Flow Temperature Average 10s*/ + // Inlet Flow Temperature Average 10s strcpy(aMetrics[u16MetricCounter].caMetricName, "inlet_flow_temperature_avg10"); aMetrics[u16MetricCounter].type = FLOAT; aMetrics[u16MetricCounter].fMetricValue = getInletFlowTemperature().average10s.fValue; u16MetricCounter++; - /*Inlet Flow Temperature Average 60s*/ + // Inlet Flow Temperature Average 60s strcpy(aMetrics[u16MetricCounter].caMetricName, "inlet_flow_temperature_avg60"); aMetrics[u16MetricCounter].type = FLOAT; aMetrics[u16MetricCounter].fMetricValue = getInletFlowTemperature().average60s.fValue; u16MetricCounter++; - /*Outdoor Temperature*/ + // Outdoor Temperature strcpy(aMetrics[u16MetricCounter].caMetricName, "outdoor_temperature"); aMetrics[u16MetricCounter].type = FLOAT; aMetrics[u16MetricCounter].fMetricValue = getOutdoorTemperature().fCurrentValue; u16MetricCounter++; - /*Outdoor Temperature Average 10s*/ + // Outdoor Temperature Average 10s strcpy(aMetrics[u16MetricCounter].caMetricName, "outdoor_temperature_avg10"); aMetrics[u16MetricCounter].type = FLOAT; aMetrics[u16MetricCounter].fMetricValue = getOutdoorTemperature().average10s.fValue; u16MetricCounter++; - /*Outdoor Temperature Average 60s*/ + // Outdoor Temperature Average 60s strcpy(aMetrics[u16MetricCounter].caMetricName, "outdoor_temperature_avg60"); aMetrics[u16MetricCounter].type = FLOAT; aMetrics[u16MetricCounter].fMetricValue = getOutdoorTemperature().average60s.fValue; u16MetricCounter++; - /*Return Flow Temperature*/ + // Return Flow Temperature strcpy(aMetrics[u16MetricCounter].caMetricName, "return_flow_temperature"); aMetrics[u16MetricCounter].type = FLOAT; aMetrics[u16MetricCounter].fMetricValue = getReturnFlowTemperature().fCurrentValue; u16MetricCounter++; - /*Return Flow Temperature Average 10s*/ + // Return Flow Temperature Average 10s strcpy(aMetrics[u16MetricCounter].caMetricName, "return_flow_temperature_avg10"); aMetrics[u16MetricCounter].type = FLOAT; aMetrics[u16MetricCounter].fMetricValue = getReturnFlowTemperature().average10s.fValue; u16MetricCounter++; - /*Return Flow Temperature Average 60s*/ + // Return Flow Temperature Average 60s strcpy(aMetrics[u16MetricCounter].caMetricName, "return_flow_temperature_avg60"); aMetrics[u16MetricCounter].type = FLOAT; aMetrics[u16MetricCounter].fMetricValue = getReturnFlowTemperature().average60s.fValue; u16MetricCounter++; - /*Sensor State*/ + // Sensor State sSensorSanityCheck aChecks[NUMBER_OF_SENSOR_SANITY_CHECKS]; getSensorSanityStates(aChecks); for (size_t i = 0; i < NUMBER_OF_SENSOR_SANITY_CHECKS; i++) @@ -208,25 +206,25 @@ void taskMetrics(void *pvParameters) u16MetricCounter++; } - /*Safety State*/ + // Safety State strcpy(aMetrics[u16MetricCounter].caMetricName, "safety_state"); aMetrics[u16MetricCounter].type = INTEGER_U8; aMetrics[u16MetricCounter].u8MetricValue = getSafetyState(); u16MetricCounter++; - /*Control State*/ + // Control State strcpy(aMetrics[u16MetricCounter].caMetricName, "control_state"); aMetrics[u16MetricCounter].type = INTEGER_U8; aMetrics[u16MetricCounter].u8MetricValue = getControlState(); u16MetricCounter++; - /*SNTP State*/ + // SNTP State strcpy(aMetrics[u16MetricCounter].caMetricName, "sntp_state"); aMetrics[u16MetricCounter].type = INTEGER_U8; aMetrics[u16MetricCounter].u8MetricValue = getSntpState(); u16MetricCounter++; - /*System Time*/ + // System Time time_t now; time(&now); strcpy(aMetrics[u16MetricCounter].caMetricName, "system_unixtime"); @@ -234,13 +232,13 @@ void taskMetrics(void *pvParameters) aMetrics[u16MetricCounter].i64MetricValue = now; u16MetricCounter++; - /*Uptime*/ + // Uptime strcpy(aMetrics[u16MetricCounter].caMetricName, "uptime_seconds"); aMetrics[u16MetricCounter].type = INTEGER_64; aMetrics[u16MetricCounter].i64MetricValue = (esp_timer_get_time() / 1000000U); u16MetricCounter++; - /*Wifi RSSI*/ + // Wifi RSSI wifi_ap_record_t ap; esp_wifi_sta_get_ap_info(&ap); strcpy(aMetrics[u16MetricCounter].caMetricName, "wifi_rssi"); @@ -257,7 +255,7 @@ void vSetMetrics(sMetric *paMetrics, uint16_t u16Size) if (xSemaphoreTakeRecursive(xMutexAccessMetricResponse, pdMS_TO_TICKS(5000)) == pdTRUE) { - memset(caHtmlResponse, 0, strlen(caHtmlResponse)); + memset(caHtmlResponse, 0U, strlen(caHtmlResponse)); for (uint16_t u16Index = 0U; u16Index < u16Size; u16Index++) { char caValueBuffer[64]; @@ -277,6 +275,7 @@ void vSetMetrics(sMetric *paMetrics, uint16_t u16Size) break; } + // printf("%s\n", paMetrics[u16Index].caMetricName); // printf("%s\n", caValueBuffer); strcat(caHtmlResponse, paMetrics[u16Index].caMetricName); strcat(caHtmlResponse, caValueBuffer); diff --git a/main/metrics.h b/main/metrics.h index b02342a..7f48067 100644 --- a/main/metrics.h +++ b/main/metrics.h @@ -2,9 +2,9 @@ #include -#define HTML_RESPONSE_SIZE 1024U -#define METRIC_NAME_MAX_SIZE 256U -#define METRIC_MAX_COUNT 64U +#define HTML_RESPONSE_SIZE 4096U +#define METRIC_NAME_MAX_SIZE 64U +#define METRIC_MAX_COUNT 32U typedef enum _MetricValueType { -- 2.47.1 From 15648602134b6d147affdb925dcdeb7027a305fdc24bb940f42e858ce046f093 Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 26 Dec 2024 18:49:04 +0100 Subject: [PATCH 09/13] use linear regression for preduction --- main/inputs.c | 89 +++++++++++++++++++++++++++++++------------------- main/inputs.h | 4 +-- main/metrics.c | 6 ---- 3 files changed, 56 insertions(+), 43 deletions(-) diff --git a/main/inputs.c b/main/inputs.c index a4dc2ee..c41b9e4 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -2,6 +2,7 @@ #include "freertos/task.h" #include "driver/gpio.h" #include +#include #include "esp_log.h" #include @@ -35,6 +36,7 @@ void taskInput(void *pvParameters); void initMeasurement(sMeasurement *pMeasurement); void updateAverage(sMeasurement *pMeasurement); void updatePrediction(sMeasurement *pMeasurement); +float linearRegressionPredict(const float *samples, size_t count, float futureIndex); void initInputs(void) { @@ -82,6 +84,9 @@ void initInputs(void) void initMeasurement(sMeasurement *pMeasurement) { + if (!pMeasurement) + return; + pMeasurement->state = MEASUREMENT_FAULT; pMeasurement->fCurrentValue = 0.0f; @@ -95,11 +100,6 @@ void initMeasurement(sMeasurement *pMeasurement) pMeasurement->average60s.bufferIndex = 0U; memset(pMeasurement->average60s.samples, 0U, AVG60_SAMPLE_SIZE); - pMeasurement->predict10s.fValue = 0.0f; - pMeasurement->predict10s.bufferCount = 0U; - pMeasurement->predict10s.bufferIndex = 0U; - memset(pMeasurement->predict10s.samples, 0U, PRED10_SAMPLE_SIZE); - pMeasurement->predict60s.fValue = 0.0f; pMeasurement->predict60s.bufferCount = 0U; pMeasurement->predict60s.bufferIndex = 0U; @@ -107,7 +107,11 @@ void initMeasurement(sMeasurement *pMeasurement) } void updateAverage(sMeasurement *pMeasurement) -{ /* Average form the last 10sec */ +{ + if (!pMeasurement) + return; + + // Average form the last 10sec pMeasurement->average10s.samples[pMeasurement->average10s.bufferIndex] = pMeasurement->fCurrentValue; pMeasurement->average10s.bufferIndex = (pMeasurement->average10s.bufferIndex + 1) % AVG10_SAMPLE_SIZE; @@ -124,7 +128,7 @@ void updateAverage(sMeasurement *pMeasurement) pMeasurement->average10s.fValue = sum / pMeasurement->average10s.bufferCount; - /* Average form the last 60sec */ + // Average form the last 60sec pMeasurement->average60s.samples[pMeasurement->average60s.bufferIndex] = pMeasurement->fCurrentValue; pMeasurement->average60s.bufferIndex = (pMeasurement->average60s.bufferIndex + 1) % AVG60_SAMPLE_SIZE; @@ -148,35 +152,22 @@ void updateAverage(sMeasurement *pMeasurement) } void updatePrediction(sMeasurement *pMeasurement) -{ /* Prediction of the value in 10sec */ - pMeasurement->predict10s.samples[pMeasurement->predict10s.bufferIndex] = pMeasurement->fCurrentValue; - pMeasurement->predict10s.bufferIndex = (pMeasurement->predict10s.bufferIndex + 1) % PRED10_SAMPLE_SIZE; +{ + if (!pMeasurement) + return; - if (pMeasurement->predict10s.bufferCount < PRED10_SAMPLE_SIZE) - { - pMeasurement->predict10s.bufferCount++; - } + // Update predict60s buffer + sPredict *predict60s = &pMeasurement->predict60s; + predict60s->samples[predict60s->bufferIndex] = pMeasurement->fCurrentValue; + predict60s->bufferIndex = (predict60s->bufferIndex + 1) % PRED60_SAMPLE_SIZE; + if (predict60s->bufferCount < PRED60_SAMPLE_SIZE) + predict60s->bufferCount++; - float delta10s = pMeasurement->predict10s.samples[(pMeasurement->predict10s.bufferIndex - 1) % PRED10_SAMPLE_SIZE] - pMeasurement->predict10s.samples[pMeasurement->predict10s.bufferIndex]; - if (delta10s != 0.0) - { - pMeasurement->predict10s.fValue = pMeasurement->fCurrentValue + (delta10s * pMeasurement->predict10s.bufferCount); - } - - /* Prediction of the value in 60sec */ - pMeasurement->predict60s.samples[pMeasurement->predict60s.bufferIndex] = pMeasurement->fCurrentValue; - pMeasurement->predict60s.bufferIndex = (pMeasurement->predict60s.bufferIndex + 1) % PRED60_SAMPLE_SIZE; - - if (pMeasurement->predict60s.bufferCount < PRED60_SAMPLE_SIZE) - { - pMeasurement->predict60s.bufferCount++; - } - - float delta60s = pMeasurement->predict60s.samples[(pMeasurement->predict60s.bufferIndex - 1) % PRED60_SAMPLE_SIZE] - pMeasurement->predict60s.samples[pMeasurement->predict60s.bufferIndex]; - if (delta60s != 0.0) - { - pMeasurement->predict60s.fValue = pMeasurement->fCurrentValue + (delta60s * pMeasurement->predict60s.bufferCount); - } + // Predict 60s future value using linear regression + predict60s->fValue = linearRegressionPredict( + predict60s->samples, + predict60s->bufferCount, + predict60s->bufferCount + 60.0f); } void taskInput(void *pvParameters) @@ -275,6 +266,36 @@ void taskInput(void *pvParameters) } } +float linearRegressionPredict(const float *samples, size_t count, float futureIndex) +{ + if (count == 0) + return 0.0f; // No prediction possible with no data + + float sumX = 0.0f, sumY = 0.0f, sumXY = 0.0f, sumX2 = 0.0f; + + for (size_t i = 0; i < count; i++) + { + float x = (float)i; // Time index + float y = samples[i]; // Sample value + + sumX += x; + sumY += y; + sumXY += x * y; + sumX2 += x * x; + } + + // Calculate slope (m) and intercept (b) of the line: y = mx + b + float denominator = (count * sumX2 - sumX * sumX); + if (fabs(denominator) < 1e-6) // Avoid division by zero + return samples[count - 1]; // Return last value as prediction + + float m = (count * sumXY - sumX * sumY) / denominator; + float b = (sumY - m * sumX) / count; + + // Predict value at futureIndex + return m * futureIndex + b; +} + sMeasurement getChamberTemperature(void) { sMeasurement ret; diff --git a/main/inputs.h b/main/inputs.h index 76bdc75..9af37f5 100644 --- a/main/inputs.h +++ b/main/inputs.h @@ -3,7 +3,6 @@ #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define AVG10_SAMPLE_SIZE 10U #define AVG60_SAMPLE_SIZE 60U -#define PRED10_SAMPLE_SIZE 10U #define PRED60_SAMPLE_SIZE 60U typedef enum _BurnerErrorState @@ -29,7 +28,7 @@ typedef struct _Average typedef struct _Predict { float fValue; - float samples[MAX(PRED10_SAMPLE_SIZE, PRED60_SAMPLE_SIZE)]; + float samples[PRED60_SAMPLE_SIZE]; size_t bufferIndex; size_t bufferCount; } sPredict; @@ -39,7 +38,6 @@ typedef struct _Measurement float fCurrentValue; sAverage average10s; sAverage average60s; - sPredict predict10s; sPredict predict60s; eMeasurementErrorState state; } sMeasurement; diff --git a/main/metrics.c b/main/metrics.c index 51bf772..c288bea 100644 --- a/main/metrics.c +++ b/main/metrics.c @@ -128,12 +128,6 @@ void taskMetrics(void *pvParameters) aMetrics[u16MetricCounter].fMetricValue = getChamberTemperature().average60s.fValue; u16MetricCounter++; - // Chamber Temperature Predict 10s - strcpy(aMetrics[u16MetricCounter].caMetricName, "chamber_temperature_pred10"); - aMetrics[u16MetricCounter].type = FLOAT; - aMetrics[u16MetricCounter].fMetricValue = getChamberTemperature().predict10s.fValue; - u16MetricCounter++; - // Chamber Temperature Predict 60s strcpy(aMetrics[u16MetricCounter].caMetricName, "chamber_temperature_pred60"); aMetrics[u16MetricCounter].type = FLOAT; -- 2.47.1 From 856f009e7f2d5070a48057f7f256c5a0dd99f32c8ed8b0ea30fd4f853f4706e0 Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 26 Dec 2024 18:54:50 +0100 Subject: [PATCH 10/13] add prediction to all temps --- main/inputs.c | 9 ++++++--- main/metrics.c | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/main/inputs.c b/main/inputs.c index c41b9e4..fb1a68f 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -234,15 +234,18 @@ void taskInput(void *pvParameters) sOutdoorTemperature.fCurrentValue = temp_c; sOutdoorTemperature.state = MEASUREMENT_NO_ERROR; - // updateAverage(&sOutdoorTemperature); + updateAverage(&sOutdoorTemperature); + updatePrediction(&sOutdoorTemperature); sInletFlowTemperature.fCurrentValue = temp_c; sInletFlowTemperature.state = MEASUREMENT_NO_ERROR; - // updateAverage(&sInletFlowTemperature); + updateAverage(&sInletFlowTemperature); + updatePrediction(&sInletFlowTemperature); sReturnFlowTemperature.fCurrentValue = temp_c; sReturnFlowTemperature.state = MEASUREMENT_NO_ERROR; - // updateAverage(&sReturnFlowTemperature); + updateAverage(&sReturnFlowTemperature); + updatePrediction(&sReturnFlowTemperature); break; default: break; diff --git a/main/metrics.c b/main/metrics.c index c288bea..c7aaf6f 100644 --- a/main/metrics.c +++ b/main/metrics.c @@ -152,6 +152,12 @@ void taskMetrics(void *pvParameters) aMetrics[u16MetricCounter].fMetricValue = getInletFlowTemperature().average60s.fValue; u16MetricCounter++; + // Inlet Flow Temperature Predict 60s + strcpy(aMetrics[u16MetricCounter].caMetricName, "inlet_flow_temperature_pred60"); + aMetrics[u16MetricCounter].type = FLOAT; + aMetrics[u16MetricCounter].fMetricValue = getInletFlowTemperature().predict60s.fValue; + u16MetricCounter++; + // Outdoor Temperature strcpy(aMetrics[u16MetricCounter].caMetricName, "outdoor_temperature"); aMetrics[u16MetricCounter].type = FLOAT; @@ -170,6 +176,12 @@ void taskMetrics(void *pvParameters) aMetrics[u16MetricCounter].fMetricValue = getOutdoorTemperature().average60s.fValue; u16MetricCounter++; + // Outdoor Temperature Predict 60s + strcpy(aMetrics[u16MetricCounter].caMetricName, "outdoor_temperature_pred60"); + aMetrics[u16MetricCounter].type = FLOAT; + aMetrics[u16MetricCounter].fMetricValue = getOutdoorTemperature().predict60s.fValue; + u16MetricCounter++; + // Return Flow Temperature strcpy(aMetrics[u16MetricCounter].caMetricName, "return_flow_temperature"); aMetrics[u16MetricCounter].type = FLOAT; @@ -188,6 +200,12 @@ void taskMetrics(void *pvParameters) aMetrics[u16MetricCounter].fMetricValue = getReturnFlowTemperature().average60s.fValue; u16MetricCounter++; + // Return Flow Temperature Predict 60s + strcpy(aMetrics[u16MetricCounter].caMetricName, "return_flow_temperature_pred60"); + aMetrics[u16MetricCounter].type = FLOAT; + aMetrics[u16MetricCounter].fMetricValue = getReturnFlowTemperature().predict60s.fValue; + u16MetricCounter++; + // Sensor State sSensorSanityCheck aChecks[NUMBER_OF_SENSOR_SANITY_CHECKS]; getSensorSanityStates(aChecks); -- 2.47.1 From b5229a40829cc6f13f89036ecbe74f33326231504f401d7b5e8fccd867c27f30 Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 26 Dec 2024 19:00:09 +0100 Subject: [PATCH 11/13] cleanup average function --- main/inputs.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/main/inputs.c b/main/inputs.c index fb1a68f..ba62a9e 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -137,11 +137,6 @@ void updateAverage(sMeasurement *pMeasurement) pMeasurement->average60s.bufferCount++; } - if (pMeasurement->average60s.bufferCount == 0U) - { - pMeasurement->average60s.fValue = pMeasurement->fCurrentValue; - } - sum = 0.0; for (int i = 0; i <= pMeasurement->average60s.bufferCount; i++) { -- 2.47.1 From 6b38a73d77de81e2badfbcb083e684e695cf5e85919b0e2d21bc571db2cc1574 Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 26 Dec 2024 19:08:50 +0100 Subject: [PATCH 12/13] Revert "switch to single sensor config" This reverts commit 307278e67998021e87d9acb10f14c757632de49b08a8d6c2ff8663d32952c0b0. --- main/inputs.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/main/inputs.c b/main/inputs.c index ba62a9e..8c68eb3 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -16,10 +16,10 @@ static const char *TAG = "smart-oil-heater-control-system-inputs"; const uint8_t uBurnerFaultPin = 19U; const uint8_t uDS18B20Pin = 4U; -const onewire_addr_t uChamperTempSensorAddr = 0x78000000c6c2f728; -const onewire_addr_t uOutdoorTempSensorAddr = 0x78000000c6c2f728; -const onewire_addr_t uInletFlowTempSensorAddr = 0x78000000c6c2f728; -const onewire_addr_t uReturnFlowTempSensorAddr = 0x78000000c6c2f728; +const onewire_addr_t uChamperTempSensorAddr = 0x3e0000001754be28; +const onewire_addr_t uOutdoorTempSensorAddr = 0x880000001648e328; +const onewire_addr_t uInletFlowTempSensorAddr = 0xe59cdef51e64ff28; +const onewire_addr_t uReturnFlowTempSensorAddr = 0xa7a8e1531f64ff28; onewire_addr_t uOneWireAddresses[MAX_DN18B20_SENSORS]; float fDS18B20Temps[MAX_DN18B20_SENSORS]; @@ -210,14 +210,14 @@ void taskInput(void *pvParameters) if (ds18x20_measure_and_read_multi(uDS18B20Pin, uOneWireAddresses, sSensorCount, fDS18B20Temps) != ESP_OK) { ESP_LOGE(TAG, "1-Wire devices read error"); - vTaskDelay(PERIODIC_INTERVAL * 100U / portTICK_PERIOD_MS); // Wait 100ms if bus error occurred + vTaskDelay(PERIODIC_INTERVAL * 100U / portTICK_PERIOD_MS); //Wait 100ms if bus error occurred } else { for (int j = 0; j < sSensorCount; j++) { float temp_c = fDS18B20Temps[j]; - ESP_LOGI(TAG, "Sensor: %08" PRIx64 " reports %lf°C", (uint64_t)uOneWireAddresses[j], temp_c); + // ESP_LOGI(TAG, "Sensor: %08" PRIx64 " reports %lf°C", (uint64_t)uOneWireAddresses[j], temp_c); switch ((uint64_t)uOneWireAddresses[j]) { @@ -226,17 +226,20 @@ void taskInput(void *pvParameters) sChamperTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sChamperTemperature); updatePrediction(&sChamperTemperature); - + break; + case ((uint64_t)uOutdoorTempSensorAddr): sOutdoorTemperature.fCurrentValue = temp_c; sOutdoorTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sOutdoorTemperature); updatePrediction(&sOutdoorTemperature); - + break; + case ((uint64_t)uInletFlowTempSensorAddr): sInletFlowTemperature.fCurrentValue = temp_c; sInletFlowTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sInletFlowTemperature); updatePrediction(&sInletFlowTemperature); - + break; + case ((uint64_t)uReturnFlowTempSensorAddr): sReturnFlowTemperature.fCurrentValue = temp_c; sReturnFlowTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sReturnFlowTemperature); -- 2.47.1 From 5fde319b630e2255fbbd6c27b3dc9a4630b4cb5e3a6234c22dc3edfacc5661be Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 26 Dec 2024 19:09:16 +0100 Subject: [PATCH 13/13] formatting --- main/inputs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/inputs.c b/main/inputs.c index 8c68eb3..cb90d2a 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -210,7 +210,7 @@ void taskInput(void *pvParameters) if (ds18x20_measure_and_read_multi(uDS18B20Pin, uOneWireAddresses, sSensorCount, fDS18B20Temps) != ESP_OK) { ESP_LOGE(TAG, "1-Wire devices read error"); - vTaskDelay(PERIODIC_INTERVAL * 100U / portTICK_PERIOD_MS); //Wait 100ms if bus error occurred + vTaskDelay(PERIODIC_INTERVAL * 100U / portTICK_PERIOD_MS); // Wait 100ms if bus error occurred } else { -- 2.47.1