11"""
22Sensor component for waste pickup dates from dutch waste collectors (using the http://www.opzet.nl app)
33Original Author: Pippijn Stortelder
4- Current Version: 2.0.5 20190130 - Pippijn Stortelder
4+ Current Version: 2.1.2 20190201 - Pippijn Stortelder
5520190116 - Merged different waste collectors into 1 component
6620190119 - Added an option to change date format and fixed spelling mistakes
7720190122 - Refactor code and bug fix
8820190123 - Added 12 more waste collectors
9920190130 - FIXED PMD for some waste collectors
10+ 20190131 - Added Today and Tomorrow sensors
11+ 20190201 - Added option for date only
1012
1113Description:
1214 Provides sensors for the following Dutch waste collectors;
5254Configuration.yaml:
5355 sensor:
5456 - platform: afvalbeheer
55- wastecollector: Blink
56- dateformat: '%d-%m-%Y'
57+ wastecollector: Blink (required)
5758 resources: (at least 1 required)
5859 - restafval
5960 - gft
6061 - papier
6162 - pmd
6263 postcode: 1111AA (required)
6364 streetnumber: 1 (required)
65+ upcomingsensor: 0 (optional)
66+ dateformat: '%d-%m-%Y' (optional)
67+ dateonly: 0 (optional)
6468"""
6569
6670import logging
7579from homeassistant .util import Throttle
7680from homeassistant .helpers .entity import Entity
7781
78- __version__ = '2.0.5 '
82+ __version__ = '2.1.2 '
7983
8084_LOGGER = logging .getLogger (__name__ )
8185
8488CONF_POSTCODE = 'postcode'
8589CONF_STREETNUMBER = 'streetnumber'
8690CONF_DATE_FORMAT = 'dateformat'
91+ CONF_TODAY_TOMORROW = 'upcomingsensor'
92+ CONF_DATE_ONLY = 'dateonly'
8793
8894ATTR_OFFICIAL_NAME = 'Official name'
8995ATTR_WASTE_COLLECTOR = 'wastecollector'
137143 vol .Required (CONF_STREETNUMBER , default = '1' ): cv .string ,
138144 vol .Optional (CONF_WASTE_COLLECTOR , default = 'Cure' ): cv .string ,
139145 vol .Optional (CONF_DATE_FORMAT , default = '%d-%m-%Y' ): cv .string ,
146+ vol .Optional (CONF_TODAY_TOMORROW , default = False ): cv .boolean ,
147+ vol .Optional (CONF_DATE_ONLY , default = False ): cv .boolean ,
140148})
141149
142150
@@ -147,6 +155,8 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
147155 street_number = config .get (CONF_STREETNUMBER )
148156 waste_collector = config .get (CONF_WASTE_COLLECTOR ).lower ()
149157 date_format = config .get (CONF_DATE_FORMAT )
158+ sensor_today = config .get (CONF_TODAY_TOMORROW )
159+ date_only = config .get (CONF_DATE_ONLY )
150160
151161 try :
152162 data = WasteData (postcode , street_number , waste_collector )
@@ -158,7 +168,11 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
158168
159169 for resource in config [CONF_RESOURCES ]:
160170 sensor_type = resource .lower ()
161- entities .append (WasteSensor (data , sensor_type , waste_collector , date_format ))
171+ entities .append (WasteSensor (data , sensor_type , waste_collector , date_format , date_only ))
172+
173+ if sensor_today :
174+ entities .append (WasteTodaySensor (data , config [CONF_RESOURCES ], waste_collector , "vandaag" ))
175+ entities .append (WasteTodaySensor (data , config [CONF_RESOURCES ], waste_collector , "morgen" ))
162176
163177 add_entities (entities )
164178
@@ -227,11 +241,12 @@ def update(self):
227241
228242class WasteSensor (Entity ):
229243
230- def __init__ (self , data , sensor_type , waste_collector , date_format ):
244+ def __init__ (self , data , sensor_type , waste_collector , date_format , date_only ):
231245 self .data = data
232246 self .type = sensor_type
233247 self .waste_collector = waste_collector
234248 self .date_format = date_format
249+ self .date_only = date_only
235250 self ._name = waste_collector + ' ' + self .type
236251 self ._unit = ''
237252 self ._hidden = False
@@ -279,24 +294,28 @@ def update(self):
279294 today = datetime .today ()
280295 pickup_info = waste_data .get (waste_id )
281296 pick_update = pickup_info [0 ]
282- datediff = (pick_update - today ).days + 1
297+ date_diff = (pick_update - today ).days + 1
283298
284299 self ._official_name = pickup_info [1 ]
285300 self ._fraction_id = waste_id
286301 self ._entity_picture = pickup_info [3 ]
287302 self ._last_update = today .strftime ('%d-%m-%Y %H:%M' )
288303 self ._hidden = False
289304
290- if datediff >= 8 :
291- self ._state = pick_update .strftime (self .date_format )
292- elif datediff > 1 :
293- self ._state = pick_update .strftime ('%A, ' + self .date_format )
294- elif datediff == 1 :
295- self ._state = pick_update .strftime ('Tomorrow, ' + self .date_format )
296- elif datediff <= 0 :
297- self ._state = pick_update .strftime ('Today, ' + self .date_format )
305+ if self .date_only :
306+ if date_diff >= 0 :
307+ self ._state = pick_update .strftime (self .date_format )
298308 else :
299- self ._state = None
309+ if date_diff >= 8 :
310+ self ._state = pick_update .strftime (self .date_format )
311+ elif date_diff > 1 :
312+ self ._state = pick_update .strftime ('%A, ' + self .date_format )
313+ elif date_diff == 1 :
314+ self ._state = pick_update .strftime ('Tomorrow, ' + self .date_format )
315+ elif date_diff == 0 :
316+ self ._state = pick_update .strftime ('Today, ' + self .date_format )
317+ else :
318+ self ._state = None
300319 retrieved_data = 1
301320
302321 if retrieved_data == 0 :
@@ -320,3 +339,74 @@ def update(self):
320339 self ._official_name = None
321340 self ._fraction_id = None
322341 self ._hidden = True
342+
343+
344+ class WasteTodaySensor (Entity ):
345+
346+ def __init__ (self , data , sensor_types , waste_collector , day_sensor ):
347+ self .data = data
348+ self .types = sensor_types
349+ self .waste_collector = waste_collector
350+ self .day = day_sensor
351+ self ._name = waste_collector + ' ' + self .day
352+ self ._unit = ''
353+ self ._hidden = False
354+ self ._state = None
355+
356+ @property
357+ def name (self ):
358+ return self ._name
359+
360+ @property
361+ def state (self ):
362+ return self ._state
363+
364+ @property
365+ def device_state_attributes (self ):
366+ return {
367+ ATTR_HIDDEN : self ._hidden
368+ }
369+
370+ @property
371+ def unit_of_measurement (self ):
372+ return self ._unit
373+
374+ def update (self ):
375+ self .data .update ()
376+ waste_data = self .data .data
377+ retrieved_data = 0
378+ try :
379+ if waste_data is not None :
380+ new_state = []
381+ for type in self .types :
382+ if type in COLLECTOR_WASTE_ID [self .waste_collector ]:
383+ for waste_id in COLLECTOR_WASTE_ID [self .waste_collector ][type ]:
384+ if waste_id in waste_data :
385+ today = datetime .today ()
386+ pickup_info = waste_data .get (waste_id )
387+ pick_update = pickup_info [0 ]
388+ date_diff = (pick_update - today ).days + 1
389+
390+ if date_diff == 1 and self .day == "morgen" :
391+ new_state .append (type )
392+ retrieved_data = 1
393+ elif date_diff < 1 and self .day == "vandaag" :
394+ new_state .append (type )
395+ retrieved_data = 1
396+
397+ if retrieved_data == 0 :
398+ self ._state = "None"
399+ self ._hidden = True
400+ else :
401+ self ._state = ', ' .join (new_state )
402+ self ._hidden = False
403+ else :
404+ self ._state = None
405+ self ._hidden = True
406+ else :
407+ self ._state = None
408+ self ._hidden = True
409+
410+ except ValueError :
411+ self ._state = None
412+ self ._hidden = True
0 commit comments