From 3dc6f656f48d01fe9cb9982737ab7fa6617d1f66 Mon Sep 17 00:00:00 2001 From: bropat Date: Tue, 16 May 2023 20:46:53 +0200 Subject: [PATCH] Notification pictures are supported again Implemented new livestream support using go2rtc (WebRTC/MSE, rtsp) Fixed issue #323 Updated version of the package eufy-security-client (2.6.2) Further details can be found in the changelog of eufy-security-client (2.6.2) --- .devcontainer/docker-compose.yml | 4 + .devcontainer/iobroker/Dockerfile | 2 +- .gitignore | 2 +- .npmignore | 2 +- README.md | 10 + admin/admin.d.ts | 93 --- admin/i18n/de/translations.json | 14 +- admin/i18n/en/translations.json | 14 +- admin/i18n/es/translations.json | 14 +- admin/i18n/fr/translations.json | 14 +- admin/i18n/it/translations.json | 14 +- admin/i18n/nl/translations.json | 14 +- admin/i18n/pl/translations.json | 14 +- admin/i18n/pt/translations.json | 14 +- admin/i18n/ru/translations.json | 14 +- admin/i18n/zh-cn/translations.json | 14 +- admin/index_m.html | 159 ---- admin/jsonConfig.json | 97 ++- admin/style.css | 31 - admin/tsconfig.json | 9 - admin/words.js | 44 +- build/lib/types.js | 110 +-- build/lib/types.js.map | 2 +- build/lib/utils.js | 244 +----- build/lib/utils.js.map | 2 +- build/lib/video.js | 111 ++- build/lib/video.js.map | 2 +- build/main.js | 611 ++++++++------- build/main.js.map | 2 +- docs/_coverpage.md | 2 +- docs/_media/en/config02.png | Bin 43519 -> 60302 bytes docs/authentication.md | 4 +- docs/configuration.md | 17 +- docs/features.md | 5 +- io-package.json | 102 +-- package-lock.json | 1150 ++++++++++++++++++---------- package.json | 31 +- src/lib/interfaces.ts | 21 +- src/lib/types.ts | 120 +-- src/lib/utils.ts | 232 +----- src/lib/video.ts | 123 +-- src/main.ts | 540 +++++++------ 42 files changed, 1967 insertions(+), 2057 deletions(-) delete mode 100644 admin/admin.d.ts delete mode 100755 admin/index_m.html delete mode 100644 admin/style.css delete mode 100644 admin/tsconfig.json diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index c105934..51178be 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -9,6 +9,10 @@ services: expose: - 8081 - 8082 + ports: + - 1984:1984 + - 8554:8554 + - 8443:8443 volumes: - ..:/workspace:cached - iobrokerdata-eusec:/opt/iobroker diff --git a/.devcontainer/iobroker/Dockerfile b/.devcontainer/iobroker/Dockerfile index 427e14c..9a51ce3 100644 --- a/.devcontainer/iobroker/Dockerfile +++ b/.devcontainer/iobroker/Dockerfile @@ -1,2 +1,2 @@ -FROM buanet/iobroker:latest-v7 +FROM buanet/iobroker:latest-v8 RUN ln -s /opt/iobroker/node_modules/ /root/.node_modules \ No newline at end of file diff --git a/.gitignore b/.gitignore index 8a70fa8..ac13443 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ nbproject maps/ # npm package files -iobroker.*.tgz +*.tgz Thumbs.db diff --git a/.npmignore b/.npmignore index 400c2e1..673cf49 100644 --- a/.npmignore +++ b/.npmignore @@ -31,7 +31,7 @@ tsconfig.*.json maps/ # npm package files -iobroker.*.tgz +*.tgz package-lock.json # i18n intermediate files diff --git a/README.md b/README.md index cd46b83..7ffe604 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,16 @@ Best is to set the adapter to Debug log mode (see [here](https://bropat.github.i ## Changelog +### 1.0.0 (2023-05-16) + +* (bropat) Notification pictures are supported again +* (bropat) Implemented new livestream support using go2rtc (WebRTC/MSE, rtsp) +* (bropat) Fixed issue #323 +* (bropat) Updated version of the package eufy-security-client (2.6.2) +* (bropat) Further details can be found in the changelog of eufy-security-client (2.6.2) + +**Note:** The download of event videos has been temporarily removed as decryption of these is not yet supported. It will be added back as soon as it is supported. + ### 0.9.10 (2023-02-24) * (bropat) Requires node version >= 16 diff --git a/admin/admin.d.ts b/admin/admin.d.ts deleted file mode 100644 index dcd9dc9..0000000 --- a/admin/admin.d.ts +++ /dev/null @@ -1,93 +0,0 @@ -declare let systemDictionary: Record>; - -declare let load: (settings: Record, onChange: (hasChanges: boolean) => void) => void; -declare let save: (callback: (settings: Record) => void) => void; - -// make load and save exist on the window object -interface Window { - load: typeof load; - save: typeof save; -} - -declare const instance: number; -declare const adapter: string; -/** Translates text */ -declare function _(text: string): string; -declare const socket: ioBrokerSocket; -declare function sendTo( - instance: any | null, - command: string, - message: any, - callback: (result: SendToResult) => void | Promise, -): void; - -interface SendToResult { - error?: string | Error; - result?: any; -} - -// tslint:disable-next-line:class-name -interface ioBrokerSocket { - emit( - command: "subscribeObjects", - pattern: string, - callback?: (err?: string) => void | Promise, - ): void; - emit( - command: "subscribeStates", - pattern: string, - callback?: (err?: string) => void | Promise, - ): void; - emit( - command: "unsubscribeObjects", - pattern: string, - callback?: (err?: string) => void | Promise, - ): void; - emit( - command: "unsubscribeStates", - pattern: string, - callback?: (err?: string) => void | Promise, - ): void; - - emit( - event: "getObjectView", - view: "system", - type: "device", - options: ioBroker.GetObjectViewParams, - callback: ( - err: string | undefined, - result?: any, - ) => void | Promise, - ): void; - emit( - event: "getStates", - callback: ( - err: string | undefined, - result?: Record, - ) => void, - ): void; - emit( - event: "getState", - id: string, - callback: (err: string | undefined, result?: ioBroker.State) => void, - ): void; - emit( - event: "setState", - id: string, - state: unknown, - callback: (err: string | undefined, result?: any) => void, - ): void; - - on(event: "objectChange", handler: ioBroker.ObjectChangeHandler): void; - on(event: "stateChange", handler: ioBroker.StateChangeHandler): void; - removeEventHandler( - event: "objectChange", - handler: ioBroker.ObjectChangeHandler, - ): void; - removeEventHandler( - event: "stateChange", - handler: ioBroker.StateChangeHandler, - ): void; - - // TODO: other events -} diff --git a/admin/i18n/de/translations.json b/admin/i18n/de/translations.json index 8798a9a..c21277a 100644 --- a/admin/i18n/de/translations.json +++ b/admin/i18n/de/translations.json @@ -12,7 +12,15 @@ "Accept incoming invitations": "Eingehende Einladungen annehmen", "Alarm sound duration (sec)": "Dauer des Alarmtons (Sek.)", "Livestream settings": "Livestream-Einstellungen", - "Max camera livestream duration (sec)": "Maximale Livestream-Dauer der Kamera (Sek.)", - "Automatically download video": "Automatisches Herunterladen von Videos", - "Automatically download picture": "Automatisches Herunterladen von Bildern" + "Max camera livestream duration (sec)": "Maximale Livestream-Dauer der Kamera (Sek.; 0 = unbegrenzt)", + "General settings": "Allgemeine Einstellungen", + "Hostname": "Hostname Streaming-Url", + "https": "HTTPS-Streaming-URL", + "go2rtc settings": "go2rtc Einstellungen", + "API port": "API Port", + "SRTP port": "SRTP Port", + "WebRTC port": "WebRTC Port", + "RTSP port": "RTSP Port", + "RTSP Username": "RTSP Benutzername", + "RTSP Password": "RTSP Passwort" } \ No newline at end of file diff --git a/admin/i18n/en/translations.json b/admin/i18n/en/translations.json index f7a3fe5..5b1bb77 100644 --- a/admin/i18n/en/translations.json +++ b/admin/i18n/en/translations.json @@ -12,7 +12,15 @@ "Accept incoming invitations": "Accept incoming invitations", "Alarm sound duration (sec)": "Alarm sound duration (sec)", "Livestream settings": "Livestream settings", - "Max camera livestream duration (sec)": "Max camera livestream duration (sec)", - "Automatically download video": "Automatically download video", - "Automatically download picture": "Automatically download picture" + "Max camera livestream duration (sec)": "Max camera livestream duration (sec; 0 = unlimited)", + "General settings": "General settings", + "Hostname": "Hostname streaming url", + "https": "HTTPS streaming url", + "go2rtc settings": "go2rtc settings", + "API port": "API port", + "SRTP port": "SRTP port", + "WebRTC port": "WebRTC port", + "RTSP port": "RTSP port", + "RTSP Username": "RTSP Username", + "RTSP Password": "RTSP Password" } \ No newline at end of file diff --git a/admin/i18n/es/translations.json b/admin/i18n/es/translations.json index e61f3fe..ee0141e 100644 --- a/admin/i18n/es/translations.json +++ b/admin/i18n/es/translations.json @@ -12,7 +12,15 @@ "Accept incoming invitations": "Aceptar invitaciones entrantes", "Alarm sound duration (sec)": "Duración del sonido de la alarma (s)", "Livestream settings": "Configuración de transmisión en vivo", - "Max camera livestream duration (sec)": "Duración máxima de la transmisión en vivo de la cámara (segundos)", - "Automatically download video": "Descarga automática de vídeo", - "Automatically download picture": "Descarga automática de la imagen" + "Max camera livestream duration (sec)": "Duración máxima de la transmisión en vivo de la cámara (segundos; 0 = ilimitado)", + "General settings": "Configuración general", + "Hostname": "Nombre de host url de streaming", + "https": "URL de transmisión HTTPS", + "go2rtc settings": "Configuración de go2rtc", + "API port": "Puerto API", + "SRTP port": "Puerto SRTP", + "WebRTC port": "Puerto WebRTC", + "RTSP port": "Puerto RTSP", + "RTSP Username": "Nombre de usuario RTSP", + "RTSP Password": "Contraseña RTSP" } \ No newline at end of file diff --git a/admin/i18n/fr/translations.json b/admin/i18n/fr/translations.json index a2ce2d5..79d637d 100644 --- a/admin/i18n/fr/translations.json +++ b/admin/i18n/fr/translations.json @@ -12,7 +12,15 @@ "Accept incoming invitations": "Accepter les invitations entrantes", "Alarm sound duration (sec)": "Durée du son de l'alarme (sec)", "Livestream settings": "Paramètres de diffusion en direct", - "Max camera livestream duration (sec)": "Durée maximale de la diffusion en direct de la caméra (s)", - "Automatically download video": "Téléchargement automatique de la vidéo", - "Automatically download picture": "Téléchargement automatique de l'image" + "Max camera livestream duration (sec)": "Durée maximale de la diffusion en direct de la caméra (s; 0 = illimité)", + "General settings": "Paramètres généraux", + "Hostname": "Nom d'hôte de l'url de streaming", + "https": "URL de streaming HTTPS", + "go2rtc settings": "Paramètres de go2rtc", + "API port": "Port API", + "SRTP port": "Port SRTP", + "WebRTC port": "Port WebRTC", + "RTSP port": "Port RTSP", + "RTSP Username": "Nom d'utilisateur RTSP", + "RTSP Password": "Mot de passe RTSP" } \ No newline at end of file diff --git a/admin/i18n/it/translations.json b/admin/i18n/it/translations.json index ab360ad..42762a1 100644 --- a/admin/i18n/it/translations.json +++ b/admin/i18n/it/translations.json @@ -12,7 +12,15 @@ "Accept incoming invitations": "Accetta inviti in arrivo", "Alarm sound duration (sec)": "Durata del suono dell'allarme (sec)", "Livestream settings": "Impostazioni live streaming", - "Max camera livestream duration (sec)": "Durata massima del live streaming della videocamera (sec)", - "Automatically download video": "Scarica automaticamente il video", - "Automatically download picture": "Scarica automaticamente l'immagine" + "Max camera livestream duration (sec)": "Durata massima del live streaming della videocamera (sec; 0 = illimitata)", + "General settings": "Impostazioni generali", + "Hostname": "Nome host url di streaming", + "https": "URL di streaming HTTPS", + "go2rtc settings": "Impostazioni di go2rtc", + "API port": "Porta API", + "SRTP port": "Porta SRTP", + "WebRTC port": "Porta WebRTC", + "RTSP port": "Porta RTSP", + "RTSP Username": "Nome utente RTSP", + "RTSP Password": "Password RTSP" } \ No newline at end of file diff --git a/admin/i18n/nl/translations.json b/admin/i18n/nl/translations.json index 286a936..d75451e 100644 --- a/admin/i18n/nl/translations.json +++ b/admin/i18n/nl/translations.json @@ -12,7 +12,15 @@ "Accept incoming invitations": "Accepteer inkomende uitnodigingen", "Alarm sound duration (sec)": "Duur alarmgeluid (sec)", "Livestream settings": "Livestream-instellingen", - "Max camera livestream duration (sec)": "Max. Duur livestream camera (sec)", - "Automatically download video": "Video automatisch downloaden", - "Automatically download picture": "Automatisch beeld downloaden" + "Max camera livestream duration (sec)": "Max. Duur livestream camera (sec; 0 = onbeperkt)", + "General settings": "Algemene instellingen", + "Hostname": "Hostnaam streaming url", + "https": "HTTPS-streaming url", + "go2rtc settings": "go2rtc instellingen", + "API port": "API poort", + "SRTP port": "SRTP poort", + "WebRTC port": "WebRTC poort", + "RTSP port": "RTSP poort", + "RTSP Username": "RTSP gebruikersnaam", + "RTSP Password": "RTSP wachtwoord" } \ No newline at end of file diff --git a/admin/i18n/pl/translations.json b/admin/i18n/pl/translations.json index 350ca1a..4fe670b 100644 --- a/admin/i18n/pl/translations.json +++ b/admin/i18n/pl/translations.json @@ -12,7 +12,15 @@ "Accept incoming invitations": "Przyjmowanie zaproszeń przychodzących", "Alarm sound duration (sec)": "Czas trwania dźwięku alarmu (sek.)", "Livestream settings": "Ustawienia transmisji na żywo", - "Max camera livestream duration (sec)": "Maksymalny czas trwania transmisji na żywo z kamery (s)", - "Automatically download video": "Automatycznie pobieraj wideo", - "Automatically download picture": "Automatyczne pobieranie obrazu" + "Max camera livestream duration (sec)": "Maksymalny czas trwania transmisji na żywo z kamery (s; 0 = bez ograniczeń)", + "General settings": "Ustawienia ogólne", + "Hostname": "Nazwa hosta strumieniowej transmisji url", + "https": "Adres url transmisji strumieniowej HTTPS", + "go2rtc settings": "Ustawienia go2rtc", + "API port": "Port API", + "SRTP port": "Port SRTP", + "WebRTC port": "Port WebRTC", + "RTSP port": "Port RTSP", + "RTSP Username": "Nazwa użytkownika RTSP", + "RTSP Password": "Hasło RTSP" } \ No newline at end of file diff --git a/admin/i18n/pt/translations.json b/admin/i18n/pt/translations.json index aeafd6e..a46aa4b 100644 --- a/admin/i18n/pt/translations.json +++ b/admin/i18n/pt/translations.json @@ -12,7 +12,15 @@ "Accept incoming invitations": "Aceitar os convites recebidos", "Alarm sound duration (sec)": "Duração do som do alarme (seg)", "Livestream settings": "Configurações de transmissão ao vivo", - "Max camera livestream duration (sec)": "Duração máxima da transmissão ao vivo da câmera (segundos)", - "Automatically download video": "Descarregar vídeo automaticamente", - "Automatically download picture": "Descarregar imagem automaticamente" + "Max camera livestream duration (sec)": "Duração máxima da transmissão ao vivo da câmera (segundos; 0 = ilimitado)", + "General settings": "Definições gerais", + "Hostname": "Nome do anfitrião url de transmissão", + "https": "URL de transmissão HTTPS", + "go2rtc settings": "Definições do go2rtc", + "API port": "Porta API", + "SRTP port": "Porta SRTP", + "WebRTC port": "Porta WebRTC", + "RTSP port": "Porta RTSP", + "RTSP Username": "Nome de utilizador RTSP", + "RTSP Password": "Senha RTSP" } \ No newline at end of file diff --git a/admin/i18n/ru/translations.json b/admin/i18n/ru/translations.json index 0cb37d5..9a1c58c 100644 --- a/admin/i18n/ru/translations.json +++ b/admin/i18n/ru/translations.json @@ -12,7 +12,15 @@ "Accept incoming invitations": "Принимать входящие приглашения", "Alarm sound duration (sec)": "Длительность звукового сигнала тревоги (сек)", "Livestream settings": "Настройки прямой трансляции", - "Max camera livestream duration (sec)": "Максимальная продолжительность прямой трансляции с камеры (сек)", - "Automatically download video": "Автоматическая загрузка видео", - "Automatically download picture": "Автоматическая загрузка изображения" + "Max camera livestream duration (sec)": "Максимальная продолжительность прямой трансляции с камеры (сек; 0 = неограниченно)", + "General settings": "Общие настройки", + "Hostname": "Имя хоста потоковое url", + "https": "URL потоковой передачи HTTPS", + "go2rtc settings": "настройки go2rtc", + "API port": "API-порт", + "SRTP port": "SRTP-порт", + "WebRTC port": "WebRTC-порт", + "RTSP port": "RTSP-порт", + "RTSP Username": "RTSP Имя пользователя", + "RTSP Password": "Пароль RTSP" } \ No newline at end of file diff --git a/admin/i18n/zh-cn/translations.json b/admin/i18n/zh-cn/translations.json index d4dd90c..c87d96b 100644 --- a/admin/i18n/zh-cn/translations.json +++ b/admin/i18n/zh-cn/translations.json @@ -12,7 +12,15 @@ "Accept incoming invitations": "接受收到的邀请", "Alarm sound duration (sec)": "警报声持续时间(秒", "Livestream settings": "直播设置", - "Max camera livestream duration (sec)": "相机直播的最大持续时间(秒)", - "Automatically download video": "自动下载视频", - "Automatically download picture": "自动下载图片" + "Max camera livestream duration (sec)": "相机直播的最大持续时间(秒;0 = 无限)", + "General settings": "一般设置", + "Hostname": "主机名流媒体网址", + "https": "HTTPS流媒体网址", + "go2rtc settings": "go2rtc设置", + "API port": "API端口", + "SRTP port": "SRTP端口", + "WebRTC port": "WebRTC端口", + "RTSP port": "RTSP端口", + "RTSP Username": "RTSP用户名", + "RTSP Password": "RTSP密码" } \ No newline at end of file diff --git a/admin/index_m.html b/admin/index_m.html deleted file mode 100755 index c5da564..0000000 --- a/admin/index_m.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
-
- -
-
- -
Authentication settings
-
-
- - -
- -
- - -
-
-
Other settings
-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
-
-
- - -
-
-
-
-
Settings
-
-
- - -
-
-
-
- - - - \ No newline at end of file diff --git a/admin/jsonConfig.json b/admin/jsonConfig.json index 2eb095c..3b206da 100644 --- a/admin/jsonConfig.json +++ b/admin/jsonConfig.json @@ -100,38 +100,107 @@ "sm": 12, "md": 6, "lg": 3 + } + } + }, + "liveTab": { + "type": "panel", + "label": "Livestream settings", + "items": { + "generalHeader": { + "type": "header", + "text": "General settings", + "size": 1, + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12 }, - "autoDownloadVideo": { - "newLine": true, - "type": "checkbox", - "label": "Automatically download video", + "hostname": { + "newLine": false, + "type": "text", + "label": "Hostname", "xs": 12, "sm": 12, "md": 6, "lg": 3 }, - "autoDownloadPicture": { - "newLine": true, + "https": { "type": "checkbox", - "label": "Automatically download picture", + "label": "HTTPS streaming url", "xs": 12, "sm": 12, "md": 6, "lg": 3 - } - } - }, - "liveTab": { - "type": "panel", - "label": "Livestream settings", - "items": { + }, "maxLivestreamDuration": { + "newLine": true, "type": "number", "label": "Max camera livestream duration (sec)", "xs": 12, "sm": 12, "md": 4, "lg": 3 + }, + "go2rtcHeader": { + "type": "header", + "text": "go2rtc settings", + "size": 1, + "xs": 12, + "sm": 12, + "md": 12, + "lg": 12 + }, + "go2rtc_api_port": { + "type": "number", + "label": "API port", + "xs": 12, + "sm": 12, + "md": 4, + "lg": 3 + }, + "go2rtc_srtp_port": { + "type": "number", + "label": "SRTP port", + "xs": 12, + "sm": 12, + "md": 4, + "lg": 3 + }, + "go2rtc_webrtc_port": { + "type": "number", + "label": "WebRTC port", + "xs": 12, + "sm": 12, + "md": 4, + "lg": 3 + }, + "go2rtc_rtsp_port": { + "type": "number", + "label": "RTSP port", + "xs": 12, + "sm": 12, + "md": 4, + "lg": 3 + }, + "go2rtc_rtsp_username": { + "newLine": true, + "type": "text", + "label": "RTSP Username", + "xs": 12, + "sm": 12, + "md": 6, + "lg": 3 + }, + "go2rtc_rtsp_password": { + "type": "password", + "label": "RTSP Password", + "repeat": true, + "visible": true, + "xs": 12, + "sm": 12, + "md": 8, + "lg": 6 } } } diff --git a/admin/style.css b/admin/style.css deleted file mode 100644 index ca33ee6..0000000 --- a/admin/style.css +++ /dev/null @@ -1,31 +0,0 @@ -/* You can delete those if you want. I just found them very helpful */ -* { - box-sizing: border-box -} -.m { - /* Don't cut off dropdowns! */ - overflow: initial; -} -.m.adapter-container { - /* Fix layout/scrolling issues with tabs */ - height: 100%; - width: 100%; - position: relative; -} -.m .select-wrapper + label { - /* The positioning for dropdown labels is messed up */ - transform: none !important; -} - -label > i[title] { - /* Display the help cursor for the tooltip icons and fix their positioning */ - cursor: help; - margin-left: 0.25em; -} - -.dropdown-content { - /* Don't wrap text in dropdowns */ - white-space: nowrap; -} - -/* Add your styles here */ diff --git a/admin/tsconfig.json b/admin/tsconfig.json deleted file mode 100644 index 75ecd29..0000000 --- a/admin/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../tsconfig.json", - "include": [ - "./admin.d.ts", - "./**/*.js", - // include the adapter-config definition if it exists - "../src/lib/adapter-config.d.ts", - ] -} diff --git a/admin/words.js b/admin/words.js index c9635ba..3284c6c 100755 --- a/admin/words.js +++ b/admin/words.js @@ -51,16 +51,16 @@ systemDictionary = { "zh-cn": "轮询间隔(分钟)" }, "Max camera livestream duration (sec)": { - "en": "Max camera livestream duration (sec)", - "de": "Maximale Livestream-Dauer der Kamera (Sek.)", - "ru": "Максимальная продолжительность прямой трансляции с камеры (сек)", - "pt": "Duração máxima da transmissão ao vivo da câmera (segundos)", - "nl": "Max. Duur livestream camera (sec)", - "fr": "Durée maximale de la diffusion en direct de la caméra (s)", - "it": "Durata massima del live streaming della videocamera (sec)", - "es": "Duración máxima de la transmisión en vivo de la cámara (segundos)", - "pl": "Maksymalny czas trwania transmisji na żywo z kamery (s)", - "zh-cn": "相机直播的最大持续时间(秒)" + "en": "Max camera livestream duration (sec; 0 = unlimited)", + "de": "Maximale Livestream-Dauer der Kamera (Sek.; 0 = unbegrenzt)", + "ru": "Максимальная продолжительность прямой трансляции с камеры (сек; 0 = неограниченно)", + "pt": "Duração máxima da transmissão ao vivo da câmera (segundos; 0 = ilimitado)", + "nl": "Max. Duur livestream camera (sec; 0 = onbeperkt)", + "fr": "Durée maximale de la diffusion en direct de la caméra (s; 0 = illimité)", + "it": "Durata massima del live streaming della videocamera (sec 0 = illimitata)", + "es": "Duración máxima de la transmisión en vivo de la cámara (segundos; 0 = ilimitado)", + "pl": "Maksymalny czas trwania transmisji na żywo z kamery (s; 0 = bez ograniczeń)", + "zh-cn": "相机直播的最大持续时间(秒;0 = 无限)" }, "Time in seconds before event reset": { "en": "Time in seconds before event reset", @@ -193,29 +193,5 @@ systemDictionary = { "es": "Duración del sonido de la alarma (s)", "pl": "Czas trwania dźwięku alarmu (sek.)", "zh-cn": "警报声持续时间(秒" - }, - "Automatically download video": { - "en": "Automatically download video", - "de": "Automatisches Herunterladen von Videos", - "ru": "Автоматическая загрузка видео", - "pt": "Descarregar vídeo automaticamente", - "nl": "Video automatisch downloaden", - "fr": "Téléchargement automatique de la vidéo", - "it": "Scarica automaticamente il video", - "es": "Descarga automática de vídeo", - "pl": "Automatycznie pobieraj wideo", - "zh-cn": "自动下载视频" - }, - "Automatically download picture": { - "en": "Automatically download video", - "de": "Automatisches Herunterladen von Bildern", - "ru": "Автоматическая загрузка изображения", - "pt": "Descarregar imagem automaticamente", - "nl": "Automatisch beeld downloaden", - "fr": "Téléchargement automatique de l'image", - "it": "Scarica automaticamente l'immagine", - "es": "Descarga automática de la imagen", - "pl": "Automatyczne pobieranie obrazu", - "zh-cn": "自动下载图片" } }; \ No newline at end of file diff --git a/build/lib/types.js b/build/lib/types.js index 1132c58..1980afe 100644 --- a/build/lib/types.js +++ b/build/lib/types.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.SmartSafeStateID = exports.LockStateID = exports.IndoorCameraStateID = exports.DoorbellStateID = exports.KeyPadStateID = exports.MotionSensorStateID = exports.EntrySensorStateID = exports.StationStateID = exports.CameraStateID = exports.DeviceStateID = exports.RoleMapping = exports.IMAGE_FILE_PNG_EXT = exports.IMAGE_FILE_JPEG_EXT = exports.STREAM_FILE_NAME_EXT = exports.DataLocation = void 0; +exports.StationStateID = exports.DeviceStateID = exports.RoleMapping = exports.IMAGE_FILE_JPEG_EXT = exports.STREAM_FILE_NAME_EXT = exports.DataLocation = void 0; const eufy_security_client_1 = require("eufy-security-client"); exports.DataLocation = { LIVESTREAM: "live", @@ -9,8 +9,7 @@ exports.DataLocation = { TEMP: "tmp" }; exports.STREAM_FILE_NAME_EXT = ".m3u8"; -exports.IMAGE_FILE_JPEG_EXT = ".jpeg"; -exports.IMAGE_FILE_PNG_EXT = ".png"; +exports.IMAGE_FILE_JPEG_EXT = ".jpg"; exports.RoleMapping = { [eufy_security_client_1.PropertyName.Name]: "info.name", [eufy_security_client_1.PropertyName.StationMacAddress]: "info.mac", @@ -27,88 +26,27 @@ exports.RoleMapping = { [eufy_security_client_1.PropertyName.DeviceSensorOpen]: "sensor", [eufy_security_client_1.PropertyName.DeviceBatteryLow]: "indicator.lowbat", [eufy_security_client_1.PropertyName.DeviceLockStatus]: "info.status", + [eufy_security_client_1.PropertyName.DeviceDogLickDetected]: "sensor", + [eufy_security_client_1.PropertyName.DeviceDogPoopDetected]: "sensor", + [eufy_security_client_1.PropertyName.DeviceVehicleDetected]: "sensor", + [eufy_security_client_1.PropertyName.DeviceRadarMotionDetected]: "sensor.motion", + [eufy_security_client_1.PropertyName.DeviceStrangerPersonDetected]: "sensor.motion", + [eufy_security_client_1.PropertyName.DeviceIdentityPersonDetected]: "sensor.motion", + [eufy_security_client_1.PropertyName.DeviceChargingStatus]: "info.status", }; exports.DeviceStateID = { - NAME: "name", - MODEL: "model", - SERIAL_NUMBER: "serial_number", - HARDWARE_VERSION: "hardware_version", - SOFTWARE_VERSION: "software_version", - ENABLED: "device_enabled" -}; -exports.CameraStateID = { - ...exports.DeviceStateID, - STATE: "state", - MAC_ADDRESS: "mac_address", - LAST_EVENT_PIC_URL: "last_event_pic_url", + /*LAST_EVENT_PIC_URL: "last_event_pic_url", LAST_EVENT_PIC_HTML: "last_event_pic_html", - LAST_EVENT_VIDEO_URL: "last_event_video_url", + LAST_EVENT_VIDEO_URL: "last_event_video_url",*/ LIVESTREAM: "livestream", - LAST_LIVESTREAM_VIDEO_URL: "last_livestream_video_url", - LAST_LIVESTREAM_PIC_URL: "last_livestream_pic_url", - LAST_LIVESTREAM_PIC_HTML: "last_livestream_pic_html", START_STREAM: "start_stream", STOP_STREAM: "stop_stream", - BATTERY: "battery", - BATTERY_TEMPERATURE: "battery_temperature", - LAST_CHARGE_TOTAL_EVENTS: "last_charge_total_events", - LAST_CHARGE_USED_DAYS: "last_charge_used_days", - LAST_CHARGE_FILTERED_EVENTS: "last_charge_filtered_events", - LAST_CHARGE_SAVED_EVENTS: "last_charge_saved_events", - WIFI_RSSI: "wifi_rssi", - MOTION_DETECTED: "motion_detected", - PERSON_DETECTED: "person_detected", - LAST_PERSON_IDENTIFIED: "last_person_identified", - WATERMARK: "watermark", - ANTITHEFT_DETECTION: "antitheft_detection", - AUTO_NIGHTVISION: "auto_nightvision", - MOTION_DETECTION: "motion_detection", - LED_STATUS: "led_status", - RTSP_STREAM: "rtsp_stream", RTSP_STREAM_URL: "rtsp_stream_url", TRIGGER_ALARM_SOUND: "trigger_alarm_sound", RESET_ALARM_SOUND: "reset_alarm_sound", -}; -exports.StationStateID = { - ...exports.DeviceStateID, - GUARD_MODE: "guard_mode", - CURRENT_MODE: "current_mode", - LAN_IP_ADDRESS: "lan_ip_address", - MAC_ADDRESS: "mac_address", - REBOOT: "reboot", - CONNECTION: "connection", - TRIGGER_ALARM_SOUND: "trigger_alarm_sound", - RESET_ALARM_SOUND: "reset_alarm_sound", -}; -exports.EntrySensorStateID = { - ...exports.DeviceStateID, - STATE: "state", - SENSOR_OPEN: "sensor_open", - LOW_BATTERY: "low_battery", - SENSOR_CHANGE_TIME: "sensor_change_time", -}; -exports.MotionSensorStateID = { - ...exports.DeviceStateID, - STATE: "state", - LOW_BATTERY: "low_battery", - MOTION_DETECTED: "motion_detected", -}; -exports.KeyPadStateID = { - ...exports.DeviceStateID, - STATE: "state", - LOW_BATTERY: "low_battery", -}; -exports.DoorbellStateID = { - ...exports.CameraStateID, - RINGING: "ringing", -}; -exports.IndoorCameraStateID = { - ...exports.CameraStateID, - CRYING_DETECTED: "crying_detected", - SOUND_DETECTED: "sound_detected", - SOUND_DETECTION: "sound_detection", - PET_DETECTED: "pet_detected", - PET_DETECTION: "pet_detection", + PICTURE_URL: "picture_url", + PICTURE_HTML: "picture_html", + LIVESTREAM_RTSP: "livestream_rtsp", PAN_LEFT: "pan_left", PAN_RIGHT: "pan_right", TILT_UP: "tilt_up", @@ -116,21 +54,13 @@ exports.IndoorCameraStateID = { ROTATE_360: "rotate_360", SET_DEFAULT_ANGLE: "set_default_angle", SET_PRIVACY_ANGLE: "set_privacy_angle", -}; -exports.LockStateID = { - ...exports.DeviceStateID, - STATE: "state", - BATTERY: "battery", - WIFI_RSSI: "wifi_rssi", - LOCK: "lock", - LOCK_STATUS: "lock_status", CALIBRATE: "calibrate", -}; -exports.SmartSafeStateID = { - ...exports.DeviceStateID, - STATE: "state", - BATTERY: "battery", - WIFI_RSSI: "wifi_rssi", UNLOCK: "unlock", }; +exports.StationStateID = { + REBOOT: "reboot", + CONNECTION: "connection", + TRIGGER_ALARM_SOUND: "trigger_alarm_sound", + RESET_ALARM_SOUND: "reset_alarm_sound", +}; //# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/build/lib/types.js.map b/build/lib/types.js.map index 428187c..ba8e62d 100644 --- a/build/lib/types.js.map +++ b/build/lib/types.js.map @@ -1 +1 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":";;;AAAA,+DAAoD;AAIvC,QAAA,YAAY,GAAG;IACxB,UAAU,EAAE,MAAM;IAClB,eAAe,EAAE,WAAW;IAC5B,UAAU,EAAE,YAAY;IACxB,IAAI,EAAE,KAAK;CACd,CAAA;AAEY,QAAA,oBAAoB,GAAG,OAAO,CAAC;AAC/B,QAAA,mBAAmB,GAAG,MAAM,CAAC;AAE7B,QAAA,WAAW,GAAiB;IACrC,CAAC,mCAAY,CAAC,IAAI,CAAC,EAAE,WAAW;IAChC,CAAC,mCAAY,CAAC,iBAAiB,CAAC,EAAE,UAAU;IAC5C,CAAC,mCAAY,CAAC,mBAAmB,CAAC,EAAE,SAAS;IAC7C,CAAC,mCAAY,CAAC,WAAW,CAAC,EAAE,aAAa;IACzC,CAAC,mCAAY,CAAC,aAAa,CAAC,EAAE,eAAe;IAC7C,CAAC,mCAAY,CAAC,iBAAiB,CAAC,EAAE,mBAAmB;IACrD,CAAC,mCAAY,CAAC,oBAAoB,CAAC,EAAE,eAAe;IACpD,CAAC,mCAAY,CAAC,oBAAoB,CAAC,EAAE,eAAe;IACpD,CAAC,mCAAY,CAAC,aAAa,CAAC,EAAE,QAAQ;IACtC,CAAC,mCAAY,CAAC,oBAAoB,CAAC,EAAE,cAAc;IACnD,CAAC,mCAAY,CAAC,mBAAmB,CAAC,EAAE,cAAc;IAClD,CAAC,mCAAY,CAAC,iBAAiB,CAAC,EAAE,QAAQ;IAC1C,CAAC,mCAAY,CAAC,gBAAgB,CAAC,EAAE,QAAQ;IACzC,CAAC,mCAAY,CAAC,gBAAgB,CAAC,EAAE,kBAAkB;IACnD,CAAC,mCAAY,CAAC,gBAAgB,CAAC,EAAE,aAAa;IAC9C,CAAC,mCAAY,CAAC,qBAAqB,CAAC,EAAE,QAAQ;IAC9C,CAAC,mCAAY,CAAC,qBAAqB,CAAC,EAAE,QAAQ;IAC9C,CAAC,mCAAY,CAAC,qBAAqB,CAAC,EAAE,QAAQ;IAC9C,CAAC,mCAAY,CAAC,yBAAyB,CAAC,EAAE,eAAe;IACzD,CAAC,mCAAY,CAAC,4BAA4B,CAAC,EAAE,eAAe;IAC5D,CAAC,mCAAY,CAAC,4BAA4B,CAAC,EAAE,eAAe;IAC5D,CAAC,mCAAY,CAAC,oBAAoB,CAAC,EAAE,aAAa;CACrD,CAAA;AAEY,QAAA,aAAa,GAAG;IACzB;;mDAE+C;IAC/C,UAAU,EAAE,YAAY;IACxB,YAAY,EAAE,cAAc;IAC5B,WAAW,EAAE,aAAa;IAC1B,eAAe,EAAE,iBAAiB;IAClC,mBAAmB,EAAE,qBAAqB;IAC1C,iBAAiB,EAAE,mBAAmB;IACtC,WAAW,EAAE,aAAa;IAC1B,YAAY,EAAE,cAAc;IAC5B,eAAe,EAAE,iBAAiB;IAClC,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,YAAY;IACxB,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;CACnB,CAAA;AAEY,QAAA,cAAc,GAAG;IAC1B,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;IACxB,mBAAmB,EAAE,qBAAqB;IAC1C,iBAAiB,EAAE,mBAAmB;CACzC,CAAA"} \ No newline at end of file diff --git a/build/lib/utils.js b/build/lib/utils.js index b3b86fd..6180d50 100644 --- a/build/lib/utils.js +++ b/build/lib/utils.js @@ -26,13 +26,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.convertCamelCaseToSnakeCase = exports.handleUpdate = exports.removeLastChar = exports.getVideoClipLength = exports.sleep = exports.lowestUnusedNumber = exports.moveFiles = exports.removeFiles = exports.saveImageStates = exports.setStateAsync = exports.saveImage = exports.getDataFilePath = exports.getImageAsHTML = exports.getImage = exports.isEmpty = exports.setStateChangedAsync = void 0; -const got_1 = __importDefault(require("got")); +exports.convertCamelCaseToSnakeCase = exports.handleUpdate = exports.deleteStates = exports.changeRole = exports.removeLastChar = exports.getVideoClipLength = exports.sleep = exports.lowestUnusedNumber = exports.moveFiles = exports.removeFiles = exports.setStateAsync = exports.getDataFilePath = exports.getImageAsHTML = exports.isEmpty = exports.setStateChangedAsync = void 0; const eufy_security_client_1 = require("eufy-security-client"); const path_1 = __importDefault(require("path")); const fs_extra_1 = __importDefault(require("fs-extra")); const utils = __importStar(require("@iobroker/adapter-core")); -const types_1 = require("./types"); // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types const setStateChangedAsync = async function (adapter, id, value) { return await adapter.setStateChangedAsync(id, value === undefined || value === null ? null : { val: value, ack: true }).catch(); @@ -47,23 +45,9 @@ const isEmpty = function (str) { return true; }; exports.isEmpty = isEmpty; -const getImage = async function (url) { - const response = await (0, got_1.default)(url, { - method: "GET", - responseType: "buffer", - http2: true, - throwHttpErrors: false, - retry: { - limit: 3, - methods: ["GET"] - } - }); - return response; -}; -exports.getImage = getImage; -const getImageAsHTML = function (data) { +const getImageAsHTML = function (data, mime = "image/jpg") { if (data && data.length > 0) - return ``; + return ``; return ""; }; exports.getImageAsHTML = getImageAsHTML; @@ -75,40 +59,6 @@ const getDataFilePath = function (adapter, stationSerial, folderName, fileName) return path_1.default.join(dir_path, fileName); }; exports.getDataFilePath = getDataFilePath; -const saveImage = async function (adapter, url, station_sn, device_sn, location) { - const result = { - status: 0, - statusText: "", - imageUrl: "", - imageHtml: "" - }; - try { - if (url) { - const response = await (0, exports.getImage)(url); - result.status = response.statusCode; - result.statusText = response.statusMessage ? response.statusMessage : ""; - if (result.status === 200) { - const data = response.body; - const fileName = `${device_sn}${types_1.IMAGE_FILE_JPEG_EXT}`; - const filePath = path_1.default.join(utils.getAbsoluteInstanceDataDir(adapter), station_sn, location); - if (!fs_extra_1.default.existsSync(filePath)) { - fs_extra_1.default.mkdirSync(filePath, { mode: 0o775, recursive: true }); - } - await fs_extra_1.default.writeFile(path_1.default.join(filePath, fileName), data).then(() => { - result.imageUrl = `/${adapter.namespace}/${station_sn}/${location}/${device_sn}${types_1.IMAGE_FILE_JPEG_EXT}`; - result.imageHtml = (0, exports.getImageAsHTML)(data); - }).catch(error => { - adapter.log.error(`saveImage(): writeFile Error: ${error} - url: ${url}`); - }); - } - } - } - catch (error) { - adapter.log.error(`saveImage(): Error: ${error} - url: ${url}`); - } - return result; -}; -exports.saveImage = saveImage; const setStateAsync = async function (adapter, state_id, common_name, value, role = "text", type = "string") { await adapter.setObjectNotExistsAsync(state_id, { type: "state", @@ -124,28 +74,6 @@ const setStateAsync = async function (adapter, state_id, common_name, value, rol await adapter.setStateAsync(state_id, { val: value, ack: true }); }; exports.setStateAsync = setStateAsync; -const saveImageStates = async function (adapter, url, station_sn, device_sn, location, url_state_id, html_state_id, prefix_common_name, retry = 1) { - if (adapter.config.autoDownloadPicture) { - const image_data = await (0, exports.saveImage)(adapter, url, station_sn, device_sn, location); - if (image_data.status === 404) { - if (retry < 6) { - adapter.log.info(`Retry get image in ${5 * retry} seconds from url: ${url} (retry_count: ${retry} error: ${image_data.statusText} message: ${image_data.statusText})...`); - setTimeout(() => { - (0, exports.saveImageStates)(adapter, url, station_sn, device_sn, location, url_state_id, html_state_id, prefix_common_name, ++retry); - }, 5 * 1000 * retry); - } - else { - adapter.log.warn(`Could not download the image within 5 attempts from url: ${url} (error: ${image_data.statusText} message: ${image_data.statusText})`); - } - return; - } - else if (image_data.status === 200) { - (0, exports.setStateAsync)(adapter, url_state_id, `${prefix_common_name} URL`, image_data.imageUrl, "url"); - (0, exports.setStateAsync)(adapter, html_state_id, `${prefix_common_name} HTML image`, image_data.imageHtml, "html"); - } - } -}; -exports.saveImageStates = saveImageStates; const removeFiles = function (adapter, stationSerial, folderName, device_sn) { return new Promise((resolve, reject) => { try { @@ -243,139 +171,33 @@ const removeLastChar = function (text, char) { return strArr.join(""); }; exports.removeLastChar = removeLastChar; -const handleUpdate = async function (adapter, log, old_version) { - if (old_version <= 0.31) { - try { - const watermark = await adapter.getStatesAsync("*.watermark"); - if (watermark) - Object.keys(watermark).forEach(async (id) => { - await adapter.delObjectAsync(id).catch(); - }); - } - catch (error) { - log.error("Version 0.3.1 - watermark: Error:", error); - } - try { - const state = await adapter.getStatesAsync("*.state"); - if (state) - Object.keys(state).forEach(async (id) => { - await adapter.delObjectAsync(id).catch(); - }); - } - catch (error) { - log.error("Version 0.3.1 - state: Error:", error); - } - try { - const wifi_rssi = await adapter.getStatesAsync("*.wifi_rssi"); - if (wifi_rssi) - Object.keys(wifi_rssi).forEach(async (id) => { - await adapter.delObjectAsync(id).catch(); - }); - } - catch (error) { - log.error("Version 0.3.1 - wifi_rssi: Error:", error); - } - } - if (old_version <= 0.41) { - try { - const changeRole = async function (adapter, state, role) { - try { - const states = await adapter.getStatesAsync(`*.${state}`); - if (states) - Object.keys(states).forEach(async (id) => { - await adapter.extendObjectAsync(id, { - type: "state", - common: { - role: role - } - }, {}).catch(); - }); - } - catch (error) { - log.error(`state: ${state} role: ${role} - Error:`, error); - } - }; - await changeRole(adapter, types_1.CameraStateID.STATE, "value"); - await changeRole(adapter, types_1.CameraStateID.LIVESTREAM, "url"); - await changeRole(adapter, types_1.CameraStateID.LAST_LIVESTREAM_PIC_URL, "url"); - await changeRole(adapter, types_1.CameraStateID.LAST_LIVESTREAM_PIC_HTML, "html"); - await changeRole(adapter, types_1.CameraStateID.LAST_LIVESTREAM_VIDEO_URL, "url"); - await changeRole(adapter, types_1.CameraStateID.ENABLED, "switch.enable"); - await changeRole(adapter, types_1.CameraStateID.ANTITHEFT_DETECTION, "switch.enable"); - await changeRole(adapter, types_1.CameraStateID.AUTO_NIGHTVISION, "switch.enable"); - await changeRole(adapter, types_1.CameraStateID.MOTION_DETECTION, "switch.enable"); - await changeRole(adapter, types_1.CameraStateID.RTSP_STREAM, "switch.enable"); - await changeRole(adapter, types_1.CameraStateID.RTSP_STREAM_URL, "url"); - await changeRole(adapter, types_1.CameraStateID.LED_STATUS, "switch.enable"); - await changeRole(adapter, types_1.CameraStateID.MOTION_DETECTED, "sensor.motion"); - await changeRole(adapter, types_1.CameraStateID.PERSON_DETECTED, "sensor.motion"); - await changeRole(adapter, types_1.CameraStateID.LAST_PERSON_IDENTIFIED, "text"); - await changeRole(adapter, types_1.CameraStateID.LAST_EVENT_PIC_URL, "url"); - await changeRole(adapter, types_1.CameraStateID.LAST_EVENT_PIC_HTML, "html"); - await changeRole(adapter, types_1.CameraStateID.LAST_EVENT_VIDEO_URL, "url"); - await changeRole(adapter, types_1.DoorbellStateID.RINGING, "sensor"); - await changeRole(adapter, types_1.IndoorCameraStateID.SOUND_DETECTION, "switch.enable"); - await changeRole(adapter, types_1.IndoorCameraStateID.PET_DETECTION, "switch.enable"); - await changeRole(adapter, types_1.IndoorCameraStateID.SOUND_DETECTED, "sensor.noise"); - await changeRole(adapter, types_1.IndoorCameraStateID.CRYING_DETECTED, "sensor.noise"); - await changeRole(adapter, types_1.IndoorCameraStateID.PET_DETECTED, "sensor"); - await changeRole(adapter, types_1.EntrySensorStateID.STATE, "value"); - await changeRole(adapter, types_1.EntrySensorStateID.SENSOR_OPEN, "sensor"); - await changeRole(adapter, types_1.EntrySensorStateID.LOW_BATTERY, "sensor"); - await changeRole(adapter, types_1.EntrySensorStateID.SENSOR_CHANGE_TIME, "value"); - await changeRole(adapter, types_1.MotionSensorStateID.STATE, "value"); - await changeRole(adapter, types_1.MotionSensorStateID.LOW_BATTERY, "sensor"); - await changeRole(adapter, types_1.MotionSensorStateID.MOTION_DETECTED, "sensor.motion"); - await changeRole(adapter, types_1.KeyPadStateID.STATE, "value"); - await changeRole(adapter, types_1.KeyPadStateID.LOW_BATTERY, "sensor"); - await changeRole(adapter, types_1.StationStateID.CURRENT_MODE, "value"); - } - catch (error) { - log.error("Version 0.4.1 - Error:", error); - } +const changeRole = async function (adapter, log, state, role) { + try { + const states = await adapter.getStatesAsync(`*.${state}`); + if (states) + Object.keys(states).forEach(async (id) => { + await adapter.extendObjectAsync(id, { + type: "state", + common: { + role: role + } + }, {}).catch(); + }); } - if (old_version <= 0.42) { - try { - const changeRole = async function (adapter, state, role) { - try { - const states = await adapter.getStatesAsync(`*.${state}`); - if (states) - Object.keys(states).forEach(async (id) => { - await adapter.extendObjectAsync(id, { - type: "state", - common: { - role: role - } - }, {}).catch(); - }); - } - catch (error) { - log.error(`state: ${state} role: ${role} - Error:`, error); - } - }; - await changeRole(adapter, types_1.CameraStateID.STATE, "info.status"); - await changeRole(adapter, types_1.CameraStateID.NAME, "info.name"); - await changeRole(adapter, types_1.CameraStateID.MAC_ADDRESS, "info.mac"); - await changeRole(adapter, types_1.CameraStateID.BATTERY, "value.battery"); - await changeRole(adapter, types_1.CameraStateID.BATTERY_TEMPERATURE, "value.temperature"); - await changeRole(adapter, types_1.EntrySensorStateID.LOW_BATTERY, "indicator.lowbat"); - await changeRole(adapter, types_1.StationStateID.LAN_IP_ADDRESS, "info.ip"); - } - catch (error) { - log.error("Version 0.4.2 - States - Error:", error); - } - try { - if (fs_extra_1.default.existsSync(path_1.default.join(utils.getAbsoluteDefaultDataDir(), "files", adapter.namespace))) { - if (!fs_extra_1.default.existsSync(utils.getAbsoluteInstanceDataDir(adapter))) - fs_extra_1.default.mkdirpSync(utils.getAbsoluteInstanceDataDir(adapter)); - const files = fs_extra_1.default.readdirSync(path_1.default.join(utils.getAbsoluteDefaultDataDir(), "files", adapter.namespace)).filter(fn => fn.startsWith("T")); - files.map(filename => fs_extra_1.default.moveSync(path_1.default.join(utils.getAbsoluteDefaultDataDir(), "files", adapter.namespace, filename), path_1.default.join(utils.getAbsoluteInstanceDataDir(adapter), filename))); - } - } - catch (error) { - log.error("Version 0.4.2 - Files - Error:", error); - } + catch (error) { + log.error(`state: ${state} role: ${role} - Error:`, error); } +}; +exports.changeRole = changeRole; +const deleteStates = async function (adapter, property) { + const states = await adapter.getStatesAsync(`*.${property}`); + if (states) + Object.keys(states).forEach(async (id) => { + await adapter.delObjectAsync(id).catch(); + }); +}; +exports.deleteStates = deleteStates; +const handleUpdate = async function (adapter, log, old_version) { if (old_version <= 0.61) { try { const all = await adapter.getStatesAsync("T*"); @@ -421,6 +243,16 @@ const handleUpdate = async function (adapter, log, old_version) { log.error("Version 0.7.4: Error:", error); } } + if (old_version <= 1) { + for (const state of ["last_event_pic_url", "last_event_pic_html", "last_event_video_url"]) { + try { + await (0, exports.deleteStates)(adapter, state); + } + catch (error) { + log.error(`Version 1.0.0 - ${state}: Error:`, error); + } + } + } }; exports.handleUpdate = handleUpdate; const convertCamelCaseToSnakeCase = function (value) { diff --git a/build/lib/utils.js.map b/build/lib/utils.js.map index 748d097..f034ba5 100644 --- a/build/lib/utils.js.map +++ b/build/lib/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/lib/video.js b/build/lib/video.js index 08d498a..424bd97 100644 --- a/build/lib/video.js +++ b/build/lib/video.js @@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.ffmpegRTMPToHls = exports.ffmpegStreamToHls = exports.ffmpegPreviewImage = exports.StreamOutput = exports.StreamInput = void 0; +exports.ffmpegStreamToGo2rtc = exports.ffmpegStreamToHls = exports.ffmpegPreviewImage = exports.StreamOutput = exports.StreamInput = void 0; const net_1 = __importDefault(require("net")); const path_1 = __importDefault(require("path")); const fluent_ffmpeg_1 = __importDefault(require("@bropat/fluent-ffmpeg")); @@ -104,12 +104,6 @@ const ffmpegStreamToHls = (config, namespace, metadata, videoStream, audioStream audioStream.on("error", (error) => { log.error("ffmpegStreamToHls(): Audiostream Error", error); }); - //TODO: For debugging purposes - /*const outputFile = path.resolve(__dirname, "../../test-stream.dump"); - videoStream.pipe(fse.createWriteStream(outputFile)).on("finish", () => { - log.debug("videoStream dump finished!"); - log.info("Manually test the output by running# ffplay output/test-stream.dump"); - });*/ const uVideoStream = (0, exports.StreamInput)(namespace, videoStream); const uAudioStream = (0, exports.StreamInput)(namespace, audioStream); let videoFormat = "h264"; @@ -185,61 +179,94 @@ const ffmpegStreamToHls = (config, namespace, metadata, videoStream, audioStream }); }; exports.ffmpegStreamToHls = ffmpegStreamToHls; -const ffmpegRTMPToHls = (config, rtmp_url, output, log) => { - let resolveCb; - let ffmpegCommand; - const rtmpPromise = new Promise((resolve, reject) => { - resolveCb = resolve; +const ffmpegStreamToGo2rtc = (config, namespace, camera, metadata, videoStream, audioStream, log) => { + return new Promise((resolve, reject) => { try { if (ffmpeg_static_1.default) { fluent_ffmpeg_1.default.setFfmpegPath(ffmpeg_static_1.default); - ffmpegCommand = (0, fluent_ffmpeg_1.default)(rtmp_url) + log.warn("ffmpegStreamToGo2rtc(): Started"); + videoStream.on("error", (error) => { + log.error("ffmpegStreamToGo2rtc(): Videostream Error", error); + }); + audioStream.on("error", (error) => { + log.error("ffmpegStreamToGo2rtc(): Audiostream Error", error); + }); + //TODO: For debugging purposes + /*const outputFile = path.resolve(__dirname, "../../test-stream.dump"); + videoStream.pipe(fse.createWriteStream(outputFile)).on("finish", () => { + log.debug("videoStream dump finished!"); + log.info("Manually test the output by running# ffplay output/test-stream.dump"); + });*/ + const uVideoStream = (0, exports.StreamInput)(namespace, videoStream); + const uAudioStream = (0, exports.StreamInput)(namespace, audioStream); + let videoFormat = "h264"; + let audioFormat = ""; + const options = [ + "-rtsp_transport tcp", + "-sc_threshold 0", + `-g ${metadata.videoFPS}`, + "-fflags genpts+nobuffer+flush_packets", + //"-rtpflags latm", + ]; + switch (metadata.videoCodec) { + case eufy_security_client_1.VideoCodec.H264: + videoFormat = "h264"; + break; + case eufy_security_client_1.VideoCodec.H265: + videoFormat = "hevc"; + break; + } + switch (metadata.audioCodec) { + case eufy_security_client_1.AudioCodec.AAC: + audioFormat = "aac"; + break; + } + const command = (0, fluent_ffmpeg_1.default)() .withProcessOptions({ detached: true }) - .videoCodec("copy") - .audioCodec("copy") - .output(output) - .addOptions([ - "-hls_init_time 0", - "-hls_time 2", - "-hls_segment_type mpegts", - "-absf aac_adtstoasc", - //"-start_number 1", - "-sc_threshold 0", - "-g 15", - "-fflags genpts+nobuffer+flush_packets", - //"-flush_packets 1", - "-hls_playlist_type event" - ]) + .input(uVideoStream.url) + .inputFormat(videoFormat) + .inputFps(metadata.videoFPS) + .videoCodec("copy"); + if (audioFormat !== "") { + command.input(uAudioStream.url) + .inputFormat(audioFormat) + //.audioCodec("copy"); + //.audioCodec("aac"); + .audioCodec("opus"); + } + else { + log.warn(`ffmpegStreamToGo2rtc(): Not support audio codec or unknown audio codec (${eufy_security_client_1.AudioCodec[metadata.audioCodec]})`); + } + command.output(`rtsp://localhost:${config.go2rtc_rtsp_port}/${camera}`) + .outputFormat("rtsp") + .addOptions(options) .on("error", function (err, stdout, stderr) { - log.error(`ffmpegRTMPToHls(): An error occurred: ${err.message}`); - log.error(`ffmpegRTMPToHls(): ffmpeg output:\n${stdout}`); - log.error(`ffmpegRTMPToHls(): ffmpeg stderr:\n${stderr}`); + log.error(`ffmpegStreamToGo2rtc(): An error occurred: ${err.message}`); + log.error(`ffmpegStreamToGo2rtc(): ffmpeg output:\n${stdout}`); + log.error(`ffmpegStreamToGo2rtc(): ffmpeg stderr:\n${stderr}`); + uVideoStream.close(); + uAudioStream.close(); reject(err); }) .on("end", () => { - log.debug("ffmpegRTMPToHls(): Processing finished!"); + log.debug("ffmpegStreamToGo2rtc(): Processing finished!"); + uVideoStream.close(); + uAudioStream.close(); resolve(); }); - ffmpegCommand.run(); + command.run(); } else { reject(new Error("ffmpeg binary not found")); } } catch (error) { - log.error(`ffmpegRTMPToHls(): Error: ${error}`); + log.error(`ffmpegStreamToGo2rtc(): Error: ${error}`); reject(error); } }); - rtmpPromise.stop = () => { - ffmpegCommand.removeAllListeners(); - //ffmpegCommand.kill("SIGINT"); - ffmpegCommand.quit(); - resolveCb(); - }; - return rtmpPromise; }; -exports.ffmpegRTMPToHls = ffmpegRTMPToHls; +exports.ffmpegStreamToGo2rtc = ffmpegStreamToGo2rtc; //# sourceMappingURL=video.js.map \ No newline at end of file diff --git a/build/lib/video.js.map b/build/lib/video.js.map index 5c0da1f..dd4888e 100644 --- a/build/lib/video.js.map +++ b/build/lib/video.js.map @@ -1 +1 @@ -{"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/lib/video.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/lib/video.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAsB;AACtB,gDAAwB;AACxB,0EAA2C;AAC3C,kEAAyC;AAEzC,+DAA8E;AAC9E,2BAA4B;AAC5B,wDAA2B;AAG3B,mCAA6C;AAE7C,MAAM,eAAe;IAOjB,YAAa,SAAiB,EAAE,QAAoD;QAChF,IAAI,QAAQ,GAAG,EAAE,CAAC;QAElB,MAAM,cAAc,GAAG,IAAA,0BAAkB,EAAC,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACzE,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC;QAE9B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE;YAC9B,MAAM,UAAU,GAAG,eAAe,CAAC;YACnC,MAAM,QAAQ,GAAG,eAAe,SAAS,IAAI,cAAc,OAAO,CAAC;YAEnE,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC3C,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;SACvB;aACI;YACD,MAAM,QAAQ,GAAG,GAAG,SAAS,IAAI,cAAc,OAAO,CAAC;YACvD,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,IAAA,WAAM,GAAE,EAAE,QAAQ,CAAC,CAAC;YACzC,IAAI,CAAC,GAAG,GAAG,OAAO,GAAG,QAAQ,CAAC;YAE9B,IAAI;gBACA,IAAI,kBAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;oBACxB,kBAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;aAChC;YAAC,OAAM,KAAK,EAAE;aACd;SACJ;QAED,IAAI,CAAC,MAAM,GAAG,aAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAEM,KAAK;QACR,IAAI,IAAI,CAAC,MAAM;YACX,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACxB,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;;AAtCc,qBAAK,GAAG,IAAI,GAAG,EAAU,CAAC;AA0CtC,MAAM,WAAW,GAAG,UAAS,SAAiB,EAAE,MAA6B;IAChF,OAAO,IAAI,eAAe,CAAC,SAAS,EAAE,CAAC,MAAkB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AACrG,CAAC,CAAA;AAFY,QAAA,WAAW,eAEvB;AAEM,MAAM,YAAY,GAAG,UAAS,SAAiB,EAAE,MAA6B;IACjF,OAAO,IAAI,eAAe,CAAC,SAAS,EAAE,CAAC,MAAkB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AACrG,CAAC,CAAA;AAFY,QAAA,YAAY,gBAExB;AAEM,MAAM,kBAAkB,GAAG,CAAC,MAA8B,EAAE,KAAY,EAAE,MAAc,EAAE,GAAmB,EAAE,YAAY,GAAG,GAAG,EAAiB,EAAE;IACvJ,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,IAAI;YACA,IAAI,uBAAY,EAAE;gBACd,uBAAM,CAAC,aAAa,CAAC,uBAAY,CAAC,CAAC;gBAEnC,IAAA,uBAAM,GAAE;qBACH,kBAAkB,CAAC;oBAChB,QAAQ,EAAE,IAAI;iBACjB,CAAC;qBACD,UAAU,CAAC;oBACR,OAAO,YAAY,EAAE;oBACrB,aAAa;iBAChB,CAAC;qBACD,KAAK,CAAC,KAAK,CAAC;qBACZ,WAAW,CAAC,KAAK,CAAC;qBAClB,YAAY,CAAC,QAAQ,CAAC;qBACtB,MAAM,CAAC,MAAM,CAAC;qBACd,EAAE,CAAC,OAAO,EAAE,UAAS,GAAG,EAAE,MAAM,EAAE,MAAM;oBACrC,GAAG,CAAC,KAAK,CAAC,4CAA4C,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBACrE,GAAG,CAAC,KAAK,CAAC,yCAAyC,MAAM,EAAE,CAAC,CAAC;oBAC7D,GAAG,CAAC,KAAK,CAAC,yCAAyC,MAAM,EAAE,CAAC,CAAC;oBAC7D,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC,CAAC;qBACD,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;oBACZ,GAAG,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;oBAC5D,OAAO,EAAE,CAAC;gBACd,CAAC,CAAC;qBACD,GAAG,EAAE,CAAC;aACd;iBAAM;gBACH,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;aAChD;SACJ;QAAC,OAAO,KAAK,EAAE;YACZ,GAAG,CAAC,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,CAAC;SACjB;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAA;AArCY,QAAA,kBAAkB,sBAqC9B;AAEM,MAAM,iBAAiB,GAAG,CAAC,MAA8B,EAAE,SAAiB,EAAE,QAAwB,EAAE,WAAqB,EAAE,WAAqB,EAAE,MAAc,EAAE,GAAmB,EAAiB,EAAE;IAC/M,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,IAAI;YACA,IAAI,uBAAY,EAAE;gBACd,uBAAM,CAAC,aAAa,CAAC,uBAAY,CAAC,CAAC;gBAEnC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC9B,GAAG,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;gBAC/D,CAAC,CAAC,CAAC;gBAEH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC9B,GAAG,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;gBAC/D,CAAC,CAAC,CAAC;gBAEH,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBACzD,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBAEzD,IAAI,WAAW,GAAG,MAAM,CAAC;gBACzB,IAAI,WAAW,GAAG,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAa;oBACtB,kBAAkB;oBAClB,aAAa;oBACb,0BAA0B;oBAC1B,oBAAoB;oBACpB,iBAAiB;oBACjB,MAAM,QAAQ,CAAC,QAAQ,EAAE;oBACzB,uCAAuC;oBACvC,qBAAqB;oBACrB,0BAA0B;oBAC1B,4BAA4B;iBAC/B,CAAC;gBAEF,QAAO,QAAQ,CAAC,UAAU,EAAE;oBACxB,KAAK,iCAAU,CAAC,IAAI;wBAChB,WAAW,GAAG,MAAM,CAAC;wBACrB,MAAM;oBACV,KAAK,iCAAU,CAAC,IAAI;wBAChB,WAAW,GAAG,MAAM,CAAC;wBACrB,MAAM;iBACb;gBAED,QAAO,QAAQ,CAAC,UAAU,EAAE;oBACxB,KAAK,iCAAU,CAAC,GAAG;wBACf,WAAW,GAAG,KAAK,CAAC;wBACpB,MAAM;iBACb;gBAED,MAAM,OAAO,GAAG,IAAA,uBAAM,GAAE;qBACnB,kBAAkB,CAAC;oBAChB,QAAQ,EAAE,IAAI;iBACjB,CAAC;qBACD,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC;qBACvB,WAAW,CAAC,WAAW,CAAC;qBACxB,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACjC,IAAI,WAAW,KAAK,EAAE,EAAE;oBACpB,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC;yBAC1B,WAAW,CAAC,WAAW,CAAC;yBACxB,UAAU,CAAC,MAAM,CAAC;yBAClB,UAAU,CAAC,MAAM,CAAC,CAAC;oBACxB,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;iBACvC;qBAAM;oBACH,GAAG,CAAC,IAAI,CAAC,wEAAwE,iCAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;iBACxH;gBACD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;qBACjB,UAAU,CAAC,OAAO,CAAC;qBACnB,EAAE,CAAC,OAAO,EAAE,UAAS,GAAG,EAAE,MAAM,EAAE,MAAM;oBACrC,GAAG,CAAC,KAAK,CAAC,2CAA2C,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBACpE,GAAG,CAAC,KAAK,CAAC,wCAAwC,MAAM,EAAE,CAAC,CAAC;oBAC5D,GAAG,CAAC,KAAK,CAAC,wCAAwC,MAAM,EAAE,CAAC,CAAC;oBAC5D,YAAY,CAAC,KAAK,EAAE,CAAC;oBACrB,YAAY,CAAC,KAAK,EAAE,CAAC;oBACrB,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC,CAAC;qBACD,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;oBACZ,GAAG,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;oBACvD,YAAY,CAAC,KAAK,EAAE,CAAC;oBACrB,YAAY,CAAC,KAAK,EAAE,CAAC;oBACrB,OAAO,EAAE,CAAC;gBACd,CAAC,CAAC,CAAC;gBACP,OAAO,CAAC,GAAG,EAAE,CAAC;aACjB;iBAAM;gBACH,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;aAChD;SACJ;QAAC,OAAO,KAAK,EAAE;YACZ,GAAG,CAAC,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,CAAC;SACjB;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAA;AAxFY,QAAA,iBAAiB,qBAwF7B;AAEM,MAAM,oBAAoB,GAAG,CAAC,MAA8B,EAAE,SAAiB,EAAE,MAAc,EAAE,QAAwB,EAAE,WAAqB,EAAE,WAAqB,EAAE,GAAmB,EAAiB,EAAE;IAClN,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,IAAI;YACA,IAAI,uBAAY,EAAE;gBACd,uBAAM,CAAC,aAAa,CAAC,uBAAY,CAAC,CAAC;gBAEnC,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;gBAE5C,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC9B,GAAG,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;gBAClE,CAAC,CAAC,CAAC;gBAEH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC9B,GAAG,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;gBAClE,CAAC,CAAC,CAAC;gBAEH,8BAA8B;gBAC9B;;;;qBAIK;gBAEL,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBACzD,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBAEzD,IAAI,WAAW,GAAG,MAAM,CAAC;gBACzB,IAAI,WAAW,GAAG,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAa;oBACtB,qBAAqB;oBACrB,iBAAiB;oBACjB,MAAM,QAAQ,CAAC,QAAQ,EAAE;oBACzB,uCAAuC;oBACvC,mBAAmB;iBACtB,CAAC;gBAEF,QAAO,QAAQ,CAAC,UAAU,EAAE;oBACxB,KAAK,iCAAU,CAAC,IAAI;wBAChB,WAAW,GAAG,MAAM,CAAC;wBACrB,MAAM;oBACV,KAAK,iCAAU,CAAC,IAAI;wBAChB,WAAW,GAAG,MAAM,CAAC;wBACrB,MAAM;iBACb;gBAED,QAAO,QAAQ,CAAC,UAAU,EAAE;oBACxB,KAAK,iCAAU,CAAC,GAAG;wBACf,WAAW,GAAG,KAAK,CAAC;wBACpB,MAAM;iBACb;gBAED,MAAM,OAAO,GAAG,IAAA,uBAAM,GAAE;qBACnB,kBAAkB,CAAC;oBAChB,QAAQ,EAAE,IAAI;iBACjB,CAAC;qBACD,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC;qBACvB,WAAW,CAAC,WAAW,CAAC;qBACxB,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;qBAC3B,UAAU,CAAC,MAAM,CAAC,CAAC;gBACxB,IAAI,WAAW,KAAK,EAAE,EAAE;oBACpB,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC;yBAC1B,WAAW,CAAC,WAAW,CAAC;wBACzB,sBAAsB;wBACtB,qBAAqB;yBACpB,UAAU,CAAC,MAAM,CAAC,CAAC;iBAC3B;qBAAM;oBACH,GAAG,CAAC,IAAI,CAAC,2EAA2E,iCAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;iBAC3H;gBACD,OAAO,CAAC,MAAM,CAAC,oBAAoB,MAAM,CAAC,gBAAgB,IAAI,MAAM,EAAE,CAAC;qBAClE,YAAY,CAAC,MAAM,CAAC;qBACpB,UAAU,CAAC,OAAO,CAAC;qBACnB,EAAE,CAAC,OAAO,EAAE,UAAS,GAAG,EAAE,MAAM,EAAE,MAAM;oBACrC,GAAG,CAAC,KAAK,CAAC,8CAA8C,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBACvE,GAAG,CAAC,KAAK,CAAC,2CAA2C,MAAM,EAAE,CAAC,CAAC;oBAC/D,GAAG,CAAC,KAAK,CAAC,2CAA2C,MAAM,EAAE,CAAC,CAAC;oBAC/D,YAAY,CAAC,KAAK,EAAE,CAAC;oBACrB,YAAY,CAAC,KAAK,EAAE,CAAC;oBACrB,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC,CAAC;qBACD,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;oBACZ,GAAG,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;oBAC1D,YAAY,CAAC,KAAK,EAAE,CAAC;oBACrB,YAAY,CAAC,KAAK,EAAE,CAAC;oBACrB,OAAO,EAAE,CAAC;gBACd,CAAC,CAAC,CAAC;gBACP,OAAO,CAAC,GAAG,EAAE,CAAC;aACjB;iBAAM;gBACH,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;aAChD;SACJ;QAAC,OAAO,KAAK,EAAE;YACZ,GAAG,CAAC,KAAK,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,CAAC;SACjB;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAA;AA9FY,QAAA,oBAAoB,wBA8FhC"} \ No newline at end of file diff --git a/build/main.js b/build/main.js index f233158..51e73a2 100644 --- a/build/main.js +++ b/build/main.js @@ -37,6 +37,9 @@ const i18n_iso_countries_1 = require("i18n-iso-countries"); const i18n_iso_languages_1 = require("@cospired/i18n-iso-languages"); const fs_extra_1 = __importDefault(require("fs-extra")); const util_1 = __importDefault(require("util")); +const child_process_1 = __importDefault(require("child_process")); +const go2rtc_static_1 = __importDefault(require("go2rtc-static")); +const os_1 = __importDefault(require("os")); const types_1 = require("./lib/types"); const utils_1 = require("./lib/utils"); const log_1 = require("./lib/log"); @@ -47,11 +50,9 @@ class euSec extends utils.Adapter { ...options, name: "eusec", }); - this.downloadEvent = {}; this.persistentData = { version: "" }; - this.rtmpFFmpegPromise = new Map(); this.captchaId = null; this.verify_code = false; const data_dir = utils.getAbsoluteInstanceDataDir(this); @@ -194,6 +195,9 @@ class euSec extends utils.Adapter { if ((0, i18n_iso_languages_1.isValid)(systemConfig.common.language)) languageCode = systemConfig.common.language; } + if (this.config.hostname === "") { + this.config.hostname = os_1.default.hostname(); + } // Handling adapter version update try { if (this.persistentData.version !== this.version) { @@ -224,7 +228,6 @@ class euSec extends utils.Adapter { p2pConnectionSetup: connectionType, pollingIntervalMinutes: this.config.pollingInterval, acceptInvitations: this.config.acceptInvitations, - //trustedDeviceName: "IOBROKER", }; this.eufy = await eufy_security_client_1.EufySecurity.initialize(config, this.logger); this.eufy.on("station added", (station) => this.onStationAdded(station)); @@ -238,12 +241,10 @@ class euSec extends utils.Adapter { this.eufy.on("mqtt close", () => this.onMQTTClose()); this.eufy.on("connect", () => this.onConnect()); this.eufy.on("close", () => this.onClose()); - this.eufy.on("cloud livestream start", (station, device, url) => this.onCloudLivestreamStart(station, device, url)); - this.eufy.on("cloud livestream stop", (station, device) => this.onCloudLivestreamStop(station, device)); this.eufy.on("device property changed", (device, name, value) => this.onDevicePropertyChanged(device, name, value)); this.eufy.on("station command result", (station, result) => this.onStationCommandResult(station, result)); - this.eufy.on("station download start", (station, device, metadata, videostream, audiostream) => this.onStationDownloadStart(station, device, metadata, videostream, audiostream)); - this.eufy.on("station download finish", (station, device) => this.onStationDownloadFinish(station, device)); + //this.eufy.on("station download start", (station: Station, device: Device, metadata: StreamMetadata, videostream: Readable, audiostream: Readable) => this.onStationDownloadStart(station, device, metadata, videostream, audiostream)); + //this.eufy.on("station download finish", (station: Station, device: Device) => this.onStationDownloadFinish(station, device)); this.eufy.on("station livestream start", (station, device, metadata, videostream, audiostream) => this.onStationLivestreamStart(station, device, metadata, videostream, audiostream)); this.eufy.on("station livestream stop", (station, device) => this.onStationLivestreamStop(station, device)); this.eufy.on("station rtsp url", (station, device, value) => this.onStationRTSPUrl(station, device, value)); @@ -254,6 +255,48 @@ class euSec extends utils.Adapter { this.eufy.on("captcha request", (captchaId, captcha) => this.onCaptchaRequest(captchaId, captcha)); this.eufy.setCameraMaxLivestreamDuration(this.config.maxLivestreamDuration); await this.eufy.connect(); + if (go2rtc_static_1.default) { + const go2rtcConfig = { + "api": { + "listen": `:${this.config.go2rtc_api_port}` + }, + "rtsp": { + "listen": `:${this.config.go2rtc_rtsp_port}` + }, + "srtp": { + "listen": `:${this.config.go2rtc_srtp_port}` + }, + "webrtc": { + "listen": `:${this.config.go2rtc_webrtc_port}` + }, + "streams": {} + }; + if (this.config.go2rtc_rtsp_username !== "" && this.config.go2rtc_rtsp_password !== "") { + go2rtcConfig.rtsp.username = this.config.go2rtc_rtsp_username; + go2rtcConfig.rtsp.password = this.config.go2rtc_rtsp_password; + } + for (const device of await this.eufy.getDevices()) { + go2rtcConfig.streams[device.getSerial()] = null; + } + const go2rtc = child_process_1.default.spawn(go2rtc_static_1.default, ["-config", JSON.stringify(go2rtcConfig)], { shell: false, detached: false, windowsHide: true }); + go2rtc.on("error", (error) => { + this.log.error(`go2rtc error: ${error}`); + }); + go2rtc.stdout.setEncoding("utf8"); + go2rtc.stdout.on("data", (data) => { + this.log.info(`go2rtc started: ${data}`); + }); + go2rtc.stderr.setEncoding("utf8"); + go2rtc.stderr.on("data", (data) => { + this.log.error(`go2rtc error: ${data}`); + }); + go2rtc.on("close", (exitcode) => { + this.log.info(`go2rtc terminated with exitcode ${exitcode}`); + }); + process.on("exit", () => { + go2rtc.kill(); + }); + } } writePersistentData() { try { @@ -270,6 +313,8 @@ class euSec extends utils.Adapter { try { this.writePersistentData(); if (this.eufy) { + if (this.eufy.isConnected()) + await this.setStateAsync("info.connection", { val: false, ack: true }).catch(); this.eufy.removeAllListeners(); this.eufy.close(); } @@ -377,34 +422,34 @@ class euSec extends utils.Adapter { const station = await this.eufy.getStation(station_sn); const device = await this.eufy.getDevice(device_sn); switch (device_state_name) { - case types_1.CameraStateID.START_STREAM: + case types_1.DeviceStateID.START_STREAM: await this.startLivestream(device_sn); break; - case types_1.CameraStateID.STOP_STREAM: + case types_1.DeviceStateID.STOP_STREAM: await this.stopLivestream(device_sn); break; - case types_1.CameraStateID.TRIGGER_ALARM_SOUND: + case types_1.DeviceStateID.TRIGGER_ALARM_SOUND: await station.triggerDeviceAlarmSound(device, this.config.alarmSoundDuration); break; - case types_1.CameraStateID.RESET_ALARM_SOUND: + case types_1.DeviceStateID.RESET_ALARM_SOUND: await station.resetDeviceAlarmSound(device); break; - case types_1.IndoorCameraStateID.ROTATE_360: + case types_1.DeviceStateID.ROTATE_360: await station.panAndTilt(device, eufy_security_client_1.PanTiltDirection.ROTATE360); break; - case types_1.IndoorCameraStateID.PAN_LEFT: + case types_1.DeviceStateID.PAN_LEFT: await station.panAndTilt(device, eufy_security_client_1.PanTiltDirection.LEFT); break; - case types_1.IndoorCameraStateID.PAN_RIGHT: + case types_1.DeviceStateID.PAN_RIGHT: await station.panAndTilt(device, eufy_security_client_1.PanTiltDirection.RIGHT); break; - case types_1.IndoorCameraStateID.TILT_UP: + case types_1.DeviceStateID.TILT_UP: await station.panAndTilt(device, eufy_security_client_1.PanTiltDirection.UP); break; - case types_1.IndoorCameraStateID.TILT_DOWN: + case types_1.DeviceStateID.TILT_DOWN: await station.panAndTilt(device, eufy_security_client_1.PanTiltDirection.DOWN); break; - case types_1.LockStateID.CALIBRATE: + case types_1.DeviceStateID.CALIBRATE: if (device.isLock()) { await station.calibrateLock(device); } @@ -412,13 +457,13 @@ class euSec extends utils.Adapter { await station.calibrate(device); } break; - case types_1.SmartSafeStateID.UNLOCK: + case types_1.DeviceStateID.UNLOCK: await station.unlock(device); break; - case types_1.IndoorCameraStateID.SET_DEFAULT_ANGLE: + case types_1.DeviceStateID.SET_DEFAULT_ANGLE: await station.setDefaultAngle(device); break; - case types_1.IndoorCameraStateID.SET_PRIVACY_ANGLE: + case types_1.DeviceStateID.SET_PRIVACY_ANGLE: await station.setPrivacyAngle(device); break; } @@ -527,7 +572,7 @@ class euSec extends utils.Adapter { } } async onDeviceAdded(device) { - //this.logger.debug(`count: ${Object.keys(devices).length}`); + this.logger.debug(`onDeviceAdded - device: ${device.getSerial()}`); await this.setObjectNotExistsAsync(device.getStateID("", 0), { type: "channel", common: { @@ -544,10 +589,35 @@ class euSec extends utils.Adapter { }); const metadata = device.getPropertiesMetadata(); for (const property of Object.values(metadata)) { - this.createAndSetState(device, property); + if (property.name !== eufy_security_client_1.PropertyName.DevicePicture) + this.createAndSetState(device, property); + } + if (device.hasProperty(eufy_security_client_1.PropertyName.DevicePicture)) { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.PICTURE_URL), { + type: "state", + common: { + name: "Picture URL", + type: "string", + role: "url", + read: true, + write: false, + }, + native: {}, + }); + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.PICTURE_HTML), { + type: "state", + common: { + name: "Picture HTML image", + type: "string", + role: "html", + read: true, + write: false, + }, + native: {}, + }); } if (device.hasCommand(eufy_security_client_1.CommandName.DeviceTriggerAlarmSound)) { - await this.setObjectNotExistsAsync(device.getStateID(types_1.CameraStateID.TRIGGER_ALARM_SOUND), { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.TRIGGER_ALARM_SOUND), { type: "state", common: { name: "Trigger Alarm Sound", @@ -558,7 +628,7 @@ class euSec extends utils.Adapter { }, native: {}, }); - await this.setObjectNotExistsAsync(device.getStateID(types_1.CameraStateID.RESET_ALARM_SOUND), { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.RESET_ALARM_SOUND), { type: "state", common: { name: "Reset Alarm Sound", @@ -571,7 +641,7 @@ class euSec extends utils.Adapter { }); } if (device.hasCommand(eufy_security_client_1.CommandName.DevicePanAndTilt)) { - await this.setObjectNotExistsAsync(device.getStateID(types_1.IndoorCameraStateID.PAN_LEFT), { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.PAN_LEFT), { type: "state", common: { name: "Pan Left", @@ -582,7 +652,7 @@ class euSec extends utils.Adapter { }, native: {}, }); - await this.setObjectNotExistsAsync(device.getStateID(types_1.IndoorCameraStateID.PAN_RIGHT), { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.PAN_RIGHT), { type: "state", common: { name: "Pan Right", @@ -593,7 +663,7 @@ class euSec extends utils.Adapter { }, native: {}, }); - await this.setObjectNotExistsAsync(device.getStateID(types_1.IndoorCameraStateID.ROTATE_360), { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.ROTATE_360), { type: "state", common: { name: "Rotate 360°", @@ -604,7 +674,7 @@ class euSec extends utils.Adapter { }, native: {}, }); - await this.setObjectNotExistsAsync(device.getStateID(types_1.IndoorCameraStateID.TILT_UP), { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.TILT_UP), { type: "state", common: { name: "Tilt Up", @@ -615,7 +685,7 @@ class euSec extends utils.Adapter { }, native: {}, }); - await this.setObjectNotExistsAsync(device.getStateID(types_1.IndoorCameraStateID.TILT_DOWN), { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.TILT_DOWN), { type: "state", common: { name: "Tilt Down", @@ -628,7 +698,7 @@ class euSec extends utils.Adapter { }); } if (device.hasCommand(eufy_security_client_1.CommandName.DeviceLockCalibration)) { - await this.setObjectNotExistsAsync(device.getStateID(types_1.LockStateID.CALIBRATE), { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.CALIBRATE), { type: "state", common: { name: "Calibrate Lock", @@ -641,7 +711,7 @@ class euSec extends utils.Adapter { }); } if (device.hasCommand(eufy_security_client_1.CommandName.DeviceUnlock)) { - await this.setObjectNotExistsAsync(device.getStateID(types_1.SmartSafeStateID.UNLOCK), { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.UNLOCK), { type: "state", common: { name: "Unlock", @@ -654,7 +724,7 @@ class euSec extends utils.Adapter { }); } if (device.hasCommand(eufy_security_client_1.CommandName.DeviceSetDefaultAngle)) { - await this.setObjectNotExistsAsync(device.getStateID(types_1.IndoorCameraStateID.SET_DEFAULT_ANGLE), { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.SET_DEFAULT_ANGLE), { type: "state", common: { name: "Set Default Angle", @@ -667,7 +737,7 @@ class euSec extends utils.Adapter { }); } if (device.hasCommand(eufy_security_client_1.CommandName.DeviceSetPrivacyAngle)) { - await this.setObjectNotExistsAsync(device.getStateID(types_1.IndoorCameraStateID.SET_PRIVACY_ANGLE), { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.SET_PRIVACY_ANGLE), { type: "state", common: { name: "Set Default Angle", @@ -680,7 +750,7 @@ class euSec extends utils.Adapter { }); } if (device.hasCommand(eufy_security_client_1.CommandName.DeviceCalibrate)) { - await this.setObjectNotExistsAsync(device.getStateID(types_1.LockStateID.CALIBRATE), { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.CALIBRATE), { type: "state", common: { name: "Calibrate", @@ -692,18 +762,9 @@ class euSec extends utils.Adapter { native: {}, }); } - //TODO: Decomment as soon as the decryption of the images works - /*if (device.hasProperty(PropertyName.DevicePictureUrl)) { - // Last event picture - const last_camera_url = device.getPropertyValue(PropertyName.DevicePictureUrl); - if (last_camera_url !== undefined) - saveImageStates(this, last_camera_url as string, device.getStationSerial(), device.getSerial(), DataLocation.LAST_EVENT, device.getStateID(CameraStateID.LAST_EVENT_PIC_URL), device.getStateID(CameraStateID.LAST_EVENT_PIC_HTML), "Last event picture").catch(() => { - this.logger.error(`State LAST_EVENT_PICTURE_URL of device ${device.getSerial()} - saveImageStates(): url ${last_camera_url}`); - }); - }*/ if (device.hasCommand(eufy_security_client_1.CommandName.DeviceStartLivestream)) { // Start Stream - await this.setObjectNotExistsAsync(device.getStateID(types_1.CameraStateID.START_STREAM), { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.START_STREAM), { type: "state", common: { name: "Start stream", @@ -715,7 +776,7 @@ class euSec extends utils.Adapter { native: {}, }); // Stop Stream - await this.setObjectNotExistsAsync(device.getStateID(types_1.CameraStateID.STOP_STREAM), { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.STOP_STREAM), { type: "state", common: { name: "Stop stream", @@ -727,7 +788,7 @@ class euSec extends utils.Adapter { native: {}, }); // Livestream URL - await this.setObjectNotExistsAsync(device.getStateID(types_1.CameraStateID.LIVESTREAM), { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.LIVESTREAM), { type: "state", common: { name: "Livestream URL", @@ -738,23 +799,11 @@ class euSec extends utils.Adapter { }, native: {}, }); - // Last livestream video URL - await this.setObjectNotExistsAsync(device.getStateID(types_1.CameraStateID.LAST_LIVESTREAM_VIDEO_URL), { - type: "state", - common: { - name: "Last livestream video URL", - type: "string", - role: "url", - read: true, - write: false, - }, - native: {}, - }); - // Last livestream picture URL - await this.setObjectNotExistsAsync(device.getStateID(types_1.CameraStateID.LAST_LIVESTREAM_PIC_URL), { + // Livestream RTSP URL + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.LIVESTREAM_RTSP), { type: "state", common: { - name: "Last livestream picture URL", + name: "Livestream RTSP URL", type: "string", role: "url", read: true, @@ -762,22 +811,10 @@ class euSec extends utils.Adapter { }, native: {}, }); - // Last livestream picture HTML - await this.setObjectNotExistsAsync(device.getStateID(types_1.CameraStateID.LAST_LIVESTREAM_PIC_HTML), { - type: "state", - common: { - name: "Last livestream picture HTML image", - type: "string", - role: "html", - read: true, - write: false, - }, - native: {}, - }); } if (device.hasProperty(eufy_security_client_1.PropertyName.DeviceRTSPStream)) { // RTSP Stream URL - await this.setObjectNotExistsAsync(device.getStateID(types_1.CameraStateID.RTSP_STREAM_URL), { + await this.setObjectNotExistsAsync(device.getStateID(types_1.DeviceStateID.RTSP_STREAM_URL), { type: "state", common: { name: "RTSP stream URL", @@ -789,9 +826,10 @@ class euSec extends utils.Adapter { native: {}, }); } - if (device.hasCommand(eufy_security_client_1.CommandName.DeviceStartDownload)) { + //TODO: Deactivated because the decryption of the download has changed. + /*if (device.hasCommand(CommandName.DeviceStartDownload)) { // Last event video URL - await this.setObjectNotExistsAsync(device.getStateID(types_1.CameraStateID.LAST_EVENT_VIDEO_URL), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.LAST_EVENT_VIDEO_URL), { type: "state", common: { name: "Last event video URL", @@ -803,8 +841,9 @@ class euSec extends utils.Adapter { }, native: {}, }); + // Last event picture URL - await this.setObjectNotExistsAsync(device.getStateID(types_1.CameraStateID.LAST_EVENT_PIC_URL), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.LAST_EVENT_PIC_URL), { type: "state", common: { name: "Last event picture URL", @@ -816,8 +855,9 @@ class euSec extends utils.Adapter { }, native: {}, }); + // Last event picture HTML image - await this.setObjectNotExistsAsync(device.getStateID(types_1.CameraStateID.LAST_EVENT_PIC_HTML), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.LAST_EVENT_PIC_HTML), { type: "state", common: { name: "Last event picture HTML image", @@ -829,11 +869,14 @@ class euSec extends utils.Adapter { }, native: {}, }); - } + }*/ } async onDeviceRemoved(device) { this.delObjectAsync(device.getStateID("", 0), { recursive: true }).catch((error) => { - this.logger.error(`Error deleting removed device`, error); + this.logger.error(`Error deleting states of removed device`, error); + }); + (0, utils_1.removeFiles)(this, device.getStationSerial(), types_1.DataLocation.LAST_EVENT, device.getSerial()).catch((error) => { + this.logger.error(`Error deleting fs contents of removed device`, error); }); } async onStationAdded(station) { @@ -910,47 +953,48 @@ class euSec extends utils.Adapter { } async onStationRemoved(station) { this.delObjectAsync(station.getStateID("", 0), { recursive: true }).catch((error) => { - this.logger.error(`Error deleting removed station`, error); + this.logger.error(`Error deleting states of removed station`, error); + }); + fs_extra_1.default.remove(path.join(utils.getAbsoluteInstanceDataDir(this), station.getSerial())).catch((error) => { + this.logger.error(`Error deleting fs contents of removed station`, error); }); } - async downloadEventVideo(device, event_time, full_path, cipher_id) { + /*private async downloadEventVideo(device: Device, event_time: number, full_path: string | undefined, cipher_id: number | undefined): Promise { this.logger.debug(`Device: ${device.getSerial()} full_path: ${full_path} cipher_id: ${cipher_id}`); try { - if (!(0, utils_1.isEmpty)(full_path) && cipher_id !== undefined) { + if (!isEmpty(full_path) && cipher_id !== undefined) { const station = await this.eufy.getStation(device.getStationSerial()); + if (station !== undefined) { if (this.downloadEvent[device.getSerial()]) clearTimeout(this.downloadEvent[device.getSerial()]); - let videoLength = (0, utils_1.getVideoClipLength)(device); + + let videoLength = getVideoClipLength(device); const time_passed = (new Date().getTime() - new Date(event_time).getTime()) / 1000; + if (time_passed >= videoLength) videoLength = 1; else videoLength = videoLength - time_passed; + this.logger.info(`Downloading video event for device ${device.getSerial()} in ${videoLength} seconds...`); this.downloadEvent[device.getSerial()] = setTimeout(async () => { - station.startDownload(device, full_path, cipher_id); + station.startDownload(device, full_path!, cipher_id); }, videoLength * 1000); } } - } - catch (error) { + } catch (error) { this.logger.error(`Device: ${device.getSerial()} - Error`, error); } - } + }*/ async handlePushNotification(message) { try { if (message.device_sn !== undefined) { - const device = await this.eufy.getDevice(message.device_sn); - //TODO: Decomment as soon as the decryption of the images works - /*if (!isEmpty(message.pic_url)) { - await saveImageStates(this, message.pic_url!, device.getStationSerial(), device.getSerial(), DataLocation.LAST_EVENT, device.getStateID(CameraStateID.LAST_EVENT_PIC_URL), device.getStateID(CameraStateID.LAST_EVENT_PIC_HTML), "Last captured picture").catch(() => { - this.logger.error(`Device ${device.getSerial()} - saveImageStates(): url ${message.pic_url}`); - }); - }*/ + //TODO: Deactivated because the decryption of the download has changed. + /*const device: Device = await this.eufy.getDevice(message.device_sn); if ((message.push_count === 1 || message.push_count === undefined) && (message.file_path !== undefined && message.file_path !== "" && message.cipher !== undefined)) if (this.config.autoDownloadVideo) - await this.downloadEventVideo(device, message.event_time, message.file_path, message.cipher); + await this.downloadEventVideo(device, message.event_time, message.file_path, message.cipher);*/ } } catch (error) { @@ -982,27 +1026,142 @@ class euSec extends utils.Adapter { native: {}, }); await this.setStateAsync("info.connection", { val: true, ack: true }); + const stations = await this.eufy.getStations(); + const stationSerials = []; + for (const station of stations) { + stationSerials.push(station.getSerial()); + } + const devices = await this.eufy.getDevices(); + const deviceSerials = []; + for (const device of devices) { + deviceSerials.push(device.getSerial()); + } + // Delete obsolete stations + try { + const allDevices = await this.getDevicesAsync(); + const reg = new RegExp(`^${this.namespace}\.[0-9A-Z]+$`); + allDevices.forEach((id) => { + if (id._id.match(reg)) { + const serial = id._id.replace(`${this.namespace}.`, ""); + if (!stationSerials.includes(serial)) { + this.delObjectAsync(id._id, { recursive: true }); + } + } + }); + } + catch (error) { + this.log.error(`Delete obsolete stations ERROR - ${JSON.stringify(error)}`); + } + // Delete obsolete devices + try { + const allDevices = await this.getDevicesAsync(); + const reg = new RegExp(`^${this.namespace}\.[0-9A-Z]+\.[a-z]+\.[0-9A-Z]+$`); + allDevices.forEach((id) => { + if (id._id.match(reg)) { + const serial = id._id.split(".")[4]; + if (!deviceSerials.includes(serial)) { + this.delObjectAsync(id._id, { recursive: true }); + } + } + }); + } + catch (error) { + this.log.error(`Delete obsolete devices ERROR - ${JSON.stringify(error)}`); + } + // Delete obsolete properties + try { + const all = await this.getStatesAsync("*"); + if (all) { + Object.keys(all).forEach(async (stateid) => { + var _a; + const object = await this.getObjectAsync(stateid); + if (((_a = object === null || object === void 0 ? void 0 : object.native) === null || _a === void 0 ? void 0 : _a.name) !== undefined) { + const tmp = stateid.split("."); + if (tmp.length >= 5) { + const stationSerial = tmp[2]; + const deviceSerial = tmp[4]; + if (deviceSerial.match(/^[A-Z0-9]+/)) { + // Device + try { + const device = await this.eufy.getDevice(deviceSerial); + if (!device.hasProperty(object.native.name)) { + this.delObjectAsync(stateid); + } + } + catch (error) { + if (error instanceof eufy_security_client_1.DeviceNotFoundError) { + } + else { + this.log.error(`Delete obsolete properties ERROR - device - ${JSON.stringify(error)}`); + } + } + } + else { + // Station + try { + const station = await this.eufy.getStation(stationSerial); + if (!station.hasProperty(object.native.name)) { + this.delObjectAsync(stateid); + } + } + catch (error) { + if (error instanceof eufy_security_client_1.StationNotFoundError) { + } + else { + this.log.error(`Delete obsolete properties ERROR - station - ${JSON.stringify(error)}`); + } + } + } + } + } + }); + } + } + catch (error) { + this.log.error(`Delete obsolete properties ERROR - ${JSON.stringify(error)}`); + } + // Delete obsolete directories/files + new Promise(async (resolve, reject) => { + try { + const dir_path = path.join(utils.getAbsoluteInstanceDataDir(this)); + if (fs_extra_1.default.existsSync(dir_path)) { + for (const content of fs_extra_1.default.readdirSync(dir_path).filter(fn => fn.match("^T[0-9A-Z]+$") !== null)) { + if (!stationSerials.includes(content)) { + fs_extra_1.default.removeSync(path.join(dir_path, content)); + } + else { + for (const dir of fs_extra_1.default.readdirSync(path.join(dir_path, content))) { + if (dir === types_1.DataLocation.LIVESTREAM || dir === types_1.DataLocation.LAST_LIVESTREAM || dir === types_1.DataLocation.TEMP) { + fs_extra_1.default.removeSync(path.join(dir_path, content, dir)); + } + else { + const files = fs_extra_1.default.readdirSync(path.join(dir_path, content, dir)); + let deletedFiles = 0; + for (const file of files) { + if (!deviceSerials.includes(file.substring(0, 16))) { + fs_extra_1.default.removeSync(path.join(dir_path, content, dir, file)); + deletedFiles++; + } + } + if (deletedFiles === files.length) { + fs_extra_1.default.removeSync(path.join(dir_path, content, dir)); + } + } + } + } + } + } + resolve(); + } + catch (error) { + reject(error); + } + }).catch(error => { + this.log.error(`Delete obsolete directories/files ERROR - ${JSON.stringify(error)}`); + }); } async onClose() { - await this.setObjectNotExistsAsync("info", { - type: "channel", - common: { - name: "info" - }, - native: {}, - }); - await this.setObjectNotExistsAsync("info.connection", { - type: "state", - common: { - name: "Global connection", - type: "boolean", - role: "indicator.connection", - read: true, - write: false, - }, - native: {}, - }); - await this.setStateAsync("info.connection", { val: false, ack: true }); + await this.setStateAsync("info.connection", { val: false, ack: true }).catch(); } getPersistentData() { return this.persistentData; @@ -1130,7 +1289,7 @@ class euSec extends utils.Adapter { switch (name) { case eufy_security_client_1.PropertyName.DeviceRTSPStream: if (value === false) { - this.delStateAsync(device.getStateID(types_1.CameraStateID.RTSP_STREAM_URL)); + this.delStateAsync(device.getStateID(types_1.DeviceStateID.RTSP_STREAM_URL)); } break; } @@ -1138,7 +1297,25 @@ class euSec extends utils.Adapter { } } } - this.logger.debug(`onDevicePropertyChanged(): Property "${name}" not implemented in this adapter (device: ${device.getSerial()} value: ${JSON.stringify(value)})`); + if (name === eufy_security_client_1.PropertyName.DevicePicture) { + try { + const picture = value; + const fileName = `${device.getSerial()}.${picture.type.ext}`; + const filePath = path.join(utils.getAbsoluteInstanceDataDir(this), device.getStationSerial(), types_1.DataLocation.LAST_EVENT); + if (!fs_extra_1.default.existsSync(filePath)) { + fs_extra_1.default.mkdirSync(filePath, { mode: 0o775, recursive: true }); + } + await fs_extra_1.default.writeFile(path.join(filePath, fileName), picture.data); + await (0, utils_1.setStateChangedAsync)(this, device.getStateID(types_1.DeviceStateID.PICTURE_URL), `/${this.namespace}/${device.getStationSerial()}/${types_1.DataLocation.LAST_EVENT}/${device.getSerial()}.${picture.type.ext}`); + await (0, utils_1.setStateChangedAsync)(this, device.getStateID(types_1.DeviceStateID.PICTURE_HTML), (0, utils_1.getImageAsHTML)(picture.data, picture.type.mime)); + } + catch (error) { + this.logger.error("onDevicePropertyChanged - Property picture - Error", error); + } + } + else { + this.logger.debug(`onDevicePropertyChanged(): Property "${name}" not implemented in this adapter (device: ${device.getSerial()} value: ${JSON.stringify(value)})`); + } } async startLivestream(device_sn) { try { @@ -1152,14 +1329,8 @@ class euSec extends utils.Adapter { this.logger.warn(`The stream for the device ${device_sn} cannot be started, because it is already streaming!`); } } - else if (device.isCamera()) { - const camera = device; - if (!camera.isStreaming()) { - this.eufy.startCloudLivestream(device_sn); - } - else { - this.logger.warn(`The stream for the device ${device_sn} cannot be started, because it is already streaming!`); - } + else { + this.logger.warn(`The stream for the device ${device_sn} cannot be started, because there is no connection to station ${station.getSerial()}!`); } } catch (error) { @@ -1175,9 +1346,6 @@ class euSec extends utils.Adapter { if (await this.eufy.isStationConnected(device.getStationSerial()) && station.isLiveStreaming(camera)) { await this.eufy.stopStationLivestream(device_sn); } - else if (camera.isStreaming()) { - await this.eufy.stopCloudLivestream(device_sn); - } else { this.logger.warn(`The stream for the device ${device_sn} cannot be stopped, because it isn't streaming!`); } @@ -1187,99 +1355,11 @@ class euSec extends utils.Adapter { this.logger.error("Stop livestream - Error", error); } } - async onCloudLivestreamStart(station, device, url) { - this.setStateAsync(device.getStateID(types_1.CameraStateID.LIVESTREAM), { val: url, ack: true }); - const file_path = (0, utils_1.getDataFilePath)(this, station.getSerial(), types_1.DataLocation.LIVESTREAM, `${device.getSerial()}${types_1.STREAM_FILE_NAME_EXT}`); - await (0, utils_1.sleep)(2000); - const rtmpPromise = (0, video_1.ffmpegRTMPToHls)(this.config, url, file_path, this.logger); - rtmpPromise.then(async () => { - if (fs_extra_1.default.pathExistsSync(file_path)) { - await (0, utils_1.removeFiles)(this, station.getSerial(), types_1.DataLocation.LAST_LIVESTREAM, device.getSerial()); - return true; - } - return false; - }) - .then(async (result) => { - if (result) - await (0, utils_1.moveFiles)(this, station.getSerial(), device.getSerial(), types_1.DataLocation.LIVESTREAM, types_1.DataLocation.LAST_LIVESTREAM); - return result; - }) - .then(async (result) => { - if (result) { - const filename_without_ext = (0, utils_1.getDataFilePath)(this, station.getSerial(), types_1.DataLocation.LAST_LIVESTREAM, device.getSerial()); - if (fs_extra_1.default.pathExistsSync(`${filename_without_ext}${types_1.STREAM_FILE_NAME_EXT}`)) - await (0, video_1.ffmpegPreviewImage)(this.config, `${filename_without_ext}${types_1.STREAM_FILE_NAME_EXT}`, `${filename_without_ext}${types_1.IMAGE_FILE_JPEG_EXT}`, this.logger, 5.5) - .then(() => { - this.setStateAsync(device.getStateID(types_1.CameraStateID.LAST_LIVESTREAM_PIC_URL), { val: `/${this.namespace}/${station.getSerial()}/${types_1.DataLocation.LAST_LIVESTREAM}/${device.getSerial()}${types_1.IMAGE_FILE_JPEG_EXT}`, ack: true }); - try { - if (fs_extra_1.default.existsSync(`${filename_without_ext}${types_1.IMAGE_FILE_JPEG_EXT}`)) { - this.setStateAsync(device.getStateID(types_1.CameraStateID.LAST_LIVESTREAM_PIC_HTML), { val: (0, utils_1.getImageAsHTML)(fs_extra_1.default.readFileSync(`${filename_without_ext}${types_1.IMAGE_FILE_JPEG_EXT}`)), ack: true }); - } - } - catch (error) { - this.logger.error(`Station: ${station.getSerial()} device: ${device.getSerial()} - Error`, error); - } - }) - .catch((error) => { - this.logger.error(`ffmpegPreviewImage - station: ${station.getSerial()} device: ${device.getSerial()} - Error`, error); - }); - } - }) - .catch(async (error) => { - this.logger.error(`Station: ${station.getSerial()} device: ${device.getSerial()} - Error - Stopping livestream...`, error); - await this.eufy.stopCloudLivestream(device.getSerial()); - }); - this.rtmpFFmpegPromise.set(device.getSerial(), rtmpPromise); - } - onCloudLivestreamStop(station, device) { - this.logger.debug(`Station: ${station.getSerial()} device: ${device.getSerial()}`); - this.delStateAsync(device.getStateID(types_1.CameraStateID.LIVESTREAM)); - const rtmpPromise = this.rtmpFFmpegPromise.get(device.getSerial()); - if (rtmpPromise) { - rtmpPromise.stop(); - this.rtmpFFmpegPromise.delete(device.getSerial()); - } - } async onStationLivestreamStart(station, device, metadata, videostream, audiostream) { try { - const file_path = (0, utils_1.getDataFilePath)(this, station.getSerial(), types_1.DataLocation.LIVESTREAM, `${device.getSerial()}${types_1.STREAM_FILE_NAME_EXT}`); - await (0, utils_1.removeFiles)(this, station.getSerial(), types_1.DataLocation.LIVESTREAM, device.getSerial()).catch(); - this.setStateAsync(device.getStateID(types_1.CameraStateID.LIVESTREAM), { val: `/${this.namespace}/${station.getSerial()}/${types_1.DataLocation.LIVESTREAM}/${device.getSerial()}${types_1.STREAM_FILE_NAME_EXT}`, ack: true }); - await (0, video_1.ffmpegStreamToHls)(this.config, this.namespace, metadata, videostream, audiostream, file_path, this.logger) - .then(async () => { - if (fs_extra_1.default.pathExistsSync(file_path)) { - await (0, utils_1.removeFiles)(this, station.getSerial(), types_1.DataLocation.LAST_LIVESTREAM, device.getSerial()); - return true; - } - return false; - }) - .then(async (result) => { - if (result) - await (0, utils_1.moveFiles)(this, station.getSerial(), device.getSerial(), types_1.DataLocation.LIVESTREAM, types_1.DataLocation.LAST_LIVESTREAM); - return result; - }) - .then(async (result) => { - if (result) { - const filename_without_ext = (0, utils_1.getDataFilePath)(this, station.getSerial(), types_1.DataLocation.LAST_LIVESTREAM, device.getSerial()); - this.setStateAsync(device.getStateID(types_1.CameraStateID.LAST_LIVESTREAM_VIDEO_URL), { val: `/${this.namespace}/${station.getSerial()}/${types_1.DataLocation.LAST_LIVESTREAM}/${device.getSerial()}${types_1.STREAM_FILE_NAME_EXT}`, ack: true }); - if (fs_extra_1.default.pathExistsSync(`${filename_without_ext}${types_1.STREAM_FILE_NAME_EXT}`)) - await (0, video_1.ffmpegPreviewImage)(this.config, `${filename_without_ext}${types_1.STREAM_FILE_NAME_EXT}`, `${filename_without_ext}${types_1.IMAGE_FILE_JPEG_EXT}`, this.logger) - .then(() => { - this.setStateAsync(device.getStateID(types_1.CameraStateID.LAST_LIVESTREAM_PIC_URL), { val: `/${this.namespace}/${station.getSerial()}/${types_1.DataLocation.LAST_LIVESTREAM}/${device.getSerial()}${types_1.IMAGE_FILE_JPEG_EXT}`, ack: true }); - try { - if (fs_extra_1.default.existsSync(`${filename_without_ext}${types_1.IMAGE_FILE_JPEG_EXT}`)) { - this.setStateAsync(device.getStateID(types_1.CameraStateID.LAST_LIVESTREAM_PIC_HTML), { val: (0, utils_1.getImageAsHTML)(fs_extra_1.default.readFileSync(`${filename_without_ext}${types_1.IMAGE_FILE_JPEG_EXT}`)), ack: true }); - } - } - catch (error) { - this.logger.error(`Station: ${station.getSerial()} device: ${device.getSerial()} - Error`, error); - } - }) - .catch((error) => { - this.logger.error(`ffmpegPreviewImage - station: ${station.getSerial()} device: ${device.getSerial()} - Error`, error); - }); - } - }) + this.setStateAsync(device.getStateID(types_1.DeviceStateID.LIVESTREAM), { val: `${this.config.https ? "https" : "http"}://${this.config.hostname}:${this.config.go2rtc_api_port}/stream.html?src=${device.getSerial()}`, ack: true }); + this.setStateAsync(device.getStateID(types_1.DeviceStateID.LIVESTREAM_RTSP), { val: `rtsp://${this.config.hostname}:${this.config.go2rtc_rtsp_port}/${device.getSerial()}`, ack: true }); + await (0, video_1.ffmpegStreamToGo2rtc)(this.config, this.namespace, device.getSerial(), metadata, videostream, audiostream, this.logger) .catch(async (error) => { this.logger.error(`Station: ${station.getSerial()} Device: ${device.getSerial()} - Error - Stopping livestream...`, error); await this.eufy.stopStationLivestream(device.getSerial()); @@ -1291,63 +1371,64 @@ class euSec extends utils.Adapter { } } onStationLivestreamStop(_station, device) { - this.delStateAsync(device.getStateID(types_1.CameraStateID.LIVESTREAM)); + this.delStateAsync(device.getStateID(types_1.DeviceStateID.LIVESTREAM)); + this.delStateAsync(device.getStateID(types_1.DeviceStateID.LIVESTREAM_RTSP)); } - async onStationDownloadFinish(_station, _device) { + /*private async onStationDownloadFinish(_station: Station, _device: Device): Promise { //this.logger.trace(`Station: ${station.getSerial()} channel: ${channel}`); - } - async onStationDownloadStart(station, device, metadata, videostream, audiostream) { + }*/ + /*private async onStationDownloadStart(station: Station, device: Device, metadata: StreamMetadata, videostream: Readable, audiostream: Readable): Promise { try { - await (0, utils_1.removeFiles)(this, station.getSerial(), types_1.DataLocation.TEMP, device.getSerial()).catch(); - const file_path = (0, utils_1.getDataFilePath)(this, station.getSerial(), types_1.DataLocation.TEMP, `${device.getSerial()}${types_1.STREAM_FILE_NAME_EXT}`); - await (0, video_1.ffmpegStreamToHls)(this.config, this.namespace, metadata, videostream, audiostream, file_path, this.logger) + //TODO: Deactivated because the decryption of the download has changed. + await removeFiles(this, station.getSerial(), DataLocation.TEMP, device.getSerial()).catch(); + const file_path = getDataFilePath(this, station.getSerial(), DataLocation.TEMP, `${device.getSerial()}${STREAM_FILE_NAME_EXT}`); + + await ffmpegStreamToHls(this.config, this.namespace, metadata, videostream, audiostream, file_path, this.logger) .then(async () => { - if (fs_extra_1.default.pathExistsSync(file_path)) { - await (0, utils_1.removeFiles)(this, station.getSerial(), types_1.DataLocation.LAST_EVENT, device.getSerial()); - return true; - } - return false; - }) + if (fse.pathExistsSync(file_path)) { + await removeFiles(this, station.getSerial(), DataLocation.LAST_EVENT, device.getSerial()); + return true; + } + return false; + }) .then(async (result) => { - if (result) - await (0, utils_1.moveFiles)(this, station.getSerial(), device.getSerial(), types_1.DataLocation.TEMP, types_1.DataLocation.LAST_EVENT); - return result; - }) + if (result) + await moveFiles(this, station.getSerial(), device.getSerial(), DataLocation.TEMP, DataLocation.LAST_EVENT); + return result; + }) .then(async (result) => { - if (result) { - const filename_without_ext = (0, utils_1.getDataFilePath)(this, station.getSerial(), types_1.DataLocation.LAST_EVENT, device.getSerial()); - (0, utils_1.setStateAsync)(this, device.getStateID(types_1.CameraStateID.LAST_EVENT_VIDEO_URL), "Last captured video URL", `/${this.namespace}/${station.getSerial()}/${types_1.DataLocation.LAST_EVENT}/${device.getSerial()}${types_1.STREAM_FILE_NAME_EXT}`, "url"); - if (fs_extra_1.default.pathExistsSync(`${filename_without_ext}${types_1.STREAM_FILE_NAME_EXT}`)) - await (0, video_1.ffmpegPreviewImage)(this.config, `${filename_without_ext}${types_1.STREAM_FILE_NAME_EXT}`, `${filename_without_ext}${types_1.IMAGE_FILE_JPEG_EXT}`, this.logger) - .then(() => { - (0, utils_1.setStateAsync)(this, device.getStateID(types_1.CameraStateID.LAST_EVENT_PIC_URL), "Last event picture URL", `/${this.namespace}/${station.getSerial()}/${types_1.DataLocation.LAST_EVENT}/${device.getSerial()}${types_1.IMAGE_FILE_JPEG_EXT}`, "url"); - try { - if (fs_extra_1.default.existsSync(`${filename_without_ext}${types_1.IMAGE_FILE_JPEG_EXT}`)) { - const image_data = (0, utils_1.getImageAsHTML)(fs_extra_1.default.readFileSync(`${filename_without_ext}${types_1.IMAGE_FILE_JPEG_EXT}`)); - (0, utils_1.setStateAsync)(this, device.getStateID(types_1.CameraStateID.LAST_EVENT_PIC_HTML), "Last event picture HTML image", image_data, "html"); - } - } - catch (error) { - this.logger.error(`Station: ${station.getSerial()} device: ${device.getSerial()} - Error`, error); - } - }) - .catch((error) => { - this.logger.error(`ffmpegPreviewImage - station: ${station.getSerial()} device: ${device.getSerial()} - Error`, error); - }); - } - }) + if (result) { + const filename_without_ext = getDataFilePath(this, station.getSerial(), DataLocation.LAST_EVENT, device.getSerial()); + setStateAsync(this, device.getStateID(DeviceStateID.LAST_EVENT_VIDEO_URL), "Last captured video URL", `/${this.namespace}/${station.getSerial()}/${DataLocation.LAST_EVENT}/${device.getSerial()}${STREAM_FILE_NAME_EXT}`, "url"); + if (fse.pathExistsSync(`${filename_without_ext}${STREAM_FILE_NAME_EXT}`)) + await ffmpegPreviewImage(this.config, `${filename_without_ext}${STREAM_FILE_NAME_EXT}`, `${filename_without_ext}${IMAGE_FILE_JPEG_EXT}`, this.logger) + .then(() => { + setStateAsync(this, device.getStateID(DeviceStateID.LAST_EVENT_PIC_URL), "Last event picture URL", `/${this.namespace}/${station.getSerial()}/${DataLocation.LAST_EVENT}/${device.getSerial()}${IMAGE_FILE_JPEG_EXT}`, "url"); + try { + if (fse.existsSync(`${filename_without_ext}${IMAGE_FILE_JPEG_EXT}`)) { + const image_data = getImageAsHTML(fse.readFileSync(`${filename_without_ext}${IMAGE_FILE_JPEG_EXT}`)); + setStateAsync(this, device.getStateID(DeviceStateID.LAST_EVENT_PIC_HTML), "Last event picture HTML image", image_data, "html"); + } + } catch (error) { + this.logger.error(`Station: ${station.getSerial()} device: ${device.getSerial()} - Error`, error); + } + }) + .catch((error) => { + this.logger.error(`ffmpegPreviewImage - station: ${station.getSerial()} device: ${device.getSerial()} - Error`, error); + }); + } + }) .catch(async (error) => { - this.logger.error(`Station: ${station.getSerial()} Device: ${device.getSerial()} - Error - Cancelling download...`, error); - await this.eufy.cancelStationDownload(device.getSerial()); - }); - } - catch (error) { + this.logger.error(`Station: ${station.getSerial()} Device: ${device.getSerial()} - Error - Cancelling download...`, error); + await this.eufy.cancelStationDownload(device.getSerial()); + }); + } catch(error) { this.logger.error(`Station: ${station.getSerial()} Device: ${device.getSerial()} - Error - Cancelling download...`, error); await this.eufy.cancelStationDownload(device.getSerial()); } - } + }*/ onStationRTSPUrl(station, device, value) { - (0, utils_1.setStateChangedAsync)(this, device.getStateID(types_1.CameraStateID.RTSP_STREAM_URL), value); + (0, utils_1.setStateChangedAsync)(this, device.getStateID(types_1.DeviceStateID.RTSP_STREAM_URL), value); } async onStationConnect(station) { await this.setObjectNotExistsAsync(station.getStateID(types_1.StationStateID.CONNECTION), { diff --git a/build/main.js.map b/build/main.js.map index 7c86b95..87b9828 100644 --- a/build/main.js.map +++ b/build/main.js.map @@ -1 +1 @@ -{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/docs/_coverpage.md b/docs/_coverpage.md index 9cd371d..bf9aea6 100644 --- a/docs/_coverpage.md +++ b/docs/_coverpage.md @@ -1,6 +1,6 @@ ![logo](_media/ioBroker.euSec.png) -# ioBroker.euSec 0.9.10 +# ioBroker.euSec 1.0.0 > An [ioBroker](https://www.iobroker.net) adapter that uses the [eufy-security-client](https://github.com/bropat/eufy-security-client) library to comunicate with Eufy devices diff --git a/docs/_media/en/config02.png b/docs/_media/en/config02.png index 686a622d95ef46d8608985778cd4621642ab8411..d05d34950b5fb431d7dc653d648c5025f2021f8b 100755 GIT binary patch literal 60302 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 z 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 0e(eafWj406ZnPQ1na#a52Q7)CEa2avW(nT!S&| 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 THp8Fi$(?GbJ-UZcwFvna0x(VY literal 43519 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 Vz8H<5N;dI(s3~jREm3?F`XA}R%|ieH diff --git a/docs/authentication.md b/docs/authentication.md index 0d12e32..851a7a7 100644 --- a/docs/authentication.md +++ b/docs/authentication.md @@ -26,7 +26,7 @@ You will find the status of the adapter in the left menu under the item 'Instanc ![Current log with captcha image](_media/en/auth03.png) -4. Now go to the left menu and select 'Objects'. Then on the right side under `eufy-security` => `0` click in the line `captcha` the button with the pencil symbol. +4. Now go to the left menu and select 'Objects'. Then on the right side under `eusec` => `0` click in the line `captcha` the button with the pencil symbol. ![Objects view with captcha state](_media/en/auth04.png) @@ -57,7 +57,7 @@ If you have activated 2FA, you will find the status of the adapter in the left-h ![Mail containing verify code](_media/en/auth07.png) -3. Now go to the left menu and select 'Objects'. Then on the right side under `eufy-security` => `0` click in the line `verify_code` the button with the pencil symbol. +3. Now go to the left menu and select 'Objects'. Then on the right side under `eusec` => `0` click in the line `verify_code` the button with the pencil symbol. ![Objects view with verify_code state](_media/en/auth08.png) diff --git a/docs/configuration.md b/docs/configuration.md index 6a5a019..5a6d810 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -29,6 +29,21 @@ See below for more configuration parameters. ![Livestream configuration page](_media/en/config02.png) +### General settings + | Configuration parameter | Description | | - | - | - | Time in seconds before event reset | Time in seconds before a motion event, person detected event, etc. is reset | + | Hostname streaming url | If this option is set, the host name will be overwritten in the livesteam URLs. | + | HTTPS streaming url | If this option is set, the livesteam URL will be generated in HTTPS. | + | Max camera livestream duration | Maximum duration of a live stream in seconds after it is stopped. 0 seconds equal unlimited | + +### go2rtc settings + + | Configuration parameter | Description | + | - | - | + | API port | go2rtc API port setting | + | SRTP port | go2rtc SRTP port setting | + | WebRTC port | go2rtc WebRTC port setting | + | RTSP port | go2rtc RTSP port setting | + | RTSP username | go2rtc RTSP username setting | + | RTSP password | go2rtc RTSP password setting | diff --git a/docs/features.md b/docs/features.md index 7053e6a..9ce9b16 100644 --- a/docs/features.md +++ b/docs/features.md @@ -2,10 +2,7 @@ * Supports local and remote p2p connection to station * Two factor authentication -* Livestream as HLS stream (supports all platforms, but introduce a latency) -* Last HLS live stream is always saved for later viewing -* Downloads event video when push notification is received (async) -* Takes jpeg thumbnail of the livestream or downloaded video +* Livestream using go2rtc (WebRTC/MSE, rtsp) * Base station: * States: * Configured Guard mode diff --git a/io-package.json b/io-package.json index 028ccc5..120c3d4 100644 --- a/io-package.json +++ b/io-package.json @@ -1,8 +1,20 @@ { "common": { "name": "eusec", - "version": "0.9.10", + "version": "1.0.0", "news": { + "1.0.0": { + "en": "Notification pictures are supported again\nImplemented new livestream support using go2rtc (WebRTC/MSE, rtsp)\nFixed issue #323\nUpdated version of the package eufy-security-client (2.6.2)\n", + "de": "Benachrichtigungsbilder werden wieder unterstützt\nNeue Livestream-Unterstützung mit go2rtc implementiert (WebRTC/MSE, rtsp)\nProblem #323 behoben\nVersion des Pakets eufy-security-client (2.6.2) aktualisiert\n", + "ru": "Изображения уведомлений снова поддерживаются\nРеализована новая поддержка livestream с использованием go2rtc (WebRTC/MSE, rtsp)\nИсправлена проблема №323\nОбновленная версия пакета eufy-security-client (2.6.2)\n", + "pt": "As imagens de notificação são novamente suportadas\nImplementação de um novo suporte de transmissão em directo utilizando go2rtc (WebRTC/MSE, rtsp)\nEdição fixa #323\nVersão atualizada do pacote eufy-security-client (2.6.2)\n", + "nl": "Meldingsfoto's worden weer ondersteund\nNieuwe livestreamondersteuning geïmplementeerd met go2rtc (WebRTC/MSE, rtsp).\nProbleem #323 opgelost\nBijgewerkte versie van het pakket eufy-security-client (2.6.2)\n", + "fr": "Les images de notification sont à nouveau prises en charge\nMise en place d'un nouveau support pour le livestream en utilisant go2rtc (WebRTC/MSE, rtsp)\nCorrection du problème n°323\nVersion mise à jour du paquet eufy-security-client (2.6.2)\n", + "it": "Le immagini di notifica sono nuovamente supportate\nImplementato nuovo livestream utilizzando go2rtc (WebRTC/MSE, rtsp)\nRisolto il problema #323\nAggiornata la versione del pacchetto eufy-security-client (2.6.2)\n", + "es": "Las imágenes de notificación vuelven a ser compatibles\nImplementado nuevo soporte livestream usando go2rtc (WebRTC/MSE, rtsp)\nCorregido el problema #323\nVersión actualizada del paquete eufy-security-client (2.6.2)\n", + "pl": "Obrazy powiadomień są ponownie obsługiwane\nWdrożono nową obsługę transmisji na żywo przy użyciu go2rtc (WebRTC/MSE, rtsp).\nNaprawiono błąd #323\nZaktualizowana wersja pakietu eufy-security-client (2.6.2)\n", + "zh-cn": "再次支持通知图片\n使用go2rtc(WebRTC/MSE,rtsp)实施新的现场直播支持。\n修正了问题#323\n包 eufy-security-client (2.6.2) 的更新版本\n" + }, "0.9.10": { "en": "Updated version of the package eufy-security-client (2.4.2)\nFixed issue #319\nFixed issue #307\nFixed issue #306\nFixed issue #305", "de": "Version des Pakets eufy-security-client (2.4.2) aktualisiert\nProblem #319 behoben\nProblem #307 behoben\nProblem #306 behoben\nProblem #305 behoben", @@ -14,78 +26,6 @@ "es": "Versión actualizada del paquete eufy-security-client (2.4.2)\nCorregido el problema #319\nCorregido el problema #307\nCorregido el problema #306\nCorregido el problema #305", "pl": "Zaktualizowana wersja pakietu eufy-security-client (2.4.2)\nNaprawiono błąd #319\nNaprawiono błąd #307\nNaprawiono błąd #306\nNaprawiono błąd #305", "zh-cn": "包 eufy-security-client (2.4.2) 的更新版本\n修正了问题#319\n修正了问题#307\n修正了问题#306\n修正了问题#305" - }, - "0.9.9": { - "en": "Updated version of the package eufy-security-client (2.4.0)\nFixed issue #311\nFixed issue #312", - "de": "Version des Pakets eufy-security-client (2.4.0) aktualisiert\nProblem #311 behoben\nProblem #312 behoben", - "ru": "Обновленная версия пакета eufy-security-client (2.4.0)\nИсправлена проблема №311\nИсправлена проблема №312", - "pt": "Versão atualizada do pacote eufy-security-client (2.4.0)\nEdição fixa #311\nEdição fixa #312", - "nl": "Bijgewerkte versie van het pakket eufy-security-client (2.4.0)\nProbleem #311 opgelost\nProbleem #312 opgelost", - "fr": "Version mise à jour du paquet eufy-security-client (2.4.0)\nCorrection du problème n°311\nCorrection du problème n°312", - "it": "Aggiornata la versione del pacchetto eufy-security-client (2.4.0)\nRisolto il problema #311\nRisolto il problema #312", - "es": "Versión actualizada del paquete eufy-security-client (2.4.0)\nCorregido el problema #311\nCorregido el problema #312", - "pl": "Zaktualizowana wersja pakietu eufy-security-client (2.4.0)\nNaprawiono błąd #311\nNaprawiono błąd #312", - "zh-cn": "包 eufy-security-client (2.4.0) 的更新版本\n修正了问题#311\n修正了问题#312" - }, - "0.9.8": { - "en": "Updated version of the package eufy-security-client (2.3.0)\nFixed issue #300", - "de": "Version des Pakets eufy-security-client (2.3.0) aktualisiert\nProblem #300 behoben", - "ru": "Обновленная версия пакета eufy-security-client (2.3.0)\nИсправлена проблема №300", - "pt": "Versão atualizada do pacote eufy-security-client (2.3.0)\nEdição fixa #300", - "nl": "Bijgewerkte versie van het pakket eufy-security-client (2.3.0)\nProbleem #300 opgelost", - "fr": "Version mise à jour du paquet eufy-security-client (2.3.0)\nCorrection du problème n°300", - "it": "Aggiornata la versione del pacchetto eufy-security-client (2.3.0)\nRisolto il problema #300", - "es": "Versión actualizada del paquete eufy-security-client (2.3.0)\nCorregido el problema #300", - "pl": "Zaktualizowana wersja pakietu eufy-security-client (2.3.0)\nNaprawiono błąd #300", - "zh-cn": "包 eufy-security-client (2.3.0) 的更新版本\n修正了问题#300" - }, - "0.9.7": { - "en": "Implemented Homebase Alarm (#271)\nUpdated version of the package eufy-security-client (2.2.3)\nFixed issue #293", - "de": "Homebase-Alarm implementiert (#271)\nVersion des Pakets eufy-security-client (2.2.3) aktualisiert\nProblem #293 behoben", - "ru": "Внедрена сигнализация Homebase (#271)\nОбновленная версия пакета eufy-security-client (2.2.3)\nИсправлена проблема №293", - "pt": "Alarme Implementado de Base Doméstica (#271)\nVersão atualizada do pacote eufy-security-client (2.2.3)\nEdição fixa #293", - "nl": "Homebase alarm geïmplementeerd (#271)\nBijgewerkte versie van het pakket eufy-security-client (2.2.3)\nProbleem #293 opgelost", - "fr": "Mise en œuvre de l'alarme Homebase (#271)\nVersion mise à jour du paquet eufy-security-client (2.2.3)\nCorrection du problème n°293", - "it": "Implementato l'allarme Homebase (#271)\nAggiornata la versione del pacchetto eufy-security-client (2.2.3)\nRisolto il problema #293", - "es": "Implementación de la alarma de la base de datos (#271)\nVersión actualizada del paquete eufy-security-client (2.2.3)\nCorregido el problema #293", - "pl": "Wdrożony alarm Homebase (#271)\nZaktualizowana wersja pakietu eufy-security-client (2.2.3)\nNaprawiono błąd #293", - "zh-cn": "实施家庭基地警报(#271)。\n包 eufy-security-client (2.2.3) 的更新版本\n修正了问题#293" - }, - "0.9.6": { - "en": "Updated version of the package eufy-security-client (2.2.2)\nFixed issue #292", - "de": "Version des Pakets eufy-security-client (2.2.2) aktualisiert\nProblem #292 behoben", - "ru": "Обновленная версия пакета eufy-security-client (2.2.2)\nИсправлена проблема №292", - "pt": "Versão atualizada do pacote eufy-security-client (2.2.2)\nEdição fixa #292", - "nl": "Bijgewerkte versie van het pakket eufy-security-client (2.2.2)\nProbleem #292 opgelost", - "fr": "Version mise à jour du paquet eufy-security-client (2.2.2)\nCorrection du problème n°292", - "it": "Aggiornata la versione del pacchetto eufy-security-client (2.2.2)\nRisolto il problema #292", - "es": "Versión actualizada del paquete eufy-security-client (2.2.2)\nCorregido el problema #292", - "pl": "Zaktualizowana wersja pakietu eufy-security-client (2.2.2)\nNaprawiono błąd #292", - "zh-cn": "包 eufy-security-client (2.2.2) 的更新版本\n修正了问题#292" - }, - "0.9.5": { - "en": "Updated version of the package eufy-security-client (2.2.1)", - "de": "Version des Pakets eufy-security-client (2.2.1) aktualisiert", - "ru": "Обновленная версия пакета eufy-security-client (2.2.1)", - "pt": "Versão atualizada do pacote eufy-security-client (2.2.1)", - "nl": "Bijgewerkte versie van het pakket eufy-security-client (2.2.1)", - "fr": "Version mise à jour du paquet eufy-security-client (2.2.1)", - "it": "Aggiornata la versione del pacchetto eufy-security-client (2.2.1)", - "es": "Versión actualizada del paquete eufy-security-client (2.2.1)", - "pl": "Zaktualizowana wersja pakietu eufy-security-client (2.2.1)", - "zh-cn": "包 eufy-security-client (2.2.1) 的更新版本" - }, - "0.9.4": { - "en": "Updated version of the package eufy-security-client (2.1.2)", - "de": "Version des Pakets eufy-security-client (2.1.2) aktualisiert", - "ru": "Обновленная версия пакета eufy-security-client (2.1.2)", - "pt": "Versão atualizada do pacote eufy-security-client (2.1.2)", - "nl": "Bijgewerkte versie van het pakket eufy-security-client (2.1.2)", - "fr": "Version mise à jour du paquet eufy-security-client (2.1.2)", - "it": "Aggiornata la versione del pacchetto eufy-security-client (2.1.2)", - "es": "Versión actualizada del paquete eufy-security-client (2.1.2)", - "pl": "Zaktualizowana wersja pakietu eufy-security-client (2.1.2)", - "zh-cn": "包 eufy-security-client (2.1.2) 的更新版本" } }, "title": "euSec", @@ -159,10 +99,12 @@ } }, "encryptedNative": [ - "password" + "password", + "go2rtc_rtsp_password" ], "protectedNative": [ - "password" + "password", + "go2rtc_rtsp_password" ], "native": { "username": "", @@ -175,8 +117,14 @@ "p2pConnectionType": "quickest", "acceptInvitations": true, "alarmSoundDuration": 60, - "autoDownloadVideo": false, - "autoDownloadPicture": false + "go2rtc_api_port": 1984, + "go2rtc_rtsp_port": 8554, + "go2rtc_srtp_port": 8443, + "go2rtc_webrtc_port": 8555, + "go2rtc_rtsp_username": "", + "go2rtc_rtsp_password": "", + "hostname": "", + "https": false }, "objects": [], "instanceObjects": [ diff --git a/package-lock.json b/package-lock.json index b325675..d429c98 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,29 +1,30 @@ { "name": "iobroker.eusec", - "version": "0.9.10", + "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "iobroker.eusec", - "version": "0.9.10", + "version": "1.0.0", "license": "MIT", "dependencies": { "@bropat/fluent-ffmpeg": "^2.1.3", - "@cospired/i18n-iso-languages": "^4.0.1", - "@iobroker/adapter-core": "^2.6.7", - "eufy-security-client": "^2.4.2", + "@cospired/i18n-iso-languages": "^4.1.0", + "@iobroker/adapter-core": "^2.6.8", + "eufy-security-client": "^2.6.2", "ffmpeg-static": "^5.1.0", - "fs-extra": "^11.1.0", + "fs-extra": "^11.1.1", + "go2rtc-static": "^1.5.0", "got": "^11.8.6", - "i18n-iso-countries": "^7.5.0", + "i18n-iso-countries": "^7.6.0", "mime": "^3.0.0", "ts-log": "^2.2.5" }, "devDependencies": { "@alcalzone/release-script": "^3.5.9", "@iobroker/testing": "^4.1.0", - "@types/chai": "^4.3.4", + "@types/chai": "^4.3.5", "@types/chai-as-promised": "^7.1.5", "@types/express": "^4.17.17", "@types/ffmpeg-static": "^3.0.1", @@ -31,25 +32,25 @@ "@types/gulp": "^4.0.10", "@types/mime": "^3.0.1", "@types/mocha": "^10.0.1", - "@types/node": "^16.18.12", + "@types/node": "^16.18.30", "@types/proxyquire": "^1.3.28", - "@types/sinon": "^10.0.13", + "@types/sinon": "^10.0.15", "@types/sinon-chai": "^3.2.9", - "@typescript-eslint/eslint-plugin": "^5.52.0", - "@typescript-eslint/parser": "^5.52.0", + "@typescript-eslint/eslint-plugin": "^5.59.6", + "@typescript-eslint/parser": "^5.59.6", "chai": "^4.3.7", "chai-as-promised": "^7.1.1", - "eslint": "^8.34.0", + "eslint": "^8.40.0", "gulp": "^4.0.2", "mocha": "^10.2.0", "nyc": "^15.1.0", "proxyquire": "^2.1.3", - "rimraf": "^4.1.2", - "sinon": "^15.0.1", + "rimraf": "^5.0.0", + "sinon": "^15.0.4", "sinon-chai": "^3.7.0", "source-map-support": "^0.5.21", "ts-node": "^10.9.1", - "typescript": "4.9.5" + "typescript": "5.0.4" }, "engines": { "node": ">=16" @@ -918,9 +919,9 @@ } }, "node_modules/@cospired/i18n-iso-languages": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cospired/i18n-iso-languages/-/i18n-iso-languages-4.0.1.tgz", - "integrity": "sha512-hCdKLhRUjIDHd1YHdJpRIa0rRS8ren9e6t/2A1abhuSx6dKpn3Hf5nRScTjDs2jM5OMyp+s4nsTXFtHnrvcn5w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@cospired/i18n-iso-languages/-/i18n-iso-languages-4.1.0.tgz", + "integrity": "sha512-5+JK7YiO9r/FmwtlEPL1tQNt04/9AuN1t9GO/0C2yitqhKwFRa1r7VohNNUnFgB84MW5v4Lwq8ZAUZexuJh1nQ==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -961,15 +962,39 @@ "node": ">=6.0.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -984,6 +1009,15 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/js": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -1018,9 +1052,9 @@ "dev": true }, "node_modules/@iobroker/adapter-core": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/@iobroker/adapter-core/-/adapter-core-2.6.7.tgz", - "integrity": "sha512-yDTmWjnsQ+DXRQVnQK97CXXMMs01H3Pl82DSqfx7dYj7RKoUenD75a0xY4QQdHZXG9SIhjNttXVEln0lWvOamA==", + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/@iobroker/adapter-core/-/adapter-core-2.6.8.tgz", + "integrity": "sha512-xrqtH5RYZ6BvEcDyfuPkajd9el4R6p0VLRYKlnfMafAbxybIN+zfeHvjGI4l8OAHkyP2tcv6boX2Vu0KnMFOHw==", "dependencies": { "@types/iobroker": "^4.0.5" } @@ -1262,6 +1296,16 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -1428,9 +1472,9 @@ } }, "node_modules/@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", "dev": true }, "node_modules/@types/chai-as-promised": { @@ -1563,11 +1607,6 @@ "@types/node": "*" } }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, "node_modules/@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", @@ -1587,9 +1626,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.12.tgz", - "integrity": "sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw==" + "version": "16.18.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.30.tgz", + "integrity": "sha512-Kmp/wBZk19Dn7uRiol8kF8agnf8m0+TU9qIwyfPmXglVxMlmiIz0VQSMw5oFgwhmD2aKTlfBIO5FtsVj3y7hKQ==" }, "node_modules/@types/proxyquire": { "version": "1.3.28", @@ -1618,9 +1657,9 @@ } }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "node_modules/@types/serve-static": { @@ -1634,9 +1673,9 @@ } }, "node_modules/@types/sinon": { - "version": "10.0.13", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz", - "integrity": "sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==", + "version": "10.0.15", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.15.tgz", + "integrity": "sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==", "dev": true, "dependencies": { "@types/sinonjs__fake-timers": "*" @@ -1697,19 +1736,19 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", - "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", + "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/type-utils": "5.52.0", - "@typescript-eslint/utils": "5.52.0", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/type-utils": "5.59.6", + "@typescript-eslint/utils": "5.59.6", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -1731,14 +1770,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", - "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", + "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", "debug": "^4.3.4" }, "engines": { @@ -1758,13 +1797,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", - "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", + "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0" + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1775,13 +1814,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", - "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", + "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.52.0", - "@typescript-eslint/utils": "5.52.0", + "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/utils": "5.59.6", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1802,9 +1841,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", - "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", + "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1815,13 +1854,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", - "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", + "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1842,18 +1881,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", - "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.6.tgz", + "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "engines": { @@ -1868,12 +1907,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", - "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", + "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/types": "5.59.6", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -3068,6 +3107,11 @@ "type": "^1.0.1" } }, + "node_modules/date-and-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-3.0.0.tgz", + "integrity": "sha512-uuzXp/mvv6jEMLiP5QzERSQPzHqYnv9i8NZ8BS5kYeB2sakv74EewQiCS4Ahxwq3In+9fYZhGztuDHRVzIOkFQ==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3439,12 +3483,15 @@ } }, "node_modules/eslint": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", - "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.4.1", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -3454,11 +3501,10 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", @@ -3479,7 +3525,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -3507,46 +3552,22 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -3554,6 +3575,9 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/estraverse": { @@ -3578,14 +3602,14 @@ } }, "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3608,9 +3632,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -3668,21 +3692,24 @@ } }, "node_modules/eufy-security-client": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/eufy-security-client/-/eufy-security-client-2.4.2.tgz", - "integrity": "sha512-7AyOSNfLRyvCyRVziCh35piWWvJemKW3eOYIDXParneisOicZgcKsysLA2r3Y95oKQb6NXqOIbS0B4ph4Y6Dvw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/eufy-security-client/-/eufy-security-client-2.6.2.tgz", + "integrity": "sha512-YNpGwUoX+xMh0iSrkFiNPI7MqUQlrwKJdt61YaGz0wNtdGQAuLUgisWYuALSX8oGfH7isoqXiqcD+lxO449t1g==", "dependencies": { - "@cospired/i18n-iso-languages": "^4.0.1", + "@cospired/i18n-iso-languages": "^4.1.0", "crypto-js": "^4.1.1", - "fs-extra": "^11.1.0", + "date-and-time": "^3.0.0", + "fs-extra": "^11.1.1", "got": "^11.8.6", - "i18n-iso-countries": "^7.5.0", + "i18n-iso-countries": "^7.6.0", + "image-type": "^4.1.0", + "long": "^5.2.3", "mqtt": "^4.3.7", "node-rsa": "^1.1.1", "node-schedule": "^2.1.1", "p-throttle": "^4.1.1", - "protobuf-typescript": "^6.8.8", - "qs": "^6.11.0", + "protobufjs": "^7.2.3", + "qs": "^6.11.2", "sweet-collections": "^1.1.0", "tiny-typed-emitter": "^2.1.0", "ts-log": "^2.2.5" @@ -4050,6 +4077,14 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-type": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", + "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==", + "engines": { + "node": ">=6" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -4321,9 +4356,9 @@ ] }, "node_modules/fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -4649,7 +4684,7 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", "dev": true, "hasInstallScript": true, "optional": true, @@ -4859,6 +4894,20 @@ "node": ">= 0.10" } }, + "node_modules/go2rtc-static": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/go2rtc-static/-/go2rtc-static-1.5.0.tgz", + "integrity": "sha512-UunhdzMWy1Q4vxpH5v9lBY52YxlZ4WAkax/7v2qc6zlHPR4VSoii2lnHMuJETZPJkZoi2xSb3Ub1BSqw76mgpw==", + "hasInstallScript": true, + "dependencies": { + "got": "^11.8.6", + "https-proxy-agent": "^5.0.1", + "progress": "^2.0.3" + }, + "engines": { + "node": ">=14.18.0" + } + }, "node_modules/got": { "version": "11.8.6", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", @@ -5308,9 +5357,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dependencies": { "agent-base": "6", "debug": "4" @@ -5329,9 +5378,9 @@ } }, "node_modules/i18n-iso-countries": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/i18n-iso-countries/-/i18n-iso-countries-7.5.0.tgz", - "integrity": "sha512-PtfKJNWLVhhU0KBX/8asmywjAcuyQk07mmmMwxFJcddTNBJJ1yvpY2qxVmyxbtVF+9+6eg9phgpv83XPUKU5CA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/i18n-iso-countries/-/i18n-iso-countries-7.6.0.tgz", + "integrity": "sha512-HPKjOUKS0BkjiY4ayrsuFbu7Ock++pXLs+FAOYl4WfTL5L0ploEH68fiRAP6Zev5g/jvMFt54KcPGJcb942wbg==", "dependencies": { "diacritics": "1.3.0" }, @@ -5367,6 +5416,17 @@ "node": ">= 4" } }, + "node_modules/image-type": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/image-type/-/image-type-4.1.0.tgz", + "integrity": "sha512-CFJMJ8QK8lJvRlTCEgarL4ro6hfDQKif2HjSvYCdQZESaIPV4v9imrf7BQHK+sQeTeNeMpWciR9hyC/g8ybXEg==", + "dependencies": { + "file-type": "^10.10.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -5872,6 +5932,24 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.0.3.tgz", + "integrity": "sha512-0Jud3OMUdMbrlr3PyUMKESq51LXVAB+a239Ywdvd+Kgxj3MaBRml/nVRxf8tQFyfthMjuRkxkv7Vg58pmIMfuQ==", + "dev": true, + "dependencies": { + "cliui": "^7.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/js-sdsl": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", @@ -6143,9 +6221,9 @@ } }, "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "node_modules/long-timeout": { "version": "0.1.1", @@ -6527,6 +6605,15 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -7292,9 +7379,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7666,6 +7753,31 @@ "node": ">=0.10.0" } }, + "node_modules/path-scurry": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz", + "integrity": "sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==", + "dev": true, + "dependencies": { + "lru-cache": "^9.0.0", + "minipass": "^5.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.0.tgz", + "integrity": "sha512-qFXQEwchrZcMVen2uIDceR8Tii6kCJak5rzDStfEM0qA3YLMswaxIEZO0DhIbJ3aqaJiDjt+3crlplOb0tDtKQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-to-regexp": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", @@ -7857,11 +7969,10 @@ "node": ">=0.4.0" } }, - "node_modules/protobuf-typescript": { - "version": "6.8.8", - "resolved": "https://registry.npmjs.org/protobuf-typescript/-/protobuf-typescript-6.8.8.tgz", - "integrity": "sha512-5i3vXZSEB5uksn6E3PMCcO2WRyY4TrETyXfP1INrk3Sl43vjVmT1uCCI/gEHS8LVHtD6foAb3YyO6vqRlpYMHw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/protobufjs": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.3.tgz", + "integrity": "sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -7874,20 +7985,13 @@ "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.0", - "@types/node": "^12.12.14", - "long": "^4.0.0" + "@types/node": ">=13.7.0", + "long": "^5.0.0" }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" + "engines": { + "node": ">=12.0.0" } }, - "node_modules/protobuf-typescript/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - }, "node_modules/proxyquire": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", @@ -7930,9 +8034,9 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dependencies": { "side-channel": "^1.0.4" }, @@ -8110,18 +8214,6 @@ "node": ">=0.10.0" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/reinterval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", @@ -8322,10 +8414,13 @@ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, "node_modules/rimraf": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.1.2.tgz", - "integrity": "sha512-BlIbgFryTbw3Dz6hyoWFhKk+unCcHMSkZGrTFVAx2WmttdBSonsdtRlwiuTbDqTKr+UlXIUqJVS4QT5tUzGENQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.0.tgz", + "integrity": "sha512-Jf9llaP+RvaEVS5nPShYFhtXIrb3LRKP281ib3So0KkeZKo2wIKyq0Re7TOSwanasA423PSr6CCIL4bP6T040g==", "dev": true, + "dependencies": { + "glob": "^10.0.0" + }, "bin": { "rimraf": "dist/cjs/src/bin.js" }, @@ -8336,6 +8431,81 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.1.tgz", + "integrity": "sha512-ngom3wq2UhjdbmRE/krgkD8BQyi1KZ5l+D2dVm4+Yj+jJIBp74/ZGunL6gNGc/CYuQmvUBiavWEXIotRiv5R6A==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "fs.realpath": "^1.0.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.0", + "minipass": "^5.0.0", + "path-scurry": "^1.7.0" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/signal-exit": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", + "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -8524,16 +8694,16 @@ "dev": true }, "node_modules/sinon": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.1.tgz", - "integrity": "sha512-PZXKc08f/wcA/BMRGBze2Wmw50CWPiAH3E21EOi4B49vJ616vW4DQh4fQrqsYox2aNR/N3kCqLuB0PwwOucQrg==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.4.tgz", + "integrity": "sha512-uzmfN6zx3GQaria1kwgWGeKiXSSbShBbue6Dcj0SI8fiCNFbiUDqKl57WFlY5lyhxZVUKmXvzgG2pilRQCBwWg==", "dev": true, "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "10.0.2", - "@sinonjs/samsam": "^7.0.1", - "diff": "^5.0.0", - "nise": "^5.1.2", + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.1.0", + "nise": "^5.1.4", "supports-color": "^7.2.0" }, "funding": { @@ -8551,6 +8721,15 @@ "sinon": ">=4.0.0" } }, + "node_modules/sinon/node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, "node_modules/sinon/node_modules/@sinonjs/fake-timers": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", @@ -8560,6 +8739,44 @@ "@sinonjs/commons": "^2.0.0" } }, + "node_modules/sinon/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/sinon/node_modules/@sinonjs/samsam": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/sinon/node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/sinon/node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -8844,9 +9061,9 @@ } }, "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", @@ -8870,9 +9087,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, "node_modules/split-string": { @@ -9401,16 +9618,16 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/unc-path-regex": { @@ -10592,9 +10809,9 @@ } }, "@cospired/i18n-iso-languages": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cospired/i18n-iso-languages/-/i18n-iso-languages-4.0.1.tgz", - "integrity": "sha512-hCdKLhRUjIDHd1YHdJpRIa0rRS8ren9e6t/2A1abhuSx6dKpn3Hf5nRScTjDs2jM5OMyp+s4nsTXFtHnrvcn5w==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@cospired/i18n-iso-languages/-/i18n-iso-languages-4.1.0.tgz", + "integrity": "sha512-5+JK7YiO9r/FmwtlEPL1tQNt04/9AuN1t9GO/0C2yitqhKwFRa1r7VohNNUnFgB84MW5v4Lwq8ZAUZexuJh1nQ==" }, "@cspotcode/source-map-support": { "version": "0.8.1", @@ -10628,15 +10845,30 @@ "parse-cache-control": "^1.0.1" } }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true + }, "@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -10645,6 +10877,12 @@ "strip-json-comments": "^3.1.1" } }, + "@eslint/js": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "dev": true + }, "@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -10669,9 +10907,9 @@ "dev": true }, "@iobroker/adapter-core": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/@iobroker/adapter-core/-/adapter-core-2.6.7.tgz", - "integrity": "sha512-yDTmWjnsQ+DXRQVnQK97CXXMMs01H3Pl82DSqfx7dYj7RKoUenD75a0xY4QQdHZXG9SIhjNttXVEln0lWvOamA==", + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/@iobroker/adapter-core/-/adapter-core-2.6.8.tgz", + "integrity": "sha512-xrqtH5RYZ6BvEcDyfuPkajd9el4R6p0VLRYKlnfMafAbxybIN+zfeHvjGI4l8OAHkyP2tcv6boX2Vu0KnMFOHw==", "requires": { "@types/iobroker": "^4.0.5" } @@ -10865,6 +11103,13 @@ "fastq": "^1.6.0" } }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -11024,9 +11269,9 @@ } }, "@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", "dev": true }, "@types/chai-as-promised": { @@ -11159,11 +11404,6 @@ "@types/node": "*" } }, - "@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, "@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", @@ -11183,9 +11423,9 @@ "dev": true }, "@types/node": { - "version": "16.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.12.tgz", - "integrity": "sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw==" + "version": "16.18.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.30.tgz", + "integrity": "sha512-Kmp/wBZk19Dn7uRiol8kF8agnf8m0+TU9qIwyfPmXglVxMlmiIz0VQSMw5oFgwhmD2aKTlfBIO5FtsVj3y7hKQ==" }, "@types/proxyquire": { "version": "1.3.28", @@ -11214,9 +11454,9 @@ } }, "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "@types/serve-static": { @@ -11230,9 +11470,9 @@ } }, "@types/sinon": { - "version": "10.0.13", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz", - "integrity": "sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==", + "version": "10.0.15", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.15.tgz", + "integrity": "sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==", "dev": true, "requires": { "@types/sinonjs__fake-timers": "*" @@ -11293,71 +11533,71 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", - "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", + "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/type-utils": "5.52.0", - "@typescript-eslint/utils": "5.52.0", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/type-utils": "5.59.6", + "@typescript-eslint/utils": "5.59.6", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" } }, "@typescript-eslint/parser": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", - "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", + "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", - "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", + "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0" + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6" } }, "@typescript-eslint/type-utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", - "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", + "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.52.0", - "@typescript-eslint/utils": "5.52.0", + "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/utils": "5.59.6", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", - "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", + "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", - "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", + "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -11366,28 +11606,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", - "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.6.tgz", + "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", "dev": true, "requires": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", - "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", + "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/types": "5.59.6", "eslint-visitor-keys": "^3.3.0" } }, @@ -12295,6 +12535,11 @@ "type": "^1.0.1" } }, + "date-and-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-3.0.0.tgz", + "integrity": "sha512-uuzXp/mvv6jEMLiP5QzERSQPzHqYnv9i8NZ8BS5kYeB2sakv74EewQiCS4Ahxwq3In+9fYZhGztuDHRVzIOkFQ==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -12582,12 +12827,15 @@ "dev": true }, "eslint": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", - "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.4.1", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -12597,11 +12845,10 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", @@ -12622,16 +12869,15 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -12665,38 +12911,21 @@ "estraverse": "^4.1.1" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true }, "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" } }, "esprima": { @@ -12706,9 +12935,9 @@ "dev": true }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -12752,21 +12981,24 @@ "dev": true }, "eufy-security-client": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/eufy-security-client/-/eufy-security-client-2.4.2.tgz", - "integrity": "sha512-7AyOSNfLRyvCyRVziCh35piWWvJemKW3eOYIDXParneisOicZgcKsysLA2r3Y95oKQb6NXqOIbS0B4ph4Y6Dvw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/eufy-security-client/-/eufy-security-client-2.6.2.tgz", + "integrity": "sha512-YNpGwUoX+xMh0iSrkFiNPI7MqUQlrwKJdt61YaGz0wNtdGQAuLUgisWYuALSX8oGfH7isoqXiqcD+lxO449t1g==", "requires": { - "@cospired/i18n-iso-languages": "^4.0.1", + "@cospired/i18n-iso-languages": "^4.1.0", "crypto-js": "^4.1.1", - "fs-extra": "^11.1.0", + "date-and-time": "^3.0.0", + "fs-extra": "^11.1.1", "got": "^11.8.6", - "i18n-iso-countries": "^7.5.0", + "i18n-iso-countries": "^7.6.0", + "image-type": "^4.1.0", + "long": "^5.2.3", "mqtt": "^4.3.7", "node-rsa": "^1.1.1", "node-schedule": "^2.1.1", "p-throttle": "^4.1.1", - "protobuf-typescript": "^6.8.8", - "qs": "^6.11.0", + "protobufjs": "^7.2.3", + "qs": "^6.11.2", "sweet-collections": "^1.1.0", "tiny-typed-emitter": "^2.1.0", "ts-log": "^2.2.5" @@ -13072,6 +13304,11 @@ "flat-cache": "^3.0.4" } }, + "file-type": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", + "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==" + }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -13262,9 +13499,9 @@ "dev": true }, "fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -13686,6 +13923,16 @@ "sparkles": "^1.0.0" } }, + "go2rtc-static": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/go2rtc-static/-/go2rtc-static-1.5.0.tgz", + "integrity": "sha512-UunhdzMWy1Q4vxpH5v9lBY52YxlZ4WAkax/7v2qc6zlHPR4VSoii2lnHMuJETZPJkZoi2xSb3Ub1BSqw76mgpw==", + "requires": { + "got": "^11.8.6", + "https-proxy-agent": "^5.0.1", + "progress": "^2.0.3" + } + }, "got": { "version": "11.8.6", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", @@ -14054,9 +14301,9 @@ } }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "requires": { "agent-base": "6", "debug": "4" @@ -14069,9 +14316,9 @@ "dev": true }, "i18n-iso-countries": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/i18n-iso-countries/-/i18n-iso-countries-7.5.0.tgz", - "integrity": "sha512-PtfKJNWLVhhU0KBX/8asmywjAcuyQk07mmmMwxFJcddTNBJJ1yvpY2qxVmyxbtVF+9+6eg9phgpv83XPUKU5CA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/i18n-iso-countries/-/i18n-iso-countries-7.6.0.tgz", + "integrity": "sha512-HPKjOUKS0BkjiY4ayrsuFbu7Ock++pXLs+FAOYl4WfTL5L0ploEH68fiRAP6Zev5g/jvMFt54KcPGJcb942wbg==", "requires": { "diacritics": "1.3.0" } @@ -14087,6 +14334,14 @@ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, + "image-type": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/image-type/-/image-type-4.1.0.tgz", + "integrity": "sha512-CFJMJ8QK8lJvRlTCEgarL4ro6hfDQKif2HjSvYCdQZESaIPV4v9imrf7BQHK+sQeTeNeMpWciR9hyC/g8ybXEg==", + "requires": { + "file-type": "^10.10.0" + } + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -14474,6 +14729,16 @@ "istanbul-lib-report": "^3.0.0" } }, + "jackspeak": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.0.3.tgz", + "integrity": "sha512-0Jud3OMUdMbrlr3PyUMKESq51LXVAB+a239Ywdvd+Kgxj3MaBRml/nVRxf8tQFyfthMjuRkxkv7Vg58pmIMfuQ==", + "dev": true, + "requires": { + "@pkgjs/parseargs": "^0.11.0", + "cliui": "^7.0.4" + } + }, "js-sdsl": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", @@ -14688,9 +14953,9 @@ } }, "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "long-timeout": { "version": "0.1.1", @@ -14993,6 +15258,12 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -15621,9 +15892,9 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" }, "object-keys": { "version": "1.1.1", @@ -15893,6 +16164,24 @@ "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", "dev": true }, + "path-scurry": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz", + "integrity": "sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==", + "dev": true, + "requires": { + "lru-cache": "^9.0.0", + "minipass": "^5.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.0.tgz", + "integrity": "sha512-qFXQEwchrZcMVen2uIDceR8Tii6kCJak5rzDStfEM0qA3YLMswaxIEZO0DhIbJ3aqaJiDjt+3crlplOb0tDtKQ==", + "dev": true + } + } + }, "path-to-regexp": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", @@ -16032,10 +16321,10 @@ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, - "protobuf-typescript": { - "version": "6.8.8", - "resolved": "https://registry.npmjs.org/protobuf-typescript/-/protobuf-typescript-6.8.8.tgz", - "integrity": "sha512-5i3vXZSEB5uksn6E3PMCcO2WRyY4TrETyXfP1INrk3Sl43vjVmT1uCCI/gEHS8LVHtD6foAb3YyO6vqRlpYMHw==", + "protobufjs": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.3.tgz", + "integrity": "sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==", "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -16047,16 +16336,8 @@ "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.0", - "@types/node": "^12.12.14", - "long": "^4.0.0" - }, - "dependencies": { - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - } + "@types/node": ">=13.7.0", + "long": "^5.0.0" } }, "proxyquire": { @@ -16098,9 +16379,9 @@ "dev": true }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "requires": { "side-channel": "^1.0.4" } @@ -16234,12 +16515,6 @@ "safe-regex": "^1.1.0" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, "reinterval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", @@ -16393,10 +16668,63 @@ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, "rimraf": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.1.2.tgz", - "integrity": "sha512-BlIbgFryTbw3Dz6hyoWFhKk+unCcHMSkZGrTFVAx2WmttdBSonsdtRlwiuTbDqTKr+UlXIUqJVS4QT5tUzGENQ==", - "dev": true + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.0.tgz", + "integrity": "sha512-Jf9llaP+RvaEVS5nPShYFhtXIrb3LRKP281ib3So0KkeZKo2wIKyq0Re7TOSwanasA423PSr6CCIL4bP6T040g==", + "dev": true, + "requires": { + "glob": "^10.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + } + }, + "glob": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.1.tgz", + "integrity": "sha512-ngom3wq2UhjdbmRE/krgkD8BQyi1KZ5l+D2dVm4+Yj+jJIBp74/ZGunL6gNGc/CYuQmvUBiavWEXIotRiv5R6A==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "fs.realpath": "^1.0.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.0", + "minipass": "^5.0.0", + "path-scurry": "^1.7.0" + } + }, + "minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "signal-exit": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", + "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", + "dev": true + } + } }, "run-parallel": { "version": "1.2.0", @@ -16530,19 +16858,28 @@ "dev": true }, "sinon": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.1.tgz", - "integrity": "sha512-PZXKc08f/wcA/BMRGBze2Wmw50CWPiAH3E21EOi4B49vJ616vW4DQh4fQrqsYox2aNR/N3kCqLuB0PwwOucQrg==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.4.tgz", + "integrity": "sha512-uzmfN6zx3GQaria1kwgWGeKiXSSbShBbue6Dcj0SI8fiCNFbiUDqKl57WFlY5lyhxZVUKmXvzgG2pilRQCBwWg==", "dev": true, "requires": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "10.0.2", - "@sinonjs/samsam": "^7.0.1", - "diff": "^5.0.0", - "nise": "^5.1.2", + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.1.0", + "nise": "^5.1.4", "supports-color": "^7.2.0" }, "dependencies": { + "@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, "@sinonjs/fake-timers": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", @@ -16550,7 +16887,46 @@ "dev": true, "requires": { "@sinonjs/commons": "^2.0.0" + }, + "dependencies": { + "@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + } } + }, + "@sinonjs/samsam": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", + "dev": true, + "requires": { + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + }, + "dependencies": { + "@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + } + } + }, + "diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true } } }, @@ -16797,9 +17173,9 @@ } }, "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -16823,9 +17199,9 @@ } }, "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, "split-string": { @@ -17247,9 +17623,9 @@ } }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true }, "unc-path-regex": { diff --git a/package.json b/package.json index a773f7c..a52b893 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iobroker.eusec", - "version": "0.9.10", + "version": "1.0.0", "description": "ioBroker adapter that integrates Eufy-Security cameras with stations", "author": { "name": "bropat", @@ -24,20 +24,21 @@ }, "dependencies": { "@bropat/fluent-ffmpeg": "^2.1.3", - "@cospired/i18n-iso-languages": "^4.0.1", - "@iobroker/adapter-core": "^2.6.7", - "eufy-security-client": "^2.4.2", + "@cospired/i18n-iso-languages": "^4.1.0", + "@iobroker/adapter-core": "^2.6.8", + "eufy-security-client": "^2.6.2", "ffmpeg-static": "^5.1.0", - "fs-extra": "^11.1.0", + "fs-extra": "^11.1.1", + "go2rtc-static": "^1.5.0", "got": "^11.8.6", - "i18n-iso-countries": "^7.5.0", + "i18n-iso-countries": "^7.6.0", "mime": "^3.0.0", "ts-log": "^2.2.5" }, "devDependencies": { "@alcalzone/release-script": "^3.5.9", "@iobroker/testing": "^4.1.0", - "@types/chai": "^4.3.4", + "@types/chai": "^4.3.5", "@types/chai-as-promised": "^7.1.5", "@types/express": "^4.17.17", "@types/ffmpeg-static": "^3.0.1", @@ -45,25 +46,25 @@ "@types/gulp": "^4.0.10", "@types/mime": "^3.0.1", "@types/mocha": "^10.0.1", - "@types/node": "^16.18.12", + "@types/node": "^16.18.30", "@types/proxyquire": "^1.3.28", - "@types/sinon": "^10.0.13", + "@types/sinon": "^10.0.15", "@types/sinon-chai": "^3.2.9", - "@typescript-eslint/eslint-plugin": "^5.52.0", - "@typescript-eslint/parser": "^5.52.0", + "@typescript-eslint/eslint-plugin": "^5.59.6", + "@typescript-eslint/parser": "^5.59.6", "chai": "^4.3.7", "chai-as-promised": "^7.1.1", - "eslint": "^8.34.0", + "eslint": "^8.40.0", "gulp": "^4.0.2", "mocha": "^10.2.0", "nyc": "^15.1.0", "proxyquire": "^2.1.3", - "rimraf": "^4.1.2", - "sinon": "^15.0.1", + "rimraf": "^5.0.0", + "sinon": "^15.0.4", "sinon-chai": "^3.7.0", "source-map-support": "^0.5.21", "ts-node": "^10.9.1", - "typescript": "4.9.5" + "typescript": "5.0.4" }, "main": "build/main.js", "files": [ diff --git a/src/lib/interfaces.ts b/src/lib/interfaces.ts index 175dddd..5b3a47d 100755 --- a/src/lib/interfaces.ts +++ b/src/lib/interfaces.ts @@ -9,25 +9,20 @@ export interface AdapterConfig { p2pConnectionType: string; acceptInvitations: boolean; alarmSoundDuration: number; - autoDownloadVideo: boolean; - autoDownloadPicture: boolean; + go2rtc_api_port: number; + go2rtc_rtsp_port: number; + go2rtc_srtp_port: number; + go2rtc_webrtc_port: number; + go2rtc_rtsp_username: string; + go2rtc_rtsp_password: string; + hostname: string; + https: boolean; } export interface PersistentData { version: string; } -export interface ImageResponse { - status: number; - statusText: string; - imageUrl: string; - imageHtml: string; -} - -export interface IStoppablePromise extends Promise { - stop: () => void; -} - export interface IRoleMapping { [index: string]: string; } \ No newline at end of file diff --git a/src/lib/types.ts b/src/lib/types.ts index a7fdca6..f13e65f 100755 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,6 +1,6 @@ import { PropertyName } from "eufy-security-client"; -import { IRoleMapping, IStoppablePromise } from "./interfaces"; +import { IRoleMapping } from "./interfaces"; export const DataLocation = { LIVESTREAM: "live", @@ -10,10 +10,7 @@ export const DataLocation = { } export const STREAM_FILE_NAME_EXT = ".m3u8"; -export const IMAGE_FILE_JPEG_EXT = ".jpeg"; -export const IMAGE_FILE_PNG_EXT = ".png"; - -export type StoppablePromise = IStoppablePromise; +export const IMAGE_FILE_JPEG_EXT = ".jpg"; export const RoleMapping: IRoleMapping = { [PropertyName.Name]: "info.name", @@ -31,96 +28,28 @@ export const RoleMapping: IRoleMapping = { [PropertyName.DeviceSensorOpen]: "sensor", [PropertyName.DeviceBatteryLow]: "indicator.lowbat", [PropertyName.DeviceLockStatus]: "info.status", + [PropertyName.DeviceDogLickDetected]: "sensor", + [PropertyName.DeviceDogPoopDetected]: "sensor", + [PropertyName.DeviceVehicleDetected]: "sensor", + [PropertyName.DeviceRadarMotionDetected]: "sensor.motion", + [PropertyName.DeviceStrangerPersonDetected]: "sensor.motion", + [PropertyName.DeviceIdentityPersonDetected]: "sensor.motion", + [PropertyName.DeviceChargingStatus]: "info.status", } export const DeviceStateID = { - NAME: "name", - MODEL: "model", - SERIAL_NUMBER: "serial_number", - HARDWARE_VERSION: "hardware_version", - SOFTWARE_VERSION: "software_version", - ENABLED: "device_enabled" -} - -export const CameraStateID = { - ...DeviceStateID, - STATE: "state", - MAC_ADDRESS: "mac_address", - LAST_EVENT_PIC_URL: "last_event_pic_url", + /*LAST_EVENT_PIC_URL: "last_event_pic_url", LAST_EVENT_PIC_HTML: "last_event_pic_html", - LAST_EVENT_VIDEO_URL: "last_event_video_url", + LAST_EVENT_VIDEO_URL: "last_event_video_url",*/ LIVESTREAM: "livestream", - LAST_LIVESTREAM_VIDEO_URL: "last_livestream_video_url", - LAST_LIVESTREAM_PIC_URL: "last_livestream_pic_url", - LAST_LIVESTREAM_PIC_HTML: "last_livestream_pic_html", START_STREAM: "start_stream", STOP_STREAM: "stop_stream", - BATTERY: "battery", - BATTERY_TEMPERATURE: "battery_temperature", - LAST_CHARGE_TOTAL_EVENTS: "last_charge_total_events", - LAST_CHARGE_USED_DAYS: "last_charge_used_days", - LAST_CHARGE_FILTERED_EVENTS: "last_charge_filtered_events", - LAST_CHARGE_SAVED_EVENTS: "last_charge_saved_events", - WIFI_RSSI: "wifi_rssi", - MOTION_DETECTED: "motion_detected", - PERSON_DETECTED: "person_detected", - LAST_PERSON_IDENTIFIED: "last_person_identified", - WATERMARK: "watermark", - ANTITHEFT_DETECTION: "antitheft_detection", - AUTO_NIGHTVISION: "auto_nightvision", - MOTION_DETECTION: "motion_detection", - LED_STATUS: "led_status", - RTSP_STREAM: "rtsp_stream", RTSP_STREAM_URL: "rtsp_stream_url", TRIGGER_ALARM_SOUND: "trigger_alarm_sound", RESET_ALARM_SOUND: "reset_alarm_sound", -} - -export const StationStateID = { - ...DeviceStateID, - GUARD_MODE: "guard_mode", - CURRENT_MODE: "current_mode", - LAN_IP_ADDRESS: "lan_ip_address", - MAC_ADDRESS: "mac_address", - REBOOT: "reboot", - CONNECTION: "connection", - TRIGGER_ALARM_SOUND: "trigger_alarm_sound", - RESET_ALARM_SOUND: "reset_alarm_sound", -} - -export const EntrySensorStateID = { - ...DeviceStateID, - STATE: "state", - SENSOR_OPEN: "sensor_open", - LOW_BATTERY: "low_battery", - SENSOR_CHANGE_TIME: "sensor_change_time", -} - -export const MotionSensorStateID = { - ...DeviceStateID, - STATE: "state", - LOW_BATTERY: "low_battery", - MOTION_DETECTED: "motion_detected", -} - -export const KeyPadStateID = { - ...DeviceStateID, - STATE: "state", - LOW_BATTERY: "low_battery", -} - -export const DoorbellStateID = { - ...CameraStateID, - RINGING: "ringing", -} - -export const IndoorCameraStateID = { - ...CameraStateID, - CRYING_DETECTED: "crying_detected", - SOUND_DETECTED: "sound_detected", - SOUND_DETECTION: "sound_detection", - PET_DETECTED: "pet_detected", - PET_DETECTION: "pet_detection", + PICTURE_URL: "picture_url", + PICTURE_HTML: "picture_html", + LIVESTREAM_RTSP: "livestream_rtsp", PAN_LEFT: "pan_left", PAN_RIGHT: "pan_right", TILT_UP: "tilt_up", @@ -128,22 +57,13 @@ export const IndoorCameraStateID = { ROTATE_360: "rotate_360", SET_DEFAULT_ANGLE: "set_default_angle", SET_PRIVACY_ANGLE: "set_privacy_angle", -} - -export const LockStateID = { - ...DeviceStateID, - STATE: "state", - BATTERY: "battery", - WIFI_RSSI: "wifi_rssi", - LOCK: "lock", - LOCK_STATUS: "lock_status", CALIBRATE: "calibrate", + UNLOCK: "unlock", } -export const SmartSafeStateID = { - ...DeviceStateID, - STATE: "state", - BATTERY: "battery", - WIFI_RSSI: "wifi_rssi", - UNLOCK: "unlock", +export const StationStateID = { + REBOOT: "reboot", + CONNECTION: "connection", + TRIGGER_ALARM_SOUND: "trigger_alarm_sound", + RESET_ALARM_SOUND: "reset_alarm_sound", } \ No newline at end of file diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 313bdbc..a996989 100755 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,11 +1,8 @@ -import got, { Response } from "got"; import { CommandType, Device } from "eufy-security-client"; import path from "path"; import fse from "fs-extra"; import * as utils from "@iobroker/adapter-core"; -import { CameraStateID, DoorbellStateID, EntrySensorStateID, IMAGE_FILE_JPEG_EXT, IndoorCameraStateID, KeyPadStateID, MotionSensorStateID, StationStateID } from "./types"; -import { ImageResponse } from "./interfaces"; import { ioBrokerLogger } from "./log"; // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types @@ -22,23 +19,9 @@ export const isEmpty = function(str: string | null | undefined): boolean { return true; }; -export const getImage = async function(url: string): Promise> { - const response = await got(url, { - method: "GET", - responseType: "buffer", - http2: true, - throwHttpErrors: false, - retry: { - limit: 3, - methods: ["GET"] - } - }); - return response; -} - -export const getImageAsHTML = function(data: Buffer): string { +export const getImageAsHTML = function(data: Buffer, mime = "image/jpg"): string { if (data && data.length > 0) - return ``; + return ``; return ""; } @@ -50,41 +33,6 @@ export const getDataFilePath = function(adapter: ioBroker.Adapter, stationSerial return path.join(dir_path, fileName); } -export const saveImage = async function(adapter: ioBroker.Adapter, url: string, station_sn: string, device_sn: string, location: string): Promise { - const result: ImageResponse = { - status: 0, - statusText: "", - imageUrl: "", - imageHtml: "" - }; - try { - if (url) { - const response = await getImage(url); - result.status = response.statusCode; - result.statusText = response.statusMessage ? response.statusMessage : ""; - if (result.status === 200) { - const data = response.body; - const fileName = `${device_sn}${IMAGE_FILE_JPEG_EXT}`; - const filePath = path.join(utils.getAbsoluteInstanceDataDir(adapter), station_sn, location); - - if (!fse.existsSync(filePath)) { - fse.mkdirSync(filePath, {mode: 0o775, recursive: true}); - } - - await fse.writeFile(path.join(filePath, fileName), data).then(() => { - result.imageUrl = `/${adapter.namespace}/${station_sn}/${location}/${device_sn}${IMAGE_FILE_JPEG_EXT}`; - result.imageHtml = getImageAsHTML(data); - }).catch(error => { - adapter.log.error(`saveImage(): writeFile Error: ${error} - url: ${url}`); - }); - } - } - } catch (error) { - adapter.log.error(`saveImage(): Error: ${error} - url: ${url}`); - } - return result; -} - export const setStateAsync = async function(adapter: ioBroker.Adapter, state_id: string, common_name: string, value: string, role = "text", type: "string" | "number" | "boolean" | "object" | "array" | "mixed" | "file" | undefined = "string"): Promise { await adapter.setObjectNotExistsAsync(state_id, { type: "state", @@ -101,26 +49,6 @@ export const setStateAsync = async function(adapter: ioBroker.Adapter, state_id: await adapter.setStateAsync(state_id, { val: value, ack: true }); } -export const saveImageStates = async function(adapter: ioBroker.Adapter, url: string, station_sn: string, device_sn: string, location: string, url_state_id: string, html_state_id: string, prefix_common_name: string, retry = 1): Promise { - if (adapter.config.autoDownloadPicture) { - const image_data = await saveImage(adapter, url, station_sn, device_sn, location); - if (image_data.status === 404) { - if (retry < 6) { - adapter.log.info(`Retry get image in ${5 * retry} seconds from url: ${url} (retry_count: ${retry} error: ${image_data.statusText} message: ${image_data.statusText})...`); - setTimeout(() => { - saveImageStates(adapter, url, station_sn, device_sn, location, url_state_id, html_state_id, prefix_common_name, ++retry); - }, 5 * 1000 * retry); - } else { - adapter.log.warn(`Could not download the image within 5 attempts from url: ${url} (error: ${image_data.statusText} message: ${image_data.statusText})`); - } - return; - } else if (image_data.status === 200) { - setStateAsync(adapter, url_state_id, `${prefix_common_name} URL`, image_data.imageUrl, "url"); - setStateAsync(adapter, html_state_id, `${prefix_common_name} HTML image`, image_data.imageHtml, "html"); - } - } -} - export const removeFiles = function(adapter: ioBroker.Adapter, stationSerial: string, folderName: string, device_sn: string): Promise { return new Promise((resolve, reject) => { try { @@ -213,133 +141,32 @@ export const removeLastChar = function(text: string, char: string): string { return strArr.join(""); } -export const handleUpdate = async function(adapter: ioBroker.Adapter, log: ioBrokerLogger, old_version: number): Promise { - if (old_version <= 0.31) { - try { - const watermark = await adapter.getStatesAsync("*.watermark"); - if (watermark) - Object.keys(watermark).forEach(async id => { - await adapter.delObjectAsync(id).catch(); - }); - } catch (error) { - log.error("Version 0.3.1 - watermark: Error:", error); - } - try { - const state = await adapter.getStatesAsync("*.state"); - if (state) - Object.keys(state).forEach(async id => { - await adapter.delObjectAsync(id).catch(); - }); - } catch (error) { - log.error("Version 0.3.1 - state: Error:", error); - } - try { - const wifi_rssi = await adapter.getStatesAsync("*.wifi_rssi"); - if (wifi_rssi) - Object.keys(wifi_rssi).forEach(async id => { - await adapter.delObjectAsync(id).catch(); - }); - } catch (error) { - log.error("Version 0.3.1 - wifi_rssi: Error:", error); - } +export const changeRole = async function(adapter: ioBroker.Adapter, log: ioBrokerLogger, state: string, role: string): Promise { + try { + const states = await adapter.getStatesAsync(`*.${state}`); + if (states) + Object.keys(states).forEach(async id => { + await adapter.extendObjectAsync(id, { + type: "state", + common: { + role: role + } + }, {}).catch(); + }); + } catch (error) { + log.error(`state: ${state} role: ${role} - Error:`, error); } - if (old_version <= 0.41) { - try { - const changeRole = async function(adapter: ioBroker.Adapter, state: string, role: string): Promise { - try { - const states = await adapter.getStatesAsync(`*.${state}`); - if (states) - Object.keys(states).forEach(async id => { - await adapter.extendObjectAsync(id, { - type: "state", - common: { - role: role - } - }, {}).catch(); - }); - } catch (error) { - log.error(`state: ${state} role: ${role} - Error:`, error); - } - }; +}; - await changeRole(adapter, CameraStateID.STATE, "value"); - await changeRole(adapter, CameraStateID.LIVESTREAM, "url"); - await changeRole(adapter, CameraStateID.LAST_LIVESTREAM_PIC_URL, "url"); - await changeRole(adapter, CameraStateID.LAST_LIVESTREAM_PIC_HTML, "html"); - await changeRole(adapter, CameraStateID.LAST_LIVESTREAM_VIDEO_URL, "url"); - await changeRole(adapter, CameraStateID.ENABLED, "switch.enable"); - await changeRole(adapter, CameraStateID.ANTITHEFT_DETECTION, "switch.enable"); - await changeRole(adapter, CameraStateID.AUTO_NIGHTVISION, "switch.enable"); - await changeRole(adapter, CameraStateID.MOTION_DETECTION, "switch.enable"); - await changeRole(adapter, CameraStateID.RTSP_STREAM, "switch.enable"); - await changeRole(adapter, CameraStateID.RTSP_STREAM_URL, "url"); - await changeRole(adapter, CameraStateID.LED_STATUS, "switch.enable"); - await changeRole(adapter, CameraStateID.MOTION_DETECTED, "sensor.motion"); - await changeRole(adapter, CameraStateID.PERSON_DETECTED, "sensor.motion"); - await changeRole(adapter, CameraStateID.LAST_PERSON_IDENTIFIED, "text"); - await changeRole(adapter, CameraStateID.LAST_EVENT_PIC_URL, "url"); - await changeRole(adapter, CameraStateID.LAST_EVENT_PIC_HTML, "html"); - await changeRole(adapter, CameraStateID.LAST_EVENT_VIDEO_URL, "url"); - await changeRole(adapter, DoorbellStateID.RINGING, "sensor"); - await changeRole(adapter, IndoorCameraStateID.SOUND_DETECTION, "switch.enable"); - await changeRole(adapter, IndoorCameraStateID.PET_DETECTION, "switch.enable"); - await changeRole(adapter, IndoorCameraStateID.SOUND_DETECTED, "sensor.noise"); - await changeRole(adapter, IndoorCameraStateID.CRYING_DETECTED, "sensor.noise"); - await changeRole(adapter, IndoorCameraStateID.PET_DETECTED, "sensor"); - await changeRole(adapter, EntrySensorStateID.STATE, "value"); - await changeRole(adapter, EntrySensorStateID.SENSOR_OPEN, "sensor"); - await changeRole(adapter, EntrySensorStateID.LOW_BATTERY, "sensor"); - await changeRole(adapter, EntrySensorStateID.SENSOR_CHANGE_TIME, "value"); - await changeRole(adapter, MotionSensorStateID.STATE, "value"); - await changeRole(adapter, MotionSensorStateID.LOW_BATTERY, "sensor"); - await changeRole(adapter, MotionSensorStateID.MOTION_DETECTED, "sensor.motion"); - await changeRole(adapter, KeyPadStateID.STATE, "value"); - await changeRole(adapter, KeyPadStateID.LOW_BATTERY, "sensor"); - await changeRole(adapter, StationStateID.CURRENT_MODE, "value"); - } catch (error) { - log.error("Version 0.4.1 - Error:", error); - } - } - if (old_version <= 0.42) { - try { - const changeRole = async function(adapter: ioBroker.Adapter, state: string, role: string): Promise { - try { - const states = await adapter.getStatesAsync(`*.${state}`); - if (states) - Object.keys(states).forEach(async id => { - await adapter.extendObjectAsync(id, { - type: "state", - common: { - role: role - } - }, {}).catch(); - }); - } catch (error) { - log.error(`state: ${state} role: ${role} - Error:`, error); - } - }; +export const deleteStates = async function(adapter: ioBroker.Adapter, property: string): Promise { + const states = await adapter.getStatesAsync(`*.${property}`); + if (states) + Object.keys(states).forEach(async id => { + await adapter.delObjectAsync(id).catch(); + }); +}; - await changeRole(adapter, CameraStateID.STATE, "info.status"); - await changeRole(adapter, CameraStateID.NAME, "info.name"); - await changeRole(adapter, CameraStateID.MAC_ADDRESS, "info.mac"); - await changeRole(adapter, CameraStateID.BATTERY, "value.battery"); - await changeRole(adapter, CameraStateID.BATTERY_TEMPERATURE, "value.temperature"); - await changeRole(adapter, EntrySensorStateID.LOW_BATTERY, "indicator.lowbat"); - await changeRole(adapter, StationStateID.LAN_IP_ADDRESS, "info.ip"); - } catch (error) { - log.error("Version 0.4.2 - States - Error:", error); - } - try { - if (fse.existsSync(path.join(utils.getAbsoluteDefaultDataDir(), "files", adapter.namespace))) { - if (!fse.existsSync(utils.getAbsoluteInstanceDataDir(adapter))) - fse.mkdirpSync(utils.getAbsoluteInstanceDataDir(adapter)); - const files = fse.readdirSync(path.join(utils.getAbsoluteDefaultDataDir(), "files", adapter.namespace)).filter(fn => fn.startsWith("T")); - files.map(filename => fse.moveSync(path.join(utils.getAbsoluteDefaultDataDir(), "files", adapter.namespace, filename), path.join(utils.getAbsoluteInstanceDataDir(adapter), filename))); - } - } catch (error) { - log.error("Version 0.4.2 - Files - Error:", error); - } - } +export const handleUpdate = async function(adapter: ioBroker.Adapter, log: ioBrokerLogger, old_version: number): Promise { if (old_version <= 0.61) { try { const all = await adapter.getStatesAsync("T*"); @@ -383,6 +210,15 @@ export const handleUpdate = async function(adapter: ioBroker.Adapter, log: ioBro log.error("Version 0.7.4: Error:", error); } } + if (old_version <= 1) { + for (const state of ["last_event_pic_url", "last_event_pic_html", "last_event_video_url"]) { + try { + await deleteStates(adapter, state); + } catch (error) { + log.error(`Version 1.0.0 - ${state}: Error:`, error); + } + } + } }; export const convertCamelCaseToSnakeCase = function (value: string): string { diff --git a/src/lib/video.ts b/src/lib/video.ts index da13a2a..24dea27 100755 --- a/src/lib/video.ts +++ b/src/lib/video.ts @@ -9,7 +9,6 @@ import fse from "fs-extra"; import { ioBrokerLogger } from "./log"; import { lowestUnusedNumber } from "./utils"; -import { StoppablePromise } from "./types"; class UniversalStream { @@ -117,13 +116,6 @@ export const ffmpegStreamToHls = (config: ioBroker.AdapterConfig, namespace: str log.error("ffmpegStreamToHls(): Audiostream Error", error); }); - //TODO: For debugging purposes - /*const outputFile = path.resolve(__dirname, "../../test-stream.dump"); - videoStream.pipe(fse.createWriteStream(outputFile)).on("finish", () => { - log.debug("videoStream dump finished!"); - log.info("Manually test the output by running# ffplay output/test-stream.dump"); - });*/ - const uVideoStream = StreamInput(namespace, videoStream); const uAudioStream = StreamInput(namespace, audioStream); @@ -200,61 +192,98 @@ export const ffmpegStreamToHls = (config: ioBroker.AdapterConfig, namespace: str }); } -export const ffmpegRTMPToHls = (config: ioBroker.AdapterConfig, rtmp_url: string, output: string, log: ioBrokerLogger): StoppablePromise => { - let resolveCb: () => void; - let ffmpegCommand: ffmpeg.FfmpegCommand; - - const rtmpPromise = new Promise((resolve, reject) => { - resolveCb = resolve; +export const ffmpegStreamToGo2rtc = (config: ioBroker.AdapterConfig, namespace: string, camera: string, metadata: StreamMetadata, videoStream: Readable, audioStream: Readable, log: ioBrokerLogger): Promise => { + return new Promise((resolve, reject) => { try { if (pathToFfmpeg) { ffmpeg.setFfmpegPath(pathToFfmpeg); - ffmpegCommand = ffmpeg(rtmp_url) + log.warn("ffmpegStreamToGo2rtc(): Started"); + + videoStream.on("error", (error) => { + log.error("ffmpegStreamToGo2rtc(): Videostream Error", error); + }); + + audioStream.on("error", (error) => { + log.error("ffmpegStreamToGo2rtc(): Audiostream Error", error); + }); + + //TODO: For debugging purposes + /*const outputFile = path.resolve(__dirname, "../../test-stream.dump"); + videoStream.pipe(fse.createWriteStream(outputFile)).on("finish", () => { + log.debug("videoStream dump finished!"); + log.info("Manually test the output by running# ffplay output/test-stream.dump"); + });*/ + + const uVideoStream = StreamInput(namespace, videoStream); + const uAudioStream = StreamInput(namespace, audioStream); + + let videoFormat = "h264"; + let audioFormat = ""; + const options: string[] = [ + "-rtsp_transport tcp", + "-sc_threshold 0", + `-g ${metadata.videoFPS}`, + "-fflags genpts+nobuffer+flush_packets", + //"-rtpflags latm", + ]; + + switch(metadata.videoCodec) { + case VideoCodec.H264: + videoFormat = "h264"; + break; + case VideoCodec.H265: + videoFormat = "hevc"; + break; + } + + switch(metadata.audioCodec) { + case AudioCodec.AAC: + audioFormat = "aac"; + break; + } + + const command = ffmpeg() .withProcessOptions({ detached: true }) - .videoCodec("copy") - .audioCodec("copy") - .output(output) - .addOptions([ - "-hls_init_time 0", - "-hls_time 2", - "-hls_segment_type mpegts", - "-absf aac_adtstoasc", - //"-start_number 1", - "-sc_threshold 0", - "-g 15", - "-fflags genpts+nobuffer+flush_packets", - //"-flush_packets 1", - "-hls_playlist_type event" - ]) + .input(uVideoStream.url) + .inputFormat(videoFormat) + .inputFps(metadata.videoFPS) + .videoCodec("copy"); + if (audioFormat !== "") { + command.input(uAudioStream.url) + .inputFormat(audioFormat) + //.audioCodec("copy"); + //.audioCodec("aac"); + .audioCodec("opus"); + } else { + log.warn(`ffmpegStreamToGo2rtc(): Not support audio codec or unknown audio codec (${AudioCodec[metadata.audioCodec]})`); + } + command.output(`rtsp://localhost:${config.go2rtc_rtsp_port}/${camera}`) + .outputFormat("rtsp") + .addOptions(options) .on("error", function(err, stdout, stderr) { - log.error(`ffmpegRTMPToHls(): An error occurred: ${err.message}`); - log.error(`ffmpegRTMPToHls(): ffmpeg output:\n${stdout}`); - log.error(`ffmpegRTMPToHls(): ffmpeg stderr:\n${stderr}`); + log.error(`ffmpegStreamToGo2rtc(): An error occurred: ${err.message}`); + log.error(`ffmpegStreamToGo2rtc(): ffmpeg output:\n${stdout}`); + log.error(`ffmpegStreamToGo2rtc(): ffmpeg stderr:\n${stderr}`); + uVideoStream.close(); + uAudioStream.close(); reject(err); }) .on("end", () => { - log.debug("ffmpegRTMPToHls(): Processing finished!"); + log.debug("ffmpegStreamToGo2rtc(): Processing finished!"); + uVideoStream.close(); + uAudioStream.close(); resolve(); }); - ffmpegCommand.run(); + command.run(); } else { reject(new Error("ffmpeg binary not found")); } } catch (error) { - log.error(`ffmpegRTMPToHls(): Error: ${error}`); + log.error(`ffmpegStreamToGo2rtc(): Error: ${error}`); reject(error); } - }) as StoppablePromise; - - rtmpPromise.stop = () => { - ffmpegCommand.removeAllListeners(); - //ffmpegCommand.kill("SIGINT"); - ffmpegCommand.quit(); - resolveCb(); - }; - - return rtmpPromise; -} \ No newline at end of file + }); +} diff --git a/src/main.ts b/src/main.ts index 0f9371b..39e926e 100755 --- a/src/main.ts +++ b/src/main.ts @@ -6,19 +6,22 @@ import * as utils from "@iobroker/adapter-core"; // eslint-disable-next-line @typescript-eslint/no-unused-vars import { strict } from "assert"; import * as path from "path"; -import { Camera, Device, Station, PushMessage, P2PConnectionType, EufySecurity, EufySecurityConfig, CommandResult, CommandType, ErrorCode, PropertyValue, PropertyName, StreamMetadata, PropertyMetadataNumeric, PropertyMetadataAny, CommandName, PanTiltDirection, DeviceNotFoundError, LoginOptions } from "eufy-security-client"; +import { Camera, Device, Station, PushMessage, P2PConnectionType, EufySecurity, EufySecurityConfig, CommandResult, CommandType, ErrorCode, PropertyValue, PropertyName, StreamMetadata, PropertyMetadataNumeric, PropertyMetadataAny, CommandName, PanTiltDirection, DeviceNotFoundError, LoginOptions, Picture, StationNotFoundError } from "eufy-security-client"; import { getAlpha2Code as getCountryCode } from "i18n-iso-countries" import { isValid as isValidLanguageCode } from "@cospired/i18n-iso-languages" import fse from "fs-extra"; import { Readable } from "stream"; import util from "util"; +import childProcess from "child_process"; +import pathToGo2rtc from "go2rtc-static"; +import os from "os"; import * as Interface from "./lib/interfaces" -import { CameraStateID, DataLocation, IMAGE_FILE_JPEG_EXT, IndoorCameraStateID, LockStateID, RoleMapping, SmartSafeStateID, StationStateID, StoppablePromise, STREAM_FILE_NAME_EXT } from "./lib/types"; -import { convertCamelCaseToSnakeCase, getDataFilePath, getImageAsHTML, getVideoClipLength, handleUpdate, isEmpty, moveFiles, removeFiles, removeLastChar, setStateAsync, sleep, setStateChangedAsync } from "./lib/utils"; +import { DeviceStateID, DataLocation, RoleMapping, StationStateID } from "./lib/types"; +import { convertCamelCaseToSnakeCase, getImageAsHTML, handleUpdate, removeFiles, removeLastChar, setStateChangedAsync } from "./lib/utils"; import { PersistentData } from "./lib/interfaces"; import { ioBrokerLogger } from "./lib/log"; -import { ffmpegPreviewImage, ffmpegRTMPToHls, ffmpegStreamToHls } from "./lib/video"; +import { ffmpegStreamToGo2rtc } from "./lib/video"; // Augment the adapter.config object with the actual types // TODO: delete this in the next version @@ -37,16 +40,15 @@ declare global { export class euSec extends utils.Adapter { private eufy!: EufySecurity; - private downloadEvent: { + /*private downloadEvent: { [index: string]: NodeJS.Timeout; - } = {}; + } = {};*/ private persistentFile: string; private logger!: ioBrokerLogger; private persistentData: PersistentData = { version: "" }; - private rtmpFFmpegPromise: Map = new Map(); private captchaId: string | null = null; private verify_code = false; @@ -202,6 +204,11 @@ export class euSec extends utils.Adapter { if (isValidLanguageCode(systemConfig.common.language)) languageCode = systemConfig.common.language; } + + if (this.config.hostname === "") { + this.config.hostname = os.hostname(); + } + // Handling adapter version update try { if (this.persistentData.version !== this.version) { @@ -234,7 +241,6 @@ export class euSec extends utils.Adapter { p2pConnectionSetup: connectionType, pollingIntervalMinutes: this.config.pollingInterval, acceptInvitations: this.config.acceptInvitations, - //trustedDeviceName: "IOBROKER", }; this.eufy = await EufySecurity.initialize(config, this.logger); @@ -250,13 +256,11 @@ export class euSec extends utils.Adapter { this.eufy.on("connect", () => this.onConnect()); this.eufy.on("close", () => this.onClose()); - this.eufy.on("cloud livestream start", (station: Station, device: Device, url: string) => this.onCloudLivestreamStart(station, device, url)); - this.eufy.on("cloud livestream stop", (station: Station, device: Device) => this.onCloudLivestreamStop(station, device)); this.eufy.on("device property changed", (device: Device, name: string, value: PropertyValue) => this.onDevicePropertyChanged(device, name, value)); this.eufy.on("station command result", (station: Station, result: CommandResult) => this.onStationCommandResult(station, result)); - this.eufy.on("station download start", (station: Station, device: Device, metadata: StreamMetadata, videostream: Readable, audiostream: Readable) => this.onStationDownloadStart(station, device, metadata, videostream, audiostream)); - this.eufy.on("station download finish", (station: Station, device: Device) => this.onStationDownloadFinish(station, device)); + //this.eufy.on("station download start", (station: Station, device: Device, metadata: StreamMetadata, videostream: Readable, audiostream: Readable) => this.onStationDownloadStart(station, device, metadata, videostream, audiostream)); + //this.eufy.on("station download finish", (station: Station, device: Device) => this.onStationDownloadFinish(station, device)); this.eufy.on("station livestream start", (station: Station, device: Device, metadata: StreamMetadata, videostream: Readable, audiostream: Readable) => this.onStationLivestreamStart(station, device, metadata, videostream, audiostream)); this.eufy.on("station livestream stop", (station: Station, device: Device) => this.onStationLivestreamStop(station, device)); this.eufy.on("station rtsp url", (station: Station, device: Device, value: string) => this.onStationRTSPUrl(station, device, value)); @@ -268,6 +272,53 @@ export class euSec extends utils.Adapter { this.eufy.setCameraMaxLivestreamDuration(this.config.maxLivestreamDuration); await this.eufy.connect(); + + if (pathToGo2rtc) { + const go2rtcConfig: { + [index: string]: { + [index: string]: string | number | null + } + } = { + "api": { + "listen": `:${this.config.go2rtc_api_port}` + }, + "rtsp": { + "listen": `:${this.config.go2rtc_rtsp_port}` + }, + "srtp": { + "listen": `:${this.config.go2rtc_srtp_port}` + }, + "webrtc": { + "listen": `:${this.config.go2rtc_webrtc_port}` + }, + "streams": {} + }; + if (this.config.go2rtc_rtsp_username !== "" && this.config.go2rtc_rtsp_password !== "") { + go2rtcConfig.rtsp.username = this.config.go2rtc_rtsp_username; + go2rtcConfig.rtsp.password = this.config.go2rtc_rtsp_password; + } + for (const device of await this.eufy.getDevices()) { + go2rtcConfig.streams[device.getSerial()] = null; + } + const go2rtc = childProcess.spawn(pathToGo2rtc, ["-config", JSON.stringify(go2rtcConfig)], { shell: false, detached: false, windowsHide: true }); + go2rtc.on("error", (error) => { + this.log.error(`go2rtc error: ${error}`); + }); + go2rtc.stdout.setEncoding("utf8"); + go2rtc.stdout.on("data", (data) => { + this.log.info(`go2rtc started: ${data}`); + }); + go2rtc.stderr.setEncoding("utf8"); + go2rtc.stderr.on("data", (data) => { + this.log.error(`go2rtc error: ${data}`); + }); + go2rtc.on("close", (exitcode) => { + this.log.info(`go2rtc terminated with exitcode ${exitcode}`); + }); + process.on("exit", () => { + go2rtc.kill(); + }); + } } public writePersistentData(): void { @@ -287,6 +338,8 @@ export class euSec extends utils.Adapter { this.writePersistentData(); if (this.eufy) { + if (this.eufy.isConnected()) + await this.setStateAsync("info.connection", { val: false, ack: true }).catch(); this.eufy.removeAllListeners(); this.eufy.close(); } @@ -397,47 +450,47 @@ export class euSec extends utils.Adapter { const device = await this.eufy.getDevice(device_sn); switch(device_state_name) { - case CameraStateID.START_STREAM: + case DeviceStateID.START_STREAM: await this.startLivestream(device_sn); break; - case CameraStateID.STOP_STREAM: + case DeviceStateID.STOP_STREAM: await this.stopLivestream(device_sn); break; - case CameraStateID.TRIGGER_ALARM_SOUND: + case DeviceStateID.TRIGGER_ALARM_SOUND: await station.triggerDeviceAlarmSound(device, this.config.alarmSoundDuration); break; - case CameraStateID.RESET_ALARM_SOUND: + case DeviceStateID.RESET_ALARM_SOUND: await station.resetDeviceAlarmSound(device); break; - case IndoorCameraStateID.ROTATE_360: + case DeviceStateID.ROTATE_360: await station.panAndTilt(device, PanTiltDirection.ROTATE360); break; - case IndoorCameraStateID.PAN_LEFT: + case DeviceStateID.PAN_LEFT: await station.panAndTilt(device, PanTiltDirection.LEFT); break; - case IndoorCameraStateID.PAN_RIGHT: + case DeviceStateID.PAN_RIGHT: await station.panAndTilt(device, PanTiltDirection.RIGHT); break; - case IndoorCameraStateID.TILT_UP: + case DeviceStateID.TILT_UP: await station.panAndTilt(device, PanTiltDirection.UP); break; - case IndoorCameraStateID.TILT_DOWN: + case DeviceStateID.TILT_DOWN: await station.panAndTilt(device, PanTiltDirection.DOWN); break; - case LockStateID.CALIBRATE: + case DeviceStateID.CALIBRATE: if (device.isLock()) { await station.calibrateLock(device); } else { await station.calibrate(device); } break; - case SmartSafeStateID.UNLOCK: + case DeviceStateID.UNLOCK: await station.unlock(device); break; - case IndoorCameraStateID.SET_DEFAULT_ANGLE: + case DeviceStateID.SET_DEFAULT_ANGLE: await station.setDefaultAngle(device); break; - case IndoorCameraStateID.SET_PRIVACY_ANGLE: + case DeviceStateID.SET_PRIVACY_ANGLE: await station.setPrivacyAngle(device); break; } @@ -548,7 +601,7 @@ export class euSec extends utils.Adapter { } private async onDeviceAdded(device: Device): Promise { - //this.logger.debug(`count: ${Object.keys(devices).length}`); + this.logger.debug(`onDeviceAdded - device: ${device.getSerial()}`); await this.setObjectNotExistsAsync(device.getStateID("", 0), { type: "channel", @@ -568,11 +621,37 @@ export class euSec extends utils.Adapter { const metadata = device.getPropertiesMetadata(); for(const property of Object.values(metadata)) { - this.createAndSetState(device, property); + if (property.name !== PropertyName.DevicePicture) + this.createAndSetState(device, property); + } + + if (device.hasProperty(PropertyName.DevicePicture)) { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.PICTURE_URL), { + type: "state", + common: { + name: "Picture URL", + type: "string", + role: "url", + read: true, + write: false, + }, + native: {}, + }); + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.PICTURE_HTML), { + type: "state", + common: { + name: "Picture HTML image", + type: "string", + role: "html", + read: true, + write: false, + }, + native: {}, + }); } if (device.hasCommand(CommandName.DeviceTriggerAlarmSound)) { - await this.setObjectNotExistsAsync(device.getStateID(CameraStateID.TRIGGER_ALARM_SOUND), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.TRIGGER_ALARM_SOUND), { type: "state", common: { name: "Trigger Alarm Sound", @@ -583,7 +662,7 @@ export class euSec extends utils.Adapter { }, native: {}, }); - await this.setObjectNotExistsAsync(device.getStateID(CameraStateID.RESET_ALARM_SOUND), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.RESET_ALARM_SOUND), { type: "state", common: { name: "Reset Alarm Sound", @@ -596,7 +675,7 @@ export class euSec extends utils.Adapter { }); } if (device.hasCommand(CommandName.DevicePanAndTilt)) { - await this.setObjectNotExistsAsync(device.getStateID(IndoorCameraStateID.PAN_LEFT), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.PAN_LEFT), { type: "state", common: { name: "Pan Left", @@ -607,7 +686,7 @@ export class euSec extends utils.Adapter { }, native: {}, }); - await this.setObjectNotExistsAsync(device.getStateID(IndoorCameraStateID.PAN_RIGHT), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.PAN_RIGHT), { type: "state", common: { name: "Pan Right", @@ -618,7 +697,7 @@ export class euSec extends utils.Adapter { }, native: {}, }); - await this.setObjectNotExistsAsync(device.getStateID(IndoorCameraStateID.ROTATE_360), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.ROTATE_360), { type: "state", common: { name: "Rotate 360°", @@ -629,7 +708,7 @@ export class euSec extends utils.Adapter { }, native: {}, }); - await this.setObjectNotExistsAsync(device.getStateID(IndoorCameraStateID.TILT_UP), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.TILT_UP), { type: "state", common: { name: "Tilt Up", @@ -640,7 +719,7 @@ export class euSec extends utils.Adapter { }, native: {}, }); - await this.setObjectNotExistsAsync(device.getStateID(IndoorCameraStateID.TILT_DOWN), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.TILT_DOWN), { type: "state", common: { name: "Tilt Down", @@ -653,7 +732,7 @@ export class euSec extends utils.Adapter { }); } if (device.hasCommand(CommandName.DeviceLockCalibration)) { - await this.setObjectNotExistsAsync(device.getStateID(LockStateID.CALIBRATE), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.CALIBRATE), { type: "state", common: { name: "Calibrate Lock", @@ -666,7 +745,7 @@ export class euSec extends utils.Adapter { }); } if (device.hasCommand(CommandName.DeviceUnlock)) { - await this.setObjectNotExistsAsync(device.getStateID(SmartSafeStateID.UNLOCK), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.UNLOCK), { type: "state", common: { name: "Unlock", @@ -679,7 +758,7 @@ export class euSec extends utils.Adapter { }); } if (device.hasCommand(CommandName.DeviceSetDefaultAngle)) { - await this.setObjectNotExistsAsync(device.getStateID(IndoorCameraStateID.SET_DEFAULT_ANGLE), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.SET_DEFAULT_ANGLE), { type: "state", common: { name: "Set Default Angle", @@ -692,7 +771,7 @@ export class euSec extends utils.Adapter { }); } if (device.hasCommand(CommandName.DeviceSetPrivacyAngle)) { - await this.setObjectNotExistsAsync(device.getStateID(IndoorCameraStateID.SET_PRIVACY_ANGLE), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.SET_PRIVACY_ANGLE), { type: "state", common: { name: "Set Default Angle", @@ -705,7 +784,7 @@ export class euSec extends utils.Adapter { }); } if (device.hasCommand(CommandName.DeviceCalibrate)) { - await this.setObjectNotExistsAsync(device.getStateID(LockStateID.CALIBRATE), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.CALIBRATE), { type: "state", common: { name: "Calibrate", @@ -717,20 +796,9 @@ export class euSec extends utils.Adapter { native: {}, }); } - - //TODO: Decomment as soon as the decryption of the images works - /*if (device.hasProperty(PropertyName.DevicePictureUrl)) { - // Last event picture - const last_camera_url = device.getPropertyValue(PropertyName.DevicePictureUrl); - if (last_camera_url !== undefined) - saveImageStates(this, last_camera_url as string, device.getStationSerial(), device.getSerial(), DataLocation.LAST_EVENT, device.getStateID(CameraStateID.LAST_EVENT_PIC_URL), device.getStateID(CameraStateID.LAST_EVENT_PIC_HTML), "Last event picture").catch(() => { - this.logger.error(`State LAST_EVENT_PICTURE_URL of device ${device.getSerial()} - saveImageStates(): url ${last_camera_url}`); - }); - }*/ - if (device.hasCommand(CommandName.DeviceStartLivestream)) { // Start Stream - await this.setObjectNotExistsAsync(device.getStateID(CameraStateID.START_STREAM), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.START_STREAM), { type: "state", common: { name: "Start stream", @@ -743,7 +811,7 @@ export class euSec extends utils.Adapter { }); // Stop Stream - await this.setObjectNotExistsAsync(device.getStateID(CameraStateID.STOP_STREAM), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.STOP_STREAM), { type: "state", common: { name: "Stop stream", @@ -756,7 +824,7 @@ export class euSec extends utils.Adapter { }); // Livestream URL - await this.setObjectNotExistsAsync(device.getStateID(CameraStateID.LIVESTREAM), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.LIVESTREAM), { type: "state", common: { name: "Livestream URL", @@ -768,11 +836,11 @@ export class euSec extends utils.Adapter { native: {}, }); - // Last livestream video URL - await this.setObjectNotExistsAsync(device.getStateID(CameraStateID.LAST_LIVESTREAM_VIDEO_URL), { + // Livestream RTSP URL + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.LIVESTREAM_RTSP), { type: "state", common: { - name: "Last livestream video URL", + name: "Livestream RTSP URL", type: "string", role: "url", read: true, @@ -780,37 +848,11 @@ export class euSec extends utils.Adapter { }, native: {}, }); - - // Last livestream picture URL - await this.setObjectNotExistsAsync(device.getStateID(CameraStateID.LAST_LIVESTREAM_PIC_URL), { - type: "state", - common: { - name: "Last livestream picture URL", - type: "string", - role: "url", - read: true, - write: false, - }, - native: {}, - }); - - // Last livestream picture HTML - await this.setObjectNotExistsAsync(device.getStateID(CameraStateID.LAST_LIVESTREAM_PIC_HTML), { - type: "state", - common: { - name: "Last livestream picture HTML image", - type: "string", - role: "html", - read: true, - write: false, - }, - native: {}, - }); } if (device.hasProperty(PropertyName.DeviceRTSPStream)) { // RTSP Stream URL - await this.setObjectNotExistsAsync(device.getStateID(CameraStateID.RTSP_STREAM_URL), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.RTSP_STREAM_URL), { type: "state", common: { name: "RTSP stream URL", @@ -823,9 +865,10 @@ export class euSec extends utils.Adapter { }); } - if (device.hasCommand(CommandName.DeviceStartDownload)) { + //TODO: Deactivated because the decryption of the download has changed. + /*if (device.hasCommand(CommandName.DeviceStartDownload)) { // Last event video URL - await this.setObjectNotExistsAsync(device.getStateID(CameraStateID.LAST_EVENT_VIDEO_URL), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.LAST_EVENT_VIDEO_URL), { type: "state", common: { name: "Last event video URL", @@ -839,7 +882,7 @@ export class euSec extends utils.Adapter { }); // Last event picture URL - await this.setObjectNotExistsAsync(device.getStateID(CameraStateID.LAST_EVENT_PIC_URL), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.LAST_EVENT_PIC_URL), { type: "state", common: { name: "Last event picture URL", @@ -853,7 +896,7 @@ export class euSec extends utils.Adapter { }); // Last event picture HTML image - await this.setObjectNotExistsAsync(device.getStateID(CameraStateID.LAST_EVENT_PIC_HTML), { + await this.setObjectNotExistsAsync(device.getStateID(DeviceStateID.LAST_EVENT_PIC_HTML), { type: "state", common: { name: "Last event picture HTML image", @@ -865,12 +908,15 @@ export class euSec extends utils.Adapter { }, native: {}, }); - } + }*/ } private async onDeviceRemoved(device: Device): Promise { this.delObjectAsync(device.getStateID("", 0), { recursive: true }).catch((error) => { - this.logger.error(`Error deleting removed device`, error); + this.logger.error(`Error deleting states of removed device`, error); + }); + removeFiles(this, device.getStationSerial(), DataLocation.LAST_EVENT, device.getSerial()).catch((error) => { + this.logger.error(`Error deleting fs contents of removed device`, error); }); } @@ -954,11 +1000,14 @@ export class euSec extends utils.Adapter { private async onStationRemoved(station: Station): Promise { this.delObjectAsync(station.getStateID("", 0), { recursive: true }).catch((error) => { - this.logger.error(`Error deleting removed station`, error); + this.logger.error(`Error deleting states of removed station`, error); + }); + fse.remove(path.join(utils.getAbsoluteInstanceDataDir(this), station.getSerial())).catch((error) => { + this.logger.error(`Error deleting fs contents of removed station`, error); }); } - private async downloadEventVideo(device: Device, event_time: number, full_path: string | undefined, cipher_id: number | undefined): Promise { + /*private async downloadEventVideo(device: Device, event_time: number, full_path: string | undefined, cipher_id: number | undefined): Promise { this.logger.debug(`Device: ${device.getSerial()} full_path: ${full_path} cipher_id: ${cipher_id}`); try { if (!isEmpty(full_path) && cipher_id !== undefined) { @@ -985,21 +1034,16 @@ export class euSec extends utils.Adapter { } catch (error) { this.logger.error(`Device: ${device.getSerial()} - Error`, error); } - } + }*/ private async handlePushNotification(message: PushMessage): Promise { try { if (message.device_sn !== undefined) { - const device: Device = await this.eufy.getDevice(message.device_sn); - //TODO: Decomment as soon as the decryption of the images works - /*if (!isEmpty(message.pic_url)) { - await saveImageStates(this, message.pic_url!, device.getStationSerial(), device.getSerial(), DataLocation.LAST_EVENT, device.getStateID(CameraStateID.LAST_EVENT_PIC_URL), device.getStateID(CameraStateID.LAST_EVENT_PIC_HTML), "Last captured picture").catch(() => { - this.logger.error(`Device ${device.getSerial()} - saveImageStates(): url ${message.pic_url}`); - }); - }*/ + //TODO: Deactivated because the decryption of the download has changed. + /*const device: Device = await this.eufy.getDevice(message.device_sn); if ((message.push_count === 1 || message.push_count === undefined) && (message.file_path !== undefined && message.file_path !== "" && message.cipher !== undefined)) if (this.config.autoDownloadVideo) - await this.downloadEventVideo(device, message.event_time, message.file_path, message.cipher); + await this.downloadEventVideo(device, message.event_time, message.file_path, message.cipher);*/ } } catch (error) { if (error instanceof DeviceNotFoundError) { @@ -1030,28 +1074,137 @@ export class euSec extends utils.Adapter { native: {}, }); await this.setStateAsync("info.connection", { val: true, ack: true }); + + const stations = await this.eufy.getStations(); + const stationSerials: string[] = []; + for(const station of stations) { + stationSerials.push(station.getSerial()); + } + const devices = await this.eufy.getDevices(); + const deviceSerials: string[] = []; + for(const device of devices) { + deviceSerials.push(device.getSerial()); + } + + // Delete obsolete stations + try { + const allDevices = await this.getDevicesAsync(); + const reg = new RegExp(`^${this.namespace}\.[0-9A-Z]+$`); + allDevices.forEach((id) => { + if (id._id.match(reg)) { + const serial = id._id.replace(`${this.namespace}.`, ""); + if (!stationSerials.includes(serial)) { + this.delObjectAsync(id._id, { recursive: true }); + } + } + }); + } catch (error) { + this.log.error(`Delete obsolete stations ERROR - ${JSON.stringify(error)}`); + } + + // Delete obsolete devices + try { + const allDevices = await this.getDevicesAsync(); + const reg = new RegExp(`^${this.namespace}\.[0-9A-Z]+\.[a-z]+\.[0-9A-Z]+$`); + allDevices.forEach((id) => { + if (id._id.match(reg)) { + const serial = id._id.split(".")[4]; + if (!deviceSerials.includes(serial)) { + this.delObjectAsync(id._id, { recursive: true }); + } + } + }); + } catch (error) { + this.log.error(`Delete obsolete devices ERROR - ${JSON.stringify(error)}`); + } + + // Delete obsolete properties + try { + const all = await this.getStatesAsync("*"); + if (all) { + Object.keys(all).forEach(async (stateid) => { + const object = await this.getObjectAsync(stateid); + if (object?.native?.name !== undefined) { + const tmp = stateid.split("."); + if (tmp.length >= 5) { + const stationSerial = tmp[2]; + const deviceSerial = tmp[4]; + + if (deviceSerial.match(/^[A-Z0-9]+/)) { + // Device + try { + const device = await this.eufy.getDevice(deviceSerial); + if (!device.hasProperty(object.native.name)) { + this.delObjectAsync(stateid); + } + } catch (error) { + if (error instanceof DeviceNotFoundError) { + } else { + this.log.error(`Delete obsolete properties ERROR - device - ${JSON.stringify(error)}`); + } + } + } else { + // Station + try { + const station = await this.eufy.getStation(stationSerial); + if (!station.hasProperty(object.native.name)) { + this.delObjectAsync(stateid); + } + } catch (error) { + if (error instanceof StationNotFoundError) { + } else { + this.log.error(`Delete obsolete properties ERROR - station - ${JSON.stringify(error)}`); + } + } + } + } + } + }); + } + } catch (error) { + this.log.error(`Delete obsolete properties ERROR - ${JSON.stringify(error)}`); + } + + // Delete obsolete directories/files + new Promise(async (resolve, reject) => { + try { + const dir_path = path.join(utils.getAbsoluteInstanceDataDir(this)); + if (fse.existsSync(dir_path)) { + for (const content of fse.readdirSync(dir_path).filter(fn => fn.match("^T[0-9A-Z]+$") !== null)) { + if (!stationSerials.includes(content)) { + fse.removeSync(path.join(dir_path, content)); + } else { + for (const dir of fse.readdirSync(path.join(dir_path, content))) { + if (dir === DataLocation.LIVESTREAM || dir === DataLocation.LAST_LIVESTREAM || dir === DataLocation.TEMP) { + fse.removeSync(path.join(dir_path, content, dir)); + } else { + const files = fse.readdirSync(path.join(dir_path, content, dir)); + let deletedFiles = 0; + for (const file of files) { + if (!deviceSerials.includes(file.substring(0, 16))) { + fse.removeSync(path.join(dir_path, content, dir, file)); + deletedFiles++; + } + } + if (deletedFiles === files.length) { + fse.removeSync(path.join(dir_path, content, dir)); + } + } + } + } + } + } + resolve(); + } catch (error) { + reject(error); + } + }).catch(error => { + this.log.error(`Delete obsolete directories/files ERROR - ${JSON.stringify(error)}`); + }); } private async onClose(): Promise { - await this.setObjectNotExistsAsync("info", { - type: "channel", - common: { - name: "info" - }, - native: {}, - }); - await this.setObjectNotExistsAsync("info.connection", { - type: "state", - common: { - name: "Global connection", - type: "boolean", - role: "indicator.connection", - read: true, - write: false, - }, - native: {}, - }); - await this.setStateAsync("info.connection", { val: false, ack: true }); + await this.setStateAsync("info.connection", { val: false, ack: true }).catch(); } public getPersistentData(): PersistentData { @@ -1185,7 +1338,7 @@ export class euSec extends utils.Adapter { switch(name) { case PropertyName.DeviceRTSPStream: if (value as boolean === false) { - this.delStateAsync(device.getStateID(CameraStateID.RTSP_STREAM_URL)); + this.delStateAsync(device.getStateID(DeviceStateID.RTSP_STREAM_URL)); } break; } @@ -1193,7 +1346,25 @@ export class euSec extends utils.Adapter { } } } - this.logger.debug(`onDevicePropertyChanged(): Property "${name}" not implemented in this adapter (device: ${device.getSerial()} value: ${JSON.stringify(value)})`); + if (name === PropertyName.DevicePicture) { + try { + const picture = value as Picture; + const fileName = `${device.getSerial()}.${picture.type.ext}`; + const filePath = path.join(utils.getAbsoluteInstanceDataDir(this), device.getStationSerial(), DataLocation.LAST_EVENT); + + if (!fse.existsSync(filePath)) { + fse.mkdirSync(filePath, {mode: 0o775, recursive: true}); + } + + await fse.writeFile(path.join(filePath, fileName), picture.data); + await setStateChangedAsync(this, device.getStateID(DeviceStateID.PICTURE_URL), `/${this.namespace}/${device.getStationSerial()}/${DataLocation.LAST_EVENT}/${device.getSerial()}.${picture.type.ext}`); + await setStateChangedAsync(this, device.getStateID(DeviceStateID.PICTURE_HTML), getImageAsHTML(picture.data, picture.type.mime)); + } catch (error) { + this.logger.error("onDevicePropertyChanged - Property picture - Error", error); + } + } else { + this.logger.debug(`onDevicePropertyChanged(): Property "${name}" not implemented in this adapter (device: ${device.getSerial()} value: ${JSON.stringify(value)})`); + } } private async startLivestream(device_sn: string): Promise { @@ -1207,13 +1378,8 @@ export class euSec extends utils.Adapter { } else { this.logger.warn(`The stream for the device ${device_sn} cannot be started, because it is already streaming!`); } - } else if (device.isCamera()) { - const camera = device as Camera; - if (!camera.isStreaming()) { - this.eufy.startCloudLivestream(device_sn); - } else { - this.logger.warn(`The stream for the device ${device_sn} cannot be started, because it is already streaming!`); - } + } else { + this.logger.warn(`The stream for the device ${device_sn} cannot be started, because there is no connection to station ${station.getSerial()}!`); } } catch (error) { this.logger.error("Start livestream - Error", error); @@ -1228,8 +1394,6 @@ export class euSec extends utils.Adapter { const camera = device as Camera; if (await this.eufy.isStationConnected(device.getStationSerial()) && station.isLiveStreaming(camera)) { await this.eufy.stopStationLivestream(device_sn); - } else if (camera.isStreaming()) { - await this.eufy.stopCloudLivestream(device_sn); } else { this.logger.warn(`The stream for the device ${device_sn} cannot be stopped, because it isn't streaming!`); } @@ -1240,101 +1404,11 @@ export class euSec extends utils.Adapter { } } - private async onCloudLivestreamStart(station: Station, device: Device, url: string): Promise { - this.setStateAsync(device.getStateID(CameraStateID.LIVESTREAM), { val: url, ack: true }); - - const file_path = getDataFilePath(this, station.getSerial(), DataLocation.LIVESTREAM, `${device.getSerial()}${STREAM_FILE_NAME_EXT}`); - await sleep(2000); - const rtmpPromise: StoppablePromise = ffmpegRTMPToHls(this.config, url, file_path, this.logger); - rtmpPromise.then(async () => { - if (fse.pathExistsSync(file_path)) { - await removeFiles(this, station.getSerial(), DataLocation.LAST_LIVESTREAM, device.getSerial()); - return true; - } - return false; - }) - .then(async (result) => { - if (result) - await moveFiles(this, station.getSerial(), device.getSerial(), DataLocation.LIVESTREAM, DataLocation.LAST_LIVESTREAM); - return result; - }) - .then(async (result) => { - if (result) { - const filename_without_ext = getDataFilePath(this, station.getSerial(), DataLocation.LAST_LIVESTREAM, device.getSerial()); - if (fse.pathExistsSync(`${filename_without_ext}${STREAM_FILE_NAME_EXT}`)) - await ffmpegPreviewImage(this.config, `${filename_without_ext}${STREAM_FILE_NAME_EXT}`, `${filename_without_ext}${IMAGE_FILE_JPEG_EXT}`, this.logger, 5.5) - .then(() => { - this.setStateAsync(device.getStateID(CameraStateID.LAST_LIVESTREAM_PIC_URL), { val: `/${this.namespace}/${station.getSerial()}/${DataLocation.LAST_LIVESTREAM}/${device.getSerial()}${IMAGE_FILE_JPEG_EXT}`, ack: true }); - try { - if (fse.existsSync(`${filename_without_ext}${IMAGE_FILE_JPEG_EXT}`)) { - this.setStateAsync(device.getStateID(CameraStateID.LAST_LIVESTREAM_PIC_HTML), { val: getImageAsHTML(fse.readFileSync(`${filename_without_ext}${IMAGE_FILE_JPEG_EXT}`)), ack: true }); - } - } catch (error) { - this.logger.error(`Station: ${station.getSerial()} device: ${device.getSerial()} - Error`, error); - } - }) - .catch((error) => { - this.logger.error(`ffmpegPreviewImage - station: ${station.getSerial()} device: ${device.getSerial()} - Error`, error); - }); - } - }) - .catch(async (error) => { - this.logger.error(`Station: ${station.getSerial()} device: ${device.getSerial()} - Error - Stopping livestream...`, error); - await this.eufy.stopCloudLivestream(device.getSerial()); - }); - this.rtmpFFmpegPromise.set(device.getSerial(), rtmpPromise); - } - - private onCloudLivestreamStop(station: Station, device: Device): void { - this.logger.debug(`Station: ${station.getSerial()} device: ${device.getSerial()}`); - this.delStateAsync(device.getStateID(CameraStateID.LIVESTREAM)); - - const rtmpPromise = this.rtmpFFmpegPromise.get(device.getSerial()); - if (rtmpPromise) { - rtmpPromise.stop(); - this.rtmpFFmpegPromise.delete(device.getSerial()); - } - } - private async onStationLivestreamStart(station: Station, device: Device, metadata: StreamMetadata, videostream: Readable, audiostream: Readable): Promise { try { - const file_path = getDataFilePath(this, station.getSerial(), DataLocation.LIVESTREAM, `${device.getSerial()}${STREAM_FILE_NAME_EXT}`); - await removeFiles(this, station.getSerial(), DataLocation.LIVESTREAM, device.getSerial()).catch(); - this.setStateAsync(device.getStateID(CameraStateID.LIVESTREAM), { val: `/${this.namespace}/${station.getSerial()}/${DataLocation.LIVESTREAM}/${device.getSerial()}${STREAM_FILE_NAME_EXT}`, ack: true }); - await ffmpegStreamToHls(this.config, this.namespace, metadata, videostream, audiostream, file_path, this.logger) - .then(async () => { - if (fse.pathExistsSync(file_path)) { - await removeFiles(this, station.getSerial(), DataLocation.LAST_LIVESTREAM, device.getSerial()); - return true; - } - return false; - }) - .then(async (result) => { - if (result) - await moveFiles(this, station.getSerial(), device.getSerial(), DataLocation.LIVESTREAM, DataLocation.LAST_LIVESTREAM); - return result; - }) - .then(async (result) => { - if (result) { - const filename_without_ext = getDataFilePath(this, station.getSerial(), DataLocation.LAST_LIVESTREAM, device.getSerial()); - this.setStateAsync(device.getStateID(CameraStateID.LAST_LIVESTREAM_VIDEO_URL), { val: `/${this.namespace}/${station.getSerial()}/${DataLocation.LAST_LIVESTREAM}/${device.getSerial()}${STREAM_FILE_NAME_EXT}`, ack: true }); - if (fse.pathExistsSync(`${filename_without_ext}${STREAM_FILE_NAME_EXT}`)) - await ffmpegPreviewImage(this.config, `${filename_without_ext}${STREAM_FILE_NAME_EXT}`, `${filename_without_ext}${IMAGE_FILE_JPEG_EXT}`, this.logger) - .then(() => { - this.setStateAsync(device.getStateID(CameraStateID.LAST_LIVESTREAM_PIC_URL), { val: `/${this.namespace}/${station.getSerial()}/${DataLocation.LAST_LIVESTREAM}/${device.getSerial()}${IMAGE_FILE_JPEG_EXT}`, ack: true }); - try { - if (fse.existsSync(`${filename_without_ext}${IMAGE_FILE_JPEG_EXT}`)) { - this.setStateAsync(device.getStateID(CameraStateID.LAST_LIVESTREAM_PIC_HTML), { val: getImageAsHTML(fse.readFileSync(`${filename_without_ext}${IMAGE_FILE_JPEG_EXT}`)), ack: true }); - } - } catch (error) { - this.logger.error(`Station: ${station.getSerial()} device: ${device.getSerial()} - Error`, error); - } - }) - .catch((error) => { - this.logger.error(`ffmpegPreviewImage - station: ${station.getSerial()} device: ${device.getSerial()} - Error`, error); - }); - } - }) + this.setStateAsync(device.getStateID(DeviceStateID.LIVESTREAM), { val: `${this.config.https ? "https" : "http"}://${this.config.hostname}:${this.config.go2rtc_api_port}/stream.html?src=${device.getSerial()}`, ack: true }); + this.setStateAsync(device.getStateID(DeviceStateID.LIVESTREAM_RTSP), { val: `rtsp://${this.config.hostname}:${this.config.go2rtc_rtsp_port}/${device.getSerial()}`, ack: true }); + await ffmpegStreamToGo2rtc(this.config, this.namespace, device.getSerial(), metadata, videostream, audiostream, this.logger) .catch(async (error) => { this.logger.error(`Station: ${station.getSerial()} Device: ${device.getSerial()} - Error - Stopping livestream...`, error); await this.eufy.stopStationLivestream(device.getSerial()); @@ -1346,15 +1420,17 @@ export class euSec extends utils.Adapter { } private onStationLivestreamStop(_station: Station, device: Device): void { - this.delStateAsync(device.getStateID(CameraStateID.LIVESTREAM)); + this.delStateAsync(device.getStateID(DeviceStateID.LIVESTREAM)); + this.delStateAsync(device.getStateID(DeviceStateID.LIVESTREAM_RTSP)); } - private async onStationDownloadFinish(_station: Station, _device: Device): Promise { + /*private async onStationDownloadFinish(_station: Station, _device: Device): Promise { //this.logger.trace(`Station: ${station.getSerial()} channel: ${channel}`); - } + }*/ - private async onStationDownloadStart(station: Station, device: Device, metadata: StreamMetadata, videostream: Readable, audiostream: Readable): Promise { + /*private async onStationDownloadStart(station: Station, device: Device, metadata: StreamMetadata, videostream: Readable, audiostream: Readable): Promise { try { + //TODO: Deactivated because the decryption of the download has changed. await removeFiles(this, station.getSerial(), DataLocation.TEMP, device.getSerial()).catch(); const file_path = getDataFilePath(this, station.getSerial(), DataLocation.TEMP, `${device.getSerial()}${STREAM_FILE_NAME_EXT}`); @@ -1374,15 +1450,15 @@ export class euSec extends utils.Adapter { .then(async (result) => { if (result) { const filename_without_ext = getDataFilePath(this, station.getSerial(), DataLocation.LAST_EVENT, device.getSerial()); - setStateAsync(this, device.getStateID(CameraStateID.LAST_EVENT_VIDEO_URL), "Last captured video URL", `/${this.namespace}/${station.getSerial()}/${DataLocation.LAST_EVENT}/${device.getSerial()}${STREAM_FILE_NAME_EXT}`, "url"); + setStateAsync(this, device.getStateID(DeviceStateID.LAST_EVENT_VIDEO_URL), "Last captured video URL", `/${this.namespace}/${station.getSerial()}/${DataLocation.LAST_EVENT}/${device.getSerial()}${STREAM_FILE_NAME_EXT}`, "url"); if (fse.pathExistsSync(`${filename_without_ext}${STREAM_FILE_NAME_EXT}`)) await ffmpegPreviewImage(this.config, `${filename_without_ext}${STREAM_FILE_NAME_EXT}`, `${filename_without_ext}${IMAGE_FILE_JPEG_EXT}`, this.logger) .then(() => { - setStateAsync(this, device.getStateID(CameraStateID.LAST_EVENT_PIC_URL), "Last event picture URL", `/${this.namespace}/${station.getSerial()}/${DataLocation.LAST_EVENT}/${device.getSerial()}${IMAGE_FILE_JPEG_EXT}`, "url"); + setStateAsync(this, device.getStateID(DeviceStateID.LAST_EVENT_PIC_URL), "Last event picture URL", `/${this.namespace}/${station.getSerial()}/${DataLocation.LAST_EVENT}/${device.getSerial()}${IMAGE_FILE_JPEG_EXT}`, "url"); try { if (fse.existsSync(`${filename_without_ext}${IMAGE_FILE_JPEG_EXT}`)) { const image_data = getImageAsHTML(fse.readFileSync(`${filename_without_ext}${IMAGE_FILE_JPEG_EXT}`)); - setStateAsync(this, device.getStateID(CameraStateID.LAST_EVENT_PIC_HTML), "Last event picture HTML image", image_data, "html"); + setStateAsync(this, device.getStateID(DeviceStateID.LAST_EVENT_PIC_HTML), "Last event picture HTML image", image_data, "html"); } } catch (error) { this.logger.error(`Station: ${station.getSerial()} device: ${device.getSerial()} - Error`, error); @@ -1401,10 +1477,10 @@ export class euSec extends utils.Adapter { this.logger.error(`Station: ${station.getSerial()} Device: ${device.getSerial()} - Error - Cancelling download...`, error); await this.eufy.cancelStationDownload(device.getSerial()); } - } + }*/ private onStationRTSPUrl(station: Station, device: Device, value: string): void { - setStateChangedAsync(this, device.getStateID(CameraStateID.RTSP_STREAM_URL), value); + setStateChangedAsync(this, device.getStateID(DeviceStateID.RTSP_STREAM_URL), value); } private async onStationConnect(station: Station): Promise {