new custom component: long press

This commit is contained in:
Martin Bauer 2020-04-26 15:27:53 +02:00
parent f8f0b7a938
commit c9c9c35561
2 changed files with 71 additions and 0 deletions

View File

@ -99,6 +99,19 @@ notify:
dimmer:
cover_half:
long_click:
duration: 1.0
switches:
- switch.esszimmer_szene_0
- switch.esszimmer_szene_1
- switch.esszimmer_szene_2
- switch.esszimmer_szene_3
- switch.esszimmer_szene_4
- switch.esszimmer_szene_5
- switch.eingang_szene_2
- switch.eingang_szene_3
- switch.eingang_szene_4
- switch.eingang_szene_5
logger:
default: info

View File

@ -0,0 +1,58 @@
import logging
import voluptuous as vol
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.event import async_track_state_change, async_call_later
from collections import namedtuple, defaultdict
import time
from functools import partial
_LOGGER = logging.getLogger(__name__)
CONF_DURATION = "duration"
CONF_SWITCHES = "switches"
DOMAIN = 'long_click'
CONFIG_SCHEMA = vol.Schema({
DOMAIN: vol.Schema({
vol.Optional(CONF_DURATION, default=1.0): float,
vol.Required(CONF_SWITCHES): cv.entity_ids}
)
}, extra=vol.ALLOW_EXTRA)
ButtonInfo = namedtuple('ButtonInfo', ['cancel', 'last_on_time'])
switch_on_times = defaultdict(ButtonInfo)
def on_rising_edge(entity_id, from_state, to_state, hass, long_click_time):
async def long_press_cb(t):
hass.bus.fire('long_click', {'entity_id': entity_id})
duration = time.time() - switch_on_times[entity_id].last_on_time
assert duration >= long_click_time
del switch_on_times[entity_id]
cancel_func = async_call_later(hass, long_click_time, long_press_cb)
switch_on_times[entity_id] = ButtonInfo(cancel_func, time.time())
def on_falling_edge(entity_id, from_state, to_state, hass, long_click_time):
if entity_id in switch_on_times:
# cancel callback
switch_on_times[entity_id].cancel()
duration = time.time() - switch_on_times[entity_id].last_on_time
# in case the callback didn't fire yet, even if longer than one second
if duration < long_click_time:
hass.bus.fire('short_click', {'entity_id': entity_id})
else:
hass.bus.fire('long_click', {'entity_id': entity_id})
print("-------------------- long on falling edge", entity_id, duration)
del switch_on_times[entity_id]
async def async_setup(hass, config):
duration = config[DOMAIN][CONF_DURATION]
async_track_state_change(hass, config[DOMAIN][CONF_SWITCHES],
partial(on_rising_edge, hass=hass, long_click_time=duration), 'off', 'on')
async_track_state_change(hass, config[DOMAIN][CONF_SWITCHES],
partial(on_falling_edge, hass=hass, long_click_time=duration), 'on', 'off')
return True