from dataclasses import dataclass, field, fields from datetime import timedelta from appdaemon.entity import Entity from appdaemon.plugins.hass.hassapi import Hass @dataclass(init=False) class LivingRoomTV(Hass): media_entity: str hardware_entity: str remote_entity: str def initialize(self): self.listen_state(self.turn_on_soundbar, self.args['playing_entity'], new='playing') for entity in self.args['track_entities']: self.listen_state(self.state_change, entity, attribute='all') self.log(f'Tracking state changes: {entity}') def turn_on_soundbar(self, entity=None, attribute=None, old=None, new=None, kwargs=None): if self.get_state(self.args['remote_entity']) != 'on': self.log('Turning on remote') self.turn_on(self.args['remote_entity']) # if self.remote_entity.state != 'on': # self.log('Turning on remote') # self.remote_entity.turn_on() self.log('Turning on soundbar') self.call_service(service='remote/send_command', entity_id=self.args['remote_entity'], device='BoseTV', command='TV') def state_change(self, entity=None, attribute=None, old=None, new=None, kwargs=None): try: if entity.endswith('2') or entity.endswith('3'): name = new['attributes']['entity_id'] app_name = new['attributes']['app_name'] state = new['state'] self.log(f'{name}: {app_name} {state}') else: self.log(f'{entity}: {new}') except KeyError as e: self.log(f'Failed getting attribute {e} from {entity}') # def recast_lovelace(self, entity=None, attribute=None, old=None, new=None, kwargs=None): # self.cancel_callbacks() # if new['state'] == 'playing': # if 'lovelace' in (app_name := new['attributes']['app_name']).lower(): # delay = timedelta(minutes=9, seconds=30) # self.log(f'Recasting Lovelace in {delay}') # self.run_in( # callback=lambda kwargs: self.media_entity.turn_off(), # delay=delay.total_seconds() # ) # self.run_in( # callback=self.cast_lovelace, # delay=delay.total_seconds() + 5 # ) # else: # self.log(f'Playing {app_name}') # def cast_lovelace(self, kwargs=None): # self.call_service( # 'cast/show_lovelace_view', # view_path='tv', # dashboard_path='lovelace', # entity_id=self.media_entity.entity_id, # ) def cancel_callbacks(self, entity=None, attribute=None, old=None, new=None, kwargs=None): if (callbacks := self.get_scheduler_entries().get(self.name)): for handle, info in callbacks.items(): self.cancel_timer(handle) self.log(f'Cancelled {handle}') def hardware_off_callback(self, entity=None, attribute=None, old=None, new=None, kwargs=None): self.log('Hardware turned off') self.media_entity.turn_off()