• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

IoT Manager - сообщаем о багах

Mоnk

Member
@Victor,
А можно ли в скетче №2 (новом) вместо, или вместе с
if (WiFi.status() == WL_CONNECTED)
пинговать какой либо ресурс в сети, чтобы устройство понимало, что интернет доступен, и можно работать с облаком.
Эксперименты показали, что при пропадании мобильного интернета (думаю что и с проводным то же самое), программа видит ВиФи от роутера, пытается обмениваться информацией, не получает ответ, и жутко тормозит.
 

Mоnk

Member
И как установить IoT Manager на 6-ю иОС? Валяется 3-й аЙфон без дела...
 

Victor

Administrator
Команда форума
пинговать какой либо ресурс в сети, чтобы устройство понимало, что интернет доступен, и можно работать с облаком.
лучше проверять коннект с брокером, поставить счетчик на неудачный коннект и перезапускать ESP после 3 неудач. Но ваш вариант тоже можно сделать, хотя кода будет больше
И как установить IoT Manager на 6-ю иОС? Валяется 3-й аЙфон без дела...
минимум iOS 7 требуется IoT-Manager on the App Store и поддерживатеся только WebSockets
 

Victor

Administrator
Команда форума
кстати тормоза вполне могут быть из-за таймаутов в DNS, поэтому попробуйте по IP адресам сделать
 

Mоnk

Member
Не, не помогло. Ping сам по себе тормозит. Секунд от трёх до шести. Вычеркиваем.
 

Uhma

New member
можно в новой версии сделать, чтобы еще парсились и конфиги из /IoTmanager/device/sensor/config тогда проблема будет решена вроде.
То есть Вы предлагаете создать еще один топик с единым конфигом для всех виджитов или подтопики с кучей конфигов при этом оставив и текущий вариант с последовательным обменом конфигами дабы не потерять совместимость ? Мне кажется это какие то костыли получаются, если не затруднить опишите идею поподробней , а также почему не нравится вариант с сохранением конфига в андройд приложении ? это же логичней ,кому надо поставил галку сохранить и не обновлять конфиги, кому не надо пусть грузит каждый раз, хотя к чему вообще их каждый раз грузить , только лишний раз интерфейс перерисовывать при неудачной случайной прокрутки экрана в низ (кто то ранее уже высказывал недовольство по этому поводу), это же нужно только на этапе отладки и построения системы, я бы вообще вынес функцию получения конфигурации от устройств отдельной кнопкой куда нибудь в настройки.
 

Victor

Administrator
Команда форума
То есть Вы предлагаете создать еще один топик с единым конфигом для всех виджитов или подтопики с кучей конфигов при этом оставив и текущий вариант с последовательным обменом конфигами дабы не потерять совместимость ?
да, подтопики. т.е. сейчас мы используем [inline]/IoTmanager/+/+/status[/inline] и [inline]/IoTmanager/+/+/control[/inline] и добавляем [inline]/IoTmanager/+/+/config[/inline], т.е. отдельный конфиг для каждого виджета в свой топик - тогда без проблем можно будет отправлять конфиги с retain флагом. Добавить это в код - пара пустяков. При этом по-старому тоже будет работать.
Вариант с сохранением тоже возможен, но кода существенно больше (сейчас все операции завязаны на прием конфига - придется пересматривать всю логику работы, а это и отладка и возможные глюки)
только лишний раз интерфейс перерисовывать при неудачной случайной прокрутки экрана в низ (кто то ранее уже высказывал недовольство по этому поводу)
в настройках просто отключите [inline]pull to refresh[/inline]
я бы вообще вынес функцию получения конфигурации от устройств отдельной кнопкой куда нибудь в настройки
я вас понимаю, но и вы поймите: сколько людей - столько и мнений. То, что нравится одним - может не понравится другим. Поэтому я стараюсь не изменять сути существующей логики, а расширять возможности без потери совместимости. Поэтому посмотрите в сторону профилей - это средство было сделано как раз для того, чтобы не отправлять конфиги с девайсов вообще. Рисование интерфейса на телефоне как в Blynk мне было всегда не по душе, поэтому есть внешний загружальщик JSON файлов, которые можно поправить в любом текстовом редакторе. Идея в том, что со временем сделать онлайн визуальный редактор виджетов, возможность поделиться виджетами с другими пользователями и т.д.
Сейчас на профили к сожалению нет документации (только краткая инструкция на английском), но это связано большей частью с тем, что русскоязычная часть пользователей не сильно рвется стать тестировщиками новых функций и большая часть моего общения с пользователями происходит по почте на английском. Если бы тестирование и обсуждение новых функций происходило здесь на форуме, то это бы сняло часть вопросов по функционированию новых фич.
 

Uhma

New member
Ваша идея понятна, я то как раз и предлагаю максимально полностью сохранить текущую логику работы и протокол обмена именно с точки зрения написания скетчей, так как для тех кому эта функция не нужна просто не будут ей пользоватся ивсе останется как было, Вы же предлагаете создать два варианта отправки конфигирации ,что создаст лишнюю путаницу и добавит глючности.
Закрытасть и ограниченость Blynk мне тоже не по душе, именно за широту возможности и гибкость я для своих поделок выбрал IoT Manager , а вот изучение JSON сильно повышает планку вхождения в проект для новичков и уж совсем не входило в мои планы...
Честно говоря как использовать профили я не понял вообще, было бы описание на русском хотя бы принцип без подробностей ,не как создать и применить , а именно сам механизм.
Идея в том, что со временем сделать онлайн визуальный редактор виджетов, возможность поделиться виджетами с другими пользователями и т.д.
Это отличная идея !
 

Victor

Administrator
Команда форума
изучение JSON сильно повышает планку вхождения в проект для новичков
да не, там все предельно просто (уж попроще Arduino JSON это точно)
вот виджет в JSON в профайле
Код:
[{
    "name": "My home",
    "id": 1,
    "pages": [{
        "pageId": 1,
        "pageName": "Kitchen"
    }],
    "widgets": [{
        "descr": "Temp",
        "id": 1,
        "idx": 100,
        "pageId": 1,
        "widget": "anydata",
        "topic": "domoticz/out",
        "class1": "item no-border",
        "style2": "font-size:20px;float:left",
        "style3": "font-size:40px;font-weight:bold;float:right"
    }],
    "active": true
}]
это и есть JSON, а именно такие конфиги вы и собираете в скетчах, только приходится высчитывать кавычки и т.д., т.к. в Arduino это делать неудобно.
А тут редактируем обычный файл в любом текстовом редакторе.
Есть еще такое такое решение легкого конструирования конфигов. Идея была как раз снизить порог вхождения в тему.

Рассказываю про профайлы.
Изначально тоже была идея снизить порог вхождения, чтобы IoT Manager можно было использовать вообще без программирования. Оказалось вполне такое возможно. Есть такая прошивка ESPEasy (позволяет подключить кучу разных сенсоров прямо через свой веб интерфейс - скетчи править не надо)
И хотим отображать данные с устройств, которые шлют в MQTT одно сообщение (например, температуру) и нельзя настроить логику отправки конфига по HELLO. (это не только ESPEasy, а любой сенсор, совместимый с Domoticz)

Берем за основу протокол DomoticzMQTT, смысл которого заключается в отправке сообщений вида [inline]{"idx":100, "svalue": 22}[/inline] в топик [inline]domoticz/in[/inline], IoT Manager подписывается на этот топик и перехватывает сообщения. Теперь нужно эти данные оформить в виджет. Можно конфиг заранее загрузить "со стороны". Вот profiler именно это и делает: отправляет через MQTT в IoT Manager конфиги наших виджетов. IoT Manager их хранит, между ними можно переключаться (активировать один или несколько профилей). Т.е. профиль это набор виджетов, которые мы прорисовываем при старте, а когда прилетят данные, то вставляем их в виджет в соответствии с заданным в конфиге оформлением. Т.е. вы можете отправлять профиль и вручную через любой MQTT клиент, но profiler проверяет валидность конфига и освобождает от ручных операций. У меня есть один пользователь из Испании, который написал для себя в несколько строчек утилиту на python, которая делает почти тоже самое (только не проверяет вроде)
А сами файлы конфигов вы делаете в любом текстовом редакторе (я делаю в Sublime Text 3 - он раскрашивает и выравнивает для красоты и читабельности).

Вот и предлагаю: раз механизм хранения конфигов уже есть в IoT Manager (с включением/выключение групп виджетов, т.е. профилей), то попробуйте его использовать
 
  • Like
Реакции: Uhma

Victor

Administrator
Команда форума
@Uhma, оказывается Gerardo Vaquerizo Fernandez тоже читает наш форум и предложил мне попробовать убедить вас использовать профили :)
Кстати, Gerardo Vaquerizo Fernandez является автором переводов IoT Manager на испанский и немецкий.
Привожу текст его письма целиком (легко переводится в Google Translate, если вы не хотите читать на английском) и скрипт на python, который он прислал
Victor,

I'm reading your efforts to convince Uhma on using profiles...

First of all. You can use a tool in Google Chrome (chrome-extension) to make JSON more user friendly...
It seems it is done with this tool: Ace - The High Performance Code Editor for the Web
JSON Editor Online - view, edit and format JSON online

JSON Editor

I am going to recheck and finish "iotManagerProfiler.py":
gerardo@RbPiGVF1 ~/bin $ iotManagerProfiler.py -s profiles/example1.json
Setting profile...
Proloader: file 'profiles/example1.json' loaded successfully
Connected with result code 0
on_connect(). Subscribing to '/IoTmanager1/exchange/output'
on_message_set(). Received topic '/IoTmanager1/exchange/output' with payload '{"result":200}':
Proloader: incoming message from /IoTmanager1/exchange/output
Proloader: received answer message, found no errors
Proloader: success.

gerardo@RbPiGVF1 ~/bin $ iotManagerProfiler.py -s profiles/example2.json
Setting profile...
Proloader: file 'profiles/example2.json' loaded successfully
Connected with result code 0
on_connect(). Subscribing to '/IoTmanager1/exchange/output'
on_message_set(). Received topic '/IoTmanager1/exchange/output' with payload '{"result":200}':
Proloader: incoming message from /IoTmanager1/exchange/output
Proloader: received answer message, found no errors
Proloader: success.


Regards from Spain,
Gerardo
 

Вложения

Uhma

New member
Виктор, благодарю за столь развернутый и подробный ответ, похоже действительно профили это то что мне нужно, к сожалению запустить оба iotManagerProfilerа не удалось , хотя я установил node-v6.9.1 и python-3.5.2. (вылетают с ошибкой).
Попробовал в ручную отправить строку конфига типа :{"id":"1","page":"ADC","descr":"COUNT","widget":"small-badge","topic":"/IoTmanager/dev01 ESP8266 test/COUNT","badge":"badge-balanced"} в топик /IoTmanager/exchange/output или domoticz/in, так IoT Manager ругается "Bad data from Domoticz" или не реагирует , подскажите последовательность действий для ручной загрузки профиля и пример простейшего рабочего профиля в виде строки для отправки на MQTT.
 

Victor

Administrator
Команда форума
подскажите последовательность действий
может я вам помогу profiler запустить - это будет намного проще, чем вручную, уж поверьте...

1. скачиваем с гитхаба zip https://github.com/4refr0nt/iot-manager-profiler/archive/master.zip и распаковываем в корень диска C
2. запускаем Пуск - Программы - Выполнить cmd.exe
3. в командной строке вводим [inline]cd \iot-manager-profiler-master [/inline]
4. затем [inline]npm i[/inline] - тут пройдет какое-то время (скачивает нужные пакеты)
5. в любом текстовом редакторе открываете [inline]config.js[/inline] из папки [inline]iot-manager-profiler-master[/inline] и заполняете своими данными host, port, username, password (теми же, что прописаны в IoT Manager)
6. Загрузим [inline]example1.json[/inline] в IoT Manager (IoT Manager должен быть запущен на телефоне, подключен к брокеру и быть на переднем плане) вводим команду [inline]node main.js -c ./config -s ./profiles/example1.json[/inline]
7. На телефоне должно выйти предупреждение о том, что мы загружаем профили из внешнего источника (другие сохраненные профили перезапишутся), мы жмем YES
8. Профили загружены (1 профиль и в нем 1 виджет), переходим на главную
9. Вручную с компьютера отправьте в топик [inline]domoticz/in[/inline] следующие данные [inline]{ "idx": 100, "svalue": 10}[/inline] или прошейте ESPEasy добавьте любой датчик и присвойте ему [inline]idx[/inline] [inline]100[/inline].
 
  • Like
Реакции: Uhma

Uhma

New member
Еще раз огромное спасибо, все получилось. Я просто не думал что это все с командной строки работает, надеялся что есть какая то оболочка, уж больно хотелось скорее увидеть какой то результат , теперь буду вникать.
 

Mоnk

Member
Недостаточное знание предмета очень угнетает.
Продолжаем борьбу с зависанием в отсутсвии интернета.
Перенес кусок кода
Код:
  if (WiFi.status() == WL_CONNECTED)
  {
      lcd.setCursor(23, 0);
      lcd.write(244);

    if (!client.connected())
    {
      bool success;
      if (mqttuser.length() > 0)
      {
        success = client.connect( MQTT::Connect( deviceId ).set_auth(mqttuser, mqttpass) );
      }
      else
      {
        success = client.connect( deviceId );
      }
      if (success)
      {
        pubConfig();
        client.set_callback(onMessageArrived);

        client.subscribe(prefix);                 // for receiving HELLO messages
        client.subscribe(prefix + "/ids");        // for receiving IDS  messages
        client.subscribe(prefix + "/" + deviceId + "/+/control");   // for receiving GPIO control messages for ALL widgets
      }
      else
      {
        delay(300);
      }
    }

    if (client.connected())
    {
      if (needPubConfig)
      {
        pubConfig();
      }

  yield();

      if (needControlGPIO)
      {
        controlGPIO();
      }

  // ========================== publish =============================

        client.publish(sTopic[3] + "/status", "{\"status\":\"" + String(analogRead(pin[3]) * 0.09765625)+ " %\"}" );  // widget 3
        client.publish(sTopic[4] + "/status", "{\"status\":\"" + DHT22_tS + " °C\"}" );         // widget 4
        client.publish(sTopic[5] + "/status", "{\"status\":\"" + DHT22_hS + "  %\"}" );         // widget 5
        check_sT6();

      client.loop();
    }
  }
  else
  {
      lcd.setCursor(23, 0);
      lcd.write(16);
  }
из loop() в отдельную функцию, которая запускается раз в 10 секунд. В промежутках между работой client.loop(); (где то прочитал, что она еще и облако попутно пингует) появилась возможность в отсутствии интернета при подключенном ВиФи управлять ЕСПэшкой с помощью подключенных к ней кнопок.
Скажите, а в "рабочем" скетче №2 функция
Код:
// send confirmation
void pubStatus(String t, String payload)
{
    if (client.publish(t + "/status", payload))
    {
       //Serial.println("Publish new status for " + t + ", value: " + payload);
    }
    else
    {
       //Serial.println("Publish new status for " + t + " FAIL!");
    }
  delay(PUB_DELAY);
}
нужна?
 

Uhma

New member
Однако профили не решили задачу, все уперлось в другое ограничение ( профильные виджиты работают только с одним входящим топиком domoticz/in и получить несколько значений с retain флагом не могут ),какая то ущербная схема.
Возможность прописывать в профильных настройках еще и входящий топик решило бы проблему.
Или же я в чем то не разобрался:(?
можно в новой версии сделать, чтобы еще парсились и конфиги из /IoTmanager/device/sensor/config тогда проблема будет решена вроде.
Вот эту бы эту функцию в профили добавить.
И вообще зачем было профили так жестко привязывать к формату domoticz ?
 

Victor

Administrator
Команда форума
Скажите, а в "рабочем" скетче №2 функция нужна?
Не совсем понял ваш вопрос. Если в коде есть ее вызов, то нужна, а если вызовов нет, значит можно и без нее :)
И вообще зачем было профили так жестко привязывать к формату domoticz ?
чтобы снизить порог "вхождения в тему" - берем любое Domoticz-совместимое решение и получаем данные на телефоне.
Давайте вместе сформулируем что нужно и я это запилю в следующей версии. Пока предварительно 2 варианта:
1. Добавить подписку на [inline]/IoTmanager/device/sensor/config[/inline] в существующий протокол (на мой взгляд вполне норм решение)
2. В профили добавить возможность указывать топик (мне это решение пока нравится меньше, т.к. у нативного MQTT клиента пока много недоработок и подписка/отписка на топики - одна из них, с WebScokets клиентом все ок)
Ну и совместно давайте сделаем пример с [inline]deep sleep[/inline]
 

Uhma

New member
Не понимаю, что такое "нативный клиент", проблем с подпиской/отпиской вроде пока не замечал.
Меня как бы устроит любой вариант, хотя и не совсем понимаю алгоритма первого варианта решения, и как при этом будет обеспечена совместимость со старым протоколом. Могу предположить что , при первичном включении андройд обменяется с esp конфигами по старинке по HELLO и в соответствии с полученными данными подпишется на дополнительные топики /IoTmanager/+/+/config , далее будет их парсить , так?
Получается как то сложно выполнимо если учесть , что обмен будет сильно разнесен по времени и первичное включение надо делать с обоими устройствами в сети и потом как то отличать эти состояния, пробуждение из сна ESP это по сути перезагрузка. Так же и со стороны андройда , он же не помнит на какие дополнительные подтопики ему надо подписаться, значит тоже надо хранить на брокере ,это еще один топик со списком сенсоров делать или какую то особую команду?
Вариант с профилем решил бы эту проблему проще так как заранее будет известно какие топики парсить , и это ни как не нарушит работу с domoticz.
Я предлагаю добавит в профиль возможность указывать входящий и исходящий топик для каждого виджета , если к примеру не указывать то по умолчанию будет стандартно для domoticz.
А в идеале хорошо бы если допустим в профиле не указывать параметр "idx" то этот виджет работает в формате команд IoTmanager ( status ,control) соответственно прописываем только родительский топик /IoTmanager/+/+/ ,a если указать то в формате domoticz со всеми вытекающими, как Вам такой вариант?
Ну и совместно давайте сделаем пример с deep sleep
Я как бы Ваши примеры пока ковыряю, да и в конце кода добавить [ ESP.deepSleep(600*1000000); // секунды*1000000] и кинуть перемычку с GPIO16 на RST думаю каждый и без примеров сможет.
К тому же в режимах WAKE_RF_DEFAULT, WAKE_RFCAL, WAKE_NO_RFCAL, WAKE_RF_DISABLED я еще не разобрался.
 
Сверху Снизу