You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
6.0 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Взаимодействие через MQTT
Помимо приложения, с устройством можно взаимодействовать через MQTT, в том числе интегрировать в систему умного дома:
- [WQTT](https://www.wqtt.ru/) - MQTT брокер + панель управления + навык для Алисы
- [Домовёнок Кузя](https://alexstar.ru/) - панель управления + навык для Алисы
- И некоторые другие
## Топики и обозначения
Посмотреть все топики устройства можно во вкладке **Инфо** приложения. Здесь используются обозначения:
- `net` - имя сети
- `device_id` - id устройства. Генерируется библиотекой (или задаётся вручную)
- `client_id` - id клиента. В приложении генерируется автоматически, а для запросов через MQTT его нужно указать вручную. Можно просто написать *mqtt*. Можно придумать что то более сложное для безопасности, если в программе идёт ручная обработка запросов Request и проверка соответствия ID клиента.
- `name` - имя виджета
## Топики для отправки
### Установка значения
Отправить новое значение (в **payload**) для виджета можно на топик:
`net`/`device_id`/`client_id`/set/`name`
### Запрос чтения
Для запроса значения нужно отправить **пустое** сообщение на топик:
`net`/`device_id`/`client_id`/read/`name`
Получив это сообщение, устройство ответит текущим значением на get-топик, значение виджета будет прочитано в билдере.
## Топики для подписки
### Получение значений (get-топик)
Для получения значений с виджета нужно подписаться на топик:
`net`/hub/`device_id`/get/`name`
### Получение состояния
Для получения состояний устройства (включено/выключено) нужно подписаться на топик:
`net`/hub/`device_id`/status
Устройство отправит `online` при выходе на связь и `offline` при потере.
## Отправка с устройства
### Напрямую
В библиотеке есть метод `sendGet()`, отправляет значение указанного имени на get-топик:
```cpp
sendGet(AnyText name, AnyValue value);
sendGet(AnyText name, double value, uint8_t dec);
```
### Из билдера
Если нужно отправить значение с виджета - можно использовать `sendGet(AnyText name)`. Функция вызовет билдер, прочитает значение с виджета и отправит на get-топик. Можно передать несколько имён виджетов списком через `;`.
Также есть "невидимый" виджет, который нужен только для привязки переменной к имени виджета: он не отображается в ПУ, но может отправлять и получать значения по MQTT.
### Авто get
Можно автоматически отправлять новое состояние на get-топик при изменении из приложения или MQTT set - `sendGetAuto(bool state)`. По умолчанию функция отключена.
### Состояние
Для отправки состояния вручную нужно вызвать `sendStatus(bool state)`.
## Пример
```cpp
uint8_t bright;
float temp;
void build(gh::Builder& b) {
// реальный виджет
if (b.Slider_("bright", &bright).click()) {
Serial.print("bright set to: ");
Serial.println(b.build.value);
}
// dummy виджет температуры
b.Dummy_("temp", &temp);
// по нажатию на кнопку отправить температуру в mqtt
if (b.Button().click()) hub.sendGet("temp", 123.45, 2);
}
void setup() {
// ..........
hub.sendGetAuto(true); // для отправки в mqtt при действиях с приложения
}
void loop() {
hub.tick();
// раз в 5 секунд отправлять значение виджета temp
static gh::Timer tmr(5000);
if (tmr) {
// задать случайное значение
temp = random(100) / 10.0;
// отправить из билдера
hub.sendGet("temp");
}
}
```
Например в wqtt добавляю новое устройство **Лампочка**.
Добавляю **Органы управления**, **Яркость**:
- Топик управления: `MyDevices/cb5bf63a/mqtt/set/bright`
- Топик состояния: `MyDevices/hub/cb5bf63a/get/bright`
Добавляю **Датчик**, **Температура**:
- Топик: `MyDevices/hub/cb5bf63a/get/temp`
Настройки LWT:
- LWT Topic: `MyDevices/hub/cb5bf63a/status`
- LWT Online Message: `online`
Теперь установленная яркость прилетает в `bright`, ползунок яркости в приложении GyverHub и в wqtt двигаются синхронно. Каждые 5 секунд отправляется случайная температура из билдера dummy. По нажатию на кнопку отправляется фиксированная температура, в качестве примера.