1 """Support for Qwikswitch devices."""
3 from __future__
import annotations
7 from pyqwikswitch.async_
import QSUsb
8 from pyqwikswitch.qwikswitch
import CMD_BUTTONS, QS_CMD, QS_ID, SENSORS, QSType
9 import voluptuous
as vol
16 EVENT_HOMEASSISTANT_START,
17 EVENT_HOMEASSISTANT_STOP,
27 _LOGGER = logging.getLogger(__name__)
31 CONF_DIMMER_ADJUST =
"dimmer_adjust"
32 CONF_BUTTON_EVENTS =
"button_events"
33 CV_DIM_VALUE = vol.All(vol.Coerce(float), vol.Range(min=1, max=3))
36 CONFIG_SCHEMA = vol.Schema(
40 vol.Required(CONF_URL, default=
"http://127.0.0.1:2020"): vol.Coerce(
43 vol.Optional(CONF_DIMMER_ADJUST, default=1): CV_DIM_VALUE,
44 vol.Optional(CONF_BUTTON_EVENTS, default=[]): cv.ensure_list_csv,
45 vol.Optional(CONF_SENSORS, default=[]): vol.All(
50 vol.Required(
"id"): str,
51 vol.Optional(
"channel", default=1): int,
52 vol.Required(
"name"): str,
53 vol.Required(
"type"): str,
54 vol.Optional(
"class"): DEVICE_CLASSES_SCHEMA,
55 vol.Optional(
"invert"): bool,
60 vol.Optional(CONF_SWITCHES, default=[]): vol.All(cv.ensure_list, [str]),
64 extra=vol.ALLOW_EXTRA,
68 async
def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
69 """Qwiskswitch component setup."""
73 cmd_buttons = set(CMD_BUTTONS)
74 for btn
in config[DOMAIN][CONF_BUTTON_EVENTS]:
77 url = config[DOMAIN][CONF_URL]
78 dimmer_adjust = config[DOMAIN][CONF_DIMMER_ADJUST]
79 sensors = config[DOMAIN][CONF_SENSORS]
80 switches = config[DOMAIN][CONF_SWITCHES]
82 def callback_value_changed(_qsd, qsid, _val):
83 """Update entity values based on device change."""
84 _LOGGER.debug(
"Dispatch %s (update from devices)", qsid)
90 dim_adj=dimmer_adjust,
92 callback_value_changed=callback_value_changed,
96 if not await qsusb.update_from_devices():
99 hass.data[DOMAIN] = qsusb
101 comps: dict[Platform, list] = {
105 Platform.BINARY_SENSOR: [],
111 _, _type = SENSORS[sens[
"type"]]
112 sensor_ids.append(sens[
"id"])
114 comps[Platform.BINARY_SENSOR].append(sens)
116 comps[Platform.SENSOR].append(sens)
117 for _key
in (
"invert",
"class"):
120 "%s should only be used for binary_sensors: %s", _key, sens
124 "Sensor validation failed for sensor id=%s type=%s",
129 for qsid, dev
in qsusb.devices.items():
131 if dev.qstype != QSType.relay:
132 _LOGGER.warning(
"You specified a switch that is not a relay %s", qsid)
134 comps[Platform.SWITCH].append(qsid)
135 elif dev.qstype
in (QSType.relay, QSType.dimmer):
136 comps[Platform.LIGHT].append(qsid)
138 _LOGGER.warning(
"Ignored unknown QSUSB device: %s", dev)
142 for comp_name, comp_conf
in comps.items():
144 load_platform(hass, comp_name, DOMAIN, {DOMAIN: comp_conf}, config)
146 def callback_qs_listen(qspacket):
147 """Typically a button press or update signal."""
149 if QS_ID
in qspacket:
150 if qspacket.get(QS_CMD,
"")
in cmd_buttons:
151 hass.bus.async_fire(f
"qwikswitch.button.{qspacket[QS_ID]}", qspacket)
154 if qspacket[QS_ID]
in sensor_ids:
155 _LOGGER.debug(
"Dispatch %s ((%s))", qspacket[QS_ID], qspacket)
159 hass.async_create_task(qsusb.update_from_devices())
163 """Start listening."""
164 qsusb.listen(callback_qs_listen)
166 hass.bus.async_listen_once(EVENT_HOMEASSISTANT_START, async_start)
170 """Stop the listener."""
171 hass.data[DOMAIN].stop()
173 hass.bus.async_listen(EVENT_HOMEASSISTANT_STOP, async_stop)
None async_stop(HomeAssistant hass)
None async_start(HomeAssistant hass, str discovery_topic, ConfigEntry config_entry)
bool async_setup(HomeAssistant hass, ConfigType config)
aiohttp.ClientSession async_get_clientsession(HomeAssistant hass, bool verify_ssl=True, socket.AddressFamily family=socket.AF_UNSPEC, ssl_util.SSLCipherList ssl_cipher=ssl_util.SSLCipherList.PYTHON_DEFAULT)
None load_platform(core.HomeAssistant hass, Platform|str component, str platform, DiscoveryInfoType|None discovered, ConfigType hass_config)
None async_dispatcher_send(HomeAssistant hass, str signal, *Any args)