Skip to content

schema.json

Какое функциональное назначение у schema.json?

Данный файл - это контракт между конкретным экземпляром Unit и Pepeunit:

  1. Unit гарантирует, что он подпишется на все стандартные топики, указанные в input_base_topic, и все UnitNode, указанные в input_topic
  2. Unit гарантирует, что он будет публиковать данные в стандартные топики из output_base_topic, и во все UnitNode, указанные в output_topic
  3. Pepeunit гарантирует, что будет отправлять корректные форматы данных в input_base_topic, и что подпишется на все топики в output_base_topic
  4. Pepeunit гарантирует, что будет производить авторизацию для публикации и подписки на все без исключения топики, адресованные на инстанс EMQX, используемый Backend
  5. Pepeunit гарантирует, что будет подписан на все топики, соответствующие паттерну unit.example.com/+/+/+/pepeunit
  6. Pepeunit гарантирует, что подпишется на все топики с паттерном unit.example.com/+/pepeunit, у которых включен механизм DataPipe

Структура

json
{
    "input_base_topic": {
        "update/pepeunit": [
            "example.com/input_base_topic/9d0c2f4d-108e-488a-85e5-6040ef3d842a/update/pepeunit"
        ],
        "env_update/pepeunit": [
            "example.com/input_base_topic/9d0c2f4d-108e-488a-85e5-6040ef3d842a/env_update/pepeunit"
        ],
        "schema_update/pepeunit": [
            "example.com/input_base_topic/9d0c2f4d-108e-488a-85e5-6040ef3d842a/schema_update/pepeunit"
        ],
        "log_sync/pepeunit": [
            "example.com/input_base_topic/9d0c2f4d-108e-488a-85e5-6040ef3d842a/log_sync/pepeunit"
        ]
    },
    "output_base_topic": {
        "state/pepeunit": [
            "example.com/output_base_topic/9d0c2f4d-108e-488a-85e5-6040ef3d842a/state/pepeunit"
        ],
        "log/pepeunit": [
            "example.com/output_base_topic/9d0c2f4d-108e-488a-85e5-6040ef3d842a/log/pepeunit"
        ]
    },
    "input_topic": {
        "set_fan_state/pepeunit": [
            "example.com/2d98b4ba-c935-4379-8e1a-520e76018c17/pepeunit"
            "example.com/c0b107a7-9ae0-44ed-bc76-db5ff2af8887"
        ]
    },
    "output_topic": {
        "current_fan_speed_percentage/pepeunit": [
            "example.com/d76b4234-3997-4a4a-a113-6d1c21d6b84a/pepeunit"
        ],
        "current_temp/pepeunit": [
            "example.com/7279d28d-53b6-4866-99da-0b81bc1cc025/pepeunit"
        ]
    }
}

Топики можно разделить на две категории: стандартные и топики Разработчика Unit:

  • input_base_topic и output_base_topic - стандартные топики
  • input_topic и output_topic - топики Разработчика Unit

Стандарнтые топики

INFO

  1. Всегда состоят из 5 основных элементов
  2. Каждому наименованию топика в schema_example.json соответствует только один топик из EMQX:

Структура топиков в EMQX:

txt
Доменное имя инстанса / тип топика / Unit.uuid / назначение / pepeunit

Предназначены для корректной работы механизма стандартных MQTT команд и стандартных MQTT топиков состояния

Топики Разработчика

INFO

  1. Могут состоять из 2 или 3 элементов (c и без постфикса /pepeunit на конце)
  2. Для топиков без постфикса /pepeunit (состоящих из 2 элементов) нельзя настроить DataPipe

Структура топиков в EMQX:

txt
Доменное имя инстанса / UnitNode.uuid
Доменное имя инстанса / UnitNode.uuid / pepeunit

Каждый топик с такой структурой соответствует одному UnitNode

Подробнее об output_topic:

  • Предназначен, чтобы Unit мог отправлять данные в EMQX
  • Каждому output_topic из schema_example.json соответствует только один топик из EMQX
  • Unit имеет эксклюзивное право на публикацию в данные топики, ни один другой Unit опубликовать данные в них не сможет

Подробнее об input_topic:

  • Предназначен, чтобы Unit мог принимать сообщения сразу от нескольких Unit
  • Каждому input_topic из schema_example.json может соответствовать несколько топиков из EMQX
  • Система связей Output->Input позволяет Unit подписываться не только на свой Input UnitNode, а также получить значения из Output UnitNode других Unit внутри одного input_topic

Схематический пример создания связи между двумя Unitimg

Почему существуют только связи Output->Input?

В парадигме протокола MQTT в топик информацию публикует издатель, а получить информацию из топика могут подписчики. Если перенести эту логику на Pepeunit, можно сделать следующие выводы:

  • Output - топик, в который Unit может отправить данные (Unit издатель для этого топика)
  • Input - набор топиков, из которых Unit может получить данные (Unit подписчик для этих топиков)

Таким образом, когда создаётся связь Output->Input, мы говорим Unit, у которого есть Input, дополнительно подписаться этим Input на Output другого Unit. Т.е. Unit может получать в Input информацию от нескольких Output других Unit.

Если бы существовала возможность создавать связи Input->Output, то это означало бы, что Input одного Unit инициирует или влияет на Output другого Unit.