diff --git a/apps/speakers/speakers.py b/apps/speakers/speakers.py new file mode 100644 index 0000000..663312f --- /dev/null +++ b/apps/speakers/speakers.py @@ -0,0 +1,156 @@ +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' + ] + ) diff --git a/apps/speakers/speakers.yaml b/apps/speakers/speakers.yaml new file mode 100644 index 0000000..81bcc06 --- /dev/null +++ b/apps/speakers/speakers.yaml @@ -0,0 +1,30 @@ +speakers: + module: speakers + class: Speakers + states: + - time: '05:00:00' + sets: + - entity_id: + - media_player.desk_speaker + - media_player.kitchen_speaker + - media_player.bathroom_speaker + volume: 0.7 + - entity_id: media_player.bedroom_speaker + volume: 0.7 + - entity_id: media_player.patio_speaker + volume: 0.0 + - elevation: 0 + + # - service: media_player.volume_set + # data: + # volume_level: 0.2 + # target: + # entity_id: + # - media_player.desk_speaker + # - media_player.kitchen_speaker + # - media_player.bathroom_speaker + # - service: media_player.volume_set + # data: + # volume_level: 0.3 + # target: + # entity_id: media_player.bedroom_speaker \ No newline at end of file