# robbertjv/mqtt_dmx_bridge architecture

> Architecture diagram of the GitHub repository robbertjv/mqtt_dmx_bridge, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/robbertjv/mqtt_dmx_bridge
- Repository: https://github.com/robbertjv/mqtt_dmx_bridge

## Overview

The product is an ESP32-S3 MQTT-to-DMX bridge with configurable networking, a web setup portal, eight DMX-mapped digital outputs, and two safety watchdogs. The main workflow is controller commands over MQTT, application-level command handling, and DMX/output updates; the watchdogs can latch a failsafe that zeros DMX and inhibits further commands. Configuration is persisted in NVS. Source excerpts are partial, so edges for documented capabilities use the README where implementation wiring was not shown.

Main entry points: [`src/main.cpp`](https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/main.cpp) (Application Loop), [`src/mqtt_manager.cpp`](https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/mqtt_manager.cpp) (MQTT Manager), [`src/dmx_manager.cpp`](https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/dmx_manager.cpp) (DMX Manager), [`src/portal_manager.cpp`](https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/portal_manager.cpp) (Configuration Portal)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_setup["Setup and Configuration"]
  node_config["Runtime Configuration<br/>[config_manager.cpp]"]
  node_nvs[("NVS Settings")]
  node_portal["Configuration Portal<br/>[portal_manager.cpp]"]
end

subgraph group_connectivity["Network and MQTT"]
  node_network["Network Manager"]
  node_mqtt["MQTT Manager<br/>[mqtt_manager.cpp]"]
  node_network_interfaces["Wi-Fi / Ethernet"]
end

subgraph group_control["Control and Safety"]
  node_main["Application Loop<br/>[main.cpp]"]
  node_watchdog["Watchdog Manager"]
  node_dmx["DMX Manager<br/>[dmx_manager.cpp]"]
end

subgraph group_hardware["Physical Outputs"]
  node_output["Digital Output Manager<br/>[output_manager.cpp]"]
  node_dmx_bus["DMX512 Bus<br/>[dmx_manager.cpp]"]
  node_output_expander["I²C Output Expander<br/>[output_manager.cpp]"]
end

node_operator(("Operator"))
node_controller(("MQTT Controller"))
node_broker["MQTT Broker"]
node_fixtures["DMX Fixtures"]

node_operator -->|"configures device"| node_portal
node_portal -->|"saves settings"| node_config
node_portal -->|"scans Wi-Fi"| node_network
node_config -->|"persists settings"| node_nvs
node_main -->|"initializes"| node_config
node_main -->|"initializes"| node_network
node_main -->|"initializes"| node_portal
node_main -->|"processes"| node_mqtt
node_main -->|"processes"| node_watchdog
node_main -->|"manages"| node_dmx
node_network -->|"selects interface"| node_network_interfaces
node_network -.->|"provides connectivity"| node_mqtt
node_controller -->|"publishes commands"| node_broker
node_broker -->|"delivers messages"| node_mqtt
node_mqtt -.->|"dispatches commands"| node_main
node_main -->|"updates universe"| node_dmx
node_dmx -->|"transmits frames"| node_dmx_bus
node_dmx_bus -->|"drives fixtures"| node_fixtures
node_main -->|"updates outputs"| node_output
node_output -->|"reads mapped channels"| node_dmx
node_output -->|"writes output state"| node_output_expander
node_main -.->|"reports MQTT state"| node_watchdog
node_watchdog -->|"zeros on failsafe"| node_dmx
node_watchdog -.->|"requests heartbeat"| node_mqtt
node_mqtt -->|"publishes state"| node_broker

click node_config "https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/config_manager.cpp"
click node_portal "https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/portal_manager.cpp"
click node_main "https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/main.cpp"
click node_network "https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/network_manager.cpp"
click node_mqtt "https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/mqtt_manager.cpp"
click node_watchdog "https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/watchdog_manager.cpp"
click node_dmx "https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/dmx_manager.cpp"
click node_output "https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/output_manager.cpp"
click node_network_interfaces "https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/network_manager.cpp"
click node_dmx_bus "https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/dmx_manager.cpp"
click node_output_expander "https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/output_manager.cpp"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_config,node_nvs,node_portal toneBlue
class node_network,node_mqtt,node_network_interfaces toneAmber
class node_main,node_watchdog,node_dmx toneMint
class node_output,node_dmx_bus,node_output_expander toneRose
class node_operator,node_controller,node_broker,node_fixtures toneIndigo
```

## Components

### Setup and Configuration

- [Runtime Configuration](https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/config_manager.cpp): `src/config_manager.cpp`
- **NVS Settings**
- [Configuration Portal](https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/portal_manager.cpp): `src/portal_manager.cpp`

### Network and MQTT

- [Network Manager](https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/network_manager.cpp): `src/network_manager.cpp`
- [MQTT Manager](https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/mqtt_manager.cpp): `src/mqtt_manager.cpp`
- [Wi-Fi / Ethernet](https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/network_manager.cpp): `src/network_manager.cpp`

### Control and Safety

- [Application Loop](https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/main.cpp): `src/main.cpp`
- [Watchdog Manager](https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/watchdog_manager.cpp): `src/watchdog_manager.cpp`
- [DMX Manager](https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/dmx_manager.cpp): `src/dmx_manager.cpp`

### Physical Outputs

- [Digital Output Manager](https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/output_manager.cpp): `src/output_manager.cpp`
- [DMX512 Bus](https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/dmx_manager.cpp): `src/dmx_manager.cpp`
- [I²C Output Expander](https://github.com/robbertjv/mqtt_dmx_bridge/blob/main/src/output_manager.cpp): `src/output_manager.cpp`

### Other components

- **Operator**
- **MQTT Controller**
- **MQTT Broker**
- **DMX Fixtures**

## Connections

- Operator → Configuration Portal: configures device (evidence: `README.md`)
- Configuration Portal → Runtime Configuration: saves settings
- Configuration Portal → Network Manager: scans Wi-Fi
- Runtime Configuration → NVS Settings: persists settings
- Application Loop → Runtime Configuration: initializes (evidence: `src/main.cpp`)
- Application Loop → Network Manager: initializes (evidence: `src/main.cpp`)
- Application Loop → Configuration Portal: initializes (evidence: `src/main.cpp`)
- Application Loop → MQTT Manager: processes (evidence: `src/main.cpp`)
- Application Loop → Watchdog Manager: processes (evidence: `src/main.cpp`)
- Application Loop → DMX Manager: manages (evidence: `src/main.cpp`)
- Network Manager → Wi-Fi / Ethernet: selects interface (evidence: `src/network_manager.cpp`)
- Network Manager → MQTT Manager: provides connectivity
- MQTT Controller → MQTT Broker: publishes commands (evidence: `README.md`)
- MQTT Broker → MQTT Manager: delivers messages (evidence: `README.md`)
- MQTT Manager → Application Loop: dispatches commands
- Application Loop → DMX Manager: updates universe (evidence: `README.md`)
- DMX Manager → DMX512 Bus: transmits frames (evidence: `README.md`)
- DMX512 Bus → DMX Fixtures: drives fixtures (evidence: `README.md`)
- Application Loop → Digital Output Manager: updates outputs (evidence: `README.md`)
- Digital Output Manager → DMX Manager: reads mapped channels
- Digital Output Manager → I²C Output Expander: writes output state (evidence: `src/output_manager.cpp`)
- Application Loop → Watchdog Manager: reports MQTT state
- Watchdog Manager → DMX Manager: zeros on failsafe (evidence: `README.md`)
- Watchdog Manager → MQTT Manager: requests heartbeat
- MQTT Manager → MQTT Broker: publishes state (evidence: `README.md`)
