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

IoT Manager iOS не подключается к брокеру

rapidshe

Member
а как поставить три виджета в ряд?
нашел в описаниях
Код:
{
  "id"     : 1,
  "widget" : "gauge",
  "topic"  : prefix + "/" + deviceID + "/gauge1",
  "class1" : "text-center col-xs-4 no-padding-left no-padding-right",
}
но как только не эксперементировал - ничего хорошего не получалось...

поставить в ряд хочу это:
Код:
  JsonObject& root1 = jsonBuffer.createObject();
  sTopic[2] = prefix + "/" + deviceID + "/button_on1+";
  root1["id"] = "2";
  root1["page"] = "buttons";
  root1["widget"] = "simple-btn";
  root1["class1"] = "item no-border no-padding-right";                          // class for 1st div
  root1["style1"] = "";                                        // style for 1st div
  root1["descr"]  = "";                               // text  for description
  root1["class2"] = "balanced";                                // class for description from Widgets Guide - Color classes
  root1["style2"] = "font-size:20px;float:left;padding-top:10px;font-weight:bold;"; // style for description
  root1["topic"] = sTopic[2];
  root1["class3"] = "button button-balanced icon ion-plus-round"; // class for button
  root1["style3"] = "font-size:20px; float:left;";                            // style for button
  root1.printTo(thing_config[2]);
  
JsonObject& root3 = jsonBuffer.createObject();
  sTopic[3] =  prefix + "/" + deviceID + "/Tnow1";
  root3["id"] = "3";
  root3["page"] = "second";
  root3["widget"] = "display-value";
  root3["class1"] = "item no-border";
  root3["style1"] = "",
  root3["descr"] = "";
  root3["class2"] = "assertive";
  root3["style2"] = "font-size:20px;float:left;font-weight:bold;";
  root3["topic"] = sTopic[3];
  root3["class3"] = "";
  root3["style3"] = "float:right;";
  root3["height"] = "40";
  root3["color"] = "#F10014";
  root3["inactive_color"] = "#414141";
  root3["digits_count"] = 4;
  root3.printTo(thing_config[3]);


  JsonObject& root2 = jsonBuffer.createObject();
  sTopic[4] = prefix + "/" + deviceID + "/button_on1-";
  root2["id"] = "4";
  root2["page"] = "buttons";
  root2["widget"] = "simple-btn";
  root2["class1"] = "item no-border";                          // class for 1st div
  root2["style1"] = "";                                        // style for 1st div
  root2["descr"]  = "";                               // text  for description
  root2["class2"] = "balanced";                                // class for description from Widgets Guide - Color classes
  root2["style2"] = "font-size:20px;float:left;padding-top:10px;font-weight:bold;"; // style for description
  root2["topic"] = sTopic[4];
  root2["class3"] = "button button-balanced icon ion-minus-round"; // class for button
  root2["style3"] = "font-size:20px; float:left;";                            // style for button
  root2.printTo(thing_config[4]);
 

Victor

Administrator
Команда форума
а как поставить три виджета в ряд?
Во всех трех используйте [inline]col-xs-4[/inline] без [inline]item[/inline] (если надо 2, то [inline]col-xs-6[/inline])
По [inline]col-xs-*[/inline] почитайте здесь CSS · Bootstrap
А [inline]item[/inline] - это div на всю ширину экрана
 

rapidshe

Member
Спасибо! получилось.
Но возникла проблема...
При попытке открытия 24 виджетов (6*4) утройство виснет. :)
увеличивая буфер до StaticJsonBuffer<5122> jsonBuffer; отображается только 14 виджетов. но локальный мелкий(на нем те же настройки) сервер не поднимается...

Вы совсем не планируете переносить оформление виджетов на смартфон? конечно удобно, когда сразу на телефоне всё отобразилось без настроек, но как оказалось ЕСП-12 не резиновая((


Или может у меня есть много критических ошибок?
Код:
void initVar() {
for (int n = 0; n < 5; n++)
  {
  JsonObject& root0 = jsonBuffer.createObject();
  sTopic[n*6+0] =  F("/IoTmanager/Termostat/Nothin");
  root0["id"] =  String(n*6+0);
  root0["page"] = "Стр" + String(n+1);
  root0["widget"] = F("display-value");
  root0["class1"] = F("item no-border text-center");
  root0["style1"] = F("");
  root0["descr"] = "СТРОЕНИЕ_" + String(n+1);
  root0["class2"] = F("assertive text-center");
  root0["style2"] = F("font-size:29px;float:left;font-weight:normal;padding-top:10px;font-style:oblique;");
  root0["topic"] = sTopic[n*6+0];
  root0["class3"] = F("");
  root0["style3"] = F("float:right;");
  root0["height"] = F("40");
  root0["color"] = F("#e0f100");
  root0["inactive_color"] = F("#414141");
  root0["digits_count"] = 0; 
  root0.printTo(thing_config[n*6+0]);
 
  JsonObject& root1 = jsonBuffer.createObject();
  sTopic[n*6+1] =  F("/IoTmanager/Termostat/Rmode");
  sTopic[n*6+1] +=String(n+1);
  root1["id"] = String(n*6+1);
  root1["page"] = "Стр" + String(n+1);
  root1["widget"] = F("toggle");
  root1["descr"] = F("Поддерж. температуры");
  root1["iconClass"] = F("ion-ios-flame");
  root1["iconClassOff"] = F("ion-ios-flame-outline");
  root1["iconStyle"] = F("font-size:30px;color:#4cd964;");
  root1["iconStyleOff"] = F("font-size:30px;color:red;");
  root1["descrStyle"] = F("font-size:20px;float:left;line-height:1.5em;");
  root1["class3"] = F("");
  root1["style3"] = F("float:right;");
  root1["color"] = F("orange"); // any HTML color code
  root1["topic"] = sTopic[n*6+1];
  root1.printTo(thing_config[n*6+1]);

  JsonObject& root2 = jsonBuffer.createObject();
  sTopic[n*6+2] =  "/IoTmanager/Termostat/Tnow" + String(n+1);
  root2["id"] = String(n*6+2);
  root2["page"] = "Стр" + String(n+1);
  root2["widget"] = "display-value";
  root2["class1"] = "item no-border";
  root2["style1"] = "";
  root2["descr"] = "Температура сейчас";
  root2["class2"] = "assertive";
  root2["style2"] = "font-size:20px;float:left;padding-top:10px;font-weight:normal;";
  root2["topic"] = sTopic[n*6+2];
  root2["class3"] = "";
  root2["style3"] = "float:right;";
  root2["height"] = "40";
  root2["color"] = "#e0f100";
  root2["inactive_color"] = "#414141";
  root2["digits_count"] = 5;
  root2.printTo(thing_config[n*6+2]);

  JsonObject& root3 = jsonBuffer.createObject();
  sTopic[n*6+3] = "/IoTmanager/Termostat/butminus" + String(n+1);
  root3["id"] = String(n*6+3);
  root3["page"] = "Стр" + String(n+1);
  root3["widget"] = "simple-btn";
  root3["class1"] = "col-xs-4 no-border";                          // class for 1st div
  root3["style1"] = "";                                        // style for 1st div
  root3["descr"]  = "";                               // text  for description
  root3["class2"] = "balanced";                                // class for description from Widgets Guide - Color classes
  root3["style2"] = "font-size:20px;float:left;padding-top:10px;font-weight:bold;"; // style for description
  root3["topic"] = sTopic[n*6+3];
  root3["class3"] = "button button-balanced icon ion-minus-round"; // class for button
  root3["style3"] = "font-size:20px; float:left;";                            // style for button
  root3.printTo(thing_config[n*6+3]);
      
  JsonObject& root4 = jsonBuffer.createObject();
  sTopic[n*6+4] =  "/IoTmanager/Termostat/Ttarget" + String(n+1);
  root4["id"] = String(n*6+4);
  root4["page"] = "Стр" + String(n+1);
  root4["widget"] = "display-value";
  root4["class1"] = "col-xs-4 no-border";
  root4["style1"] = "";
  root4["descr"] = "";
  root4["class2"] = "assertive";
  root4["style2"] = "font-size:20px;float:left;font-weight:bold;";
  root4["topic"] = sTopic[n*6+4];
  root4["class3"] = "";
  root4["style3"] = "float:right;";
  root4["height"] = "40";
  root4["color"] = "#F10014";
  root4["inactive_color"] = "#414141";
  root4["digits_count"] = 3;
  root4.printTo(thing_config[n*6+4]);
  JsonObject& root5 = jsonBuffer.createObject();
  sTopic[n*6+5] = "/IoTmanager/Termostat/butplus" + String(n+1);
  root5["id"] = String(n*6+5);
  root5["page"] = "Стр" + String(n+1);
  root5["widget"] = "simple-btn";
  root5["class1"] = "col-xs-4 no-border";                          // class for 1st div
  root5["style1"] = "";                                        // style for 1st div
  root5["descr"]  = "";                               // text  for description
  root5["class2"] = "balanced";                                // class for description from Widgets Guide - Color classes
  root5["style2"] = "font-size:20px;float:left;padding-top:10px;font-weight:bold;"; // style for description
  root5["topic"] = sTopic[n*6+5];
  root5["class3"] = "button button-balanced icon ion-plus-round"; // class for button
  root5["style3"] = "font-size:20px; float:left;";                            // style for button
  root5.printTo(thing_config[n*6+5]);
  }
}
 

Victor

Administrator
Команда форума

rapidshe

Member
В итоге вспомнил что мозги даны не просто так и применил свои хиленькие познания в оптимизации кода)
все статичные строки обромил в F( ) и "схитрил" с вызовом json
вдруг кому пригодится)

Код:
String json_textORvalueORbutton_thing_config(String id,String page,String widget,String class1,String style1,String descr,String class2,String style2,String Topic,String class3,String style3,String height,String color,String inactive_color,String digits_count)
{
  StaticJsonBuffer<1024> jsonBuffer;
  JsonObject& root0 = jsonBuffer.createObject();
  String returnString=F("");
  root0[F("id")] =  id;
  root0[F("page")] = page;
  root0[F("widget")] = widget;
  root0[F("class1")] = class1;
  root0[F("style1")] = style1;
  root0[F("descr")] = descr;
  root0[F("class2")] = class2;
  root0[F("style2")] = style2;
  root0[F("topic")] = Topic;
  root0[F("class3")] = class3;
  root0[F("style3")] = style3;
  if (height!= F("_")) root0[F("height")] = height;
  if (color!= F("_")) root0[F("color")] = color;
  if (inactive_color!= F("_")) root0[F("inactive_color")] = inactive_color;
  if (digits_count!= F("_")) root0[F("digits_count")] = digits_count; 
  root0.printTo(returnString);
  return(returnString); 
}

  //температура сейчас
  sTopic[n*6+2] =  F("/IoTmanager/Termostat/Tnow");
  sTopic[n*6+2] +=String(n+1);
  Topic = sTopic[n*6+2];
  page = F("Стр");
  page += String(n+1);
  descr = F("Температура сейчас");
  thing_config[n*6+2]=json_textORvalueORbutton_thing_config(String(n*6+2),page,F("display-value"),F("item no-border"),F("margin-top:-20px"),descr,F("assertive"),F("margin-bottom:-20px;font-size:20px;float:left;font-weight:normal;"),Topic,F(""),F("float:right;"),F("40"),F("#e0f100"),F("#414141"),F("5"));
 

rapidshe

Member
а есть способ быстрее загружать конфиг виджетов? 20 виджетов с периодом отправки в 200мс + тормоза интернета... короче долго попадают в приложение)
может как то за одну публикацию можно отправлять блок конфигураций? например разом 6 виджетов (у меня какраз каждый блок из 6 виджетов)

с точки зрения клиента наверное проблем нет(разве что объем данных). а вот как сделать что бы приложение правильно восприняло комок настроек...
 

Victor

Administrator
Команда форума
с периодом отправки в 200мс
эту паузу можно исключить, если ваш брокер "переварит" и смартфон справится - делайте разные задержки (вплоть до нуля) и тестируйте.
Я пробовал отправлять конфиги с QoS=1 без пауз и все ок на своем брокере через инет.
 

rapidshe

Member
эту паузу можно исключить, если ваш брокер "переварит" и смартфон справится - делайте разные задержки (вплоть до нуля) и тестируйте.
Я пробовал отправлять конфиги с QoS=1 без пауз и все ок на своем брокере через инет.
qos стоит 1(а что это вообще за параметр?)
поставил 10мс вместо 150мс. по ощущениям приложение заполняется виджетами с той же скоростью...
врятли проблема в телефоне(ифон7). да и инет сейчас проводной домашний.

наверное проблема в брокере? а у вас какой?

Вы категорически против переноса настроек в приложение?)) тогда может сделать, что б при первом включении создавалась контрольная сумма по конфигурации виджетов и отправлялась в приложение. и если контрольная сумма не совпадает(т.е. конфигурация изменилась), то загрузка конфига осуществляется. а если сопадает, то конфиг не обновляется.

В принципи со стороны ESP я и сам могу это сделать(надо только загуглить формирователь контрольной суммы), а вот хранение конфига в приложении - это уже проблема. у меня почему то на телефоне после блокировки/разблокировки происходит обновление всего поля...
 

Victor

Administrator
Команда форума
qos стоит 1(а что это вообще за параметр?)
QoS - показатель уровня качества обслуживания MQTT Essentials Part 6: Quality of Service 0, 1 & 2
наверное проблема в брокере? а у вас какой?
я пользуюсь mosquitto, установленном на выделенном сервере
Вы категорически против переноса настроек в приложение?))
я то и не против, но: 1. будет еще один blynk 2. много надо накодить и потом все это поддерживать
контрольная сумма
можно так сделать - неплохая идея. только боюсь, что это еще одно усложнение, а пользователи и так жалуются, что много всего непонятного...
 

rapidshe

Member
можно так сделать - неплохая идея. только боюсь, что это еще одно усложнение, а пользователи и так жалуются, что много всего непонятного...
признаться пару раз я хотел разбить ноут об стену)))

с контрольной суммой кажется и реализация не сложная. сначала приложение прислало последнюю сохраненную контрольную сумму вместо HELLO(или например HELLO+контрольная сумма, что бы идентифицировать HELLO в callback) и совпадает с контрольной суммой, то ESP высылет Подтверждение что всё ок и просто отсылает статусы.
 

rapidshe

Member
признаться пару раз я хотел разбить ноут об стену)))

с контрольной суммой кажется и реализация не сложная. сначала приложение прислало последнюю сохраненную контрольную сумму вместо HELLO(или например HELLO+контрольная сумма, что бы идентифицировать HELLO в callback) и совпадает с контрольной суммой, то ESP высылет Подтверждение что всё ок и просто отсылает статусы.
и в итоге кто не захочет, не будет пользоваться этой возможностью..
 

Victor

Administrator
Команда форума
HELLO+контрольная сумма
все существующие скетчи придется переделывать, т.е. при обновлении версии у всех все перестанет работать - вот тогда точно ноуты в меня полетят, а не в стену. Тут надо подумать, как и совместимость сохранить и дополнительное сообщение не посылать. К тому же непонятно как быть с несколькими устройствами - у них будут разные контрольные суммы (у каждого девайса свои)
 

rapidshe

Member
и в итоге кто не захочет, не будет пользоваться этой возможностью..

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

Но это так, ерспектива) НО даже одна контрольная сумма на весь конфиг - это будет круто.

Мне огнем горит прят) скажите, будете реализовывать это? Тогда ваш метод будет в конечном счете на голову выше схожишь приложений т.к. помимо отсутствия необходимости настраивать приложение (кроме настроек брокера), так еще не нужно будет ждать(по крайней мере каждый раз) пока всё загрузится (для меня лично проблема сделать свой сервер с москито)
 

rapidshe

Member
все существующие скетчи придется переделывать, т.е. при обновлении версии у всех все перестанет работать - вот тогда точно ноуты в меня полетят, а не в стену. Тут надо подумать, как и совместимость сохранить и дополнительное сообщение не посылать. К тому же непонятно как быть с несколькими устройствами - у них будут разные контрольные суммы (у каждого девайса свои)
ну тогда можно что б помимо HELLO присылалась контрольная сумма из другого топика. тогда скетчи переделывать не надо будет)
а вот с несколькими устройствами я хз. кстати а как происходит разделение на устройства? или просто разные топики?
т.е. вкладка page как раз и сделана для разделения устройств?

если разные топики, тогда тут и придет на помощь идея контрольной суммой для определенного блока(устройства).
 

Victor

Administrator
Команда форума
или просто разные топики?
да, по принципу префикс/девайс/сенсор
вкладка page как раз и сделана для разделения устройств?
нет, это для логического разделения по смыслу (по комнатам, например)
могу себя предложить для тестирования ios приложения)
этого недостаточно... чтобы собрать новую версию для iOS и выложить в AppStore нужен Xcode, который работает только на маке.
 

rapidshe

Member
могу себя предложить для тестирования ios приложения)
Вообще на начальной стадии очень сложно для понимания как настроить. но потом немного вникаешь в механизм, потом приходит на помощь яндекс с инфой по css и ок)
зато потом геморроя не будет. например сестре и её мужу сказал только что скачать и какие настройки брокера ввести. и всё) и не надо убивать больше получаса на настройку всех виджетов на их аппаратах.
 

rapidshe

Member
да, по принципу префикс/девайс/сенсор

нет, это для логического разделения по смыслу (по комнатам, например)

этого недостаточно... чтобы собрать новую версию для iOS и выложить в AppStore нужен Xcode, который работает только на маке.
а мак совсем не скоро появится? может тогда через виртуальную машину (погуглил, вроде рабочий вариант :))
а для выкладывания в апп стор сначала ж надо протестить) а сейчас можно и без аппстора и джейлбрека устанавливать приложенич на ios (от 9 и выше)
 
Сверху Снизу