Can you check the pilight log to see what the timestamps were for the execution of the actions? For example:
Code:
[Jan 08 17:44:47:568819] pilight-daemon: INFO: executed rule: sunrise-decolight
[Jan 08 17:44:47:568962] pilight-daemon: INFO: started "label" action for device "labelsunrise"
[Jan 08 17:44:47:568979] pilight-daemon: INFO: stopped "label" action for device "labelsunrise"
[Jan 08 17:44:47:569056] pilight-daemon: INFO: started "switch" action for device "light_deco_mirror_livingroom"
[Jan 08 17:44:47:569094] pilight-daemon: INFO: executed rule: sunset-decolight
[Jan 08 17:44:47:569124] pilight-daemon: INFO: stopped "switch" action for device "light_deco_mirror_livingroom"
[Jan 08 17:44:47:569222] pilight-daemon: INFO: started "label" action for device "labelsunset"
[Jan 08 17:44:47:569231] pilight-daemon: INFO: stopped "label" action for device "labelsunset"
Beware that the time you see is in UTC.
Secondly, check with pilight running with additional parsing information:
Code:
pilight-daemon --debuglevel=1
It will tell you how the rules are parsed.
Code:
[Jan 08 17:48:00:434640]pilight-daemon: DEBUG: broadcasted:
replace DATE_ADD(datetimedev, -10 MINUTE) with "2018-01-08 18:38:00" in DATE_ADD(datetimedev, -10 MINUTE)
replace DATE_ADD(datetimedev, -10 MINUTE) with "2018-01-08 18:38:00" in sunrisesetdev.sunrise == DATE_FORMAT(DATE_ADD(datetimedev, -10 MINUTE), "%Y-%m-%d %H:%M:%S", %H.%M)
replace DATE_FORMAT("2018-01-08 18:38:00", "%Y-%m-%d %H:%M:%S", %H.%M) with 18.38 in sunrisesetdev.sunrise == DATE_FORMAT("2018-01-08 18:38:00", "%Y-%m-%d %H:%M:%S", %H.%M)
evaluate (OR) sunrisesetdev.sunrise == 18.38
replace (sunrisesetdev.sunrise == DATE_FORMAT(DATE_ADD(datetimedev, -10 MINUTE), "%Y-%m-%d %H:%M:%S", %H.%M)) with 0 in (sunrisesetdev.sunrise == DATE_FORMAT(DATE_ADD(datetimedev, -10 MINUTE), "%Y-%m-%d %H:%M:%S", %H.%M)) AND datetimedev.second == 0
evaluate (AND) 0 AND datetimedev.second == 0
skip (AND) datetimedev.second == 0
[Jan 08 17:48:00:434879] pilight-daemon: DEBUG: rule #1 sunrise-decolight was parsed in 0.000076 seconds
replace DATE_ADD(datetimedev, +30 MINUTE) with "2018-01-08 19:18:00" in DATE_ADD(datetimedev, +30 MINUTE)
replace DATE_ADD(datetimedev, +30 MINUTE) with "2018-01-08 19:18:00" in sunrisesetdev.sunset == DATE_FORMAT(DATE_ADD(datetimedev, +30 MINUTE), "%Y-%m-%d %H:%M:%S", %H.%M)
replace DATE_FORMAT("2018-01-08 19:18:00", "%Y-%m-%d %H:%M:%S", %H.%M) with 19.18 in sunrisesetdev.sunset == DATE_FORMAT("2018-01-08 19:18:00", "%Y-%m-%d %H:%M:%S", %H.%M)
evaluate (OR) sunrisesetdev.sunset == 19.18
replace (sunrisesetdev.sunset == DATE_FORMAT(DATE_ADD(datetimedev, +30 MINUTE), "%Y-%m-%d %H:%M:%S", %H.%M)) with 0 in (sunrisesetdev.sunset == DATE_FORMAT(DATE_ADD(datetimedev, +30 MINUTE), "%Y-%m-%d %H:%M:%S", %H.%M)) AND datetimedev.second == 0
evaluate (AND) 0 AND datetimedev.second == 0
skip (AND) datetimedev.second == 0
[Jan 08 17:48:00:434933] pilight-daemon: DEBUG: rule #2 sunset-decolight was parsed in 0.000038 seconds
So if we analyze this:
1. It's 17:48:00 UTC time which means 18:48:00 in Berlin.
The first rule:
1. DATE_ADD(datetimedev, -10 MINUTE) is being parsed as "2018-01-08 18:38:00" which is correct.
2. DATE_FORMAT("2018-01-08 18:38:00", "%Y-%m-%d %H:%M:%S", %H.%M) is being parsed as 18.38 which is also correct.
The second rule:
1. DATE_ADD(datetimedev, +30 MINUTE) is being parsed as "2018-01-08 19:18:00" which is correct.
2. DATE_FORMAT("2018-01-08 19:18:00", "%Y-%m-%d %H:%M:%S", %H.%M) is being parsed as 19.18 which is also correct.
In both cases the actual datetime doesn't match the sunrise/sunset.
If we force the match:
Code:
IF sunrisesetdev.sunrise == 8.15 AND datetimedev.second > 0 THEN ...
Code:
[Jan 08 17:56:39:730219] pilight-daemon: DEBUG: broadcasted: {"origin":"receiver","protocol":"datetime","message":{"longitude":13.404954,"latitude":52.520007,"year":2018,"month":1,"day":8,"weekday":2,"hour":18,"minute":56,"second":39,"dst":0},"uuid":"0000-00-0c-29-3714d8"}
evaluate (AND) sunrisesetdev.sunrise == 8.15 AND datetimedev.second > 0
evaluate (AND) datetimedev.second > 0
replace DATE_FORMAT(datetimedev, "%d.%m.%Y %H:%M") with "08.01.2018 18:56" in "Sun rises in 10 minutes; Light off" DATE_FORMAT(datetimedev, "%d.%m.%Y %H:%M")
[Jan 08 17:56:39:730451] pilight-daemon: INFO: started "switch" action for device "light_deco_mirror_livingroom"
[Jan 08 17:56:39:730469] pilight-daemon: INFO: started "label" action for device "labelsunrise"
[Jan 08 17:56:39:730477] pilight-daemon: INFO: stopped "switch" action for device "light_deco_mirror_livingroom"
[Jan 08 17:56:39:730457] pilight-daemon: INFO: executed rule: sunrise-decolight
1. sunrisesetdev.sunrise == 8.15 applies because it continues to the next AND
2. datetimedev.second > 0 also applies so it triggers the action.
To see what happens when a condition doesn't apply:
Code:
[ Jan 08 17:59:30:99294] pilight-daemon: DEBUG: broadcasted: {"origin":"receiver","protocol":"datetime","message":{"longitude":13.404954,"latitude":52.520007,"year":2018,"month":1,"day":8,"weekday":2,"hour":18,"minute":59,"second":30,"dst":0},"uuid":"0000-00-0c-29-3714d8"}
evaluate (AND) sunrisesetdev.sunrise == 8.16 AND datetimedev.second > 0
skip (AND) datetimedev.second > 0
[ Jan 08 17:59:30:99437] pilight-daemon: DEBUG: rule #1 sunrise-decolight was parsed in 0.000097 seconds
You see that it skips the datetimedev.second evaluations because the left side of the condition already didn't apply.
I very curious if you can confirm that the rules are actually parsed correctly or not.
Then you've got a mistake in your logic as well.
1. The sunrise time is 8.15.
2. DATE_ADD(datetimedev, -10 MINUTE) means that 8.15 only applies at 8.25 in this case (8.25 - 0.10 = 8.15).
I can't confirm the enclosing of the datetimedev.seconds either. This runs fine:
Code:
IF (sunriseset.sunrise == DATE_FORMAT(DATE_ADD(datetimedev, -10 MINUTE), \"%Y-%m-%d %H:%M:%S\", %H.%M) AND datetimedev.second == 0) THEN switch DEVICE light_deco_mirror_livingroom TO off AND label DEVICE labelsunrise TO \"Sun rises in 10 minutes; Light off\" DATE_FORMAT(datetimedev, \"%d.%m.%Y %H:%M\") COLOR green
Code:
[Jan 08 18:05:03:990257] pilight-daemon: DEBUG: broadcasted: {"origin":"receiver","protocol":"datetime","message":{"longitude":13.404954,"latitude":52.520007,"year":2018,"month":1,"day":8,"weekday":2,"hour":19,"minute":5,"second":3,"dst":0},"uuid":"0000-00-0c-29-3714d8"}
replace DATE_ADD(datetimedev, -10 MINUTE) with "2018-01-08 18:55:03" in DATE_ADD(datetimedev, -10 MINUTE)
replace DATE_ADD(datetimedev, -10 MINUTE) with "2018-01-08 18:55:03" in sunriseset.sunrise == DATE_FORMAT(DATE_ADD(datetimedev, -10 MINUTE), "%Y-%m-%d %H:%M:%S", %H.%M) AND datetimedev.second == 0
replace DATE_FORMAT("2018-01-08 18:55:03", "%Y-%m-%d %H:%M:%S", %H.%M) with 18.55 in sunriseset.sunrise == DATE_FORMAT("2018-01-08 18:55:03", "%Y-%m-%d %H:%M:%S", %H.%M) AND datetimedev.second == 0
evaluate (OR) sunriseset.sunrise == 18.55 AND datetimedev.second == 0
replace (sunriseset.sunrise == DATE_FORMAT(DATE_ADD(datetimedev, -10 MINUTE), "%Y-%m-%d %H:%M:%S", %H.%M) AND datetimedev.second == 0) with sunriseset.sunrise == 18.55 AND datetimedev.second == 0 in (sunriseset.sunrise == DATE_FORMAT(DATE_ADD(datetimedev, -10 MINUTE), "%Y-%m-%d %H:%M:%S", %H.%M) AND datetimedev.second == 0)
evaluate (AND) sunriseset.sunrise == 18.55 AND datetimedev.second == 0
skip (AND) datetimedev.second == 0
Code:
replace DATE_ADD(datetimedev, -10 MINUTE) with "2018-01-08 18:38:00" in sunrisesetdev.sunrise == DATE_FORMAT(DATE_ADD(datetimedev, -10 MINUTE), "%Y-%m-%d %H:%M:%S", %H.%M)
vs
Code:
replace DATE_ADD(datetimedev, -10 MINUTE) with "2018-01-08 18:55:03" in sunriseset.sunrise == DATE_FORMAT(DATE_ADD(datetimedev, -10 MINUTE), "%Y-%m-%d %H:%M:%S", %H.%M) AND datetimedev.second == 0