speaker control
This commit is contained in:
156
apps/speakers/speakers.py
Normal file
156
apps/speakers/speakers.py
Normal file
@@ -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'
|
||||||
|
]
|
||||||
|
)
|
||||||
30
apps/speakers/speakers.yaml
Normal file
30
apps/speakers/speakers.yaml
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user