87 lines
2.7 KiB
Python
87 lines
2.7 KiB
Python
import appdaemon.plugins.hass.hassapi as hass
|
|
import globals
|
|
|
|
class LightButton(hass.Hass):
|
|
def initialize(self):
|
|
if not globals.check_args(self,['entities', 'sensor']):
|
|
return
|
|
|
|
self.listen_event_handle_list = []
|
|
self.listen_event_handle_list.append(self.listen_event(self.event_detected, "xiaomi_aqara.click"))
|
|
|
|
def event_detected(self, event_name, data, kwargs):
|
|
if data["entity_id"] != self.args["sensor"]:
|
|
return
|
|
if data["click_type"] == "single":
|
|
self.log('button_click')
|
|
self.make_action_by_mode("off")
|
|
if data["click_type"] == "double":
|
|
self.log('button_dblclick')
|
|
self.make_action_by_mode("on")
|
|
|
|
def make_action_by_mode(self, state):
|
|
states = self.fill_states()
|
|
control_entity = self.args.get('control_input', None)
|
|
if (control_entity != None):
|
|
entity_id = next(iter(states))
|
|
state = self.get_state(entity_id)
|
|
self.set_state(entity_id, self.invert_state(state))
|
|
self.set_state(control_entity, state)
|
|
return
|
|
|
|
if len(self.args["entities"]) > 1:
|
|
self.toggle_next_with_state(state, states)
|
|
|
|
def toggle_next_with_state(self, state, states):
|
|
for entity_id in states:
|
|
entity_state = states[entity_id]
|
|
if (entity_state == state):
|
|
self.set_state(entity_id, self.invert_state(state))
|
|
self.log('toggling {}'.format(entity_id))
|
|
return
|
|
|
|
for entity_id in states:
|
|
self.log('toggling {}'.format(entity_id))
|
|
self.toggle(entity_id)
|
|
|
|
def set_state(self, entity_id, state):
|
|
if (state == "off"):
|
|
self.log('turn_off {}'.format(entity_id))
|
|
self.set_off(entity_id)
|
|
if (state == "on"):
|
|
self.log('turn_on {}'.format(entity_id))
|
|
self.set_on(entity_id)
|
|
|
|
def set_on(self, entity_id):
|
|
if entity_id.startswith("light"):
|
|
self.call_service("light/turn_on", entity_id = entity_id, transition = 1, brightness = 255)
|
|
else:
|
|
self.turn_on(entity_id)
|
|
|
|
def set_off(self, entity_id):
|
|
if entity_id.startswith("light"):
|
|
self.call_service("light/turn_off", entity_id = entity_id, transition = 1)
|
|
else:
|
|
self.turn_off(entity_id)
|
|
|
|
|
|
def invert_state(self, state):
|
|
if (state == "off"):
|
|
return "on"
|
|
return "off"
|
|
|
|
def fill_states(self):
|
|
states = {}
|
|
for entity_id in self.split_device_list(self.args["entities"]):
|
|
state = self.get_state(entity_id)
|
|
if (state == None):
|
|
self.log("Warning! Device {} not found (state: {}).".format(entity_id, state))
|
|
continue
|
|
states[entity_id] = state
|
|
return states
|
|
|
|
def terminate(self):
|
|
if self.listen_event_handle_list != None:
|
|
for listen_event_handle in self.listen_event_handle_list:
|
|
self.cancel_listen_event(listen_event_handle)
|