Files
kosmo-connect/firmware/infrastructure-node/bridge-daemon/README.md
Tomas Kracmar 0a4fb7b55e
Some checks failed
CI / lint-docs (push) Has been cancelled
CI / build-firmware (push) Has been cancelled
CI / test-backend (push) Has been cancelled
CI / test-web (push) Has been cancelled
feat: initial KosmoConnect platform v0.1
Includes:
- Backend services: ingestion (:8001), weather API (:8002),
  gateway (:8003), billing (:8004) with BTCPay integration
- Shared asyncpg pool, TimescaleDB hypertable, Redis, Mosquitto MQTT
- React frontend: Dashboard (MapLibre) and Messaging (chat UI)
- Bridge daemon for Pi + Meshtastic (Serial/TCP T-Deck support)
- Production Docker Compose, Nginx reverse proxy, ops scripts
- DEPLOY.md with step-by-step deployment guide
2026-04-12 17:30:15 +02:00

176 lines
5.1 KiB
Markdown

# KosmoConnect Bridge Daemon
A Python daemon that bridges a local Meshtastic mesh network to the KosmoConnect cloud MQTT broker.
## What It Does
1. **Mesh → Cloud**
- Receives text messages from the mesh and publishes them to `kosmo/mesh/inbound`
- Detects JSON environmental data packets (sent as text) and forwards them to `kosmo/ingest/enviro`
- Forwards position updates to `kosmo/position/position`
- *(Future)* Will handle custom `KOSMO_ENVIRO_APP` portnum packets from enviro-node firmware
2. **Cloud → Mesh**
- Subscribes to `kosmo/mesh/outbound/#`
- Injects text messages into the mesh, tagged with `[Web]` prefix so users know the origin
## Hardware Requirements
- **Raspberry Pi** (3B+ or 4 recommended) running Raspberry Pi OS or similar Debian-based Linux
- **Meshtastic device** with USB-serial interface (e.g., LILYGO T-Beam, RAK4631, or your T-Deck in USB-serial mode) connected via USB
- Reliable internet backhaul (WiFi or Ethernet)
## Quick Start (Local Dev)
You can test the daemon on your laptop without a Pi by using the Mosquitto broker from the backend stack:
```bash
cd firmware/infrastructure-node/bridge-daemon
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# Option A: USB serial device
export MESHTASTIC_DEVICE=/dev/ttyUSB0 # or /dev/ttyACM0 on Linux, COM3 on Windows, /dev/cu.usbserial-* on macOS
export MQTT_HOST=localhost
export MQTT_PORT=1883
python3 -m src.main
# Option B: Network-connected device (e.g., T-Deck on WiFi)
export MESHTASTIC_HOST=192.168.1.45
export MESHTASTIC_TCP_PORT=4403
export MQTT_HOST=localhost
export MQTT_PORT=1883
python3 -m src.main
```
## Raspberry Pi Production Setup
### 1. Install Dependencies
```bash
sudo apt update
sudo apt install -y python3-venv python3-pip git
```
### 2. Clone / Copy This Directory to the Pi
```bash
cd /opt
sudo git clone https://your-repo/kosmo-connect.git
# or rsync the bridge-daemon folder
```
### 3. Run the Installer
```bash
cd /opt/kosmo-connect/firmware/infrastructure-node/bridge-daemon
sudo ./install.sh
```
### 4. Configure the Service
Edit the systemd service to point to your actual MQTT broker:
```bash
sudo systemctl edit --full kosmo-bridge
```
Update the `Environment=` lines, for example:
```ini
Environment="MQTT_HOST=your-broker.example.com"
Environment="MQTT_PORT=1883"
Environment="MQTT_USER=kosmo"
Environment="MQTT_PASS=your_secure_password"
Environment="MESHTASTIC_DEVICE=/dev/ttyUSB0"
Environment="GATEWAY_NODE_ID=!yourgateway01"
```
Save and reload:
```bash
sudo systemctl daemon-reload
sudo systemctl restart kosmo-bridge
```
### 5. Monitor Logs
```bash
sudo journalctl -u kosmo-bridge -f
```
## Environment Variables
| Variable | Default | Description |
|----------|---------|-------------|
| `MQTT_HOST` | `localhost` | MQTT broker hostname |
| `MQTT_PORT` | `1883` | MQTT broker port |
| `MQTT_USER` | *(empty)* | MQTT username |
| `MQTT_PASS` | *(empty)* | MQTT password |
| `MESHTASTIC_DEVICE` | `/dev/ttyUSB0` | Serial path to the Meshtastic radio (used when `MESHTASTIC_HOST` is empty) |
| `MESHTASTIC_HOST` | *(empty)* | IP address or hostname of a network-connected Meshtastic device |
| `MESHTASTIC_TCP_PORT` | `4403` | TCP port for the Meshtastic network API |
| `GATEWAY_NODE_ID` | *(empty)* | Identifier for this bridge in the cloud |
## Finding the Serial Port
On the Pi, plug in your T-Beam or T-Deck and run:
```bash
ls -l /dev/ttyUSB* /dev/ttyACM* /dev/serial/by-id/
```
Use the path that appears when the device is connected.
## Using T-Deck Over WiFi (No USB Cable)
Your T-Deck can connect to your home WiFi and expose the Meshtastic TCP API on port `4403`.
### 1. Enable WiFi on the T-Deck
Using the Meshtastic app or CLI:
```bash
meshtastic --host <t-deck-ip> --set wifi_ssid "YourNetwork" --set wifi_psk "YourPassword"
```
Or via the on-screen menu if your T-Deck firmware supports it.
### 2. Find the T-Deck IP Address
Check your router's DHCP client list, or use a network scanner:
```bash
nmap -p 4403 192.168.1.0/24
```
### 3. Run the Bridge in TCP Mode
```bash
export MESHTASTIC_HOST=192.168.1.45
export MESHTASTIC_TCP_PORT=4403
export MQTT_HOST=your-broker.example.com
python3 -m src.main
```
The bridge will connect over TCP instead of USB-serial. This is perfect for keeping the T-Deck portable while the Pi sits near your router.
## Testing with T-Deck
When the bridge is running (serial or TCP):
1. Send a text message from any mesh node
2. Check `kosmo/mesh/inbound` on your MQTT broker — the message should appear within seconds
3. Publish a message to `kosmo/mesh/outbound/!{target_node_id}` — the target node should receive it prefixed with `[Web]`
## Troubleshooting
- **Permission denied on `/dev/ttyUSB0`**: Add the `kosmo` user to the `dialout` group:
```bash
sudo usermod -a -G dialout kosmo
sudo systemctl restart kosmo-bridge
```
- **MQTT connection refused**: Verify your broker is reachable from the Pi (`nc -vz MQTT_HOST MQTT_PORT`)
- **Meshtastic device not found over serial**: Check cables and power supply; some devices need a powered USB hub on the Pi
- **T-Deck TCP connection refused**: Ensure the T-Deck is on the same network and the TCP API port (4403) is not blocked by a firewall