node-red-dashboard-2-hmi 0.1.10 → 0.1.11

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/docs/mensagens.md CHANGED
@@ -1,266 +1,266 @@
1
- # Que mensagem cada símbolo recebe
2
-
3
- Este guia explica como o **hmi canvas** recebe os dados e o que cada símbolo espera
4
- encontrar na chave dele. O resto (desenhar, regras, comandos, alarmes) está no
5
- [README](../README.md).
6
-
7
- ## 1. Como os dados chegam no canvas
8
-
9
- O canvas tem **uma entrada**. Tudo o que você manda nela vira uma lista de
10
- **chaves**, e cada símbolo mostra uma chave (o campo **Chave** do símbolo, no
11
- painel da direita do editor).
12
-
13
- ### Jeito 1: um objeto em `msg.payload`
14
-
15
- Cada propriedade do objeto é uma chave:
16
-
17
- ```js
18
- msg.payload = {
19
- "rpm": 1450,
20
- "velocidade": 42.5,
21
- "motorLigado": true,
22
- "estado": "GIRANDO"
23
- }
24
- ```
25
-
26
- O símbolo com chave `rpm` mostra 1450, o de chave `motorLigado` fica ligado, e
27
- assim por diante.
28
-
29
- ### Jeito 2: um valor solto com `msg.topic`
30
-
31
- ```js
32
- msg.topic = "temperatura"
33
- msg.payload = 21.5
34
- ```
35
-
36
- É o mesmo que mandar `{ "temperatura": 21.5 }`.
37
-
38
- ### Pode mandar várias mensagens, cada uma com uma parte
39
-
40
- **Não precisa mandar tudo de uma vez.** O canvas guarda o último valor de cada
41
- chave e junta o que chega:
42
-
43
- ```js
44
- // mensagem 1, do CLP a cada 1 s
45
- msg.payload = { "rpm": 1450, "motorLigado": true }
46
- // mensagem 2, do banco a cada 30 s
47
- msg.payload = { "bobinasHoje": 7, "linha_tempo": [ ... ] }
48
- ```
49
-
50
- Depois das duas, o canvas tem as quatro chaves. Uma mensagem só com `rpm` não
51
- apaga `bobinasHoje`. Por isso dá para ligar vários fluxos no mesmo canvas: a
52
- leitura do CLP, a consulta do banco, um inject de teste.
53
-
54
- - Uma chave só muda quando chega de novo.
55
- - Para limpar uma chave (o símbolo mostra "—"), mande ela com `null`.
56
- - Uma lista ou objeto (tabela, linha do tempo) é trocado inteiro: a nova lista
57
- substitui a anterior, ela não é somada.
58
- - Quem abre a página depois recebe todas as chaves de uma vez, então a tela já
59
- aparece completa.
60
-
61
- ### Nome da chave
62
-
63
- A chave é o **nome inteiro da propriedade**, com qualquer caractere. Se a
64
- propriedade se chama `"BT_04.estado"`, a chave é `BT_04.estado`. O canvas **não**
65
- entra em objetos aninhados: com `msg.payload = { BT_04: { estado: "GIRANDO" } }`
66
- não existe a chave `BT_04.estado`. Monte as chaves "achatadas" numa function:
67
-
68
- ```js
69
- const out = {};
70
- for (const m of maquinas) {
71
- out[m.id + '.estado'] = m.estado; // "BT_04.estado"
72
- out[m.id + '.girando'] = m.girando; // "BT_04.girando"
73
- }
74
- msg.payload = out;
75
- return msg;
76
- ```
77
-
78
- ### Outras propriedades da mensagem
79
-
80
- | Propriedade | Para que serve |
81
- |---|---|
82
- | `msg.quality` | `{ "temp": "bad" }` (ou `"uncertain"`, ou `"good"` para limpar): os símbolos dessa chave ficam apagados com × ou ?. |
83
- | `msg.enabled` | `false` desliga todos os comandos do canvas (só visualização). |
84
- | `msg.ui_update` | Muda opções do canvas em funcionamento, por exemplo `{ "screen": "Alarmes" }` abre essa tela. |
85
- | `msg._hmiAck` | Reconhece alarmes pelo fluxo: o id do alarme, `"symbol:<id>"` ou `"all"`. |
86
-
87
- ## 2. Tipos de valor
88
-
89
- ### Liga / desliga
90
-
91
- Os símbolos que acendem, giram ou mudam de cor (motor, LED, bobinadeira,
92
- esteira, válvula...) decidem se estão ligados assim:
93
-
94
- | Valor recebido | Fica |
95
- |---|---|
96
- | `true` / `false` | ligado / desligado |
97
- | número diferente de 0 (`1`, `-3`, `0.5`) | ligado |
98
- | `0` ou `"0"` | desligado |
99
- | texto que não é número (`"ON"`, `"GIRANDO"`) | ligado (texto vazio = desligado) |
100
- | `null`, sem valor, `""` | sem dado (desenho de "desconhecido", nem ligado nem desligado) |
101
-
102
- Opções de cada símbolo que mudam isso:
103
- - **Ligado quando: maior que o limite**: ligado só quando o valor é maior que o
104
- **Limite** (ex. velocidade > 5).
105
- - **Inverter sinal**: troca ligado e desligado (sensor NF, entrada ativa em 0).
106
-
107
- Atenção: o texto `"false"` conta como ligado, porque não é número. Mande o
108
- booleano `false` ou o número `0`.
109
-
110
- ### Número
111
-
112
- Número ou texto com número (`42.5` ou `"42.5"`). A **escala** do símbolo pode
113
- converter o valor do CLP (`× 0.1`, `÷ 10`, `+ offset`) antes de mostrar.
114
- `true`/`false` aparecem como ON/OFF.
115
-
116
- ### Data e hora (tabela e linha do tempo)
117
-
118
- Texto `"2026-10-23 05:10:00"` (horário local), número em milissegundos ou em
119
- segundos, ou um `Date`.
120
-
121
- ## 3. Símbolo por símbolo
122
-
123
- Na coluna **A chave recebe** está o valor da chave principal (o campo
124
- **Chave**). Os campos terminados em "Chave ..." são chaves extras, que você
125
- escreve no símbolo e manda no mesmo payload.
126
-
127
- ### Valores
128
-
129
- | Símbolo | A chave recebe | Chaves extras | Exemplo |
130
- |---|---|---|---|
131
- | Tag | número (ou texto) | — | `{ "rpm": 1450 }` |
132
- | KPI | número (ou texto). O **Subtítulo** pode ter `{outraChave}` | as do subtítulo | `{ "bobinas": 7, "t1": 5 }` com subtítulo `turno 1: {t1}` |
133
- | Texto | opcional: um valor mostrado depois do texto. O texto pode ter `{chave}`; `{chave:1}` mostra 1 casa decimal e `{chave:t}` mostra como veio (sem separador de milhar) | as do texto | texto `operador {op:t}` com `{ "op": 2888 }` |
134
- | Medidor, Barra | número entre **Mínimo** e **Máximo** | — | `{ "pressao": 6.2 }` |
135
- | Barra ISA-101 | número | **Chave do setpoint** (número) | `{ "temp": 72, "tempSP": 75 }` |
136
- | Tendência | número; o nó guarda os últimos segundos da **Janela** e desenha a curva | — | `{ "vel": 42.5 }` a cada segundo |
137
- | Tabela | **lista de objetos**. **Colunas** = `campo:Rótulo:alinhamento:largura` | — | ver abaixo |
138
- | Contador | horas (ou minutos, ou segundos, conforme **O CLP manda em**), ou número de partidas | **Chave dos minutos**, **Chave dos segundos** (quando vem separado) | `{ "horimetro": 1520 }` |
139
-
140
- Tabela:
141
-
142
- ```js
143
- msg.payload = {
144
- "bobinas_lista": [
145
- { "hora": "08:42", "operador": 3360, "espiras": 386 },
146
- { "hora": "07:43", "operador": 3360, "espiras": 440 }
147
- ]
148
- }
149
- // Colunas: hora:Hora, operador:Operador, espiras:Espiras:r
150
- ```
151
-
152
- Com **Campo que dá a cor da linha** = `tipo` e **Estados** =
153
- `Parada=Parada:alarm, Almoço=Almoço:info`, cada linha pinta o campo `tipo`
154
- com a cor do estado.
155
-
156
- ### Gráficos
157
-
158
- | Símbolo | A chave recebe | Exemplo |
159
- |---|---|---|
160
- | Gráfico de barras | **Jeito A**, uma chave por barra: preencha **Chaves** com `turno1:Turno 1, turno2:Turno 2` (a Chave do símbolo fica vazia). **Jeito B**, uma chave com uma lista: deixe **Chaves** vazio e mande `[118, 126, 109]` (rótulos em **Rótulos**) ou `[{ "h": "05", "q": 7 }]` (campo do rótulo `h`, campo do valor `q`) | `{ "turno1": 40, "turno2": 35 }` ou `{ "por_hora": [{ "h": "05", "q": 7 }, { "h": "06", "q": 9 }] }` |
161
- | Rosca (donut) | igual ao gráfico de barras; o que passar de 6 fatias vira "Outros" | `{ "motivos": [{ "motivo": "Falta de material", "mins": 40 }] }` |
162
- | OEE | nada na chave do símbolo: usa **Chave da disponibilidade**, **da performance** e **da qualidade** (em % ou de 0 a 1), ou **Chave do OEE pronto** | `{ "disp": 92, "perf": 88, "qual": 99 }` |
163
- | Linha do tempo de estados | **lista de trechos** `{ ini, fim, estado }` | ver abaixo |
164
-
165
- Linha do tempo:
166
-
167
- ```js
168
- msg.payload = {
169
- "BT_04.linha_tempo": [
170
- { "ini": "2026-10-23 05:10:00", "fim": "2026-10-23 06:00:00", "estado": "GIRANDO" },
171
- { "ini": "2026-10-23 05:40:00", "fim": "2026-10-23 05:55:00", "estado": "PARADA" },
172
- { "ini": "2026-10-23 07:00:00", "fim": null, "estado": "GIRANDO" }
173
- ]
174
- }
175
- ```
176
-
177
- - `ini` e `fim` (ou `start` e `end`): data e hora. `fim` vazio = trecho aberto,
178
- vai até agora.
179
- - **Campo do estado** (padrão `estado`): o nome do campo que diz o estado.
180
- - **Estados**: `GIRANDO=Girando:ok, PARADA=Parada:alarm`. O valor antes do `=`
181
- tem que ser igual ao que vem no campo; o resto é o texto e a cor. Cores: `ok`,
182
- `alarm`, `warn`, `info`, `low`, `off`, `c0`..`c5` ou `#hex`. Valor fora da lista
183
- fica cinza.
184
- - Quando dois trechos se cruzam, aparece o que vem **depois na lista**. Mande
185
- primeiro o tempo girando/parado e depois as paradas, que ficam por cima.
186
- - A linha do tempo **não monta histórico de um booleano**. Se você só tem
187
- `girando: true/false`, guarde as mudanças (no banco ou num contexto) e mande a
188
- lista de trechos.
189
-
190
- ### Estados
191
-
192
- | Símbolo | A chave recebe | Chaves extras | Exemplo |
193
- |---|---|---|---|
194
- | LED | liga/desliga | — | `{ "bomba1": true }` |
195
- | Status | liga/desliga; mostra **Texto ligado** ou **Texto desligado** | — | `{ "auto": 1 }` |
196
- | Status (vários estados) | texto ou número; **Estados** = `valor=Texto:cor` | as de `{chave}` na **Linha de baixo** | `{ "estado": "PARADA", "motivo": "Falta de material" }` com linha de baixo `{motivo}` |
197
- | Alarme | liga/desliga; só aparece quando ligado | — | `{ "emergencia": true }` |
198
- | Torre de sinalização | nada na chave do símbolo: **Chave vermelho**, **amarelo**, **verde**, **azul** (liga/desliga) | as quatro | `{ "torreVm": false, "torreVd": true }` |
199
- | Modo (MAN / AUTO) | número ou texto; **Textos** = `0=MANUAL,1=AUTO`; o **Valor normal** fica discreto, os outros destacados | — | `{ "modo": 1 }` |
200
- | Intertravamento / permissivo | liga/desliga | — | `{ "portaFechada": true }` |
201
- | Lista de alarmes, Resumo de alarmes | nada: mostram os alarmes do próprio canvas (limites dos símbolos e chaves de falha) | — | — |
202
-
203
- ### Equipamentos, Processo, Elétrica e Fábrica
204
-
205
- Quase todos recebem **liga/desliga** na chave principal (ligado = gira, acende,
206
- anima). Muitos têm **Chave da falha** (liga/desliga): quando ligada, o símbolo
207
- fica vermelho e entra na lista de alarmes com a **Prioridade** escolhida.
208
-
209
- | Símbolo | A chave recebe | Chaves extras |
210
- |---|---|---|
211
- | Bobina, Rolo, Faca circular, Sensor, Cilindro | liga/desliga | — |
212
- | Motor, Válvula, Bomba, Esteira, Ventilador, Resistência | liga/desliga | Chave da falha |
213
- | Bobinadeira | liga/desliga (eixo girando) | Chave da falha |
214
- | Compressor, Soprador, Válvula 3 vias, Misturador, Trocador de calor, Caldeira, Torre de resfriamento, Chiller, Ciclone | liga/desliga | Chave da falha |
215
- | Cabine de pintura, Calandra, Mesa de rolos, Contator, Gerador, Transformador | liga/desliga | Chave da falha |
216
- | Robô | liga/desliga | Chave da falha, Chave soldando (faísca) |
217
- | Disjuntor | liga/desliga (fechado) | Chave disparado |
218
- | Tanque | número (nível entre Vazio e Cheio) | — |
219
- | Válvula de controle, Damper | número (posição entre fechada e aberta) | Chave da falha |
220
- | Prensa / dobradeira | número (posição do martelo) | Chave da falha |
221
- | Ponte rolante / talha | número (posição do carro) | Chave da altura do gancho, Chave com carga, Chave da falha |
222
- | Veículo (carrinho, AGV, empilhadeira) | número (posição) ou liga/desliga, conforme **A chave é** | Chave da falha |
223
- | Filtro de mangas | número (ΔP) | — |
224
- | Medidor de vazão, Instrumento ISA, Balança | número | — |
225
- | Estufa / forno | número (temperatura) | Chave porta aberta, Chave aquecendo |
226
- | Fonte de solda | número (corrente) | Chave arco aberto (vazio = valor > 0), Chave da falha |
227
- | Inversor de frequência | número (Hz) | Chave rodando (vazio = valor ≠ 0), Chave reverso (vazio = valor negativo), Chave da falha |
228
- | Medidor de energia | número (potência) | Chave da energia (kWh) |
229
-
230
- ### Formas, Linhas e Comandos
231
-
232
- | Símbolo | A chave recebe |
233
- |---|---|
234
- | Corpo / forma livre | opcional. Com **Encher pelo valor da chave**: número entre mín. e máx. Com **Girar / correr quando a chave ligar** ou peças que se movem: liga/desliga ou posição. Sem nada disso, a chave pode ficar vazia. |
235
- | Imagem | opcional: liga/desliga troca para a **imagem quando ligado** |
236
- | SVG com partes ligadas | nada na chave do símbolo: cada linha de **Ligações** (`idDoDesenho = chave`) lê uma chave |
237
- | Linha (chapa, tubulação, esteira, sinal), Conexão, Seta | liga/desliga (anima o fluxo ou acende) |
238
- | Botão, Chave seletora | liga/desliga, só para mostrar o estado atual (texto ligado). O clique sai pela saída do nó |
239
- | Ajuste (setpoint) | número atual; o valor digitado sai pela saída do nó |
240
-
241
- ## 4. Exemplo completo
242
-
243
- Um fluxo da bobinadeira BT 04 mandando duas mensagens diferentes para o mesmo
244
- canvas:
245
-
246
- ```js
247
- // do CLP, a cada mudança
248
- msg.payload = { "BT_04.girando": true, "BT_04.estado": "GIRANDO" };
249
-
250
- // do banco, a cada 30 s
251
- msg.payload = {
252
- "BT_04.bobinas": 7,
253
- "BT_04.operador": 3360,
254
- "BT_04.linha_tempo": [ { "ini": "2026-10-23 05:10:00", "fim": null, "estado": "GIRANDO" } ],
255
- "BT_04.bobinas_lista": [ { "hora": "08:42", "operador": 3360, "espiras": 386 } ]
256
- };
257
- ```
258
-
259
- | Símbolo | Chave |
260
- |---|---|
261
- | Bobinadeira | `BT_04.girando` |
262
- | Status (vários estados) | `BT_04.estado` |
263
- | KPI "Bobinas hoje" | `BT_04.bobinas` |
264
- | Texto | (vazio), texto `operador {BT_04.operador:t}` |
265
- | Linha do tempo | `BT_04.linha_tempo` |
266
- | Tabela | `BT_04.bobinas_lista` |
1
+ # Que mensagem cada símbolo recebe
2
+
3
+ Este guia explica como o **hmi canvas** recebe os dados e o que cada símbolo espera
4
+ encontrar na chave dele. O resto (desenhar, regras, comandos, alarmes) está no
5
+ [README](../README.md).
6
+
7
+ ## 1. Como os dados chegam no canvas
8
+
9
+ O canvas tem **uma entrada**. Tudo o que você manda nela vira uma lista de
10
+ **chaves**, e cada símbolo mostra uma chave (o campo **Chave** do símbolo, no
11
+ painel da direita do editor).
12
+
13
+ ### Jeito 1: um objeto em `msg.payload`
14
+
15
+ Cada propriedade do objeto é uma chave:
16
+
17
+ ```js
18
+ msg.payload = {
19
+ "rpm": 1450,
20
+ "velocidade": 42.5,
21
+ "motorLigado": true,
22
+ "estado": "GIRANDO"
23
+ }
24
+ ```
25
+
26
+ O símbolo com chave `rpm` mostra 1450, o de chave `motorLigado` fica ligado, e
27
+ assim por diante.
28
+
29
+ ### Jeito 2: um valor solto com `msg.topic`
30
+
31
+ ```js
32
+ msg.topic = "temperatura"
33
+ msg.payload = 21.5
34
+ ```
35
+
36
+ É o mesmo que mandar `{ "temperatura": 21.5 }`.
37
+
38
+ ### Pode mandar várias mensagens, cada uma com uma parte
39
+
40
+ **Não precisa mandar tudo de uma vez.** O canvas guarda o último valor de cada
41
+ chave e junta o que chega:
42
+
43
+ ```js
44
+ // mensagem 1, do CLP a cada 1 s
45
+ msg.payload = { "rpm": 1450, "motorLigado": true }
46
+ // mensagem 2, do banco a cada 30 s
47
+ msg.payload = { "bobinasHoje": 7, "linha_tempo": [ ... ] }
48
+ ```
49
+
50
+ Depois das duas, o canvas tem as quatro chaves. Uma mensagem só com `rpm` não
51
+ apaga `bobinasHoje`. Por isso dá para ligar vários fluxos no mesmo canvas: a
52
+ leitura do CLP, a consulta do banco, um inject de teste.
53
+
54
+ - Uma chave só muda quando chega de novo.
55
+ - Para limpar uma chave (o símbolo mostra "—"), mande ela com `null`.
56
+ - Uma lista ou objeto (tabela, linha do tempo) é trocado inteiro: a nova lista
57
+ substitui a anterior, ela não é somada.
58
+ - Quem abre a página depois recebe todas as chaves de uma vez, então a tela já
59
+ aparece completa.
60
+
61
+ ### Nome da chave
62
+
63
+ A chave é o **nome inteiro da propriedade**, com qualquer caractere. Se a
64
+ propriedade se chama `"BT_04.estado"`, a chave é `BT_04.estado`. O canvas **não**
65
+ entra em objetos aninhados: com `msg.payload = { BT_04: { estado: "GIRANDO" } }`
66
+ não existe a chave `BT_04.estado`. Monte as chaves "achatadas" numa function:
67
+
68
+ ```js
69
+ const out = {};
70
+ for (const m of maquinas) {
71
+ out[m.id + '.estado'] = m.estado; // "BT_04.estado"
72
+ out[m.id + '.girando'] = m.girando; // "BT_04.girando"
73
+ }
74
+ msg.payload = out;
75
+ return msg;
76
+ ```
77
+
78
+ ### Outras propriedades da mensagem
79
+
80
+ | Propriedade | Para que serve |
81
+ |---|---|
82
+ | `msg.quality` | `{ "temp": "bad" }` (ou `"uncertain"`, ou `"good"` para limpar): os símbolos dessa chave ficam apagados com × ou ?. |
83
+ | `msg.enabled` | `false` desliga todos os comandos do canvas (só visualização). |
84
+ | `msg.ui_update` | Muda opções do canvas em funcionamento, por exemplo `{ "screen": "Alarmes" }` abre essa tela. |
85
+ | `msg._hmiAck` | Reconhece alarmes pelo fluxo: o id do alarme, `"symbol:<id>"` ou `"all"`. |
86
+
87
+ ## 2. Tipos de valor
88
+
89
+ ### Liga / desliga
90
+
91
+ Os símbolos que acendem, giram ou mudam de cor (motor, LED, bobinadeira,
92
+ esteira, válvula...) decidem se estão ligados assim:
93
+
94
+ | Valor recebido | Fica |
95
+ |---|---|
96
+ | `true` / `false` | ligado / desligado |
97
+ | número diferente de 0 (`1`, `-3`, `0.5`) | ligado |
98
+ | `0` ou `"0"` | desligado |
99
+ | texto que não é número (`"ON"`, `"GIRANDO"`) | ligado (texto vazio = desligado) |
100
+ | `null`, sem valor, `""` | sem dado (desenho de "desconhecido", nem ligado nem desligado) |
101
+
102
+ Opções de cada símbolo que mudam isso:
103
+ - **Ligado quando: maior que o limite**: ligado só quando o valor é maior que o
104
+ **Limite** (ex. velocidade > 5).
105
+ - **Inverter sinal**: troca ligado e desligado (sensor NF, entrada ativa em 0).
106
+
107
+ Atenção: o texto `"false"` conta como ligado, porque não é número. Mande o
108
+ booleano `false` ou o número `0`.
109
+
110
+ ### Número
111
+
112
+ Número ou texto com número (`42.5` ou `"42.5"`). A **escala** do símbolo pode
113
+ converter o valor do CLP (`× 0.1`, `÷ 10`, `+ offset`) antes de mostrar.
114
+ `true`/`false` aparecem como ON/OFF.
115
+
116
+ ### Data e hora (tabela e linha do tempo)
117
+
118
+ Texto `"2026-10-23 05:10:00"` (horário local), número em milissegundos ou em
119
+ segundos, ou um `Date`.
120
+
121
+ ## 3. Símbolo por símbolo
122
+
123
+ Na coluna **A chave recebe** está o valor da chave principal (o campo
124
+ **Chave**). Os campos terminados em "Chave ..." são chaves extras, que você
125
+ escreve no símbolo e manda no mesmo payload.
126
+
127
+ ### Valores
128
+
129
+ | Símbolo | A chave recebe | Chaves extras | Exemplo |
130
+ |---|---|---|---|
131
+ | Tag | número (ou texto) | — | `{ "rpm": 1450 }` |
132
+ | KPI | número (ou texto). O **Subtítulo** pode ter `{outraChave}` | as do subtítulo | `{ "bobinas": 7, "t1": 5 }` com subtítulo `turno 1: {t1}` |
133
+ | Texto | opcional: um valor mostrado depois do texto. O texto pode ter `{chave}`; `{chave:1}` mostra 1 casa decimal e `{chave:t}` mostra como veio (sem separador de milhar) | as do texto | texto `operador {op:t}` com `{ "op": 2888 }` |
134
+ | Medidor, Barra | número entre **Mínimo** e **Máximo** | — | `{ "pressao": 6.2 }` |
135
+ | Barra ISA-101 | número | **Chave do setpoint** (número) | `{ "temp": 72, "tempSP": 75 }` |
136
+ | Tendência | número; o nó guarda os últimos segundos da **Janela** e desenha a curva | — | `{ "vel": 42.5 }` a cada segundo |
137
+ | Tabela | **lista de objetos**. **Colunas** = `campo:Rótulo:alinhamento:largura` | — | ver abaixo |
138
+ | Contador | horas (ou minutos, ou segundos, conforme **O CLP manda em**), ou número de partidas | **Chave dos minutos**, **Chave dos segundos** (quando vem separado) | `{ "horimetro": 1520 }` |
139
+
140
+ Tabela:
141
+
142
+ ```js
143
+ msg.payload = {
144
+ "bobinas_lista": [
145
+ { "hora": "08:42", "operador": 3360, "espiras": 386 },
146
+ { "hora": "07:43", "operador": 3360, "espiras": 440 }
147
+ ]
148
+ }
149
+ // Colunas: hora:Hora, operador:Operador, espiras:Espiras:r
150
+ ```
151
+
152
+ Com **Campo que dá a cor da linha** = `tipo` e **Estados** =
153
+ `Parada=Parada:alarm, Almoço=Almoço:info`, cada linha pinta o campo `tipo`
154
+ com a cor do estado.
155
+
156
+ ### Gráficos
157
+
158
+ | Símbolo | A chave recebe | Exemplo |
159
+ |---|---|---|
160
+ | Gráfico de barras | **Jeito A**, uma chave por barra: preencha **Chaves** com `turno1:Turno 1, turno2:Turno 2` (a Chave do símbolo fica vazia). **Jeito B**, uma chave com uma lista: deixe **Chaves** vazio e mande `[118, 126, 109]` (rótulos em **Rótulos**) ou `[{ "h": "05", "q": 7 }]` (campo do rótulo `h`, campo do valor `q`) | `{ "turno1": 40, "turno2": 35 }` ou `{ "por_hora": [{ "h": "05", "q": 7 }, { "h": "06", "q": 9 }] }` |
161
+ | Rosca (donut) | igual ao gráfico de barras; o que passar de 6 fatias vira "Outros" | `{ "motivos": [{ "motivo": "Falta de material", "mins": 40 }] }` |
162
+ | OEE | nada na chave do símbolo: usa **Chave da disponibilidade**, **da performance** e **da qualidade** (em % ou de 0 a 1), ou **Chave do OEE pronto** | `{ "disp": 92, "perf": 88, "qual": 99 }` |
163
+ | Linha do tempo de estados | **lista de trechos** `{ ini, fim, estado }` | ver abaixo |
164
+
165
+ Linha do tempo:
166
+
167
+ ```js
168
+ msg.payload = {
169
+ "BT_04.linha_tempo": [
170
+ { "ini": "2026-10-23 05:10:00", "fim": "2026-10-23 06:00:00", "estado": "GIRANDO" },
171
+ { "ini": "2026-10-23 05:40:00", "fim": "2026-10-23 05:55:00", "estado": "PARADA" },
172
+ { "ini": "2026-10-23 07:00:00", "fim": null, "estado": "GIRANDO" }
173
+ ]
174
+ }
175
+ ```
176
+
177
+ - `ini` e `fim` (ou `start` e `end`): data e hora. `fim` vazio = trecho aberto,
178
+ vai até agora.
179
+ - **Campo do estado** (padrão `estado`): o nome do campo que diz o estado.
180
+ - **Estados**: `GIRANDO=Girando:ok, PARADA=Parada:alarm`. O valor antes do `=`
181
+ tem que ser igual ao que vem no campo; o resto é o texto e a cor. Cores: `ok`,
182
+ `alarm`, `warn`, `info`, `low`, `off`, `c0`..`c5` ou `#hex`. Valor fora da lista
183
+ fica cinza.
184
+ - Quando dois trechos se cruzam, aparece o que vem **depois na lista**. Mande
185
+ primeiro o tempo girando/parado e depois as paradas, que ficam por cima.
186
+ - A linha do tempo **não monta histórico de um booleano**. Se você só tem
187
+ `girando: true/false`, guarde as mudanças (no banco ou num contexto) e mande a
188
+ lista de trechos.
189
+
190
+ ### Estados
191
+
192
+ | Símbolo | A chave recebe | Chaves extras | Exemplo |
193
+ |---|---|---|---|
194
+ | LED | liga/desliga | — | `{ "bomba1": true }` |
195
+ | Status | liga/desliga; mostra **Texto ligado** ou **Texto desligado** | — | `{ "auto": 1 }` |
196
+ | Status (vários estados) | texto ou número; **Estados** = `valor=Texto:cor` | as de `{chave}` na **Linha de baixo** | `{ "estado": "PARADA", "motivo": "Falta de material" }` com linha de baixo `{motivo}` |
197
+ | Alarme | liga/desliga; só aparece quando ligado | — | `{ "emergencia": true }` |
198
+ | Torre de sinalização | nada na chave do símbolo: **Chave vermelho**, **amarelo**, **verde**, **azul** (liga/desliga) | as quatro | `{ "torreVm": false, "torreVd": true }` |
199
+ | Modo (MAN / AUTO) | número ou texto; **Textos** = `0=MANUAL,1=AUTO`; o **Valor normal** fica discreto, os outros destacados | — | `{ "modo": 1 }` |
200
+ | Intertravamento / permissivo | liga/desliga | — | `{ "portaFechada": true }` |
201
+ | Lista de alarmes, Resumo de alarmes | nada: mostram os alarmes do próprio canvas (limites dos símbolos e chaves de falha) | — | — |
202
+
203
+ ### Equipamentos, Processo, Elétrica e Fábrica
204
+
205
+ Quase todos recebem **liga/desliga** na chave principal (ligado = gira, acende,
206
+ anima). Muitos têm **Chave da falha** (liga/desliga): quando ligada, o símbolo
207
+ fica vermelho e entra na lista de alarmes com a **Prioridade** escolhida.
208
+
209
+ | Símbolo | A chave recebe | Chaves extras |
210
+ |---|---|---|
211
+ | Bobina, Rolo, Faca circular, Sensor, Cilindro | liga/desliga | — |
212
+ | Motor, Válvula, Bomba, Esteira, Ventilador, Resistência | liga/desliga | Chave da falha |
213
+ | Bobinadeira | liga/desliga (eixo girando) | Chave da falha |
214
+ | Compressor, Soprador, Válvula 3 vias, Misturador, Trocador de calor, Caldeira, Torre de resfriamento, Chiller, Ciclone | liga/desliga | Chave da falha |
215
+ | Cabine de pintura, Calandra, Mesa de rolos, Contator, Gerador, Transformador | liga/desliga | Chave da falha |
216
+ | Robô | liga/desliga | Chave da falha, Chave soldando (faísca) |
217
+ | Disjuntor | liga/desliga (fechado) | Chave disparado |
218
+ | Tanque | número (nível entre Vazio e Cheio) | — |
219
+ | Válvula de controle, Damper | número (posição entre fechada e aberta) | Chave da falha |
220
+ | Prensa / dobradeira | número (posição do martelo) | Chave da falha |
221
+ | Ponte rolante / talha | número (posição do carro) | Chave da altura do gancho, Chave com carga, Chave da falha |
222
+ | Veículo (carrinho, AGV, empilhadeira) | número (posição) ou liga/desliga, conforme **A chave é** | Chave da falha |
223
+ | Filtro de mangas | número (ΔP) | — |
224
+ | Medidor de vazão, Instrumento ISA, Balança | número | — |
225
+ | Estufa / forno | número (temperatura) | Chave porta aberta, Chave aquecendo |
226
+ | Fonte de solda | número (corrente) | Chave arco aberto (vazio = valor > 0), Chave da falha |
227
+ | Inversor de frequência | número (Hz) | Chave rodando (vazio = valor ≠ 0), Chave reverso (vazio = valor negativo), Chave da falha |
228
+ | Medidor de energia | número (potência) | Chave da energia (kWh) |
229
+
230
+ ### Formas, Linhas e Comandos
231
+
232
+ | Símbolo | A chave recebe |
233
+ |---|---|
234
+ | Corpo / forma livre | opcional. Com **Encher pelo valor da chave**: número entre mín. e máx. Com **Girar / correr quando a chave ligar** ou peças que se movem: liga/desliga ou posição. Sem nada disso, a chave pode ficar vazia. |
235
+ | Imagem | opcional: liga/desliga troca para a **imagem quando ligado** |
236
+ | SVG com partes ligadas | nada na chave do símbolo: cada linha de **Ligações** (`idDoDesenho = chave`) lê uma chave |
237
+ | Linha (chapa, tubulação, esteira, sinal), Conexão, Seta | liga/desliga (anima o fluxo ou acende) |
238
+ | Botão, Chave seletora | liga/desliga, só para mostrar o estado atual (texto ligado). O clique sai pela saída do nó |
239
+ | Ajuste (setpoint) | número atual; o valor digitado sai pela saída do nó |
240
+
241
+ ## 4. Exemplo completo
242
+
243
+ Um fluxo da bobinadeira BT 04 mandando duas mensagens diferentes para o mesmo
244
+ canvas:
245
+
246
+ ```js
247
+ // do CLP, a cada mudança
248
+ msg.payload = { "BT_04.girando": true, "BT_04.estado": "GIRANDO" };
249
+
250
+ // do banco, a cada 30 s
251
+ msg.payload = {
252
+ "BT_04.bobinas": 7,
253
+ "BT_04.operador": 3360,
254
+ "BT_04.linha_tempo": [ { "ini": "2026-10-23 05:10:00", "fim": null, "estado": "GIRANDO" } ],
255
+ "BT_04.bobinas_lista": [ { "hora": "08:42", "operador": 3360, "espiras": 386 } ]
256
+ };
257
+ ```
258
+
259
+ | Símbolo | Chave |
260
+ |---|---|
261
+ | Bobinadeira | `BT_04.girando` |
262
+ | Status (vários estados) | `BT_04.estado` |
263
+ | KPI "Bobinas hoje" | `BT_04.bobinas` |
264
+ | Texto | (vazio), texto `operador {BT_04.operador:t}` |
265
+ | Linha do tempo | `BT_04.linha_tempo` |
266
+ | Tabela | `BT_04.bobinas_lista` |