secubox-openwrt/package/secubox/luci-app-mqtt-bridge/README.md
CyberMind-FR 31a87c5d7a feat(structure): reorganize luci-app packages into package/secubox/ + appstore migration
Major structural reorganization and feature additions:

## Folder Reorganization
- Move 17 luci-app-* packages to package/secubox/ (except luci-app-secubox core hub)
- Update all tooling to support new structure:
  - secubox-tools/quick-deploy.sh: search both locations
  - secubox-tools/validate-modules.sh: validate both directories
  - secubox-tools/fix-permissions.sh: fix permissions in both locations
  - .github/workflows/test-validate.yml: build from both paths
- Update README.md links to new package/secubox/ paths

## AppStore Migration (Complete)
- Add catalog entries for all remaining luci-app packages:
  - network-tweaks.json: Network optimization tools
  - secubox-bonus.json: Documentation & demos hub
- Total: 24 apps in AppStore catalog (22 existing + 2 new)
- New category: 'documentation' for docs/demos/tutorials

## VHost Manager v2.0 Enhancements
- Add profile activation system for Internal Services and Redirects
- Implement createVHost() API wrapper for template-based deployment
- Fix Virtual Hosts view rendering with proper LuCI patterns
- Fix RPCD backend shell script errors (remove invalid local declarations)
- Extend backend validation for nginx return directives (redirect support)
- Add section_id parameter for named VHost profiles
- Add Remove button to Redirects page for feature parity
- Update README to v2.0 with comprehensive feature documentation

## Network Tweaks Dashboard
- Close button added to component details modal

Files changed: 340+ (336 renames with preserved git history)
Packages affected: 19 luci-app, 2 secubox-app, 1 theme, 4 tools

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-01 14:59:38 +01:00

680 lines
16 KiB
Markdown

# SecuBox MQTT IoT Bridge
**Version:** 0.5.0-1
**Status:** Production Ready
**Category:** IoT & Integration
**Maintainer:** CyberMind <contact@cybermind.fr>
MQTT IoT Bridge with comprehensive USB device support for SecuBox routers. Automatically detects and configures USB IoT adapters (Zigbee, Z-Wave, ModBus, Serial) and bridges them to an MQTT broker for home automation and industrial IoT applications.
---
## Features
### Core Functionality
- **MQTT Broker Integration**: Connect to local or remote MQTT brokers
- **USB IoT Adapter Detection**: Automatic detection of 17 known USB devices
- **Multi-Protocol Support**: Zigbee, Z-Wave, ModBus RTU, and generic USB Serial
- **Real-Time Health Monitoring**: Track adapter status (online/error/missing/unknown)
- **Configuration Management**: UCI-based persistent configuration
- **SecuBox Theme Integration**: Consistent UI with dark/light/cyberpunk themes
### Supported USB IoT Adapters
#### Zigbee Adapters (6 devices)
- **Texas Instruments CC2531** (VID:PID `0451:16a8`)
- **Dresden Elektronik ConBee II** (VID:PID `1cf1:0030`)
- **Sonoff Zigbee 3.0 USB Plus** (VID:PID `1a86:55d4`)
- **Silicon Labs CP2102** (VID:PID `10c4:ea60`) - Generic Zigbee
- **SMSC USB2134B** (VID:PID `0424:2134`)
- **CH340** (VID:PID `1a86:7523`) - Sonoff Zigbee 3.0
#### Z-Wave USB Sticks (3 devices)
- **Aeotec Z-Stick Gen5** (VID:PID `0658:0200`)
- **Aeotec Z-Stick 7** (VID:PID `0658:0280`)
- **Z-Wave.Me UZB** (VID:PID `10c4:8a2a`)
#### ModBus RTU Adapters (4 devices)
- **FTDI FT232** (VID:PID `0403:6001`) - USB-Serial
- **Prolific PL2303** (VID:PID `067b:2303`)
- **CH340** (VID:PID `1a86:7523`)
- **CP210x UART Bridge** (VID:PID `10c4:ea60`)
#### Generic USB Serial Adapters
- Any USB-to-serial adapter detected via `/dev/ttyUSB*` or `/dev/ttyACM*`
---
## Views
### 1. Overview (`overview.js`)
- MQTT broker connection status
- Total connected devices count
- USB adapter statistics by type (Zigbee/Z-Wave/ModBus/Serial)
- Health status summary (online/error/missing/unknown)
- Recent MQTT messages and topics
- Quick actions (scan USB, reconnect broker)
### 2. Adapters (`adapters.js`)
- **Configured Adapters Grid**: All UCI-configured adapters with status
- **Detected Devices Section**: Real-time USB device scanning results
- **Import Wizard**: One-click import from detected devices to configuration
- **Adapter Management**: Test connection, configure, remove actions
- **Health Indicators**: Color-coded status (green=online, red=error, yellow=missing, gray=unknown)
---
## RPC Methods (7 total)
### USB Detection & Management
#### `get_usb_devices`
Lists all USB devices connected to the system with vendor/product info.
**Parameters:** None
**Returns:**
```json
{
"devices": [
{
"bus": "usb1",
"device": "1-1",
"vendor": "0451",
"product": "16a8",
"adapter_type": "zigbee",
"device_name": "Texas Instruments CC2531",
"port": "/dev/ttyUSB0"
}
]
}
```
#### `detect_iot_adapters`
Identifies IoT adapters by VID:PID matching against known device database.
**Parameters:** None
**Returns:**
```json
{
"zigbee": [
{
"vendor": "0451",
"product": "16a8",
"name": "Texas Instruments CC2531",
"port": "/dev/ttyUSB0"
}
],
"zwave": [],
"modbus": []
}
```
#### `get_serial_ports`
Lists all serial ports (`/dev/ttyUSB*`, `/dev/ttyACM*`) with attributes.
**Parameters:** None
**Returns:**
```json
{
"ports": [
{
"device": "/dev/ttyUSB0",
"driver": "ch341",
"vendor": "1a86",
"product": "7523",
"adapter_type": "zigbee"
}
]
}
```
#### `get_adapter_info`
Returns detailed information for a specific adapter by ID.
**Parameters:** `{ "adapter": "zigbee_cc2531" }`
**Returns:**
```json
{
"id": "zigbee_cc2531",
"enabled": true,
"type": "zigbee",
"vendor": "0451",
"product": "16a8",
"port": "/dev/ttyUSB0",
"baud": "115200",
"channel": "11",
"detected": true,
"health": "online"
}
```
#### `test_connection`
Tests serial port accessibility and readability.
**Parameters:** `{ "port": "/dev/ttyUSB0" }`
**Returns:**
```json
{
"success": true,
"port": "/dev/ttyUSB0",
"readable": true,
"writable": true,
"error": null
}
```
#### `configure_adapter`
Creates or updates a UCI adapter configuration.
**Parameters:**
```json
{
"adapter_id": "zigbee_usb2134",
"type": "zigbee",
"vendor": "0424",
"product": "2134",
"port": "/dev/ttyUSB1",
"baud": "115200",
"enabled": true
}
```
**Returns:** `{ "success": true }`
#### `get_adapter_status`
Returns real-time health status for all configured adapters.
**Parameters:** None
**Returns:**
```json
{
"adapters": [
{
"id": "zigbee_cc2531",
"health": "online",
"port": "/dev/ttyUSB0",
"detected": true,
"last_seen": 1704046800
}
]
}
```
---
## UCI Configuration
### Configuration File: `/etc/config/mqtt-bridge`
#### Example Configuration
```
# MQTT Broker Settings
config broker 'broker'
option host '127.0.0.1'
option port '1883'
option username 'secubox'
option password 'secubox'
option client_id 'mqtt-bridge-01'
# Bridge Configuration
config bridge 'bridge'
option base_topic 'secubox/+/state'
option retention '7'
option auto_discovery '1'
option poll_interval '30'
# USB Monitoring
config monitor 'monitor'
option interval '10'
option usb_scan_enabled '1'
option auto_configure '0'
# Zigbee Adapter Example
config adapter 'zigbee_cc2531'
option enabled '1'
option type 'zigbee'
option title 'Texas Instruments CC2531'
option vendor '0451'
option product '16a8'
option port '/dev/ttyUSB0'
option baud '115200'
option channel '11'
option pan_id '0x1A62'
option permit_join '0'
option detected '1'
option health 'online'
# Z-Wave Adapter Example
config adapter 'zwave_aeotec'
option enabled '1'
option type 'zwave'
option title 'Aeotec Z-Stick Gen5'
option vendor '0658'
option product '0200'
option port '/dev/ttyACM0'
option baud '115200'
option detected '0'
option health 'unknown'
# ModBus RTU Adapter Example
config adapter 'modbus_ftdi'
option enabled '1'
option type 'modbus'
option title 'FTDI ModBus Adapter'
option vendor '0403'
option product '6001'
option port '/dev/ttyUSB1'
option baud '9600'
option parity 'N'
option databits '8'
option stopbits '1'
option slave_id '1'
option detected '1'
option health 'online'
```
### Configuration Options
#### Broker Section
- `host`: MQTT broker hostname or IP
- `port`: MQTT broker port (default: 1883)
- `username`: Authentication username
- `password`: Authentication password
- `client_id`: Unique client identifier
#### Bridge Section
- `base_topic`: Base MQTT topic for device messages
- `retention`: Message retention in days
- `auto_discovery`: Enable MQTT auto-discovery (0/1)
- `poll_interval`: Polling interval in seconds
#### Monitor Section
- `interval`: USB scan interval in seconds
- `usb_scan_enabled`: Enable automatic USB scanning (0/1)
- `auto_configure`: Auto-configure detected adapters (0/1)
#### Adapter Sections
- `enabled`: Enable this adapter (0/1)
- `type`: Adapter type (zigbee/zwave/modbus/serial)
- `title`: Human-readable name
- `vendor`: USB vendor ID (VID)
- `product`: USB product ID (PID)
- `port`: Serial port device path
- `baud`: Baud rate (9600, 19200, 38400, 57600, 115200, etc.)
- `detected`: Adapter currently detected (0/1, auto-updated)
- `health`: Adapter health status (online/error/missing/unknown, auto-updated)
#### Zigbee-Specific Options
- `channel`: Zigbee channel (11-26)
- `pan_id`: Personal Area Network ID (hex)
- `permit_join`: Allow new devices to join (0/1)
#### ModBus-Specific Options
- `parity`: Parity bit (N/E/O)
- `databits`: Data bits (7/8)
- `stopbits`: Stop bits (1/2)
- `slave_id`: ModBus slave ID
---
## USB Detection Library
Location: `/usr/share/mqtt-bridge/usb-database.sh`
### Key Functions
#### `detect_adapter_type(vid, pid)`
Matches VID:PID against known device database.
**Returns:** `zigbee`, `zwave`, `modbus`, `serial`, or `unknown`
#### `find_usb_tty(device_path)`
Maps USB device path to serial port (`/dev/ttyUSB*` or `/dev/ttyACM*`).
**Returns:** Device path or empty string
#### `test_serial_port(port)`
Tests if serial port is accessible.
**Returns:** 0 (success) or 1 (fail)
#### `get_device_name(vid, pid)`
Retrieves human-readable device name from database.
**Returns:** Device name string
---
## Installation
### Dependencies
```bash
# Required
opkg update
opkg install luci-base rpcd curl mosquitto
# Optional (for specific protocols)
opkg install python3-pyserial # For serial communication
opkg install socat # For TCP/serial bridging
```
### Package Installation
```bash
# Download from GitHub Releases
wget https://github.com/gkerma/secubox-openwrt/releases/download/v0.5.0/luci-app-mqtt-bridge_0.5.0-1_all.ipk
# Install
opkg install luci-app-mqtt-bridge_0.5.0-1_all.ipk
# Restart services
/etc/init.d/rpcd restart
/etc/init.d/uhttpd restart
```
---
## Usage Guide
### 1. Initial Setup
1. Navigate to **SecuBox → Network → MQTT IoT Bridge → Overview**
2. Configure MQTT broker settings (host, port, credentials)
3. Click **Save & Apply**
### 2. Detecting USB Adapters
1. Plug in your USB IoT adapter (Zigbee, Z-Wave, etc.)
2. Go to **Adapters** view
3. Click **Scan USB Devices**
4. Detected devices will appear in the "Detected Devices" section
### 3. Importing Adapters
1. In the **Detected Devices** section, find your adapter
2. Click **Import** button
3. Adapter will be added to configuration automatically
4. Edit adapter settings if needed (channel, baud rate, etc.)
### 4. Testing Connectivity
1. Select an adapter in the **Configured Adapters** grid
2. Click **Test Connection**
3. Check the status indicator (green = success, red = failed)
### 5. Monitoring Health
- **Online** (🟢): Adapter is connected and responding
- **Error** (🔴): Connection failed or communication error
- **Missing** (🟡): Adapter was detected before but now disconnected
- **Unknown** (⚪): Status not yet determined
---
## Troubleshooting
### Common Issues
#### Adapter Not Detected
**Symptoms:** USB adapter plugged in but not appearing in "Detected Devices"
**Solutions:**
1. Check if USB device is recognized by kernel:
```bash
lsusb
dmesg | grep tty
```
2. Verify device appears in sysfs:
```bash
ls /sys/bus/usb/devices/
```
3. Check if VID:PID is in database:
```bash
cat /usr/share/mqtt-bridge/usb-database.sh | grep <VID>:<PID>
```
#### Port Permission Errors
**Symptoms:** "Permission denied" when accessing `/dev/ttyUSB*`
**Solutions:**
1. Verify RPCD script permissions:
```bash
chmod 755 /usr/libexec/rpcd/luci.mqtt-bridge
```
2. Check device node permissions:
```bash
ls -l /dev/ttyUSB0
chmod 666 /dev/ttyUSB0 # Temporary fix
```
#### Health Status Shows "Missing"
**Symptoms:** Adapter was working but now shows "missing" status
**Solutions:**
1. Check if USB device is still connected:
```bash
lsusb
```
2. Verify serial port exists:
```bash
ls -l /dev/ttyUSB*
```
3. Replug the USB adapter
4. Check dmesg for USB errors:
```bash
dmesg | tail -20
```
### Debug Commands
```bash
# List all USB devices
ubus call luci.mqtt-bridge get_usb_devices
# Detect IoT adapters
ubus call luci.mqtt-bridge detect_iot_adapters
# Get adapter status
ubus call luci.mqtt-bridge get_adapter_status
# Test serial port
ubus call luci.mqtt-bridge test_connection '{"port":"/dev/ttyUSB0"}'
# View MQTT bridge configuration
uci show mqtt-bridge
# Check RPCD logs
logread | grep mqtt-bridge
```
---
## API Reference
### JavaScript API Module
Location: `htdocs/luci-static/resources/mqtt-bridge/api.js`
```javascript
// Import the API module
'require mqtt-bridge/api as API';
// Get USB devices
API.getUSBDevices().then(function(devices) {
console.log('USB devices:', devices);
});
// Detect IoT adapters
API.detectIoTAdapters().then(function(adapters) {
console.log('Zigbee:', adapters.zigbee);
console.log('Z-Wave:', adapters.zwave);
console.log('ModBus:', adapters.modbus);
});
// Configure adapter
API.configureAdapter({
adapter_id: 'zigbee_cc2531',
type: 'zigbee',
vendor: '0451',
product: '16a8',
port: '/dev/ttyUSB0',
baud: '115200',
enabled: true
}).then(function(result) {
console.log('Configured:', result.success);
});
// Get adapter status
API.getAdapterStatus().then(function(status) {
console.log('Adapter status:', status.adapters);
});
```
---
## Integration Examples
### Home Assistant
```yaml
# configuration.yaml
mqtt:
broker: <openwrt-router-ip>
port: 1883
username: secubox
password: secubox
discovery: true
discovery_prefix: homeassistant
```
### Zigbee2MQTT
```yaml
# configuration.yaml
homeassistant: true
permit_join: false
mqtt:
base_topic: zigbee2mqtt
server: mqtt://<openwrt-router-ip>
serial:
port: /dev/ttyUSB0
adapter: zstack
```
### Node-RED
```javascript
// MQTT In node configuration
{
"server": "<openwrt-router-ip>:1883",
"topic": "secubox/+/state",
"qos": "0",
"username": "secubox",
"password": "secubox"
}
```
---
## Development
### Project Structure
```
luci-app-mqtt-bridge/
├── Makefile
├── README.md
├── htdocs/
│ └── luci-static/
│ └── resources/
│ ├── mqtt-bridge/
│ │ └── api.js # API module
│ └── view/
│ └── mqtt-bridge/
│ ├── overview.js # Overview dashboard
│ └── adapters.js # USB adapter management
├── root/
│ ├── etc/
│ │ └── config/
│ │ └── mqtt-bridge # UCI config
│ ├── usr/
│ │ ├── libexec/
│ │ │ └── rpcd/
│ │ │ └── luci.mqtt-bridge # RPCD backend
│ │ └── share/
│ │ ├── luci/
│ │ │ └── menu.d/
│ │ │ └── luci-app-mqtt-bridge.json
│ │ ├── rpcd/
│ │ │ └── acl.d/
│ │ │ └── luci-app-mqtt-bridge.json
│ │ └── mqtt-bridge/
│ │ └── usb-database.sh # USB detection library
│ └── etc/
│ └── init.d/
│ └── mqtt-bridge # Init script
```
### Adding New USB Devices
To add support for a new USB IoT adapter:
1. Edit `/usr/share/mqtt-bridge/usb-database.sh`
2. Add VID:PID to appropriate database:
```bash
ZIGBEE_DEVICES="
...
<VID>:<PID>:Your Device Name
"
```
3. Restart RPCD: `/etc/init.d/rpcd restart`
---
## License
Apache License 2.0
---
## Maintainer
**CyberMind.fr**
GitHub: @gkerma
Email: contact@cybermind.fr
---
## Version History
### v0.5.0 (2025-12-30)
- ✅ Complete USB IoT adapter support
- ✅ Added 17 known devices to VID:PID database
- ✅ Created adapters.js view for USB management
- ✅ Enhanced overview.js with adapter statistics
- ✅ Implemented 7 new RPCD methods for USB operations
- ✅ Added real-time health monitoring
- ✅ SecuBox theme integration (dark/light/cyberpunk)
### v0.4.0 (2025-11)
- Initial MQTT broker integration
- Basic device management
- Settings configuration
---
## Resources
- **GitHub Repository**: https://github.com/gkerma/secubox-openwrt
- **Documentation**: https://gkerma.github.io/secubox-openwrt/
- **Issue Tracker**: https://github.com/gkerma/secubox-openwrt/issues
- **Live Demo**: https://secubox.cybermood.eu
---
*Last updated: 2025-12-30*