diff --git a/aircon/__main__.py b/aircon/__main__.py index f32f46e..cc6c39f 100644 --- a/aircon/__main__.py +++ b/aircon/__main__.py @@ -35,18 +35,20 @@ from .query_handlers import QueryHandlers -async def query_status_worker(devices: [Device]): +async def query_status_device(device: Device): _STATUS_UPDATE_INTERVAL = 600.0 _WAIT_FOR_EMPTY_QUEUE = 10.0 while True: # In case the AC is stuck, and not fetching commands, avoid flooding # the queue with status updates. - for device in devices: - while device.commands_queue.qsize() > 10: - await asyncio.sleep(_WAIT_FOR_EMPTY_QUEUE) - device.queue_status() + while device.commands_queue.qsize() > 10: + await asyncio.sleep(_WAIT_FOR_EMPTY_QUEUE) + device.queue_status() await asyncio.sleep(_STATUS_UPDATE_INTERVAL) +async def query_status_worker(devices: [Device]): + await asyncio.wait([*(query_status_device(device) + for device in devices)]) def ParseArguments() -> argparse.Namespace: """Parse command line arguments.""" diff --git a/aircon/mqtt_client.py b/aircon/mqtt_client.py index e29ec1d..3d63af8 100644 --- a/aircon/mqtt_client.py +++ b/aircon/mqtt_client.py @@ -69,4 +69,4 @@ def mqtt_publish_update(self, mac_address: str, property_name: str, value) -> No else: payload = str(value) self.publish(self._mqtt_topics['pub'].format(mac_address, property_name), - payload=payload.encode('utf-8')) + payload=payload.encode('utf-8'), retain=True) diff --git a/aircon/notifier.py b/aircon/notifier.py index 160f87e..718fc78 100644 --- a/aircon/notifier.py +++ b/aircon/notifier.py @@ -116,9 +116,10 @@ async def _perform_request(self, session: aiohttp.ClientSession, resp_data = await resp.text() logging.error(f'[KeepAlive] Sending local_reg failed: {resp.status}, {resp_data}') raise ConnectionError(f'Sending local_reg failed: {resp.status}, {resp_data}') - except aiohttp.client_exceptions.ClientConnectorError as e: + except (aiohttp.client_exceptions.ClientConnectorError, aiohttp.client_exceptions.ClientConnectionError) as e: + logging.error(f'Failed to connect to {config.device.ip_address}, maybe it is offline?') raise ConnectionError( - f'Failed to connect to {e.host}:{e.port}, maybe it is offline? Details: {e.os_error}.') + f'Failed to connect to {config.device.ip_address}, maybe it is offline?') config.last_timestamp = now config.device.available = True return queue_size