Скрыть объявление
Управляйте вашими ESP8266 и другими устройствами прямо с телефона из любой точки мира, где есть интернет!
Подробности и обсуждение IoT Manager в этой теме. Официальный сайт приложения и документация IoTmanager.ru
Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "IoT Manager – мобильное приложение", создана пользователем rapidshe, 26 мар 2017.

  1. rapidshe

    rapidshe Новичок

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

    поставить в ряд хочу это:
    Код (Text):
    1.  
    2.   JsonObject& root1 = jsonBuffer.createObject();
    3.   sTopic[2] = prefix + "/" + deviceID + "/button_on1+";
    4.   root1["id"] = "2";
    5.   root1["page"] = "buttons";
    6.   root1["widget"] = "simple-btn";
    7.   root1["class1"] = "item no-border no-padding-right";                          // class for 1st div
    8.   root1["style1"] = "";                                        // style for 1st div
    9.   root1["descr"]  = "";                               // text  for description
    10.   root1["class2"] = "balanced";                                // class for description from Widgets Guide - Color classes
    11.   root1["style2"] = "font-size:20px;float:left;padding-top:10px;font-weight:bold;"; // style for description
    12.   root1["topic"] = sTopic[2];
    13.   root1["class3"] = "button button-balanced icon ion-plus-round"; // class for button
    14.   root1["style3"] = "font-size:20px; float:left;";                            // style for button
    15.   root1.printTo(thing_config[2]);
    16.  
    17. JsonObject& root3 = jsonBuffer.createObject();
    18.   sTopic[3] =  prefix + "/" + deviceID + "/Tnow1";
    19.   root3["id"] = "3";
    20.   root3["page"] = "second";
    21.   root3["widget"] = "display-value";
    22.   root3["class1"] = "item no-border";
    23.   root3["style1"] = "",
    24.   root3["descr"] = "";
    25.   root3["class2"] = "assertive";
    26.   root3["style2"] = "font-size:20px;float:left;font-weight:bold;";
    27.   root3["topic"] = sTopic[3];
    28.   root3["class3"] = "";
    29.   root3["style3"] = "float:right;";
    30.   root3["height"] = "40";
    31.   root3["color"] = "#F10014";
    32.   root3["inactive_color"] = "#414141";
    33.   root3["digits_count"] = 4;
    34.   root3.printTo(thing_config[3]);
    35.  
    36.  
    37.   JsonObject& root2 = jsonBuffer.createObject();
    38.   sTopic[4] = prefix + "/" + deviceID + "/button_on1-";
    39.   root2["id"] = "4";
    40.   root2["page"] = "buttons";
    41.   root2["widget"] = "simple-btn";
    42.   root2["class1"] = "item no-border";                          // class for 1st div
    43.   root2["style1"] = "";                                        // style for 1st div
    44.   root2["descr"]  = "";                               // text  for description
    45.   root2["class2"] = "balanced";                                // class for description from Widgets Guide - Color classes
    46.   root2["style2"] = "font-size:20px;float:left;padding-top:10px;font-weight:bold;"; // style for description
    47.   root2["topic"] = sTopic[4];
    48.   root2["class3"] = "button button-balanced icon ion-minus-round"; // class for button
    49.   root2["style3"] = "font-size:20px; float:left;";                            // style for button
    50.   root2.printTo(thing_config[4]);
    51.  
    52.  
     
  2. Victor

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

    Сообщения:
    2.182
    Симпатии:
    368
    Во всех трех используйте col-xs-4 без item (если надо 2, то col-xs-6)
    По col-xs-* почитайте здесь CSS · Bootstrap
    А item - это div на всю ширину экрана
     
    rapidshe нравится это.
  3. rapidshe

    rapidshe Новичок

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

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


    Или может у меня есть много критических ошибок?
    Код (Text):
    1. void initVar() {
    2. for (int n = 0; n < 5; n++)
    3.   {
    4.   JsonObject& root0 = jsonBuffer.createObject();
    5.   sTopic[n*6+0] =  F("/IoTmanager/Termostat/Nothin");
    6.   root0["id"] =  String(n*6+0);
    7.   root0["page"] = "Стр" + String(n+1);
    8.   root0["widget"] = F("display-value");
    9.   root0["class1"] = F("item no-border text-center");
    10.   root0["style1"] = F("");
    11.   root0["descr"] = "СТРОЕНИЕ_" + String(n+1);
    12.   root0["class2"] = F("assertive text-center");
    13.   root0["style2"] = F("font-size:29px;float:left;font-weight:normal;padding-top:10px;font-style:oblique;");
    14.   root0["topic"] = sTopic[n*6+0];
    15.   root0["class3"] = F("");
    16.   root0["style3"] = F("float:right;");
    17.   root0["height"] = F("40");
    18.   root0["color"] = F("#e0f100");
    19.   root0["inactive_color"] = F("#414141");
    20.   root0["digits_count"] = 0;
    21.   root0.printTo(thing_config[n*6+0]);
    22.  
    23.   JsonObject& root1 = jsonBuffer.createObject();
    24.   sTopic[n*6+1] =  F("/IoTmanager/Termostat/Rmode");
    25.   sTopic[n*6+1] +=String(n+1);
    26.   root1["id"] = String(n*6+1);
    27.   root1["page"] = "Стр" + String(n+1);
    28.   root1["widget"] = F("toggle");
    29.   root1["descr"] = F("Поддерж. температуры");
    30.   root1["iconClass"] = F("ion-ios-flame");
    31.   root1["iconClassOff"] = F("ion-ios-flame-outline");
    32.   root1["iconStyle"] = F("font-size:30px;color:#4cd964;");
    33.   root1["iconStyleOff"] = F("font-size:30px;color:red;");
    34.   root1["descrStyle"] = F("font-size:20px;float:left;line-height:1.5em;");
    35.   root1["class3"] = F("");
    36.   root1["style3"] = F("float:right;");
    37.   root1["color"] = F("orange"); // any HTML color code
    38.   root1["topic"] = sTopic[n*6+1];
    39.   root1.printTo(thing_config[n*6+1]);
    40.  
    41.   JsonObject& root2 = jsonBuffer.createObject();
    42.   sTopic[n*6+2] =  "/IoTmanager/Termostat/Tnow" + String(n+1);
    43.   root2["id"] = String(n*6+2);
    44.   root2["page"] = "Стр" + String(n+1);
    45.   root2["widget"] = "display-value";
    46.   root2["class1"] = "item no-border";
    47.   root2["style1"] = "";
    48.   root2["descr"] = "Температура сейчас";
    49.   root2["class2"] = "assertive";
    50.   root2["style2"] = "font-size:20px;float:left;padding-top:10px;font-weight:normal;";
    51.   root2["topic"] = sTopic[n*6+2];
    52.   root2["class3"] = "";
    53.   root2["style3"] = "float:right;";
    54.   root2["height"] = "40";
    55.   root2["color"] = "#e0f100";
    56.   root2["inactive_color"] = "#414141";
    57.   root2["digits_count"] = 5;
    58.   root2.printTo(thing_config[n*6+2]);
    59.  
    60.   JsonObject& root3 = jsonBuffer.createObject();
    61.   sTopic[n*6+3] = "/IoTmanager/Termostat/butminus" + String(n+1);
    62.   root3["id"] = String(n*6+3);
    63.   root3["page"] = "Стр" + String(n+1);
    64.   root3["widget"] = "simple-btn";
    65.   root3["class1"] = "col-xs-4 no-border";                          // class for 1st div
    66.   root3["style1"] = "";                                        // style for 1st div
    67.   root3["descr"]  = "";                               // text  for description
    68.   root3["class2"] = "balanced";                                // class for description from Widgets Guide - Color classes
    69.   root3["style2"] = "font-size:20px;float:left;padding-top:10px;font-weight:bold;"; // style for description
    70.   root3["topic"] = sTopic[n*6+3];
    71.   root3["class3"] = "button button-balanced icon ion-minus-round"; // class for button
    72.   root3["style3"] = "font-size:20px; float:left;";                            // style for button
    73.   root3.printTo(thing_config[n*6+3]);
    74.      
    75.   JsonObject& root4 = jsonBuffer.createObject();
    76.   sTopic[n*6+4] =  "/IoTmanager/Termostat/Ttarget" + String(n+1);
    77.   root4["id"] = String(n*6+4);
    78.   root4["page"] = "Стр" + String(n+1);
    79.   root4["widget"] = "display-value";
    80.   root4["class1"] = "col-xs-4 no-border";
    81.   root4["style1"] = "";
    82.   root4["descr"] = "";
    83.   root4["class2"] = "assertive";
    84.   root4["style2"] = "font-size:20px;float:left;font-weight:bold;";
    85.   root4["topic"] = sTopic[n*6+4];
    86.   root4["class3"] = "";
    87.   root4["style3"] = "float:right;";
    88.   root4["height"] = "40";
    89.   root4["color"] = "#F10014";
    90.   root4["inactive_color"] = "#414141";
    91.   root4["digits_count"] = 3;
    92.   root4.printTo(thing_config[n*6+4]);
    93.   JsonObject& root5 = jsonBuffer.createObject();
    94.   sTopic[n*6+5] = "/IoTmanager/Termostat/butplus" + String(n+1);
    95.   root5["id"] = String(n*6+5);
    96.   root5["page"] = "Стр" + String(n+1);
    97.   root5["widget"] = "simple-btn";
    98.   root5["class1"] = "col-xs-4 no-border";                          // class for 1st div
    99.   root5["style1"] = "";                                        // style for 1st div
    100.   root5["descr"]  = "";                               // text  for description
    101.   root5["class2"] = "balanced";                                // class for description from Widgets Guide - Color classes
    102.   root5["style2"] = "font-size:20px;float:left;padding-top:10px;font-weight:bold;"; // style for description
    103.   root5["topic"] = sTopic[n*6+5];
    104.   root5["class3"] = "button button-balanced icon ion-plus-round"; // class for button
    105.   root5["style3"] = "font-size:20px; float:left;";                            // style for button
    106.   root5.printTo(thing_config[n*6+5]);
    107.   }
    108. }
     
  4. Victor

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

    Сообщения:
    2.182
    Симпатии:
    368
    rapidshe нравится это.
  5. rapidshe

    rapidshe Новичок

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

    Код (Text):
    1. 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)
    2. {
    3.   StaticJsonBuffer<1024> jsonBuffer;
    4.   JsonObject& root0 = jsonBuffer.createObject();
    5.   String returnString=F("");
    6.   root0[F("id")] =  id;
    7.   root0[F("page")] = page;
    8.   root0[F("widget")] = widget;
    9.   root0[F("class1")] = class1;
    10.   root0[F("style1")] = style1;
    11.   root0[F("descr")] = descr;
    12.   root0[F("class2")] = class2;
    13.   root0[F("style2")] = style2;
    14.   root0[F("topic")] = Topic;
    15.   root0[F("class3")] = class3;
    16.   root0[F("style3")] = style3;
    17.   if (height!= F("_")) root0[F("height")] = height;
    18.   if (color!= F("_")) root0[F("color")] = color;
    19.   if (inactive_color!= F("_")) root0[F("inactive_color")] = inactive_color;
    20.   if (digits_count!= F("_")) root0[F("digits_count")] = digits_count;
    21.   root0.printTo(returnString);
    22.   return(returnString);
    23. }
    24.  
    25.   //температура сейчас
    26.   sTopic[n*6+2] =  F("/IoTmanager/Termostat/Tnow");
    27.   sTopic[n*6+2] +=String(n+1);
    28.   Topic = sTopic[n*6+2];
    29.   page = F("Стр");
    30.   page += String(n+1);
    31.   descr = F("Температура сейчас");
    32.   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"));
    33.  
    34.  
     
    Victor нравится это.
  6. rapidshe

    rapidshe Новичок

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

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

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

    Сообщения:
    2.182
    Симпатии:
    368
    эту паузу можно исключить, если ваш брокер "переварит" и смартфон справится - делайте разные задержки (вплоть до нуля) и тестируйте.
    Я пробовал отправлять конфиги с QoS=1 без пауз и все ок на своем брокере через инет.
     
  8. rapidshe

    rapidshe Новичок

    Сообщения:
    33
    Симпатии:
    3
    qos стоит 1(а что это вообще за параметр?)
    поставил 10мс вместо 150мс. по ощущениям приложение заполняется виджетами с той же скоростью...
    врятли проблема в телефоне(ифон7). да и инет сейчас проводной домашний.

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

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

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

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

    Сообщения:
    2.182
    Симпатии:
    368
    QoS - показатель уровня качества обслуживания MQTT Essentials Part 6: Quality of Service 0, 1 & 2
    я пользуюсь mosquitto, установленном на выделенном сервере
    я то и не против, но: 1. будет еще один blynk 2. много надо накодить и потом все это поддерживать
    можно так сделать - неплохая идея. только боюсь, что это еще одно усложнение, а пользователи и так жалуются, что много всего непонятного...
     
  10. rapidshe

    rapidshe Новичок

    Сообщения:
    33
    Симпатии:
    3
    признаться пару раз я хотел разбить ноут об стену)))

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

    rapidshe Новичок

    Сообщения:
    33
    Симпатии:
    3
    и в итоге кто не захочет, не будет пользоваться этой возможностью..
     
  12. Victor

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

    Сообщения:
    2.182
    Симпатии:
    368
    все существующие скетчи придется переделывать, т.е. при обновлении версии у всех все перестанет работать - вот тогда точно ноуты в меня полетят, а не в стену. Тут надо подумать, как и совместимость сохранить и дополнительное сообщение не посылать. К тому же непонятно как быть с несколькими устройствами - у них будут разные контрольные суммы (у каждого девайса свои)
     
  13. rapidshe

    rapidshe Новичок

    Сообщения:
    33
    Симпатии:
    3

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

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

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

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

    Сообщения:
    2.182
    Симпатии:
    368
    В ближайшее время точно не смогу - я сейчас без макбука.
     
  15. rapidshe

    rapidshe Новичок

    Сообщения:
    33
    Симпатии:
    3
    ну тогда можно что б помимо HELLO присылалась контрольная сумма из другого топика. тогда скетчи переделывать не надо будет)
    а вот с несколькими устройствами я хз. кстати а как происходит разделение на устройства? или просто разные топики?
    т.е. вкладка page как раз и сделана для разделения устройств?

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

    rapidshe Новичок

    Сообщения:
    33
    Симпатии:
    3
    могу себя предложить для тестирования ios приложения)
     
  17. Victor

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

    Сообщения:
    2.182
    Симпатии:
    368
    да, по принципу префикс/девайс/сенсор
    нет, это для логического разделения по смыслу (по комнатам, например)
    этого недостаточно... чтобы собрать новую версию для iOS и выложить в AppStore нужен Xcode, который работает только на маке.
     
  18. rapidshe

    rapidshe Новичок

    Сообщения:
    33
    Симпатии:
    3
    Вообще на начальной стадии очень сложно для понимания как настроить. но потом немного вникаешь в механизм, потом приходит на помощь яндекс с инфой по css и ок)
    зато потом геморроя не будет. например сестре и её мужу сказал только что скачать и какие настройки брокера ввести. и всё) и не надо убивать больше получаса на настройку всех виджетов на их аппаратах.
     
    Victor нравится это.
  19. rapidshe

    rapidshe Новичок

    Сообщения:
    33
    Симпатии:
    3
    а мак совсем не скоро появится? может тогда через виртуальную машину (погуглил, вроде рабочий вариант :))
    а для выкладывания в апп стор сначала ж надо протестить) а сейчас можно и без аппстора и джейлбрека устанавливать приложенич на ios (от 9 и выше)
     
  20. Victor

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

    Сообщения:
    2.182
    Симпатии:
    368
    можно, но нужно хотя бы 50 гигов на SSD для виртуалки выделить, а на обычном диске это просто издевательство - все тормозит, а SSD у меня и так под завязку
     

Поделиться этой страницей