Procházet zdrojové kódy

Add partial support for AGL Ultramagic smart lock.

Experimental support to allow more investigation on how the device
works.

Issue #268
Jason Rumney před 3 roky
rodič
revize
4ceb72b852

+ 1 - 0
ACKNOWLEDGEMENTS.md

@@ -139,3 +139,4 @@ Further device support has been made with the assistance of users.  Please consi
 - [filipole](https://github.com/filipole) for assistance supporting Aubess switch with energy monitoring.
 - [catdogmaus](https://github.com/catdogmaus) for assistance supporting Ryra TYTE-D1 thermostats.
 - [Kulturnilpferd](https://github.com/Kulturnilpferd) for contributing support for Hosome air purifiers.
+- [raphaeleduardo42](https://github.com/raphaeleduardo42) for assistance supporting AGL Ultramagic locks.

+ 1 - 0
DEVICES.md

@@ -206,6 +206,7 @@ Other brands may work with the above configurations
 ### Locks
 
 - Orion Grid Connect smart lock
+- AGL Ultramagic smart lock (experimental)
 
 ### Sirens
 

+ 132 - 0
custom_components/tuya_local/devices/agl_ultramagic_lock.yaml

@@ -0,0 +1,132 @@
+name: AGL Ultra Magic lock
+primary_entity:
+  entity: lock
+  dps:
+    - id: 1
+      type: boolean
+      name: lock
+    - id: 3
+      type: boolean
+      name: door_contact
+    - id: 5
+      name: num_tags
+      type: integer
+    - id: 101
+      name: write_tag
+      type: integer
+    - id: 104
+      name: approve_unlock
+      type: boolean
+    - id: 105
+      name: approve_intercom
+      type: boolean
+    - id: 106
+      name: open_alarm
+      type: boolean
+      optional: true
+    - id: 108
+      name: interlock
+      type: boolean
+    - id: 109
+      name: unlock_card
+      type: boolean
+    - id: 110
+      name: tag_last_added
+      type: integer
+    - id: 111
+      name: alarm
+      type: boolean
+    - id: 112
+      name: open_notification
+      type: boolean
+    - id: 113
+      name: closed_notification
+      type: boolean
+    - id: 114
+      name: backup
+      type: string
+    - id: 116
+      name: powered
+      type: boolean
+    - id: 117
+      name: gate_contact
+      type: string
+    - id: 120
+      name: request_intercom
+      type: boolean
+    - id: 121
+      name: request_unlock
+      type: boolean
+    - id: 122
+      name: notify_app
+      type: boolean
+    - id: 123
+      name: delete_control
+      type: boolean
+    - id: 124
+      name: door_contact_open
+      type: boolean
+    - id: 125
+      name: door_alarm_trigger
+      type: boolean
+    - id: 126
+      name: backup_saved
+      type: boolean
+    - id: 127
+      name: backup_recovered
+      type: boolean
+    - id: 128
+      name: backup_error
+      type: boolean
+    - id: 129
+      name: unlock_key
+      type: boolean
+secondary_entities:
+  - entity: number
+    category: config
+    name: Lock timeout
+    icon: "mdi:lock-clock"
+    dps:
+      - id: 102
+        name: value
+        type: integer
+        range:
+          min: 1
+          max: 5
+        unit: s
+  - entity: select
+    category: config
+    name: Beep
+    icon: "mdi:volume-high"
+    dps:
+      - id: 103
+        name: option
+        type: string
+        mapping:
+          - dps_val: Silensioso
+            value: Mute
+          - dps_val: Baixo
+            value: Low
+          - dps_val: Médio
+            value: Medium
+          - dps_val: Alto
+            value: High
+  - entity: switch
+    category: config
+    name: Auto close
+    dps:
+      - id: 107
+        name: switch
+        type: boolean
+  - entity: number
+    category: config
+    icon: "mdi:clock-end"
+    name: Auto close timeout
+    dps:
+      - id: 115
+        name: value
+        type: integer
+        range:
+          min: 1
+          max: 1200
+          unit: s

+ 9 - 1
custom_components/tuya_local/generic/lock.py

@@ -29,8 +29,11 @@ class TuyaLocalLock(TuyaLocalEntity, LockEntity):
         self._unlock_dynpw_dp = dps_map.pop("unlock_dynamic_pwd", None)
         self._unlock_card_dp = dps_map.pop("unlock_card", None)
         self._unlock_app_dp = dps_map.pop("unlock_app", None)
+        self._unlock_key_dp = dps_map.pop("unlock_key", None)
         self._req_unlock_dp = dps_map.pop("request_unlock", None)
         self._approve_unlock_dp = dps_map.pop("approve_unlock", None)
+        self._req_intercom_dp = dps_map.pop("request_intercom", None)
+        self._approve_intercom_dp = dps_map.pop("approve_intercom", None)
         self._jam_dp = dps_map.pop("jammed", None)
         self._init_end(dps_map)
 
@@ -48,6 +51,7 @@ class TuyaLocalLock(TuyaLocalEntity, LockEntity):
                 self._unlock_pw_dp,
                 self._unlock_tmppw_dp,
                 self._unlock_app_dp,
+                self._unlock_key_dp,
             ):
                 if d:
                     if d.get_value(self._device):
@@ -65,7 +69,10 @@ class TuyaLocalLock(TuyaLocalEntity, LockEntity):
         if dp:
             id = dp.get_value(self._device)
             if id:
-                return f"{type} #{id}"
+                if id is True:
+                    return f"{type}"
+                else:
+                    return f"{type} #{id}"
 
     @property
     def changed_by(self):
@@ -74,6 +81,7 @@ class TuyaLocalLock(TuyaLocalEntity, LockEntity):
             self._unlock_card_dp: "Card",
             self._unlock_dynpw_dp: "Dynamic Password",
             self._unlock_fp_dp: "Finger",
+            self._unlock_key_dp: "Key",
             self._unlock_pw_dp: "Password",
             self._unlock_tmppw_dp: "Temporary Password",
         }.items():