############### MQTT contract ############### The ``protocol`` package defines schema 1 under ``onehouse/v1``. Device, command, and message IDs use canonical uppercase ULIDs. Capabilities and events use lowercase ASCII letters and digits, with single internal hyphen or period separators. Topic builders reject invalid addresses. ``Address.Topic`` and ``ParseTopic`` cover device descriptor, availability, reported values, telemetry, events, commands, command batches, results, and Zigbee hub status. Subscription helpers supply the core input filters, each device's command filter, and hub status filter. The command filter includes the reserved ``$batch`` target. ``EncodeEnvelope`` and ``ParseEnvelope`` validate schema, IDs, optional UTC timestamps, and a required object payload. Unknown envelope fields, trailing JSON, unsupported schema versions, and malformed topics are errors. A receiver checks expiry against its own clock. The message ID stays unchanged on retry. Its timestamp is not the observation time. Measurements and online availability repeat at five-minute intervals. The device contact timeout is fifteen minutes. These constants do not run timers or implement publication suppression.