Weather.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #!/usr/bin/env python
  2. import datetime
  3. import pytz
  4. import sys
  5. import time
  6. from datetime import datetime as dt
  7. from threading import Thread
  8. from aman.com.DwdCrawler import DwdCrawler
  9. import aman.config.Weather
  10. class Weather(Thread):
  11. def __init__(self, config : aman.config.Weather.Weather):
  12. Thread.__init__(self)
  13. self.nextUpdate = dt.utcfromtimestamp(int(time.time()))
  14. self.lastUpdateTried = None
  15. self.stopThread = False
  16. self.provider = None
  17. if 'DWD' == config.Provider.upper():
  18. self.provider = DwdCrawler()
  19. else:
  20. sys.stderr.write('Invalid or unknown weather-provider defined')
  21. sys.exit(-1)
  22. self.start()
  23. def stop(self):
  24. self.stopThread = True
  25. def currentClock():
  26. clock = dt.utcfromtimestamp(int(time.time()))
  27. clock = datetime.datetime(
  28. year = clock.year,
  29. month = clock.month,
  30. day = clock.day,
  31. hour = clock.hour,
  32. minute = clock.minute,
  33. second = clock.second,
  34. tzinfo = pytz.UTC
  35. )
  36. return clock
  37. def run(self):
  38. while False == self.stopThread and None != self.provider:
  39. now = Weather.currentClock()
  40. # check if an update is required
  41. if None != self.provider.updateTime and self.provider.updateTime > now:
  42. time.sleep(1)
  43. continue
  44. # calculate the theoretical next try for an update
  45. if None != self.lastUpdateTried:
  46. earliestUpdate = self.lastUpdateTried + datetime.timedelta(minutes=2)
  47. if None == self.lastUpdateTried or self.lastUpdateTried <= now:
  48. if True == self.provider.receiveWindData():
  49. self.nextUpdate = self.provider.updateTime