Az ötlet onnan eredt, hogy lecserélésre került nálunk a régi gázcirkó kazánunk egy korszerű kondenzációs kazánra (ez egy Bosch gyártmányú készülék). És mivel a mostani energia árakat figyelembevéve érdemes kicsit hatékonyabban kezelni ezeket a készülékeket utána néztem , hogy milyen lehetőségek vannak.
Kiderült, hogy ez a kazán képes már az un. modulációs technológiával dolgozni és busz rendszerű interfésze van (Bosch esetében ez az un. EMS).
Ekkor került képbe az OpenTherm , bár sajnos ez a kazán direktben nem vezérelhető OpenTherm interfészen, de mint kiderült erre is van megoldás a NEFIT által gyártott OpenTherm to EMS konverter.
És persze felmerül a kérdés, hogy mire jó ezt úgymond “barkácsolni” amikor erre léteznek kész megoldások, komplett termosztát rendszerek ? Hát a kihívás az érdekes feladat és a költségeket tekintve sem mindegy, mivel pl. a Bosch erre kitalált gyári megoldásánál (ami egyébként nem teljesen ugyan erre a feladatra alkalmas)
csak maga a termosztát egy központi hőmérővel több mint 200 €. Ennek a megoldásnak – nyilván ha az alap infrastruktúrát nem nézzük, mert az más célra is használatos – a bekerülési költsége (csak hardver) 6 hőmérővel számolva ~ 50 € + a NEFIT konverter ami szintén ~ 50 € , de ahogy említettem ez nagyon sok új kazán esetében már nem szükséges, mert támogatják a szabványt. A szoftver részét nem számolom, mert az egy fejlesztői vénával rendelkező embernek csak szórakozás 🙂
Az egész projekt alapja egy előzőből ered, ami itt megtekinthető, ez az általam készített és BlueTherm-nek nevezett hőmérséklet figyelő és naplózó hardver és alkalmazás lett a jelenlegi projekt egyik modulja.
A kiindulópont és az alaphardver innen eredeztethető, mivel megtaláltam a weben Ihor Melnyik DIYLESS oldalán a szükséges hardver elemet innen már nem volt megállás, Az alap elképzelés az alábbi, ezt egészítettem ki a helyiségenként hőméréssel és az adatgyűjtéssel és az Androidos vezérlő alkalmazással, ami elkészült tablet-es verzióban is az otthoni használatra és mobil verzióban a távoli eléréshez:
Szóval ha szerencsések vagyunk és van egy olyan kazánunk, ami alapból tudja az OpenTherm parancsokat fogadni, akkor a fenti hardver elegendő a működtetéséhez, a többi csak a program. Mint ahogy már említettem a buszos (jelen esetben EMS interfészt fogadó) kazán esetében egy közbe iktatott modul, jelen esetben itt az OpenTherm to EMS megoldja ezt az apró problémát.
Csak zárójelben jegyzem meg, hogy a hardver és a szoftver képes egy egyszerű relé kapcsolós termosztátot is helyettesíteni, ami szintén előnyős lehet, mert azok a funkciót ilyenkor is rendelkezésre állnak, hogy:
– helyiségenként hőmérés és vezérlés, távoli elérés, adatok naplózása, stb.
Ezzel egy régebbi egyszerű kazán is kezelhető, nyilván ez energia hatékonysági szempontból nem a legoptimálisabb – többek között ezért is találták ki ezeket a korszerű modulációs elven működő kazánokat.
De akkor lássuk a tényleges kivitelezést, aki már szorgalmas volt az elolvasta a már említett BlueTherm projektet, ezzel a résszel most nem foglalkoznék. Tehát vannak már perce pontos hőmérséklet adataink a különböző helyiségekről, ezt használja inputként maga a kazánvezérlő ami két hardver elemből áll egy Wemos D1 mini illetve a DIYLESS OpenTherm Master Shield. A csatlakozók kivitelezése lehetővé teszi, hogy egyszerűen össze pattintsuk a két panelt, így nincs szükség külön forrasztásra, kábelezésre. USB-n keresztül adhatunk neki tápot, mivel az 5V-ot igényli és egy kis műszerdobozba elhelyezhető – én egy relét is raktam mellé, a már említett hagyományos kapcsolós üzemmódhoz, de erre feltétlenül nincs szükség.
A lényegesebb kódrészek (WEMOS) a kazán adatainak lekérése:
bool getBoiler() {
bool res = false;
unsigned long response = bosch.setBoilerStatus(enableCentralHeating, enableHotWater, enableCooling);
OpenThermResponseStatus responseStatus = bosch.getLastResponseStatus();
if (responseStatus == OpenThermResponseStatus::SUCCESS) {
device_response = responseStatus;
flame = bosch.isFlameOn(response);
device_pressure = bosch.getPressure();
heating_temperature = bosch.getBoilerTemperature();
water_temperature = bosch.getDHWTemperature();
modulation = device_modulation();
enableHotWater = bosch.isHotWaterActive(response);
enableCentralHeating = bosch.isCentralHeatingActive(response);
res = true;
}
if (res) {
Serial.println(getTimestamp());
Serial.println("Boiler '" + BOILER_NAME + "' actually parameters");
Serial.println("");
Serial.println("Response: " + String(device_response));
Serial.println("Central Heating: " + String(enableCentralHeating ? "on" : "off"));
Serial.println("Hot Water: " + String(enableHotWater ? "on" : "off"));
Serial.println("Flame: " + String(flame ? "on" : "off"));
Serial.println("Central Heating water pressure is " + String(device_pressure) + " bar");
Serial.println("Hot Water temperature is " + String(heating_temperature) + " °C");
Serial.println("Central Heating temperature is " + String(water_temperature) + " °C");
Serial.println("Central Heating Modulation: " + String(modulation));
Serial.println("--------------------");
}
if (OPEN_THERM_MODE == false) res = true;
return res;
}
A pillanatnyi adatokat közlő JSON válasz:
{"deviceid":"BC:FF:4D:DB:C4:39","data":{"response":"0","message":"Bosch Condens 2300i W GC2300W 24/30","heater":"50.00","water":"55.00","pressure":"2.00","enableCentralHeating":"1","enableHotWater":"1","modulation":"0.00","flame":"1","temperature":"21.50","roomTemperature":"0.00","timestamp":"2023-03-22 10:04:41"}}
illetve a modulációhoz szükséges adatok elküldése:
float pid(float sp, float pv, float pv_last, float& ierr, float dt) {
float KP = 10;
float KI = 0.02;
// upper and lower bounds on heater level
float ophi = UPPER_HEATER;
float oplo = LOWER_HEATER;
// calculate the error
float error = sp - pv;
// calculate the integral error
ierr = ierr + KI * error * dt;
// calculate the measurement derivative
float dpv = (pv - pv_last) / dt;
// calculate the PID output
float P = KP * error; //proportional contribution
float I = ierr; //integral contribution
float op = P + I;
// implement anti-reset windup
if ((op < oplo) || (op > ophi)) {
I = I - KI * error * dt;
// clip output
op = max(oplo, min(ophi, op));
}
ierr = I;
Serial.println("sp="+String(sp) + " pv=" + String(pv) + " dt=" + String(dt) + " op=" + String(op) + " P=" + String(P) + " I=" + String(I));
return op;
}
void updateData()
{
bool enableCentralHeating = true;
bool enableHotWater = true;
bool enableCooling = false;
unsigned long response = bosch.setBoilerStatus(enableCentralHeating, enableHotWater, enableCooling);
OpenThermResponseStatus responseStatus = bosch.getLastResponseStatus();
if (responseStatus != OpenThermResponseStatus::SUCCESS) {
Serial.println("Error: Invalid boiler response " + String(response, HEX));
}
temperature = getTemperature();
new_ts = millis();
dt = (new_ts - ts) / 1000.0;
ts = new_ts;
if (responseStatus == OpenThermResponseStatus::SUCCESS) {
op = pid(sp, temperature, temperature_last, ierr, dt);
bosch.setBoilerTemperature(op);
}
temperature_last = temperature;
Serial.println(getTimestamp() + " : Current temperature is " + String(temperature) + " °C");
}
A kazánvezérló természetesen a kazán pillanatnyi adatait folyamatosan küldi a háttér adatbázisba, ahonnan ez lekérdezhető. Post-Bosch.php
És akkor jöjjön maga a termosztát, ami egy Android alatt futó alkalmazás mobilra és tabletre optimalizált képernyővel. A működés az roppant egyszerű, a BlueTherm által gyűjtött adatokat felhasználva, ki lehet választani egy helyiséget amihez képest szeretnénk a hőmérsékletet tartani. Ezt az információt elküldi a termosztát a kazán vezérlő Wemos-nak, ami ezt az információt felhasználva küldi az adatokat a kazánnak.
A termosztáton be tudjuk állítani a kért hőmérsékletet (a kör felső értéke) , ezen felül a háttér adatbázisban létezik egy program tábla, ami tartalmazza a programozott hőmérséklet adatokat, ami alapján a termosztát kiválasztja a kért hőmérséklet értékét
Ezek a finomítások még hiányoznak az Android programból, hogy a program tábla szerkesztése, a kazán adatok kijelzése, statisztika, riportok, stb.
A kazánvezérlő dobozolva
sqo2z6