qolsys-controller 0.0.23__tar.gz → 0.0.25__tar.gz

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 (78) hide show
  1. qolsys_controller-0.0.25/.github/workflows/pre-commit.yml +14 -0
  2. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/.github/workflows/publish.yml +1 -0
  3. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/PKG-INFO +1 -1
  4. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/pyproject.toml +3 -1
  5. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_dimmerlight.py +1 -1
  6. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_doorlock.py +1 -1
  7. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_qolsyssettings.py +1 -1
  8. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_sensor.py +1 -0
  9. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_weather.py +1 -1
  10. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_zwave_node.py +1 -1
  11. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/plugin_remote.py +86 -11
  12. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/scene.py +1 -1
  13. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/state.py +2 -2
  14. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/.github/workflows/build.yml +0 -0
  15. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/.gitignore +0 -0
  16. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/Info_mqtt.md +0 -0
  17. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/LICENSE +0 -0
  18. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/README.md +0 -0
  19. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/bin/qolsys.py +0 -0
  20. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/example.py +0 -0
  21. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/info_pairing.md +0 -0
  22. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/info_qolsys.md +0 -0
  23. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/__init__.py +0 -0
  24. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/controller.py +0 -0
  25. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/db.py +0 -0
  26. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table.py +0 -0
  27. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_alarmedsensor.py +0 -0
  28. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_automation.py +0 -0
  29. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_country_locale.py +0 -0
  30. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_dashboard_msgs.py +0 -0
  31. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_eu_event.py +0 -0
  32. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_heat_map.py +0 -0
  33. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_history.py +0 -0
  34. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_iqremotesettings.py +0 -0
  35. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_iqrouter_network_config.py +0 -0
  36. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_iqrouter_user_device.py +0 -0
  37. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_master_slave.py +0 -0
  38. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_nest_device.py +0 -0
  39. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_output_rules.py +0 -0
  40. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_partition.py +0 -0
  41. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_pgm_outputs.py +0 -0
  42. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_powerg_device.py +0 -0
  43. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_scene.py +0 -0
  44. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_shades.py +0 -0
  45. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_smartsocket.py +0 -0
  46. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_state.py +0 -0
  47. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_tcc.py +0 -0
  48. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_thermostat.py +0 -0
  49. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_trouble_conditions.py +0 -0
  50. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_user.py +0 -0
  51. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_virtual_device.py +0 -0
  52. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_zigbee_device.py +0 -0
  53. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_zwave_association_group.py +0 -0
  54. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_zwave_history.py +0 -0
  55. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/database/table_zwave_other.py +0 -0
  56. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/enum.py +0 -0
  57. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/enum_zwave.py +0 -0
  58. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/errors.py +0 -0
  59. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/mdns.py +0 -0
  60. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/mqtt_command_queue.py +0 -0
  61. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/observable.py +0 -0
  62. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/panel.py +0 -0
  63. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/partition.py +0 -0
  64. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/pki.py +0 -0
  65. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/plugin.py +0 -0
  66. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/plugin_c4.py +0 -0
  67. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/settings.py +0 -0
  68. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/task_manager.py +0 -0
  69. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/utils_mqtt.py +0 -0
  70. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/zone.py +0 -0
  71. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/zwave_device.py +0 -0
  72. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/zwave_dimmer.py +0 -0
  73. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/zwave_garagedoor.py +0 -0
  74. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/zwave_generic.py +0 -0
  75. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/zwave_lock.py +0 -0
  76. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/zwave_outlet.py +0 -0
  77. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/qolsys_controller/zwave_thermostat.py +0 -0
  78. {qolsys_controller-0.0.23 → qolsys_controller-0.0.25}/requirements.txt +0 -0
@@ -0,0 +1,14 @@
1
+ name: pre-commit
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+
8
+ jobs:
9
+ pre-commit:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v3
13
+ - uses: actions/setup-python@v3
14
+ - uses: pre-commit/action@v3.0.1
@@ -1,6 +1,7 @@
1
1
  name: Publish Python package to PyPI
2
2
 
3
3
  on:
4
+ workflow_dispatch:
4
5
  release:
5
6
  types: [published]
6
7
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qolsys-controller
3
- Version: 0.0.23
3
+ Version: 0.0.25
4
4
  Summary: A Python module that emulates a virtual IQ Remote device, enabling full local control of a Qolsys IQ Panel
5
5
  Project-URL: Homepage, https://github.com/EHylands/QolsysController
6
6
  Project-URL: Issues, https://github.com/EHylands/QolsysController/issues
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "qolsys-controller"
3
- version = "0.0.23"
3
+ version = "0.0.25"
4
4
  authors = [
5
5
  { name="Eric Hylands", email="" },
6
6
  ]
@@ -33,3 +33,5 @@ line-length = 88
33
33
  select = ['ALL']
34
34
  ignore = ["E501","S608","S311","S104","D100","D101", "D102","D107","ERA001", "FBT001","FBT002", "N802","N806","PERF401"]
35
35
 
36
+ [tool.ruff.lint.mccabe]
37
+ max-complexity = 25
@@ -12,7 +12,7 @@ class QolsysTableDimmerLight(QolsysTable):
12
12
  super().__init__(db, cursor)
13
13
  self._uri = "content://com.qolsys.qolsysprovider.DimmerLightsContentProvider/dimmerlight"
14
14
  self._table = "dimmerlight"
15
- self._abort_on_error = True
15
+ self._abort_on_error = False
16
16
  self._implemented = True
17
17
 
18
18
  self._columns = [
@@ -12,7 +12,7 @@ class QolsysTableDoorLock(QolsysTable):
12
12
  super().__init__(db, cursor)
13
13
  self._uri = "content://com.qolsys.qolsysprovider.DoorLocksContentProvider/doorlock"
14
14
  self._table = "doorlock"
15
- self._abort_on_error = True
15
+ self._abort_on_error = False
16
16
  self._implemented = True
17
17
 
18
18
  self._columns = [
@@ -12,7 +12,7 @@ class QolsysTableQolsysSettings(QolsysTable):
12
12
  super().__init__(db, cursor)
13
13
  self._uri = "content://com.qolsys.qolsysprovider.QolsysSettingsProvider/qolsyssettings"
14
14
  self._table = "qolsyssettings"
15
- self._abort_on_error = True
15
+ self._abort_on_error = False
16
16
  self._implemented = True
17
17
 
18
18
 
@@ -40,6 +40,7 @@ class QolsysTableSensor(QolsysTable):
40
40
  "zone_supervised",
41
41
  "zone_two_way_voice_enabled",
42
42
  "zone_reporting_enabled",
43
+ "zone_feature1",
43
44
  "battery_status",
44
45
  "created_date",
45
46
  "created_by",
@@ -12,7 +12,7 @@ class QolsysTableWeather(QolsysTable):
12
12
  super().__init__(db, cursor)
13
13
  self._uri = "content://com.qolsys.qolsysprovider.ForecastWeatherContentProvider/weather"
14
14
  self._table = "weather"
15
- self._abort_on_error = True
15
+ self._abort_on_error = False
16
16
  self._implemented = True
17
17
 
18
18
  self._columns = [
@@ -12,7 +12,7 @@ class QolsysTableZwaveNode(QolsysTable):
12
12
  super().__init__(db, cursor)
13
13
  self._uri = "content://com.qolsys.qolsysprovider.ZwaveContentProvider/zwave_node"
14
14
  self._table = "zwave_node"
15
- self._abort_on_error = True
15
+ self._abort_on_error = False
16
16
  self._implemented = True
17
17
 
18
18
  self._columns = [
@@ -1,4 +1,5 @@
1
1
  import asyncio
2
+ import base64
2
3
  import datetime
3
4
  import json
4
5
  import logging
@@ -192,7 +193,7 @@ class QolsysPluginRemote(QolsysPlugin):
192
193
 
193
194
  await self.aiomqtt.__aenter__()
194
195
 
195
- LOGGER.debug("MQTT: Client Connected")
196
+ LOGGER.info("MQTT: Client Connected")
196
197
 
197
198
  # Subscribe to panel internal databse updates
198
199
  await self.aiomqtt.subscribe("iq2meid")
@@ -200,10 +201,13 @@ class QolsysPluginRemote(QolsysPlugin):
200
201
  # Subscribte to MQTT commands response
201
202
  await self.aiomqtt.subscribe("response_" + self.settings.random_mac, qos=self.settings.mqtt_qos)
202
203
 
203
- # Only log mastermeid traffic for debug purposes
204
+ # Subscribe to Z-Wave response
205
+ await self.aiomqtt.subscribe("ZWAVE_RESPONSE", qos=self.settings.mqtt_qos)
206
+
207
+ # Only log all traffic for debug purposes
204
208
  if self.log_mqtt_mesages:
205
209
  # Subscribe to MQTT commands send to panel by other devices
206
- await self.aiomqtt.subscribe("mastermeid", qos=self.settings.mqtt_qos)
210
+ #await self.aiomqtt.subscribe("mastermeid", qos=self.settings.mqtt_qos)
207
211
 
208
212
  # Subscribe to all topics
209
213
  await self.aiomqtt.subscribe("#", qos=self.settings.mqtt_qos)
@@ -282,6 +286,14 @@ class QolsysPluginRemote(QolsysPlugin):
282
286
  data = json.loads(message.payload.decode())
283
287
  self.panel.parse_iq2meid_message(data)
284
288
 
289
+ # Panel Z-Wave response
290
+ if message.topic.matches("ZWAVE_RESPONSE"):
291
+ data = json.loads(message.payload.decode())
292
+ zwave = data.get("ZWAVE_RESPONSE","")
293
+ decoded_payload = base64.b64decode(zwave.get("ZWAVE_PAYLOAD","")).hex()
294
+ LOGGER.debug("Z-Wave Response: Node(%s) - Status(%s) - Payload(%s)",zwave.get("NODE_ID",""),zwave.get("ZWAVE_COMMAND_STATUS",""),decoded_payload)
295
+
296
+
285
297
  except aiomqtt.MqttError as err:
286
298
  self.connected = False
287
299
  self.connected_observer.notify()
@@ -851,6 +863,67 @@ class QolsysPluginRemote(QolsysPlugin):
851
863
 
852
864
  return True
853
865
 
866
+ async def command_zwave_doorlock_set(self, node_id: int, locked:bool) -> None:
867
+ LOGGER.debug("MQTT: Sending zwave_doorlock_set command: EXPERIMENTAL")
868
+ LOGGER.debug("MQTT: Sending zwave_doorlock_set command - Node(%s) - Locked(%s)",node_id,locked)
869
+
870
+ command = 68
871
+
872
+ # 0 unlocked
873
+ # 255 lockeck
874
+ lock_mode = 0
875
+ if locked:
876
+ lock_mode = 255
877
+
878
+ ipcRequest = [{
879
+ "dataType": "int",
880
+ "dataValue": node_id,
881
+ },
882
+ {
883
+ "dataType": "int",
884
+ "dataValue": 0,
885
+ },
886
+ {
887
+ "dataType": "byteArray",
888
+ "dataValue": [command,lock_mode],
889
+ },
890
+ {
891
+ "dataType": "int",
892
+ "dataValue": 0,
893
+ },
894
+ {
895
+ "dataType": "int",
896
+ "dataValue": 106,
897
+ },
898
+ {
899
+ "dataType": "byteArray",
900
+ "dataValue": [0],
901
+ },
902
+ ]
903
+
904
+ topic = "mastermeid"
905
+ eventName = "ipcCall"
906
+ ipcServiceName = "qzwaveservice"
907
+ ipcInterfaceName = "android.os.IQZwaveService"
908
+ ipcTransactionID = 47
909
+ requestID = str(uuid.uuid4())
910
+ remoteMacAddress = self.settings.random_mac
911
+ responseTopic = "response_" + self.settings.random_mac
912
+
913
+ payload = {
914
+ "eventName": eventName,
915
+ "ipcServiceName": ipcServiceName,
916
+ "ipcInterfaceName": ipcInterfaceName,
917
+ "ipcTransactionID": ipcTransactionID,
918
+ "ipcRequest": ipcRequest,
919
+ "requestID": requestID,
920
+ "responseTopic": responseTopic,
921
+ "remoteMacAddress": remoteMacAddress,
922
+ }
923
+
924
+ await self.send_command(topic, payload, requestID)
925
+ LOGGER.debug("MQTT: Receiving zwave_doorlock_set command")
926
+
854
927
  async def command_zwave_thermostat_setpoint_set(self, node_id: int, mode:ThermostatMode, setpoint:float) -> None:
855
928
  # Command 67
856
929
  LOGGER.debug("MQTT: Sending zwave_thermostat_setpoint_set command: EXPERIMENTAL")
@@ -941,14 +1014,16 @@ class QolsysPluginRemote(QolsysPlugin):
941
1014
  remoteMacAddress = self.settings.random_mac
942
1015
  responseTopic = "response_" + self.settings.random_mac
943
1016
 
944
- payload = {"eventName": eventName,
945
- "ipcServiceName": ipcServiceName,
946
- "ipcInterfaceName": ipcInterfaceName,
947
- "ipcTransactionID": ipcTransactionID,
948
- "ipcRequest": ipcRequest,
949
- "requestID": requestID,
950
- "responseTopic": responseTopic,
951
- "remoteMacAddress": remoteMacAddress}
1017
+ payload = {
1018
+ "eventName": eventName,
1019
+ "ipcServiceName": ipcServiceName,
1020
+ "ipcInterfaceName": ipcInterfaceName,
1021
+ "ipcTransactionID": ipcTransactionID,
1022
+ "ipcRequest": ipcRequest,
1023
+ "requestID": requestID,
1024
+ "responseTopic": responseTopic,
1025
+ "remoteMacAddress": remoteMacAddress
1026
+ }
952
1027
 
953
1028
  await self.send_command(topic, payload, requestID)
954
1029
  LOGGER.debug("MQTT: Receiving zwave_thermostat_mode_set command")
@@ -53,7 +53,7 @@ class QolsysScene(QolsysObservable):
53
53
  return self._color
54
54
 
55
55
  @name.setter
56
- def name(self, value: str) -> None:
56
+ def name(self, value: str) -> None:
57
57
  if self._name != value:
58
58
  self._name = value
59
59
  self.notify()
@@ -234,8 +234,8 @@ class QolsysState(QolsysObservable):
234
234
  break
235
235
 
236
236
  # zwave node_id has changed of node_type, delete and add again
237
- # self.zwave_delete(int(state_zwave.node_id)) # noqa: ERA001
238
- # self.zwave_add(db_zwave) # noqa: ERA001
237
+ # self.zwave_delete(int(state_zwave.node_id))
238
+ # self.zwave_add(db_zwave)
239
239
 
240
240
  # Add new zwave device
241
241
  for db_zwave in db_zwaves: