SENSBLUE ATLAS/Node-RED: Difference between revisions
Appearance
No edit summary |
No edit summary |
||
| (20 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
{{DISPLAYTITLE:Node-RED}} | |||
[[File:Node-RED Logo.png|frameless|150x150px]] | |||
== Node-RED Simplified Flows == | == Node-RED Simplified Flows == | ||
'''Flow Node-RED''' | '''Flow Node-RED''' | ||
These easy-to- | These easy-to-deploy flows aim to make the integration of the ATLAS into any scenario faster by adding anabstraction layer between the user and the stack. This is achieved through the use of subflows, which containthe code needed for the features and where changes can be made if necessary, exposing a node that "hides"that more complex integration. | ||
=== 1. Import Flows to Example Folder === | === 1. Import Flows to Example Folder === | ||
To import the flows and add them to the Node-RED examples folder, execute the following: | To import the flows and add them to the Node-RED examples folder, execute the following: | ||
1.1 First | 1.1 First copy the ATLAS folder to a folder with permissions, i.e. /pi | ||
1.2 Copy the folder to the Node-RED examples folder using the command:<syntaxhighlight lang="bash"> | 1.2 Copy the folder to the Node-RED examples folder using the command:<syntaxhighlight lang="bash"> | ||
| Line 13: | Line 16: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
[[File:Node-RED Simplified Flows img 1.png|center|frameless|1037x1037px]] | [[File:Node-RED Simplified Flows img 1.png|center|frameless|1037x1037px]] | ||
[[Media:Simplified Flows.zip|Simplified Flows | |||
<table style="border: none; background: transparent; margin: 15px 0; border-collapse: collapse;"> | |||
<td style="padding: 0 0 0 10px; border: none; background: transparent;"> | |||
<span class="atlas-btn">[[Media:Simplified Flows.zip|Simplified Flows]]</span> | |||
</td> | |||
</table> | |||
'''Analog Inputs''' | '''Analog Inputs''' | ||
This flow | This flow implements a demonstration of acquisition and control of analog ports AI1..AI4 via MQTT and theNode-RED Dashboard 2.0. The system is divided into two main subflows: '''Analog Inputs''', for readingchannels AI1 to AI4, and '''Analog Outputs''', for configuring/reading channels AO1 and AO2. The main logic isencapsulated in subflows, allowing reuse in other tabs or projects. | ||
=== 2. Main Components === | === 2. Main Components === | ||
{| class="wikitable" | {| class="wikitable mix-table" | ||
!Component | !Component | ||
!Function | !Function | ||
| Line 43: | Line 51: | ||
==== 3.1 Function ==== | ==== 3.1 Function ==== | ||
The Analog Inputs subflow allows | The Analog Inputs subflow allows selecting which AI channels should be read and in which unit/type eachchannel should operate: voltage ('''voltage''') or current ('''current'''). The subflow has four outputs, one perchannel: AI1, AI2, AI3 and AI4. | ||
==== 3.2 ENV Variables ==== | ==== 3.2 ENV Variables ==== | ||
{| class="wikitable" | {| class="wikitable tech-table" | ||
!Variable | !Variable | ||
!Type | !Type | ||
| Line 52: | Line 60: | ||
!Description | !Description | ||
|- | |- | ||
|readAI1 | |'''readAI1''' | ||
|bool | |bool | ||
|true | |'''true''' | ||
|Enables/disables reading of channel AI1. | |Enables/disables reading of channel AI1. | ||
|- | |- | ||
|AI1_type | |'''AI1_type''' | ||
|string | |string | ||
|voltage | |'''voltage''' | ||
|Type of AI1 reading: voltage or current. | |Type of AI1 reading: '''voltage''' or '''current'''. | ||
|- | |- | ||
|readAI2 | |'''readAI2''' | ||
|bool | |bool | ||
|true | |'''true''' | ||
|Enables/disables reading of channel AI2. | |Enables/disables reading of channel AI2. | ||
|- | |- | ||
|AI2_type | |'''AI2_type''' | ||
|string | |string | ||
|voltage | |'''voltage''' | ||
|Type of AI2 reading: voltage or current. | |Type of AI2 reading: '''voltage''' or '''current'''. | ||
|- | |- | ||
|readAI3 | |'''readAI3''' | ||
|bool | |bool | ||
|true | |'''true''' | ||
|Enables/disables reading of channel AI3. | |Enables/disables reading of channel AI3. | ||
|- | |- | ||
|AI3_type | |'''AI3_type''' | ||
|string | |string | ||
|voltage | |'''voltage''' | ||
|Type of AI3 reading: voltage or current. | |Type of AI3 reading: '''voltage''' or '''current'''. | ||
|- | |- | ||
|readAI4 | |'''readAI4''' | ||
|bool | |bool | ||
|true | |'''true''' | ||
|Enables/disables reading of channel AI4. | |Enables/disables reading of channel AI4. | ||
|- | |- | ||
|AI4_type | |'''AI4_type''' | ||
|string | |string | ||
|voltage | |'''voltage''' | ||
|Type of AI4 reading: voltage or current. | |Type of AI4 reading: '''voltage''' or '''current'''. | ||
|} | |} | ||
| Line 107: | Line 115: | ||
} | } | ||
} | } | ||
</syntaxhighlight>If no channel is active, the function emits the warning "No AI channels selected" and does not send a message. | </syntaxhighlight>If no channel is active, the function emits the warning "'''No AI channels selected'''" and does not send a message. | ||
==== 3.4 Configuring the AI mode ==== | ==== 3.4 Configuring the AI mode ==== | ||
The group '''Set acquisition mode''' allows sending the configuration of the analogue channels to <code>analogInputs/config/in</code>. The function '''Set AIX mode''' creates taskParams only for the active channels and sets each channel as:<syntaxhighlight lang="json"> | The group '''Set acquisition mode''' allows sending the configuration of the analogue channels to <code>analogInputs/config/in</code>. The function '''Set AIX mode''' creates '''taskParams''' only for the active channels and sets each channel as:<syntaxhighlight lang="json"> | ||
{ | { | ||
"mode": "single", | "mode": "single", | ||
| Line 123: | Line 131: | ||
==== 4.2 ENV Variables ==== | ==== 4.2 ENV Variables ==== | ||
{| class="wikitable" | {| class="wikitable tech-table" | ||
!Variable | !Variable | ||
!Type | !Type | ||
| Line 212: | Line 220: | ||
=== 6. Validations and protections implemented === | === 6. Validations and protections implemented === | ||
{| class="wikitable" | {| class="wikitable mix-table" | ||
!Area | !Area | ||
!Validation | !Validation | ||
| Line 233: | Line 241: | ||
|Disabled channel sends current 0. | |Disabled channel sends current 0. | ||
|} | |} | ||
=== 7. Requirements === | |||
* Node-RED with subflow support. | |||
* '''@flowfuse/node-red-dashboard''' version '''1.30.2'''. | |||
* MQTT broker. | |||
* External service/hardware that stimulates/responds to the '''analogInputs/*''' and '''analogOutputs/*''' topics. | |||
'''Digital Demo''' | |||
=== 8. Objective === | |||
This flow demonstrates the control and monitoring of digital ports through | |||
Node-RED, MQTT and Dashboard 2.0. | |||
It is composed of two main subflows: | |||
{| class="wikitable mix-table" | |||
!Component | |||
!Function | |||
|- | |||
|Digital Inputs | |||
|Reads the states of DI1..DI4 and sends them to LEDs on the Dashboard. | |||
|- | |||
|Digital Outputs | |||
|Controls DO1..DO4 through switches and shows the real state on LEDs. | |||
|- | |||
|Demo Digital ports | |||
|Dashboard page where the digital widgets are displayed. | |||
|- | |||
|MQTT broker atlas | |||
|Local broker at 127.0.0.1:1883. | |||
|} | |||
=== 9. General architecture === | |||
'''Digital Inputs:''' | |||
Node-RED → digitalInputs/runtime/in → Hardware | |||
Hardware → digitalInputs/runtime/out → Node-RED → LEDs DI1..DI4 | |||
'''Digital Outputs:''' | |||
Switches Dashboard → Node-RED → digitalOutputs/runtime/in → Hardware | |||
Hardware → digitalOutputs/runtime/out → Node-RED → LEDs DO1..DO4 | |||
=== 10. MQTT topics === | |||
{| class="wikitable mix-table" | |||
!Topic | |||
!Usage | |||
|- | |||
|digitalInputs/runtime/in | |||
|Request to read the digital inputs. | |||
|- | |||
|digitalInputs/runtime/out | |||
|Response with the states of DI1..DI4. | |||
|- | |||
|digitalOutputs/runtime/in | |||
|'''SET''' commands or '''READ''' requests for the digital outputs. | |||
|- | |||
|digitalOutputs/runtime/out | |||
|Response with the states of DO1..DO4. | |||
|} | |||
=== 11. Digital Inputs === | |||
The '''Digital Inputs''' subflow periodically sends a '''READ''' request to read DI1..DI4. | |||
The '''Force Read''' inject runs every '''1 second'''. | |||
Payload sent:<syntaxhighlight lang="json"> | |||
{ | |||
"id": 1780000000000, | |||
"origin": "APP", | |||
"task": { | |||
"action": "READ" | |||
} | |||
} | |||
</syntaxhighlight>The expected response contains the states of the inputs in: | |||
'''msg.payload.task.taskResult.DI1..DI4''' | |||
The parser converts the states to booleans: | |||
{| class="wikitable mix-table" | |||
!State received | |||
!Value sent to UI | |||
|- | |||
|'''high''' with success: '''true''' | |||
|true | |||
|- | |||
|'''low''' with success: '''true''' | |||
|false | |||
|- | |||
|Channel absent or error | |||
|false | |||
|} | |||
The four outputs of the subflow update the LEDs DI1, DI2, DI3 and DI4. | |||
=== 12. Digital Outputs === | |||
The '''Digital Outputs''' subflow allows controlling DO..DO4 through switches on the Dashboard. | |||
Each switch sends: | |||
{| class="wikitable mix-table" | |||
!Switch | |||
!msg.topic | |||
!ON | |||
!OFF | |||
|- | |||
|DO1 | |||
|DO1 | |||
|true | |||
|false | |||
|- | |||
|DO2 | |||
|DO2 | |||
|true | |||
|false | |||
|- | |||
|DO3 | |||
|DO3 | |||
|true | |||
|false | |||
|- | |||
|DO4 | |||
|DO4 | |||
|true | |||
|false | |||
|} | |||
The '''set digital outputs''' function converts the values into physical states: | |||
{| class="wikitable mix-table" | |||
!Logical value | |||
!State sent | |||
|- | |||
|true | |||
|high | |||
|- | |||
|false | |||
|low | |||
|}The command is sent to: | |||
'''digitalOutputs/runtime/in''' | |||
=== 13. ENV variables of the Digital Outputs === | |||
{| class="wikitable mix-table" | |||
!Variable | |||
!Default value | |||
!Function | |||
|- | |||
|DO1 | |||
|true | |||
|Initial state of DO1 | |||
|- | |||
|DO2 | |||
|true | |||
|Initial state of DO2 | |||
|- | |||
|DO3 | |||
|true | |||
|Initial state of DO3 | |||
|- | |||
|DO4 | |||
|true | |||
|Initial state of DO4 | |||
|} | |||
On deploy/startup, a '''once''' inject initializes the outputs with these values. | |||
=== 14. Dashboard === | |||
{| class="wikitable mix-table" | |||
!Field | |||
!Value | |||
|- | |||
|Page | |||
|Demo Digital ports | |||
|- | |||
|Path | |||
|/dashboard/page2 | |||
|- | |||
|Theme | |||
|Atronia | |||
|- | |||
|Layout | |||
|grid | |||
|}Groups on the page: | |||
{| class="wikitable mix-table" | |||
!Group | |||
!Content | |||
|- | |||
|Digital Inputs | |||
|LEDs DI1..DI4 | |||
|- | |||
|Digital Outputs | |||
|Switches DO1..DO4 and LEDs DO1..DO4 | |||
|} | |||
Input LEDs: | |||
{| class="wikitable mix-table" | |||
!Value | |||
!Color | |||
|- | |||
|true | |||
|Green | |||
|- | |||
|false | |||
|Red | |||
|} | |||
Output LEDs: | |||
{| class="wikitable mix-table" | |||
!Value | |||
!Color | |||
|- | |||
|1 | |||
|Green | |||
|- | |||
|0 | |||
|Red | |||
|} | |||
=== 15. Operation sequence === | |||
'''Digital inputs''' | |||
# A READ request is sent. | |||
# The hardware responds with the states DI1..DI4. | |||
# The parser converts '''high''' to true and '''low''' to '''false'''. | |||
# The DI LEDs are updated. | |||
'''Digital outputs''' | |||
# On startup, the outputs use the ENV values. | |||
# The user changes a switch on the Dashboard. | |||
# The hardware applies the states. | |||
# The DO LEDs show the real state received. | |||