@startuml skinparam sequenceMessageAlign center collections "BLE broadcaster" as thingy participant "Gateway\n(Raspberry Pi)" as gw participant "MQTT Broker\n(RabbitMQ)" as broker participant "Database\n(InfluxDB)" as db == Data collection == thingy -> gw : BLE advertising packet alt company_id != 0xffff gw -> gw : discard packet else gw -> gw : check payload size alt payload size != 14 bytes gw -> gw : discard packet\n(non-Thingy device) else gw -> gw : decode_payload() alt unknown key in payload gw -> gw : discard packet\nlog debug else alt CO2 == 0xFFFFFFFF gw -> gw : discard CO2 value\n(sensor not ready) end alt duplicate within 10 seconds gw -> gw : discard packet\n(deduplication) else gw -> gw : add UTC timestamp gw -> broker : publish JSON\n{gateway_id}/{mac}/update broker --> gw : on_publish confirmed end end end end @enduml