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

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

Тема в разделе "IoT Manager – мобильное приложение", создана пользователем Victor, 13 фев 2016.

Метки:
  1. roiksv

    roiksv Новичок

    Сообщения:
    20
    Симпатии:
    0
    Жаль, уже хотел разнести данные для срабатывания датчиков "IoTmanager/+/+/setup" и просить в IoTmanager реализовать в настройках уровень отображения (2,3 и т.п.). Значит не судьба)). Получается как бы можно сделать "IoTmanager/+/+/setup" для данных в один конец. Придется мириться
     
  2. Victor

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

    Сообщения:
    2.182
    Симпатии:
    368
    не совсем понял что именно вы хотите реализовать. Попробуйте объяснить более подробно и я подумаю как это можно сделать
     
  3. roiksv

    roiksv Новичок

    Сообщения:
    20
    Симпатии:
    0
    Сейчас топики жестко привязаны (prefix + "/" + deviceID + "/" + device). Т.е /IoTmanager/+/+/control(status). Если не привязывать жестко можно было бы прятать информацию с экрана, которую нет надобности видеть каждый раз). Например в /IoTmanager/+/+/control(status) это переключатели или датчики, а /IoTmanager/+/+/+/control(status) это другая информация, например мин-макс порог срабатывания датчиков, который выставляется не каждый день. Соответственно и в IoTmanager тогда нужна настройка отображения этих уровней(/+/+/...). Т.е 2-подписка на +/+, 3-+/+/+
     
  4. Mоnk

    Mоnk Новичок

    Сообщения:
    80
    Симпатии:
    3
    Кто как выкручивается, убирая и восстанавливая кнопки и показания на экране...
    Кусок кода (раскрыть)
    Код (CSS):
    1. void initVar()
    2. {
    3.   id        [0] = "50"; // === 0 === Температура
    4.   page      [0] = room;
    5.   pageId    [0] = "52";
    6.   sTopic    [0] = prefdev + "/DHT22_t";
    7.   stat      [0] = setStatus(DHT22_tS + " °C");
    8.   descr     [0] = "Температура";
    9.   widget    [0] = "anydata";
    10.   class1    [0] = "item rounded no-padding";
    11.   style1    [0] = "";
    12.   class2    [0] = "rounded padding";
    13.   style2    [0] = "font-size:20px;float:left;height:50px";
    14.   class3    [0] = "rounded padding";
    15.   style3    [0] = "font-size:30px;text-align:right;height:50px";
    16.  
    17.   id        [1] = "51"; // === 1 === Влажность
    18.   page      [1] = room;
    19.   pageId    [1] = "52";
    20.   sTopic    [1] = prefdev + "/DHT22_h";
    21.   stat      [1] = setStatus(DHT22_hS + " %");
    22.   descr     [1] = "Влажность";
    23.   widget    [1] = "anydata";
    24.   class1    [1] = "item rounded no-padding";
    25.   style1    [1] = "";
    26.   class2    [1] = "rounded padding";
    27.   style2    [1] = "font-size:20px;float:left;height:50px";
    28.   class3    [1] = "rounded padding";
    29.   style3    [1] = "font-size:30px;text-align:right;height:50px";
    30.  
    31.   id        [2] = "52"; // === 2 === Нагреватель
    32.   page      [2] = room;
    33.   pageId    [2] = "52";
    34.   sTopic    [2] = prefdev + "/lightblue";
    35.   stat      [2] = setStatus(OFF);
    36.   descr     [2] = "Нагреватель";
    37.   widget    [2] = "toggle";
    38.   more      [2] = ",\"iconClass\":\"ion-ios-flame-outline\",\"iconClassOff\":\"ion-ios-flame-outline\",\"iconStyle\":\"font-size:30px;color:#ff3d3d;\",\"iconStyleOff\":\"font-size:30px;color:#eee;\",\"descrStyle\":\"font-size:20px;line-height:1.5em;\"";
    39.   defaultVal[2] = OFF;
    40.  
    41.   id        [3] = "53"; // === 3 === Button_Minus
    42.   page      [3] = room;
    43.   pageId    [3] = "52";
    44.   sTopic    [3] = prefdev + "/B_Minus";
    45.   widget    [3] = "simple-btn";
    46.   class1    [3] = "item no-border col-xs-4"; // Размер колонки
    47.   class2    [3] = "balanced";
    48.   class3    [3] = "button button-calm button-fab button-outline icon ion-minus";
    49.   style3    [3] = "height:80px;width:80px;";
    50.   more      [3] = ",\"delay\":\"1000\"";
    51.  
    52.   id        [4] = "54"; // === 4 === Нагревать до
    53.   page      [4] = room;
    54.   pageId    [4] = "52";
    55.   sTopic    [4] = prefdev + "/setpoint";
    56.   stat      [4] = setStatus(String(setpoint) + "°");
    57.   widget    [4] = "anydata";
    58.   class1    [4] = "item no-border col-xs-4"; // Размер колонки
    59.   class3    [4] = "text-center";
    60.   style3    [4] = "font-size:45px;font-weight:bold;line-height:2em;height:70px;";
    61.  
    62.   id        [5] = "55"; // === 5 === Button_Plus
    63.   page      [5] = room;
    64.   pageId    [5] = "52";
    65.   sTopic    [5] = prefdev + "/B_Plus";
    66.   widget    [5] = "simple-btn";
    67.   class1    [5] = "item no-border col-xs-4"; // Размер колонки
    68.   style1    [5] = "text-align: right;";
    69.   class2    [5] = "balanced";
    70.   class3    [5] = "button button-assertive button-fab button-outline icon ion-plus";
    71.   style3    [5] = "height:80px;width:80px;";
    72.   more      [5] = ",\"delay\":\"1000\"";
    73.  
    74.   id        [6] = "57"; // === 6 === Button_MinusA
    75.   page      [6] = room;
    76.   pageId    [6] = "52";
    77.   sTopic    [6] = prefdev + "/B_MinusA";
    78.   widget    [6] = "simple-btn";
    79.   class1    [6] = "item no-border col-xs-4"; // Размер колонки
    80.   class2    [6] = "balanced";
    81.   class3    [6] = "button button-calm button-fab button-outline icon ion-minus";
    82.   style3    [6] = "height:60px;width:60px;";
    83.   hide      [6] = false;
    84.  
    85.   id        [7] = "58"; // === 7 === Нагревать с 23 до 7
    86.   page      [7] = room;
    87.   pageId    [7] = "52";
    88.   sTopic    [7] = prefdev + "/setpointA";
    89.   stat      [7] = setStatus(String(setpointA) + "°");
    90.   widget    [7] = "anydata";
    91.   class1    [7] = "item no-border col-xs-4"; // Размер колонки
    92.   class3    [7] = "text-center";
    93.   style3    [7] = "font-size:35px;font-weight:bold;line-height:2em;height:50px;";
    94.   hide      [7] = false;
    95.  
    96.   id        [8] = "59"; // === 8 === Button_PlusA
    97.   page      [8] = room;
    98.   pageId    [8] = "52";
    99.   sTopic    [8] = prefdev + "/B_PlusA";
    100.   widget    [8] = "simple-btn";
    101.   class1    [8] = "item no-border col-xs-4"; // Размер колонки
    102.   style1    [8] = "text-align: right;";
    103.   class2    [8] = "balanced";
    104.   class3    [8] = "button button-assertive button-fab button-outline icon ion-plus";
    105.   style3    [8] = "height:60px;width:60px;";
    106.   hide      [8] = false;
    107.  
    108.   id        [9] = "56"; // === 9 === Время
    109.   page      [9] = room;
    110.   pageId    [9] = "52";
    111.   sTopic    [9] = prefdev + "/DateTime";
    112.   stat      [9] = setStatus(String(addZero(day(), 2, " ") + "." + addZero(month(), 2, "0") + "." + addZero(year(), 2, "0") + " " + addZero(hour(), 2, "0") + ":" + addZero(minute(), 2, "0") + ":" + addZero(second(), 2, "0")));
    113.   widget    [9] = "anydata";
    114.   descr     [9] = "Время";
    115.   class1    [9] = "item rounded no-padding";
    116.   style1    [9] = "";
    117.   class2    [9] = "rounded padding";
    118.   style2    [9] = "font-size:15px;float:left;height:50px";
    119.   class3    [9] = "rounded padding";
    120.   style3    [9] = "font-size:15px;text-align:right;height:50px";
    121.  
    122.   id        [10] = "60"; // === 10 === DS18B20
    123.   page      [10] = room;
    124.   pageId    [10] = "52";
    125.   sTopic    [10] = prefdev + "/DS18B20";
    126.   stat      [10] = setStatus(DS18B20_1S + " °C");
    127.   widget    [10] = "anydata";
    128.   descr     [10] = "Улица";
    129.   class1    [10] = "item rounded no-padding";
    130.   style1    [10] = "";
    131.   class2    [10] = "rounded padding";
    132.   style2    [10] = "font-size:20px;float:left;height:50px";
    133.   class3    [10] = "rounded padding";
    134.   style3    [10] = "font-size:30px;text-align:right;height:50px";
    135.  
    136.   needPubConfig = true;
    137. }
    138.  
    139. // send confirmation - status message
    140. void pubStatus(String t, String payload)
    141. {
    142.   client.publish(t + "/status", payload);
    143.   delay(PUB_DELAY);
    144. }
    145.  
    146. void pubConfig()
    147. {
    148.   needPubConfig = false;
    149.   for (int i = 0; i < nWidgets; i = i + 1)
    150.   {
    151.     pubConfigX(i);
    152.   }
    153.   yield();
    154. }
    155.  
    156. void pubConfigX(int i)
    157. {
    158.   if (hide[i] == false)
    159.   {
    160.     thing_config[i] = "{\"id\":" + id[i] + ",\"page\":\"" + page[i] + "\",\"pageId\":" + pageId[i] + ",\"widget\":\"" + widget[i] + "\",\"descr\":\"" + descr[i] + "\",\"topic\":\"" + sTopic[i] + "\",\"class1\":\"" + class1[i] + "\",\"style1\":\"" + style1[i] + "\",\"class2\":\"" + class2[i] + "\",\"style2\":\"" + style2[i] + "\",\"class3\":\"" + class3[i] + "\",\"style3\":\"" + style3[i] + "\"" + more[i] + "}";
    161.   }
    162.   else
    163.   {
    164.     thing_config[i] = "{\"id\":" + id[i] + ",\"page\":\"" + page[i] + "\"}";
    165.   }
    166.     client.publish(MQTT::Publish(prefdev + "/config", thing_config[i]).set_qos(1));
    167.     delay(PUB_DELAY);
    168.     pubStatus(sTopic[i], stat[i]);
    169. }
    170.  
    171. void controlGPIO ()
    172. {
    173.   String t = topic;
    174.   String p = payload;
    175.  
    176.   needControlGPIO = false;
    177.  
    178. if (t == sTopic[0] + "/control")      // === 0 === Температура
    179.   {
    180.   }
    181. else if (t == sTopic[1] + "/control") // === 1 === Влажность
    182.   {
    183.   }
    184. else if (t == sTopic[2] + "/control") // === 2 === Нагреватель
    185.   {
    186.     if (p == "0")
    187.     {
    188.       //digitalWrite(Relay_pin, OFF);
    189.       stat[2] = stat0;
    190.       getDHT22();
    191.       for (int i = 3; i < 9; i = i + 1)
    192.       {
    193.         hide[i] = false;
    194.         pubConfigX(i);
    195.       }
    196.     }
    197.     else
    198.     {
    199.       digitalWrite(Relay_pin, ON);
    200.       stat[2] = stat1;
    201.       for (int i = 3; i < 9; i = i + 1)
    202.       {
    203.         hide[i] = true;
    204.         pubConfigX(i);
    205.       }
    206.     }
    207.     pubStatus(sTopic[2], stat[2]);
    208.     chkdRt();
    209.   }
    210. else if (t == sTopic[3] + "/control") // === 3 === Button_Minus
    211.   {
    212.     setpointMinus();
    213.   }
    214. else if (t == sTopic[4] + "/control") // === 4 === setpoint
    215.   {
    216.   }
    217. else if (t == sTopic[5] + "/control") // === 5 === Button_Plus
    218.   {
    219.     setpointPlus();
    220.   }
    221. else if (t == sTopic[6] + "/control") // === 6 === Button_MinusA
    222.   {
    223.     setpointMinusA();
    224.   }
    225. else if (t == sTopic[7] + "/control") // === 7 === Нагревать с 23 до 7
    226.   {
    227.   }
    228. else if (t == sTopic[8] + "/control") // === 8 === Button_PlusA
    229.   {
    230.     setpointPlusA();
    231.   }
    232. else if (t == sTopic[9] + "/control") // === 9 === Время
    233.   {
    234.   }
    235. else if (t == sTopic[10] + "/control") // === 10 === DS18B20
    236.   {
    237.   }
    238. }
    239.  
    240. // ========================== publish =========================================================
    241.  
    242.   if( count10 < 10)
    243.   {
    244.     count10 ++;
    245.   }
    246.   else
    247.   {
    248.     pubStatus(sTopic[0], "{\"status\":\"" + DHT22_tS + " °C\"}");
    249.     pubStatus(sTopic[1], "{\"status\":\"" + DHT22_hS + "  %\"}");
    250.   stat[4] = setStatus(String(addZero(setpoint, 2, " ")) + "°"); // === Статус регулятора Нагревателя
    251.     pubStatus(sTopic[4], stat[4]);
    252.   stat[9] = setStatus(String(addZero(day(), 2, " ") + "." + addZero(month(), 2, "0") + "." + addZero(year(), 2, "0") + " " + addZero(hour(), 2, "0") + ":" + addZero(minute(), 2, "0") + ":" + addZero(second(), 2, "0")));
    253.     pubStatus(sTopic[9], stat[9]); // Дата и Время
    254.     pubStatus(sTopic[10], "{\"status\":\"" + DS18B20_1S + " °C\"}");
    255.     count10 = 0;
    256.   }
    257.       client.loop();
    258.     }
    259.   }
    260.   else
    261.   {
    262.         delay(1000);
    263.   }
    264. }
    265.  
    266. String setStatus ( String s )
    267. {
    268.   String stat = "{\"status\":\"" + s + "\"}";
    269.   return stat;
    270. }
    271. String setStatus ( int s )
    272. {
    273.   String stat = "{\"status\":\"" + String(s) + "\"}";
    274.   return stat;
    275. }
     
  5. roiksv

    roiksv Новичок

    Сообщения:
    20
    Симпатии:
    0
    А так к выкрутасам добавится стандартный вариант без увеличения кода в девайсе. Конечно хотеть одно-реализовать другое.
     
  6. Mоnk

    Mоnk Новичок

    Сообщения:
    80
    Симпатии:
    3
    "class of restrict"...
    Очень глобально. Показывать или прятать группу виджетов в зависимости от чего-либо? Не уверен, что это жизненно необходимо. Пустой / не пустой конфиг вполне себе работает.
     
  7. roiksv

    roiksv Новичок

    Сообщения:
    20
    Симпатии:
    0
    Нужно-не нужно. Вы скрываете-показываете что-либо, значит есть необходимость. Просто скажу иначе: сейчас мой планшет отображает информацию непонятно как. При открытии программы происходит путаница в строках, приходится передергивать экран. Увеличивая количество девайсов увеличивается объем выводимой информации. Пользователей может быть не один, скрыли-показали топики и забыли. Соответственно появляются лишние телодвижения для получения нужной информации. Я уже не говорю о том, что усложняется код на девайсе. Что не очень дружелюбно для нового пользователя
     
  8. Victor

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

    Сообщения:
    2.182
    Симпатии:
    368
    1.можно раздавать разные конфиги разным устройствам и/или пользователям - для этого есть user, users uuid Виджет anydata · IoT Manager
    2. ненужные (в данный момент) виджеты можно перемещать на отдельную страницу
    3. просто слать разные конфиги, в зависимости от принятых данных (т.е. делаете виджеты simple-btn и отсылаете команды устройству, а он в ответ шлет другие конфиги, в зависимости от нажатой кнопки)
     
  9. roiksv

    roiksv Новичок

    Сообщения:
    20
    Симпатии:
    0
    Victor, я это все понимаю. Просто хотелось получить простой механизм для скрытия-показа информации. Без лишних телодвижений (писанины кода прошивки, нажатия кнопок и т.п.). Скажу больше, в один прекрасный момент умный дом может остаться без умного хозяина. Для этих случаев писать толмут как пользоваться: это нажми, то не нажимай. Я предложил как на мой взгляд простое решение. Теперь решение за автором
     
  10. Victor

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

    Сообщения:
    2.182
    Симпатии:
    368
    честно говоря мне наоборот кажется ваш способ немного замудреным. проще вывести настройки на отдельную страницу и далее можно не показывать ее отдельным пользователям.
    посмотрите еще протокол v2 - там данные отправляются только те, которые нужны на данной странице, возможно, что вам понравится такой вариант
     
  11. roiksv

    roiksv Новичок

    Сообщения:
    20
    Симпатии:
    0
    Ну не знаю, что может быть проще чем указать в прошивке sTopic[0] = prefix + "/" + deviceID + "/setup/light" и в проге выставить уровень отображения 2, и не видеть данные этого топика. Ситуация: автора умного дома нет в зоне досягаемости, настроен показ виджета по юзеру. Жена теперь должна догадаться какой там был у хозяина доступ, перелогиниться и изменить настройку чего-либо. Моя жена этого делать не будет, вырубит нафиг всю автоматику в доме. Короче говоря, или я, как начинающий пользователь чего-то не понимаю, или лыжи не едут. Насчет протокола v2-посмотрю
     
    Последнее редактирование: 13 апр 2017
  12. Victor

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

    Сообщения:
    2.182
    Симпатии:
    368
    Разделение по пользователям это как пример реализации. Для вашего случая, более подходит вариант с отдельной страницей редких настроек. Просто так, из интереса, туда ваши домашние не полезут, а когда нужно будет, то изменят там любой параметр.
     
  13. roiksv

    roiksv Новичок

    Сообщения:
    20
    Симпатии:
    0
    @Victor, т.к дискуссия развязалась здесь, а не в "хотелке", я не стал говорить о скрытой стороне моей "хотелки" (т.е мне было бы проще дальше реализовать свой проект). Привел только доводы, как мне думалось, которые могли еще кого-то заинтересовать. Я придумал костыль. Поэтому вопрос исчерпан)).
     
  14. oWart

    oWart Новичок

    Сообщения:
    10
    Симпатии:
    4
    @Victor, не знаю, может это косяк библиотеки Paho, т.к это относится к уровню самого протокола MQTT, но все же напишу: топик /IoTmanager/device приходит в таком виде:
    30 98 01 00 12 2F 49 6F 54 6D 61 6E 61 67 65 72 2F 64 65 76 69 63 65 7B 22 63 .... и.т.д
    Согласно спецификации v.3.1.1 байты 3 и 4 это длина имени топика (Length MSB и LSB). Отсюда получается, что длина имени топика 256 символов, хотя длина всего сообщения 152 байта (Remaining Length = 98h).
     
  15. Victor

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

    Сообщения:
    2.182
    Симпатии:
    368
    Если Paho Websockets, то вряд ли, он протестирован миллионы раз. На гитхабе о такой ошибке другие пользователи не сообщают... Нужно искать причину в другом. Если используете paho native, то попробуйте убить IoT Manager (любым Task Manager) и снова запустить - за нативным движком я иногда замечал подглючивание пока не перезапустишь. Было бы любопытно узнать подробности (версии брокера, SSL есть/нет и т.п.)
     
  16. oWart

    oWart Новичок

    Сообщения:
    10
    Симпатии:
    4
    @Victor, пишу свой упрощенный брокер на esp8266 на библиотеке WebSocket, без SSL. Все остальные сообщения корректны, а это принимается с такой вот длиной топика
     
  17. Victor

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

    Сообщения:
    2.182
    Симпатии:
    368
    Посмотрите документацию - там приличного размера пакет прилетает после HELLO в prefix + "/device"
    ок, может и потянет ESP8266 небольшой трафик. Только вот сколько получится одновременных коннектов держать?
    В любом случае - удачи!
     
  18. Mainscs

    Mainscs Новичок

    Сообщения:
    20
    Симпатии:
    4
    В связи с появлением новых стилей оформления - dark и обычных, может быть стоит для виджета display-value предусмотреть режим без отображения неактивных сегментов (inactive_color) - т.е. сделать их прозрачными. Иначе возможна ситуация, когда виджет настроен на стиль dark, и, соответственно, неактивные сегменты по цвету близки к черному. При переходе к светлому стилю неактивные сегменты выглядят как черные на белом фоне. Возможна и обратная картина.
     
  19. Victor

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

    Сообщения:
    2.182
    Симпатии:
    368
    "inactive_color" : "rgba(192,192,192,0.5)" должно сработать
     
  20. Mainscs

    Mainscs Новичок

    Сообщения:
    20
    Симпатии:
    4
    Спасибо, через часок попробую
     

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