Keringtetőszivattyú vezérlése: új év - új szabályok

Erre az évre a jól szolgáló ESP8266 nyugdíjazása és az ESP32-C3 Supermini beüzemelése volt a fő feladat.

Hirdetés

Rules

// Keringető szivattyú vezérlés
// Heartbeat alapú időzítés

on System#Boot do // csak a boot-nál fut, alap változók megadása
  TaskValueSet,1,1,34     // dtemp#tmin  min. vízhőfok
  TaskValueSet,1,2,89     // dtemp#tmax  biztonsági hőfok
TaskValueSet,2,1,455    // dtime#kering  keringetés idő sec
TaskValueSet,2,2,15    // dtime#keringp  induláskor szünet x10 sec
// változók resetelése: nincs rá szükség, de így látszik egyben, hogy mit hol használtam
Let,1,0 // időzítő
Let,2,0   // heartbeat
Let,3,0   // MQTT dummy1
Let,4,0   // MQTT dummy2
Let,5,0   // heartbeat téli-nyári mód
Let,6,0   // Protect
Let,7,0   // keringetési idő
Let,8,0   // szünet idő
  Let,9,0   // MQTT dummy3
// Start:
loopTimerSet,5,3600     // Protect/szivattyúvédelem 1 órás loop indul
  loopTimerSet,10,10      // heartbeat indul
endon
//

// Protect loop / szivattyúvédelem: óránként 1-el nő az értéke
on Rules#Timer=5 do
  Let,6,[var#6]+1     // számláló növelése
  TaskValueSet,4,3,[VAR#6]
if [var#6]>=24 // indítás 24 óránként (ha nem üzemelt a szivattyú), de kinek mi a szimpatikus.
  Publish keri/s, 'Keringetés' // MQTT üzenet: HA-ban látom, hogy nyáron is néha bekapcsolja.
// lehet erre HA automatizmust írni, ami riaszt, ha pl. 3 napig elmarad a keringetés.

  oled,7,1,Protect // oled kiíratás
  gpio,6,1         // szivattyú be
  TaskValueSet,4,1,1  // státusz ON
  Let,1,60         // protect keringetési idő
    TimerSet,3,1        // időzítő loopba
  endif
endon
//

// időzítő loop: ide kerül az, aminek le kell futnia: pl. fűtéskor vagy túlfűtéskor a keringetés
on Rules#Timer=3 do
TimerSet,10,0    // heartbeat stop, nem fogja felülbírálni a keringetést
if [VAR#1]<2     // ha az időzítő lejár
  event,hoff // hof, fűtés leállítás hívása
  else
  Let,1,[VAR#1]-2 // az időtartam csökkentése, 2 sec-es lépésekben
  TaskValueSet,4,2,[VAR#1] // oled kiíráshoz kell
  TimerSet,3,2   //# folytatja az időzítőt 2 sec múlva. Lehet más érték is, ezen frissül az oled jól
  endif
endon
//

// Termosztát kikapcsoláskor: ez maradt eseményhez kötött,
// mert az ESP vezérlős rendszer pont a fűtés túllövéseinek elkerülésére lett kitalálva

on termo#state=0 do
if [owt#t1]<[dtemp#tmax]  // leáll, ha nincs túlfűtés: a túlfűtés védelmet nem akadályozza
  event,hoff // heating off event hívása. A teljes név korábban a rövidítések áldozata lett
  else
  loopTimerSet,10,10  // heartbeat ciklus újraindul
  endif
endon
//

// Bekapcsolás (keringetés indul)
on hon do
 TimerSet,10,0    // heartbeat stop, nem fogja felülbírálni a keringetést.
// Ez egy kicsit lassú rész, ha ez nincs itt, akkor az MQTT-t a heartbeat felül tudja írni.

Publish keri/s, 'Keringetés' // MQTT üzenet
  oled,7,1,Heating!
  gpio,6,1        // szivattyú be
TaskValueSet,4,1,1    // státusz ON, OLED kiíráshoz kell
// Let,7,[dtime#kering]-([owt#t1]*2)-([owt#ext]*3) // keringetési idő számítása
// Az alap adatokban megadott kb. ideális keringetési időt módosítjuk
// Egyik módosító az előremenő víz hőfoka [owt#t1], másik a külső hőmérséklet [owt#ext]
// A szorzóval lehet állítani, hogy milyen "súlyozással" vegye számításba.
// Végül egy egyszerűbb képletet használtam, jobb ezzel a matek:
Let,7,[dtime#kering]-(([owt#t1]+[owt#ext])*3) // előremenő hőmérsékletével csökken,
// kint ha hidegebb van, akkor nő a keringetési idő.
Let,1,{constrain:[var#7]:210:420} // keringetési idő beállítása: constrain nekem új volt, // kivált néhány if-else ciklust. Qwen3 AI javasolta. Constrain-ban nem lehet művelet,
// ezért az értéket előtte var 7 változóba számolja ki.
// A lényeg, hogy igy érték:minimum:maximum formában korlátozzuk a fűtési idő hosszát.
// ez hasznos, ha biztosan szeretnénk, hogy lefusson akkor is, ha hiba van a számításban.
  Let,8,60-([var#1]/10)           // szünet idő, a keringetési idővel kalkulálva
Let,8,{constrain:[var#8]:18:39} //constrain: var8 értéke 18 és 39 közötti lehet csak
  TaskValueSet,2,2,[var#8]    // szünet idő beállítása

 TimerSet,3,1            // időzítő loopba
endon

// Keringetés vége
on hoff do
  gpio,6,0          // szivattyú ki
  TaskValueSet,4,1,0  // státusz OFF
TimerSet,3,0        // timer reset: megállítja az időzítő loop-ot
Let,2,0             // számláló reset: heartbeat nullázódik
// a fűtési ciklusok közé iktatott szünetnek
Let,3,0             // MQTT reset: ha ez nincs, akkor pl. szünet után fűtés majd újra
// szünet esetén az MQTT és az OLED nem frissülne, mert azt átugorja
  Let,6,0             // Protect loop reset
  loopTimerSet,10,10  // vissza heartbeat ciklusba
endon
//
// Túlfűtés esetén
on hover do
  TimerSet,10,0    // heartbeat stop
  Publish keri/s, 'Túlfűtés'
  oled,7,1,OVERHEAT
  gpio,6,1          // szivattyú be
  TaskValueSet,4,1,1  // státusz ON
  Let,1,600          // keringetési idő
TimerSet,3,1       // időzítő loopba
endon
//
// Heartbeat loop
on Rules#Timer=10 do
  Let,2,[var#2]+1     // számláló növelés
  TaskValueSet,4,2,[var#2]  // oled kiírás
// túlfűtéskor hover hívása
  if [owt#t1]>[dtemp#tmax]
    event,hover
  endif
//
  // Fűtés: feltételek
if [termo#state]!=0 and [ha#ha]!=1 // termosztát és szellőztetés
// fontos a != (nem egyenlő), biztosabb, "hibatűrőbb" a rendszer:
// ha a termosztát nincs kikapcsolva és ha az ablakok nincsenek nyitva
  if [owt#t1]>[dtemp#tmin] and [var#2]>=[dtime#keringp] // min hőfokot elérte és nincs szünetben
      event,hon
    endif
  endif
//
// --- oled, MQTT---
  if [ha#ha]!=0       // ha a HA jelezte a nyitott ablakokat
    Let,3,1
    if [var#3]!=[var#4]
      Publish keri/s, 'Ablakok'
      oled,7,1,Ablakok
      gpio,6,0            // szivattyú ki
      TaskValueSet,4,1,0  // státusz OFF
    endif
  endif
  if [pump#state]=0 and [ha#ha]=0 and [var#2]<=[dtime#keringp]   // keringetés szünetel
    Let,3,2
  if [var#3]!=[var#4]   // ha var 3 és var 4 nem egyenlő, akkor fut.
      // eredmény: csak változáskor frissül az MQTT és az OLED
    Publish keri/s, 'Szünet'
      oled,7,1,Pause
    endif
  endif
  if [pump#state]=0 and [ha#ha]=0 and [var#2]>[dtime#keringp]   // watch
    Let,3,3
    if [var#3]!=[var#4]
      Publish keri/s, 'Watch'
      oled,7,1,Watch
    endif
  endif
  
  If [var#3]=[var#4]
  Let,9,[var#9]+1 // kell egy újabb számláló...  
  else
  Let,4,[var#3]  // var 3 értéket var 4-be másoljuk, ez kell a változásonkénti MQTT kiíráshoz
  endif
  
  If [var#9]>=12   // ~120 sec-ként MQTT újraküldés mindenképp
    Let,4,0    // MQTT dummy reset
    Let,9,0    // MQTT dummy számláló reset
  endif
//
  // --- Téli-Nyári mód ---
  if [owt#t1] >= 26 and [var#5] != 1   // Meleg víz → gyors figyelés (10 mp)
    Let,5,1
// var 5-el nézi, hogy ha már a nyári mód aktív, akkor a timer reset-et átugorja
    loopTimerSet,10,10
  elseif [owt#t1] < 26 and [var#5] != 2   // Hideg víz → lassú figyelés (300 mp)
    Let,5,2
    loopTimerSet,10,300
  endif
endon

A cikk még nem ért véget, kérlek, lapozz!