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
@@ -1,5 +1,8 @@
1
+ from __future__ import annotations
2
+
1
3
  import json
2
4
  import logging
5
+ from typing import TYPE_CHECKING, Any
3
6
 
4
7
  from .database.db import QolsysDB
5
8
  from .enum import (
@@ -10,10 +13,9 @@ from .enum import (
10
13
  from .observable import QolsysObservable
11
14
  from .partition import QolsysPartition
12
15
  from .scene import QolsysScene
13
- from .settings import QolsysSettings
14
- from .state import QolsysState
16
+ from .users import QolsysUser
17
+ from .weather import QolsysForecast, QolsysWeather
15
18
  from .zone import QolsysZone
16
- from .zwave_device import QolsysZWaveDevice
17
19
  from .zwave_dimmer import QolsysDimmer
18
20
  from .zwave_generic import QolsysGeneric
19
21
  from .zwave_lock import QolsysLock
@@ -21,12 +23,14 @@ from .zwave_thermostat import QolsysThermostat
21
23
 
22
24
  LOGGER = logging.getLogger(__name__)
23
25
 
26
+ if TYPE_CHECKING:
27
+ from .controller import QolsysController
28
+ from .zwave_device import QolsysZWaveDevice
24
29
 
25
- class QolsysPanel(QolsysObservable):
26
- def __init__(self, settings: QolsysSettings, state: QolsysState) -> None:
27
30
 
28
- self._state = state
29
- self._settings = settings
31
+ class QolsysPanel(QolsysObservable):
32
+ def __init__(self, controller: QolsysController) -> None:
33
+ self._controller = controller
30
34
  self._db = QolsysDB()
31
35
 
32
36
  # Partition settings
@@ -36,73 +40,108 @@ class QolsysPanel(QolsysObservable):
36
40
  # Panel settings
37
41
  self.settings_panel_observer = QolsysObservable()
38
42
  self.settings_panel = [
39
- "PANEL_TAMPER_STATE", "AC_STATUS", "BATTERY_STATUS", "FAIL_TO_COMMUNICATE", "SECURE_ARMING", "AUTO_BYPASS",
40
- "AUTO_STAY", "AUTO_ARM_STAY", "AUTO_EXIT_EXTENSION", "FINAL_EXIT_DOOR_ARMING", "NO_ARM_LOW_BATTERY",
41
- "TEMPFORMAT", "LANGUAGE", "COUNTRY", "SYSTEM_TIME", "GSM_CONNECTION_STATUS", "GSM_SIGNAL_STRENGTH",
42
- "ANDROID_VERSION", "HARDWARE_VERSION", "TIMER_NORMAL_ENTRY_DELAY", "TIMER_NORMAL_EXIT_DELAY",
43
- "TIMER_LONG_ENTRY_DELAY", "TIMER_LONG_EXIT_DELAY", "ZWAVE_CONTROLLER", "ZWAVE_CARD", "POLICE_PANIC_ENABLED",
44
- "FIRE_PANIC_ENABLED", "AUXILIARY_PANIC_ENABLED", "NIGHTMODE_SETTINGS", "NIGHT_SETTINGS_STATE", "PARTITIONS",
45
- "SIX_DIGIT_USER_CODE", "SHOW_SECURITY_SENSORS", "SYSTEM_LOGGED_IN_USER", "PANEL_SCENES_SETTING", "CONTROL_4",
46
- "ZWAVE_FIRM_WARE_VERSION", "FINAL_EXIT_DOOR_ARMING", "NO_ARM_LOW_BATTERY", "MAC_ADDRESS",
43
+ "PANEL_TAMPER_STATE",
44
+ "AC_STATUS",
45
+ "BATTERY_STATUS",
46
+ "FAIL_TO_COMMUNICATE",
47
+ "SECURE_ARMING",
48
+ "AUTO_BYPASS",
49
+ "AUTO_STAY",
50
+ "AUTO_ARM_STAY",
51
+ "AUTO_EXIT_EXTENSION",
52
+ "FINAL_EXIT_DOOR_ARMING",
53
+ "NO_ARM_LOW_BATTERY",
54
+ "TEMPFORMAT",
55
+ "LANGUAGE",
56
+ "COUNTRY",
57
+ "SYSTEM_TIME",
58
+ "GSM_CONNECTION_STATUS",
59
+ "GSM_SIGNAL_STRENGTH",
60
+ "ANDROID_VERSION",
61
+ "HARDWARE_VERSION",
62
+ "TIMER_NORMAL_ENTRY_DELAY",
63
+ "TIMER_NORMAL_EXIT_DELAY",
64
+ "TIMER_LONG_ENTRY_DELAY",
65
+ "TIMER_LONG_EXIT_DELAY",
66
+ "ZWAVE_CONTROLLER",
67
+ "ZWAVE_CARD",
68
+ "POLICE_PANIC_ENABLED",
69
+ "FIRE_PANIC_ENABLED",
70
+ "AUXILIARY_PANIC_ENABLED",
71
+ "NIGHTMODE_SETTINGS",
72
+ "NIGHT_SETTINGS_STATE",
73
+ "PARTITIONS",
74
+ "SIX_DIGIT_USER_CODE",
75
+ "SHOW_SECURITY_SENSORS",
76
+ "SYSTEM_LOGGED_IN_USER",
77
+ "PANEL_SCENES_SETTING",
78
+ "CONTROL_4",
79
+ "ZWAVE_FIRM_WARE_VERSION",
80
+ "FINAL_EXIT_DOOR_ARMING",
81
+ "NO_ARM_LOW_BATTERY",
82
+ "MAC_ADDRESS",
47
83
  "LAST_UPDATE_IQ_REMOTE_PATCH_CKECKSUM_N",
48
84
  ]
49
85
 
50
- self._PANEL_TAMPER_STATE = ""
51
- self._AC_STATUS = ""
52
- self._BATTERY_STATUS = ""
53
- self._FAIL_TO_COMMUNICATE = ""
54
- self._SECURE_ARMING = ""
55
- self._AUTO_BYPASS = ""
56
- self._AUTO_STAY = ""
57
- self._AUTO_ARM_STAY = ""
58
- self._AUTO_EXIT_EXTENSION = ""
59
- self._FINAL_EXIT_DOOR_ARMING = ""
60
- self._NO_ARM_LOW_BATTERY = ""
61
- self._TEMPFORMAT = ""
62
- self._LANGUAGE = ""
63
- self._COUNTRY = ""
64
- self._SYSTEM_TIME = ""
65
- self._GSM_CONNECTION_STATUS = ""
66
- self._GSM_SIGNAL_STRENGTH = ""
67
- self._ANDROID_VERSION = ""
68
- self._HARDWARE_VERSION = ""
69
- self._TIMER_NORMAL_ENTRY_DELAY = ""
70
- self._TIMER_NORMAL_EXIT_DELAY = ""
71
- self._TIMER_LONG_ENTRY_DELAY = ""
72
- self._TIMER_LONG_EXIT_DELAY = ""
73
- self._ZWAVE_FIRM_WARE_VERSION = ""
74
- self._ZWAVE_CONTROLLER = ""
75
- self._ZWAVE_CARD = ""
76
- self._POLICE_PANIC_ENABLED = ""
77
- self._FIRE_PANIC_ENABLED = ""
78
- self._AUXILIARY_PANIC_ENABfLED = ""
79
- self._NIGHTMODE_SETTINGS = ""
80
- self._NIGHT_SETTINGS_STATE = ""
81
- self._PARTITIONS = ""
82
- self._SIX_DIGIT_USER_CODE = ""
83
- self._SHOW_SECURITY_SENSORS = ""
84
- self._CONTROL_4 = ""
85
- self._MAC_ADDRESS = ""
86
- self._SYSTEM_LOGGED_IN_USER = ""
87
- self._PANEL_SCENES_SETTING = ""
88
- self._LAST_UPDATE_IQ_REMOTE_PATCH_CKECKSUM_N = ""
89
-
90
- self._users = []
91
- self._unique_id = ""
92
-
93
- self._imei = ""
94
- self._product_type = ""
86
+ self._PANEL_TAMPER_STATE: str = ""
87
+ self._AC_STATUS: str = ""
88
+ self._BATTERY_STATUS: str = ""
89
+ self._FAIL_TO_COMMUNICATE: str = ""
90
+ self._SECURE_ARMING: str = ""
91
+ self._AUTO_BYPASS: str = ""
92
+ self._AUTO_STAY: str = ""
93
+ self._AUTO_ARM_STAY: str = ""
94
+ self._AUTO_EXIT_EXTENSION: str = ""
95
+ self._FINAL_EXIT_DOOR_ARMING: str = ""
96
+ self._NO_ARM_LOW_BATTERY: str = ""
97
+ self._TEMPFORMAT: str = ""
98
+ self._LANGUAGE: str = ""
99
+ self._COUNTRY: str = ""
100
+ self._SYSTEM_TIME: str = ""
101
+ self._GSM_CONNECTION_STATUS: str = ""
102
+ self._GSM_SIGNAL_STRENGTH: str = ""
103
+ self._ANDROID_VERSION: str = ""
104
+ self._HARDWARE_VERSION: str = ""
105
+ self._TIMER_NORMAL_ENTRY_DELAY: str = ""
106
+ self._TIMER_NORMAL_EXIT_DELAY: str = ""
107
+ self._TIMER_LONG_ENTRY_DELAY: str = ""
108
+ self._TIMER_LONG_EXIT_DELAY: str = ""
109
+ self._ZWAVE_FIRM_WARE_VERSION: str = ""
110
+ self._ZWAVE_CONTROLLER: str = ""
111
+ self._ZWAVE_CARD: str = ""
112
+ self._POLICE_PANIC_ENABLED: str = ""
113
+ self._FIRE_PANIC_ENABLED: str = ""
114
+ self._AUXILIARY_PANIC_ENABfLED: str = ""
115
+ self._NIGHTMODE_SETTINGS: str = ""
116
+ self._NIGHT_SETTINGS_STATE: str = ""
117
+ self._PARTITIONS: str = ""
118
+ self._SIX_DIGIT_USER_CODE: str = ""
119
+ self._SHOW_SECURITY_SENSORS: str = ""
120
+ self._CONTROL_4: str = ""
121
+ self._MAC_ADDRESS: str = ""
122
+ self._SYSTEM_LOGGED_IN_USER: str = ""
123
+ self._PANEL_SCENES_SETTING: str = ""
124
+ self._LAST_UPDATE_IQ_REMOTE_PATCH_CKECKSUM_N: str = ""
125
+
126
+ self._users: list[QolsysUser] = []
127
+ self._unique_id: str = ""
128
+
129
+ self._imei: str = ""
130
+ self._product_type: str = ""
95
131
 
96
132
  def read_users_file(self) -> bool:
97
133
  # Loading user_code data from users.conf file if exists
98
- if self._settings.users_file_path.is_file():
134
+ if self._controller.settings.users_file_path.is_file():
99
135
  try:
100
- path = self._settings.users_file_path
136
+ path = self._controller.settings.users_file_path
101
137
  with path.open("r", encoding="utf-8") as file:
102
138
  try:
103
139
  users = json.load(file)
104
140
  for user in users:
105
- self._users.append(user)
141
+ qolsys_user = QolsysUser()
142
+ qolsys_user.id = user.get("id")
143
+ qolsys_user.user_code = user.get("user_code")
144
+ self._users.append(qolsys_user)
106
145
 
107
146
  except json.JSONDecodeError:
108
147
  LOGGER.exception("users.conf file json error")
@@ -342,22 +381,21 @@ class QolsysPanel(QolsysObservable):
342
381
  self._PANEL_SCENES_SETTING = self.db.get_setting_panel("PANEL_SCENES_SETTING")
343
382
  return self.PANEL_SCENES_SETTING
344
383
 
345
- def load_database(self, database: dict) -> None:
384
+ def load_database(self, database: list[dict[str, Any]]) -> None:
346
385
  self.db.load_db(database)
347
- self._state.sync_partitions_data(self.get_partitions_from_db())
348
- self._state.sync_zones_data(self.get_zones_from_db())
349
- self._state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
350
- self._state.sync_scenes_data(self.get_scenes_from_db())
386
+ self._controller.state.sync_partitions_data(self.get_partitions_from_db())
387
+ self._controller.state.sync_zones_data(self.get_zones_from_db())
388
+ self._controller.state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
389
+ self._controller.state.sync_scenes_data(self.get_scenes_from_db())
390
+ self._controller.state.sync_weather_data(self.get_weather_from_db())
351
391
 
352
392
  # Parse panel update to database
353
- def parse_iq2meid_message(self, data: dict) -> bool: # noqa: C901, PLR0912, PLR0915
354
-
393
+ def parse_iq2meid_message(self, data: dict[str, Any]) -> None: # noqa: C901, PLR0912, PLR0915
355
394
  eventName = data.get("eventName")
356
- dbOperation = data.get("dbOperation","")
395
+ dbOperation = data.get("dbOperation", "")
357
396
  uri = data.get("uri")
358
397
 
359
398
  match eventName:
360
-
361
399
  case "stopScreenCapture":
362
400
  pass
363
401
 
@@ -365,16 +403,13 @@ class QolsysPanel(QolsysObservable):
365
403
  LOGGER.info("Main Panel Disconnect")
366
404
 
367
405
  case "dbChanged":
368
-
369
406
  match dbOperation:
370
-
371
407
  case "update":
372
- content_values = data.get("contentValues")
408
+ content_values = data.get("contentValues", "")
373
409
  selection = data.get("selection")
374
410
  selection_argument = data.get("selectionArgs")
375
411
 
376
412
  match uri:
377
-
378
413
  # Update Settings Content Provider
379
414
  case self.db.table_qolsyssettings.uri:
380
415
  name = content_values.get("name", "")
@@ -390,7 +425,7 @@ class QolsysPanel(QolsysObservable):
390
425
  # Update Partition setting - Send notification if setting has changed
391
426
  if name in self.settings_partition:
392
427
  partition_id = content_values.get("partition_id", "")
393
- partition = self._state.partition(partition_id)
428
+ partition = self._controller.state.partition(partition_id)
394
429
  if partition is not None:
395
430
  match name:
396
431
  case "SYSTEM_STATUS":
@@ -406,7 +441,7 @@ class QolsysPanel(QolsysObservable):
406
441
  case self.db.table_sensor.uri:
407
442
  self.db.table_sensor.update(selection, selection_argument, content_values)
408
443
  zoneid = content_values.get("zoneid", "")
409
- zone = self._state.zone(zoneid)
444
+ zone = self._controller.state.zone(zone_id=zoneid)
410
445
  if zone is not None:
411
446
  zone.update(content_values)
412
447
 
@@ -418,7 +453,7 @@ class QolsysPanel(QolsysObservable):
418
453
  self.db.table_state.update(selection, selection_argument, content_values)
419
454
 
420
455
  if name in self.state_partition:
421
- partition = self._state.partition(partition_id)
456
+ partition = self._controller.state.partition(partition_id)
422
457
  if partition is not None:
423
458
  match name:
424
459
  case "ALARM_STATE":
@@ -427,36 +462,32 @@ class QolsysPanel(QolsysObservable):
427
462
  # Update heat_map
428
463
  case self.db.table_heat_map.uri:
429
464
  self.db.table_heat_map.update(selection, selection_argument, content_values)
430
- # No action needed
431
465
 
432
466
  # Update master_slave
433
467
  case self.db.table_master_slave.uri:
434
468
  self.db.table_master_slave.update(selection, selection_argument, content_values)
435
- # No action needed
436
469
 
437
470
  # Update dashboard_msgs
438
471
  case self.db.table_dashboard_msgs.uri:
439
472
  self.db.table_dashboard_msgs.update(selection, selection_argument, content_values)
440
- # No action needed
441
473
 
442
474
  # Update PartitionContentProvider
443
475
  case self.db.table_partition.uri:
444
476
  self.db.table_partition.update(selection, selection_argument, content_values)
445
477
  partition_id = content_values.get("partition_id", "")
446
- partition = self._state.partition(partition_id)
478
+ partition = self._controller.state.partition(partition_id)
447
479
  if partition is not None:
448
480
  partition.update_partition(content_values)
449
481
 
450
482
  # Update History Content Provider
451
483
  case self.db.table_history.uri:
452
484
  self.db.table_history.update(selection, selection_argument, content_values)
453
- # No action needed
454
485
 
455
486
  # Update DimmerLightsContentProvider
456
487
  case self.db.table_dimmer.uri:
457
488
  self.db.table_dimmer.update(selection, selection_argument, content_values)
458
489
  node_id = content_values.get("node_id", "")
459
- node = self._state.zwave_device(node_id)
490
+ node = self._controller.state.zwave_device(node_id)
460
491
  if node is not None and isinstance(node, QolsysDimmer):
461
492
  node.update_dimmer(content_values)
462
493
 
@@ -464,7 +495,7 @@ class QolsysPanel(QolsysObservable):
464
495
  case self.db.table_thermostat.uri:
465
496
  self.db.table_thermostat.update(selection, selection_argument, content_values)
466
497
  node_id = content_values.get("node_id", "")
467
- node = self._state.zwave_device(node_id)
498
+ node = self._controller.state.zwave_device(node_id)
468
499
  if node is not None and isinstance(node, QolsysThermostat):
469
500
  node.update_thermostat(content_values)
470
501
 
@@ -472,7 +503,7 @@ class QolsysPanel(QolsysObservable):
472
503
  case self.db.table_doorlock.uri:
473
504
  self.db.table_doorlock.update(selection, selection_argument, content_values)
474
505
  node_id = content_values.get("node_id", "")
475
- node = self._state.zwave_device(node_id)
506
+ node = self._controller.state.zwave_device(node_id)
476
507
  if node is not None and isinstance(node, QolsysLock):
477
508
  node.update_lock(content_values)
478
509
 
@@ -480,19 +511,17 @@ class QolsysPanel(QolsysObservable):
480
511
  case self.db.table_zwave_node.uri:
481
512
  self.db.table_zwave_node.update(selection, selection_argument, content_values)
482
513
  node_id = content_values.get("node_id", "")
483
- node = self._state.zwave_device(node_id)
514
+ node = self._controller.state.zwave_device(node_id)
484
515
  if node is not None:
485
516
  node.update_base(content_values)
486
517
 
487
518
  # Update Z-Wave History Content Provier
488
519
  case self.db.table_zwave_history.uri:
489
520
  self.db.table_zwave_history.update(selection, selection_argument, content_values)
490
- # No action needed
491
521
 
492
522
  # Update AutomationDeviceContentProvider
493
523
  case self.db.table_automation.uri:
494
524
  self.db.table_automation.update(selection, selection_argument, content_values)
495
- # No action needed
496
525
 
497
526
  # Update Alarmed Sensor Content Provider
498
527
  case self.db.table_alarmedsensor.uri:
@@ -501,21 +530,39 @@ class QolsysPanel(QolsysObservable):
501
530
  # Update IQ Remote Settings Content Provider
502
531
  case self.db.table_iqremotesettings.uri:
503
532
  self.db.table_iqremotesettings.update(selection, selection_argument, content_values)
504
- # No action needed
505
533
 
506
534
  # Update Scene Content Provider
507
535
  case self.db.table_scene.uri:
508
536
  self.db.table_scene.update(selection, selection_argument, content_values)
509
537
  scene_id = content_values.get("scene_id", "")
510
- scene = self._state.scene(scene_id)
511
- if scene is not None and isinstance(node, QolsysScene):
538
+ scene = self._controller.state.scene(scene_id)
539
+ if scene is not None and isinstance(scene, QolsysScene):
512
540
  scene.update(content_values)
513
541
 
514
542
  # Update Trouble Conditions
515
- case self.db.table_trouble_conditions:
516
- self.db.table_trouble_conditions.update(selection,selection_argument,content_values)
517
- # No action needed
543
+ case self.db.table_trouble_conditions.uri:
544
+ self.db.table_trouble_conditions.update(selection, selection_argument, content_values)
545
+
546
+ # Update EU_EVENT:
547
+ case self.db.table_eu_event.uri:
548
+ self.db.table_eu_event.update(selection, selection_argument, content_values)
549
+
550
+ # Update PowerG Device
551
+ case self.db.table_powerg_device.uri:
552
+ self.db.table_powerg_device.update(selection, selection_argument, content_values)
553
+ short_id = content_values.get("shortID", "")
554
+ zone = self._controller.state.zone_from_short_id(short_id)
555
+ if zone is not None:
556
+ zone.update_powerg(content_values)
557
+
558
+ # Update Weather
559
+ case self.db.table_weather.uri:
560
+ self.db.table_weather.update(selection, selection_argument, content_values)
561
+ self._controller.state.sync_weather_data(self.get_weather_from_db())
518
562
 
563
+ # Update Zwave Association Group
564
+ case self.db.table_zwave_association_goup.uri:
565
+ self.db.table_zwave_association_goup.update(selection, selection_argument, content_values)
519
566
 
520
567
  case _:
521
568
  LOGGER.debug("iq2meid updating unknow uri:%s", uri)
@@ -526,81 +573,82 @@ class QolsysPanel(QolsysObservable):
526
573
  selection_argument = data.get("selectionArgs")
527
574
 
528
575
  match uri:
529
-
530
576
  case self.db.table_sensor.uri:
531
577
  self.db.table_sensor.delete(selection, selection_argument)
532
- self._state.sync_zones_data(self.get_zones_from_db())
533
- # Notify delete zone
578
+ self._controller.state.sync_zones_data(self.get_zones_from_db())
534
579
 
535
580
  case self.db.table_iqremotesettings.uri:
536
581
  self.db.table_iqremotesettings.delete(selection, selection_argument)
537
- # No action needed
538
582
 
539
583
  case self.db.table_state.uri:
540
584
  self.db.table_state.delete(selection, selection_argument)
541
- # No action needed
542
585
 
543
586
  case self.db.table_master_slave.uri:
544
587
  self.db.table_master_slave.delete(selection, selection_argument)
545
- # No action needed
546
588
 
547
589
  case self.db.table_qolsyssettings.uri:
548
590
  self.db.table_qolsyssettings.delete(selection, selection_argument)
549
- # No action needed
550
591
 
551
592
  case self.db.table_alarmedsensor.uri:
552
593
  self.db.table_alarmedsensor.delete(selection, selection_argument)
553
- self._state.sync_partitions_data(self.get_partitions_from_db())
594
+ self._controller.state.sync_partitions_data(self.get_partitions_from_db())
554
595
 
555
596
  case self.db.table_history.uri:
556
597
  self.db.table_history.delete(selection, selection_argument)
557
- # No action needed
558
598
 
559
599
  case self.db.table_zwave_history.uri:
560
600
  self.db.table_zwave_history.delete(selection, selection_argument)
561
- # No action needed
562
601
 
563
602
  case self.db.table_doorlock.uri:
564
603
  self.db.table_doorlock.delete(selection, selection_argument)
565
- self._state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
604
+ self._controller.state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
566
605
 
567
606
  case self.db.table_dimmer.uri:
568
607
  self.db.table_dimmer.delete(selection, selection_argument)
569
- self._state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
608
+ self._controller.state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
570
609
 
571
610
  case self.db.table_thermostat.uri:
572
611
  self.db.table_thermostat.delete(selection, selection_argument)
573
- self._state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
612
+ self._controller.state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
574
613
 
575
614
  case self.db.table_zwave_node.uri:
576
615
  self.db.table_zwave_node.delete(selection, selection_argument)
577
- self._state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
616
+ self._controller.state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
578
617
 
579
618
  case self.db.table_automation.uri:
580
619
  self.db.table_automation.delete(selection, selection_argument)
581
- # No action needed
582
620
 
583
621
  case self.db.table_partition.uri:
584
622
  self.db.table_partition.delete(selection, selection_argument)
585
- self._state.sync_partitions_data(self.get_partitions_from_db())
623
+ self._controller.state.sync_partitions_data(self.get_partitions_from_db())
586
624
 
587
625
  case self.db.table_user.uri:
588
626
  self.db.table_user.delete(selection, selection_argument)
589
- # No action needed
590
627
 
591
628
  case self.db.table_dashboard_msgs.uri:
592
629
  self.db.table_dashboard_msgs.delete(selection, selection_argument)
593
- # No action needed
630
+
631
+ case self.db.table_eu_event.uri:
632
+ self.db.table_eu_event.delete(selection, selection_argument)
633
+
634
+ case self.db.table_powerg_device.uri:
635
+ self.db.table_powerg_device.delete(selection, selection_argument)
636
+
637
+ case self.db.table_weather.uri:
638
+ self.db.table_weather.delete(selection, selection_argument)
639
+ self._controller.state.sync_weather_data(self.get_weather_from_db())
640
+
641
+ case self.db.table_zwave_association_goup.uri:
642
+ self.db.table_zwave_association_goup.delete(selection, selection_argument)
594
643
 
595
644
  case _:
596
645
  LOGGER.debug("iq2meid deleting unknown uri:%s", uri)
597
646
  LOGGER.debug(data)
598
647
 
599
648
  case "insert":
600
- content_values = data.get("contentValues")
649
+ content_values = data.get("contentValues", {})
601
650
 
602
651
  match uri:
603
-
604
652
  # Inser State Content Provider
605
653
  case self.db.table_state.uri:
606
654
  self.db.table_state.insert(data=content_values)
@@ -609,16 +657,16 @@ class QolsysPanel(QolsysObservable):
609
657
  new_value = content_values.get("value", "")
610
658
  if name in self.state_partition:
611
659
  partition_id = content_values.get("partition_id", "")
612
- partition = self._state.partition(partition_id)
660
+ partition = self._controller.state.partition(partition_id)
613
661
  if partition is not None:
614
662
  match name:
615
663
  case "ALARM_STATE":
616
664
  partition.alarm_state = PartitionAlarmState(new_value)
617
665
 
618
666
  # Inser Partition Content Provider
619
- case self.db.table_partition:
667
+ case self.db.table_partition.uri:
620
668
  self.db.table_partition.insert(data=content_values)
621
- self._state.sync_partitions_data(self.get_partitions_from_db())
669
+ self._controller.state.sync_partitions_data(self.get_partitions_from_db())
622
670
 
623
671
  # Insert Settings Content Provider
624
672
  case self.db.table_qolsyssettings.uri:
@@ -629,7 +677,7 @@ class QolsysPanel(QolsysObservable):
629
677
  new_value = content_values.get("value", "")
630
678
  if name in self.settings_partition:
631
679
  partition_id = content_values.get("partition_id", "")
632
- partition = self._state.partition(partition_id)
680
+ partition = self._controller.state.partition(partition_id)
633
681
  if partition is not None:
634
682
  match name:
635
683
  case "SYSTEM_STATUS":
@@ -659,62 +707,72 @@ class QolsysPanel(QolsysObservable):
659
707
  # Sensor Content Provider
660
708
  case self.db.table_sensor.uri:
661
709
  self.db.table_sensor.insert(data=content_values)
662
- self._state.sync_zones_data(self.get_zones_from_db())
710
+ self._controller.state.sync_zones_data(self.get_zones_from_db())
663
711
 
664
712
  # Door Lock Content Provider
665
713
  case self.db.table_doorlock.uri:
666
714
  self.db.table_doorlock.insert(data=content_values)
667
- self._state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
715
+ self._controller.state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
668
716
 
669
717
  # Dimmer Content Provider
670
718
  case self.db.table_dimmer.uri:
671
719
  self.db.table_dimmer.insert(data=content_values)
672
- self._state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
720
+ self._controller.state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
673
721
 
674
722
  # Thermostat Content Provider
675
723
  case self.db.table_thermostat.uri:
676
724
  self.db.table_thermostat.insert(data=content_values)
677
- self._state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
725
+ self._controller.state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
678
726
 
679
727
  # ZWave Node Content Provider
680
728
  case self.db.table_zwave_node.uri:
681
729
  self.db.table_zwave_node.insert(data=content_values)
682
- self._state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
730
+ self._controller.state.sync_zwave_devices_data(self.get_zwave_devices_from_db())
683
731
 
684
732
  # HistoryContentProvider
685
733
  case self.db.table_history.uri:
686
734
  self.db.table_history.insert(data=content_values)
687
- # No action needed
688
735
 
689
736
  # AlarmedSensorProvider
690
737
  case self.db.table_alarmedsensor.uri:
691
-
692
738
  partition_id = content_values.get("partition_id", "")
693
739
  self.db.table_alarmedsensor.insert(data=content_values)
694
740
 
695
- partition = self._state.partition(partition_id)
741
+ partition = self._controller.state.partition(partition_id)
696
742
  if partition is not None:
697
743
  partition.append_alarm_type([PartitionAlarmType(content_values.get("sgroup", ""))])
698
744
 
699
745
  # IQRemoteSettingsProvider
700
746
  case self.db.table_iqremotesettings.uri:
701
747
  self.db.table_iqremotesettings.insert(data=content_values)
702
- # No action needed
703
748
 
704
749
  # HeatMapContentProvider
705
750
  case self.db.table_heat_map.uri:
706
751
  self.db.table_heat_map.insert(data=content_values)
707
- # No action needed
708
752
 
709
753
  # ZDeviceHistoryContentProvider
710
754
  case self.db.table_zwave_history.uri:
711
755
  self.db.table_zwave_history.insert(data=content_values)
712
- # No action needed
713
756
 
714
757
  # Dashboard Message Content Provider
715
758
  case self.db.table_dashboard_msgs.uri:
716
759
  self.db.table_dashboard_msgs.insert(data=content_values)
717
- # No action needed
760
+
761
+ # EU_EVENT
762
+ case self.db.table_eu_event.uri:
763
+ self.db.table_eu_event.insert(data=content_values)
764
+
765
+ # PowerG Device
766
+ case self.db.table_powerg_device.uri:
767
+ self.db.table_powerg_device.insert(data=content_values)
768
+
769
+ # Weather
770
+ case self.db.table_weather.uri:
771
+ self.db.table_weather.insert(data=content_values)
772
+ self._controller.state.sync_weather_data(self.get_weather_from_db())
773
+
774
+ case self.db.table_zwave_association_goup.uri:
775
+ self.db.table_zwave_association_goup.insert(data=content_values)
718
776
 
719
777
  case _:
720
778
  LOGGER.debug("iq2meid inserting unknow uri:%s", uri)
@@ -729,21 +787,20 @@ class QolsysPanel(QolsysObservable):
729
787
 
730
788
  def check_user(self, user_code: str) -> int:
731
789
  for user in self._users:
732
- if user["user_code"] == user_code:
733
- return user["id"]
790
+ if user.user_code == user_code:
791
+ return user.id
734
792
 
735
793
  # No valid user code found
736
794
  return -1
737
795
 
738
796
  def get_zwave_devices_from_db(self) -> list[QolsysZWaveDevice]:
739
- devices = []
797
+ devices: list[QolsysZWaveDevice] = []
740
798
  devices_list = self.db.get_zwave_devices()
741
799
  dimmers_list = self.db.get_dimmers()
742
800
  thermostats_list = self.db.get_thermostats()
743
801
  locks_list = self.db.get_locks()
744
802
 
745
803
  for device in devices_list:
746
-
747
804
  device_added = False
748
805
 
749
806
  zwave_node_id = device.get("node_id", "")
@@ -793,7 +850,7 @@ class QolsysPanel(QolsysObservable):
793
850
 
794
851
  def get_scenes_from_db(self) -> list[QolsysScene]:
795
852
  scenes = []
796
- scenes_list: list[dict] = self.db.get_scenes()
853
+ scenes_list: list[dict[str, str]] = self.db.get_scenes()
797
854
 
798
855
  # Create scenes array
799
856
  for scene_info in scenes_list:
@@ -801,24 +858,44 @@ class QolsysPanel(QolsysObservable):
801
858
 
802
859
  return scenes
803
860
 
861
+ def get_weather_from_db(self) -> QolsysWeather:
862
+ weather = QolsysWeather()
863
+ forecast_dic_list: list[dict[str, str]] = self.db.get_weather()
864
+
865
+ forecast_obj_list = []
866
+ for forecast in forecast_dic_list:
867
+ forecast_obj_list.append(QolsysForecast(forecast))
868
+
869
+ # Create weather array
870
+ weather.update(forecast_obj_list)
871
+
872
+ return weather
873
+
804
874
  def get_zones_from_db(self) -> list[QolsysZone]:
805
875
  zones = []
806
- zones_list: list[dict] = self.db.get_zones()
876
+ zones_list: list[dict[str, str]] = self.db.get_zones()
807
877
 
808
878
  # Create sensors array
809
879
  for zone_info in zones_list:
810
- zones.append(QolsysZone(zone_info,self._settings))
880
+ new_zone = QolsysZone(zone_info, self._controller.settings)
881
+
882
+ if new_zone.current_capability == "POWERG":
883
+ LOGGER.debug("Loading PowerG device info for zone %s", new_zone.zone_id)
884
+ powerg_dict = self.db.get_powerg(short_id=new_zone.shortID)
885
+ LOGGER.debug("PowerG device info: %s", powerg_dict)
886
+ if powerg_dict is not None:
887
+ new_zone.update_powerg(powerg_dict)
888
+
889
+ zones.append(new_zone)
811
890
 
812
891
  return zones
813
892
 
814
893
  def get_partitions_from_db(self) -> list[QolsysPartition]:
815
-
816
894
  partitions = []
817
- partition_list: list[dict] = self.db.get_partitions()
895
+ partition_list: list[dict[str, str]] = self.db.get_partitions()
818
896
 
819
897
  # Create partitions array
820
898
  for partition_dict in partition_list:
821
-
822
899
  partition_id = partition_dict["partition_id"]
823
900
 
824
901
  settings_dict = {
@@ -884,4 +961,8 @@ class QolsysPanel(QolsysObservable):
884
961
 
885
962
  LOGGER.debug("Users list:")
886
963
  for user in self._users:
887
- LOGGER.debug("User: %s", user["id"])
964
+ LOGGER.debug("User: %s", user.id)
965
+
966
+ LOGGER.debug("*** Plugin Information ***")
967
+ LOGGER.debug("Motion Delay Enabled: %s", self._controller.settings.motion_sensor_delay)
968
+ LOGGER.debug("Motion Delay Value: %s", self._controller.settings.motion_sensor_delay_sec)