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
qolsys_controller/panel.py
CHANGED
|
@@ -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 .
|
|
14
|
-
from .
|
|
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
|
-
|
|
29
|
-
|
|
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",
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"
|
|
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.
|
|
134
|
+
if self._controller.settings.users_file_path.is_file():
|
|
99
135
|
try:
|
|
100
|
-
path = self.
|
|
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
|
-
|
|
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.
|
|
348
|
-
self.
|
|
349
|
-
self.
|
|
350
|
-
self.
|
|
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) ->
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
511
|
-
if scene is not None and isinstance(
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
|
733
|
-
return user
|
|
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
|
-
|
|
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
|
|
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)
|