Go to file
2026-03-18 23:29:16 +10:30
console fix whack formatting 2026-03-18 23:29:16 +10:30
data Expanded the number of devices to fileradios, some tweaks to how the handlers work in general 2026-03-18 23:19:12 +10:30
docs Updated screenshot again 2026-03-18 18:16:35 +10:30
mqtthandler Expanded the number of devices to fileradios, some tweaks to how the handlers work in general 2026-03-18 23:19:12 +10:30
scripts project restructure 2026-03-18 15:39:27 +10:30
streamer Expanded the number of devices to fileradios, some tweaks to how the handlers work in general 2026-03-18 23:19:12 +10:30
.gitignore Initial commit 2026-03-14 23:19:44 +10:30
docker-compose.yaml Added a second device, tracking mediamtx metrics 2026-03-18 17:39:33 +10:30
mediamtx.py Expanded the number of devices to fileradios, some tweaks to how the handlers work in general 2026-03-18 23:19:12 +10:30
mediamtx.yml Added a second device, tracking mediamtx metrics 2026-03-18 17:39:33 +10:30
radio.py Expanded the number of devices to fileradios, some tweaks to how the handlers work in general 2026-03-18 23:19:12 +10:30
README.md Added boastful README 2026-03-18 15:51:32 +10:30
requirements.txt Expanded the number of devices to fileradios, some tweaks to how the handlers work in general 2026-03-18 23:19:12 +10:30
ubx.py Expanded the number of devices to fileradios, some tweaks to how the handlers work in general 2026-03-18 23:19:12 +10:30

MQTT Device Manager & Web UI

alt text

Features

  • Device interface via MQTT: The Standard for IoT Messaging

    It is designed as an extremely lightweight publish/subscribe messaging transport that is ideal for connecting remote devices with a small code footprint and minimal network bandwidth.

  • Device properties are automatically discovered & subscribed from MQTT topic structure
  • Commands annotated with JSON Schema
    • Input is validated according to schema with python-jsonschema
    • Schema is passed directly to the frontend for form generation with JSONForms
  • Reactive Vue frontend
    • Fast, realtime updates due to pub/sub architecture
    • Property search by name, name fragment or value
    • Flash effect on property update
    • Frontend schema validation for commands with human readable error messages

Example command implementation

    @command(
        {
            "type": "object",
            "properties": {
                "measRate": {
                    "type": "integer",
                    "minimum": 50,
                    "maximum": 60000,
                    "description": "Measurement period in milliseconds",
                    "default": 1000,
                },
                "navRate": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 127,
                    "description": "Number of measurement cycles per navigation solution",
                    "default": 1
                },
                "timeRef": {
                    "type": "integer",
                    "enum": [0, 1],
                    "description": "Time reference (0=UTC, 1=GPS)",
                },
            },
            "required": ["measRate", "navRate", "timeRef"],
            "additionalProperties": False,
        },
        description="Reconfigure the rate properties for the UBX device.",
    )
    async def configure_rate(self, args):
        message = pyubx2.UBXMessage(
            "CFG",
            "CFG-RATE",
            pyubx2.ubxtypes_core.SET,
            measRate=args["measRate"],
            navRate=args["navRate"],
            timeRef=args["timeRef"],
        )
        num_bytes = await self.serial_port.write_async(message.serialize())
        return num_bytes