Python Plugin: Smart Virtual Thermostat
Moderator: leecollings
-
- Posts: 470
- Joined: Thursday 26 October 2017 13:37
- Target OS: Raspberry Pi / ODroid
- Domoticz version: beta
- Location: Delft
- Contact:
Re: Python Plugin: Smart Virtual Thermostat
I still very much like the idea of svt, this script version just has some errors and limitations in it's implementation, causing it to improperly 'refine' the ConstC and even more the ConstT values.
For example the code suffers from rounding errors: at some point the code just starts 'bouncing' between large constC values because the calculations are rounded too early and the PID as it is implemented can't recover from this situation.
Also the constT calculation is incorrect because the temperature offset is incorrectly defined as the difference between the outside temperature and the setpoint, whereas the heat-loss depends on the difference between the outside temperature and the actual inside temperatue, which may not be the same as the setpoint.
The next thing that seems to go wrong for a lot of people is when the calculated power goes over 100%, the constC and ConstT calculations are done as if 100% power was applied, whereas in reality the power was applied for more than 100%. This I think is a consequence of ignoring a lot of measurements when the needed power is over 100%, and also ignoring the measurements where the temperature is over the setpoint. I think these periods however need to be considered too, as even though the heater may be off, energy applied during previous cycles can still be delivered into the room(s) by the system.
An improvement I have been working on -but never got to really work correctly- is to keep the re-evaluation period fixed at a 10 minute interval (I found this suggested as a reasonable period by many heating specialists) to make sure the thermostat responds quickly to changes in the room temperature, but the measuring period can be longer or shorter than that based on the characteristics of the room/building/heating system. For this the power calculated must be able to go over 100%: when power >= 100% this just means our heat-source is going to be firing for the full 10 minutes, but still after 10 minutes we're going to re-evaluate the result of our effort so far. When doing this re-evaluation we have to take into account however that we have actually applied only 100% power even if more was calculated; i.e. we need to adjust the power applied accordingly in our constC refinement. For example: if power needed was calculated at time t as 150%, we would have had to switch the heater on for 1,50 * 10 * 60 seconds = 900 seconds. Because we re-evaluate every 10 minutes however, only 600 seconds will have passed at our next time t+1: we have applied only 100 of the 150% = 100/150 = 2/3. The constC refinement will be performed every 10 minutes, but the power applied must be corrected for this shorter period by that factor of 2/3. I am making one assumption here that is not completely true: I am assuming temperature raises and falls linear, which is not the case in real life. If however temperature differences are small enough, it is almost true. So by doing this assumption I make our calculations a lot easier, at the cost of a some precision when the difference between setpoint and actual temperature is large. Since we're mostly going to want our thermostat to keep the temperature close to the setpoint I think we can safely make this assumption. The benefits of doing this change -I think- are: the svt will perform better with a long feedback loop (for example with floor heating) while still responding quickly to outside changes and it can also better refine the constC values (because it takes into the account the periods the heater wasn't on too: the constC will contain a component for both on and off periods). What I wanted to achieve is that the svt always calculates how much power to apply to make sure the temperature is going to be at the setpoint at the next interval t+1, regardless of the actual temperature at time t, the setpoint value or if the heater was on during the previous cycle. i.e. no limitations should be applied on the decision whether to re-calculate needed power nor on whether to refine constC.
For example the code suffers from rounding errors: at some point the code just starts 'bouncing' between large constC values because the calculations are rounded too early and the PID as it is implemented can't recover from this situation.
Also the constT calculation is incorrect because the temperature offset is incorrectly defined as the difference between the outside temperature and the setpoint, whereas the heat-loss depends on the difference between the outside temperature and the actual inside temperatue, which may not be the same as the setpoint.
The next thing that seems to go wrong for a lot of people is when the calculated power goes over 100%, the constC and ConstT calculations are done as if 100% power was applied, whereas in reality the power was applied for more than 100%. This I think is a consequence of ignoring a lot of measurements when the needed power is over 100%, and also ignoring the measurements where the temperature is over the setpoint. I think these periods however need to be considered too, as even though the heater may be off, energy applied during previous cycles can still be delivered into the room(s) by the system.
An improvement I have been working on -but never got to really work correctly- is to keep the re-evaluation period fixed at a 10 minute interval (I found this suggested as a reasonable period by many heating specialists) to make sure the thermostat responds quickly to changes in the room temperature, but the measuring period can be longer or shorter than that based on the characteristics of the room/building/heating system. For this the power calculated must be able to go over 100%: when power >= 100% this just means our heat-source is going to be firing for the full 10 minutes, but still after 10 minutes we're going to re-evaluate the result of our effort so far. When doing this re-evaluation we have to take into account however that we have actually applied only 100% power even if more was calculated; i.e. we need to adjust the power applied accordingly in our constC refinement. For example: if power needed was calculated at time t as 150%, we would have had to switch the heater on for 1,50 * 10 * 60 seconds = 900 seconds. Because we re-evaluate every 10 minutes however, only 600 seconds will have passed at our next time t+1: we have applied only 100 of the 150% = 100/150 = 2/3. The constC refinement will be performed every 10 minutes, but the power applied must be corrected for this shorter period by that factor of 2/3. I am making one assumption here that is not completely true: I am assuming temperature raises and falls linear, which is not the case in real life. If however temperature differences are small enough, it is almost true. So by doing this assumption I make our calculations a lot easier, at the cost of a some precision when the difference between setpoint and actual temperature is large. Since we're mostly going to want our thermostat to keep the temperature close to the setpoint I think we can safely make this assumption. The benefits of doing this change -I think- are: the svt will perform better with a long feedback loop (for example with floor heating) while still responding quickly to outside changes and it can also better refine the constC values (because it takes into the account the periods the heater wasn't on too: the constC will contain a component for both on and off periods). What I wanted to achieve is that the svt always calculates how much power to apply to make sure the temperature is going to be at the setpoint at the next interval t+1, regardless of the actual temperature at time t, the setpoint value or if the heater was on during the previous cycle. i.e. no limitations should be applied on the decision whether to re-calculate needed power nor on whether to refine constC.
-
- Posts: 742
- Joined: Saturday 30 May 2015 22:40
- Target OS: Raspberry Pi / ODroid
- Domoticz version: beta
- Contact:
Re: Python Plugin: Smart Virtual Thermostat
What I have done last year to improve svt drastically:
-Rounding at 3 digits
-reduce the average of 50 values to 25
-Cutting the calculation cycle in half when there is no heading in the previous cycle
-redefine the constC and T values:
At the end of an heading cycle, I recalculate these values, based on the actual achieved temperature.
We were not at home last weekend for an afternoon and evening and with the floor heating as source, SVT was able to achieve a total tolerance of 0.1 degrees (16.9-17'C). With the Remeha iSense this would be close to 16.5-17.5'C
-Rounding at 3 digits
-reduce the average of 50 values to 25
-Cutting the calculation cycle in half when there is no heading in the previous cycle
-redefine the constC and T values:
At the end of an heading cycle, I recalculate these values, based on the actual achieved temperature.
We were not at home last weekend for an afternoon and evening and with the floor heating as source, SVT was able to achieve a total tolerance of 0.1 degrees (16.9-17'C). With the Remeha iSense this would be close to 16.5-17.5'C
-
- Posts: 112
- Joined: Thursday 08 December 2022 22:15
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 2023.2
- Location: ROMANIA
- Contact:
Re: Python Plugin: Smart Virtual Thermostat
Hello,
can you be a little more precise? we are technical terms that you say and they are difficult to translate/interpret.
i put a print screen whit my settings.
for example: I don't know what this could mean. I can translate but I can't interpret.
"Apply minimum heating per cycle"
can you be a little more precise? we are technical terms that you say and they are difficult to translate/interpret.
i put a print screen whit my settings.
for example: I don't know what this could mean. I can translate but I can't interpret.
"Apply minimum heating per cycle"
- Attachments
-
- domoticz.jpg (81.6 KiB) Viewed 4163 times
-
- Posts: 742
- Joined: Saturday 30 May 2015 22:40
- Target OS: Raspberry Pi / ODroid
- Domoticz version: beta
- Contact:
Re: Python Plugin: Smart Virtual Thermostat
Did you read the wiki and GitHub help page?ssk17051980 wrote: ↑Wednesday 14 December 2022 13:22 Hello,
can you be a little more precise? we are technical terms that you say and they are difficult to translate/interpret.
i put a print screen whit my settings.
for example: I don't know what this could mean. I can translate but I can't interpret.
"Apply minimum heating per cycle"
Apply minimum heating per cycle means that no matter what the calculated heating time is, a minimum heating time will be applied for each cycle.
If you specify the minimum at 20, than every calculation result between 1-20 percent will be upgraded to 20 percent.
'always' means that at each cycle the 20 percent will be applied, no matter what the current temperature is (not advised)
Re: Python Plugin: Smart Virtual Thermostat
After updating get this
Error calling 'http://192.168.0.108:8080/json.htm?type ... order=Name'
none of the devices in the 'heaters' parameter is a switch... no action !
-
- Posts: 742
- Joined: Saturday 30 May 2015 22:40
- Target OS: Raspberry Pi / ODroid
- Domoticz version: beta
- Contact:
Re: Python Plugin: Smart Virtual Thermostat
Well, check what it says:none of the devices in the 'heaters' parameter is a switchCdzn wrote:After updating get thisError calling 'http://192.168.0.108:8080/json.htm?type ... order=Name'
none of the devices in the 'heaters' parameter is a switch... no action !
You have defined which idx number is your boiler switch and obviously the supplied number is not a switch
Re: Python Plugin: Smart Virtual Thermostat
But i did nothing except update Domoticz. And the boiler switch is still the same IDX as before update
-
- Posts: 742
- Joined: Saturday 30 May 2015 22:40
- Target OS: Raspberry Pi / ODroid
- Domoticz version: beta
- Contact:
Re: Python Plugin: Smart Virtual Thermostat
When you run the command in your browser:Cdzn wrote:But i did nothing except update Domoticz. And the boiler switch is still the same IDX as before update
http://192.168.0.108:8080/json.htm?type ... trueℴ=Name'
Do you see your idx number in between there and does it mention there as subtype 'switch'?
-
- Posts: 10
- Joined: Sunday 08 September 2019 7:38
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Contact:
Re: Python Plugin: Smart Virtual Thermostat
I have this same problem -bubtype is switch
PlanIDs
0 0
Protected false
ShowNotifications true
SignalLevel "-"
Status "Off"
StrParam1 ""
StrParam2 ""
SubType "Switch"
SwitchType "On/Off"
SwitchTypeVal 0
Timers "false"
Type "Light/Switch"
TypeImg "lightbulb"
Unit 1
Used 1
UsedByCamera false
XOffset "0"
YOffset "0"
idx "8"
PlanIDs
0 0
Protected false
ShowNotifications true
SignalLevel "-"
Status "Off"
StrParam1 ""
StrParam2 ""
SubType "Switch"
SwitchType "On/Off"
SwitchTypeVal 0
Timers "false"
Type "Light/Switch"
TypeImg "lightbulb"
Unit 1
Used 1
UsedByCamera false
XOffset "0"
YOffset "0"
idx "8"
-
- Posts: 230
- Joined: Sunday 14 July 2013 20:21
- Target OS: Linux
- Domoticz version: 4.10233
- Location: Alkmaar, The Netherlands
- Contact:
Re: Python Plugin: Smart Virtual Thermostat
Same problem here, on a fresh install.
Triple checked everything
Triple checked everything
-
- Posts: 742
- Joined: Saturday 30 May 2015 22:40
- Target OS: Raspberry Pi / ODroid
- Domoticz version: beta
- Contact:
Re: Python Plugin: Smart Virtual Thermostat
I wonder if it has to do with the new domoticz 2023 version which requires login. Could it be that the plugin is not allowed, or set up to do that?
I am still on an older beta version (2022.2) and my (virtual) boiler switch is shown the same as yours:
I am still on an older beta version (2022.2) and my (virtual) boiler switch is shown the same as yours:
Code: Select all
{
"AddjMulti" : 1.0,
"AddjMulti2" : 1.0,
"AddjValue" : 0.0,
"AddjValue2" : 0.0,
"BatteryLevel" : 255,
"CustomImage" : 15,
"Data" : "Off",
"Description" : "",
"DimmerType" : "none",
"Favorite" : 0,
"HardwareDisabled" : false,
"HardwareID" : 3,
"HardwareName" : "Virtual Devices",
"HardwareType" : "Dummy (Does nothing, use for virtual switches only)",
"HardwareTypeVal" : 15,
"HaveDimmer" : true,
"HaveGroupCmd" : true,
"HaveTimeout" : false,
"ID" : "00014178",
"Image" : "Heating",
"IsSubDevice" : false,
"LastUpdate" : "2023-02-15 07:15:02",
"Level" : 0,
"LevelInt" : 0,
"MaxDimLevel" : 100,
"Name" : "SVT Heater",
"Notifications" : "false",
"PlanID" : "2",
"PlanIDs" :
[
2
],
"Protected" : false,
"ShowNotifications" : true,
"SignalLevel" : "-",
"Status" : "Off",
"StrParam1" : "",
"StrParam2" : "",
"SubType" : "Switch",
"SwitchType" : "On/Off",
"SwitchTypeVal" : 0,
"Timers" : "false",
"Type" : "Light/Switch",
"TypeImg" : "lightbulb",
"Unit" : 1,
"Used" : 1,
"UsedByCamera" : false,
"XOffset" : "0",
"YOffset" : "0",
"idx" : "296"
},
-
- Posts: 742
- Joined: Saturday 30 May 2015 22:40
- Target OS: Raspberry Pi / ODroid
- Domoticz version: beta
- Contact:
Re: Python Plugin: Smart Virtual Thermostat
OK, I think I know where the problem is (not how to solve it, since my coding skills are limited and python skills are next to none. Anyway, as stated above, it has to do with the security of domoticz:
In my 2022.2 version I still have in Settings-Security the option for 'Local Networks (no username/password):' In my case this is is filled in with a 192 and 127 IP range. When I remove both IP-ranges and go to 'Hardware' and choose to 'update' SVT (by doing so, Domoticz will reload the hardware), I get the following errors in the log:
Code: Select all
2023-02-15 18:40:22.311 Status: SVT: Heaters = [296]
2023-02-15 18:40:22.358 Error: SVT: Error calling 'http://127.0.0.1:8080/json.htm?type=command¶m=getuservariables'
2023-02-15 18:40:22.359 Error: SVT: Cannot read the uservariable holding the persistent variables
2023-02-15 18:40:31.079 Status: SVT: Next calculation time will be : 2023-02-15 20:30:31.079019
2023-02-15 18:40:31.089 Error: SVT: Error calling 'http://127.0.0.1:8080/json.htm?type=devices&filter=temp&used=true&order=Name'
2023-02-15 18:40:31.089 Error: SVT: No Inside Temperature found: Switching heating Off
2023-02-15 18:40:31.093 Error: SVT: Error calling 'http://127.0.0.1:8080/json.htm?type=devices&filter=light&used=true&order=Name'
2023-02-15 18:40:31.094 Error: SVT: none of the devices in the 'heaters' parameter is a switch... no action !
2023-02-15 18:40:31.144 Error: SVT: Error calling 'http://127.0.0.1:8080/json.htm?type=devices&filter=light&used=true&order=Name'
2023-02-15 18:40:31.145 Error: SVT: none of the devices in the 'heaters' parameter is a switch... no action !
When I add my username and password to the SVT plugin!!! and remove the interal IP-ranges once again, SVT reloads perfectly fine.
Conclusion is: add user/pw to the SVT hardware and click 'Update'. This will reload SVT with a supplied user/pw
-
- Posts: 4
- Joined: Wednesday 29 November 2017 17:02
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Contact:
Re: Python Plugin: Smart Virtual Thermostat
Unfortunately adding my admin username and password to the SVT hardware settings did not resolve these errors for me
Re: Python Plugin: Smart Virtual Thermostat
For me too, don’t work. And i filled the ip tables without login before update, so there is something wrong with new update or plugin have not enough permissions to login.
Re: Python Plugin: Smart Virtual Thermostat
I solved the problem. In changelog they said
- Changed: Implicit adding local IP to 'trusted networks' has been removed. Needs to be set explicitly for security reasons!
so You should change your ip in settings, don`t use 127.0.0.*;192.168.0.*, Set IP explicitly, example:127.0.0.1;192.168.0.40 e.t.c, don`t forget to divide them by ;
-
- Posts: 5
- Joined: Tuesday 12 December 2017 16:17
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Contact:
Re: Python Plugin: Smart Virtual Thermostat
It worked in my system. I had to add "localhost" to the list too
Thanks
Guido
Thanks
Guido
-
- Posts: 230
- Joined: Sunday 14 July 2013 20:21
- Target OS: Linux
- Domoticz version: 4.10233
- Location: Alkmaar, The Netherlands
- Contact:
Re: Python Plugin: Smart Virtual Thermostat
Unfortunetly no succes here,
i Have one setup witch runs 2023.1 build 15082 and has been update from previous versions witch works ok.
And a fresh install with 2023.1 stable and gives the error. settings all the same.
i Have one setup witch runs 2023.1 build 15082 and has been update from previous versions witch works ok.
And a fresh install with 2023.1 stable and gives the error. settings all the same.
Re: Python Plugin: Smart Virtual Thermostat
Could you do screenshots svt config and domoticz too.Skippiemanz wrote: ↑Thursday 16 February 2023 23:04 Unfortunetly no succes here,
i Have one setup witch runs 2023.1 build 15082 and has been update from previous versions witch works ok.
And a fresh install with 2023.1 stable and gives the error. settings all the same.
- waltervl
- Posts: 5148
- Joined: Monday 28 January 2019 18:48
- Target OS: Linux
- Domoticz version: 2024.7
- Location: NL
- Contact:
Re: Python Plugin: Smart Virtual Thermostat
Perhaps an important new setting is the "Allow Basic Authentication over plain HTTP" in menu setup -> settings -> security
Domoticz running on Udoo X86 (on Ubuntu)
Devices/plugins: ZigbeeforDomoticz (with Xiaomi, Ikea, Tuya devices), Nefit Easy, Midea Airco, Omnik Solar, Goodwe Solar
Devices/plugins: ZigbeeforDomoticz (with Xiaomi, Ikea, Tuya devices), Nefit Easy, Midea Airco, Omnik Solar, Goodwe Solar
-
- Posts: 230
- Joined: Sunday 14 July 2013 20:21
- Target OS: Linux
- Domoticz version: 4.10233
- Location: Alkmaar, The Netherlands
- Contact:
Who is online
Users browsing this forum: No registered users and 0 guests