Changed automations to pyscript
This commit is contained in:
9
pyscript/config.yaml
Normal file
9
pyscript/config.yaml
Normal file
@@ -0,0 +1,9 @@
|
||||
apps:
|
||||
ir_remote_kitchenpi
|
||||
ir_remote_oben
|
||||
ir_remote_schlafzimmer
|
||||
herd
|
||||
knx_buttons
|
||||
licht_schlafzimmer
|
||||
licht_gang_bogen
|
||||
licht_wc
|
||||
14
pyscript/herd.py
Normal file
14
pyscript/herd.py
Normal file
@@ -0,0 +1,14 @@
|
||||
|
||||
|
||||
@state_trigger("switch.esszimmer_szene_4")
|
||||
def esszimmer_gangtuer_herd(value=None):
|
||||
entity_id = [f"switch.herd_phase_{i}" for i in range(1, 4)]
|
||||
if value == "on":
|
||||
switch.turn_on(entity_id=entity_id)
|
||||
elif value == "off":
|
||||
switch.turn_off(entity_id=entity_id)
|
||||
|
||||
|
||||
@state_trigger("float(sensor.herd_phase_1_verbrauch) + float(sensor.herd_phase_2_verbrauch) + float(sensor.herd_phase_3_verbrauch) < 100", state_hold=30 * 60)
|
||||
def herd_auto_aus():
|
||||
switch.esszimmer_szene_4.turn_off()
|
||||
33
pyscript/ir_remote_kitchenpi.py
Normal file
33
pyscript/ir_remote_kitchenpi.py
Normal file
@@ -0,0 +1,33 @@
|
||||
from ir_helpers import *
|
||||
|
||||
|
||||
@event_trigger("ir_command_received", "host == 'kitchenpi.fritz.box' and repeat_counter == 0")
|
||||
def ir_remote_kitchenpi(button_name=None, **kwargs):
|
||||
player = {'player': 'media_player.kitchenpi'}
|
||||
mapping = {
|
||||
**default_ir_light_control('group.living_area'),
|
||||
**default_ir_cover_control('group.living_area'),
|
||||
**default_ir_music_control(**player),
|
||||
'btn_1': playlist_f('Fast Jazz', shuffle=True, **player),
|
||||
'btn_2': playlist_f('Favorite Brass', shuffle=True, **player),
|
||||
'btn_3': playlist_f("Pop", shuffle=True, **player),
|
||||
|
||||
'btn_4': playlist_f('Bar Classics', **player),
|
||||
'btn_5': playlist_f('Sentimental Moods', **player),
|
||||
'btn_6': playlist_f(URLS['spotify_merkliste'], **player),
|
||||
|
||||
'btn_7': radio_f('BR24', **player),
|
||||
'btn_8': radio_f('BR-Klassik', **player),
|
||||
'btn_9': playlist_f(URLS['klassik_radio'], **player),
|
||||
|
||||
'btn_0': radio_f('Bayern 3', **player),
|
||||
'key_numeric_pound': radio_f('Bayern 2', **player),
|
||||
'key_numeric_star': radio_f('Antenne Bayern', **player),
|
||||
|
||||
'key_red': scene_f('wohnbereich_orange'),
|
||||
'key_green': scene_f('wohnbereich_grun'),
|
||||
'key_yellow': scene_f('wohnbereich_hell'),
|
||||
'key_blue': scene_f('wohnbereich_blau_grun'),
|
||||
}
|
||||
if button_name in mapping:
|
||||
mapping[button_name]()
|
||||
77
pyscript/ir_remote_oben.py
Normal file
77
pyscript/ir_remote_oben.py
Normal file
@@ -0,0 +1,77 @@
|
||||
from ir_helpers import *
|
||||
|
||||
light_counter = CyclicCounter(
|
||||
lambda v: light.lampe_ersterstock.turn_on(**v),
|
||||
[
|
||||
{'color_temp': 492},
|
||||
{'xy_color': [0.5794, 0.3752]},
|
||||
{'xy_color': [0.5535, 0.4104]},
|
||||
{'xy_color': [0.4662, 0.3252]},
|
||||
{'xy_color': [0.3423, 0.2252]},
|
||||
{'xy_color': [0.346, 0.394]},
|
||||
{'xy_color': [0.4119, 0.3671]},
|
||||
{'xy_color': [0.408, 0.517]},
|
||||
{'color_temp': 202},
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
def music_mapping(player):
|
||||
player = {'player': player}
|
||||
return {
|
||||
'btn_1': radio_f('Bayern 1', **player),
|
||||
'btn_2': radio_f('Bayern 2', **player),
|
||||
'btn_3': radio_f('BR Heimat', **player),
|
||||
'btn_4': radio_f('Bayern+', **player),
|
||||
'btn_5': radio_f('BR24', **player),
|
||||
'btn_6': radio_f('BR-Klassik', **player),
|
||||
'btn_7': playlist_f('Gesammelte Weihnachtslieder', **player),
|
||||
'btn_8': playlist_f('Harmonic Brass Christmas', **player),
|
||||
'btn_9': playlist_f('German Brass Christmas', **player),
|
||||
'key_numeric_star': playlist_f('Weihnachten mit den Wiener Sängerknaben', **player),
|
||||
'btn_0': playlist_f('Weihnachten mit den Wiener Sängerknaben', **player),
|
||||
'key_numeric_pound': playlist_f('SammlungGeorg', **player),
|
||||
}
|
||||
|
||||
|
||||
def light_mapping():
|
||||
return {
|
||||
'key_red': light_counter.next,
|
||||
'key_green': light_counter.prev,
|
||||
'key_blue': light.lampe_ersterstock.turn_off,
|
||||
'key_yellow': light.lampe_ersterstock.turn_off,
|
||||
'key_channelup': lambda: dimmer.dim(entity_id='light.lampe_ersterstock', offset=+30),
|
||||
'key_channeldown': lambda: dimmer.dim(entity_id='light.lampe_ersterstock', offset=-30),
|
||||
}
|
||||
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@event_trigger("ir_command_received", "host == 'esszimmerradio.fritz.box' and repeat_counter == 0")
|
||||
def ir_remote_esszimmer_oben(button_name=None, **kwargs):
|
||||
mapping = {
|
||||
**music_mapping('media_player.esszimmer'),
|
||||
**light_mapping(),
|
||||
}
|
||||
|
||||
buttons_to_switch_on = ['key_play', 'key_power'] + [f'btn_{i}' for i in range(10)]
|
||||
buttons_to_switch_off = ['key_goto', 'key_pause']
|
||||
if button_name in buttons_to_switch_on:
|
||||
switch.esszimmer_oben_radio_steckdose1.turn_on()
|
||||
elif button_name in buttons_to_switch_off:
|
||||
switch.esszimmer_oben_radio_steckdose1.turn_off()
|
||||
elif button_name == 'key_record':
|
||||
sysdweb.restart(service_name="squeezelite", hostname="esszimmerradio.fritz.box")
|
||||
|
||||
if button_name in mapping:
|
||||
mapping[button_name]()
|
||||
|
||||
|
||||
@event_trigger("ir_command_received", "host == 'musikserverWohnzimmerOben.fritz.box' and repeat_counter==0")
|
||||
def ir_remote_wohnzimmer_oben(button_name=None, **kwargs):
|
||||
mapping = {
|
||||
**music_mapping('media_player.wohnzimmer'),
|
||||
**light_mapping(),
|
||||
}
|
||||
if button_name in mapping:
|
||||
mapping[button_name]()
|
||||
66
pyscript/ir_remote_schlafzimmer.py
Normal file
66
pyscript/ir_remote_schlafzimmer.py
Normal file
@@ -0,0 +1,66 @@
|
||||
from ir_helpers import *
|
||||
|
||||
|
||||
@pyscript_compile
|
||||
def timed_sleep_f(content, light_off_mins, music_off_mins, shuffle):
|
||||
variables = {
|
||||
'media_content_id': content,
|
||||
'light_off_secs': light_off_mins * 60,
|
||||
'music_off_secs': music_off_mins * 60,
|
||||
'shuffle': shuffle,
|
||||
}
|
||||
|
||||
async def f():
|
||||
await hass.services.async_call('script', 'timed_sleep', variables)
|
||||
return f
|
||||
|
||||
|
||||
@event_trigger("ir_command_received", "host == 'bedroompi.fritz.box' and repeat_counter == 0")
|
||||
def ir_remote_schlafzimmer(button_name=None, **kwargs):
|
||||
p = {'player': 'media_player.bedroompi'}
|
||||
mapping = {
|
||||
**default_ir_light_control('group.bedroom'),
|
||||
**default_ir_cover_control('group.bedroom'),
|
||||
**default_ir_music_control(**p),
|
||||
'btn_1': playlist_f('Good Morning', **p),
|
||||
'btn_2': playlist_f('Good Night Long', **p),
|
||||
'btn_3': playlist_f('Good Night', **p),
|
||||
|
||||
'btn_4': playlist_f('Bar Classics', **p),
|
||||
'btn_5': playlist_f('Sentimental Moods', **p),
|
||||
'btn_6': playlist_f(URLS['spotify_merkliste'], **p),
|
||||
|
||||
'btn_7': radio_f('BR24', **p),
|
||||
'btn_8': radio_f('BR-Klassik', **p),
|
||||
'btn_9': playlist_f(URLS['klassik_radio'], **p),
|
||||
|
||||
'btn_0': radio_f('Bayern 3', **p),
|
||||
'key_numeric_pound': radio_f('Bayern 2', **p),
|
||||
'key_numeric_star': radio_f('Antenne Bayern', **player),
|
||||
|
||||
'key_red': scene_f('schlafzimmer_stillen'),
|
||||
'key_green': scene_f('schlafzimmer_orange'),
|
||||
'key_yellow': scene_f('schlafzimmer_ganz_hell'),
|
||||
'key_blue': scene_f('nachtswennallelieberschlafen'),
|
||||
|
||||
'key_tv': timed_sleep_f(URLS['spotify_rain'], light_off_mins=15, music_off_mins=45, shuffle=True),
|
||||
'key_video': timed_sleep_f('Good Night', light_off_mins=15, music_off_mins=45, shuffle=False),
|
||||
'key_music': timed_sleep_f(URLS['spotify_rain'], light_off_mins=5, music_off_mins=20, shuffle=True),
|
||||
'key_picture': timed_sleep_f('Good Night', light_off_mins=5, music_off_mins=20, shuffle=False)
|
||||
}
|
||||
if button_name in mapping:
|
||||
mapping[button_name]()
|
||||
elif button_name == "key_numeric_star": # Foen
|
||||
repeat_one_crossfade(**p)
|
||||
media_player.play_media(media_content_id='Foen', media_content_type='music', entity_id=p['player'])
|
||||
media_player.volume_set(volume_level=60, entity_id=p['player'])
|
||||
elif button_name == 'key_power': # Music & Lights off
|
||||
media_player.media_pause(entity_id=p['player'])
|
||||
light.turn_off(entity_id='group.bedroom')
|
||||
elif button_name == 'key_ok': # Grosser Rollo zu, kleiner halb zu
|
||||
cover.schlafzimmer_rollo_gross.close_cover()
|
||||
cover_half.set_half(entity_id="cover.schlafzimmer_rollo_klein")
|
||||
elif button_name == 'key_mute': # Alles aus ohne draussen & schlafzimmer
|
||||
light.turn_off(entity_id='group.all_downstairs_but_bedroom_and_outside')
|
||||
elif button_name == 'key_channel': # alles aus ausser schlafzimmer
|
||||
light.turn_off(entity_id='group.all_downstairs_but_bedroom')
|
||||
119
pyscript/knx_buttons.py
Normal file
119
pyscript/knx_buttons.py
Normal file
@@ -0,0 +1,119 @@
|
||||
@pyscript_compile
|
||||
def in_room(room):
|
||||
return f"entity_id.startswith('switch.{room}_szene_')"
|
||||
|
||||
|
||||
@event_trigger("short_click", in_room("eingang"))
|
||||
@event_trigger("long_click", in_room("eingang"))
|
||||
def eingang(entity_id=None, event_type=None):
|
||||
long_click = (event_type == "long_click")
|
||||
key = {'switch.eingang_szene_2': 'bulb_orange',
|
||||
'switch.eingang_szene_3': 'bulb_black',
|
||||
'switch.eingang_szene_4': 'key',
|
||||
'switch.eingang_szene_5': 'dog'}[entity_id]
|
||||
|
||||
if key == "bulb_orange":
|
||||
light.gang_licht.turn_on()
|
||||
light.gang_einganglicht.turn_on()
|
||||
if long_click:
|
||||
scene.wohnbereich_hell.turn_on()
|
||||
elif key == "bulb_black":
|
||||
if long_click:
|
||||
light.turn_off(entity_id="group.all_downstairs")
|
||||
else:
|
||||
light.turn_off(entity_id="group.all_downstairs_but_outside")
|
||||
|
||||
|
||||
@event_trigger("short_click", in_room("esszimmer"))
|
||||
@event_trigger("long_click", in_room("esszimmer"))
|
||||
def esszimmer_gangtuer(entity_id=None, event_type=None):
|
||||
key = {'switch.esszimmer_szene_0': 'arrow_down',
|
||||
'switch.esszimmer_szene_1': 'arrow_up',
|
||||
'switch.esszimmer_szene_2': 'bulb_orange',
|
||||
'switch.esszimmer_szene_3': 'bulb_yellow',
|
||||
'switch.esszimmer_szene_4': 'cooking_pot', # Herd an/aus in separater Datei
|
||||
'switch.esszimmer_szene_5': 'bulb_black'}[entity_id]
|
||||
long_click = (event_type == "long_click")
|
||||
|
||||
if long_click:
|
||||
covers = ['cover.kuche_fenster_rollo', 'cover.esszimmer_fenster_rollo']
|
||||
else:
|
||||
covers = ['group.living_area']
|
||||
|
||||
if key == "arrow_down":
|
||||
cover_half.set_half(entity_id=covers)
|
||||
elif key == "arrow_up":
|
||||
cover.open_cover(entity_id=covers)
|
||||
elif key == "bulb_orange":
|
||||
if long_click:
|
||||
scene.kuche_essbereich_orange.turn_on()
|
||||
else:
|
||||
scene.wohnbereich_orange.turn_on()
|
||||
elif key == "bulb_yellow":
|
||||
if long_click:
|
||||
scene.kuche_essbereich_hell.turn_on()
|
||||
else:
|
||||
scene.wohnbereich_hell.turn_on()
|
||||
elif key == "bulb_black":
|
||||
if long_click:
|
||||
light.essbereich_lichter.turn_off()
|
||||
else:
|
||||
light.turn_off(entity_id="group.living_area")
|
||||
|
||||
|
||||
@event_trigger("short_click", in_room("wohnzimmer"))
|
||||
@event_trigger("long_click", in_room("wohnzimmer"))
|
||||
def wohnzimmer_gangtur(entity_id=None, event_type=None):
|
||||
long_click = (event_type == "long_click")
|
||||
key = {'switch.wohnzimmer_szene_0': 'arrow_down',
|
||||
'switch.wohnzimmer_szene_1': 'arrow_up',
|
||||
'switch.wohnzimmer_szene_2': 'bulb_orange',
|
||||
'switch.wohnzimmer_szene_3': 'bulb_yellow',
|
||||
'switch.wohnzimmer_szene_4': 'bulb_blue',
|
||||
'switch.wohnzimmer_szene_5': 'bulb_black'}[entity_id]
|
||||
|
||||
if long_click:
|
||||
covers = ['cover.wohnzimmer_fenster_rollo', 'cover.wohnzimmer_terrassentur_rollo']
|
||||
else:
|
||||
covers = ['group.living_area']
|
||||
|
||||
if key == "arrow_down":
|
||||
cover_half.set_half(entity_id=covers)
|
||||
elif key == "arrow_up":
|
||||
cover.open_cover(entity_id=covers)
|
||||
elif key == "bulb_orange":
|
||||
if long_click:
|
||||
scene.wohnzimmer_orange.turn_on()
|
||||
else:
|
||||
scene.wohnbereich_orange.turn_on()
|
||||
elif key == "bulb_yellow":
|
||||
if long_click:
|
||||
scene.wohnzimmer_hell.turn_on()
|
||||
else:
|
||||
scene.wohnbereich_hell.turn_on()
|
||||
elif key == "bulb_blue":
|
||||
if long_click:
|
||||
scene.wohnzimmer_dunkel.turn_on()
|
||||
else:
|
||||
scene.wohnbereich_blau_grun.turn_on()
|
||||
elif key == "bulb_black":
|
||||
if long_click:
|
||||
light.wohnzimmer_lichter.turn_off()
|
||||
else:
|
||||
light.turn_off(entity_id="group.living_area")
|
||||
|
||||
|
||||
@event_trigger("short_click", in_room("wohnzimmer_terrassentur"))
|
||||
@event_trigger("long_click", in_room("wohnzimmer_terrassentur"))
|
||||
def wohnzimmer_terassentuer(entity_id=None, event_type=None):
|
||||
long_click = (event_type == "long_click")
|
||||
key = {'switch.wohnzimmer_terrassentur_szene_2': 'teddy',
|
||||
'switch.wohnzimmer_terrassentur_szene_3': 'flowers'}[entity_id]
|
||||
if key == "teddy":
|
||||
if long_click:
|
||||
scene.wohnbereich_kuscheln.turn_on()
|
||||
elif key == "flowers":
|
||||
if long_click:
|
||||
light.turn_off(entity_id="light.garten_lichter")
|
||||
else:
|
||||
scene.garten_savanna.turn_on()
|
||||
0
pyscript/licht_gang_bogen.py
Normal file
0
pyscript/licht_gang_bogen.py
Normal file
11
pyscript/licht_schlafzimmer.py
Normal file
11
pyscript/licht_schlafzimmer.py
Normal file
@@ -0,0 +1,11 @@
|
||||
|
||||
@event_trigger("homematic.keypress", "name == 'schlafzimmer_deckenlampe'")
|
||||
def schlafzimmer_licht(channel=None, param=None):
|
||||
up = (channel == 1)
|
||||
long = (param == "PRESS_LONG")
|
||||
|
||||
# TODO
|
||||
# oben: kurz: orange szene
|
||||
# lang: helle szene
|
||||
# unten: kurz: off, but 1 min bedlight
|
||||
# lang: rollos zu
|
||||
4
pyscript/licht_wc.py
Normal file
4
pyscript/licht_wc.py
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
@state_trigger("switch.wc_licht_taster == 'on'")
|
||||
def wc_licht():
|
||||
switch.wc_licht.toggle()
|
||||
126
pyscript/modules/ir_helpers.py
Normal file
126
pyscript/modules/ir_helpers.py
Normal file
@@ -0,0 +1,126 @@
|
||||
# ---------------------------------- Music ---------------------------------------------
|
||||
|
||||
URLS = {
|
||||
'klassik_radio': "http://opml.radiotime.com/Tune.ashx?id=s25028&formats=aac,ogg,mp3",
|
||||
'spotify_rain': "spotify:playlist:37i9dQZF1DXbcPC6Vvqudd",
|
||||
'spotify_merkliste': "spotify:playlist:43wCckw3P4WKdy06Rd7eYO",
|
||||
}
|
||||
|
||||
|
||||
async def media_player_s(service_name, entity_id, **kwargs):
|
||||
await hass.services.async_call('media_player', service_name, {'entity_id': entity_id, **kwargs})
|
||||
|
||||
|
||||
async def media_player_f(service_name, entity_id, **kwargs):
|
||||
async def f():
|
||||
hass.services.async_call('media_player', service_name, {'entity_id': entity_id, **kwargs})
|
||||
return f
|
||||
|
||||
|
||||
async def default_music_settings(player, shuffle=False):
|
||||
await media_player_s('shuffle_set', player, shuffle=shuffle)
|
||||
await media_player_s('squeezebox_call_method', player, command="playlist repeat 0")
|
||||
await media_player_s('squeezebox_call_method', player, command="playerpref transitionType 0")
|
||||
|
||||
|
||||
async def repeat_one_crossfade(player):
|
||||
await media_player_s('repeat_set', player, repeat='one')
|
||||
await media_player_s('squeezebox_call_method', player, command='playerpref transitionType 1')
|
||||
|
||||
|
||||
def playlist_f(name, player, shuffle=False):
|
||||
async def f():
|
||||
await default_music_settings(player, shuffle=shuffle)
|
||||
await media_player_s('play_media', player, media_content_id=name, media_content_type='music')
|
||||
return f
|
||||
|
||||
|
||||
def radio_f(name, player):
|
||||
async def f():
|
||||
await media_player_s('play_media', player, media_content_id=name, media_content_type='channel')
|
||||
return f
|
||||
|
||||
|
||||
def scene_f(name):
|
||||
async def f():
|
||||
await hass.services.async_call('scene', 'turn_on', {'entity_id': 'scene.' + name})
|
||||
return f
|
||||
|
||||
|
||||
def cover_f(name, entity_id, **kwargs):
|
||||
async def f():
|
||||
await hass.services.async_call('cover', name, {'entity_id': entity_id, **kwargs})
|
||||
return f
|
||||
|
||||
|
||||
def cover_half_f(entity_id):
|
||||
async def f():
|
||||
await hass.services.async_call('cover_half', 'set_half', {'entity_id': entity_id})
|
||||
return f
|
||||
|
||||
|
||||
def light_f(name, entity_id, **kwargs):
|
||||
async def f():
|
||||
await hass.services.async_call('light', name, {'entity_id': entity_id, **kwargs})
|
||||
return f
|
||||
|
||||
|
||||
def default_ir_music_control(player):
|
||||
return {
|
||||
'key_play': media_player_f("media_play_pause", player),
|
||||
'key_pause': media_player_f("turn_off", player),
|
||||
|
||||
'key_forward': media_player_f('media_next_track', player),
|
||||
'key_fastforward': media_player_f('media_next_track', player),
|
||||
'key_previous': media_player_f('media_previous_track', player),
|
||||
'key_rewind': media_player_f('media_previous_track', player),
|
||||
|
||||
'key_volumeup': media_player_f('volume_up', player),
|
||||
'key_volumedown': media_player_f('volume_down', player),
|
||||
|
||||
'key_menu': media_player_f('shuffle_set', player, shuffle=True),
|
||||
'key_exit': media_player_f('shuffle_set', player, shuffle=False),
|
||||
}
|
||||
|
||||
# ---------------------------------- Covers --------------------------------------------
|
||||
|
||||
|
||||
def default_ir_cover_control(device_group):
|
||||
return {
|
||||
'key_up': cover_f('open_cover', device_group),
|
||||
'key_down': cover_f('close_cover', device_group),
|
||||
'key_left': cover_half_f(device_group),
|
||||
'key_right': cover_half_f(device_group),
|
||||
}
|
||||
|
||||
|
||||
# ---------------------------------- Lights ---------------------------------------------
|
||||
|
||||
def default_ir_light_control(device_group):
|
||||
def dim_offset_f(offset):
|
||||
async def f():
|
||||
await hass.services.async_call('dimmer', 'dim', {'entity_id': device_group, 'offset': offset})
|
||||
return f
|
||||
|
||||
return {
|
||||
'key_channelup': dim_offset_f(+30),
|
||||
'key_channeldown': dim_offset_f(-30),
|
||||
'key_menu': dim_offset_f(130),
|
||||
'key_stop': dim_offset_f(-130),
|
||||
'key_goto': light_f('turn_off', device_group)
|
||||
}
|
||||
|
||||
|
||||
class CyclicCounter:
|
||||
def __init__(self, func, values):
|
||||
self.idx = 0
|
||||
self.values = values
|
||||
self.func = func
|
||||
|
||||
def next(self):
|
||||
self.idx = (self.idx + 1) % len(self.values)
|
||||
self.func(self.values[self.idx])
|
||||
|
||||
def prev(self):
|
||||
self.idx = (self.idx - 1) % len(self.values)
|
||||
self.func(self.values[self.idx])
|
||||
Reference in New Issue
Block a user