Hi Admin,
I have not valveStates variable but I have valveStatesInverno and valveStatesEstate. Because I have 2 condition. But as per the loggin below valveStatesInverno change is value without changing group address 2/0/2.
24.10.2018, 18:17 (This post was last modified: 24.10.2018, 18:18 by Erwin van der Zwart.)
Hi,
No i don’t think that the issue you are facing is FW related. Just because i’m not 100% sure that 2.3.0 might have a issue with tagged scripts i pointed it out to try a reboot.
As that did not helped i’m pretty sure it’s somewhere in your script.
Domoticarino, please translate to english your variables. Please describe once more what is the current goal for this script. Because now it has checking season and you try to support multiple zones so maybe better would be reorganize the code to have all in one more intuitive script
You can try something like this for all zones. Firstly you could only switch off older scripts and check if this would work same as older but for all zones and in only one script. Maybe when you define your zones in same place you found something.
(24.10.2018, 20:08)buuuudzik Wrote: You can try something like this for all zones. Firstly you could only switch off older scripts and check if this would work same as older but for all zones and in only one script. Maybe when you define your zones in same place you found something.
I am getting crazy. It is very strange because I use the same code for in other 2 scripts and they are working without any problem. System is working with these scripts for about 1 year without any problem. Since 16th of September script related to circulation pump with address 2/0/2 does not work anymore.
The function is very easy. I have this following variable:
- heating and cooling valve state
- dehumidifier valve state.
In winter when heating valve state (2/0/107) is ON, circulation pump must start after 60 seconds or the time I fix. When heating state valve is OFF, circulation pump must stop immediately.
In summer when cooling valve state (2/0/107) or dehumidifier valve state are ON, circulation pump must start after 60 seconds or the time I fix. When cooling valve state or dehumidifier valve state are OFF, circulation pump must stop immediately.
I cannot understand the reason why it does not anymore.
25.10.2018, 06:04 (This post was last modified: 25.10.2018, 06:16 by buuuudzik.)
If I can give you some tips:
- tags shouldn't be very, very long because if they are very long you can accidently assign new tag which is misspelled and probably you don't see whole tag/tags in Objects view. In your case you has e.g. "pompa_circolazione_giorno_estate" which means "circulation pump summer day" so you can think how to short this name, maybe you can remove "day" from it, use shortcut name and let e.g. pump_ce1
- please use english in your code, you will do better programs, all people in forums can help
you faster.
- when you debug code don't be afraid to use a lot of log() function (also like log('Label 1', your_variable)) and also try to check step by step where is the start of the problem because when you have complex script then when something is bad calculated at start then end could be very mess and unpredictable so you should check full path from. You can also log only certain data e.g. when you are logging knx object then you can log full object but more readable would be to log only specific properties like log(obj.name, obj.value).
- use functions for splitting your code into a few simple and easy to test parts which would be also much more readable
- use tables, objects, for loops, tags for multiple zones, don't create another script for it
This are only some tips from me, because I see that you are trying to do better(more advanced) programs.
If it about your code please check step by step every line. I'm strongly recommend you use this last version because it is more readable and more ready for future changes which you will probably do.
1. Please stop all other pump circulation scripts.
2. Please use another script with a name e.g. 'Test' (it must be fresh script)and copy there such script which parallelly creates logs object and at the end ot prints it:
-------------------------------------------------------- DEFINE GLOBAL VARIABLES AND ZONES------------------------------------------------------------------------seasonGA = '2/0/100'logging = truezones = {
{
summer = 'pompa_circolazione_giorno_estate',
winter = 'pompa_circolazione_giorno_inverno',
pump = '2/0/1',
offset = 60,
minimum = 30
}
}
-------------------------------------------------------- DONT CHANGE NOTHING BELOW-------------------------------------------------------------------------------- season = grp.getvalue(seasonGA)
nextCalculationAfter = 30-- it will be changed by first zoneifloggingthenlogs = {season = season} end-- #TO DELETEfunctioncalcOutOfTheSeason(tag)
localopened = falselocalfirstTimestamp = 0localvalves = grp.tag(tag)
ifloggingthenlogs.zones[#logs.zones].valvesInWinter = {} end-- #TO DELETEforv = 1, #valves, 1dolocalvalve = valves[v]
ifvalve.valuethenopened = trueiffirstTimestamp > 0theniffirstTimestamp > valve.updatetimethenfirstTimestamp = valve.updatetimeendelsefirstTimestamp = valve.updatetimeendendifloggingthenlogs.zones[#logs.zones].valvesInWinter[v] = {name = valve.name, value = valve.value, tags = valve.tags, opened = opened, firstTimestamp = firstTimestamp} end-- #TO DELETEendreturnopened, firstTimestampendfunctioncalcDuringTheSeason(tag)
localopened = falselocalfirstTimestamp = 0localvalves = grp.tag(tag)
ifloggingthenlogs.zones[#logs.zones].valvesInSummer = {} end-- #TO DELETEvalves = grp.tag(tag)
forv = 1, #valves, 1dovalve = valves[v]
ifvalve.valuethenopened = trueiffirstTimestamp > 0theniffirstTimestamp > valve.updatetimethenfirstTimestamp = valve.updatetimeendelsefirstTimestamp = valve.updatetimeendendifloggingthenlogs.zones[#logs.zones].valvesInSummer[v] = {name = valve.name, value = valve.value, tags = valve.tags, opened = opened, firstTimestamp = firstTimestamp} end-- #TO DELETEendreturnopened, firstTimestampendifloggingthenlogs.season = seasonlogs.zones = {}
end-- #TO DELETEforz, zoneinipairs(zones) dolocalsummerTag = zone.summerlocalwinterTag = zone.winterlocalpumpGA = zone.pumplocalopeningValveTime = zone.offsetlocalminInterval = zone.minimumifloggingthenlogs.zones[z] = {
settings = {
summerTag = summerTag,
winterTag = winterTag,
pumpGA = pumpGA,
pumpBeforeCmd = grp.getvalue(pumpGA),
openingValveTime = openingValveTime,
minInterval = minInterval
}
}
end-- #TO DELETE-- CALCULATE SINGLElocalopened, firstTimestamp = false, 0-- Calc valve state and firsttimestamp for updateifseasonthenopened, firstTimestamp = calcDuringTheSeason(winterTag)
elseopened, firstTimestamp = calcOutOfTheSeason(summerTag)
endifloggingthenlogs.zones[z].opened = openedlogs.zones[z].firstTimestamp = firstTimestampend-- # TO DELETE-- Find nextZoneCalculationAfter for current zonelocalnextZoneCalculationAfter = 0ifopenedthenlocalfullyOpened = os.microtime() - firstTimestamp >= openingValveTimeiffullyOpenedthengrp.checkwrite(pumpGA, true)
nextZoneCalculationAfter = minIntervalifloggingthenlogs.zones[z].info = 'Turn on pump because valve is fully opened. Next calculation after ' .. nextZoneCalculationAfter .. 's'end-- # TO DELETEelsegrp.checkwrite(pumpGA, false)
nextZoneCalculationAfter = openingValveTime + 1 - (os.microtime() - firstTimestamp) -- run a little after possible changeifloggingthenlogs.zones[z].info = 'Turn off pump because valve isn'tyetfullyopened.Nextcalculationafter' .. nextZoneCalculationAfter .. 's' end -- # TO DELETEendelsegrp.checkwrite(pumpGA, false)
nextZoneCalculationAfter = openingValveTime + 1ifloggingthenlogs.zones[z].info = 'Turn on pump because valve is closed. Next calculation after ' .. nextZoneCalculationAfter .. 's. 'end-- # TO DELETEend-- Update nextCalculationAfter (global)ifz == 1ornextCalculationAfter < nextZoneCalculationAfterthennextCalculationAfter = nextZoneCalculationAfterifloggingthenlogs.zones[z].info = logs.zones[z].info .. 'Variable nextCalculationAfter was changed to ' .. nextZoneCalculationAfter .. '.'end-- # TO DELETEendend-- log('Next calculation after: ' .. nextCalculationAfter .. 's.')ifnextCalculationAfterandnextCalculationAfter > 5thenifloggingthenlogs.sleepDescription = 'Calculated ' .. nextCalculationAfter .. 's'log(logs)
end-- # TO DELETEos.sleep(nextCalculationAfter)
elseifloggingthenlogs.sleepDescription = 'Default ' .. nextCalculationAfter .. 's (calculated value is 0 or other equal to false)'log(logs)
end-- # TO DELETEos.sleep(30)
end
3. Print here the log result.
Please add here also the list of valves in each zones, and I will check if all are calculated.
And if it is about a day when script stopped working correctly, maybe you've done some changes in tags(maybe you've changed multiple tags and accidentally deleted the necessary tag)?
(25.10.2018, 06:04)buuuudzik Wrote: If I can give you some tips:
- tags shouldn't be very, very long because if they are very long you can accidently assign new tag which is misspelled and probably you don't see whole tag/tags in Objects view. In your case you has e.g. "pompa_circolazione_giorno_estate" which means "circulation pump summer day" so you can think how to short this name, maybe you can remove "day" from it, use shortcut name and let e.g. pump_ce1
- please use english in your code, you will do better programs, all people in forums can help
you faster.
- when you debug code don't be afraid to use a lot of log() function (also like log('Label 1', your_variable)) and also try to check step by step where is the start of the problem because when you have complex script then when something is bad calculated at start then end could be very mess and unpredictable so you should check full path from. You can also log only certain data e.g. when you are logging knx object then you can log full object but more readable would be to log only specific properties like log(obj.name, obj.value).
- use functions for splitting your code into a few simple and easy to test parts which would be also much more readable
- use tables, objects, for loops, tags for multiple zones, don't create another script for it
This are only some tips from me, because I see that you are trying to do better(more advanced) programs.
If it about your code please check step by step every line. I'm strongly recommend you use this last version because it is more readable and more ready for future changes which you will probably do.
1. Please stop all other pump circulation scripts.
2. Please use another script with a name e.g. 'Test' (it must be fresh script)and copy there such script which parallelly creates logs object and at the end ot prints it:
-------------------------------------------------------- DEFINE GLOBAL VARIABLES AND ZONES------------------------------------------------------------------------seasonGA = '2/0/100'logging = truezones = {
{
summer = 'pompa_circolazione_giorno_estate',
winter = 'pompa_circolazione_giorno_inverno',
pump = '2/0/1',
offset = 60,
minimum = 30
}
}
-------------------------------------------------------- DONT CHANGE NOTHING BELOW-------------------------------------------------------------------------------- season = grp.getvalue(seasonGA)
nextCalculationAfter = 30-- it will be changed by first zoneifloggingthenlogs = {season = season} end-- #TO DELETEfunctioncalcOutOfTheSeason(tag)
localopened = falselocalfirstTimestamp = 0localvalves = grp.tag(tag)
ifloggingthenlogs.zones[#logs.zones].valvesInWinter = {} end-- #TO DELETEforv = 1, #valves, 1dolocalvalve = valves[v]
ifvalve.valuethenopened = trueiffirstTimestamp > 0theniffirstTimestamp > valve.updatetimethenfirstTimestamp = valve.updatetimeendelsefirstTimestamp = valve.updatetimeendendifloggingthenlogs.zones[#logs.zones].valvesInWinter[v] = {name = valve.name, value = valve.value, tags = valve.tags, opened = opened, firstTimestamp = firstTimestamp} end-- #TO DELETEendreturnopened, firstTimestampendfunctioncalcDuringTheSeason(tag)
localopened = falselocalfirstTimestamp = 0localvalves = grp.tag(tag)
ifloggingthenlogs.zones[#logs.zones].valvesInSummer = {} end-- #TO DELETEvalves = grp.tag(tag)
forv = 1, #valves, 1dovalve = valves[v]
ifvalve.valuethenopened = trueiffirstTimestamp > 0theniffirstTimestamp > valve.updatetimethenfirstTimestamp = valve.updatetimeendelsefirstTimestamp = valve.updatetimeendendifloggingthenlogs.zones[#logs.zones].valvesInSummer[v] = {name = valve.name, value = valve.value, tags = valve.tags, opened = opened, firstTimestamp = firstTimestamp} end-- #TO DELETEendreturnopened, firstTimestampendifloggingthenlogs.season = seasonlogs.zones = {}
end-- #TO DELETEforz, zoneinipairs(zones) dolocalsummerTag = zone.summerlocalwinterTag = zone.winterlocalpumpGA = zone.pumplocalopeningValveTime = zone.offsetlocalminInterval = zone.minimumifloggingthenlogs.zones[z] = {
settings = {
summerTag = summerTag,
winterTag = winterTag,
pumpGA = pumpGA,
pumpBeforeCmd = grp.getvalue(pumpGA),
openingValveTime = openingValveTime,
minInterval = minInterval
}
}
end-- #TO DELETE-- CALCULATE SINGLElocalopened, firstTimestamp = false, 0-- Calc valve state and firsttimestamp for updateifseasonthenopened, firstTimestamp = calcDuringTheSeason(winterTag)
elseopened, firstTimestamp = calcOutOfTheSeason(summerTag)
endifloggingthenlogs.zones[z].opened = openedlogs.zones[z].firstTimestamp = firstTimestampend-- # TO DELETE-- Find nextZoneCalculationAfter for current zonelocalnextZoneCalculationAfter = 0ifopenedthenlocalfullyOpened = os.microtime() - firstTimestamp >= openingValveTimeiffullyOpenedthengrp.checkwrite(pumpGA, true)
nextZoneCalculationAfter = minIntervalifloggingthenlogs.zones[z].info = 'Turn on pump because valve is fully opened. Next calculation after ' .. nextZoneCalculationAfter .. 's'end-- # TO DELETEelsegrp.checkwrite(pumpGA, false)
nextZoneCalculationAfter = openingValveTime + 1 - (os.microtime() - firstTimestamp) -- run a little after possible changeifloggingthenlogs.zones[z].info = 'Turn off pump because valve isn'tyetfullyopened.Nextcalculationafter' .. nextZoneCalculationAfter .. 's' end -- # TO DELETEendelsegrp.checkwrite(pumpGA, false)
nextZoneCalculationAfter = openingValveTime + 1ifloggingthenlogs.zones[z].info = 'Turn on pump because valve is closed. Next calculation after ' .. nextZoneCalculationAfter .. 's. 'end-- # TO DELETEend-- Update nextCalculationAfter (global)ifz == 1ornextCalculationAfter < nextZoneCalculationAfterthennextCalculationAfter = nextZoneCalculationAfterifloggingthenlogs.zones[z].info = logs.zones[z].info .. 'Variable nextCalculationAfter was changed to ' .. nextZoneCalculationAfter .. '.'end-- # TO DELETEendend-- log('Next calculation after: ' .. nextCalculationAfter .. 's.')ifnextCalculationAfterandnextCalculationAfter > 5thenifloggingthenlogs.sleepDescription = 'Calculated ' .. nextCalculationAfter .. 's'log(logs)
end-- # TO DELETEos.sleep(nextCalculationAfter)
elseifloggingthenlogs.sleepDescription = 'Default ' .. nextCalculationAfter .. 's (calculated value is 0 or other equal to false)'log(logs)
end-- # TO DELETEos.sleep(30)
end
3. Print here the log result.
Please add here also the list of valves in each zones, and I will check if all are calculated.
And if it is about a day when script stopped working correctly, maybe you've done some changes in tags(maybe you've changed multiple tags and accidentally deleted the necessary tag)?
Hi Buuuudzik,
thank you for your effort and suggestion. Please find below log list you required. It is very strange because everything seems working fine but group address 2/0/2 does not change. Always in off.
All looks good except above firstTimestamp = 0 which should have some value, not 0. But except this all looks good.
26.10.2018 16:37:22
Valve 'T7 FB Heating floor attic valve' is closed
Pump is turned off. Scripts waits 61s because minimum fully open time is 60s.
26.10.2018 16:38:23
Valve 'T7 FB Heating floor attic valve' is not fullyopened
Pump is turned off. Script waits another 46s when valve will be fully opened.
What you can do further:
1. Replace grp.checkwrite() with grp.write()
2. Log grp.find() of pump after writing value to it.
29.10.2018, 16:56 (This post was last modified: 29.10.2018, 16:57 by buuuudzik.)
Could you define what means "not working"? What is current state of your system?
But probably I've found the source of problem Please log in "Object logs" valve status because for 99% you are updating your valve every minute(not only on change) so the timestamp is updated and is still too fresh and is recognized as not fully open.
Everytime script runs there is different firstTimestamp which is equal to updatetime of valve with alias 'T7 FB Heating floor attic valve'. So the status of this valve is updated every minute. But this is not by this script because this script only controls the pump based on valve statuses.
I think you are upodating state of valve every minute. Please log