node-red-contrib-knx-ultimate 4.2.3 → 4.2.6
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/CHANGELOG.md +25 -2
- package/nodes/hue-config.html +12 -9
- package/nodes/knxUltimate-config.html +24 -1
- package/nodes/knxUltimate-config.js +1 -0
- package/nodes/knxUltimate.js +79 -0
- package/nodes/knxUltimateAI.html +5 -5
- package/nodes/knxUltimateAI.js +5129 -1173
- package/nodes/knxUltimateHueAreaMotion.html +1 -1
- package/nodes/knxUltimateHueBattery.html +1 -1
- package/nodes/knxUltimateHueButton.html +1 -1
- package/nodes/knxUltimateHueCameraMotion.html +1 -1
- package/nodes/knxUltimateHueContactSensor.html +1 -1
- package/nodes/knxUltimateHueHumiditySensor.html +1 -1
- package/nodes/knxUltimateHueLight.html +2 -2
- package/nodes/knxUltimateHueLightSensor.html +1 -1
- package/nodes/knxUltimateHueMotion.html +1 -1
- package/nodes/knxUltimateHuePlug.html +1 -1
- package/nodes/knxUltimateHueScene.html +1 -1
- package/nodes/knxUltimateHueTapDial.html +1 -1
- package/nodes/knxUltimateHueTemperatureSensor.html +1 -1
- package/nodes/knxUltimateHueZigbeeConnectivity.html +1 -1
- package/nodes/knxUltimateHuedevice_software_update.html +1 -1
- package/nodes/knxUltimateMultiRouting.html +2 -2
- package/nodes/knxUltimateRouterFilter.html +2 -2
- package/nodes/knxUltimateViewer.html +16 -3
- package/nodes/knxUltimateViewer.js +279 -90
- package/nodes/locales/de/knxUltimate-config.html +1 -1
- package/nodes/locales/de/knxUltimate-config.json +10 -0
- package/nodes/locales/de/knxUltimateViewer.html +18 -0
- package/nodes/locales/en/knxUltimate-config.html +1 -1
- package/nodes/locales/en/knxUltimate-config.json +10 -0
- package/nodes/locales/en/knxUltimateViewer.html +20 -4
- package/nodes/locales/es/knxUltimate-config.html +1 -1
- package/nodes/locales/es/knxUltimate-config.json +10 -0
- package/nodes/locales/es/knxUltimateViewer.html +27 -11
- package/nodes/locales/fr/knxUltimate-config.html +1 -1
- package/nodes/locales/fr/knxUltimate-config.json +10 -0
- package/nodes/locales/fr/knxUltimateViewer.html +27 -11
- package/nodes/locales/it/knxUltimate-config.html +1 -1
- package/nodes/locales/it/knxUltimate-config.json +10 -0
- package/nodes/locales/it/knxUltimateViewer.html +18 -0
- package/nodes/locales/zh-CN/knxUltimate-config.html +1 -1
- package/nodes/locales/zh-CN/knxUltimate-config.json +10 -0
- package/nodes/locales/zh-CN/knxUltimateViewer.html +18 -0
- package/nodes/plugins/knxUltimate-flow-bubbles-plugin.html +279 -0
- package/nodes/plugins/knxUltimateAI-vue/assets/app.css +1 -1
- package/nodes/plugins/knxUltimateAI-vue/assets/app.js +3 -3
- package/nodes/plugins/knxUltimateAI-vue/assets/chunk-html2canvas.esm.js +5 -0
- package/nodes/plugins/knxUltimateAI-vue/assets/chunk-index.es.js +5 -0
- package/nodes/plugins/knxUltimateAI-vue/assets/chunk-jspdf.es.min.js +78 -0
- package/nodes/plugins/knxUltimateAI-vue/assets/chunk-purify.es.js +3 -0
- package/nodes/plugins/knxUltimateViewer-vue/assets/app.css +1 -0
- package/nodes/plugins/knxUltimateViewer-vue/assets/app.js +1 -0
- package/nodes/plugins/knxUltimateViewer-vue/index.html +13 -0
- package/package.json +14 -9
- package/nodes/plugins/themes/knxUltimateAI-theme-green.css +0 -44
- package/nodes/plugins/themes/knxUltimateAI-theme-lavender.css +0 -44
- package/nodes/plugins/themes/knxUltimateAI-theme-mix.css +0 -41
|
@@ -73,6 +73,8 @@
|
|
|
73
73
|
"suppress_ack": "Suprimir la solicitud ACK en modo de túnel",
|
|
74
74
|
"suppress_ack_help": "La opción anterior ayuda a la antigua compatibilidad de las interfaces KNX/IP. ADVERTENCIA: El nodo puede no notar la desconexión de la puerta de enlace. En este caso, use el regadeo en el modo de par torcido Ethernet+KNX.",
|
|
75
75
|
"ignoreTelegramsWithRepeatedFlag": "Suprimir los telegramas repetidos (r-flag) FOM Bus",
|
|
76
|
+
"enable_flow_bubbles": "Habilitar plugin flow bubbles",
|
|
77
|
+
"enable_flow_bubbles_help": "Muestra burbujas de estado en vivo junto a los nodos KNX Device en el editor. Útil durante la puesta en marcha y la depuración.",
|
|
76
78
|
"log_level": "Loglevel",
|
|
77
79
|
"status_throttle": "Temporizar las actualizaciones de estado del nodo",
|
|
78
80
|
"status_throttle_none": "Inmediato (sin temporización)",
|
|
@@ -102,6 +104,14 @@
|
|
|
102
104
|
"delaybetweentelegrams": "Retraso entre cada telegrama (en milisegundos)",
|
|
103
105
|
"delaybetweentelegramsfurtherdelayREAD": "y más retraso de multiplicar solo entre los telegramas de lectura"
|
|
104
106
|
},
|
|
107
|
+
"help": {
|
|
108
|
+
"intro": "Configure la conexión del gateway KNX, la importación ETS y el comportamiento avanzado del editor.",
|
|
109
|
+
"flow_bubbles_title": "Plugin flow bubbles",
|
|
110
|
+
"flow_bubbles_enable": "Active esta opción para dibujar una pequeña burbuja de color junto a cada nodo KNX Device en el editor.",
|
|
111
|
+
"flow_bubbles_scope": "Las burbujas reflejan el último estado en vivo recibido por el editor desde los nodos KNX Device vinculados a este gateway.",
|
|
112
|
+
"flow_bubbles_tooltip": "Pase el cursor sobre la burbuja para ver el nombre o topic del nodo, el último payload y el texto de estado actual.",
|
|
113
|
+
"flow_bubbles_stale": "Si no hay tráfico KNX reciente, la burbuja queda atenuada para distinguir datos obsoletos de actualizaciones recientes."
|
|
114
|
+
},
|
|
105
115
|
"ets": {
|
|
106
116
|
"description": "Puede importar una lista de direcciones de grupo CSV CSV o una lista de direcciones de grupo ESF. Prefiera la lista de direcciones del grupo CSV CSV, ya que los puntos de datos son más completos.",
|
|
107
117
|
"youtube": "& nbsp__ph_0 ____ ph_1 __ & nbsp__ph_2____ph_3__ ver cómo exportar el CSV en YouTube .__ PH_4__</a>",
|
|
@@ -7,19 +7,35 @@ Vea todas las direcciones de grupo y sus valores en un widget del tablero.<Br />
|
|
|
7
7
|
|
|
8
8
|
| Propiedad | Descripción |
|
|
9
9
|
|-|-|
|
|
10
|
-
|
|
|
11
|
-
|
|
|
10
|
+
| Gateway | La pasarela KNX. |
|
|
11
|
+
| Name | El nombre del nodo. |
|
|
12
12
|
|
|
13
|
-
#
|
|
13
|
+
# PÁGINA WEB
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
El nodo **KNX Viewer** ahora incluye una **página web basada en Vue**, que se puede abrir directamente desde el editor del nodo.
|
|
16
|
+
|
|
17
|
+
Se puede usar para:
|
|
18
|
+
- visualizar en vivo las **luces** detectadas a partir de valores KNX booleanos
|
|
19
|
+
- visualizar los **dimmers** detectados a partir de valores tipo `DPT 5.001`
|
|
20
|
+
- filtrar elementos, cambiar entre nodos Viewer y mantener el auto-refresh activo
|
|
21
|
+
- disponer de una interfaz visual coherente con **KNX AI**
|
|
22
|
+
|
|
23
|
+
La página web es servida directamente por Node-RED, por lo que sigue el mismo modelo de autenticación que el editor y los endpoints de administración.
|
|
24
|
+
|
|
25
|
+
# PINES DE SALIDA
|
|
26
|
+
|
|
27
|
+
1. Direcciones de grupo del Dashboard
|
|
28
|
+
: payload (html): conéctelo directamente al nodo Dashboard <b>Template</b>. Crea una tabla con todas las direcciones de grupo y sus valores.
|
|
29
|
+
2. Array simple para registro de datos
|
|
30
|
+
: payload (array): contiene todas las GA; puede formatearlo u ordenarlo como prefiera.
|
|
31
|
+
3. Cola de telegramas del Dashboard
|
|
32
|
+
: payload (html): conéctelo a <b>Template</b>. Muestra la cola de transmisión KNX para supervisar la congestión del BUS.
|
|
33
|
+
|
|
34
|
+
# NOTAS
|
|
35
|
+
|
|
36
|
+
- La **página web** no sustituye las salidas existentes; siguen disponibles para flujos dashboard/template clásicos.
|
|
37
|
+
- Las tarjetas de luces y dimmers se infieren a partir de los valores KNX que el Viewer está viendo en ese momento.
|
|
38
|
+
- Si todavía no se han visto telegramas, la página web permanecerá vacía hasta que el Viewer recopile tráfico real.
|
|
23
39
|
|
|
24
40
|
# MUESTRA
|
|
25
41
|
|
|
@@ -38,9 +38,9 @@ Configuration de la passerelle KNX
|
|
|
38
38
|
|
|
39
39
|
| Propriété | Description |
|
|
40
40
|
|-|-|
|
|
41
|
-
| Echo envoyé un message à tous les nœuds avec la même adresse de groupe | Envoyez l'entrée MSG provenant du flux, à tous les nœuds ayant la même adresse de groupe. Les nœuds recevront le nouveau MSG comme s'il provenait du bus KNX. Ceci est utile en cas d'utilisation de l'émulation KNX et au cas où la connexion au bus KNX n'est pas établie. **Cette option sera obsolète dans la version suivante et par défaut est vérifiée.** La valeur par défaut est vérifiée. |
|
|
42
41
|
| Supprimez les télégrammes répétés (R-FLAG) FOM BUS | Ignorez des télégrammes KNX répétés provenant du bus. La valeur par défaut n'est pas contrôlée. |
|
|
43
42
|
| Supprimez la demande ACK en mode tunnel | Activez-le si vous avez une très ancienne passerelle KNX / IP. Il ignore la procédure ACK et accepte tous les télégrammes. La valeur par défaut n'est pas contrôlée. |
|
|
43
|
+
| Activer le plugin flow bubbles | Affiche une petite bulle colorée à côté de chaque nœud KNX Device dans l'éditeur. La bulle reflète le dernier état en direct reçu depuis le gateway et s'atténue lorsque les données deviennent obsolètes. Utile pendant la mise en service et le débogage. Valeur par défaut : désactivé. |
|
|
44
44
|
| Retard entre chaque télégramme (en millisecondes) | KNX Specs indique que la vitesse d'envoi de télégramme maximum est de 50 télégrammes par seconde. Une vitesse comprise entre 25 et 50 ms devrait être bien, sauf si vous vous connectez à une passerelle KNX distante via une connexion Internet lente (dans ce cas, vous devez augmenter la valeur, par exemple, 200 à 500 ms ou plus). |
|
|
45
45
|
| Loglevel | Niveau de journal, au cas où vous auriez besoin de déboguer quelque chose avec le développement. La valeur par défaut est "erreur", |
|
|
46
46
|
| Temporisation de l'état du nœud | Définissez la fréquence de mise à jour des badges de statut. Avec un délai actif, les changements intermédiaires sont ignorés et seul le dernier est affiché après l'intervalle choisi. Sélectionnez **Immédiat** pour conserver le comportement en temps réel. |
|
|
@@ -73,6 +73,8 @@
|
|
|
73
73
|
"suppress_ack": "Supprimer la demande ACK en mode tunnelage",
|
|
74
74
|
"suppress_ack_help": "L'option ci-dessus aide la compatibilité des interfaces KNX / IP anciennes. AVERTISSEMENT: le nœud ne peut pas remarquer la déconnexion de la passerelle. Dans ce cas, utilisez le chien de garde en mode paire twisted Ethernet + KNX.",
|
|
75
75
|
"ignoreTelegramsWithRepeatedFlag": "Supprimez les télégrammes répétés (R-FLAG) FOM",
|
|
76
|
+
"enable_flow_bubbles": "Activer le plugin flow bubbles",
|
|
77
|
+
"enable_flow_bubbles_help": "Affiche des bulles d'état en direct à côté des nœuds KNX Device dans l'éditeur. Utile pendant la mise en service et le débogage.",
|
|
76
78
|
"log_level": "Logevel",
|
|
77
79
|
"status_throttle": "Temporisation des mises à jour d'état",
|
|
78
80
|
"status_throttle_none": "Immédiat (sans temporisation)",
|
|
@@ -102,6 +104,14 @@
|
|
|
102
104
|
"delaybetweentelegrams": "Retard entre chaque télégramme (en millisecondes)",
|
|
103
105
|
"delaybetweentelegramsfurtherdelayREAD": "et multiplier davantage uniquement entre les télégrammes de lecture"
|
|
104
106
|
},
|
|
107
|
+
"help": {
|
|
108
|
+
"intro": "Configurez la connexion au gateway KNX, l'import ETS et le comportement avancé de l'éditeur.",
|
|
109
|
+
"flow_bubbles_title": "Plugin flow bubbles",
|
|
110
|
+
"flow_bubbles_enable": "Activez cette option pour afficher une petite bulle colorée à côté de chaque nœud KNX Device dans l'éditeur.",
|
|
111
|
+
"flow_bubbles_scope": "Les bulles reflètent le dernier état en direct reçu par l'éditeur depuis les nœuds KNX Device liés à ce gateway.",
|
|
112
|
+
"flow_bubbles_tooltip": "Survolez la bulle pour voir le nom ou le topic du nœud, le dernier payload et le texte d'état courant.",
|
|
113
|
+
"flow_bubbles_stale": "S'il n'y a pas de trafic KNX récent, la bulle reste atténuée afin de distinguer les données obsolètes des mises à jour récentes."
|
|
114
|
+
},
|
|
105
115
|
"ets": {
|
|
106
116
|
"description": "Vous pouvez importer soit une liste d'adresses de groupe CSV ETS, soit une liste d'adresses de groupe ESF. Veuillez préférer la liste d'adresses du groupe CSV ETS, car les points de données sont plus complets.",
|
|
107
117
|
"youtube": "& nbsp__ph_0 ____ ph_1 __ & nbsp__ph_2____ph_3__see comment exporter le CSV sur YouTube .__ Ph_4____ph_5__",
|
|
@@ -7,19 +7,35 @@ Affichez toutes les adresses de groupe et leurs valeurs dans un widget de tablea
|
|
|
7
7
|
|
|
8
8
|
| Propriété | Description |
|
|
9
9
|
|-|-|
|
|
10
|
-
|
|
|
11
|
-
|
|
|
10
|
+
| Gateway | La passerelle KNX. |
|
|
11
|
+
| Name | Le nom du nœud. |
|
|
12
12
|
|
|
13
|
-
#
|
|
13
|
+
# PAGE WEB
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
Le nœud **KNX Viewer** inclut désormais une **page Web basée sur Vue**, ouvrable directement depuis l'éditeur du nœud.
|
|
16
|
+
|
|
17
|
+
Elle permet de :
|
|
18
|
+
- visualiser en direct les **lumières** détectées à partir de valeurs KNX booléennes
|
|
19
|
+
- visualiser les **variateurs** détectés à partir de valeurs de type `DPT 5.001`
|
|
20
|
+
- filtrer les éléments, changer de nœud Viewer et garder l'auto-refresh actif
|
|
21
|
+
- profiter d'une interface cohérente visuellement avec **KNX AI**
|
|
22
|
+
|
|
23
|
+
La page web est servie directement par Node-RED et suit donc le même modèle d'authentification que l'éditeur et les endpoints d'administration.
|
|
24
|
+
|
|
25
|
+
# SORTIES
|
|
26
|
+
|
|
27
|
+
1. Adresses de groupe (Dashboard)
|
|
28
|
+
: payload (html) : à connecter directement à un nœud Dashboard <b>Template</b> ; crée un tableau avec toutes les GA et leurs valeurs.
|
|
29
|
+
2. Tableau simple pour enregistrement
|
|
30
|
+
: payload (array) : contient toutes les GA ; vous pouvez le reformater ou le trier librement.
|
|
31
|
+
3. File des télégrammes (Dashboard)
|
|
32
|
+
: payload (html) : à connecter à <b>Template</b> ; affiche la file d'envoi KNX pour surveiller la congestion du BUS.
|
|
33
|
+
|
|
34
|
+
# NOTES
|
|
35
|
+
|
|
36
|
+
- La **page Web** ne remplace pas les sorties existantes ; elles restent disponibles pour les flows dashboard/template classiques.
|
|
37
|
+
- Les cartes lumières et variateurs sont déduites des valeurs KNX actuellement vues par le Viewer.
|
|
38
|
+
- Si aucun télégramme n'a encore été reçu, la page Web restera vide jusqu'à ce que le Viewer collecte du trafic réel.
|
|
23
39
|
|
|
24
40
|
# ÉCHANTILLON
|
|
25
41
|
|
|
@@ -38,9 +38,9 @@ Questo nodo si connette al tuo KNX/IP Gateway.
|
|
|
38
38
|
|
|
39
39
|
|Proprietà|Descrizione|
|
|
40
40
|
|--|--|
|
|
41
|
-
| Echo sent message to all node with same Group Address | Inoltra ai nodi con lo stesso GA i msg inviati dal flow, come se provenissero dal BUS. Utile in emulazione KNX o senza connessione al BUS. **Opzione in deprecazione e presto abilitata di default.** Default: abilitato. |
|
|
42
41
|
| Suppress repeated (R-Flag) telegrams fom BUS | Ignora i telegrammi ripetuti (flag R) dal BUS. Default: disabilitato. |
|
|
43
42
|
| Suppress ACK request in tunneling mode | Per vecchie interfacce KNX/IP: ignora l'ACK e accetta tutti i telegrammi. Default: disabilitato. |
|
|
43
|
+
| Abilita plugin flow bubbles | Disegna una piccola bubble colorata accanto a ogni nodo KNX Device nell'editor. La bubble riflette l'ultimo stato live ricevuto dal gateway e si attenua quando il dato diventa stantio. Utile durante commissioning e debug. Default: disabilitato. |
|
|
44
44
|
| Delay between each telegram (ms) | Lo standard KNX prevede max 50 telegrammi/s. Un intervallo 25-50ms è adeguato. Con gateway remoto su link lento aumenta (es. 200-500ms). |
|
|
45
45
|
| Loglevel | Livello di log per il debug. Default: "Error". |
|
|
46
46
|
| Limitazione aggiornamento stato nodi | Imposta ogni quanto aggiornare il badge di stato dei nodi. Con un ritardo attivo gli stati intermedi vengono ignorati e viene mostrato solo l'ultimo dopo l'intervallo scelto. Seleziona **Immediato** per mantenere l'aggiornamento in tempo reale. |
|
|
@@ -73,6 +73,8 @@
|
|
|
73
73
|
"suppress_ack": "Sopprimi richieste ACK in modalità tunnel",
|
|
74
74
|
"suppress_ack_help": "L'opzione ACK sopra aiuta la compatibilità con vecchie interfacce. Attenzione: il nodo potrebbe non accorgersi della disconnessione al gateway. In questo caso, usare il watchdog in modalità Ethernet+KNX twisted pair.",
|
|
75
75
|
"ignoreTelegramsWithRepeatedFlag": "Sopprimi telegrammi dal BUS ripetuti (Flag R)",
|
|
76
|
+
"enable_flow_bubbles": "Abilita plugin flow bubbles",
|
|
77
|
+
"enable_flow_bubbles_help": "Mostra bubble di stato live accanto ai nodi KNX Device nell'editor. Utile durante commissioning e debug.",
|
|
76
78
|
"log_level": "Livello log",
|
|
77
79
|
"status_throttle": "Limitazione aggiornamento stato nodi",
|
|
78
80
|
"status_throttle_none": "Immediato (senza limitazione)",
|
|
@@ -106,6 +108,14 @@
|
|
|
106
108
|
"exposeAsVariableREADONLY" : "Sola lettura",
|
|
107
109
|
"exposeAsVariableREADWRITE" : "Lettura/Scrittura"
|
|
108
110
|
},
|
|
111
|
+
"help": {
|
|
112
|
+
"intro": "Configura la connessione al gateway KNX, l'import ETS e il comportamento avanzato dell'editor.",
|
|
113
|
+
"flow_bubbles_title": "Plugin flow bubbles",
|
|
114
|
+
"flow_bubbles_enable": "Abilita questa opzione per disegnare una piccola bubble colorata accanto a ogni nodo KNX Device nell'editor.",
|
|
115
|
+
"flow_bubbles_scope": "Le bubble riflettono l'ultimo stato live ricevuto dall'editor dai nodi KNX Device collegati a questo gateway.",
|
|
116
|
+
"flow_bubbles_tooltip": "Passa con il mouse sulla bubble per vedere nome o topic del nodo, ultimo payload e testo di stato corrente.",
|
|
117
|
+
"flow_bubbles_stale": "Se non arriva traffico KNX recente, la bubble resta attenuata, così puoi distinguere dati stantii da aggiornamenti freschi."
|
|
118
|
+
},
|
|
109
119
|
"ets": {
|
|
110
120
|
"description": "Puoi importare sia il file ETS in CSV, che ESF. Usa il CSV se possibile, perchè i datapoints sono più precisi.",
|
|
111
121
|
"youtube" : " <i class=\"fa fa-youtube-play\"></i> <a target=\"_blank\" href=\"https://youtu.be/egRbR_KwP9I\"><u>Guarda come si esporta un file CSV su YouTube.</u></a>",
|
|
@@ -10,6 +10,18 @@ Mostra tutti gli indirizzi di gruppo e i relativi valori in un widget della Dash
|
|
|
10
10
|
| Gateway | Il gateway KNX. |
|
|
11
11
|
| Name | Nome del nodo. |
|
|
12
12
|
|
|
13
|
+
# PAGINA WEB
|
|
14
|
+
|
|
15
|
+
Il nodo **KNX Viewer** include ora una **Pagina Web basata su Vue**, apribile direttamente dall'editor del nodo.
|
|
16
|
+
|
|
17
|
+
Puoi usarla per:
|
|
18
|
+
- visualizzare le **luci** rilevate dai valori KNX booleani
|
|
19
|
+
- visualizzare i **dimmer** rilevati dai valori in stile `DPT 5.001`
|
|
20
|
+
- filtrare gli oggetti, cambiare nodo Viewer e mantenere la pagina in auto-refresh
|
|
21
|
+
- avere una UI coerente visivamente con **KNX AI**
|
|
22
|
+
|
|
23
|
+
La pagina web è servita direttamente da Node-RED, quindi segue lo stesso modello di autenticazione dell'editor e degli endpoint admin.
|
|
24
|
+
|
|
13
25
|
# PIN DI USCITA
|
|
14
26
|
|
|
15
27
|
1. Indirizzi di gruppo (Dashboard)
|
|
@@ -19,6 +31,12 @@ Mostra tutti gli indirizzi di gruppo e i relativi valori in un widget della Dash
|
|
|
19
31
|
3. Coda telegrammi (Dashboard)
|
|
20
32
|
: payload (html): collega a <b>Template</b>. Mostra la coda di trasmissione KNX per monitorare congestione BUS.
|
|
21
33
|
|
|
34
|
+
# NOTE
|
|
35
|
+
|
|
36
|
+
- La **Pagina Web** non sostituisce le uscite esistenti: restano disponibili per dashboard e template classici.
|
|
37
|
+
- Le card luce e dimmer vengono dedotte dai valori KNX che il Viewer sta vedendo in quel momento.
|
|
38
|
+
- Se non sono ancora passati telegrammi, la pagina web resterà vuota finché il Viewer non raccoglie traffico reale.
|
|
39
|
+
|
|
22
40
|
# ESEMPIO
|
|
23
41
|
|
|
24
42
|
<img src="https://raw.githubusercontent.com/Supergiovane/node-red-contrib-knx-ultimate/master/img/wiki/viewer2.png" width="90%"><br/>
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
|
|
39
39
|
|属性|说明|
|
|
40
40
|
|--|--|
|
|
41
|
-
| Echo sent message to all node with same Group Address | 将来自流程的输入消息,转发给所有相同 GA 的节点,仿佛来自总线。在 KNX 模拟或未连总线时有用。 **该选项将来会废弃并默认启用。** |
|
|
42
41
|
| Suppress repeated (R-Flag) telegrams fom BUS | 忽略来自总线的重复报文(R 标志)。|
|
|
43
42
|
| Suppress ACK request in tunneling mode | 适用于非常老的 KNX/IP 网关:忽略 ACK 流程并接受所有报文。|
|
|
43
|
+
| 启用 flow bubbles 插件 | 在编辑器中为每个 KNX Device 节点显示一个小的彩色气泡。该气泡反映从 gateway 收到的最新实时状态,当数据过旧时会自动变淡。适合在调试和现场调试时快速观察状态。默认未启用。 |
|
|
44
44
|
| Delay between each telegram (ms) | KNX 规范最多 50 报文/秒。一般 25-50ms 合适;若经慢速网络远程连接,建议提高到 200-500ms。|
|
|
45
45
|
| Loglevel | 日志级别(调试用)。默认 "Error"。|
|
|
46
46
|
| 节点状态节流 | 设置状态徽章的刷新频率。启用延时后,中间状态会被丢弃,只在所选间隔后显示最后一次状态。选择 **立即** 可以保持实时显示。|
|
|
@@ -72,6 +72,8 @@
|
|
|
72
72
|
"suppress_ack": "抑制 ACK 请求 in tunneling mode",
|
|
73
73
|
"suppress_ack_help": "上面的选项有助于旧的 KNX/IP 接口兼容性 Warning: the node may not notice the disconnection from the gateway. In this case, use the watchdog in Ethernet+KNX twisted pair mode.",
|
|
74
74
|
"ignoreTelegramsWithRepeatedFlag": "抑制重复的 (R-Flag) 来自总线的电报",
|
|
75
|
+
"enable_flow_bubbles": "启用 flow bubbles 插件",
|
|
76
|
+
"enable_flow_bubbles_help": "在编辑器中为 KNX Device 节点显示实时状态气泡。适合调试和调试期间快速观察状态。",
|
|
75
77
|
"log_level": "日志等级",
|
|
76
78
|
"status_datetime_format": "状态日期/时间格式",
|
|
77
79
|
"status_datetime_format_legacy": "兼容模式(系统区域设置)",
|
|
@@ -94,6 +96,14 @@
|
|
|
94
96
|
"delaybetweentelegrams": "数据发送间隔时间 (毫秒)",
|
|
95
97
|
"delaybetweentelegramsfurtherdelayREAD" : "并且仅在读取电报之间进一步增加延迟"
|
|
96
98
|
},
|
|
99
|
+
"help": {
|
|
100
|
+
"intro": "配置 KNX gateway 连接、ETS 导入以及编辑器中的高级行为。",
|
|
101
|
+
"flow_bubbles_title": "Flow bubbles 插件",
|
|
102
|
+
"flow_bubbles_enable": "启用此选项后,编辑器会在每个 KNX Device 节点旁边显示一个小的彩色气泡。",
|
|
103
|
+
"flow_bubbles_scope": "这些气泡反映了编辑器从绑定到此 gateway 的 KNX Device 节点接收到的最新实时状态。",
|
|
104
|
+
"flow_bubbles_tooltip": "将鼠标悬停在气泡上,可以查看节点名称或 topic、最后一个 payload 以及当前状态文本。",
|
|
105
|
+
"flow_bubbles_stale": "如果最近没有 KNX 流量,气泡会保持变淡,以便区分过期数据和最新更新。"
|
|
106
|
+
},
|
|
97
107
|
"ets": {
|
|
98
108
|
"description": "您可以导入 ETS CSV 组地址列表或 ESF 组地址列表。 请优先选择 ETS CSV 组地址列表,因为数据类型更完整.",
|
|
99
109
|
"youtube" : " <i class=\"fa fa-youtube-play\"></i> <a target=\"_blank\" href=\"https://youtu.be/egRbR_KwP9I\"><u>在Youtube上看怎么导入CSV文件.</u></a>",
|
|
@@ -10,6 +10,18 @@
|
|
|
10
10
|
| Gateway | KNX 网关 |
|
|
11
11
|
| Name | 节点名称 |
|
|
12
12
|
|
|
13
|
+
# WEB 页面
|
|
14
|
+
|
|
15
|
+
**KNX Viewer** 现在包含一个基于 **Vue** 的独立 **Web 页面**,可直接从节点编辑器中打开。
|
|
16
|
+
|
|
17
|
+
它可用于:
|
|
18
|
+
- 显示由布尔型 KNX 数值识别出的**灯光**
|
|
19
|
+
- 显示由 `DPT 5.001` 类型数值识别出的**调光器**
|
|
20
|
+
- 过滤项目、切换不同 Viewer 节点,并保持自动刷新
|
|
21
|
+
- 使用与 **KNX AI** 风格一致的界面
|
|
22
|
+
|
|
23
|
+
该 Web 页面由 Node-RED 直接提供,因此沿用与编辑器和管理端点相同的认证模型。
|
|
24
|
+
|
|
13
25
|
# 输出引脚
|
|
14
26
|
|
|
15
27
|
1. 组地址(Dashboard)
|
|
@@ -19,6 +31,12 @@
|
|
|
19
31
|
3. 报文队列(Dashboard)
|
|
20
32
|
: payload (html):连接到 <b>Template</b>;显示 KNX 发送队列以监控总线拥塞。
|
|
21
33
|
|
|
34
|
+
# 说明
|
|
35
|
+
|
|
36
|
+
- **Web 页面**不会替代现有输出;原有 dashboard/template 输出方式仍然可用。
|
|
37
|
+
- 灯光卡片和调光器卡片是根据 Viewer 当前看到的 KNX 实时数值推断得到的。
|
|
38
|
+
- 如果还没有接收到任何报文,Web 页面会保持空白,直到 Viewer 收集到实时流量。
|
|
39
|
+
|
|
22
40
|
# 示例
|
|
23
41
|
|
|
24
42
|
<img src="https://raw.githubusercontent.com/Supergiovane/node-red-contrib-knx-ultimate/master/img/wiki/viewer2.png" width="90%"><br/>
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
<script type="text/javascript">
|
|
2
|
+
(function () {
|
|
3
|
+
RED.plugins.registerPlugin("knxUltimate-flow-bubbles-plugin", {
|
|
4
|
+
onadd: function () {
|
|
5
|
+
const endpoint = "knxUltimate/editorLiveState";
|
|
6
|
+
const stateById = new Map();
|
|
7
|
+
let timer = null;
|
|
8
|
+
let refreshTimer = null;
|
|
9
|
+
|
|
10
|
+
if (!document.getElementById("knx-flow-bubbles-style")) {
|
|
11
|
+
$("<style>", {
|
|
12
|
+
id: "knx-flow-bubbles-style",
|
|
13
|
+
text: `
|
|
14
|
+
.knx-ultimate-flow-bubble { pointer-events: none; }
|
|
15
|
+
.knx-ultimate-flow-bubble .knx-bubble-tail,
|
|
16
|
+
.knx-ultimate-flow-bubble .knx-bubble-shell {
|
|
17
|
+
stroke: rgba(255,255,255,0.96);
|
|
18
|
+
stroke-width: 2.2px;
|
|
19
|
+
filter: drop-shadow(0 1px 2px rgba(24, 28, 42, 0.22));
|
|
20
|
+
}
|
|
21
|
+
.knx-ultimate-flow-bubble .knx-bulb-outline {
|
|
22
|
+
fill: none;
|
|
23
|
+
stroke: rgba(43, 45, 50, 0.92);
|
|
24
|
+
stroke-width: 1.7px;
|
|
25
|
+
stroke-linecap: round;
|
|
26
|
+
stroke-linejoin: round;
|
|
27
|
+
}
|
|
28
|
+
.knx-ultimate-flow-bubble .knx-bulb-accent {
|
|
29
|
+
fill: none;
|
|
30
|
+
stroke: rgba(92, 98, 108, 0.7);
|
|
31
|
+
stroke-width: 1.7px;
|
|
32
|
+
stroke-linecap: round;
|
|
33
|
+
stroke-linejoin: round;
|
|
34
|
+
opacity: 0.7;
|
|
35
|
+
}
|
|
36
|
+
.knx-ultimate-flow-bubble.is-on .knx-bubble-shell {
|
|
37
|
+
filter: drop-shadow(0 0 6px rgba(255, 216, 77, 0.72));
|
|
38
|
+
}
|
|
39
|
+
.knx-ultimate-flow-bubble.is-on .knx-bulb-outline {
|
|
40
|
+
stroke: rgba(120, 76, 0, 0.98);
|
|
41
|
+
}
|
|
42
|
+
.knx-ultimate-flow-bubble.is-on .knx-bulb-accent {
|
|
43
|
+
stroke: rgba(181, 119, 6, 0.98);
|
|
44
|
+
opacity: 0.9;
|
|
45
|
+
}
|
|
46
|
+
.knx-ultimate-flow-bubble.is-stale { opacity: 0.56; }
|
|
47
|
+
`
|
|
48
|
+
}).appendTo("head");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const getWorkspaceChart = function () {
|
|
52
|
+
return document.querySelector("#red-ui-workspace-chart")
|
|
53
|
+
|| document.querySelector("#workspace-chart")
|
|
54
|
+
|| document.querySelector("svg.red-ui-workspace-chart")
|
|
55
|
+
|| null;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const resolveNodeId = function (group) {
|
|
59
|
+
if (!group) return "";
|
|
60
|
+
const candidates = [
|
|
61
|
+
group.getAttribute("data-node-id"),
|
|
62
|
+
group.getAttribute("data-id"),
|
|
63
|
+
group.id,
|
|
64
|
+
group.__data__ && group.__data__.id,
|
|
65
|
+
group.__data__ && group.__data__.d && group.__data__.d.id,
|
|
66
|
+
group.__data__ && group.__data__.node && group.__data__.node.id
|
|
67
|
+
];
|
|
68
|
+
for (const candidate of candidates) {
|
|
69
|
+
if (typeof candidate === "string" && candidate) {
|
|
70
|
+
const node = RED.nodes.node(candidate);
|
|
71
|
+
if (node && node.type === "knxUltimate") return candidate;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return "";
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const resolveEditorNode = function (group) {
|
|
78
|
+
const nodeId = resolveNodeId(group);
|
|
79
|
+
if (!nodeId) return null;
|
|
80
|
+
try {
|
|
81
|
+
const node = RED.nodes.node(nodeId);
|
|
82
|
+
return node && node.type === "knxUltimate" ? node : null;
|
|
83
|
+
} catch (error) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const getNodeGroups = function () {
|
|
89
|
+
const chart = getWorkspaceChart();
|
|
90
|
+
if (!chart) return [];
|
|
91
|
+
const groups = chart.querySelectorAll("g[data-node-id], g[data-id], g[id], g.nodegroup, g.red-ui-flow-node");
|
|
92
|
+
return Array.from(groups).filter(function (group) {
|
|
93
|
+
if (!(group instanceof SVGGElement)) return false;
|
|
94
|
+
if (!group.querySelector("rect")) return false;
|
|
95
|
+
return !!resolveNodeId(group);
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const removeAllBubbles = function () {
|
|
100
|
+
document.querySelectorAll("g.knx-ultimate-flow-bubble").forEach(function (bubble) {
|
|
101
|
+
bubble.remove();
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const removeBubbleFromGroup = function (group) {
|
|
106
|
+
if (!group) return;
|
|
107
|
+
group.querySelectorAll("g.knx-ultimate-flow-bubble").forEach(function (bubble) {
|
|
108
|
+
bubble.remove();
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
const scheduleRefresh = function (delay) {
|
|
113
|
+
if (refreshTimer) {
|
|
114
|
+
window.clearTimeout(refreshTimer);
|
|
115
|
+
refreshTimer = null;
|
|
116
|
+
}
|
|
117
|
+
refreshTimer = window.setTimeout(function () {
|
|
118
|
+
refreshTimer = null;
|
|
119
|
+
tick();
|
|
120
|
+
}, typeof delay === "number" ? delay : 0);
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const isNodeFeatureEnabled = function (node) {
|
|
124
|
+
if (!node || node.type !== "knxUltimate" || !node.server) return false;
|
|
125
|
+
try {
|
|
126
|
+
const cfg = RED.nodes.node(node.server);
|
|
127
|
+
return !!(cfg && (cfg.enableFlowBubbles === true || cfg.enableFlowBubbles === "true"));
|
|
128
|
+
} catch (error) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const hasAnyVisibleBubbleNode = function () {
|
|
134
|
+
const groups = getNodeGroups();
|
|
135
|
+
return groups.some(function (group) {
|
|
136
|
+
const node = resolveEditorNode(group);
|
|
137
|
+
return isNodeFeatureEnabled(node);
|
|
138
|
+
});
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
const ensureBubble = function (group, entry) {
|
|
142
|
+
const rect = group.querySelector("rect");
|
|
143
|
+
if (!rect) return;
|
|
144
|
+
const x = Number(rect.getAttribute("x") || 0);
|
|
145
|
+
const y = Number(rect.getAttribute("y") || 0);
|
|
146
|
+
const width = Number(rect.getAttribute("width") || 120);
|
|
147
|
+
const bubbleX = x + width + 24;
|
|
148
|
+
const bubbleY = y - 18;
|
|
149
|
+
|
|
150
|
+
let bubble = group.querySelector("g.knx-ultimate-flow-bubble");
|
|
151
|
+
if (!bubble) {
|
|
152
|
+
bubble = document.createElementNS("http://www.w3.org/2000/svg", "g");
|
|
153
|
+
bubble.setAttribute("class", "knx-ultimate-flow-bubble");
|
|
154
|
+
|
|
155
|
+
const tail = document.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
156
|
+
tail.setAttribute("class", "knx-bubble-tail");
|
|
157
|
+
tail.setAttribute("d", "M-4,10 L-24,26 L4,18 Z");
|
|
158
|
+
bubble.appendChild(tail);
|
|
159
|
+
|
|
160
|
+
const shell = document.createElementNS("http://www.w3.org/2000/svg", "rect");
|
|
161
|
+
shell.setAttribute("class", "knx-bubble-shell");
|
|
162
|
+
shell.setAttribute("x", "-20");
|
|
163
|
+
shell.setAttribute("y", "-20");
|
|
164
|
+
shell.setAttribute("width", "40");
|
|
165
|
+
shell.setAttribute("height", "40");
|
|
166
|
+
shell.setAttribute("rx", "20");
|
|
167
|
+
shell.setAttribute("ry", "20");
|
|
168
|
+
bubble.appendChild(shell);
|
|
169
|
+
|
|
170
|
+
const bulbIcon = document.createElementNS("http://www.w3.org/2000/svg", "g");
|
|
171
|
+
bulbIcon.setAttribute("transform", "translate(-10,-11) scale(0.78)");
|
|
172
|
+
|
|
173
|
+
const accent = document.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
174
|
+
accent.setAttribute("class", "knx-bulb-accent");
|
|
175
|
+
accent.setAttribute("d", "M12.0001 7.89014L10.9301 9.75014C10.6901 10.1601 10.8901 10.5001 11.3601 10.5001H12.6301C13.1101 10.5001 13.3001 10.8401 13.0601 11.2501L12.0001 13.1101");
|
|
176
|
+
bulbIcon.appendChild(accent);
|
|
177
|
+
|
|
178
|
+
const outline = document.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
179
|
+
outline.setAttribute("class", "knx-bulb-outline");
|
|
180
|
+
outline.setAttribute("d", "M8.30035 18.0402V16.8802C6.00035 15.4902 4.11035 12.7802 4.11035 9.90018C4.11035 4.95018 8.66035 1.07018 13.8004 2.19018C16.0604 2.69018 18.0404 4.19018 19.0704 6.26018C21.1604 10.4602 18.9604 14.9202 15.7304 16.8702V18.0302C15.7304 18.3202 15.8404 18.9902 14.7704 18.9902H9.26035C8.16035 19.0002 8.30035 18.5702 8.30035 18.0402Z");
|
|
181
|
+
bulbIcon.appendChild(outline);
|
|
182
|
+
|
|
183
|
+
const base = document.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
184
|
+
base.setAttribute("class", "knx-bulb-outline");
|
|
185
|
+
base.setAttribute("d", "M8.5 22.0002C10.79 21.3502 13.21 21.3502 15.5 22.0002");
|
|
186
|
+
bulbIcon.appendChild(base);
|
|
187
|
+
|
|
188
|
+
bubble.appendChild(bulbIcon);
|
|
189
|
+
|
|
190
|
+
const title = document.createElementNS("http://www.w3.org/2000/svg", "title");
|
|
191
|
+
bubble.appendChild(title);
|
|
192
|
+
group.appendChild(bubble);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const color = entry && entry.bubbleColor ? entry.bubbleColor : "#d4d8e2";
|
|
196
|
+
const isOn = !!(entry && (entry.payload === true || entry.payload > 0 || color === "#ffd84d"));
|
|
197
|
+
const isStale = !entry || !entry.updatedAt || (Date.now() - entry.updatedAt > 7000);
|
|
198
|
+
const title = entry
|
|
199
|
+
? `${entry.name || entry.topic || entry.id}${entry.payloadText ? " | " + entry.payloadText : ""}${entry.text ? " | " + entry.text : ""}`
|
|
200
|
+
: "Waiting for KNX traffic";
|
|
201
|
+
|
|
202
|
+
bubble.setAttribute("transform", `translate(${bubbleX},${bubbleY})`);
|
|
203
|
+
bubble.classList.toggle("is-on", isOn);
|
|
204
|
+
bubble.classList.toggle("is-stale", isStale);
|
|
205
|
+
bubble.querySelector(".knx-bubble-tail").setAttribute("fill", color);
|
|
206
|
+
bubble.querySelector(".knx-bubble-shell").setAttribute("fill", color);
|
|
207
|
+
bubble.querySelector("title").textContent = title;
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
const render = function () {
|
|
211
|
+
const groups = getNodeGroups();
|
|
212
|
+
if (!groups.length) return;
|
|
213
|
+
if (!hasAnyVisibleBubbleNode()) {
|
|
214
|
+
removeAllBubbles();
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
groups.forEach(function (group) {
|
|
218
|
+
const node = resolveEditorNode(group);
|
|
219
|
+
if (!node) return;
|
|
220
|
+
if (!isNodeFeatureEnabled(node)) {
|
|
221
|
+
removeBubbleFromGroup(group);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const id = node.id;
|
|
225
|
+
ensureBubble(group, stateById.get(id));
|
|
226
|
+
});
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
const tick = function () {
|
|
230
|
+
if (!hasAnyVisibleBubbleNode()) {
|
|
231
|
+
stateById.clear();
|
|
232
|
+
removeAllBubbles();
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
if (document.visibilityState === "hidden") return;
|
|
236
|
+
$.getJSON(endpoint, function (data) {
|
|
237
|
+
stateById.clear();
|
|
238
|
+
const nodes = Array.isArray(data && data.nodes) ? data.nodes : [];
|
|
239
|
+
nodes.forEach(function (entry) {
|
|
240
|
+
if (entry && entry.id) stateById.set(entry.id, entry);
|
|
241
|
+
});
|
|
242
|
+
window.requestAnimationFrame(render);
|
|
243
|
+
}).fail(function () {
|
|
244
|
+
window.requestAnimationFrame(render);
|
|
245
|
+
});
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
$(document).on("change.knxUltimateFlowBubbles", "#node-config-input-enableFlowBubbles", function () {
|
|
249
|
+
if ($(this).is(":checked")) {
|
|
250
|
+
scheduleRefresh(0);
|
|
251
|
+
} else {
|
|
252
|
+
stateById.clear();
|
|
253
|
+
removeAllBubbles();
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
if (RED && RED.events && typeof RED.events.on === "function") {
|
|
258
|
+
RED.events.on("flows:started", function () {
|
|
259
|
+
scheduleRefresh(150);
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
timer = window.setInterval(tick, 2000);
|
|
264
|
+
window.setTimeout(tick, 900);
|
|
265
|
+
window.addEventListener("beforeunload", function () {
|
|
266
|
+
if (timer) {
|
|
267
|
+
window.clearInterval(timer);
|
|
268
|
+
timer = null;
|
|
269
|
+
}
|
|
270
|
+
if (refreshTimer) {
|
|
271
|
+
window.clearTimeout(refreshTimer);
|
|
272
|
+
refreshTimer = null;
|
|
273
|
+
}
|
|
274
|
+
$(document).off(".knxUltimateFlowBubbles");
|
|
275
|
+
}, { once: true });
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
}());
|
|
279
|
+
</script>
|