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 indulendon
//// Protect loop / szivattyúvédelem: óránként 1-el nő az értékeon 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 endifendon
//// időzítő loop: ide kerül az, aminek le kell futnia: pl. fűtéskor vagy túlfűtéskor a keringetéson 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 endifendon
// // 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 endifendon
// // 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ő loopbaendon
// Keringetés végeon 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 ciklusbaendon//// Túlfűtés eseténon 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ő loopbaendon//// Heartbeat loopon 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 endifendon
A cikk még nem ért véget, kérlek, lapozz!



