Na lange stilte maar weer eens een update van mijn kant. De ontwikkeling van de rules was een beetje stil komen te liggen door de onstabiliteit van HeishaMon. Voor zover ik 't kan plaatsen was dat een combinatie van onstabiliteit in de firmware (er werd een hele boel tegelijk ontwikkeld) en de beperkte capaciteit van de op EPS8266 gebaseerde HeishaMon small in combinatie met alle opties + grote rules set gebruiken.
Deze problemen zijn allemaal zo'n beetje verdwenen met de EPS32 gebaseerde HeishaMon Large met Firmware 3.8.
Ik zat de laatste tijd nog wat te klooien met de TaShift functie maar die draait nu ook stabiel. Daarom maar weer eens tijd om mijn rules set te plaatsen. Ter lering & vermaak, gebruik (van delen of geheel) op eigen risico!
Functionaliteit:
TaShift: Aanpassen TaTarget t.b.v. 1) Softstart functie (Hz zo snel mogelijk naar beneden, 2) Kamertemperatuurdelta en 3) wens om compressor minimaal 1 uur te laten draaien.
OpenThermThermostat: AAN/UIT schakelen WP (@SetHeatpump 1/0) op basis van vraag Thermostaat
DHW: standaard DHW productie begin van de middag en legionellarun op zaterdag. Als DHW temperatuur te ver gezakt is wordt DHW run ook op andere tijdstippen gestart maar dan liefts nog wel na 10:00u. Als op vrijdag DHW wordt geproduceerd dan ook maar de Legionellarun op vrijdag, die hoeft dan niet meer op zaterdag.
PumpDuty: De pompsnelheid wordt laag gehouden om stromingsgeluiden te voorkomen. Omdat ik met (gedeeltelijke) naregeling werk varieert de stromingsweerstand van mijn installatie waarop de pompsnelheid wordt aangepast. Hierbij wordt de minimale flow om E62 error te voorkomen in acht genomen.
Quietmode: QM 0 tot 3 worden ingesteld voor minder geluid 's nachts en ook om hoge Hz bij opstarten tegen te gaan. Tijdens DHW productie overdag worden de remmen iets los gelaten om makkelijker het hoge temperaturen te produceren.
SyncOT: Geselecteerde parameters van de WP wordt via OpenTherm protocol doorgegeven aan OpenTherm Gateway en Thermostaat. chEnable wordt, omdat deze parameter van Evohome wat onbetrouwbaar is met wat safeguards omgezet in #chEnable en roomtempdifference (verschil tussen gewenste en gemeten kamertemperatuur) wordt uitgelezen. Deze waarde komt in mijn geval via Home Assistant via de OpenTherm Integratie/Gateway middels parameter ?roomTempSet omdat Evohome deze waarde niet doorgeeft (is natuurlijk ook lastig bij een zonesysteem).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
| on System#Boot then
print('BLB Heishamon_rules20241123.txt');
print('my environment: Panasonic WH-MDC07J3E5 HeishaMon Large with CZ-TAW1 on proxy port Honeywell Evohome Opentherm Thermostat (R8810 bridge) connected via OpenTherm Gateway.');
print('Honeywell Evohome & OpenTherm Gateway integration in Home Assistant to communicate RoomTemperatureDelta to HeishaMon rules as chSetpoint from Evohome is not reliable. Settings Heat Pump:');
print('Operating_Mode_State: 0, Heating_Mode: 0, Cooling_Mode: 1, Buffer_Installed: 0, DHW_Installed: 1, Pump_Flowrate_Mode: 0, Optional_PCB: 0, Z1_Sensor_Settings: 0');
#allowDHW = 1;
#allowOTT = 1;
#allowTaShift= 1;
#allowPumpDuty = 1;
#allowQuietMode = 1;
#allowSynchHP = 1;
#allowSyncOT = 1;
#chEnable = -1;
#chEnableOffTime = -1;
#chEnableTimeOff = -1;
#CompFreqTarget = -1;
#CompRunTime = -1;
#CompRunSec = -1;
#CompState = -1;
#CompStateChangeTime = -1;
#Debug = 1;
#DHWRun = -1;
#FirstBoot = 1;
#Heat = -1;
#HPStateP = -1;
#HPStateR = -1;
#LegionellaRunDay = 7;
#MaxPumpDuty = -1;
#MaxPumpFlow = -1;
#OMP = -1;
#OMR = -1;
#QMR = -1;
#RemoteOverRide = -1;
#RoomTempDelta = -1;
#RoomTempSet = -1;
#SHifT = -1;
#Time = -1;
#WarCor = -1;
setTimer(1,60);
setTimer(2,10);
end
on TaShift then
#allowTaShift = #allowTaShift + 1;
if #allowTaShift > 20 then #allowTaShift = 2; end
if (#CompRunTime < 15 || #allowTaShift == 2) && #DHWRun < 1 && @ThreeWay_Valve_State == 0 then
if #Debug > 10 then $com = 'basic conditions for TaShift fullfilled'; end
#SHifT = @Z1_Heat_Request_Temp;
if #CompState > 0 then
if #Debug > 1 || #RemoteOverRide > 0 then print('TaShift if Compressor is running'); end
TaShift2();
else
$StopTime = -2 * @Outside_Temp - 30;
if #CompState == 0 && #CompRunTime > $StopTime && #CompRunTime < 2 then
if #Debug > 10 then $com = 'if compressor is off for a relative short time (depending on outside temperature) SHifT to -5 to avoid short cycle'; end
#SHifT = -5;
else
if #Debug > 10 then $com = 'SHifT back to 0 when compressor is off and $StopTime is over '; end
#SHifT = 0;
end
end
if (%hour > 22 || %hour < 7) && @Outside_Temp < 3 && #SHifT > -3 && (@Main_Outlet_Temp - @Z1_Water_Target_Temp) < 0.5 && #CompState > 0 then
if #Debug > 10 then $com = 'Between 23h and 7h SHifT -1 to switch off compressor a bit earlier'; end
#SHifT = -1 + #SHifT;
end
if #Debug > 10 then $com = 'shift Z1HRT if required but not outside the range -5 to +5'; end
#SHifT = min(max(#SHifT, -5), 5);
if #SHifT != @Z1_Heat_Request_Temp && #RemoteOverRide < 1 then @SetZ1HeatRequestTemperature = #SHifT; end
end
end
on TaShift2 then
$WarTemp = @Z1_Water_Target_Temp - @Z1_Heat_Request_Temp;
if #CompRunSec < 180 && #CompState == 1 then
#SHifT = ceil(@Main_Outlet_Temp - 4) - ($WarTemp);
if @Defrosting_State > 0 then #SHifT = #SHifT - 2; end
$a = '1, CRS < 180';
elseif #CompRunTime < (30 - @Outside_Temp) then
#SHifT = ceil(@Main_Outlet_Temp - 1.8) - ($WarTemp);
$a = concat('2, CRT < ', (30 - @Outside_Temp));
#WarCor = #SHifT;
elseif #RoomTempDelta > -0.3 && #RoomTempDelta < 0.3 then
$a = '3 (room temp ok )';
elseif #RoomTempDelta < 0 then
#SHifT = ceil(@Main_Outlet_Temp - round(#RoomTempDelta * -3)) - $WarTemp + #WarCor;
$a = '4 (room temp to low)';
else
#SHifT = ceil(@Main_Outlet_Temp - round(#RoomTempDelta * -3)) - $WarTemp + #WarCor;
$a = '5 (room temp to hot, CF)';
if (@Main_Outlet_Temp - @Z1_Water_Target_Temp - #SHifT) > 1.8 then
#SHifT = ceil(@Main_Outlet_Temp - 1.8) - $WarTemp;
$a = '6 (room temp to hot, limit #SHifT)';
end
end
if #Debug > 0 || #RemoteOverRide > 0 then print('TaM phase ', $a, ' CRS: ', #CompRunSec, ' CRT: ', #CompRunTime, ' RTD: ', #RoomTempDelta, ' SHifT: ', #SHifT, ' MOT: ', @Main_Outlet_Temp, ' Z1T: ', @Z1_Water_Target_Temp); end
#SHifT = min(#SHifT, 2);
end
on HeatPumpState($a) then
if @Heatpump_State != #HPStateR && #RemoteOverRide != -1 then
print('HeatPumpState, origin: ', $a);
@SetHeatpump = #HPStateR;
end
end
on OperatingMode then
if @Operating_Mode_State != #OMR then @SetOperationMode = #OMR; end
end
on OpenThermThermostat then
if #allowOTT == 1 && #RemoteOverRide < 3 && #DHWRun < 1 && @ThreeWay_Valve_State == 0 && @Defrosting_State == 0 then
if #chEnable == 1 && #RoomTempDelta < 0.3 then
#HPStateR = 1;
HeatPumpState('OTTon');
end
$OTT = 0;
if #RoomTempDelta > 1 || #chEnableOffTime > 30 then
$OTT = 1;
elseif #chEnableOffTime > 15 && #CompRunTime < -15 then
$OTT = 2;
elseif #chEnableOffTime > 5 && %hour > 22 then
$OTT = 3;
end
if $OTT > 0 && @ThreeWay_Valve_State == 0 && (#CompRunTime > 90 || #CompState == 0) && @Outside_Temp > -5 then
if #Debug > 0 || #RemoteOverRide > 0 then print('OTT first condtition is TRUE, $OTT: ', $OTT); end
if @ThreeWay_Valve_State == 0 && (#CompRunTime > 90 || #CompState == 0) && @Outside_Temp > -5 && #HPStateR != 0 then
#HPStateR = 0;
HeatPumpState('OTToff');
if @Operating_Mode_State != 0 then @SetOperationMode = 0; end
#allowOTT = 2;
setTimer(7,600);
end
if #chEnable == 0 && #allowOTT != 2 then
#allowOTT = 3;
setTimer(7,25);
end
end
end
end
on DHW then
if #allowDHW == 1 && #RemoteOverRide < 4 then
#allowDHW = 2;
if @ThreeWay_Valve_State == 0 && (@DHW_Temp < (@DHW_Target_Temp + @DHW_Heat_Delta - 5) || (%hour == 13 && (%day == #LegionellaRunDay || @DHW_Temp < (@DHW_Target_Temp + @DHW_Heat_Delta)))) then
#DHWRun = 1;
#OMP = @Operating_Mode_State;
#HPStateP = @Heatpump_State;
if #OMP == 0 then
#OMR = 4;
elseif #OMP == 1 then
#OMR = 5;
else
#OMR = 3;
end
OperatingMode();
#HPStateR = 1;
HeatPumpState('DHWon');
end
if #DHWRun > 0 then
if %day > 5 && %hour > 10 && @DHW_Temp > 47 && @Sterilization_State != 1 then
@SetForceSterilization = 1;
#LegionellaRunDay = 8;
end
if @ThreeWay_Valve_State == 0 && @DHW_Temp >= @DHW_Target_Temp && @Defrosting_State == 0 && @Sterilization_State == 0 then
@SetOperationMode = max(0, #OMP);
if @Heatpump_State != #HPStateP then
#HPStateR = #HPStateP;
HeatPumpState('DHWoff');
end
#OMP = @Operating_Mode_State;
#HPStateP = 1;
#DHWRun = 0;
end
end
if %day == 7 && #LegionellaRunDay == 8 then #LegionellaRunDay = 7; end
setTimer(6,900);
end
end
on pumpDuty then
if #allowPumpDuty == 1 && #RemoteOverRide < 5 then
#allowPumpDuty = 2;
#MaxPumpDuty = 85;
if @ThreeWay_Valve_State == 1 then
#MaxPumpDuty = 140;
if (@Sterilization_State == 0 && @DHW_Temp > @DHW_Target_Temp) || (@Sterilization_State == 1 && @DHW_Temp > 57) then
#MaxPumpDuty = 10 + #MaxPumpDuty;
end
elseif @Heatpump_State == 1 then
if @Compressor_Freq == 0 && @Defrosting_State != 1 then
#MaxPumpDuty = 82;
elseif @Operating_Mode_State != 1 then
$QFH = 10; $QFL = 14; $tH = 11; $tL = -3;
if @Outside_Temp >= $tH then
#MaxPumpFlow = $QFH;
elseif @Outside_Temp <= $tL then
#MaxPumpFlow = $QFL;
else
#MaxPumpFlow = ceil($QFH + ($tH - @Outside_Temp) * ($QFL - $QFH) / ($tH - $tL));
end
if @Pump_Flow > 1 && @Pump_Flow < 8 && #MaxPumpDuty <= @Max_Pump_Duty then
#MaxPumpDuty = @Max_Pump_Duty + 1;
else
#MaxPumpDuty = 55 + floor(#MaxPumpFlow * 3);
if (@Pump_Speed / @Pump_Flow) > 145 then
if @Pump_Flow > 8 then
#MaxPumpDuty = @Max_Pump_Duty - 1;
else
#MaxPumpDuty = @Max_Pump_Duty;
end
end
end
else
#MaxPumpDuty = 92;
end
end
#MaxPumpDuty = max(#MaxPumpDuty, 82);
if @Max_Pump_Duty != #MaxPumpDuty then @SetMaxPumpDuty = #MaxPumpDuty; end
setTimer(5, 60);
end
end
on SetQuietMode then
if #QMR != @Quiet_Mode_Level then @SetQuietMode = #QMR; end
end
on QuietMode then
if #allowQuietMode == 1 && #RemoteOverRide < 2 && @Defrosting_State == 0 then
#allowQuietMode = 2;
if @Outside_Temp < 3 || (@Outside_Temp < 5 && #CompFreqTarget == 34) then
#CompFreqTarget = 34;
else
#CompFreqTarget = 24;
end
if #CompRunTime < 3 && @Compressor_Freq > 33 then
#QMR = 3;
elseif @Compressor_Freq < #CompFreqTarget || (#QMR == 0 && @Compressor_Freq < #CompFreqTarget + 6) then
#QMR = 0;
elseif @Compressor_Freq < #CompFreqTarget + 6 || (#QMR == 1 && @Compressor_Freq < #CompFreqTarget + 12) then
#QMR = 1;
elseif @Compressor_Freq < #CompFreqTarget + 26 || (#QMR == 2 && @Compressor_Freq < #CompFreqTarget + 32) then
#QMR = 2;
else
#QMR = 3;
end
if #QMR > 1 && @ThreeWay_Valve_State == 1 && %hour > 9 && %hour < 17 then #QMR = -1 + #QMR; end
setTimer(3,120);
end
if (@Defrosting_State == 1 && #allowQuietMode > 0 || #CompState < 1 || #CompRunTime < 5) || %hour < 7 then #QMR = 3; end
SetQuietMode();
end
on syncOT then
if #allowSyncOT == 1 then
?outletTemp = round(@Main_Outlet_Temp);
?outsideTemp = #OutsideTemp;
?dhwTemp = round(@DHW_Temp);
?dhwSetpoint = @DHW_Target_Temp;
if ?chEnable == 1 then
#chEnable = 1;
if #chEnableTimeOff != -1 then
#chEnableTimeOff = -1;
#chEnableOffTime= -1;
end
else
if #chEnableTimeOff == -1 then #chEnableTimeOff = #Time; end
#chEnableOffTime= #Time - #chEnableTimeOff;
if #chEnableOffTime> 5 then #chEnable = 0; end
end
?maxTSet = @Z1_Water_Target_Temp + 5;
if #CompState > 0 then
?flameState = 1;
if @Heat_Power_Consumption > 0 then ?chState = 1; else ?chState = 0; end
if @DHW_Power_Consumption > 0 then ?dhwState = 1; else ?dhwState = 0; end
if @Cool_Power_Consumption > 0 then ?coolingState = 1; else ?coolingState = 0; end
else
?flameState = 0;
?chState = 0;
?dhwState = 0;
?coolingState = 0;
end
if #RoomTempSet == -1 then #RoomTempSet = ?roomTempSet; end
if ?roomTempSet != 0 then
if #Debug > 10 then $com = ('set RoomTempDeta with some safeguards around ?roomTempSet (not zero and change < 1)'); end
#RoomTempSet = round(?roomTempSet * 10) / 10;
#RoomTempDelta = max(min(20 - #RoomTempSet, 5), -5);
end
end
end
on syncHP then
if #allowSynchHP == 1 then
#allowSynchHP = 2;
if @Operating_Mode_State == 0 || @Operating_Mode_State == 4 then
#Heat = 1;
else
#Heat = 0;
end
#RemoteOverRide = @Z2_Heat_Request_Temp;
setTimer(9,30);
end
end
on @Compressor_Freq then
if @Compressor_Freq > 18 && #CompState == 0 then
#CompStateChangeTime= #Time;
#CompState = 1;
#CompRunSec = 0;
setTimer(10,5);
elseif @Compressor_Freq < 18 && #CompState > 0 then
#CompStateChangeTime= #Time;
#CompState = 0;
end
end
on @Main_Outlet_Temp then
#allowTaShift = 1;
end
on @Z1_Water_Target_Temp then
#allowTaShift = 1;
end
on timer=1 then
setTimer(1,15);
if #FirstBoot == 1 then
#CompStateChangeTime= #Time;
#RoomTempDelta = 0;
if @Compressor_Freq > 18 then
#CompState = 2;
else
#CompState = 0;
@SetZ1HeatRequestTemperature = 0;
end
#SHifT = @Z1_Heat_Request_Temp;
if @ThreeWay_Valve_State == 1 && #allowDHW == 1 then #DHWRun = 2; end
#FirstBoot = 2;
else
syncHP();
syncOT();
QuietMode();
pumpDuty();
DHW();
if #Heat == 1 then
OpenThermThermostat();
TaShift();
end
end
end
on timer=2 then
#Time = %day * 1440 + %hour * 60 + %minute;
if @Compressor_Freq > 18 then
#CompRunTime = #Time - #CompStateChangeTime;
if #CompRunTime< 0 then
#CompRunTime = #Time - #CompStateChangeTime + 10080;
end
else
#CompRunTime = #CompStateChangeTime - #Time;
end
setTimer(2,60);
end
on timer=3 then #allowQuietMode = 1; end
on timer=5 then #allowPumpDuty = 1; end
on timer=6 then #allowDHW = 1; end
on timer=7 then #allowOTT = 1; end
on timer=9 then #allowSynchHP = 1; end
on timer=10 then
#CompRunSec = #CompRunSec + 5;
if #CompRunSec < 600 then setTimer(10,5); end
end |