I made a piston a few months ago, and I think it is time I shared it with others. This one draws a gauge on my dashboard that monitors the amount of sunlight on any particular day. Basically, far left on the dial is the Winter Solstice (the shortest day of the year) and the far right is the Summer Solstice (the longest day of the year). When the dial is straight up (50) it is one of the 2 Equinoxes (days and nights are equal).
(This picture was saved a few hours after our last Equinox)
There is a bit of math required to get this one customized to your location, but if you are interested, keep on reading. (The first few steps are done with a calculator, pen and paper)
First, you need to find the longest and shortest days for your location (down to the seconds for accuracy). I put in my city at www.timeanddate.com/sun/ and then examined the “Daylength” in late June and then in late December to find the extremes. Take note of the longest time in June, and the shortest time in December.
(For me, it was 14h 01m 57s and 10h 22m 24s) <<-- This last time will be used in webCoRE
Next, we need to convert those times to something understood by webCoRE.
Use the Evaluation Console as an expression something like this:
datetime('14:01:57')
-and-
datetime('10:22:24')
Use your numbers instead of mine, and make note of both responses.
(for me, it was 1529607660000 & 1529594520000)
Next, subtract the small number from the larger number.
(For me, it was: 1529607660000 - 1529594520000 = 13140000) <<-- This number is used in the next step
This answer tells me that in my city, there is 13,140 seconds (3.65 hours) difference between the amount of daylight between the two Solstices.
Next, we want a conversion rate of 100, where 0 would be the shortest day, and 100 would be the longest day. So (getting as many decimal places as we can) we do this formula:
100 / 13140000 = 0.000007610350076103501 <<-- This last number will be used in webCoRE
(make sure you replace my 13140000 with your number)
Then in webCoRE, we make a piston:
define
integer dayLengthLong
decimal dayLengthPercent
end define
Every day, at 15 seconds after midnight
do
Set variable {dayLengthLong} = {datetime(formatDuration($sunset-$sunrise, false, 's'))}
Set variable {dayLengthPercent} = {(dayLengthLong - datetime('10:22:24')) * 0.000007610350076103501}
Set variable {@@dayLengthPercent} = {round(dayLengthPercent,1)}
Notice this last variable is a GLOBAL variable so it can be referred to by other pistons. Also make sure you substitute your December shortest time where I have 10:22:24 above, and your ultra small number in place of my 0.000007610350076103501
Alright, the preparation math is done. Now we are moving on to drawing the gauge.
Set piston tile #1 title to "[chart-gauge min=0 max=100 greenFrom=0 greenTo=25 greenColor=DeepSkyBlue yellowFrom=25 yellowTo=75 yellowColor=Green redFrom=75 redTo=100 redColor=DarkOrange minorTicks=6 majorTicks=W.E.S|Seasons]" text to "{@@dayLengthPercent}", footer to "{{@@dayLengthPercent}}", and colors to whatever.
Set piston state to "{"Day Length = "@@dayLengthPercent"% @ "$time}";
And there you have it! A great ‘bird’s eye view’ of where we are in the yearly cycle.
Edit:
For those who are a bit overwhelmed by this manual approach, I have a piston below that can be imported. (although you will miss some good posts if you jump right to post #52)