qolsys-controller 0.0.38__py3-none-any.whl → 0.0.62__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of qolsys-controller might be problematic. Click here for more details.
- qolsys_controller/controller.py +829 -20
- qolsys_controller/database/db.py +63 -25
- qolsys_controller/database/table.py +89 -60
- qolsys_controller/database/table_alarmedsensor.py +0 -2
- qolsys_controller/database/table_automation.py +0 -1
- qolsys_controller/database/table_country_locale.py +0 -1
- qolsys_controller/database/table_dashboard_msgs.py +1 -2
- qolsys_controller/database/table_dimmerlight.py +0 -1
- qolsys_controller/database/table_doorlock.py +1 -1
- qolsys_controller/database/table_eu_event.py +12 -4
- qolsys_controller/database/table_heat_map.py +0 -2
- qolsys_controller/database/table_history.py +4 -1
- qolsys_controller/database/table_iqremotesettings.py +0 -2
- qolsys_controller/database/table_iqrouter_network_config.py +0 -1
- qolsys_controller/database/table_iqrouter_user_device.py +0 -2
- qolsys_controller/database/table_master_slave.py +0 -1
- qolsys_controller/database/table_nest_device.py +0 -1
- qolsys_controller/database/table_output_rules.py +0 -1
- qolsys_controller/database/table_partition.py +0 -1
- qolsys_controller/database/table_pgm_outputs.py +0 -2
- qolsys_controller/database/table_powerg_device.py +25 -3
- qolsys_controller/database/table_qolsyssettings.py +0 -2
- qolsys_controller/database/table_scene.py +0 -2
- qolsys_controller/database/table_sensor.py +3 -2
- qolsys_controller/database/table_sensor_group.py +23 -0
- qolsys_controller/database/table_shades.py +0 -2
- qolsys_controller/database/table_smartsocket.py +0 -2
- qolsys_controller/database/table_state.py +0 -1
- qolsys_controller/database/table_tcc.py +0 -1
- qolsys_controller/database/table_thermostat.py +0 -1
- qolsys_controller/database/table_trouble_conditions.py +0 -2
- qolsys_controller/database/table_user.py +1 -2
- qolsys_controller/database/table_virtual_device.py +0 -2
- qolsys_controller/database/table_weather.py +0 -2
- qolsys_controller/database/table_zigbee_device.py +0 -1
- qolsys_controller/database/table_zwave_association_group.py +0 -1
- qolsys_controller/database/table_zwave_history.py +0 -1
- qolsys_controller/database/table_zwave_node.py +1 -1
- qolsys_controller/database/table_zwave_other.py +14 -2
- qolsys_controller/enum.py +44 -16
- qolsys_controller/enum_zwave.py +81 -36
- qolsys_controller/errors.py +9 -12
- qolsys_controller/mdns.py +7 -4
- qolsys_controller/mqtt_command.py +119 -0
- qolsys_controller/mqtt_command_queue.py +5 -4
- qolsys_controller/observable.py +2 -2
- qolsys_controller/panel.py +224 -143
- qolsys_controller/partition.py +129 -127
- qolsys_controller/pki.py +69 -97
- qolsys_controller/scene.py +30 -28
- qolsys_controller/settings.py +96 -50
- qolsys_controller/state.py +71 -33
- qolsys_controller/task_manager.py +8 -12
- qolsys_controller/users.py +25 -0
- qolsys_controller/utils_mqtt.py +8 -16
- qolsys_controller/weather.py +71 -0
- qolsys_controller/zone.py +307 -169
- qolsys_controller/zwave_device.py +108 -95
- qolsys_controller/zwave_dimmer.py +53 -50
- qolsys_controller/zwave_garagedoor.py +0 -1
- qolsys_controller/zwave_generic.py +2 -3
- qolsys_controller/zwave_lock.py +47 -44
- qolsys_controller/zwave_outlet.py +0 -1
- qolsys_controller/zwave_thermostat.py +112 -118
- qolsys_controller-0.0.62.dist-info/METADATA +89 -0
- qolsys_controller-0.0.62.dist-info/RECORD +69 -0
- {qolsys_controller-0.0.38.dist-info → qolsys_controller-0.0.62.dist-info}/WHEEL +1 -1
- qolsys_controller/plugin.py +0 -34
- qolsys_controller/plugin_c4.py +0 -17
- qolsys_controller/plugin_remote.py +0 -1298
- qolsys_controller-0.0.38.dist-info/METADATA +0 -93
- qolsys_controller-0.0.38.dist-info/RECORD +0 -68
- {qolsys_controller-0.0.38.dist-info → qolsys_controller-0.0.62.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
import uuid
|
|
4
|
+
from typing import TYPE_CHECKING, Any
|
|
5
|
+
|
|
6
|
+
from .errors import QolsysMqttError
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
import aiomqtt
|
|
10
|
+
|
|
11
|
+
from .controller import QolsysController
|
|
12
|
+
|
|
13
|
+
LOGGER = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class MQTTCommand:
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
controller: "QolsysController",
|
|
20
|
+
eventName: str,
|
|
21
|
+
) -> None:
|
|
22
|
+
self._controller: QolsysController = controller
|
|
23
|
+
self._client: aiomqtt.Client | None = controller.aiomqtt
|
|
24
|
+
self._topic: str = "mastermeid"
|
|
25
|
+
self._eventName: str = eventName
|
|
26
|
+
self._payload: dict[str, Any] = {}
|
|
27
|
+
self._requestID = str(uuid.uuid4())
|
|
28
|
+
self._qos: int = self._controller.settings.mqtt_qos
|
|
29
|
+
self._responseTopic = "response_" + self._controller.settings.random_mac
|
|
30
|
+
|
|
31
|
+
self.append("requestID", self._requestID)
|
|
32
|
+
self.append("responseTopic", self._responseTopic)
|
|
33
|
+
self.append("eventName", self._eventName)
|
|
34
|
+
self.append("remoteMacAddress", self._controller.settings.random_mac)
|
|
35
|
+
|
|
36
|
+
def append(self, argument: str, value: str | dict[str, Any] | int | bool | list[dict[str, Any]] | Any) -> None:
|
|
37
|
+
self._payload[argument] = value
|
|
38
|
+
|
|
39
|
+
async def send_command(self) -> dict[str, Any]:
|
|
40
|
+
if self._client is None:
|
|
41
|
+
LOGGER.error("MQTT Client not configured")
|
|
42
|
+
raise QolsysMqttError
|
|
43
|
+
|
|
44
|
+
await self._client.publish(topic=self._topic, payload=json.dumps(self._payload), qos=self._qos)
|
|
45
|
+
return await self._controller.mqtt_command_queue.wait_for_response(self._requestID)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class MQTTCommand_IpcCall(MQTTCommand):
|
|
49
|
+
def __init__(
|
|
50
|
+
self,
|
|
51
|
+
controller: "QolsysController",
|
|
52
|
+
ipc_service_name: str,
|
|
53
|
+
ipc_interface_name: str,
|
|
54
|
+
ipc_transaction_id: int,
|
|
55
|
+
) -> None:
|
|
56
|
+
super().__init__(controller, "ipcCall")
|
|
57
|
+
self.append("ipcServiceName", ipc_service_name)
|
|
58
|
+
self.append("ipcInterfaceName", ipc_interface_name)
|
|
59
|
+
self.append("ipcTransactionID", ipc_transaction_id)
|
|
60
|
+
|
|
61
|
+
def append_ipc_request(self, ipc_request: list[dict[str, Any]]) -> None:
|
|
62
|
+
self.append("ipcRequest", ipc_request)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class MQTTCommand_Panel(MQTTCommand_IpcCall):
|
|
66
|
+
def __init__(
|
|
67
|
+
self,
|
|
68
|
+
controller: "QolsysController",
|
|
69
|
+
) -> None:
|
|
70
|
+
super().__init__(
|
|
71
|
+
controller=controller,
|
|
72
|
+
ipc_service_name="qinternalservice",
|
|
73
|
+
ipc_interface_name="android.os.IQInternalService",
|
|
74
|
+
ipc_transaction_id=7,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class MQTTCommand_ZWave(MQTTCommand_IpcCall):
|
|
79
|
+
def __init__(
|
|
80
|
+
self,
|
|
81
|
+
controller: "QolsysController",
|
|
82
|
+
node_id: str,
|
|
83
|
+
zwave_command: list[int],
|
|
84
|
+
) -> None:
|
|
85
|
+
super().__init__(
|
|
86
|
+
controller=controller,
|
|
87
|
+
ipc_service_name="qzwaveservice",
|
|
88
|
+
ipc_interface_name="android.os.IQZwaveService",
|
|
89
|
+
ipc_transaction_id=47,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
ipc_request: list[dict[str, Any]] = [
|
|
93
|
+
{
|
|
94
|
+
"dataType": "int",
|
|
95
|
+
"dataValue": int(node_id),
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"dataType": "int",
|
|
99
|
+
"dataValue": 0,
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"dataType": "byteArray",
|
|
103
|
+
"dataValue": zwave_command,
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"dataType": "int",
|
|
107
|
+
"dataValue": 0,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"dataType": "int",
|
|
111
|
+
"dataValue": 106,
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"dataType": "byteArray",
|
|
115
|
+
"dataValue": [0],
|
|
116
|
+
},
|
|
117
|
+
]
|
|
118
|
+
|
|
119
|
+
self.append_ipc_request(ipc_request)
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
+
from typing import Any
|
|
2
3
|
|
|
3
4
|
|
|
4
5
|
class QolsysMqttCommandQueue:
|
|
5
6
|
def __init__(self) -> None:
|
|
6
7
|
self.lock = asyncio.Lock()
|
|
7
|
-
self.waiters: dict[str, asyncio.Future] = {}
|
|
8
|
+
self.waiters: dict[str, asyncio.Future[Any]] = {}
|
|
8
9
|
|
|
9
|
-
async def handle_response(self, response: dict) -> None:
|
|
10
|
+
async def handle_response(self, response: dict[str, str]) -> None:
|
|
10
11
|
requestID = response.get("requestID")
|
|
11
12
|
|
|
12
13
|
if not requestID:
|
|
@@ -19,7 +20,7 @@ class QolsysMqttCommandQueue:
|
|
|
19
20
|
if future and not future.done():
|
|
20
21
|
future.set_result(response)
|
|
21
22
|
|
|
22
|
-
async def wait_for_response(self, request_id: str) ->
|
|
23
|
+
async def wait_for_response(self, request_id: str) -> dict[str, Any]:
|
|
23
24
|
if request_id in self.waiters:
|
|
24
25
|
msg = f"Duplicate waiter for request_id: {request_id}"
|
|
25
26
|
raise ValueError(msg)
|
|
@@ -28,4 +29,4 @@ class QolsysMqttCommandQueue:
|
|
|
28
29
|
async with self.lock:
|
|
29
30
|
self.waiters[request_id] = future
|
|
30
31
|
|
|
31
|
-
return await future
|
|
32
|
+
return await future # type: ignore[no-any-return]
|
qolsys_controller/observable.py
CHANGED
|
@@ -17,12 +17,12 @@ class QolsysObservable:
|
|
|
17
17
|
def unregister(self, observer: Callable[[], None]) -> None:
|
|
18
18
|
self._observers.remove(observer)
|
|
19
19
|
|
|
20
|
-
def notify(self
|
|
20
|
+
def notify(self) -> None:
|
|
21
21
|
if self._batch_update_active:
|
|
22
22
|
self._batch_update_change_detected = True
|
|
23
23
|
else:
|
|
24
24
|
for observer in self._observers:
|
|
25
|
-
observer(
|
|
25
|
+
observer()
|
|
26
26
|
|
|
27
27
|
def start_batch_update(self) -> None:
|
|
28
28
|
self._batch_update_change_detected = False
|