2
0

initial commit

This commit is contained in:
2026-01-09 07:46:52 +01:00
commit 6d7bd63630
13 changed files with 1332 additions and 0 deletions

55
.devcontainer/Dockerfile Normal file
View File

@@ -0,0 +1,55 @@
FROM debian:stable-slim
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=1000
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \
&& apt-get update && apt-get install -y sudo \
&& echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
RUN RUN set -eux; \
apt-get update; \
apt-get install -y \
git \
build-essential \
cmake \
gdb;
RUN set -eux; \
apt-get update; \
apt-get install -y \
libncurses-dev \
libmicrohttpd-dev \
libcurl4-openssl-dev \
zlib1g-dev \
prometheus-cpp-dev \
nlohmann-json3-dev
RUN set -eux; \
apt-get update; \
apt-get install -y \
libpaho-mqtt-dev
RUN set -eux; \
git clone https://github.com/eclipse/paho.mqtt.cpp.git; \
cd paho.mqtt.cpp; \
git submodule init; \
git submodule update; \
mkdir build && cd build; \
cmake -DPAHO_WITH_MQTT_C=ON ..; \
cmake --build . --target install; \
ldconfig;
RUN set -eux; \
apt-get update; \
apt-get install -y \
librabbitmq4 \
librabbitmq-dev;\
apt-get clean
USER $USERNAME
WORKDIR /workspace
CMD ["sleep infinity"]

54
.devcontainer/compose.yml Normal file
View File

@@ -0,0 +1,54 @@
services:
dev:
build:
context: .
dockerfile: Dockerfile
volumes:
- ..:/workspace:cached
command: sleep infinity
networks:
- dev_net
nodered:
build: ./nodered
container_name: nodered
ports:
- "1880:1880"
networks:
- dev_net
environment:
TZ: Europe/Paris
volumes:
- nodered:/data
rabbitmq:
image: rabbitmq:4.1.4-management
container_name: rabbitmq
environment:
RABBITMQ_DEFAULT_USER: "admin"
RABBITMQ_DEFAULT_PASS: "geii2025"
# Activation MQTT sur le port 1883
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS: >
-rabbitmq_mqtt tcp_listeners [1883]
ports:
- "5672:5672" # AMQP
- "1883:1883" # MQTT
- "15672:15672" # RabbitMQ Manager
networks:
- dev_net
volumes:
- rabbitmq:/var/lib/rabbitmq
# Activation des plugins + démarrage serveur
command: >
sh -c "rabbitmq-plugins enable --offline rabbitmq_mqtt rabbitmq_management &&
rabbitmq-server"
networks:
dev_net:
volumes:
nodered:
rabbitmq:

View File

@@ -0,0 +1,22 @@
{
"name": "sarii",
"dockerComposeFile": [
"compose.yml"
],
"service": "dev",
"workspaceFolder": "/workspace",
"postStartCommand": "cmake -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON",
"customizations": {
"vscode": {
"settings": {
"remote.downloadExtensionsLocally": true,
"telemetry.enableTelemetry": false,
"extensions.ignoreRecommendations": true,
"workbench.remoteIndicator.showExtensionRecommendations": false
},
"extensions": [
"ms-vscode.cpptools"
]
}
}
}

View File

@@ -0,0 +1,7 @@
FROM nodered/node-red:4.1
# Installer FlowFuse Dashboard
RUN npm install --unsafe-perm @flowfuse/node-red-dashboard
# Copier votre flux si nécessaire
COPY flows.json /data/flows.json

View File

@@ -0,0 +1,571 @@
[
{
"id": "41526b8c80d5a5f7",
"type": "tab",
"label": "Flux 1",
"disabled": false,
"info": "",
"env": []
},
{
"id": "dc9d3b99eadb9b34",
"type": "ui-button",
"z": "41526b8c80d5a5f7",
"group": "5fe915fcd26e78ae",
"name": "",
"label": "B0",
"order": 2,
"width": 0,
"height": 0,
"emulateClick": false,
"tooltip": "",
"color": "",
"bgcolor": "",
"className": "",
"icon": "",
"iconPosition": "left",
"payload": "",
"payloadType": "str",
"topic": "topic",
"topicType": "msg",
"buttonColor": "",
"textColor": "",
"iconColor": "",
"enableClick": true,
"enablePointerdown": false,
"pointerdownPayload": "",
"pointerdownPayloadType": "str",
"enablePointerup": false,
"pointerupPayload": "",
"pointerupPayloadType": "str",
"x": 130,
"y": 320,
"wires": [
[
"6444617c166984e0"
]
]
},
{
"id": "9dcd1bf2a25f7371",
"type": "ui-button",
"z": "41526b8c80d5a5f7",
"group": "5fe915fcd26e78ae",
"name": "",
"label": "B1",
"order": 3,
"width": 0,
"height": 0,
"emulateClick": false,
"tooltip": "",
"color": "",
"bgcolor": "",
"className": "",
"icon": "",
"iconPosition": "left",
"payload": "",
"payloadType": "str",
"topic": "topic",
"topicType": "msg",
"buttonColor": "",
"textColor": "",
"iconColor": "",
"enableClick": true,
"enablePointerdown": false,
"pointerdownPayload": "",
"pointerdownPayloadType": "str",
"enablePointerup": false,
"pointerupPayload": "",
"pointerupPayloadType": "str",
"x": 130,
"y": 360,
"wires": [
[
"4ee747c8012c58a1"
]
]
},
{
"id": "143358afb510246e",
"type": "ui-button",
"z": "41526b8c80d5a5f7",
"group": "5fe915fcd26e78ae",
"name": "",
"label": "B2",
"order": 4,
"width": 0,
"height": 0,
"emulateClick": false,
"tooltip": "",
"color": "",
"bgcolor": "",
"className": "",
"icon": "",
"iconPosition": "left",
"payload": "",
"payloadType": "str",
"topic": "topic",
"topicType": "msg",
"buttonColor": "",
"textColor": "",
"iconColor": "",
"enableClick": true,
"enablePointerdown": false,
"pointerdownPayload": "",
"pointerdownPayloadType": "str",
"enablePointerup": false,
"pointerupPayload": "",
"pointerupPayloadType": "str",
"x": 130,
"y": 400,
"wires": [
[
"d966ba0d813b7cb7"
]
]
},
{
"id": "e863fe498c528076",
"type": "ui-button",
"z": "41526b8c80d5a5f7",
"group": "5fe915fcd26e78ae",
"name": "",
"label": "B3",
"order": 5,
"width": 0,
"height": 0,
"emulateClick": false,
"tooltip": "",
"color": "",
"bgcolor": "",
"className": "",
"icon": "",
"iconPosition": "left",
"payload": "",
"payloadType": "str",
"topic": "topic",
"topicType": "msg",
"buttonColor": "",
"textColor": "",
"iconColor": "",
"enableClick": true,
"enablePointerdown": false,
"pointerdownPayload": "",
"pointerdownPayloadType": "str",
"enablePointerup": false,
"pointerupPayload": "",
"pointerupPayloadType": "str",
"x": 130,
"y": 440,
"wires": [
[
"501355b0c82cae08"
]
]
},
{
"id": "04e097a5c78127cb",
"type": "mqtt out",
"z": "41526b8c80d5a5f7",
"name": "",
"topic": "geii/in",
"qos": "",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "5bf949eb0a1b50a7",
"x": 730,
"y": 120,
"wires": []
},
{
"id": "d12767fc3e33bb20",
"type": "ui-button",
"z": "41526b8c80d5a5f7",
"group": "5fe915fcd26e78ae",
"name": "",
"label": "MARCHE",
"order": 1,
"width": 0,
"height": 0,
"emulateClick": false,
"tooltip": "",
"color": "",
"bgcolor": "",
"className": "",
"icon": "",
"iconPosition": "left",
"payload": "",
"payloadType": "str",
"topic": "topic",
"topicType": "msg",
"buttonColor": "",
"textColor": "",
"iconColor": "",
"enableClick": true,
"enablePointerdown": false,
"pointerdownPayload": "",
"pointerdownPayloadType": "str",
"enablePointerup": false,
"pointerupPayload": "",
"pointerupPayloadType": "str",
"x": 140,
"y": 260,
"wires": [
[
"3e0c75aae8971dca"
]
]
},
{
"id": "0ca8f4a10a6048af",
"type": "function",
"z": "41526b8c80d5a5f7",
"name": "format mqtt",
"func": "let marche = Number(flow.get(\"marche\") || 0);\nlet b0 = Number(flow.get(\"b0\") || 0);\nlet b1 = Number(flow.get(\"b1\") || 0);\nlet b2 = Number(flow.get(\"b2\") || 0);\n\nmsg.payload = {\n \"marche\": marche,\n \"b0\": b0,\n \"b1\": b1,\n \"b2\": b2\n};\n\nreturn msg;",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 570,
"y": 120,
"wires": [
[
"04e097a5c78127cb"
]
]
},
{
"id": "a49263451d77f972",
"type": "inject",
"z": "41526b8c80d5a5f7",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 110,
"y": 40,
"wires": [
[
"d28f31d7c379f3d8"
]
]
},
{
"id": "d28f31d7c379f3d8",
"type": "change",
"z": "41526b8c80d5a5f7",
"name": "",
"rules": [
{
"t": "set",
"p": "marche",
"pt": "flow",
"to": "0",
"tot": "num"
},
{
"t": "set",
"p": "b1",
"pt": "msg",
"to": "0",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 320,
"y": 40,
"wires": [
[
"0ca8f4a10a6048af"
]
]
},
{
"id": "3e0c75aae8971dca",
"type": "function",
"z": "41526b8c80d5a5f7",
"name": "set marche",
"func": "flow.set(\"marche\", !Number(flow.get(\"marche\")));\n\nreturn msg;",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 310,
"y": 260,
"wires": [
[
"0ca8f4a10a6048af"
]
]
},
{
"id": "6444617c166984e0",
"type": "function",
"z": "41526b8c80d5a5f7",
"name": "set marche",
"func": "flow.set(\"b0\", !Number(flow.get(\"b0\")));\n\nreturn msg;",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 310,
"y": 320,
"wires": [
[
"0ca8f4a10a6048af"
]
]
},
{
"id": "4ee747c8012c58a1",
"type": "function",
"z": "41526b8c80d5a5f7",
"name": "set marche",
"func": "flow.set(\"b1\", !Number(flow.get(\"b1\")));\n\nreturn msg;",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 310,
"y": 360,
"wires": [
[
"0ca8f4a10a6048af"
]
]
},
{
"id": "d966ba0d813b7cb7",
"type": "function",
"z": "41526b8c80d5a5f7",
"name": "set marche",
"func": "flow.set(\"b2\", !Number(flow.get(\"b2\")));\n\nreturn msg;",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 310,
"y": 400,
"wires": [
[
"0ca8f4a10a6048af"
]
]
},
{
"id": "501355b0c82cae08",
"type": "function",
"z": "41526b8c80d5a5f7",
"name": "set marche",
"func": "flow.set(\"b3\", !Number(flow.get(\"b3\")));\n\nreturn msg;",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 310,
"y": 440,
"wires": [
[
"0ca8f4a10a6048af"
]
]
},
{
"id": "1dfea06c14d2732c",
"type": "mqtt in",
"z": "41526b8c80d5a5f7",
"name": "",
"topic": "geii/out",
"qos": "2",
"datatype": "auto-detect",
"broker": "5bf949eb0a1b50a7",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 130,
"y": 580,
"wires": [
[
"31ef90b8227cd6cb"
]
]
},
{
"id": "31ef90b8227cd6cb",
"type": "debug",
"z": "41526b8c80d5a5f7",
"name": "debug 1",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 380,
"y": 580,
"wires": []
},
{
"id": "5fe915fcd26e78ae",
"type": "ui-group",
"name": "Pupitre",
"page": "bb436fe040268d40",
"width": "2",
"height": 1,
"order": 1,
"showTitle": true,
"className": "",
"visible": "true",
"disabled": "false",
"groupType": "default"
},
{
"id": "5bf949eb0a1b50a7",
"type": "mqtt-broker",
"name": "",
"broker": "rabbitmq",
"port": 1883,
"clientid": "",
"autoConnect": true,
"usetls": false,
"protocolVersion": 4,
"keepalive": 60,
"cleansession": true,
"autoUnsubscribe": true,
"birthTopic": "",
"birthQos": "0",
"birthRetain": "false",
"birthPayload": "",
"birthMsg": {},
"closeTopic": "",
"closeQos": "0",
"closeRetain": "false",
"closePayload": "",
"closeMsg": {},
"willTopic": "",
"willQos": "0",
"willRetain": "false",
"willPayload": "",
"willMsg": {},
"userProps": "",
"sessionExpiry": ""
},
{
"id": "bb436fe040268d40",
"type": "ui-page",
"name": "LP SARII",
"ui": "92537b03143c5e06",
"path": "/page1",
"icon": "home",
"layout": "grid",
"theme": "ea2bf5532fa513eb",
"breakpoints": [
{
"name": "Default",
"px": "0",
"cols": "3"
},
{
"name": "Tablet",
"px": "576",
"cols": "6"
},
{
"name": "Small Desktop",
"px": "768",
"cols": "9"
},
{
"name": "Desktop",
"px": "1024",
"cols": "12"
}
],
"order": 1,
"className": "",
"visible": "true",
"disabled": "false"
},
{
"id": "92537b03143c5e06",
"type": "ui-base",
"name": "My Dashboard",
"path": "/dashboard",
"appIcon": "",
"includeClientData": true,
"acceptsClientConfig": [
"ui-notification",
"ui-control"
],
"showPathInSidebar": false,
"headerContent": "page",
"navigationStyle": "default",
"titleBarStyle": "default",
"showReconnectNotification": true,
"notificationDisplayTime": 1,
"showDisconnectNotification": true,
"allowInstall": false
},
{
"id": "ea2bf5532fa513eb",
"type": "ui-theme",
"name": "Default Theme",
"colors": {
"surface": "#ffffff",
"primary": "#0094CE",
"bgPage": "#eeeeee",
"groupBg": "#ffffff",
"groupOutline": "#cccccc"
},
"sizes": {
"density": "default",
"pagePadding": "12px",
"groupGap": "12px",
"groupBorderRadius": "4px",
"widgetGap": "12px"
}
},
{
"id": "925a608e1a2d82a3",
"type": "global-config",
"env": [],
"modules": {
"@flowfuse/node-red-dashboard": "1.29.0"
}
}
]