L’idea è quella di realizzare un sistema per il controllo del riscaldamento e dell’acqua calda sanitaria in ambiente domestico. Il sistema sarà realizzato con hardware e software opensource e permetterà l’integrazione con la domotica attualmente in commercio.
Nell’impianto termico è possibile includere una caldaia, un impianto solare con accumulo, termosifoni, impianto radiante e acqua calda sanitaria.
Il sistema si concentra prima sul monitoraggio delle temperatura e dei consumi e poi su un controllo focalizzato a ridurre i consumi e soprattutto gli sprechi causati da un impianto mal calibrato.

Leggi di più: https://github.com/mastroalex/TCS
Architettura del sistema

Diversi sensori leggono informazioni ambientali, principalmente temperatura. I dati vengono memorizzati in un server remoto e vengono utilizzati per controllare l’impianto termico.
Oltre alle differenze di temperatura e alle dispersioni termiche il sistema tiene conto anche delle condizioni ambientali e delle previsioni meteorologiche. Nella fase iniziale non viene considerata la gestione della caldaia ma il suo spegnimento può essere forzato solo in base alle informazioni meteo (sfruttando il solare). La gestione della caldaia è lasciata alla centralina solare.
Questa prima fase prevede uno studio delle temperature e delle dispersioni termiche e una registrazione dei dati. I dati sono raccolti e memorizzati sia con la piattaforma SinricPro sia un database remoto privato, visualizzatili da pagina web con grafici interattivi.
Ogni sensore inoltre prevede un proprio webserver, raggiungibile solo da rete locale, che permette la lettura dei sensori.
In una seconda fase verrà aggiunto anche il sistema di controllo vero e proprio.
Verrà inoltre aggiunta la gestione del riscaldamento di più ambienti con radiatori e la gestione dei condizionatori tramite un controllo RF.
Il sistema prevede anche la realizzazione di cronotermostati e sensori per il benessere e il comfort ambientale. Saranno inoltre aggiunti dispositivi di sicurezza termica e rilevatori di metano (o GPL).
Infine, dopo un lungo periodo di test, il sistema andrà a sostituire anche la centralina solare.
Struttura dell’impianto tipo
L’impianto termico prevede un sistema solare con accumulo. Una caldaia che riscalda l’accumulo e i termosifoni. Il sistema di acqua calda sanitaria prevede anche una pompa di ricircolo.
In questo articolo viene considerato questo impianto ma il sistema sensoriale è facilmente estensibile ad ogni impianto termico scalando il numero di sensori richiesto. Chiaramente il sistema di controllo richiede uno studio ad hoc e quanto realizzato è stato studiato e testa per l’impianto termico di riferimento.

Sensori
Temperatura ed umidità
La temepratura viene letta mediante DHT22 (con cui sono stati sostituiti i precedenti DHT11) per gli ambienti. Per i pozzetti e ovunque sia richiesto un sensore impermeabile vengono utilizzati i DS18B20.

Il vantaggio dei DS18B20, oltre la grande precisione, è legato al protocollo di comunicazione che permette facilmente di leggerne diversi, connessi su una sola linea dati.
È possibile creare una libreria ad hoc implementando la configurazione e la lettura di diversi sensori. Il vettore tempvec contiene i valori di versi sensori.
#include
#include
const int oneWireBus = D5; // GPIO where the DS18B20 is connected to
OneWire oneWire(oneWireBus);
DallasTemperature sensors(&oneWire);
int numberOfDevices;
float tempvec[] = {0, 0, 0, 0}; // set zero for all the sensor
DeviceAddress tempDeviceAddress;
…
void dsaggiornamento() {
for (int i = 0; i < numberOfDevices; i++) {
// Search the wire for address
if (sensors.getAddress(tempDeviceAddress, i)) {
// Output the device ID
Serial.print("Temperature for device: ");
Serial.println(i, DEC);
// Print the data
float tempC = sensors.getTempC(tempDeviceAddress);
Serial.print("Temp C: ");
Serial.println(tempC);
tempvec[i] = tempC;
}
}
}
…
void ds_set() {
sensors.begin(); // Start the DS18B20 sensor
numberOfDevices = sensors.getDeviceCount();
// Loop through each device, print out address
for (int i = 0; i < numberOfDevices; i++) {
// Search the wire for address
if (sensors.getAddress(tempDeviceAddress, i)) {
Serial.print("Found device ");
Serial.print(i, DEC);
Serial.print(" with address: ");
printAddress(tempDeviceAddress);
Serial.println();
} else {
Serial.print("Found ghost device at ");
Serial.print(i, DEC);
Serial.print(" but could not detect address. Check power and cabling");
}
}
}

Implementando la lettura e il webserver possiamo leggere i valori accendendo all’indirizzo ip del dispositivo.


Consumo elettrico
Il consumo elettrico può essere misurato mediante dei sensori CT. Può essere utile per capire se sono accesi o meno dei dispositivi quali pompe, ventilatori, ecc.
Flusso
I sensori di flusso utilizzati si basano sul sensore di Hall che fornisce un segnale proporzionale alla rotazione. Ogni rotazione rappresenta 2,25 mL di flusso.
Attuatori
Possono essere utilizzati differenti dispositivi.
Sicuramente saranno utilizzati dei contatti puliti per controllare dei relè.
Gestione dei dati
I dati vengono letti mediante un Nome MCU ESP8266.
Web server
Il web server permette di leggere facilmente il sensore da rete LAN.
La pagina è costituita dai dei contenitori che contengono il valore aggiornato dai sensori.
<p>
<i class="fas fa-thermometer-half" style="color:#059e8a;"</i>
<span class="dht-labels">Temperature</span>
<span id="temperature">%TEMPERATURE%</span>
<sup class="units">°C</sup>
</p>
Il valore viene continuamente aggiornato.
<script>
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("temperature").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/temperature", true);
xhttp.send();
}, 10000 ) ;
Server remoto
Connettendo il dispositivo a internet è possibile inviare i dati su una server remoto. Questo viene fatto con una richiesta HTTP POST.
String httpRequestData = "api_key=" + apiKeyValue + "&value1=" + String(temp1) + "&value2=" + String(temp2) + "";
Serial.print("httpRequestData: ");
Serial.println(httpRequestData);
Quindi i dati vengono ricevuti da una pagina php che, dopo aver verificato i criteri di sicurezza, salva i dati nel database.
Una seconda pagina si occupa di leggere il database e caricare i grafici. Vengono utilizzate le librerie Highcharts fornendogli i dati.
var chartT = new Highcharts.Chart({
chart:{ renderTo : 'chart-temperature' },
title: { text: 'Temperature Boiler1' },
series: [{
showInLegend: false,
data: value1
}],
plotOptions: {
line: { animation: false,
dataLabels: { enabled: true }
},
series: { color: '#059e8a' }
},
xAxis: {
type: 'datetime',
categories: reading_time
},
yAxis: {
title: { text: 'Temperature (Celsius)' }
//title: { text: 'Temperature (Fahrenheit)' }
},
credits: { enabled: false }
});
Integrazione con Alexa
Il sistema di domotica più sviluppato è sicuramente l’ecosistema Amazon Alexa per cui è prevista l’integrazione tramite SinricPro. Richiamando le librerie si caricano le funzionalità di SinricPro che permettono la comunicazione con il loro cloud.
#include <SinricPro.h>
#include "SinricProTemperaturesensor.h"
bool onPowerState(const String &deviceId, bool &state) {
Serial.printf("Temperaturesensor turned %s (via SinricPro) \r\n", state ? "on" : "off");
deviceIsOn = state; // turn on / off temperature sensor
return true; // request handled properly
}
void handleTemperaturesensor() {
if (deviceIsOn == false) return; // device is off...do nothing
unsigned long actualMillis = millis();
if (actualMillis - lastEvent < EVENT_WAIT_TIME) return; //only check every EVENT_WAIT_TIME milliseconds
t = dht.readTemperature(); // get actual temperature in °C
// temperature = dht.getTemperature() * 1.8f + 32; // get actual temperature in °F
h = dht.readHumidity(); // get actual humidity
if (isnan(t) || isnan(h)) { // reading failed...
Serial.printf("DHT reading failed!\r\n"); // print error message
return; // try again next time
}
if (t == lastTemperature || h == lastHumidity) return; // if no values changed do nothing...
SinricProTemperaturesensor &mySensor = SinricPro[TEMP_SENSOR_ID]; // get temperaturesensor device
bool success = mySensor.sendTemperatureEvent(t, h); // send event
if (success) { // if event was sent successfuly, print temperature and humidity to serial
Serial.printf("Temperature: %2.1f Celsius\tHumidity: %2.1f%%\r\n", t, h);
} else { // if sending event failed, print error message
Serial.printf("Something went wrong...could not send Event to server!\r\n");
}
lastTemperature = t; // save actual temperature for next compare
lastHumidity = h; // save actual humidity for next compare
lastEvent = actualMillis; // save actual time for next compare
}
// setup function for SinricPro
void setupSinricPro() {
// add device to SinricPro
SinricProTemperaturesensor &mySensor = SinricPro[TEMP_SENSOR_ID];
mySensor.onPowerState(onPowerState);
// setup SinricPro
SinricPro.onConnected([]() {
Serial.printf("Connected to SinricPro\r\n");
});
SinricPro.onDisconnected([]() {
Serial.printf("Disconnected from SinricPro\r\n");
});
SinricPro.begin(APP_KEY, APP_SECRET);
SinricPro.restoreDeviceStates(true); // get latest known deviceState from server (is device turned on?)
}
E nel loop si aggiornano richiamando handleTemperaturesensor().


Sistema di controllo
Il sistema si concentra prima sul monitoraggio delle temperatura e dei consumi. Una seconda fase prevede un controllo focalizzato a ridurre i consumi e soprattutto gli sprechi causati da un impianto mal calibrato.
Esempi di lettura
Lettura di una settimana nel periodo estivo
Nel seguente grafico la lettura dei sensori per l’ambiente tecnico, per la caldaia e l’accumulo.
Avendo ottimizzato la richiesta termica del puffer la caldaia non parte e non fornisce energia termica all’accumulo. la mandata ed il ritorno della caldaia rimangono fisse, simili alla temepratura ambiente. L’accumulo segue un andamento periodico (si ripete 7 volte nella settimana) in cui la temepratura cala la notte e aumenta con il progressivo salire del sole. Chiaramente può essere influenzato dalla richiesta di acqua calda.
Il grafico contiene 4 spline su 2017 punti, un campionamento ogni 5 minuti. Lo sfasamento temporale tra le diverse temperature temporale è compreso in ± 2 min e nella temperatura c’è una risoluzione di 0.0625°C con un errore massimo di ±1°C. Ta rappresenta la media della temperatura ambientale.
Lettura stanze
Lettura nelle 24 ore di temperatura ed umidità da una camera da letto.
Nel seguente grafico 1 mese di lettura di diversi sensori posti in varie stanze.
I dati sono stati esportati dal database e aggiunti ad un file CSV al quale è stato aggiunto il vettore contenente il tempo. Il tutto è stato fatto in MATLAB e poi caricato nelle librerie Highcharts.
Ad esempio, per il vettore tempo:
t1=datetime(2021,06,11,11,10,00)
t2=datetime(2021,07,11,11,10,00)
t=[t1:minutes(5):t2]'