En toen was mijn ESPEasy Domotica voor de WP is klaar
Wanneer code er omslachtig uit lijkt te zien, dan is dat om om de beperkingen van ESPEasy heen te werken
Tasks:
code:
1
2
3
4
5
6
7
8
9
10
| 3: Dummy device (dummy) 1) aan 2) uit 3) telleA 4) tellerU
4: MQTT Import (MQTT) 1) HeatpumpState 2) RoomTemp 3) OutsideTemp 4) CompressorFreq
5: DS18B20 temp (temp) 1) temperature
6: MQTT Import (MQTT1) 1) MainOutletTemp 2) MainInletTemp 3) MainTargetTemp 4) PumpFlow
7: Dummy Device (cache) 1) NewTargetTemp 2) PrevOutletTemp 3) Teller 4) Offset
8: Dummy Device (WAR) 1) Taanvoer1 2) Tbuiten1 3) Taanvoer2 4) Tbuiten2
9: Dummy Device (WAR1) 1) MaxTargetTemp 2) RekenenDTb 3) RekenenDTa
10: Dummy Device (cache1) 1) Teller 2) Nachtverlaging 3) T1 4) T2
11: Dummy Device (afdwingen) 1) Uit
12: Dummy Device (cache2) 1) targetTempDiff |
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| on System#Boot do
timerSet,1,300
event,setWar
event,setThermostaat
endon
on setWar do
taskValueSet 8,1,36
taskValueSet 8,2,8
taskValueSet 8,3,45
taskValueSet 8,4,-10
event,berekenWar
endon
on setThermostaat do
taskValueSet 10,2,-2
taskValueSet 10,3,20.75
taskValueSet 10,4,20.25
endon |
Aangezien ESPEasy geen variabele bewaard na een herstart, slaan we de variabelen op in een functie die aangeroepen wordt na elke herstart. De thermostaat heeft een shift die de nachtverlaging bepaalt.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| on Rules#Timer=5 do
if [MQTT1#MainOutletTemp] < [WAR1#MaxTargetTemp]
TaskValueSet 7,3,[cache#Teller]+1
TaskValueSet 10,1,[cache#Teller]%60
if [cache#Teller] > 120
TaskValueSet 7,3,61
endif
if [cache1#Teller] = 0
TaskValueSet 7,4,[cache#Offset]+2
if [MQTT#HeatpumpState] = 1
timerSet,4,1
endif
endif
else
TaskValueSet 7,3,0
TaskValueSet 7,4,0
endif
timerSet 5,5
endon |
Timer 5 telt in 5 secondes.
Timer 5 volgt of het niet te lang duurt voordat de Ta een graad omhoog gaat. Zo ja, verhoog dan de doel temperatuur met 2 graden zodat de compressor langzaam om meer vermogen wordt gevraagd. Dit herhaalt zich totdat de Ta binnen 5 minuten één graad omhoog gaat. De modulus 60 is bedoeld om niet in conflict te komen met Timer 6 die op de kleiner dan 1 minuten let.
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
| on temp#temperature do
timerSet,1,300
if %systime% > 06:30:00 and %systime% < 23:00:00
if [cache1#Nachtverlaging] = 0
event,setThermostaat
endif
else
if [cache1#Nachtverlaging] != 0
taskValueSet 10,3,[cache1#T1]+[cache1#Nachtverlaging]
taskValueSet 10,4,[cache1#T2]+[cache1#Nachtverlaging]
taskValueSet 10,2,0
endif
endif
taskValueSet 12,1,[cache1#T1]-[temp#temperature]
if [temp#temperature] > [cache1#T1] and [dummy#uit] = 0 and [afdwingen#uit] = 0
TaskValueSet 3,4,[dummy#tellerU]+1
if [dummy#tellerU] > 3
TaskValueSet 3,1,0
TaskValueSet 3,2,1
event,ResetTeller
timerSet,3,120
endif
endif
if [temp#temperature] < [cache1#T2] and [dummy#aan] = 0 and [afdwingen#uit] = 0
TaskValueSet 3,3,[dummy#tellerA]+1
if [dummy#tellerA] > 3
TaskValueSet 3,1,1
TaskValueSet 3,2,0
event,ResetTeller
timerSet,3,120
endif
endif
if [temp#temperature] <= [cache1#T1] and [temp#temperature] >= [cache1#T2]
event,resetDummy
endif
endon |
Het thermostaat gedeelte. Op basis van een bepaalde temperatuur moet de WP aan of juist uit. De teller is bedoeld om niet op basis van elke fluctuatie te schakelen net als de Timer 3 met een timeout van 5 minuten. De tijd parameters spreken voor zich.
code:
1
2
3
4
5
6
7
8
9
10
11
| on MQTT#HeatpumpState=1 do
if [dummy#uit] != 1
event,WPaan
endif
endon
on MQTT#HeatpumpState=0 do
if [dummy#aan] != 1
event,WPuit
endif
endon |
Volg ook de daadwerkelijke status van de warmtepomp zelf, mocht die aangezet worden buiten de ESP om.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| on Rules#Timer=3 do
if [dummy#uit] = 1
SendToHTTP 10.0.2.124,80,/command?SetHeatpump=0
event,WPuit
endif
if %systime% > 06:30:00 and %systime% < 23:00:00
if [dummy#aan] = 1
SendToHTTP 10.0.2.124,80,/command?SetHeatpump=1
event,WPaan
endif
endif
timerSet,3,0
endon |
Timer 3 telt dus in 5 minuten.
Timer 3 wordt aangezet door de thermostaat en zet de WP aan danwel uit.
code:
1
2
3
4
| on ResetTeller do
TaskValueSet 3,3,0
TaskValueSet 3,4,0
endon |
Reset de teller die Timer 3 bediend.
code:
1
2
3
4
5
6
| on MQTT1#MainOutletTemp do
if [MQTT#HeatpumpState] = 0
event,syncTemp
event,sendNewTemp
endif
endon |
Als de Ta veranderd, veranderd dan de doel temperatuur mee.
code:
1
2
3
4
5
6
| on ResetDummy do
TaskValueSet 3,1,0
TaskValueSet 3,2,0
event,ResetTeller
timerSet,3,0
endon |
Reset Timer 3 en alle omliggende logica.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| on WPaan do
TaskValueSet 3,1,2
TaskValueSet 3,2,0
if [MQTT#OutsideTemp] > 2
timerSet,4,60
if [MQTT#OutsideTemp] < 6 or [cache2#targetTempDiff] >= 1
timerSet,5,5
timerSet,6,1
else
timerSet,5,0
timerSet,6,0
endif
else
timerSet,4,0
timerSet,5,0
timerSet,6,0
SendToHttp 10.0.2.124,80,/command?SetZ1HeatRequestTemperature=[WAR1#MaxTargetTemp]
endif
endon |
Zet de WP aan en pas de bedieningsvariabelen aan 3,[1,2] = 1 betekent dat Timer 3 is geactiveerd, 3,[1,2] = 2 betekent dat de WP aan of uit is. Afhankelijk van de buiten temperatuur wordt de compressor meer of minder beperkt in zijn vermogen. Timer 5 zorgt voor minimaal vermogen logica. Timer 6 voor de logica om de compressor te boosten als de Ta te traag opwarmt. Wanneer beide timers uit staan, dan wordt de standaard functionaliteit weer in gang gezet. Zorg dat die eerste Tb setpoint boven de DF temperatuur staat als je radiatoren hebt. Anders koelt de kamer telkens te snel af na een DF.
code:
1
2
3
4
5
6
7
8
| on WPuit do
TaskValueSet 3,1,0
TaskValueSet 3,2,2
TaskValueSet 7,3,0
timerSet,4,0
timerSet,5,0
timerSet,6,0
endon |
Functie om de WP uit te zetten incl. het resetten van alle variabelen en timers.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| on syncTemp do
if [MQTT1#MainOutletTemp] >= 20 and [MQTT1#MainOutletTemp] <= [WAR1#MaxTargetTemp] and [MQTT1#MainOutletTemp] != [MQTT1#MainTargetTemp]
TaskValueSet 7,1,[MQTT1#MainOutletTemp]
endif
endon
on sendNewTemp do
if [cache#NewTargetTemp] < 20
TaskValueSet 7,1,20
endif
if [cache#NewTargetTemp] > [WAR1#MaxTargetTemp]
TaskValueSet 7,1,[WAR1#MaxTargetTemp]
endif
if [cache#NewTargetTemp] != [MQTT1#MainTargetTemp]
SendToHttp 10.0.2.124,80,/command?SetZ1HeatRequestTemperature=[cache#NewTargetTemp]
endif
endon |
Functie om de nieuwe doel temperatuur te bepalen a.d.v. de aanvoer temperatuur en de WAR doel temperatuur.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| on Rules#Timer=4 do
if [MQTT#HeatpumpState] = 1
event,syncTemp
if [MQTT#CompressorFreq] = 0
TaskValueSet 7,1,[cache#NewTargetTemp]+5
TaskValueSet 7,4,-1
else
TaskValueSet 7,1,[cache#NewTargetTemp]+[cache#Offset]
endif
event,sendNewTemp
endif
timerSet,4,60
endon |
Timer 4 telt per minuut.
Timer 4 zorgt voor het daadwerkelijk aanpassen van de Ta a.d.v. de doeltemperatuur en de gevraagde offset.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| on Rules#Timer=6 do
if [MQTT#HeatpumpState] = 1
if [cache#PrevOutletTemp] != [MQTT1#MainOutletTemp]
if [cache#PrevOutletTemp] < [MQTT1#MainOutletTemp]
if [MQTT1#MainOutletTemp] < [WAR1#MaxTargetTemp]
if [cache#Teller] < 60
TaskValueSet 7,4,[cache#Offset]-2
endif
if [cache#Offset] < -1
TaskValueSet 7,4,-1
endif
timerSet,4,1
endif
TaskValueSet 7,3,0
endif
TaskValueSet 7,2,[MQTT1#MainOutletTemp]
endif
endif
timerSet,6,1
endon |
Timer 6 telt per seconde.
Timer 6 zorgt ervoor dat wanneer de Ta binnen de gewenste 1 minute omhoog gaat, de compressor minder snel kan gaan draaien. De offset wordt dan omlaag gebracht.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| on SetWARTaanvoer1 do
TaskValueSet 8,1,%eventvalue%
endon
on SetWARTbuiten1 do
TaskValueSet 8,2,%eventvalue%
event,berekenWar
endon
on SetWARTaanvoer2 do
TaskValueSet 8,3,%eventvalue%
event,berekenWar
endon
on SetWARTbuiten2 do
TaskValueSet 8,4,%eventvalue%
event,berekenWar
endon |
Aanpassen van de WAR via REST API calls (alleen niet persistent)
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
| on [MQTT#OutsideTemp] do
event,berekenWar
endon
on berekenWar do
TaskValueSet 9,2,0
TaskValueSet 9,3,0
if [MQTT#OutsideTemp] >= [WAR#Tbuiten1]
TaskValueSet 9,1,[WAR#Taanvoer1]
elseif [MQTT#OutsideTemp] <= [WAR#Tbuiten2]
TaskValueSet 9,1,[WAR#Taanvoer2]
else
TaskValueSet 9,2,[WAR#Tbuiten1]-[WAR#Tbuiten2]
TaskValueSet 9,3,[WAR#Taanvoer2]-[WAR#Taanvoer1]
TaskValueSet 9,3,[WAR1#RekenenDTa]/[WAR1#RekenenDTb]
if [MQTT#OutsideTemp] > 0
TaskValueSet 9,2,[WAR#Tbuiten1]-[MQTT#OutsideTemp]
else
TaskValueSet 9,2,[WAR#Tbuiten1]+[MQTT#OutsideTemp]
endif
if [WAR1#RekenenDTb] < 0
TaskValueSet 9,2,[WAR1#RekenenDTb]*-1
endif
TaskValueSet 9,3,[WAR1#RekenenDTa]*[WAR1#RekenenDTb]
TaskValueSet 9,1,[WAR1#RekenenDTa]+[WAR#Taanvoer1]
if [WAR1#MaxTargetTemp] > [WAR#Taanvoer2]
TaskValueSet 9,1,[WAR#Taanvoer2]
endif
if [WAR1#MaxTargetTemp] < [WAR#Taanvoer1]
TaskValueSet 9,1,[WAR#Taanvoer1]
endif
endif
if [MQTT#OutsideTemp] <= 0
SendToHttp 10.0.2.124,80,/command?SetZ1HeatRequestTemperature=[WAR1#MaxTargetTemp]
endif
endon |
Opnieuw berekenen van de doeltemperatuur a.d.v. WAR wanneer de buitentemperatuur veranderd.
Dit draait op een Wemos D1 met een DS18B20, twee DummyDevices, en twee Generic MQTT imports waarmee ik de WP aan/uit status, temperaturen en compressor frequentie ontvang.
Met dank aan @
CurlyMo voor zijn REST API toevoeging aan de Heishamon
[
Voor 217% gewijzigd door
CurlyMo op 10-12-2020 11:00
]