Pular para o conteúdo principal

Introdução

📌 Contexto do Projeto: Laboratório IoT (Node-RED + MQTT + SQLite3 + Docker)​

Aqui está um resumo compacto e estruturado da arquitetura e do script gerador (gen_portal.py), pronto para você copiar e colar como contexto inicial em um novo chat:

Objetivo Geral​

O projeto é um gerador em Python (gen_portal.py) que cria automaticamente um ambiente Docker para aulas de IoT. Ele expõe contêineres Node-RED isolados por grupo/turma por trás de um portal Nginx (proxy reverso) e um broker MQTT Mosquitto central.


Arquitetura & Nomenclatura​

  1. Roteamento & Nomes de Serviços:
  • Convenção de Nomes: {turma}-{identificador} (ex.: n21-a, n21-b, n21-p, n21-n).

  • Reservas de Letras Especiais:

  • p → Professor (ex.: n21-p).

  • n → Painel de Notas / Avaliador (ex.: n21-n).

  • Grupos de Alunos: Usam sequencialmente o restante do alfabeto (a, b, c... pulando n e p).

  1. Avaliador Distribuído (Container {turma}-n):
  • Possui o volume contendo todas as pastas dos alunos mapeado em modo leitura (./data:/data_grupos:ro).
  • Vem pré-configurado com um fluxo Node-RED autogerado que executa análise estática nos arquivos flows.json dos alunos (checklist de nodes, tópicos, etc.) e imprime um relatório de correção/notas no Debug.
  1. Portal Nginx:
  • Servido na porta 80.
  • Página Inicial (index.html): Mantém visual dark/neon com grid e cards estilizados. Cards de alunos usam cor padrão, o Professor recebe destaque em dourado e o Avaliador de Notas em roxo.
  • Proxy Reverso: Redireciona a rota /{servico}/ (ex: /n21-a/) para a porta 1880 do respectivo container.
  1. Autenticação & Segurança:
  • Node-RED: Cada container utiliza um settings.js customizado com autenticação via adminAuth com hashes bcrypt (2b2b).
  • São gerados dois usuários por container: {servico} (Admin) e {servico}-view (Apenas leitura).
  • As senhas geradas são exportadas para um arquivo credenciais.txt.

Comandos Úteis de Operação​

  • Gerar infraestrutura (exemplo com 2 turmas e 10 grupos cada):
python3 gen_portal.py --turma n21 --grupos 10
  • Subir o ambiente:
docker compose up -d --build
  • Desabilitar/Habilitar um grupo pontualmente:
docker compose stop n21-a-nodered # Desabilita
docker compose start n21-a-nodered # Habilita
  • Aplicar alterações com remoção de turmas/grupos antigos:
docker compose up -d --remove-orphans

Grok dump​

Here’s a clean PlatformIO + Arduino + ESP32 starter structure you can use in your lab templates.

labXX-template/
├── .github/
│ └── workflows/
│ └── grade.yml
├── include/
│ └── README
├── lib/
│ └── README
├── src/
│ └── main.cpp
├── test/
│ └── test_main.cpp
├── .gitignore
├── platformio.ini
└── README.md

File contents​

platformio.ini

; PlatformIO Project Configuration File
; https://docs.platformio.org/page/projectconf.html

[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200

; Optional: common build flags
build_flags =
-DCORE_DEBUG_LEVEL=0

; Unit Testing
test_framework = unity

src/main.cpp

#include <Arduino.h>

void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("LAB started - ESP32 + PlatformIO");

pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
}

test/test_main.cpp (PlatformIO Unity test)

#include <unity.h>
#include <Arduino.h>

void setUp(void) {
// runs before each test
}

void tearDown(void) {
// runs after each test
}

void test_led_pin_mode() {
pinMode(LED_BUILTIN, OUTPUT);
TEST_ASSERT_EQUAL(OUTPUT, 1); // simple example
}

void setup() {
delay(2000); // wait for serial / board
UNITY_BEGIN();
RUN_TEST(test_led_pin_mode);
UNITY_END();
}

void loop() {
// empty
}

.gitignore

.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch
*.pyc
__pycache__/
.DS_Store

README.md

# LABXX - ESP32 + PlatformIO

## Requirements

- [PlatformIO](https://platformio.org/) (VS Code extension or CLI)
- ESP32 board

## Build & Upload

```bash
pio run # compile
pio run -t upload # upload
pio device monitor # serial monitor
```

Run tests​

pio test

Structure​

  • src/ → main application code
  • include/ → header files
  • lib/ → private libraries
  • test/ → unit tests (Unity)

**`.github/workflows/grade.yml`** (CI – compile only)
```yaml
name: Build & Test

on: [push, pull_request]

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Cache PlatformIO
uses: actions/cache@v4
with:
path: |
~/.cache/pip
~/.platformio/.cache
key: ${{ runner.os }}-pio-${{ hashFiles('platformio.ini') }}

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Install PlatformIO
run: pip install platformio

- name: Build project
run: pio run

# Uncomment if you want native/unit tests in CI
# - name: Run tests
# run: pio test -e native

include/README and lib/README (PlatformIO placeholders)

This directory is intended for project header files / private libraries.

Updated script snippet (replace the “Create starter folder structure” part)​

# 3. Create PlatformIO starter structure
mkdir -p src include lib test .github/workflows

# platformio.ini
cat > platformio.ini << 'EOF'
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
test_framework = unity
EOF

# src/main.cpp
cat > src/main.cpp << EOF
#include <Arduino.h>

void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("LAB$lab started - ESP32 + PlatformIO");
pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
}
EOF

# test/test_main.cpp
cat > test/test_main.cpp << 'EOF'
#include <unity.h>
#include <Arduino.h>

void test_example() {
TEST_ASSERT_TRUE(true);
}

void setup() {
delay(2000);
UNITY_BEGIN();
RUN_TEST(test_example);
UNITY_END();
}

void loop() {}
EOF

# .gitignore
cat > .gitignore << 'EOF'
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch
.DS_Store
EOF

# README.md
cat > README.md << EOF
# LAB$lab - ESP32 + PlatformIO

## Commands
\`\`\`bash
pio run # build
pio run -t upload # upload
pio device monitor # serial
pio test # unit tests
\`\`\`
EOF

# GitHub Actions
cat > .github/workflows/grade.yml << 'EOF'
name: Build

on: [push, pull_request]

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install PlatformIO
run: pip install platformio
- name: Build
run: pio run
EOF

# placeholders
echo "Project headers go here" > include/README
echo "Private libraries go here" > lib/README

Notes for ESP32 + PlatformIO​

ItemRecommendation
Boardesp32dev is the most common. Change to esp32-s3-devkitc-1, az-delivery-devkit-v4, etc. if needed
CICan only compile (no real hardware). Use pio run
Unit tests on devicepio test (requires connected board)
Native testsAdd a [env:native] environment if you want tests without hardware

Would you like me to give you the full ready-to-run script already adapted for PlatformIO ESP32 (creating all lab00-template … lab10-template)?