Page 1 of 1
calculations in time?
Posted: Saturday 03 February 2018 9:15
by renerene
How to best calculate with time values?
I want my room temperature to be 20 degrees at 8:00 AM. The start time of the boiler depends on in- and outside temperature, so starttime=targettime minus heating time. What is the best way to calculate 8:00 AM - 2 hours - 14 minutes = ?
Re: calculations in time?
Posted: Saturday 03 February 2018 11:33
by waaren
renerene wrote: ↑Saturday 03 February 2018 9:15
How to best calculate with time values?
I want my room temperature to be 20 degrees at 8:00 AM. The start time of the boiler depends on in- and outside temperature, so starttime=targettime minus heating time. What is the best way to calculate 8:00 AM - 2 hours - 14 minutes = ?
There will always be better ways but one solution in LUA is:
Code: Select all
t = os.date('*t')
local SetHour = 8
local HourDelta = 2
local SetMinute = 60
local MinuteDelta = 14
local SetMinute = SetMinute - MinuteDelta
if SetMinute < 60 then
HourDelta = HourDelta + 1
end
Sethour = SetHour - HourDelta
local TargetTime = (t.hour - HourDelta) * 3600 + (t.min - MinuteDelta) * 60
local SetTime = Sethour * 3600
if ( TargetTime - SetTime ) > 0 then
print("***********************************")
print("Target time in seconds: " .. tostring(TargetTime),"Set time in seconds: " .. tostring(SetTime),"Delta in seconds: " .. tostring(TargetTime - SetTime) )
print("***********************************")
print("It's Time to do something....")
end
Re: calculations in time?
Posted: Saturday 03 February 2018 13:53
by renerene
I was hoping for more built in routines.
It becomes complex if you want to calculate larger time zones, end of months, etc.
Re: calculations in time?
Posted: Saturday 10 February 2018 20:35
by d3nn1s
Hi I've had a similar problem and I find it frustrading that there seems to be no built in routines to easily calculate with time. I thought e.g. 07:35-20minutes is a simple thing to but I had to do a workaround which makes this simple task seem complicated. I have to say that I'm a LUA beginner and I'm not good at coding.
I wanted to substract a number of minutes from my alarm time, in order to begin the wake up process. I solved it the following way:
Code: Select all
-- uservariables["Wecker_Uhrzeit"] is the alarm time which I set from my smart phone. It's a user time variable holding a string in the format HH:MM.
-- Dimmer_Dauer is the number of minutes I want the wake up process to start before my alarm rings.
commandArray = {}
local Dimmer_Dauer=25 -- Set dimming duration to 25 Minutes
local Hour=string.sub(uservariables["Wecker_Uhrzeit"],1,2); -- Here it gets funny: The string holding the alarm time has to be decomposed into hours and minutes. Here I extract the hours by taking the first two etrys of the string into the local variable Hour
local Minute=string.sub(uservariables["Wecker_Uhrzeit"],4,5); -- Here I extract the minutes by taking the third and fourth etry of the string into the local variable Minute.
local Wecker_Sekunden=os.time{year=1970, month=1, day=1, hour=tonumber(Hour), min=tonumber(Minute)}; --here there strigs with the extracted hours and minutes have to converted into numbers and then into seconds, which I find really funny. This is done by the os.time function. The year, month and day don't matter at all, because after the following math I only extract the hour and minute again. They have to be defined however.
local WakeUp_Sekunden=Wecker_Sekunden-Dimmer_Dauer*60; -- This is the part which does what I intentionally wanted to do. Substracting the duration of the dimming from my alarm time. The local variable WakeUp_Sekunden now holds the desired beginning of the wake up process as a number of seconds from the date defined in the os.time function above.
local WakeUp_Beginn=tostring(os.date("%H:%M",WakeUp_Sekunden)); --the os.date function transforms the desired wake up time from seconds back to a string in the format HH:MM. This is done by choosing only hours and minutes through the %H, the : and the %M.
commandArray['Variable:WakeUp_Beginn']=WakeUp_Beginn; --This updates my user variable which blockly uses to start the wake up process.
return commandArray
-- google about os.time and os.date if you have trouble understanding what these functions do.
I find this method really stupid but I wasn't able to find an easier way. Hope it helps.