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

IoT Manager - предложения по расширению функционала

Plamen

New member
Просто из любопытства, а русский язык - ваш родной язык?
К сожалению, ни английский, ни русский. Мой болгарский язык, но я понимаю, все на русском языке извини мене почему я ползвал гоогле транслатор.

Я попытаюсь объяснить это просто:
1. У вас есть домашняя система, в которой у вас есть Пользователь 1, Пользователь 2 и Пользователь 3
2. Каждый пользователь хочет иметь разный доступ к различным устройствам для управления, пока другой пользователь не должен видеть его меню.
3. Если, как в настоящее время во главе "/YoTManager/+/config" даже ограничить в брокер каждый subtopic для каждого пользователя, они в програме все еще видят каждое меню.

Единственный способ ограничить является как я уже писал раньше, поэтому я спросил, можно направит изменить "/YoTManager" или поставить префикс "/username_YoTManager?
 

Bems

New member
На только купленной ESP-01 баловался АТ командами, после включения ноги 0 например AT+CIOWRITE=0,1 , она оставалась включенной и после передергивания питания, в IOT такого не происходит, КАКом быть ? ))
 

Victor

Administrator
Команда форума
На только купленной ESP-01 баловался АТ командами, после включения ноги 0 например AT+CIOWRITE=0,1 , она оставалась включенной и после передергивания питания, в IOT такого не происходит, КАКом быть ? ))
IoT Manager только принимает/отправляет данные на ESP8266, о сохранении состояний вы должны позаботиться самостоятельно, например так:
Код:
/********************************************************************************************\
* Save data to flash
\*********************************************************************************************/
void SaveToFlash(int index, byte* memAddress, int datasize)
{
  if (index > 33791) // Limit usable flash area to 32+1k size
  {
    return;
  }
  uint32_t _sector = ((uint32_t)&_SPIFFS_start - 0x40200000) / SPI_FLASH_SEC_SIZE;
  uint8_t* data = new uint8_t[FLASH_EEPROM_SIZE];
  int sectorOffset = index / SPI_FLASH_SEC_SIZE;
  int sectorIndex = index % SPI_FLASH_SEC_SIZE;
  uint8_t* dataIndex = data + sectorIndex;
  _sector += sectorOffset;

  // load entire sector from flash into memory
  noInterrupts();
  spi_flash_read(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast<uint32_t*>(data), FLASH_EEPROM_SIZE);
  interrupts();

  // store struct into this block
  memcpy(dataIndex, memAddress, datasize);

  noInterrupts();
  // write sector back to flash
  if (spi_flash_erase_sector(_sector) == SPI_FLASH_RESULT_OK)
    if (spi_flash_write(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast<uint32_t*>(data), FLASH_EEPROM_SIZE) == SPI_FLASH_RESULT_OK)
    {
      //Serial.println("flash save ok");
    }
  interrupts();
  delete [] data;
  String log = F("FLASH: Settings saved");
  addLog(LOG_LEVEL_INFO, log);
}


/********************************************************************************************\
* Load data from flash
\*********************************************************************************************/
void LoadFromFlash(int index, byte* memAddress, int datasize)
{
  uint32_t _sector = ((uint32_t)&_SPIFFS_start - 0x40200000) / SPI_FLASH_SEC_SIZE;
  uint8_t* data = new uint8_t[FLASH_EEPROM_SIZE];
  int sectorOffset = index / SPI_FLASH_SEC_SIZE;
  int sectorIndex = index % SPI_FLASH_SEC_SIZE;
  uint8_t* dataIndex = data + sectorIndex;
  _sector += sectorOffset;

  // load entire sector from flash into memory
  noInterrupts();
  spi_flash_read(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast<uint32_t*>(data), FLASH_EEPROM_SIZE);
  interrupts();

  // load struct from this block
  memcpy(memAddress, dataIndex, datasize);
  delete [] data;
}
 
  • Like
Реакции: Lstt

Bems

New member
Не компилируется, загрузка даты из памяти чет ошибками сияет:

C:\Users\Bems\Desktop\IoTmanagerBEMS\IoTmanager\IoTmanager.ino: In function 'void SaveToFlash(int, byte*, int)':
IoTmanager:425: error: '_SPIFFS_start' was not declared in this scope
uint32_t _sector = ((uint32_t)&_SPIFFS_start - 0x40200000) / SPI_FLASH_SEC_SIZE;
^
IoTmanager:425: error: 'SPI_FLASH_SEC_SIZE' was not declared in this scope
uint32_t _sector = ((uint32_t)&_SPIFFS_start - 0x40200000) / SPI_FLASH_SEC_SIZE;
^
IoTmanager:426: error: 'FLASH_EEPROM_SIZE' was not declared in this scope
uint8_t* data = new uint8_t[FLASH_EEPROM_SIZE];
^
IoTmanager:434: error: 'spi_flash_read' was not declared in this scope
spi_flash_read(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast<uint32_t*>(data), FLASH_EEPROM_SIZE);
^
IoTmanager:442: error: 'spi_flash_erase_sector' was not declared in this scope
if (spi_flash_erase_sector(_sector) == SPI_FLASH_RESULT_OK)
^
IoTmanager:442: error: 'SPI_FLASH_RESULT_OK' was not declared in this scope
if (spi_flash_erase_sector(_sector) == SPI_FLASH_RESULT_OK)
^
IoTmanager:443: error: 'spi_flash_write' was not declared in this scope
if (spi_flash_write(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast<uint32_t*>(data), FLASH_EEPROM_SIZE) == SPI_FLASH_RESULT_OK)
^
IoTmanager:450: error: 'LOG_LEVEL_INFO' was not declared in this scope
addLog(LOG_LEVEL_INFO, log);
^
IoTmanager:450: error: 'addLog' was not declared in this scope
addLog(LOG_LEVEL_INFO, log);
^
C:\Users\Bems\Desktop\IoTmanagerBEMS\IoTmanager\IoTmanager.ino: In function 'void LoadFromFlash(int, byte*, int)':
IoTmanager:459: error: '_SPIFFS_start' was not declared in this scope
uint32_t _sector = ((uint32_t)&_SPIFFS_start - 0x40200000) / SPI_FLASH_SEC_SIZE;
^
IoTmanager:459: error: 'SPI_FLASH_SEC_SIZE' was not declared in this scope
uint32_t _sector = ((uint32_t)&_SPIFFS_start - 0x40200000) / SPI_FLASH_SEC_SIZE;
^
IoTmanager:460: error: 'FLASH_EEPROM_SIZE' was not declared in this scope
uint8_t* data = new uint8_t[FLASH_EEPROM_SIZE];
^
IoTmanager:468: error: 'spi_flash_read' was not declared in this scope
spi_flash_read(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast<uint32_t*>(data), FLASH_EEPROM_SIZE);
^
IoTmanager:473: error: expected primary-expression at end of input
delete
^
IoTmanager:473: error: expected ';' at end of input
IoTmanager:473: error: expected '}' at end of input

exit status 1
'_SPIFFS_start' was not declared in this scope
 

Bems

New member
Ну тогда мне не светит :(, а есть программы с уже реализованной записью во флеш память ?
 

Bems

New member
Вообще почему так нагорожено, что нельзя написать простой скрипт IF ON (кнопа) - TO выполняем - посылаем АТ команду(AT+CIOWRITE=0,1) по URL адресу, чисто логически должно быть простейшее решение отправить команду за тридевять земель (по локалке меня все устраивало, из-за передачи по интернету и визуализации установил IOT Manager). Было легко получить результат на стоковой прошивке - зачем стало сложнее в разы, только из-за возможности передачи по интернету? Посоветуйте еще прошивки IOT .
 

dao89

New member
Я писал на форуме об прошивке ESPLink и о том, что хочу при помощи неё и, вероятно, IOT Manager управлять своим умным домом. И вот сегодня я установил IoT Manager на телефон и понял, что IoT Manager поддерживает только WebSockets, а ESP-Link наоборот, только протокол MQTT. Надеюсь поддержка MQTT появится, а пока придется искать другие варианты... К сожалению, москито тоже не поддерживает одновременную работу и с протоколом websockets и с mqtt, нужно выбрать что-то одно в конфигурации.
 

Victor

Administrator
Команда форума
придется искать другие варианты...
это не проблема, главное в этом случае чтобы брокер поддерживал и MQTT и MQTT через WebSockets - именно так устроены все Arduino примеры IoT Manager (библиотеки PubSubClient тоже могут только по MQTT подключаться)
Кроме того, даже если брокер не поддерживает WebSockets, то можно использовать MQTT proxy и через него по Websockets подключаться к брокеру из приложения, а устройства будут подключаться напрямую к брокеру без прокси.

UPD
MQTT WebSockets proxy в одной строке
Simple WebSockets Proxy for a MQTT broker · GitHub
 

dao89

New member
@Victor не до конца понял. Брокер Москито у меня установлен на рутере с openWRT, он умеет и websockets и mqtt, но не одновременно, нужно выбрать что-то одно. Прошивка ESP-link, которую я использую, умеет подключаться к брокеру только через mqtt, а ваше приложение только через websockets. Выставляю Websockets - выше приложение подключается к нему, но ESPlink не может, выставляю в брокере MQTT - ESPLink (esp8266 к которой подключена arduino pro mini) подключается, но IoT Manager - нет. Вот и получается несостыковочка. Т.е. в моем случае только MQTT proxy спасёт?
Поиск в сети на скорую руку про MQTT proxy ничего вразумительного не дал. Подскажите где про это почитать.
P.S. Прочитал ваш UPD, изучаю... Жаль, конечно, что без этой лишней прослойки не выйдет. Было бы отлично, если бы IoT Manager поддерживал оба протокола.
 
Последнее редактирование:

Victor

Administrator
Команда форума
на роутере с openWRT
да вроде должно 2 порта работать и на OpenWRT - смотрите раздел [inline]Extra listener[/inline] в [inline]mosquitto.conf[/inline]
если не получится, то отпишитесь и я у себя на OpenWRT попробую.
На RaspberriPi у меня была проблема в том, что mosquitto был собран без поддержки WebSockets - пришлось пересобирать из исходников, а у вас, как я понял, этой проблемы нет, так что все должно быть ок
 

Victor

Administrator
Команда форума
Думаю это не проблема, ведь ресурсов у современных телефонах столько, сколько домашним рутерам и всяким esp8266 и не снилось...
Проблема в том, что IoT Manager не нативное приложение, а HTML5, которое работает через WebView, т.е. фактически, браузер. А браузерам запрещено подключаться по TCP/IP напрямую, без WebSockets. Нужно писать нативный Cordova плагин, чтобы появилась поддержка MQTT (готовых и реально работающих пока нет). Это вполне решаемая для меня задача, но времени пока не хватает чтобы за нее взяться.
 

dao89

New member
@Victor "Extra listener" я, действительно, проглядел. Сейчас попробовал - работает одновременно и websocket и обычный mqtt. Выходит, поддержка IoTmanager только websockets для меня не проблема. Спасибо за подсказку! Буду разбираться дальше.
 

dao89

New member
Я конечно расстроился, когда понял, что IoTmanager настраивается только исполнительными устройствами (в моём случае - это pro mini). Когда поглядел примеры - расстроился ещё больше - очень уж громоздко и совсем не лаконично это всё выходит. Совсем не хочется пихать весь этот код в ардуину. И blynk с mqtt, как я понял, не дружит...
Плохо, что документации на IoTmanager нет. Как я понял, в качестве документации - примеры для Arduino IDE, но хотелось бы описания работы (что нужно опубликовать через mqtt, чтобы что-то появилось в приложении и т.д.) не привязанного к примерам.
 

Victor

Administrator
Команда форума
Я конечно расстроился, когда понял, что IoTmanager настраивается только исполнительными устройствами (в моём случае - это pro mini)
а вот это как раз фича :)
Плохо, что документации на IoTmanager нет.
Есть. В самом приложении смотрите в меню "Виджеты"
очень уж громоздко и совсем не лаконично это всё выходит
С ArduinoJSON вроде вполне читабельно, а то что не лаконично - упор при разработке был на гибкость, поэтому пришлось выбирать между простотой и степенью кастомизации виджетов - победила последняя
 

Plamen

New member
Просто из любопытства, когда IoTmanager подключается впервые почему есть надо представить HELO. Может ли это просто быть пользовать IDS?
Ето сократит начальная инициализация.
 
Последнее редактирование:

nekitoss

New member
ок, добавил в шапку :)
Я представляю себе это как расширение функционала виджета [inline]simple-btn[/inline] - нажал на кнопку виджета и вылетело popup окно с полем для ввода (как сейчас подтверждение нажатия сделано, только там вопрос да-нет)
Вы приведите примеры для ситуаций где это требуется, чтобы у нас было полное взаимопонимание :)
Огромное спасибо автору за разработку чудесного приложения!, благодарность была отправлена ранее в копилку, и еще будет. Особенно радует отзывчивость и внимание к пользователям!
Я также "за" отправку текста. Пример: где-то видел, что пользователь хотел регулировать температуру, ему предложили толи ползунком толи кнопками. Только вот кнопками как-то неудобно... Тут весьма бы пригодился данный функционал. Ввел цифру и отправил. С другой стороны - можно ошибиться при вводе и надо ставить проверку в коде.

Если уж совсем губу раскатать - было бы неплохо иметь возможность задавать тип поля ввода - текст или цифры. Сразу задумался - а как тогда передать число с запятой? Парсер вешать в коде?
Не знаю возможно ли это, но вероятно могло бы быть полезным задавать оставлять или нет в поле введенную информацию перед следующим вводом и/или возврат(передача) данных в текстовое поле. Хотя нет, возможно popup вызванный устройством будет более полезен. Например: вводит пользователь 100 градусов, а ему вылазит окошко "ты, что, поджарить себя вздумал?!"
Впринципе это можно реальзовать кнопкой ввода+anydata, но мне кажется, что кнопка не будет очевидной для ввода. Разве что сделать кнопку на всю ширину, которая содержит картинку поля ввода - пользователь нажимает на псевдо поле ввода, а ему вылазит popup с вводом.
Еще весьма интересный вариант использования - система защиты. К примеру у меня планшет будет висеть в коридоре на стенке (кстати, пожалуйста добавьте опцию не тушить экран устройства, а только "меркнуть") в качестве панели умного дома. Предположим что у меня есть дети, которым доступ не желателен к управлению бойлером. В таком случае я бы с устройства сначала отобразил поле ввода пароля, если он верен - поле исчезает, появляются настройки бойлера. Или popup пароля при применении критических параметров. Аналогично, если хватит памяти, можно сделать разделение на пользователей на одном планшете - сначала вводится логин(имя) или пароль, а в зависимости от него - различный список настроек. Останется доделать кнопку смены пользователя.

Я только недавно начал разбираться, но как я понимаю, нет возможности задавать цвет фона (не элемента, а background), к примеру для фона вкладки\каждой вкладки? Если нет, то подскажите пожалуйста точный цвет фона, чтобы я мог скрыть неактивные сегменты value, ведь, если я верно понял цвета не поддерживают прозрачность?

Еще возникла мысль о выпадающем списке - полезен, когда есть больше двух фиксиированных вариантов, чтобы не размножать кнопки. Полученный результат в коде case-ом проверять, но при этом кейсы должны быть удобоваримы, к примеру если два выпадающих будут возвращать 1-2-3 каждый, то это не понятно "а что там у меня под №1 было?" и не задефайнишь особо... Можно сделать два параметра - "текущий статус" и "прочитано". Обрабатываем текущий статус кейсом, если не прочитано и сбрасываем флаг прочитано. Не уверен, насколько это востребованно...

Так же пока не ясно, как реализовать работу по расписанию или по таймеру. Может оказаться полезным для того-же бойлера. Но при мысли вешать на каждый esp по RTC - жаба давит, ведь планшет - то и часы имеет и синхронизацию времени... Возможно тут как раз будет полезна передача текста и бессоница для планшета. Задать время, через которое произойдет событие можно передав миллисы через которые выполнить, но если в критическом устройстве включен вотчдог - событие может не произойти... Поэтому возможно имеет смыл сделать виджет передачи времени на устройство, с задаваемой частотой передачи. А частоту менять по приближению к назначенному времени. Хотя вспоминая и учитывая как падает брокер, отваливается esp от вайфай и возможности исчезновения инета - эта идея выглядит не очень....

Также задумался над тем, чтобы написать очень-очень подробные посты-гайды. Но пока сам еще не со всем разобрался, да и тоже работаю, к тому же с обьяснениями у меня всегда плохо было.
Но с другой стороны, я плотно занимаюсь ардуинами (пусть и не на высоком уровне) на работе - создаю квест-комнаты, поэтому приучился думать о пользователе, гибкости, простоте и модульности-универсальности... Это может обьяснить странный ход мыслей, никого обижать не помышляю...
 
Последнее редактирование:

KAlexK

New member
@nekitoss
Мне кажется, контроль доступа, если он нужен, лучше возложить на штатные средства планшета - блокировка экрана с этим справится.

А про расписание я присоединяюсь. В принципе, на esp8266 можно использовать библиотеку time и синхронизировать периодически по NTP (то есть нет особой необходимости во внешнем RTC), но поддержка расписания на IoT Manager могла бы добавить такую функциональность устройствам, лишенным часов в принципе. Но ИМХО достаточно простой реализации, без премудростей, так сказать для некритичных вещей. Где-нибудь в продвинутых настройках предусмотреть для каждого виджета смену состояния по расписанию. Но для этого, как я понимаю, нужно еще фоновую службу создавать...
 
Сверху Снизу