瀏覽代碼

Add support for Papifeed pet feeder and Orion fingerprint lock

Issues #2844, #2846
Jason Rumney 1 年之前
父節點
當前提交
6ab273b89a
共有 26 個文件被更改,包括 595 次插入1 次删除
  1. 2 0
      ACKNOWLEDGEMENTS.md
  2. 2 0
      DEVICES.md
  3. 2 0
      custom_components/tuya_local/devices/README.md
  4. 1 1
      custom_components/tuya_local/devices/intelbras_IFR7000_lock.yaml
  5. 438 0
      custom_components/tuya_local/devices/orion_dl033ha_lock.yaml
  6. 71 0
      custom_components/tuya_local/devices/papifeed_pet_feeder.yaml
  7. 3 0
      custom_components/tuya_local/lock.py
  8. 4 0
      custom_components/tuya_local/translations/bg.json
  9. 4 0
      custom_components/tuya_local/translations/cz.json
  10. 4 0
      custom_components/tuya_local/translations/de.json
  11. 4 0
      custom_components/tuya_local/translations/el.json
  12. 4 0
      custom_components/tuya_local/translations/en.json
  13. 4 0
      custom_components/tuya_local/translations/es.json
  14. 4 0
      custom_components/tuya_local/translations/fr.json
  15. 4 0
      custom_components/tuya_local/translations/hu.json
  16. 4 0
      custom_components/tuya_local/translations/id.json
  17. 4 0
      custom_components/tuya_local/translations/it.json
  18. 4 0
      custom_components/tuya_local/translations/ja.json
  19. 4 0
      custom_components/tuya_local/translations/no-NB.json
  20. 4 0
      custom_components/tuya_local/translations/pl.json
  21. 4 0
      custom_components/tuya_local/translations/pt-BR.json
  22. 4 0
      custom_components/tuya_local/translations/ru.json
  23. 4 0
      custom_components/tuya_local/translations/uk.json
  24. 4 0
      custom_components/tuya_local/translations/ur.json
  25. 4 0
      custom_components/tuya_local/translations/zh-Hans.json
  26. 4 0
      custom_components/tuya_local/translations/zh-Hant.json

+ 2 - 0
ACKNOWLEDGEMENTS.md

@@ -840,3 +840,5 @@ Further device support has been made with the assistance of users. Please consid
 - [qvqn](https://github.com/qvqn) for assisting with support for Inkbird ISC-007BW smoker fan controller.
 - [smue86](https://github.com/smue86) for contributing support for Recteq RT700 grill.
 - [K900](https://github.com/K900) for contributing support for Petoneer Fresco EzGo pet fountain.
+- [eisenschmid23](https://github.com/eisenschmid23) for assisting with support for Papifeed pet feeder.
+- [AndrewJ1990](https://github.com/AndrewJ1990) for assisting with support for Orion smart fingerprint entrance lock.

+ 2 - 0
DEVICES.md

@@ -785,6 +785,7 @@ work reliably, even if listed below.
 
 - BSTUOKEY access control keypad
 - Lucking HF06 smart lock
+- Orion Grid Connect smart fingerprint entrance lock
 - Orion Grid Connect smart lock
 - Sboard III mini Weigand access control interface
 - SmarDeer Lock33 smart lock
@@ -862,6 +863,7 @@ port and password.
 - LSC Smart Connect pet feeder
 - Mypin 6L Video pet feeder
 - Nedis pet feeder
+- Papifeed pet feeder
 - Petlibro PLAF103 pet feeder
 - Petlibro PLAF203 pet feeder with camera
 - Petoneer Fresco EzGo pet fountain

+ 2 - 0
custom_components/tuya_local/devices/README.md

@@ -706,6 +706,8 @@ no information will be available about which specific credential was used to unl
 - **unlock_key** (optional, integer): a dp to identify the key used to unlock the lock.
 - **unlock_ble** (optional, integer): a dp to identify the BLE device used to unlock the lock.
 - **unlock_voice** (optional, integer): a dp to identify the voice assistant user used to unlock the lock.
+- **unlock_ibeacon** (optional, integer): a dp to identify the BLE iBeacon used to unlock the lock.
+- **unlock_multi** (optional, integer): a dp to identify the multi-factor user that unlocked the lock.
 - **request_unlock** (optional, integer): a dp to signal that a request has been made to unlock, the value should indicate the time remaining for approval.
 - **approve_unlock** (optional, boolean): a dp to unlock the lock in response to a request.
 - **request_intercom** (optional, integer): a dp to signal that a request has been made via intercom to unlock, the value should indicate the time remaining for approval.

+ 1 - 1
custom_components/tuya_local/devices/intelbras_IFR7000_lock.yaml

@@ -161,4 +161,4 @@ entities:
 #  24 = password_create, 25 = password_delete, 26 = password_update,
 #  27 = password_disable, 28 = password_enable, 39 = password_reset (rw),
 #  48 = remote_no_pd_setkey (rw), 49 = remote_no_dp_key (rw),
-#  54 = unlock__method_create (rw), 54 = unlock_method_delete (rw),
+#  54 = unlock__method_create (rw), 55 = unlock_method_delete (rw),

+ 438 - 0
custom_components/tuya_local/devices/orion_dl033ha_lock.yaml

@@ -0,0 +1,438 @@
+name: Door lock
+products:
+  - id: qhoybrozfhcenkyh
+    manufacturer: Orion
+    model: DL033HA
+    name: Fingerprint entrance lock
+entities:
+  - entity: lock
+    dps:
+      - id: 1
+        type: string
+        name: create_unlock_method
+        optional: true
+        sensitive: true
+      - id: 2
+        type: string
+        name: delete_unlock_method
+        optional: true
+      - id: 3
+        type: string
+        name: modify_unlock_method
+        optional: true
+        sensitive: true
+      - id: 12
+        type: integer
+        name: unlock_fingerprint
+        optional: true
+        persist: false
+      - id: 13
+        name: unlock_password
+        type: integer
+        optional: true
+        persist: false
+      - id: 14
+        name: unlock_dynamic_pwd
+        type: integer
+        optional: true
+        persist: false
+      - id: 15
+        name: unlock_card
+        type: integer
+        optional: true
+        persist: false
+      - id: 19
+        name: unlock_ble
+        type: integer
+        optional: true
+        persist: false
+      - id: 21
+        name: jammed
+        type: string
+        optional: true
+        persist: false
+        mapping:
+          - dps_val: tongue_bad
+            value: true
+          - dps_val: tongue_not_out
+            value: true
+          - dps_val: null
+            value: false
+          - value: false
+      - id: 47  # Lock motor state
+        name: lock
+        type: boolean
+        readonly: true
+        mapping:
+          - dps_val: true  # Unlocked
+            value: false
+          - dps_val: false  # Locked
+            value: true
+      - id: 51
+        type: string
+        optional: true
+        sensitive: true
+        name: temp_pwd_create
+      - id: 52
+        type: string
+        optional: true
+        name: temp_pwd_delete
+      - id: 53
+        type: string
+        optional: true
+        sensitive: true
+        name: temp_pwd_modify
+      - id: 54
+        type: string
+        optional: true
+        sensitive: true
+        name: sync_method
+      - id: 55
+        type: integer
+        name: unlock_temp_pwd
+        optional: true
+        persist: false
+      - id: 61
+        type: string
+        optional: true
+        sensitive: true
+        name: remote_no_dp_key
+      - id: 62
+        type: integer
+        name: unlock_app
+        optional: true
+        persist: false
+      - id: 63
+        name: unlock_voice
+        type: integer
+        optional: true
+        persist: false
+      - id: 64
+        type: string
+        optional: true
+        name: pwd_offline_time
+      - id: 65
+        type: string
+        optional: true
+        name: offline_pwd_cleared
+      - id: 66
+        type: string
+        optional: true
+        name: offline_pwd_clear_all
+      - id: 67
+        type: string
+        optional: true
+        persist: false
+        name: unlock_offline_pwd
+        mapping:
+          - dps_val: null
+            value: null
+          - value: 1
+      - id: 67
+        type: string
+        optional: true
+        sensitive: true
+        name: offline_pwd_details
+      - id: 69
+        type: string
+        optional: true
+        name: log
+      - id: 70
+        type: string
+        optional: true
+        sensitive: true
+        name: check_code_set
+      - id: 71
+        type: string
+        optional: true
+        sensitive: true
+        name: ble_unlock_check
+      - id: 72
+        type: string
+        optional: true
+        sensitive: true
+        name: unlock_record_check
+      - id: 73
+        type: string
+        optional: true
+        name: remote_pd_setkey_check
+      - id: 74
+        type: string
+        optional: true
+        name: unlock_double_kit
+      - id: 86
+        type: integer
+        optional: true
+        name: unlock_ibeacon
+  - entity: sensor
+    class: battery
+    dps:
+      - id: 8
+        type: integer
+        name: sensor
+        unit: "%"
+  - entity: event
+    name: Lock record
+    dps:
+      - id: 20
+        type: string
+        name: event
+        optional: true
+        mapping:
+          - dps_val: null
+            value: null
+          - value: record
+      - id: 20
+        type: string
+        optional: true
+        name: details
+  - entity: event
+    name: Alarm
+    dps:
+      - id: 21
+        type: string
+        name: event
+        optional: true
+        mapping:
+          - dps_val: wrong_finger
+            value: unlock_failure
+          - dps_val: wrong_password
+            value: unlock_failure
+          - dps_val: wrong_card
+            value: unlock_failure
+          - dps_val: wrong_face
+            value: unlock_failure
+          - dps_val: tongue_bad
+            value: jammed
+          - dps_val: too_hot
+            value: tamper
+          - dps_val: unclosed_time
+            value: left_open
+          - dps_val: tongue_not_out
+            value: jammed
+          - dps_val: pry
+            value: tamper
+          - dps_val: key_in
+            value: key_left_in
+          - dps_val: low_battery
+            value: low_battery
+          - dps_val: power_off
+            value: low_battery
+          - dps_val: shock
+            value: tamper
+          - dps_val: defense
+            value: tamper
+      - id: 21
+        type: string
+        optional: true
+        name: details
+  - entity: event
+    name: Hijack
+    dps:
+      - id: 22
+        type: boolean
+        name: event
+        optional: true
+        mapping:
+          - dps_val: true
+            value: hijack
+          - dps_val: false
+            value: null
+  - entity: event
+    class: doorbell
+    dps:
+      - id: 24
+        type: boolean
+        name: event
+        optional: true
+        mapping:
+          - dps_val: true
+            value: ring
+          - dps_val: false
+            value: null
+  - entity: select
+    translation_key: language
+    category: config
+    dps:
+      - id: 28
+        type: string
+        name: option
+        mapping:
+          - dps_val: english
+            value: english
+          - dps_val: chinese_simplified
+            value: chinese
+  - entity: number
+    name: Lock volume
+    category: config
+    dps:
+      - id: 31
+        type: string
+        name: value
+        unit: "%"
+        range:
+          min: 0
+          max: 100
+        mapping:
+          - dps_val: mute
+            step: 33
+            value: 0
+            icon: "mdi:volume-mute"
+          - dps_val: low
+            step: 33
+            value: 33
+            icon: "mdi:volume-low"
+          - dps_val: normal
+            step: 33
+            value: 66
+            icon: "mdi:volume-medium"
+          - dps_val: high
+            step: 33
+            value: 100
+            icon: "mdi:volume-high"
+  - entity: lock
+    name: Snib
+    icon: "mdi:lock-remove"
+    category: diagnostic
+    dps:
+      - id: 32
+        type: boolean
+        name: lock
+        mapping:
+          - dps_val: null
+            value: false
+            hidden: true
+  - entity: switch
+    name: Auto lock
+    category: config
+    icon: "mdi:lock-reset"
+    dps:
+      - id: 33
+        type: boolean
+        name: switch
+        mapping:
+          - dps_val: true
+            value: false
+          - dps_val: false
+            value: true
+  - entity: select
+    name: Multifactor
+    icon: "mdi:lock-check"
+    category: config
+    dps:
+      - id: 34
+        type: string
+        name: option
+        mapping:
+          - dps_val: single_unlock
+            value: Single factor
+          - dps_val: finger_password
+            value: Finger and PIN
+          - dps_val: finger_card
+            value: Finger and card
+          - dps_val: password_card
+            value: Card and PIN
+  - entity: number
+    name: Auto lock delay
+    icon: "mdi:lock-clock"
+    category: config
+    dps:
+      - id: 36
+        type: integer
+        name: value
+        range:
+          min: 1
+          max: 1800
+        unit: s
+  - entity: switch
+    name: Local clock
+    icon: "mdi:clock-outline"
+    category: config
+    dps:
+      - id: 44
+        type: boolean
+        name: switch
+        optional: true
+        mapping:
+          - dps_val: null
+            value: false
+            hidden: true
+  - entity: lock
+    name: Lockdown
+    icon: "mdi:key-alert"
+    category: config
+    dps:
+      - id: 46
+        type: boolean
+        name: lock
+  - entity: select
+    name: iBeacon scan duration
+    translation_key: timer
+    category: config
+    dps:
+      - id: 87
+        type: string
+        optional: true
+        name: option
+        mapping:
+          - dps_val: always
+            value: continuous
+          - dps_val: "5min"
+            value: "5m"
+          - dps_val: "10min"
+            value: "10m"
+          - dps_val: "20min"
+            value: "20m"
+          - dps_val: "30min"
+            value: "30m"
+          - dps_val: "40min"
+            value: "40m"
+          - dps_val: "60min"
+            value: "1h"
+          - dps_val: "90min"
+            value: "1h30m"
+          - dps_val: "120min"
+            value: "2h"
+  - entity: select
+    name: iBeacon sensitivity
+    icon: "mdi:signal-distance-variant"
+    category: config
+    dps:
+      - id: 88
+        type: string
+        optional: true
+        name: option
+        mapping:
+          - dps_val: inactive
+            value: Any
+          - dps_val: null
+            value: Any
+            hidden: true
+          - dps_val: "90db"
+            value: "90dB"
+          - dps_val: "80db"
+            value: "80dB"
+          - dps_val: "70db"
+            value: "70dB"
+          - dps_val: "60db"
+            value: "60dB"
+          - dps_val: "50db"
+            value: "50dB"
+          - dps_val: "40db"
+            value: "40dB"
+          - dps_val: "30db"
+            value: "30dB"
+          - dps_val: "20db"
+            value: "20dB"
+  - entity: switch
+    name: iBeacon enable
+    category: config
+    dps:
+      - id: 90
+        type: boolean
+        name: switch
+        mapping:
+          - dps_val: true
+            icon: "mdi:broadcast"
+          - dps_val: false
+            icon: "mdi:broadcast-off"

+ 71 - 0
custom_components/tuya_local/devices/papifeed_pet_feeder.yaml

@@ -0,0 +1,71 @@
+name: Pet feeder
+products:
+  - id: fqya2gnl3bcjgwzl
+    manufacturer: Papifeed
+    model: PB-26-SW
+entities:
+  - entity: switch
+    dps:
+      - id: 20
+        type: boolean
+        name: switch
+  - entity: sensor
+    icon: "mdi:paw"
+    name: Feed report
+    dps:
+      - id: 15
+        name: sensor
+        type: integer
+  - entity: number
+    icon: "mdi:paw"
+    name: Manual feed
+    category: config
+    dps:
+      - id: 3
+        name: value
+        type: integer
+        range:
+          min: 1
+          max: 12
+  - entity: binary_sensor
+    name: Food shortage
+    class: problem
+    category: diagnostic
+    dps:
+      - id: 14
+        type: bitfield
+        name: sensor
+        optional: true
+        mapping:
+          - dps_val: 2
+            value: true
+          - value: false
+  - entity: binary_sensor
+    name: Food blockage
+    class: problem
+    category: diagnostic
+    dps:
+      - id: 14
+        type: bitfield
+        name: sensor
+        optional: true
+        mapping:
+          - dps_val: 4
+            value: true
+          - value: false
+  - entity: binary_sensor
+    name: Feeding
+    class: running
+    icon: "mdi:paw"
+    category: diagnostic
+    dps:
+      - id: 4
+        type: string
+        name: sensor
+        optional: true
+        mapping:
+          - dps_val: feeding
+            value: true
+          - dps_val: null
+            value: null
+          - value: false

+ 3 - 0
custom_components/tuya_local/lock.py

@@ -47,6 +47,7 @@ class TuyaLocalLock(TuyaLocalEntity, LockEntity):
         self._unlock_voice_dp = dps_map.pop("unlock_voice", None)
         self._unlock_face_dp = dps_map.pop("unlock_face", None)
         self._unlock_multi_dp = dps_map.pop("unlock_multi", None)
+        self._unlock_ibeacon_dp = dps_map.pop("unlock_ibeacon", 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)
@@ -76,6 +77,7 @@ class TuyaLocalLock(TuyaLocalEntity, LockEntity):
                 self._unlock_voice_dp,
                 self._unlock_face_dp,
                 self._unlock_multi_dp,
+                self._unlock_ibeacon_dp,
             ):
                 if d:
                     if d.get_value(self._device):
@@ -118,6 +120,7 @@ class TuyaLocalLock(TuyaLocalEntity, LockEntity):
             self._unlock_voice_dp: "Voice",
             self._unlock_face_dp: "Face",
             self._unlock_multi_dp: "Multifactor",
+            self._unlock_ibeacon_dp: "iBeacon",
         }.items():
             by = self.unlocker_id(dp, desc)
             if by:

+ 4 - 0
custom_components/tuya_local/translations/bg.json

@@ -481,8 +481,12 @@
                 "name": "Таймер",
                 "state": {
                     "cancel": "Отказ",
+                    "continuous": "Непрекъснато",
+                    "5m": "5 минути",
                     "10m": "10 минути",
+                    "20m": "20 минути",
                     "30m": "30 минути",
+                    "40m": "40 минути",
                     "1h": "1 час",
                     "1h30m": "1 час 30 минути",
                     "2h": "2 часа",

+ 4 - 0
custom_components/tuya_local/translations/cz.json

@@ -481,8 +481,12 @@
                 "name": "Časovač",
                 "state": {
                     "cancel": "Zrušit",
+                    "continuous": "Nepřetržitý",
+                    "5m": "5 minut",
                     "10m": "10 minut",
+                    "20m": "20 minut",
                     "30m": "30 minut",
+                    "40m": "40 minut",
                     "1h": "1 hodina",
                     "1h30m": "1 hodina 30 minut",
                     "2h": "2 hodiny",

+ 4 - 0
custom_components/tuya_local/translations/de.json

@@ -480,8 +480,12 @@
                 "name": "Timer",
                 "state": {
                     "cancel": "Abbrechen",
+                    "continuous": "Dauerbetrieb",
+                    "5m": "5 Minuten",
                     "10m": "10 Minuten",
+                    "20m": "20 Minuten",
                     "30m": "30 Minuten",
+                    "40m": "40 Minuten",
                     "1h": "1 Stunde",
                     "1h30m": "1 Stunde 30 Minuten",
                     "2h": "2 Stunden",

+ 4 - 0
custom_components/tuya_local/translations/el.json

@@ -481,8 +481,12 @@
                 "name": "Χρονοδιακόπτης",
                 "state": {
                     "cancel": "Ακύρωση",
+                    "continuous": "Συνεχής",
+                    "5m": "5 λεπτά",
                     "10m": "10 λεπτά",
+                    "20m": "20 λεπτά",
                     "30m": "30 λεπτά",
+                    "40m": "40 λεπτά",
                     "1h": "1 ώρα",
                     "1h30m": "1 ώρα 30 λεπτά",
                     "2h": "2 ώρες",

+ 4 - 0
custom_components/tuya_local/translations/en.json

@@ -481,8 +481,12 @@
                 "name": "Timer",
                 "state": {
                     "cancel": "Cancel",
+                    "continuous": "Continuous",
+                    "5m": "5 minutes",
                     "10m": "10 minutes",
+                    "20m": "20 minutes",
                     "30m": "30 minutes",
+                    "40m": "40 minutes",
                     "1h": "1 hour",
                     "1h30m": "1 hour 30 minutes",
                     "2h": "2 hours",

+ 4 - 0
custom_components/tuya_local/translations/es.json

@@ -481,8 +481,12 @@
                 "name": "Temporizador",
                 "state": {
                     "cancel": "Cancelar",
+                    "continuous": "Continuo",
+                    "5m": "5 minutos",
                     "10m": "10 minutos",
+                    "20m": "20 minutos",
                     "30m": "30 minutos",
+                    "40m": "40 minutos",
                     "1h": "1 hora",
                     "1h30m": "1 hora 30 minutos",
                     "2h": "2 horas",

+ 4 - 0
custom_components/tuya_local/translations/fr.json

@@ -481,8 +481,12 @@
                 "name": "Minuteur",
                 "state": {
                     "cancel": "Annuler",
+                    "continuous": "Continu",
+                    "5m": "5 minutes",
                     "10m": "10 minutes",
+                    "20m": "20 minutes",
                     "30m": "30 minutes",
+                    "40m": "40 minutes",
                     "1h": "1 heure",
                     "1h30m": "1 heure 30 minutes",
                     "2h": "2 heures",

+ 4 - 0
custom_components/tuya_local/translations/hu.json

@@ -482,8 +482,12 @@
                 "name": "Időzítő",
                 "state": {
                     "cancel": "Mégse",
+                    "continuous": "Folyamatos",
+                    "5m": "5 perc",
                     "10m": "10 perc",
+                    "20m": "20 perc",
                     "30m": "30 perc",
+                    "40m": "40 perc",
                     "1h": "1 óra",
                     "1h30m": "1 óra 30 perc",
                     "2h": "2 óra",

+ 4 - 0
custom_components/tuya_local/translations/id.json

@@ -481,8 +481,12 @@
                 "name": "Pengatur waktu",
                 "state": {
                     "cancel": "Batal",
+                    "continuous": "Terus menerus",
+                    "5m": "5 menit",
                     "10m": "10 menit",
+                    "20m": "20 menit",
                     "30m": "30 menit",
+                    "40m": "40 menit",
                     "1h": "1 jam",
                     "1h30m": "1 jam 30 menit",
                     "2h": "2 jam",

+ 4 - 0
custom_components/tuya_local/translations/it.json

@@ -482,8 +482,12 @@
                 "name": "Timer",
                 "state": {
                     "cancel": "Annulla",
+                    "continuous": "Continuo",
+                    "5m": "5 minuti",
                     "10m": "10 minuti",
+                    "20m": "20 minuti",
                     "30m": "30 minuti",
+                    "40m": "40 minuti",
                     "1h": "1 ora",
                     "1h30m": "1 ora 30 minuti",
                     "2h": "2 ore",

+ 4 - 0
custom_components/tuya_local/translations/ja.json

@@ -481,8 +481,12 @@
                 "name": "タイマー",
                 "state": {
                     "cancel": "キャンセル",
+                    "continuous": "連続",
+                    "5m": "5分",
                     "10m": "10分",
+                    "20m": "20分",
                     "30m": "30分",
+                    "40m": "40分",
                     "1h": "1時間",
                     "1h30m": "1時間30分",
                     "2h": "2時間",

+ 4 - 0
custom_components/tuya_local/translations/no-NB.json

@@ -482,8 +482,12 @@
                 "name": "Timer",
                 "state": {
                     "cancel": "Avbryt",
+                    "continuous": "Kontinuerlig",
+                    "5m": "5 minutter",
                     "10m": "10 minutter",
+                    "20m": "20 minutter",
                     "30m": "30 minutter",
+                    "40m": "40 minutter",
                     "1h": "1 time",
                     "1h30m": "1 time 30 minutter",
                     "2h": "2 timer",

+ 4 - 0
custom_components/tuya_local/translations/pl.json

@@ -481,8 +481,12 @@
                 "name": "Regulator czasowy",
                 "state": {
                     "cancel": "Anuluj",
+                    "continuous": "Ciągły",
+                    "5m": "5 minut",
                     "10m": "10 minut",
+                    "20m": "20 minut",
                     "30m": "30 minut",
+                    "40m": "40 minut",
                     "1h": "1 godzina",
                     "1h30m": "1 godzina 30 minut",
                     "2h": "2 godziny",

+ 4 - 0
custom_components/tuya_local/translations/pt-BR.json

@@ -481,8 +481,12 @@
                 "name": "Cronômetro",
                 "state": {
                     "cancel": "Cancelar",
+                    "continuous": "Contínuo",
+                    "5m": "5 minutos",
                     "10m": "10 minutos",
+                    "20m": "20 minutos",
                     "30m": "30 minutos",
+                    "40m": "40 minutos",
                     "1h": "1 hora",
                     "1h30m": "1 hora e 30 minutos",
                     "2h": "2 horas",

+ 4 - 0
custom_components/tuya_local/translations/ru.json

@@ -481,8 +481,12 @@
                 "name": "Таймер",
                 "state": {
                     "cancel": "Отмена",
+                    "continuous": "Непрерывный",
+                    "5m": "5 минут",
                     "10m": "10 минут",
+                    "20m": "20 минут",
                     "30m": "30 минут",
+                    "40m": "40 минут",
                     "1h": "1 час",
                     "1h30m": "1 час 30 минут",
                     "2h": "2 часа",

+ 4 - 0
custom_components/tuya_local/translations/uk.json

@@ -484,8 +484,12 @@
                 "name": "Таймер",
                 "state": {
                     "cancel": "Скасувати",
+                    "continuous": "Постійний",
+                    "5m": "5 хвилин",
                     "10m": "10 хвилин",
+                    "20m": "20 хвилин",
                     "30m": "30 хвилин",
+                    "40m": "40 хвилин",
                     "1h": "1 година",
                     "1h30m": "1 година 30 хвилин",
                     "2h": "2 години",

+ 4 - 0
custom_components/tuya_local/translations/ur.json

@@ -484,8 +484,12 @@
                 "name": "ٹائمر",
                 "state": {
                     "cancel": "منسوخ کریں",
+                    "continuous": "مسلسل",
+                    "5m": "5 منٹ",
                     "10m": "10 منٹ",
+                    "20m": "20 منٹ",
                     "30m": "30 منٹ",
+                    "40m": "40 منٹ",
                     "1h": "1 گھنٹہ",
                     "1h30m": "1 گھنٹہ 30 منٹ",
                     "2h": "2 گھنٹے",

+ 4 - 0
custom_components/tuya_local/translations/zh-Hans.json

@@ -481,8 +481,12 @@
                 "name": "计时器",
                 "state": {
                     "cancel": "取消",
+                    "continuous": "连续",
+                    "5m": "5分钟",
                     "10m": "10分钟",
+                    "20m": "20分钟",
                     "30m": "30分钟",
+                    "40m": "40分钟",
                     "1h": "1小时",
                     "1h30m": "1小时30分钟",
                     "2h": "2小时",

+ 4 - 0
custom_components/tuya_local/translations/zh-Hant.json

@@ -482,8 +482,12 @@
                 "name": "計時器",
                 "state": {
                     "cancel": "取消",
+                    "continuous": "連續",
+                    "5m": "5分鐘",
                     "10m": "10分鐘",
+                    "20m": "20分鐘",
                     "30m": "30分鐘",
+                    "40m": "40分鐘",
                     "1h": "1小時",
                     "1h30m": "1小時30分鐘",
                     "2h": "2小時",