iobroker.motioneye 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- ![Logo](admin/motioneye-logo.svg)
1
+ ![Logo](admin/motioneye.png)
2
2
 
3
3
  # ioBroker adapter for MotionEye
4
4
 
@@ -24,15 +24,17 @@ Connect MotionEye cameras to ioBroker for motion detection, snapshots, and live
24
24
  ## Features
25
25
 
26
26
  - User-defined camera names in ioBroker (independent of MotionEye labels)
27
- - Dynamic channels under `motioneye.0.<Name>.*`
27
+ - Dynamic channels under `motioneye.0.<name>.*` (lowercase folder names)
28
28
  - Built-in webhook server — no simple-api dependency
29
29
  - MotionEye Config API sync for modes and webhook URLs
30
- - `0_info.connection` — instance shows when MotionEye is unreachable
30
+ - `_info.connection` — instance shows when MotionEye is unreachable
31
31
  - Stream sibling relink after VIS re-render (multi-camera dashboards)
32
32
 
33
33
  ## Data Points
34
34
 
35
- ### Per camera (`motioneye.0.<Name>.*`)
35
+ ### Per camera (`motioneye.0.<name>.*`)
36
+
37
+ Channel folder names are lowercase (e.g. `innenhof_ii`, `auffahrt`).
36
38
 
37
39
  | State | Type | Read | Write | Description |
38
40
  |-------|------|------|-------|-------------|
@@ -48,17 +50,15 @@ Connect MotionEye cameras to ioBroker for motion detection, snapshots, and live
48
50
  | `motionEyeId` | value | yes | no | MotionEye camera ID |
49
51
  | `motionEyeName` | text | yes | no | Original name in MotionEye |
50
52
 
51
- ### Instance (`motioneye.0.0_info.*`)
52
-
53
- The `0_info` folder sorts above camera channels (digits before letters in the object tree).
53
+ ### Instance (`motioneye.0._info.*`)
54
54
 
55
55
  | State | Type | Description |
56
56
  |-------|------|-------------|
57
- | `0_info.connection` | boolean | MotionEye reachable |
58
- | `0_info.camerasOnline` | number | Enabled cameras found in MotionEye |
59
- | `0_info.lastSync` | text | Last status poll timestamp |
60
- | `0_info.motionEyeVersion` | text | MotionEye server version |
61
- | `0_info.motionVersion` | text | Motion daemon version |
57
+ | `_info.connection` | boolean | MotionEye reachable |
58
+ | `_info.camerasOnline` | number | Enabled cameras found in MotionEye |
59
+ | `_info.lastSync` | text | Last status poll timestamp |
60
+ | `_info.motionEyeVersion` | text | MotionEye server version |
61
+ | `_info.motionVersion` | text | Motion daemon version |
62
62
 
63
63
  ## Installation
64
64
 
@@ -106,8 +106,16 @@ If you like our work and would like to support us, we appreciate any donation.
106
106
  <!--
107
107
  ### **WORK IN PROGRESS**
108
108
  -->
109
+ ### 0.3.1 (2026-06-22)
110
+ - (skvarel) Changed repo icon
111
+
112
+ ### 0.3.0 (2026-06-22)
113
+ - (skvarel) Camera channel folders are now lowercase (e.g. `innenhof_ii` instead of `Innenhof_II`) — aligned with other ioBroker adapters
114
+ - (skvarel) Info states moved from `0_info` to `_info`
115
+ - (skvarel) Existing datapoint values are migrated automatically on adapter start — please check VIS, scripts, and automations that use fixed state paths
116
+
109
117
  ### 0.2.1 (2026-06-22)
110
- - (skvarel) Fixed adapter checker errors an warnings
118
+ - (skvarel) Fixed adapter checker errors and warnings
111
119
 
112
120
  ### 0.2.0 (2026-06-22)
113
121
  - (skvarel) Added optional per-camera media folder name under `/var/lib/motioneye` (written to MotionEye on adapter start)
@@ -117,12 +125,6 @@ If you like our work and would like to support us, we appreciate any donation.
117
125
  ### 0.1.2 (2026-06-21)
118
126
  - (skvarel) Clarified admin help for useMotionEyeConfig (required for mode, webhooks, and stream control — not only MotionEye web UI)
119
127
 
120
- ### 0.1.1 (2026-06-21)
121
- - (skvarel) Renamed info folder from `_info` to `0_info` so it sorts above camera channels in the object tree
122
-
123
- ### 0.1.0 (2026-06-21)
124
- - (skvarel) Added states for motionEyeVersion and motionVersion
125
-
126
128
  ## Older changes
127
129
  - [CHANGELOG_OLD.md](CHANGELOG_OLD.md)
128
130
 
@@ -11,7 +11,7 @@
11
11
  "camera_motionEyeId": "MotionEye-ID",
12
12
  "camera_motionEyeId_help": "Numerische Kamera-ID aus MotionEye (/config/list)",
13
13
  "camera_name": "Anzeigename",
14
- "camera_name_help": "ioBroker-Kanalname — unabhängig vom MotionEye-Namen",
14
+ "camera_name_help": "ioBroker-Kanalordner (Kleinbuchstaben) — unabhängig vom MotionEye-Namen",
15
15
  "cameras_info": "Trag jede Kamera ein, die in ioBroker erscheinen soll. Die MotionEye-ID steht in der Web-Oberfläche oder unter /config/list (Port 8765). Nach dem Speichern starte die Adapter-Instanz neu, damit Datenpunkte angelegt und Webhook-URLs in MotionEye geschrieben werden.",
16
16
  "cameras_table": "Kameras",
17
17
  "defaultMode": "Standardmodus für neue Kameras",
@@ -23,7 +23,7 @@
23
23
  "header_webhook": "Webhook",
24
24
  "help_cameras": "Auf dem Tab <b>Kameras</b> nutzt du <b>Kameras aus MotionEye laden</b>, um die Kamera-Liste von MotionEye abzurufen und fehlende Zeilen in die Tabelle einzufügen (bestehende Einträge bleiben erhalten). Die Adapter-Instanz muss dafür <b>laufen</b>.<br><br><b>MotionEye-ID:</b> In der MotionEye-Weboberfläche Kamera öffnen → <b>Videogerät</b> → Feld <b>Kamera-ID</b>. Oder <code>/config/list</code> auf Port 8765 abfragen.<br><br><b>Anzeigename:</b> ioBroker-Kanalname — kann vom MotionEye-Namen abweichen.<br><b>Interne ID:</b> Stabiler Webhook-Schlüssel (z. B. <code>auffahrt</code>). Leer lassen, um aus dem Namen abzuleiten.<br><b>Medien-Ordner:</b> Optionaler Ordnername unter <code>/var/lib/motioneye</code>. Wird beim Adapter-Start gesetzt, wenn die Config-Sync aktiv ist.",
25
25
  "help_connection": "<b>MotionEye-Host</b> — IP oder Hostname deines MotionEye-Servers.<br><b>MotionEye Config-API-Port</b> — Standard <code>8765</code> (Modus, Webhooks, Stream).<br><b>Motion-HTTP-Port</b> — Standard <code>7999</code> (Snapshots).<br><b>MotionEye über Config-API steuern</b> — für den normalen Betrieb <b>aktiviert</b> lassen. Der Adapter schreibt Modus, Webhook-URLs und Stream ein/aus nach MotionEye; ioBroker steuert Erkennung und Livestreams.<br><br><b>Webhook-Host</b> — IP deines ioBroker-Hosts, von MotionEye aus erreichbar (z. B. <code>192.168.130.130</code>). Erforderlich für Webhook-URLs.<br><b>Webhook-Port</b> — Standard <code>8090</code>; eingehenden Traffic auf dem ioBroker-Host erlauben.",
26
- "help_intro": "Der <b>MotionEye-Adapter</b> verbindet MotionEye-Kameras mit ioBroker: Bewegungserkennung per Webhook, Snapshots, Livestreams und Modussteuerung (<code>off</code> / <code>still</code> / <code>sharp</code>).<br><br>Info-Datenpunkte liegen unter <code>motioneye.&lt;Instanz&gt;.0_info</code> (Verbindung, Versionen, Kameras online).",
26
+ "help_intro": "Der <b>MotionEye-Adapter</b> verbindet MotionEye-Kameras mit ioBroker: Bewegungserkennung per Webhook, Snapshots, Livestreams und Modussteuerung (<code>off</code> / <code>still</code> / <code>sharp</code>).<br><br>Info-Datenpunkte liegen unter <code>motioneye.&lt;Instanz&gt;._info</code> (Verbindung, Versionen, Kameras online). Kamerakanäle nutzen Kleinbuchstaben.",
27
27
  "help_modes": "<table style=\"width:100%;border-collapse:collapse;font-size:0.875rem\"><thead><tr style=\"border-bottom:1px solid #546e7a\"><th style=\"text-align:left;padding:8px 6px;width:18%\">Modus</th><th style=\"text-align:left;padding:8px 6px\">Beschreibung</th></tr></thead><tbody><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>off</code></td><td style=\"padding:6px\">Bewegungserkennung aus</td></tr><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>still</code></td><td style=\"padding:6px\">Nur Bewegungs-Trigger — keine Videoaufnahme</td></tr><tr><td style=\"padding:6px\"><code>sharp</code></td><td style=\"padding:6px\">Bewegungserkennung + Videoaufnahme</td></tr></tbody></table>",
28
28
  "help_readme": "Vollständige Dokumentation:<br><br>• <a href=\"https://github.com/inventwo/ioBroker.motioneye/blob/main/README.md\">Adapter-README auf GitHub</a>",
29
29
  "help_section_cameras": "Kameras",
@@ -11,7 +11,7 @@
11
11
  "camera_motionEyeId": "MotionEye ID",
12
12
  "camera_motionEyeId_help": "Numeric camera ID from MotionEye (/config/list)",
13
13
  "camera_name": "Display name",
14
- "camera_name_help": "ioBroker channel name — independent of MotionEye label",
14
+ "camera_name_help": "ioBroker channel folder name (lowercase) — independent of MotionEye label",
15
15
  "cameras_info": "Add each camera you want in ioBroker. The MotionEye ID is shown in the MotionEye web UI or via /config/list on port 8765. After saving, restart the adapter instance to create datapoints and write webhook URLs to MotionEye.",
16
16
  "cameras_table": "Cameras",
17
17
  "defaultMode": "Default mode for new cameras",
@@ -23,7 +23,7 @@
23
23
  "header_webhook": "Webhook",
24
24
  "help_cameras": "On the <b>Cameras</b> tab use <b>Load cameras from MotionEye</b> to fetch the camera list from MotionEye and add missing rows to the table (existing entries are kept). The adapter instance must be <b>running</b> for this button.<br><br><b>MotionEye ID:</b> In the MotionEye web UI open a camera → <b>Video Device</b> → field <b>Camera ID</b>. Or query <code>/config/list</code> on port 8765.<br><br><b>Display name:</b> ioBroker channel name — can differ from the MotionEye label.<br><b>Internal ID:</b> Stable webhook key (e.g. <code>auffahrt</code>). Leave empty to derive from the display name.<br><b>Media folder:</b> Optional folder name under <code>/var/lib/motioneye</code>. Applied on adapter start when config sync is enabled.",
25
25
  "help_connection": "<b>MotionEye host</b> — IP or hostname of your MotionEye server.<br><b>MotionEye config API port</b> — default <code>8765</code> (mode, webhooks, stream).<br><b>Motion HTTP port</b> — default <code>7999</code> (snapshots).<br><b>Control MotionEye via config API</b> — leave <b>enabled</b> for normal use. The adapter writes mode, webhook URLs, and stream on/off to MotionEye; ioBroker controls detection and live streams.<br><br><b>Webhook host</b> — IP of your ioBroker host as reachable <i>from MotionEye</i> (e.g. <code>192.168.130.130</code>). Required for webhook URLs.<br><b>Webhook port</b> — default <code>8090</code>; allow inbound traffic on the ioBroker host.",
26
- "help_intro": "The <b>MotionEye adapter</b> connects MotionEye cameras to ioBroker: motion detection via webhooks, snapshots, live streams, and mode control (<code>off</code> / <code>still</code> / <code>sharp</code>).<br><br>Info states live under <code>motioneye.&lt;instance&gt;.0_info</code> (connection, versions, cameras online).",
26
+ "help_intro": "The <b>MotionEye adapter</b> connects MotionEye cameras to ioBroker: motion detection via webhooks, snapshots, live streams, and mode control (<code>off</code> / <code>still</code> / <code>sharp</code>).<br><br>Info states live under <code>motioneye.&lt;instance&gt;._info</code> (connection, versions, cameras online). Camera channels use lowercase folder names.",
27
27
  "help_modes": "<table style=\"width:100%;border-collapse:collapse;font-size:0.875rem\"><thead><tr style=\"border-bottom:1px solid #546e7a\"><th style=\"text-align:left;padding:8px 6px;width:18%\">Mode</th><th style=\"text-align:left;padding:8px 6px\">Description</th></tr></thead><tbody><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>off</code></td><td style=\"padding:6px\">Motion detection off</td></tr><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>still</code></td><td style=\"padding:6px\">Motion trigger only — no video recording</td></tr><tr><td style=\"padding:6px\"><code>sharp</code></td><td style=\"padding:6px\">Motion detection + video recording</td></tr></tbody></table>",
28
28
  "help_readme": "Full documentation:<br><br>• <a href=\"https://github.com/inventwo/ioBroker.motioneye/blob/main/README.md\">Adapter README on GitHub</a>",
29
29
  "help_section_cameras": "Cameras",
@@ -23,7 +23,7 @@
23
23
  "header_webhook": "gancho web",
24
24
  "help_cameras": "En la pestaña <b>Cámaras</b> use <b>Cargar cámaras desde MotionEye</b> para recuperar la lista de cámaras de MotionEye y agregar las filas que faltan a la tabla (las entradas existentes se mantienen). La instancia del adaptador debe estar <b>ejecutándose</b> para este botón.<br><br><b>ID de MotionEye:</b> En la interfaz de usuario web de MotionEye, abra una cámara → <b>Dispositivo de vídeo</b> → campo <b>ID de cámara</b>. O consulte <code>/config/list</code> en el puerto 8765.<br><br><b>Nombre para mostrar:</b> nombre del canal ioBroker: puede diferir de la etiqueta de MotionEye.<br><b>ID interno:</b> Clave de webhook estable (por ejemplo, <code>auffahrt</code>). Déjelo vacío para obtener el nombre para mostrar.<br><b>Carpeta multimedia:</b> Nombre de carpeta opcional en <code>/var/lib/motioneye</code>. Se aplica al iniciar el adaptador cuando la sincronización de configuración está habilitada.",
25
25
  "help_connection": "<b>Host de MotionEye</b>: IP o nombre de host de su servidor MotionEye.<br><b>Puerto API de configuración de MotionEye</b>: <code>8765</code> predeterminado (modo, webhooks, transmisión).<br><b>Puerto HTTP de Motion</b>: <code>7999</code> predeterminado (instantáneas).<br><b>Control de MotionEye a través de la API de configuración</b>: salir <b>habilitado</b> para uso normal. El adaptador escribe el modo, las URL de webhook y activa/desactiva la transmisión a MotionEye; ioBroker controla la detección y las transmisiones en vivo.<br><br><b>Host de webhook</b>: IP de su host de ioBroker accesible <i>desde MotionEye</i> (por ejemplo, <code>192.168.130.130</code>). Requerido para las URL de webhook.<br><b>Puerto de webhook</b>: predeterminado <code>8090</code>; permitir el tráfico entrante en el host ioBroker.",
26
- "help_intro": "El <b>adaptador MotionEye</b> conecta las cámaras MotionEye a ioBroker: detección de movimiento a través de webhooks, instantáneas, transmisiones en vivo y control de modo (<code>off</code> / <code>still</code> / <code>sharp</code>).<br><br>Estados de información en vivo bajo <code>motioneye.<instance>.0_info</code> (conexión, versiones, cámaras en línea).",
26
+ "help_intro": "El <b>adaptador MotionEye</b> conecta las cámaras MotionEye a ioBroker: detección de movimiento a través de webhooks, instantáneas, transmisiones en vivo y control de modo (<code>off</code> / <code>still</code> / <code>sharp</code>).<br><br>Estados de información en vivo bajo <code>motioneye.<instance>._info</code> (conexión, versiones, cámaras en línea).",
27
27
  "help_modes": "<table style=\"width:100%;border-collapse:collapse;font-size:0.875rem\"><thead><tr style=\"border-bottom:1px solid #546e7a\"><th style=\"text-align:left;padding:8px 6px;width:18%\">Modo</th><th style=\"text-align:left;padding:8px 6px\">Descripción</th></tr></thead><tbody><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>off</code></td><td style=\"padding:6px\">Detección de movimiento desactivada</td></tr><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>still</code></td><td style=\"padding:6px\">Disparador por movimiento únicamente: sin grabación de video</td></tr><tr><td style=\"padding:6px\"><code>sharp</code></td><td style=\"padding:6px\">Detección de movimiento + video grabación</td></tr></tbody></table>",
28
28
  "help_readme": "Documentación completa:<br><br>• <a href=\"https://github.com/inventwo/ioBroker.motioneye/blob/main/README.md\">Adaptador README en GitHub</a>",
29
29
  "help_section_cameras": "Cámaras",
@@ -23,7 +23,7 @@
23
23
  "header_webhook": "Webhook",
24
24
  "help_cameras": "Dans l'onglet <b>Caméras</b>, utilisez <b>Charger les caméras depuis MotionEye</b> pour récupérer la liste des caméras depuis MotionEye et ajouter les lignes manquantes au tableau (les entrées existantes sont conservées). L'instance d'adaptateur doit être <b>en cours d'exécution</b> pour ce bouton.<br><br><b>ID MotionEye :</b> Dans l'interface utilisateur Web de MotionEye, ouvrez une caméra → <b>Périphérique vidéo</b> → champ <b>ID de la caméra</b>. Ou interrogez <code>/config/list</code> sur le port 8765.<br><br><b>Nom d'affichage :</b> nom du canal ioBroker — peut différer de l'étiquette MotionEye.<br><b>ID interne :</b> Clé de webhook stable (par exemple <code>auffahrt</code>). Laissez vide pour dériver du nom d'affichage.<br><b>Dossier multimédia :</b> Nom du dossier facultatif sous <code>/var/lib/motioneye</code>. Appliqué au démarrage de l'adaptateur lorsque la synchronisation de la configuration est activée.",
25
25
  "help_connection": "<b>Hôte MotionEye</b> – IP ou nom d'hôte de votre serveur MotionEye.<br><b>Port API de configuration MotionEye</b> – <code>8765</code> par défaut (mode, webhooks, flux).<br><b>Port HTTP Motion</b> – <code>7999</code> par défaut (instantanés).<br><b>Contrôlez MotionEye via l'API de configuration</b> – quitter <b>activé</b> pour une utilisation normale. L'adaptateur écrit le mode, les URL des webhooks et active/désactive le flux sur MotionEye ; ioBroker contrôle la détection et les flux en direct.<br><br><b>Hôte Webhook</b> – IP de votre hôte ioBroker accessible <i>depuis MotionEye</i> (par exemple <code>192.168.130.130</code>). Obligatoire pour les URL de webhook.<br><b>Port du webhook</b> : <code>8090</code> par défaut ; autoriser le trafic entrant sur l’hôte ioBroker.",
26
- "help_intro": "L'<b>adaptateur MotionEye</b> connecte les caméras MotionEye à ioBroker : détection de mouvement via des webhooks, des instantanés, des flux en direct et un contrôle de mode (<code>off</code> / <code>toujours</code> / <code>pointu</code>).<br><br>États des informations en direct sous <code>motioneye.<instance>.0_info</code> (connexion, versions, caméras en ligne).",
26
+ "help_intro": "L'<b>adaptateur MotionEye</b> connecte les caméras MotionEye à ioBroker : détection de mouvement via des webhooks, des instantanés, des flux en direct et un contrôle de mode (<code>off</code> / <code>toujours</code> / <code>pointu</code>).<br><br>États des informations en direct sous <code>motioneye.<instance>._info</code> (connexion, versions, caméras en ligne).",
27
27
  "help_modes": "<table style=\"width:100%;border-collapse:collapse;font-size:0.875rem\"><thead><tr style=\"border-bottom:1px solid #546e7a\"><th style=\"text-align:left;padding:8px 6px;width:18%\">Mode</th><th style=\"text-align:left;padding:8px 6px\">Description</th></tr></thead><tbody><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>off</code></td><td style=\"padding:6px\">Détection de mouvement désactivée</td></tr><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>immobile</code></td><td style=\"padding:6px\">Déclencheur de mouvement uniquement — pas d'enregistrement vidéo</td></tr><tr><td style=\"padding:6px\"><code>pointu</code></td><td style=\"padding:6px\">Détection de mouvement + vidéo enregistrement</td></tr></tbody></table>",
28
28
  "help_readme": "Documentation complète :<br><br>• <a href=\"https://github.com/inventwo/ioBroker.motioneye/blob/main/README.md\">Adaptateur README sur GitHub</a>",
29
29
  "help_section_cameras": "Caméras",
@@ -23,7 +23,7 @@
23
23
  "header_webhook": "Webhook",
24
24
  "help_cameras": "Nella scheda <b>Telecamere</b> utilizza <b>Carica telecamere da MotionEye</b> per recuperare l'elenco delle telecamere da MotionEye e aggiungere le righe mancanti alla tabella (le voci esistenti vengono mantenute). L'istanza dell'adattatore deve essere <b>in esecuzione</b> per questo pulsante.<br><br><b>ID MotionEye:</b> nell'interfaccia utente web MotionEye aprire una telecamera → <b>Dispositivo video</b> → campo <b>ID telecamera</b>. Oppure interroga <code>/config/list</code> sulla porta 8765.<br><br><b>Nome visualizzato:</b> nome del canale ioBroker: può differire dall'etichetta MotionEye.<br><b>ID interno:</b> Chiave webhook stabile (ad esempio <code>auffahrt</code>). Lasciare vuoto per derivare dal nome visualizzato.<br><b>Cartella multimediale:</b> nome della cartella opzionale in <code>/var/lib/motioneye</code>. Applicato all'avvio dell'adattatore quando la sincronizzazione della configurazione è abilitata.",
25
25
  "help_connection": "<b>Host MotionEye</b>: IP o nome host del server MotionEye.<br><b>Porta API di configurazione MotionEye</b>: <code>8765</code> predefinita (modalità, webhook, flusso).<br><b>Porta HTTP Motion</b>: <code>7999</code> predefinita (istantanee).<br><b>Controlla MotionEye tramite API di configurazione</b>: lascia <b>abilitato</b> per l'uso normale. L'adattatore scrive modalità, URL webhook e attivazione/disattivazione dello streaming su MotionEye; ioBroker controlla il rilevamento e i live streaming.<br><br><b>Host webhook</b>: IP del tuo host ioBroker raggiungibile <i>da MotionEye</i> (ad esempio <code>192.168.130.130</code>). Obbligatorio per gli URL webhook.<br><b>Porta webhook</b>: <code>8090</code> predefinita; consentire il traffico in entrata sull'host ioBroker.",
26
- "help_intro": "L'<b>adattatore MotionEye</b> collega le telecamere MotionEye a ioBroker: rilevamento del movimento tramite webhook, istantanee, live streaming e controllo della modalità (<code>off</code> / <code>still</code> / <code>sharp</code>).<br><br>Stati delle informazioni in tempo reale in <code>motioneye.<instance>.0_info</code> (connessione, versioni, telecamere online).",
26
+ "help_intro": "L'<b>adattatore MotionEye</b> collega le telecamere MotionEye a ioBroker: rilevamento del movimento tramite webhook, istantanee, live streaming e controllo della modalità (<code>off</code> / <code>still</code> / <code>sharp</code>).<br><br>Stati delle informazioni in tempo reale in <code>motioneye.<instance>._info</code> (connessione, versioni, telecamere online).",
27
27
  "help_modes": "<table style=\"width:100%;border-collapse:collapse;font-size:0.875rem\"><thead><tr style=\"border-bottom:1px solid #546e7a\"><th style=\"text-align:left;padding:8px 6px;width:18%\">Modalità</th><th style=\"text-align:left;padding:8px 6px\">Descrizione</th></tr></thead><tbody><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>disattivato</code></td><td style=\"padding:6px\">Rilevazione del movimento disattivata</td></tr><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>ancora</code></td><td style=\"padding:6px\">Solo trigger di movimento: nessuna registrazione video</td></tr><tr><td style=\"padding:6px\"><code>nitido</code></td><td style=\"padding:6px\">Rilevamento di movimento + video registrazione</td></tr></tbody></table>",
28
28
  "help_readme": "Documentazione completa:<br><br>• <a href=\"https://github.com/inventwo/ioBroker.motioneye/blob/main/README.md\">README dell'adattatore su GitHub</a>",
29
29
  "help_section_cameras": "Fotocamere",
@@ -23,7 +23,7 @@
23
23
  "header_webhook": "Webhook",
24
24
  "help_cameras": "Gebruik op het tabblad <b>Camera's</b> <b>Camera's laden uit MotionEye</b> om de cameralijst uit MotionEye op te halen en ontbrekende rijen aan de tabel toe te voegen (bestaande vermeldingen blijven behouden). De adapterinstantie moet <b>actief</b> zijn voor deze knop.<br><br><b>MotionEye ID:</b> Open in de MotionEye-webinterface een camera → <b>Videoapparaat</b> → veld <b>Camera-ID</b>. Of vraag <code>/config/list</code> op poort 8765.<br><br><b>Weergavenaam:</b> ioBroker-kanaalnaam — kan verschillen van het MotionEye-label.<br><b>Interne ID:</b> Stabiele webhook-sleutel (bijv. <code>auffahrt</code>). Laat dit leeg om de weergavenaam af te leiden.<br><b>Mediamap:</b> Optionele mapnaam onder <code>/var/lib/motioneye</code>. Toegepast bij het starten van de adapter wanneer configuratiesynchronisatie is ingeschakeld.",
25
25
  "help_connection": "<b>MotionEye-host</b> — IP of hostnaam van uw MotionEye-server.<br><b>MotionEye configuratie-API-poort</b> — standaard <code>8765</code> (modus, webhooks, stream).<br><b>Motion HTTP-poort</b> — standaard <code>7999</code> (snapshots).<br><b>Beheer MotionEye via configuratie-API</b> — verlaten <b>ingeschakeld</b> voor normaal gebruik. De adapter schrijft modus, webhook-URL's en stream aan/uit naar MotionEye; ioBroker beheert detectie en livestreams.<br><br><b>Webhook-host</b> — IP van uw ioBroker-host zoals bereikbaar <i>van MotionEye</i> (bijv. <code>192.168.130.130</code>). Vereist voor webhook-URL's.<br><b>Webhook-poort</b> — standaard <code>8090</code>; sta inkomend verkeer op de ioBroker-host toe.",
26
- "help_intro": "De <b>MotionEye-adapter</b> verbindt MotionEye-camera's met ioBroker: bewegingsdetectie via webhooks, snapshots, livestreams en modusbediening (<code>uit</code> / <code>stilstaand</code> / <code>sharp</code>).<br><br>Infostatussen live onder <code>motioneye.<instance>.0_info</code> (verbinding, versies, camera's online).",
26
+ "help_intro": "De <b>MotionEye-adapter</b> verbindt MotionEye-camera's met ioBroker: bewegingsdetectie via webhooks, snapshots, livestreams en modusbediening (<code>uit</code> / <code>stilstaand</code> / <code>sharp</code>).<br><br>Infostatussen live onder <code>motioneye.<instance>._info</code> (verbinding, versies, camera's online).",
27
27
  "help_modes": "<table style=\"width:100%;border-collapse:collapse;font-size:0.875rem\"><thead><tr style=\"border-bottom:1px solid #546e7a\"><th style=\"text-align:left;padding:8px 6px;width:18%\">Modus</th><th style=\"text-align:left;padding:8px 6px\">Beschrijving</th></tr></thead><tbody><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>uit</code></td><td style=\"padding:6px\">Bewegingsdetectie uit</td></tr><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>still</code></td><td style=\"padding:6px\">Alleen bewegingstrigger - geen video-opname</td></tr><tr><td style=\"padding:6px\"><code>scherp</code></td><td style=\"padding:6px\">Bewegingsdetectie + video opname</td></tr></tbody></table>",
28
28
  "help_readme": "Volledige documentatie:<br><br>• <a href=\"https://github.com/inventwo/ioBroker.motioneye/blob/main/README.md\">Adapter README op GitHub</a>",
29
29
  "help_section_cameras": "Camera's",
@@ -23,7 +23,7 @@
23
23
  "header_webhook": "Webhook",
24
24
  "help_cameras": "Na karcie <b>Kamery</b> użyj opcji <b>Wczytaj kamery z MotionEye</b>, aby pobrać listę kamer z MotionEye i dodać brakujące wiersze do tabeli (istniejące wpisy zostaną zachowane). Dla tego przycisku instancja adaptera musi być <b>uruchomiona</b>.<br><br><b>Identyfikator MotionEye:</b> W internetowym interfejsie użytkownika MotionEye otwórz kamerę → <b>Urządzenie wideo</b> → pole <b>Identyfikator kamery</b>. Lub zapytaj <code>/config/list</code> na porcie 8765.<br><br><b>Nazwa wyświetlana:</b> nazwa kanału ioBroker — może różnić się od etykiety MotionEye.<br><b>Identyfikator wewnętrzny:</b> Stabilny klucz webhooka (np. <code>auffahrt</code>). Pozostaw puste, aby wynikało z nazwy wyświetlanej.<br><b>Folder multimediów:</b> opcjonalna nazwa folderu w <code>/var/lib/motioneye</code>. Stosowane przy uruchomieniu adaptera, gdy włączona jest synchronizacja konfiguracji.",
25
25
  "help_connection": "<b>Host MotionEye</b> — adres IP lub nazwa hosta serwera MotionEye.<br><b>Port API konfiguracji MotionEye</b> — domyślny <code>8765</code> (tryb, elementy webhook, strumień).<br><b>Port HTTP Motion</b> — domyślny <code>7999</code> (migawki).<br><b>Steruj MotionEye poprzez interfejs konfiguracyjny API</b> — wyjdź <b>włączone</b> do normalnego użytkowania. Adapter zapisuje tryb zapisu, adresy URL elementu webhook i włącza/wyłącza przesyłanie strumieniowe do MotionEye; ioBroker kontroluje wykrywanie i transmisje na żywo.<br><br><b>Host webhooka</b> — adres IP hosta ioBroker osiągalny <i>z MotionEye</i> (np. <code>192.168.130.130</code>). Wymagany w przypadku adresów URL webhooka.<br><b>Port webhooka</b> — domyślnie <code>8090</code>; Zezwól na ruch przychodzący na hoście ioBroker.",
26
- "help_intro": "<b>Adapter MotionEye</b> łączy kamery MotionEye z ioBrokerem: wykrywanie ruchu za pomocą webhooków, migawki, transmisje na żywo i kontrola trybu (<code>off</code> / <code>nieruchomy</code> / <code>ostry</code>).<br><br>Stany informacji są dostępne pod <code>motioneye.<instance>.0_info</code> (połączenie, wersje, kamery online).",
26
+ "help_intro": "<b>Adapter MotionEye</b> łączy kamery MotionEye z ioBrokerem: wykrywanie ruchu za pomocą webhooków, migawki, transmisje na żywo i kontrola trybu (<code>off</code> / <code>nieruchomy</code> / <code>ostry</code>).<br><br>Stany informacji są dostępne pod <code>motioneye.<instance>._info</code> (połączenie, wersje, kamery online).",
27
27
  "help_modes": "<table style=\"width:100%;border-collapse:collapse;font-size:0.875rem\"><thead><tr style=\"border-bottom:1px solid #546e7a\"><th style=\"text-align:left;padding:8px 6px;width:18%\">Tryb</th><th style=\"text-align:left;padding:8px 6px\">Opis</th></tr></thead><tbody><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>off</code></td><td style=\"padding:6px\">Wykrywanie ruchu wyłączone</td></tr><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>still</code></td><td style=\"padding:6px\">Tylko wyzwalanie ruchem — bez nagrywania wideo</td></tr><tr><td style=\"padding:6px\"><code>sharp</code></td><td style=\"padding:6px\">Wykrywanie ruchu + wideo nagranie</td></tr></tbody></table>",
28
28
  "help_readme": "Pełna dokumentacja:<br><br> • <a href=\"https://github.com/inventwo/ioBroker.motioneye/blob/main/README.md\">Adapter README w serwisie GitHub</a>",
29
29
  "help_section_cameras": "Kamery",
@@ -23,7 +23,7 @@
23
23
  "header_webhook": "Webhook",
24
24
  "help_cameras": "Na guia <b>Câmeras</b>, use <b>Carregar câmeras do MotionEye</b> para buscar a lista de câmeras do MotionEye e adicionar linhas ausentes à tabela (as entradas existentes são mantidas). A instância do adaptador deve estar <b>em execução</b> para este botão.<br><br><b>ID do MotionEye:</b> na interface da Web do MotionEye, abra uma câmera → <b>Dispositivo de vídeo</b> → campo <b>ID da câmera</b>. Ou consulte <code>/config/list</code> na porta 8765.<br><br><b>Nome de exibição:</b> nome do canal ioBroker — pode ser diferente do rótulo MotionEye.<br><b>ID interno:</b> chave de webhook estável (por exemplo, <code>auffahrt</code>). Deixe em branco para derivar do nome de exibição.<br><b>Pasta de mídia:</b> Nome da pasta opcional em <code>/var/lib/motioneye</code>. Aplicado na inicialização do adaptador quando a sincronização de configuração está habilitada.",
25
25
  "help_connection": "<b>Host MotionEye</b> — IP ou nome de host do seu servidor MotionEye.<br><b>Porta da API de configuração do MotionEye</b> — padrão <code>8765</code> (modo, webhooks, stream).<br><b>Porta HTTP do Motion</b> — padrão <code>7999</code> (instantâneos).<br><b>Controle o MotionEye via API de configuração</b> — saia <b>ativado</b> para uso normal. O adaptador grava modo, URLs de webhook e liga/desliga fluxo para MotionEye; O ioBroker controla a detecção e as transmissões ao vivo.<br><br><b>Host do webhook</b> — IP do seu host ioBroker acessível <i>pelo MotionEye</i> (por exemplo, <code>192.168.130.130</code>). Obrigatório para URLs de webhook.<br><b>Porta de webhook</b> — padrão <code>8090</code>; permitir tráfego de entrada no host ioBroker.",
26
- "help_intro": "O <b>adaptador MotionEye</b> conecta câmeras MotionEye ao ioBroker: detecção de movimento via webhooks, snapshots, transmissões ao vivo e controle de modo (<code>off</code> / <code>still</code> / <code>nítido</code>).<br><br>Os estados de informações ficam em <code>motioneye.<instance>.0_info</code> (conexão, versões, câmeras on-line).",
26
+ "help_intro": "O <b>adaptador MotionEye</b> conecta câmeras MotionEye ao ioBroker: detecção de movimento via webhooks, snapshots, transmissões ao vivo e controle de modo (<code>off</code> / <code>still</code> / <code>nítido</code>).<br><br>Os estados de informações ficam em <code>motioneye.<instance>._info</code> (conexão, versões, câmeras on-line).",
27
27
  "help_modes": "<table style=\"width:100%;border-collapse:collapse;font-size:0.875rem\"><thead><tr style=\"border-bottom:1px solid #546e7a\"><th style=\"text-align:left;padding:8px 6px;width:18%\">Modo</th><th style=\"text-align:left;padding:8px 6px\">Descrição</th></tr></thead><tbody><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>off</code></td><td style=\"padding:6px\">Detecção de movimento desativada</td></tr><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>parado</code></td><td style=\"padding:6px\">Apenas gatilho de movimento - sem gravação de vídeo</td></tr><tr><td style=\"padding:6px\"><code>nítido</code></td><td style=\"padding:6px\">Detecção de movimento + vídeo gravação</td></tr></tbody></table>",
28
28
  "help_readme": "Documentação completa:<br><br>• <a href=\"https://github.com/inventwo/ioBroker.motioneye/blob/main/README.md\">Adaptador README no GitHub</a>",
29
29
  "help_section_cameras": "Câmeras",
@@ -23,7 +23,7 @@
23
23
  "header_webhook": "Вебхук",
24
24
  "help_cameras": "На вкладке <b>Камеры</b> используйте <b>Загрузить камеры из MotionEye</b>, чтобы получить список камер из MotionEye и добавить недостающие строки в таблицу (существующие записи сохраняются). Для этой кнопки экземпляр адаптера должен быть <b>работающим</b>.<br><br><b>Идентификатор MotionEye:</b> В веб-интерфейсе MotionEye откройте камеру → <b>Видеоустройство</b> → поле <b>Идентификатор камеры</b>. Или запросите <code>/config/list</code> через порт 8765.<br><br><b>Отображаемое имя:</b> имя канала ioBroker — может отличаться от метки MotionEye.<br><b>Внутренний идентификатор:</b> Стабильный ключ веб-перехватчика (например, <code>auffahrt</code>). Оставьте пустым, чтобы получить имя из отображаемого имени.<br><b>Папка Media:</b> Необязательное имя папки в <code>/var/lib/motioneye</code>. Применяется при запуске адаптера, когда включена синхронизация конфигурации.",
25
25
  "help_connection": "<b>Хост MotionEye</b> — IP-адрес или имя хоста вашего сервера MotionEye.<br><b>Порт API конфигурации MotionEye</b> — по умолчанию <code>8765</code> (режим, веб-перехватчики, поток).<br><b>Порт HTTP Motion</b> — по умолчанию <code>7999</code> (снимки).<br><b>Управление MotionEye через API конфигурации</b> — выйти <b>включено</b> для обычного использования. Адаптер записывает режим, URL-адреса веб-перехватчиков и включение/выключение потоковой передачи в MotionEye; ioBroker контролирует обнаружение и прямые трансляции.<br><br><b>Хост веб-перехватчика</b> — IP-адрес вашего хоста ioBroker, доступный <i>из MotionEye</i> (например, <code>192.168.130.130</code>). Требуется для URL-адресов веб-перехватчиков.<br><b>Порт веб-перехватчика</b> — по умолчанию <code>8090</code>; разрешить входящий трафик на хосте ioBroker.",
26
- "help_intro": "<b>Адаптер MotionEye</b> подключает камеры MotionEye к ioBroker: обнаружение движения с помощью веб-перехватчиков, снимков, прямых трансляций и управления режимами (<code>выкл.</code> / <code> Still</code> / <code>sharp</code>).<br><br>Информация отображается в <code>motioneye.<instance>.0_info</code> (подключение, версии, камеры онлайн).",
26
+ "help_intro": "<b>Адаптер MotionEye</b> подключает камеры MotionEye к ioBroker: обнаружение движения с помощью веб-перехватчиков, снимков, прямых трансляций и управления режимами (<code>выкл.</code> / <code> Still</code> / <code>sharp</code>).<br><br>Информация отображается в <code>motioneye.<instance>._info</code> (подключение, версии, камеры онлайн).",
27
27
  "help_modes": "<table style=\"width:100%;border-collapse:collapse;font-size:0.875rem\"><thead><tr style=\"border-bottom:1px Solid #546e7a\"><th style=\"text-align:left;padding:8px 6px;width:18%\">Режим</th><th style=\"text-align:left;padding:8px\" 6px\">Описание</th></tr></thead><tbody><tr style=\"border-bottom:1px Solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>off</code></td><td style=\"padding:6px\">Обнаружение движения выключен</td></tr><tr style=\"border-bottom:1px Solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code> Still</code></td><td style=\"padding:6px\">Только триггер движения — без записи видео</td></tr><tr><td style=\"padding:6px\"><code>sharp</code></td><td style=\"padding:6px\">Обнаружение движения + видео запись</td></tr></tbody></table>",
28
28
  "help_readme": "Полная документация:<br><br>• <a href=\"https://github.com/inventwo/ioBroker.motioneye/blob/main/README.md\">README адаптера на GitHub</a>",
29
29
  "help_section_cameras": "Камеры",
@@ -23,7 +23,7 @@
23
23
  "header_webhook": "Вебхук",
24
24
  "help_cameras": "На вкладці <b>Камери</b> скористайтеся кнопкою <b>Завантажити камери з MotionEye</b>, щоб отримати список камер із MotionEye і додати відсутні рядки до таблиці (існуючі записи зберігаються). Для цієї кнопки екземпляр адаптера має бути <b>запущений</b>.<br><br><b>Ідентифікатор MotionEye:</b> у веб-інтерфейсі MotionEye відкрийте камеру → <b>Відеопристрій</b> → поле <b>Ідентифікатор камери</b>. Або надішліть запит <code>/config/list</code> на порт 8765.<br><br><b>Відображувана назва:</b> назва каналу ioBroker — може відрізнятися від мітки MotionEye.<br><b>Внутрішній ідентифікатор:</b> стабільний ключ вебхука (наприклад, <code>auffahrt</code>). Залиште пустим, щоб отримати відображуване ім’я.<br><b>Папка медіа:</b> Додаткова назва папки в <code>/var/lib/motioneye</code>. Застосовується під час запуску адаптера, коли ввімкнено синхронізацію конфігурації.",
25
25
  "help_connection": "<b>Хост MotionEye</b> — IP-адреса або ім’я хосту вашого сервера MotionEye.<br><b>Порт API конфігурації MotionEye</b> — за умовчанням <code>8765</code> (режим, веб-хуки, потік).<br><b>Порт HTTP Motion</b> — за замовчуванням <code>7999</code> (миттєві знімки).<br><b>Керуйте MotionEye через API конфігурації</b> — вийдіть <b>увімкнено</b> для звичайного використання. Адаптер записує режим, URL-адреси webhook і вмикає/вимикає потік у MotionEye; ioBroker контролює виявлення та прямі трансляції.<br><br><b>Хост Webhook</b> — IP-адреса вашого хосту ioBroker доступна <i>з MotionEye</i> (наприклад, <code>192.168.130.130</code>). Необхідно для URL-адрес webhook.<br><b>Порт webhook</b> — за умовчанням <code>8090</code>; дозволити вхідний трафік на хост ioBroker.",
26
- "help_intro": "<b>Адаптер MotionEye</b> підключає камери MotionEye до ioBroker: виявлення руху через веб-перехоплення, знімки, прямі трансляції та керування режимами (<code>off</code> / <code>still</code> / <code>sharp</code>).<br><br>Інформаційні стани живуть у <code>motioneye.<instance>.0_info</code> (підключення, версії, камери) онлайн).",
26
+ "help_intro": "<b>Адаптер MotionEye</b> підключає камери MotionEye до ioBroker: виявлення руху через веб-перехоплення, знімки, прямі трансляції та керування режимами (<code>off</code> / <code>still</code> / <code>sharp</code>).<br><br>Інформаційні стани живуть у <code>motioneye.<instance>._info</code> (підключення, версії, камери) онлайн).",
27
27
  "help_modes": "<table style=\"width:100%;border-collapse:collapse;font-size:0.875rem\"><thead><tr style=\"border-bottom:1px solid #546e7a\"><th style=\"text-align:left;padding:8px 6px;width:18%\">Режим</th><th style=\"text-align:left;padding:8px 6px\">Опис</th></tr></thead><tbody><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>off</code></td><td style=\"padding:6px\">Виявлення руху вимкнено</td></tr><tr style=\"border-bottom:1px solid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>still</code></td><td style=\"padding:6px\">Лише тригер руху — без запису відео</td></tr><tr><td style=\"padding:6px\"><code>sharp</code></td><td style=\"padding:6px\">Виявлення руху + відео запис</td></tr></tbody></table>",
28
28
  "help_readme": "Повна документація:<br><br>• <a href=\"https://github.com/inventwo/ioBroker.motioneye/blob/main/README.md\">Adapter README на GitHub</a>",
29
29
  "help_section_cameras": "Фотоапарати",
@@ -23,7 +23,7 @@
23
23
  "header_webhook": "网络钩子",
24
24
  "help_cameras": "在<b>相机</b>选项卡上,使用<b>从 MotionEye 加载相机</b>从 MotionEye 获取相机列表并将缺失的行添加到表中(保留现有条目)。此按钮的适配器实例必须<b>正在运行</b>。<br><br><b>MotionEye ID:</b>在 MotionEye Web UI 中打开相机 → <b>视频设备</b> → 字段<b>相机 ID</b>。或者在端口 8765 上查询 <code>/config/list</code>。<br><br><b>显示名称:</b> ioBroker 通道名称 — 可以与 MotionEye 标签不同。<br><b>内部 ID:</b> 稳定的 webhook 密钥(例如 <code>auffahrt</code>)。留空以从显示名称派生。<br><b>媒体文件夹:</b><code>/var/lib/motioneye</code> 下的可选文件夹名称。当启用配置同步时应用于适配器启动。",
25
25
  "help_connection": "<b>MotionEye 主机</b> - MotionEye 服务器的 IP 或主机名。<br><b>MotionEye 配置 API 端口</b> - 默认 <code>8765</code>(模式、webhooks、流)。<br><b>Motion HTTP 端口</b> - 默认 <code>7999</code>(快照)。<br><b>通过配置 API 控制 MotionEye</b> - 离开<b>已启用</b>以供正常使用。适配器将模式、Webhook URL 和流开/关写入 MotionEye; ioBroker 控制检测和实时流。<br><br><b>Webhook 主机</b> — <i>可从 MotionEye</i> 访问 ioBroker 主机的 IP(例如 <code>192.168.130.130</code>)。 Webhook URL 必需。<br><b>Webhook 端口</b> — 默认 <code>8090</code>;允许 ioBroker 主机上的入站流量。",
26
- "help_intro": "<b>MotionEye 适配器</b>将 MotionEye 摄像头连接到 ioBroker:通过 Webhooks、快照、实时流和模式控制(<code>off</code> / <code>still</code> / <code>sharp</code>)进行运动检测。<br><br>信息状态在 <code>motioneye.<instance>.0_info</code> 下实时显示(连接、版本、在线摄像头)。",
26
+ "help_intro": "<b>MotionEye 适配器</b>将 MotionEye 摄像头连接到 ioBroker:通过 Webhooks、快照、实时流和模式控制(<code>off</code> / <code>still</code> / <code>sharp</code>)进行运动检测。<br><br>信息状态在 <code>motioneye.<instance>._info</code> 下实时显示(连接、版本、在线摄像头)。",
27
27
  "help_modes": "<table style=\"width:100%;border-collapse:collapse;font-size:0.875rem\"><thead><tr style=\"border-bottom:1pxsolid #546e7a\"><th style=\"text-align:left;padding:8px 6px;width:18%\">模式</th><th style=\"text-align:left;padding:8px 6px\">说明</th></tr></thead><tbody><tr style=\"border-bottom:1pxsolid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>关闭</code></td><td style=\"padding:6px\">运动检测关闭</td></tr><tr style=\"border-bottom:1pxsolid rgba(84,110,122,0.35)\"><td style=\"padding:6px\"><code>静止</code></td><td style=\"padding:6px\">仅运动触发 - 无视频录制</td></tr><tr><td style=\"padding:6px\"><code>锐利</code></td><td style=\"padding:6px\">运动检测+视频录音</td></tr></tbody></table>",
28
28
  "help_readme": "完整文档:<br><br>• <a href=\"https://github.com/inventwo/ioBroker.motioneye/blob/main/README.md\">GitHub 上的适配器自述文件</a>",
29
29
  "help_section_cameras": "相机",
Binary file
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "motioneye",
4
- "version": "0.2.1",
4
+ "version": "0.3.1",
5
5
  "news": {
6
+ "0.3.1": {
7
+ "en": "Changed repo icon",
8
+ "de": "Repository-Symbol geändert",
9
+ "ru": "Изменен значок репозитория",
10
+ "pt": "Ícone do repositório alterado",
11
+ "nl": "Repository-pictogram gewijzigd",
12
+ "fr": "Icône du dépôt modifiée",
13
+ "it": "Icona del repository modificata",
14
+ "es": "Icono del repositorio cambiado",
15
+ "pl": "Zmieniono ikonę repozytorium",
16
+ "uk": "Змінено піктограму репозиторію",
17
+ "zh-cn": "更改了仓库图标"
18
+ },
19
+ "0.3.0": {
20
+ "en": "Camera channel folders are now lowercase (e.g. `innenhof_ii` instead of `Innenhof_II`) — aligned with other ioBroker adapters\nInfo states moved from `0_info` to `_info`\nExisting datapoint values are migrated automatically on adapter start — please check VIS, scripts, and automations that use fixed state paths",
21
+ "de": "Die Ordner für die Kamerakanäle werden jetzt in Kleinbuchstaben geschrieben (z. B. `innenhof_ii` statt `Innenhof_II`) – angepasst an andere ioBroker-Adapter.\nInformationszustände wurden von `0_info` nach `_info` verschoben.\nVorhandene Datenpunktwerte werden beim Start des Adapters automatisch migriert – bitte überprüfen Sie VIS, Skripte und Automatisierungen, die feste Zustandspfade verwenden.",
22
+ "ru": "Папки каналов камер теперь отображаются строчными буквами (например, `innenhof_ii` вместо `Innenhof_II`) — в соответствии с другими адаптерами ioBroker.\nИнформационные состояния перенесены из `0_info` в `_info`\nСуществующие значения точек данных переносятся автоматически при запуске адаптера — пожалуйста, проверьте VIS, скрипты и автоматизации, использующие фиксированные пути состояния.",
23
+ "pt": "As pastas dos canais da câmera agora estão em minúsculas (por exemplo, `innenhof_ii` em vez de `Innenhof_II`) — em consonância com outros adaptadores ioBroker.\nOs estados de informação foram movidos de `0_info` para `_info`.\nOs valores dos pontos de dados existentes são migrados automaticamente na inicialização do adaptador — verifique os VIS, scripts e automações que usam caminhos de estado fixos.",
24
+ "nl": "De mappen voor camerakanalen worden nu in kleine letters weergegeven (bijv. `innenhof_ii` in plaats van `Innenhof_II`) — in lijn met andere ioBroker-adapters.\nInformatiestatussen zijn verplaatst van `0_info` naar `_info`.\nBestaande datapuntwaarden worden automatisch gemigreerd bij het opstarten van de adapter. Controleer hiervoor VIS, scripts en automatiseringen die gebruikmaken van paden met vaste status.",
25
+ "fr": "Les noms des dossiers des canaux de caméra sont désormais en minuscules (par exemple, `innenhof_ii` au lieu de `Innenhof_II`) — conformément aux autres adaptateurs ioBroker.\nLes états d'information ont été déplacés de `0_info` à `_info`\nLes valeurs des points de données existants sont migrées automatiquement au démarrage de l'adaptateur — veuillez vérifier les interfaces visuelles, les scripts et les automatisations qui utilisent des chemins d'état fixes.",
26
+ "it": "Le cartelle dei canali della telecamera ora sono in minuscolo (ad esempio `innenhof_ii` invece di `Innenhof_II`) — allineate con gli altri adattatori ioBroker\nGli stati informativi sono stati spostati da `0_info` a `_info`\nI valori dei punti dati esistenti vengono migrati automaticamente all'avvio dell'adattatore: si prega di verificare VIS, script e automazioni che utilizzano percorsi di stato fissi.",
27
+ "es": "Las carpetas de los canales de la cámara ahora están en minúsculas (por ejemplo, `innenhof_ii` en lugar de `Innenhof_II`), para que coincidan con otros adaptadores de ioBroker.\nLos estados de información se movieron de `0_info` a `_info`.\nLos valores de los puntos de datos existentes se migran automáticamente al iniciar el adaptador; compruebe los VIS, los scripts y las automatizaciones que utilizan rutas de estado fijo.",
28
+ "pl": "Foldery kanałów kamer są teraz pisane małymi literami (np. `innenhof_ii` zamiast `Innenhof_II`) — zgodne z innymi adapterami ioBroker\nStany informacji przeniesiono z `0_info` do `_info`\nIstniejące wartości punktów danych są automatycznie migrowane podczas uruchamiania adaptera — sprawdź VIS, skrypty i automatyzacje korzystające ze ścieżek stanu stałego",
29
+ "uk": "Папки каналів камер тепер пишуться малими літерами (наприклад, `innenhof_ii` замість `Innenhof_II`) — узгоджено з іншими адаптерами ioBroker.\nІнформаційні стани переміщено з `0_info` на `_info`\nІснуючі значення точок даних переносяться автоматично під час запуску адаптера — перевірте VIS, скрипти та автоматизації, які використовують шляхи з фіксованим станом.",
30
+ "zh-cn": "摄像机通道文件夹现在全部使用小写字母(例如,`innenhof_ii` 而不是 `Innenhof_II`)——与其他 ioBroker 适配器保持一致。\n信息状态从 `0_info` 移至 `_info`\n适配器启动时,现有数据点值会自动迁移——请检查使用固定状态路径的 VIS、脚本和自动化流程。"
31
+ },
6
32
  "0.2.1": {
7
33
  "en": "Fixed adapter checker errors an warnings",
8
34
  "de": "Adapterprüfungsfehler und Warnungen behoben",
@@ -67,19 +93,6 @@
67
93
  "pl": "Dodano stany dla motionEyeVersion i motionVersion",
68
94
  "uk": "Додано стани для motionEyeVersion та motionVersion",
69
95
  "zh-cn": "为 motionEyeVersion 和 motionVersion 添加了状态"
70
- },
71
- "0.0.1": {
72
- "en": "Initial development release — adapter scaffold and MotionEye API client",
73
- "de": "Erste Entwicklungsversion — Adapter-Grundgerüst und MotionEye-API-Client",
74
- "ru": "Первоначальный выпуск разработки — каркас адаптера и клиент MotionEye API",
75
- "pt": "Lançamento inicial de desenvolvimento — estrutura do adaptador e cliente MotionEye API",
76
- "nl": "Eerste ontwikkelingsrelease — adapter scaffold en MotionEye API-client",
77
- "fr": "Première version de développement — structure d'adaptateur et client API MotionEye",
78
- "it": "Rilascio iniziale di sviluppo — scaffold dell'adattatore e client API MotionEye",
79
- "es": "Lanzamiento inicial de desarrollo — andamiaje del adaptador y cliente API MotionEye",
80
- "pl": "Początkowe wydanie deweloperskie — szkielet adaptera i klient API MotionEye",
81
- "uk": "Початковий випуск розробки — каркас адаптера та клієнт MotionEye API",
82
- "zh-cn": "初始开发版本 — 适配器脚手架和 MotionEye API 客户端"
83
96
  }
84
97
  },
85
98
  "titleLang": {
@@ -122,9 +135,9 @@
122
135
  "license": "MIT"
123
136
  },
124
137
  "platform": "Javascript/Node.js",
125
- "icon": "motioneye.svg",
138
+ "icon": "motioneye.png",
126
139
  "enabled": true,
127
- "extIcon": "https://raw.githubusercontent.com/inventwo/ioBroker.motioneye/main/admin/motioneye.svg",
140
+ "extIcon": "https://raw.githubusercontent.com/inventwo/ioBroker.motioneye/main/admin/motioneye.png",
128
141
  "readme": "https://github.com/inventwo/ioBroker.motioneye/blob/main/README.md",
129
142
  "loglevel": "info",
130
143
  "tier": 3,
@@ -201,7 +214,7 @@
201
214
  "native": {}
202
215
  },
203
216
  {
204
- "_id": "0_info",
217
+ "_id": "_info",
205
218
  "type": "meta",
206
219
  "common": {
207
220
  "name": {
@@ -6,6 +6,19 @@
6
6
  * @returns {string}
7
7
  */
8
8
  function safeChannelName(name) {
9
+ return String(name)
10
+ .trim()
11
+ .replace(/\s+/g, '_')
12
+ .replace(/[^a-zA-Z0-9_äöüÄÖÜß-]/g, '_')
13
+ .toLowerCase();
14
+ }
15
+
16
+ /**
17
+ * Pre-0.2.2 channel IDs (mixed case) — used for one-time migration on adapter start.
18
+ * @param {string} name
19
+ * @returns {string}
20
+ */
21
+ function legacySafeChannelName(name) {
9
22
  return String(name)
10
23
  .trim()
11
24
  .replace(/\s+/g, '_')
@@ -47,10 +60,11 @@ function slugifyId(value) {
47
60
 
48
61
  /**
49
62
  * @param {NativeCameraConfig[]} cameras
50
- * @param {string} fallbackDefaultMode
63
+ * @param {string} [fallbackDefaultMode]
64
+ * @param {(name: string) => string} [channelNameFn]
51
65
  * @returns {ResolvedCamera[]}
52
66
  */
53
- function resolveCameras(cameras, fallbackDefaultMode = 'off') {
67
+ function resolveCameras(cameras, fallbackDefaultMode = 'off', channelNameFn = safeChannelName) {
54
68
  if (!Array.isArray(cameras)) {
55
69
  return [];
56
70
  }
@@ -66,7 +80,7 @@ function resolveCameras(cameras, fallbackDefaultMode = 'off') {
66
80
  }
67
81
 
68
82
  const name = String(entry.name).trim();
69
- const channel = safeChannelName(name);
83
+ const channel = channelNameFn(name);
70
84
  if (!channel) {
71
85
  continue;
72
86
  }
@@ -107,6 +121,15 @@ function resolveCameras(cameras, fallbackDefaultMode = 'off') {
107
121
  return resolved;
108
122
  }
109
123
 
124
+ /**
125
+ * @param {NativeCameraConfig[]} cameras
126
+ * @param {string} [fallbackDefaultMode]
127
+ * @returns {ResolvedCamera[]}
128
+ */
129
+ function resolveLegacyCameras(cameras, fallbackDefaultMode = 'off') {
130
+ return resolveCameras(cameras, fallbackDefaultMode, legacySafeChannelName);
131
+ }
132
+
110
133
  /**
111
134
  * @param {string} namespace Adapter namespace (e.g. motioneye.0)
112
135
  * @param {string} webhookHost ioBroker host reachable from MotionEye
@@ -156,8 +179,10 @@ function parseWebhookRequest(path, namespace) {
156
179
 
157
180
  module.exports = {
158
181
  safeChannelName,
182
+ legacySafeChannelName,
159
183
  slugifyId,
160
184
  resolveCameras,
185
+ resolveLegacyCameras,
161
186
  buildWebhookUrl,
162
187
  parseWebhookRequest,
163
188
  };
@@ -3,16 +3,19 @@
3
3
  const { expect } = require('chai');
4
4
  const {
5
5
  safeChannelName,
6
+ legacySafeChannelName,
6
7
  slugifyId,
7
8
  resolveCameras,
9
+ resolveLegacyCameras,
8
10
  buildWebhookUrl,
9
11
  parseWebhookRequest,
10
12
  } = require('./cameraRegistry');
11
13
 
12
14
  describe('cameraRegistry', () => {
13
- it('safeChannelName should replace spaces and strip unsafe characters', () => {
14
- expect(safeChannelName('Innenhof II')).to.equal('Innenhof_II');
15
- expect(safeChannelName(' Auffahrt ')).to.equal('Auffahrt');
15
+ it('safeChannelName should replace spaces, strip unsafe characters, and lowercase', () => {
16
+ expect(safeChannelName('Innenhof II')).to.equal('innenhof_ii');
17
+ expect(safeChannelName(' Auffahrt ')).to.equal('auffahrt');
18
+ expect(safeChannelName('eCar')).to.equal('ecar');
16
19
  });
17
20
 
18
21
  it('slugifyId should produce lowercase stable ids', () => {
@@ -31,12 +34,19 @@ describe('cameraRegistry', () => {
31
34
  );
32
35
 
33
36
  expect(cameras).to.have.length(3);
34
- expect(cameras[0].channel).to.equal('Auffahrt');
37
+ expect(cameras[0].channel).to.equal('auffahrt');
35
38
  expect(cameras[0].defaultMode).to.equal('still');
36
39
  expect(cameras[1].id).to.equal('auffahrt_2');
37
40
  expect(cameras[2].enabled).to.equal(false);
38
41
  });
39
42
 
43
+ it('resolveLegacyCameras should keep pre-lowercase channel ids for migration', () => {
44
+ const legacy = resolveLegacyCameras([{ name: 'Innenhof II', motionEyeId: 4 }]);
45
+ expect(legacy[0].channel).to.equal('Innenhof_II');
46
+ const current = resolveCameras([{ name: 'Innenhof II', motionEyeId: 4 }]);
47
+ expect(current[0].channel).to.equal('innenhof_ii');
48
+ });
49
+
40
50
  it('buildWebhookUrl should include namespace and camera id', () => {
41
51
  const url = buildWebhookUrl('motioneye.0', '192.168.1.10', 8090, 'auffahrt');
42
52
  expect(url).to.equal('http://192.168.1.10:8090/motioneye.0/webhook/auffahrt?value=true');
package/main.js CHANGED
@@ -10,7 +10,7 @@ const { createMotionApi } = require('./lib/motionApi');
10
10
  const { buildStoragePatch } = require('./lib/mediaStorage');
11
11
  const { INFO_STATE_LABELS } = require('./lib/infoLabels');
12
12
  const { mergeMotionEyeCameras, parseLoadCamerasMessage } = require('./lib/cameraDiscovery');
13
- const { resolveCameras, buildWebhookUrl } = require('./lib/cameraRegistry');
13
+ const { resolveCameras, resolveLegacyCameras, buildWebhookUrl } = require('./lib/cameraRegistry');
14
14
  const {
15
15
  normalizeMode,
16
16
  inferModeFromConfig,
@@ -21,10 +21,23 @@ const {
21
21
  const { createWebhookServer } = require('./lib/webhookServer');
22
22
  const { createStreamManager } = require('./lib/streamManager');
23
23
 
24
- /** Info states under `0_info` digits sort before letters (underscore does not). */
25
- const INFO_PREFIX = '0_info';
26
- const LEGACY_INFO_PREFIXES = ['info', '_info'];
24
+ /** Info states under `_info` (lowercase, like other adapters). */
25
+ const INFO_PREFIX = '_info';
26
+ const LEGACY_INFO_PREFIXES = ['info', '0_info'];
27
27
  const LEGACY_INFO_STATES = ['connection', 'camerasOnline', 'lastSync', 'motionEyeVersion', 'motionVersion'];
28
+ const CAMERA_STATE_IDS = [
29
+ 'mode',
30
+ 'motion',
31
+ 'status',
32
+ 'lastAction',
33
+ 'snapshot',
34
+ 'stream',
35
+ 'streamPulse',
36
+ 'streamUrl',
37
+ 'webhookUrl',
38
+ 'motionEyeId',
39
+ 'motionEyeName',
40
+ ];
28
41
 
29
42
  class Motioneye extends utils.Adapter {
30
43
  /**
@@ -218,7 +231,19 @@ class Motioneye extends utils.Adapter {
218
231
  }
219
232
 
220
233
  async ensureInfoStates() {
234
+ await this.setObjectNotExistsAsync(INFO_PREFIX, {
235
+ type: 'meta',
236
+ common: {
237
+ name: 'MotionEye adapter information',
238
+ type: 'meta.folder',
239
+ },
240
+ native: {},
241
+ });
242
+
221
243
  for (const [stateId, labels] of Object.entries(INFO_STATE_LABELS)) {
244
+ if (stateId.startsWith('_')) {
245
+ continue;
246
+ }
222
247
  const type = stateId === 'camerasOnline' ? 'number' : 'string';
223
248
  const role =
224
249
  stateId === 'connection' ? 'indicator.connected' : stateId === 'camerasOnline' ? 'value' : 'text';
@@ -487,6 +512,45 @@ class Motioneye extends utils.Adapter {
487
512
  await this.setStateAsync(`${channelId}.streamUrl`, '', true);
488
513
  }
489
514
 
515
+ async migrateLegacyCameraChannels() {
516
+ const cameras = resolveCameras(this.config.cameras, this.config.defaultMode || 'off');
517
+ const legacyCameras = resolveLegacyCameras(this.config.cameras, this.config.defaultMode || 'off');
518
+
519
+ for (const camera of cameras) {
520
+ if (!camera.enabled) {
521
+ continue;
522
+ }
523
+
524
+ const legacy = legacyCameras.find(
525
+ entry => entry.motionEyeId === camera.motionEyeId && entry.id === camera.id,
526
+ );
527
+ if (!legacy || legacy.channel === camera.channel) {
528
+ continue;
529
+ }
530
+
531
+ const legacyChannel = legacy.channel;
532
+ const legacyFolder = await this.getObjectAsync(legacyChannel);
533
+ if (!legacyFolder) {
534
+ continue;
535
+ }
536
+
537
+ for (const stateId of CAMERA_STATE_IDS) {
538
+ const legacyId = `${legacyChannel}.${stateId}`;
539
+ const newId = `${camera.channel}.${stateId}`;
540
+ const legacyState = await this.getStateAsync(legacyId);
541
+ if (legacyState) {
542
+ await this.setStateAsync(newId, legacyState.val, legacyState.ack);
543
+ }
544
+ if (await this.getObjectAsync(legacyId)) {
545
+ await this.delObjectAsync(legacyId);
546
+ }
547
+ }
548
+
549
+ await this.delObjectAsync(legacyChannel);
550
+ this.log.info(`Migrated camera channel ${legacyChannel} → ${camera.channel}`);
551
+ }
552
+ }
553
+
490
554
  async initializeCameras() {
491
555
  this.syncCameraRegistry();
492
556
 
@@ -494,6 +558,8 @@ class Motioneye extends utils.Adapter {
494
558
  this.log.warn('No enabled cameras configured — add cameras on the Cameras tab');
495
559
  }
496
560
 
561
+ await this.migrateLegacyCameraChannels();
562
+
497
563
  for (const camera of this.camerasById.values()) {
498
564
  await this.ensureCameraObjects(camera);
499
565
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.motioneye",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "description": "Connect MotionEye cameras to ioBroker for motion detection, snapshots, and live streams",
5
5
  "author": {
6
6
  "name": "skvarel",
@@ -1,13 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="150px" height="150px" viewBox="0 0 150 150" version="1.1">
3
- <defs>
4
- <image id="image12" width="150" height="150" xlink:href="data:image/png;base64,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"/>
5
- <image id="image22" width="150" height="150" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAABmJLR0QA/wD/AP+gvaeTAAAHw0lEQVR4nO3bX0xb1x0H8K+vjTH+BwYbDJiASQQhbQIjdGOlTaLmD03XVcvWRFujqd2fh03apj1v2h73tIdJ3TRt2rRJS6tp09JoUZapU0RoQ5NmSZbgwLpSAoFg/hnb2MZ/rn3xHg53XBhZUi2Ba/h+pKtrcf333q/OOfecHwZsXhIAIwAzAAsAO4AyABUAygFUWMqrffb63Y2WiuqaYleV21xW6TI73fYiZ4VFMhZLUrFFkooskmQyw1hiNwBALpXI53M5KJlkfjEnLyrZjJJNhOVsbG5Bng/Ny7FQWI5OTScnh0cTo4ERAHMAwgAiS1sMQApABkAWgAIgv76n5vEzbPQXeIQMS5sJK8PkAuB2+Joayvfsb7PVNu8sqWyot3rqqsxOjz1vMEB7XfOaB6uvdn7Vg/sfF49y6QU5HRqfS4fGgunpsZH43cBA6Pr5fihKCCJsUQALANLYZCHbDMHStkw2iCBVGM3WSm/nZztcLZ2fdPj37LZ6/VUGGAxrh+PxBGut40oqkUlODI0tjA8G5m5euBQd6B0EMAvRssWwSUJWqMEyQATKDMAKoBRAZYnb17jt8GsvlDY/1Wmvaao3mi2mhwvH+gVr9euzsdlY/E7/7fDNv16Y6Tt9GcA0gBCAeYguMwdgEQWm0IKldnUWiDB5jMXWupp9x/dVth8+VLZj7xOS2WIC8BAXX7vbuGBpyYlwIj78j1uh9976y9yN81cABCFasgQAGSJgBdGKFUqwJIhAWSG6upqKnZ3tdd1fOVHe8nSHqcRuUZ/48Bdfu9NHsLTH09N3Judu/O3tiXOv/1mRUyMQLZnaVeq+m9R7sNRA2QB4APhq9x1/rvbZ48dcO/buhCRJ/8/FW97pL1jqTknOp6L/fO/9ifM/fzM5NnALohWLQNxV6jZgeg2W2uXZALgB1De++M1jtftPfN5a1VAN4GMG50HH9Rus//xJkZXoYN/1ibOv/yYxeus6gAmIu8oMdNhF6i1YBog7PCvEfFP9toMnj2479Oor9tomHwDkV531rRIs9Zfns3IuOtB79d6Zn/w6GfzXTYiAzWN5DKYLegqWBKAYYgy1rabr2BH/8197zVH/pF/7pK0eLPXAYiaZDfdf6B3/449+Kc/P3gYwBTHIz63x1utOL8FSu72aEnddW8uXf/CtyrZDnzYYJMN/n3wGS3s8F5+LTfX87lTw3E/fBHAHYuJVXuPt15UegiVBdH2+lpM//Grtsy9/o8jmdNz/5DNYax1Pz4z2B9/+1fdC7/6+D0AcYmC/YYwb+eFLJDidtq7v/+k7Fbs+9YqxuKTUIBn18L10L6/kFnPxuZgcmQouZpKT1rpmU3roxlV5IZICWyxIAEogButVACpK/bvrnP499fbq7Y0Wt6++pKK2xlLudZsd5fa8+o23UIu1KKeymXAwnJmfns6GpybSM3dHFsYCw9HByyNQ5AUASYgBvLrYncYGD+T1ECxAhKsIYqxVhOVF5BKIbtIOwGbz1Hk9HUdbHQ0tu2xV/u3Wyvpqk63Mqn2jQg+Wkl6QM7PjM+nQvbHU9MhQfPjaQCTQ8yEUJQaxYJ1c2rQVEotLWw6iC9zwu0O9BGs1CctTD+oiswnirtEKwAHACaC0/Imu5qpPHO50NOzabatt9pusTjELXyDByiXnk6ngR+PJ4NAHsaH3r83+/VwAihKFmGVPYLn6QcZyaNR9fo2P0QW9But+JKwMWhFE0JxYqmqo7nyprXzP/q5Sf2ur1ev3wiCt+I0bHazFbCaXnBgaT9wN9IdvXeiL9PcMQEx0qmFKQoRI2/robgL0QQotWKupVQ7aFk0t6HOXNjzZ7H3mxMGyHe0d9rrmOoPRZNyIYGVjoUR8NDAYG7p2debdP1ySE2F1cXkeIkgZrAxSQYVoLYUerNXUoKkhs0GEzGPzNm6vfe7kEVdL1zN2X5NP/emPK1jZhWgyPtI/ELl9sTfYc6oXijIFMbiOQ4yPslguiSn4IK222YKlpW3N1JC5AHjdrQfavU9/4UXXzs69RU6341EFK5dJZmND1wLh/p6e4MVTvVCUSSy3TNoCvg0fXD9umzlYWmrZchHE3aYDgMdoLK71HXm12723u9vZ2LpjxUz/xwhWOjQeitx+553x8784nQ7d+wjADJbDpA66N12r9L9slWBpra4+dQGocbcefKrmwBdfLm3pbDcV28wPCtainM5FP7zaP335zNmZK2f6IMpZQlguytPFmt1G2YrB0lLHY2pFqtfi9jU1vPTtL3naDh8w2sts2icvzTNlIoGLV0bO/uyN5L0PAhCLv1GsLCPesoFSbfVgqdQ5MzPE1EWVscTR2Pi5755wdxztLnZ5XblUPBUZuHRl+PSPf5ueGhkAMIkCquhcbwzWStpu0g7AYzJZanyf+XrHZM8bgUwsMgFRIjwPnRbY6QWDdX/qMpMFortUIMJUUP/UQERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERI/evwE2sAMsZcHqkwAAAABJRU5ErkJggg=="/>
6
- <image id="image32" width="150" height="150" xlink:href="data:image/png;base64,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"/>
7
- </defs>
8
- <g id="surface1">
9
- <use xlink:href="#image12"/>
10
- <use xlink:href="#image22"/>
11
- <use xlink:href="#image32"/>
12
- </g>
13
- </svg>
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="enable-background:new 0 0 512 512" viewBox="0 0 512 512"><filter id="e" class="B"><feFlood class="C D"/><feComposite in2="SourceGraphic" operator="in"/><feGaussianBlur stdDeviation=".2"/><feOffset dy="-.5"/><feComposite in="SourceGraphic"/></filter><filter id="a" class="B"><feFlood class="C D"/><feComposite in2="SourceGraphic" operator="in"/><feGaussianBlur stdDeviation=".6"/><feOffset dy="-1"/><feComposite in="SourceGraphic"/></filter><filter id="g" x="-.1" y="-.16" class="B"><feFlood class="C D"/><feComposite in2="SourceGraphic" operator="in"/><feGaussianBlur stdDeviation=".6"/><feOffset dy="-1"/><feComposite in="SourceGraphic"/></filter><g style="filter:url(#a)" transform="matrix(1.20536 0 0 -1.20536 1.143 62.857)"><linearGradient id="b" x1="75.101" x2="75.101" y1="-764.379" y2="-1178.719" gradientTransform="translate(120.913 968.928)scale(1.2054)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#4aa3e0"/><stop offset="1" style="stop-color:#3096db"/></linearGradient><path d="M53.4-18.8C19.6-56.4-.9-105.6-.9-160.2c0-117.3 95.1-212.4 212.4-212.4s212.4 95.1 212.4 212.4c0 54.4-20.5 103.8-54.1 141.4-16.1-5.9-32.1-12.8-48-21.7 31.4-9.2 53.1-38 53.1-70.7-.1-40.6-33-73.4-73.5-73.5-34.5 0-63.4 23.8-71.5 55.6h-36.8c-8-31.9-37-55.6-71.5-55.6-40.6 0-73.8 33.1-73.8 73.5 0 33.8 23.3 62.4 54.6 71-15.9 8.6-32.2 15.3-49 21.4m158-133.3c5.1-18.8 10.4-37.4 32.7-49l-32.7-49-32.7 49c19.5 13.8 28.5 30.7 32.7 49" style="fill:url(#b)"/><linearGradient id="c" x1=".554" x2=".554" y1="-764.379" y2="-1178.719" gradientTransform="translate(120.913 968.928)scale(1.2054)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#4aa3e0"/><stop offset="1" style="stop-color:#3096db"/></linearGradient><path d="M121.6-86.7c-13.5 0-24.5-11-24.5-24.5s11-24.5 24.5-24.5 24.5 11 24.5 24.5-11 24.5-24.5 24.5" style="fill:url(#c)"/><linearGradient id="d" x1="133.923" x2="133.923" y1="-764.379" y2="-1178.719" gradientTransform="translate(139.867 968.928)scale(1.2054)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#4aa3e0"/><stop offset="1" style="stop-color:#3096db"/></linearGradient><path d="M301.3-86.7c-13.5 0-24.5-11-24.5-24.5s11-24.5 24.5-24.5 24.5 11 24.5 24.5-11 24.5-24.5 24.5" style="fill:url(#d)"/></g><g style="filter:url(#e)" transform="matrix(1.25 0 0 -1.25 0 64)"><linearGradient id="f" x1="92.558" x2="373.483" y1="17.967" y2="17.967" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#4aa3e0"/><stop offset="1" style="stop-color:#3096db"/></linearGradient><path d="M204.8 51.2c-41.5 0-80-13.3-112.2-34.5 34.9-3.7 69.3-12.7 108.3-32 39.5 20.1 80 28.5 116.4 32.7-32.3 21.4-70.9 33.8-112.5 33.8" style="fill:url(#f)"/></g><g style="filter:url(#g)" transform="matrix(1.25 0 0 -1.25 0 64)"><linearGradient id="h" x1="51.064" x2="51.064" y1="-762.878" y2="-886.934" gradientTransform="translate(140.6 959.4)scale(1.25)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#4aa3e0"/><stop offset="1" style="stop-color:#3096db"/></linearGradient><path d="M338.7 7.1c-41-.3-97.1-20.4-137.8-39.1C158-16.5 114.1 8.1 64.5 6.9c-3.3-.1-6.5-.2-9.8-.5L15.8 3.2 52.7-9.1c50.7-16.5 95.2-27 134.4-95.1h35.4c39.1 67.6 85.9 78.9 134.2 95.1l36.4 11.8-37.9 3.7c-5.5.5-11 .8-16.5.7" style="fill:url(#h)"/></g></svg>