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.

Files changed (73) hide show
  1. qolsys_controller/controller.py +829 -20
  2. qolsys_controller/database/db.py +63 -25
  3. qolsys_controller/database/table.py +89 -60
  4. qolsys_controller/database/table_alarmedsensor.py +0 -2
  5. qolsys_controller/database/table_automation.py +0 -1
  6. qolsys_controller/database/table_country_locale.py +0 -1
  7. qolsys_controller/database/table_dashboard_msgs.py +1 -2
  8. qolsys_controller/database/table_dimmerlight.py +0 -1
  9. qolsys_controller/database/table_doorlock.py +1 -1
  10. qolsys_controller/database/table_eu_event.py +12 -4
  11. qolsys_controller/database/table_heat_map.py +0 -2
  12. qolsys_controller/database/table_history.py +4 -1
  13. qolsys_controller/database/table_iqremotesettings.py +0 -2
  14. qolsys_controller/database/table_iqrouter_network_config.py +0 -1
  15. qolsys_controller/database/table_iqrouter_user_device.py +0 -2
  16. qolsys_controller/database/table_master_slave.py +0 -1
  17. qolsys_controller/database/table_nest_device.py +0 -1
  18. qolsys_controller/database/table_output_rules.py +0 -1
  19. qolsys_controller/database/table_partition.py +0 -1
  20. qolsys_controller/database/table_pgm_outputs.py +0 -2
  21. qolsys_controller/database/table_powerg_device.py +25 -3
  22. qolsys_controller/database/table_qolsyssettings.py +0 -2
  23. qolsys_controller/database/table_scene.py +0 -2
  24. qolsys_controller/database/table_sensor.py +3 -2
  25. qolsys_controller/database/table_sensor_group.py +23 -0
  26. qolsys_controller/database/table_shades.py +0 -2
  27. qolsys_controller/database/table_smartsocket.py +0 -2
  28. qolsys_controller/database/table_state.py +0 -1
  29. qolsys_controller/database/table_tcc.py +0 -1
  30. qolsys_controller/database/table_thermostat.py +0 -1
  31. qolsys_controller/database/table_trouble_conditions.py +0 -2
  32. qolsys_controller/database/table_user.py +1 -2
  33. qolsys_controller/database/table_virtual_device.py +0 -2
  34. qolsys_controller/database/table_weather.py +0 -2
  35. qolsys_controller/database/table_zigbee_device.py +0 -1
  36. qolsys_controller/database/table_zwave_association_group.py +0 -1
  37. qolsys_controller/database/table_zwave_history.py +0 -1
  38. qolsys_controller/database/table_zwave_node.py +1 -1
  39. qolsys_controller/database/table_zwave_other.py +14 -2
  40. qolsys_controller/enum.py +44 -16
  41. qolsys_controller/enum_zwave.py +81 -36
  42. qolsys_controller/errors.py +9 -12
  43. qolsys_controller/mdns.py +7 -4
  44. qolsys_controller/mqtt_command.py +119 -0
  45. qolsys_controller/mqtt_command_queue.py +5 -4
  46. qolsys_controller/observable.py +2 -2
  47. qolsys_controller/panel.py +224 -143
  48. qolsys_controller/partition.py +129 -127
  49. qolsys_controller/pki.py +69 -97
  50. qolsys_controller/scene.py +30 -28
  51. qolsys_controller/settings.py +96 -50
  52. qolsys_controller/state.py +71 -33
  53. qolsys_controller/task_manager.py +8 -12
  54. qolsys_controller/users.py +25 -0
  55. qolsys_controller/utils_mqtt.py +8 -16
  56. qolsys_controller/weather.py +71 -0
  57. qolsys_controller/zone.py +307 -169
  58. qolsys_controller/zwave_device.py +108 -95
  59. qolsys_controller/zwave_dimmer.py +53 -50
  60. qolsys_controller/zwave_garagedoor.py +0 -1
  61. qolsys_controller/zwave_generic.py +2 -3
  62. qolsys_controller/zwave_lock.py +47 -44
  63. qolsys_controller/zwave_outlet.py +0 -1
  64. qolsys_controller/zwave_thermostat.py +112 -118
  65. qolsys_controller-0.0.62.dist-info/METADATA +89 -0
  66. qolsys_controller-0.0.62.dist-info/RECORD +69 -0
  67. {qolsys_controller-0.0.38.dist-info → qolsys_controller-0.0.62.dist-info}/WHEEL +1 -1
  68. qolsys_controller/plugin.py +0 -34
  69. qolsys_controller/plugin_c4.py +0 -17
  70. qolsys_controller/plugin_remote.py +0 -1298
  71. qolsys_controller-0.0.38.dist-info/METADATA +0 -93
  72. qolsys_controller-0.0.38.dist-info/RECORD +0 -68
  73. {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) -> None:
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]
@@ -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, **payload) -> None: # noqa: ANN003
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(self, **payload)
25
+ observer()
26
26
 
27
27
  def start_batch_update(self) -> None:
28
28
  self._batch_update_change_detected = False