@@ -97,50 +97,58 @@ def get_sunscreen_schedule():
97
97
})
98
98
99
99
# Default
100
- schedule = pd .DataFrame ({'WEATHER_PREDICTION' : 'ok' , 'REASON' : '' }, index = forecast .index , columns = ['WEATHER_PREDICTION' , 'REASON' ])
100
+ schedule = pd .DataFrame ({'WEATHER_PREDICTION' : 'ok' , 'CLOSE_WINDOW' : False , ' REASON' : '' }, index = forecast .index , columns = ['WEATHER_PREDICTION' , 'CLOSE_WINDOW ' , 'REASON' ])
101
101
102
102
not_sunny_idx = forecast [DwdMosmixParameter .LARGE .SUNSHINE_DURATION .value ] < 5 * 60
103
- schedule [not_sunny_idx ] = [ 'bad' , '⛅' ]
103
+ schedule . loc [not_sunny_idx , 'REASON' ] = '⛅'
104
104
good_idx = forecast [DwdMosmixParameter .LARGE .SUNSHINE_DURATION .value ] >= 10 * 60
105
+ bad_idx = not_sunny_idx
105
106
106
107
cloudy_idx = forecast [DwdMosmixParameter .LARGE .CLOUD_COVER_EFFECTIVE .value ] > 7 / 8 * 100.0
107
- schedule [cloudy_idx ] = [ 'bad' , ' ☁️']
108
+ schedule . loc [cloudy_idx , 'REASON' ] = ' ☁️'
108
109
good_idx &= forecast [DwdMosmixParameter .LARGE .CLOUD_COVER_EFFECTIVE .value ] < 6 / 8 * 100.0
110
+ bad_idx |= cloudy_idx
111
+
112
+ rainy_idx = ((forecast [DwdMosmixParameter .LARGE .PROBABILITY_PRECIPITATION_LAST_1H .value ] > 45.0 ) & (forecast [DwdMosmixParameter .LARGE .PRECIPITATION_DURATION .value ] > 120 )) | (forecast [DwdMosmixParameter .LARGE .PROBABILITY_DRIZZLE_LAST_1H .value ] > 45.0 )
113
+ schedule .loc [rainy_idx , 'REASON' ] = '🌧'
114
+ good_idx &= forecast [DwdMosmixParameter .LARGE .PROBABILITY_PRECIPITATION_LAST_1H .value ] < 30.0
115
+ good_idx &= forecast [DwdMosmixParameter .LARGE .PRECIPITATION_DURATION .value ] < 60
116
+ good_idx &= forecast [DwdMosmixParameter .LARGE .PROBABILITY_DRIZZLE_LAST_1H .value ] < 30.0
117
+ bad_idx |= rainy_idx
109
118
110
119
dewy_idx = (forecast [DwdMosmixParameter .LARGE .TEMPERATURE_DEW_POINT_MEAN_200 .value ] > forecast [DwdMosmixParameter .LARGE .TEMPERATURE_AIR_MEAN_200 .value ]) | (forecast [DwdMosmixParameter .LARGE .PROBABILITY_FOG_LAST_1H .value ] > 45.0 )
111
- schedule [dewy_idx ] = ['bad' , '🌫' ]
120
+ schedule .loc [dewy_idx , 'REASON' ] = '🌫'
121
+ schedule .loc [dewy_idx , 'CLOSE_WINDOW' ] = True
112
122
good_idx &= forecast [DwdMosmixParameter .LARGE .TEMPERATURE_DEW_POINT_MEAN_200 .value ] + forecast [DwdMosmixParameter .LARGE .ERROR_ABSOLUTE_TEMPERATURE_DEW_POINT_MEAN_200 .value ] < forecast [DwdMosmixParameter .LARGE .TEMPERATURE_AIR_MEAN_200 .value ] - forecast [DwdMosmixParameter .LARGE .ERROR_ABSOLUTE_TEMPERATURE_AIR_MEAN_200 .value ]
113
123
good_idx &= forecast [DwdMosmixParameter .LARGE .PROBABILITY_FOG_LAST_1H .value ] < 30.0
124
+ bad_idx |= dewy_idx
114
125
115
126
cold_idx = forecast [DwdMosmixParameter .LARGE .TEMPERATURE_AIR_MEAN_200 .value ] - forecast [DwdMosmixParameter .LARGE .ERROR_ABSOLUTE_TEMPERATURE_AIR_MEAN_200 .value ] < 277.15 # 4 °C
116
- schedule [cold_idx ] = ['bad' , '❄️' ]
127
+ schedule .loc [cold_idx , 'REASON' ] = '❄️'
128
+ schedule .loc [cold_idx , 'CLOSE_WINDOW' ] = True
117
129
good_idx &= forecast [DwdMosmixParameter .LARGE .TEMPERATURE_AIR_MEAN_200 .value ] >= 285.15 # 12 °C
130
+ bad_idx |= cold_idx
118
131
119
132
windy_idx = forecast [DwdMosmixParameter .LARGE .WIND_GUST_MAX_LAST_1H .value ] > 11
120
- schedule [windy_idx ] = ['bad' , '💨' ]
133
+ schedule .loc [windy_idx , 'REASON' ] = '💨'
134
+ schedule .loc [windy_idx , 'CLOSE_WINDOW' ] = True
121
135
good_idx &= forecast [DwdMosmixParameter .LARGE .WIND_GUST_MAX_LAST_1H .value ] < 10
122
-
123
- rainy_idx = ((forecast [DwdMosmixParameter .LARGE .PROBABILITY_PRECIPITATION_LAST_1H .value ] > 45.0 ) & (forecast [DwdMosmixParameter .LARGE .PRECIPITATION_DURATION .value ] > 120 )) | (forecast [DwdMosmixParameter .LARGE .PROBABILITY_DRIZZLE_LAST_1H .value ] > 45.0 )
124
- schedule [rainy_idx ] = ['bad' , '🌧' ]
125
- good_idx &= forecast [DwdMosmixParameter .LARGE .PROBABILITY_PRECIPITATION_LAST_1H .value ] < 30.0
126
- good_idx &= forecast [DwdMosmixParameter .LARGE .PRECIPITATION_DURATION .value ] < 60
127
- good_idx &= forecast [DwdMosmixParameter .LARGE .PROBABILITY_DRIZZLE_LAST_1H .value ] < 30.0
136
+ bad_idx |= windy_idx
128
137
129
138
thundery_idx = forecast [DwdMosmixParameter .LARGE .PROBABILITY_THUNDER_LAST_1H .value ] > 45.0
130
- schedule [thundery_idx ] = ['bad' , '⛈' ]
139
+ schedule .loc [thundery_idx , 'REASON' ] = '⛈'
140
+ schedule .loc [thundery_idx , 'CLOSE_WINDOW' ] = True
131
141
good_idx &= forecast [DwdMosmixParameter .LARGE .PROBABILITY_THUNDER_LAST_1H .value ] < 30.0
142
+ bad_idx |= thundery_idx
132
143
133
- schedule [good_idx ] = ['good' , '☀️' ]
134
-
135
- # Don't close before sunrise
136
- sunrise = astral .sun .sunrise (observer )
137
- schedule .loc [sunrise ] = ['bad' , '🌙' ]
144
+ schedule [good_idx ] = ['good' , False , '☀️' ]
145
+ schedule .loc [bad_idx , 'WEATHER_PREDICTION' ] = 'bad'
138
146
139
- # Open at sunset
147
+ # Open sunscreen and close window at sunset
140
148
sunset = astral .sun .sunset (observer )
141
149
index_after_sunset = schedule .index .where (schedule .index .to_pydatetime () > sunset ).min ()
142
150
schedule .loc [sunset ] = schedule .loc [index_after_sunset ]
143
- schedule .loc [index_after_sunset ] = ['bad' , '🌙' ]
151
+ schedule .loc [index_after_sunset ] = ['bad' , True , '🌙' ]
144
152
145
153
schedule = schedule .sort_index ()
146
154
0 commit comments