Posted by lex232 on

MQTT на телефоне с IOS. Управляем умным домом в среде Arduino

MQTT на телефоне с IOS. Управляем умным домом в среде Arduino

В прошлой статье мы рассмотрели способ отправки данных на MQTT сервер и увидели данные, которые приходят в окно браузера. Но это не очень удобно, поэтому скачаем клиент на телефон и сделаем красивую оболочку с отображением температуры. Обычно все разбирают установку на Android устройство – в iOs действительно не такой богатый выбор приложений. Я попробовал несколько и остановился на IoT OnOff.

Заходим в меню Configuration – Broker. И вводим основные параметры с нашего аккаунта в cloudMqtt. Вводим Host$ порт у меня заработал только “Websockets Port (TLS only)”, а в качестве директории я указал имя, потому что все топики начинаются с имени пользователя.

Далее переходим в authentication, где нужно поменять имя пользователя и пароль. В предыдущей статье мы создавали отдельного пользователя User1 с паролем и правами, в cloudMqtt его и будем вводить в это меню.

Возвращаемся в меню настроек, теперь снизу статус должен стать зелёным, с атрибутом “connected”.

Можно перейти в меню Dashboards – это наши странички с необходимой информацией с удалённых устройств. Здесь можно удалять и добавлять индикаторы, стрелочки и т.д. Я удалил стандартные, а добавить новые можно кнопкой edit, затем кнопкой “Add” снизу.

Теперь задаём имя для нашего нового дашборда.

Как только перейдём в дашборд, сверху справа жмём edit, потом снизу слева появляется иконка с плюсом, её и нажимаем. Так можно добавить новые виджеты.

Смотрите также:  Аренда офиса

Перед нами появляется список виджетов. Мне кажется, для температуры подходит такой прогресс-бар, его и выберу.

Отредактируем созданный индикатор – ему нужно задать имя, минимальную границу отображения значения и максимальную. Также я добавил 2 знака после запятой (Decimals) и указал C, как температуру в значениях (Unit).

Переходим в самое важное меню редактирования виджета – subscribe, это путь на топик, с которого мы будем считывать информацию. Его имя, как вы помните, мы задаём в ESP8266, в среде Arduino IDE. У меня был такой путь до температуры – первые два значения легко найти в самом cloudMqtt. Первая папка – имя/ вашего аккаунта, которое присвоил сервис mqtt; вторая будет одинаковая – feeds. Этот путь легко подсмотреть во вкладке WEBSOCKET UI, в самом онлайн сервисе.

Возвращаемся в главный экран дашборда и проверяем значения – должно отобразиться текущее значение температуры.

Теперь попробуем сделать переключатель, да не простой, а умный, который подписывается на текущее значение топика, отображает состояние и позволяет его поменять. Сначала вернёмся в Arduino IDE, и сделаем новый паблишер – состояние вывода – и опрос топика. Назовём statusLed, но вместо светодиода, понятное дело, можно подключить что угодно.

Adafruit_MQTT_Publish statusLed = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/statusLed");

Далее сконфигурируем наш светодиод.

#define ACTION_LED 6            // Светодиод к 6 выводу

void setup() {
  pinMode(ACTION_LED, OUTPUT);  // Конфигурация на выход

Создадим отправку состояния светодиода для паблишера statusLed. Считывать текущее состояние светодиода будем командой digitalRead(ACTION_LED)

     // Now we can publish stuff!
  Serial.print(F("\nSending statusLed = "));
  Serial.print(digitalRead(ACTION_LED));
  Serial.print("...");
  if (! statusLed.publish(digitalRead(ACTION_LED))) {
    Serial.println(F("Failed"));
  } else {
    Serial.println(F("OK!"));
  }

Теперь немного переделаем наш дашборд в приложении iot OnOff. Добавим следующий переключатель, как на скриншоте слева.

Смотрите также:  Покричи ещё в этот старый телевизор

Обратим внимание на настройки, здесь есть интересный момент, где нужно указать какие значения переключатель считывает для отображения, а какие отправляет от пользователя. Изначально они установлены в true и false, я их для простоты обработки заменил на 0 и 1. Для чего вообще это нужно? Например, если к системе имеет доступ несколько человек, вы можете сразу увидеть текущее состояние исполнительного устройства (лампочки) и, если что, переключить его (её).

Теперь зададим имя топика в подменю subscribe – это тот путь, куда переключатель будет подписываться, т.е. на наше устройство, а оно будет отправлять статус светодиода; мы это запрограммировали выше, как statusLed. Заполняем.

Значение же, которое установил пользователь, будем отправлять также на MQTT сервер в виде топика statusClient. Желательно выключить Prefix device name, во всяком случае, у меня путь становился с ним некорректный.

Теперь создадим подписку на топик statusClient в самом устройстве.

Adafruit_MQTT_Subscribe statusClient = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/statusClient");

Для работоспособности подписки необходимо задать ещё один параметр с нашим именем.

  // Setup MQTT subscription 
  mqtt.subscribe(&statusClient);

Также потребуется задать опрос в цикле loop(), где у нас опрашивается состояние топика.

  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(5000))) {
    if (subscription == &statusClient) {
      Serial.print(F("Got: "));
      Serial.println((char *)statusClient.lastread);
    }
  }

Теперь проверим отправку состояния светодиода и получение данных с программы. Я запустил устройство, и параллельно с клиента телефона переключал свитчер.

Смотрите также:  1000pcs светодиоды

Отлично, данные плата получает, но действия никакого нет, поэтому светодиод остаётся не зажжённым, и на телефоне переключатель принимает прежнее положение, ведь устройство ему рапортует, что, мол, ничего не поменялось. Добавим действие для включения светодиода в обработчик события statusClient. Сразу после вывода в серийный порт списываем следующее условие включения светодиода.

 if (atoi((char *)statusClient.lastread) == 1) {
        digitalWrite(ACTION_LED, HIGH);        
      } else digitalWrite(ACTION_LED, LOW);

Здесь мы применили функцию atoi (ANSII To Integer) – преобразовали строковую переменную в число. Далее, сравниваем значение с 1, и если оно истинно, то включаем светодиод.

В итоге, мы разобрали основные моменты работы с MQTT протоколом, используя популярные платформы и среду программирования Arduino IDE – как получение информации с самого устройства, так и передачу данных с клиента на аппаратную часть.


Comment ( 1 )

  1. ReplyТатьяна
    Кратко, что такое openHab. Это сервер для управления умным домом с открытым исходным кодом. Разрабатывается сообществом, поддерживает управление огромным количеством устройств. Есть мобильный клиент, есть возможность управления Алексой от Amazon и ассистентом от Google. Написан на java, на базе фреймворка Eclipse SmartHome. А значит его можно установить хоть на холодильник, главное чтобы на этом холодильнике работала виртуальная машина Java. Инструкции по установке есть для Linux, Windows, Mac OS, Raspberry Pi, для различных сетевых хранилищ Synology и QNAP. Быстро пробежимся по первому варианту.