Source code for wluma_als_emulator.strategies.daylight_strategy

from datetime import datetime, time

from ..helpers.solar_api import SolarApi


[docs]class DayLightStrategy: def __init__(self, config): """ WIP: Improved NoonStrategy but with usage of day length, sunrise and sunset """ self.config = config self.lux = None self.sleep_time = self.config.sleep_time self.api = SolarApi(config) def calculate(self): # refresh data api self.api.fetch() civil_twilight_begin_in_seconds = self.api.get( "civil_twilight_begin_in_seconds" ) civil_twilight_end_in_seconds = self.api.get("civil_twilight_end_in_seconds") civil_twilight_end = self.api.get("civil_twilight_end") civil_twilight_begin = self.api.get("civil_twilight_begin") day_length_in_seconds = self.api.get("day_length_in_seconds") day_length_percent_duration = (day_length_in_seconds * 100) / 86400 night_percent_duration = 100 - day_length_percent_duration if self.config.verbose: print( "day length: {}% and night length: {}%".format( int(day_length_percent_duration), int(night_percent_duration) ) ) datenow = ( datetime.now() .replace(tzinfo=self.config.to_zone) .astimezone(self.config.to_zone) ) midnight = ( datetime.combine(datenow.date(), time(0)) .replace(tzinfo=self.config.from_zone) .astimezone(self.config.to_zone) ) now = midnight - datenow now_in_seconds = now.seconds if self.config.verbose: c1 = ">" if now_in_seconds > civil_twilight_begin_in_seconds else ">" c2 = "<" if now_in_seconds < civil_twilight_end_in_seconds else "<" print( "now: {} {} twilight_begin: {} and now: {} {} twilight_end: {}".format( now_in_seconds, c1, civil_twilight_begin_in_seconds, now_in_seconds, c2, civil_twilight_end_in_seconds, ) ) if ( now_in_seconds > civil_twilight_begin_in_seconds and now_in_seconds < civil_twilight_end_in_seconds ): lux = (now_in_seconds * 100) / ( civil_twilight_end - civil_twilight_begin ).total_seconds() else: lux = 0 if self.config.verbose: print( "lux={} | time={} | twilight_begin={} | civil_twilight_end={} | waiting {} seconds...".format( round(lux, 3), datetime.now(), civil_twilight_begin, civil_twilight_end, self.sleep_time, ) ) return int(lux) def run(self): self.lux = self.calculate()