from datetime import datetime, time from appdaemon.plugins.hass.hassapi import Hass from rich import print class Speakers(Hass): def initialize(self): self.listen_state( callback=self.set_volume, entity_id='media_player.nest_minis', new='playing' ) self.set_volume() # self.listen_state( # callback=self.state_test, # entity_id='media_player.nest_minis', # # new=lambda n: n == 'playing', # attribute='all' # ) @property def solar_elevation(self) -> float: return self.AD.sched.location.solar_elevation(self.get_now()) def state_test(self, entity=None, attribute=None, old=None, new=None, kwargs=None): try: print(new.keys()) self.log(new.keys()) except: self.log('Error') # for k, v in new.items(): # self.log(f'{k}: {v}') # self.log(new['state']) # self.log(entity) # self.log(f'New state:\n{type(new)}') # self.log(new['entity_id']) def set_volume(self, entity=None, attribute=None, old=None, new=None, kwargs=None): self.log('Callback - state changed to playing') if old == 'paused': self.log(f'Unpaused - skipping volume adjust') return if self.get_now().time() < datetime.strptime('03:00', '%H:%M').time(): self.log('Setting volume - before 10:00am') self.call_service( 'media_player/volume_set', volume_level=0.5, entity_id=[ 'media_player.kitchen_speaker', 'media_player.desk_speaker', ], ) self.call_service( 'media_player/volume_set', volume_level=0.5, entity_id=[ 'media_player.bedroom_speaker', 'media_player.bathroom_speaker', ], ) self.call_service( 'media_player/volume_set', volume_level=0.0, entity_id=['media_player.patio_speaker'], ) elif self.get_now().time() < datetime.strptime('10:00', '%H:%M').time(): self.log('Setting volume - before 10:00am') self.call_service( 'media_player/volume_set', volume_level=0.7, entity_id=[ 'media_player.kitchen_speaker', 'media_player.desk_speaker', ], ) self.call_service( 'media_player/volume_set', volume_level=0.7, entity_id=[ 'media_player.bedroom_speaker', 'media_player.bathroom_speaker', ], ) self.call_service( 'media_player/volume_set', volume_level=0.0, entity_id=['media_player.patio_speaker'], ) elif self.solar_elevation < 0: self.log('Setting volume - sun below horizon') self.call_service( 'media_player/volume_set', volume_level=0.5, entity_id=[ 'media_player.kitchen_speaker', 'media_player.desk_speaker', ], ) self.call_service( 'media_player/volume_set', volume_level=0.3, entity_id=[ 'media_player.bedroom_speaker', 'media_player.bathroom_speaker', ], ) self.call_service( 'media_player/volume_set', volume_level=0.0, entity_id=['media_player.patio_speaker'], ) else: self.log('Setting volume - default case') self.call_service( 'media_player/volume_set', volume_level=0.5, entity_id=[ 'media_player.kitchen_speaker', 'media_player.desk_speaker', ], ) self.call_service( 'media_player/volume_set', volume_level=0.5, entity_id=[ 'media_player.bedroom_speaker', 'media_player.bathroom_speaker', ], ) self.call_service( 'media_player/volume_set', volume_level=0.0, entity_id=['media_player.patio_speaker'], )