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

IoT Manager - архив обсуждений

Статус
В этой теме нельзя размещать новые ответы.

Victor

Administrator
Команда форума
Виктор, в том то и дело, что я не знаю, как это делать... Где почитать??
В приложении есть пункт меню: Виджеты, там полное описание последних виджетов, но не всех и на английском :( но я работаю над описанием и надеюсь, что скоро описание будет для всех виджетов и на русском тоже.
Еще можно разобраться по исходникам javascript для NODE.JS или для Arduino IDE здесь https://gist.github.com/4refr0nt/
Я подгоняю виджеты в эмуляторе реального устройства в NODE.JS - это быстро, не нужно после каждого исправления перезаливать прошивку,
можно быстро попробовать разные виджеты, быстро менять классы и стили и сразу видеть что получилось.
Удобно использовать nodemon - он сам перезапускает js скрипт после того, как я его отредактировал.
 

Jon

Member
После обновления на ver 1.4.7 перестал подключаться к брокеру. Как откатить обновление?
 

Victor

Administrator
Команда форума
После обновления на ver 1.4.7 перестал подключаться к брокеру. Как откатить обновление?
к сожалению, откат невозможен (это особенность GooglePlay)
но заверяю вас, что никаких изменений в плане подключения к брокеру в этой версии не производилось - попробуйте перезапустить mqtt или подключиться к другому серверу.
 

Oleg_Pvk

New member
Доброго времени суток еспшники!
Прошу Вас господа ткните носом куда копать!
С библеотеками с горем пополам я разобрался за неделю ковыряний с ардуин.
Из ардуины экспортирую бин фаил и спомощю программы XTCOM_UTIL прошиваю ESP-8266-12E пользуюсь USB-TTL
Перезагружаю есп и в ESPloer мне выдаёт такой код
Код:
ets Jan  8 2013,rst cause:2, boot mode:(3,7)

load 0x4010f000, len 1264, room 16 
tail 0
chksum 0x42
csum 0x42
~ld


MQTT client started.
Free heap = 31216
Connecting via WiFi to MyFi...

Soft WDT reset

ctx: cont 
sp: 3fff1e60 end: 3fff22c0 offset: 01b0

>>>stack>>>
3fff2010:  0000001e 4000420c 60000200 3fff00c4  
3fff2020:  00000100 40004ac0 00000100 003fd000  
3fff2030:  00000100 3fff0004 3fffc718 003fd000  
3fff2040:  00000378 4000410f 40101528 00000378  
3fff2050:  3fff0004 000003fd 3fff0004 3fff4b08  
3fff2060:  3fffc718 3fff0004 00000378 00000000  
3fff2070:  003fd000 40211efb 00000378 3fff4b08  
3fff2080:  00001000 40211f85 3fff0004 000003ff  
3fff2090:  000003fd 00000000 003fd000 3fff0004  
3fff20a0:  ffffff00 ffffffff ffffffff ffffffff  
3fff20b0:  ffffffff ffffffff ffffffff 000003ff  
3fff20c0:  40211e24 00000003 3fff0fe4 3ffe96ac  
3fff20d0:  00000001 40211e52 00000003 3ffe96ac  
3fff20e0:  40203e08 00000000 00000000 00000000  
3fff20f0:  00000000 3ffe96a0 3fff0fe4 40203ed5  
3fff2100:  00000000 00000000 00000000 00000000  
3fff2110:  00000000 00000000 00000000 00000000  
3fff2120:  00000000 00000000 00000000 00000000  
3fff2130:  00000000 00000000 00000000 00000000  
3fff2140:  00000000 00000000 00000000 00000000  
3fff2150:  00000000 00000000 00000000 00000000  
3fff2160:  00000000 00000000 00000000 00000000  
3fff2170:  3fff37f0 40106da6 3fff222c 00000001  
3fff2180:  00000000 00000000 00000000 402079f6  
3fff2190:  3fff11c8 00000001 3ffe9b55 40207400  
3fff21a0:  3fff11c8 00000002 3ffe9562 3fff128c  
3fff21b0:  3ffe8344 00000003 3fff11c8 40206949  
3fff21c0:  3ffe9b54 3fff0fe4 3fff11c8 40206949  
3fff21d0:  00000000 00000001 3fff11c8 402074d4  
3fff21e0:  00000000 40203e58 3fff11c8 3fff128c  
3fff21f0:  3ffe8344 3fff0fe4 3fff11c8 40203631  
3fff2200:  3fff2220 00000001 3fff222a 40207601  
3fff2210:  3fff35e0 0000000e 3fff2290 40207a4e  
3fff2220:  3fff11c8 00000001 3ffe9b55 40207400  
3fff2230:  3fff1100 0000000b 3ffe930f 3fff128c  
3fff2240:  3fffdc20 00000005 3fff11c8 40206949  
3fff2250:  3ffe9b54 3fff0b08 3fff11c8 3fff128c  
3fff2260:  3fffdc20 3fff0b08 3fff11c8 402074d4  
3fff2270:  40206238 0000000a 3fff11c8 40207749  
3fff2280:  3fffdc20 3fff0b08 3fff11c8 40202f91  
3fff2290:  3fff3840 0000000f 00000000 3fff128c  
3fff22a0:  3fffdc20 00000000 3fff1285 40206ae5  
3fff22b0:  00000000 00000000 3fff12a0 40100114  
<<<stack<<<

 ets Jan  8 2013,rst cause:2, boot mode:(3,7)

load 0x4010f000, len 1264, room 16 
tail 0
chksum 0x42
csum 0x42
~ld


MQTT client started.
Free heap = 31216
Connecting via WiFi to MyFi...

 С

Я уже не знаю куда рыть. Пробовал к разным роутерам подключить эфект оин и тотже
Что я делаю не так?
На форуме нашел что к питанию есп капризна.
По питаню тестером проверил 3.15 - 3.17 вольт с подключной есп и 3.18 - 3.20 без есп
Неужели ей этого мало?
 

Victor

Administrator
Команда форума
На форуме нашел что к питанию есп капризна.
нужно не только по напряжению требования соблюсти, но и по току.
Убедитесь, что ваш источник питания выдает не менее 300мА под нагрузкой (если питаете от USB-TTL, то он точно не выдает столько)
Лучше всего взять USB зарядку для телефона и подключить ESP8266 к ней через стабилизатор на 3,3в (чаще всего используют 1117)
А так, на питание очень похоже: ESP8266 отваливается после включения WiFi (как раз когда резкое увеличение потребления идет)
Ну и почитайте наши обсуждения про железные вопросы
 
@Victor Спасибо большое за проделанную работу. Использую вашу программу с поднятым у меня на роутере брокером. На данный момент разбираюсь с виджетами. Все сложно идет без русского описания, можно сказать методом тыка :) Есть желание помочь проекту и сделать данное описание, но к сожалению пока сам не до конца разобрался... Есть пара вопросов:
1. как в виджет "display-value" выводить дробное число?
2. есть ли возможность выводить график (если нет, то планируется ли)?
 

Victor

Administrator
Команда форума
Спасибо за отзыв!
1. как в виджет "display-value" выводить дробное число?
Просто отправляйте заранее отформатированную строку, например "123.456" (поддерживаются только цифры, пробел и точка)
В следующей версии еще добавятся символы "°CF"
2. есть ли возможность выводить график (если нет, то планируется ли)?
пока нет, но будет, через d3
 
Ещё раз спасибо.
Наберусь наглости и задам ещё вопрос. :)
Даже не знаю как лаконично задать вопрос (по себе знаю, что в правильно заданном вопросе уже будет большая часть ответа)...

В данный момент делаю все на основе Вашего первого примера.
Лишнее (для меня в данный момент) я разобрался как убрать :)
Оставил только три виджета "toggle" которые удачно управляют нужными светодиодами, да ещё и с нескольких телефонов...
Но нужно добавить ещё управление с физических кнопок... Вот тут та я и застрял. Конфигурирую порт как вход, подтягиваю его к питанию, кнопку вешаю на массу (тут все отработано на ардуинке). Вопрос: куда вставить код опроса кнопки (при нажатии на кнопку (дребезг обрабатываем програмно) нужно:
1. у брокера спросить текущее состояние светодиода;
2. изменить состояние на противоположное;
3. оповестит брокера о новом состоянии.

Код:
if (digitalRead(knopka1)==0){
    if (sub.payload_string() == "0") {
       newValue = 1; // no inverted
       stat[0] = stat0;
    } else {
       newValue = 0;
       stat[0] = stat1;
    }
    digitalWrite(pin[0],newValue);
    pubStatus(sTopic[0], stat[0]);
  }
так?
 

Victor

Administrator
Команда форума
В данный момент делаю все на основе Вашего первого примера.
посмотрите еще третий пример - там используется ArduinoJSON и вроде более понятней
а про кнопку - второй пример, там виджет power-button (это пока один на вход)
1. у брокера спросить текущее состояние светодиода;
2. изменить состояние на противоположное;
3. оповестит брокера о новом состоянии.
1. не спрашивайте у брокера - он не знает, сохраняйте предыдущее состояние в переменной
2. digitalWrite() - вам вообще не нужно, только читаем состояние
3. да, отправляем состояние кнопки, если оно изменилось (см. п1)
в принципе можно и не сохранять старое состояние, а отправлять на брокер, скажем каждую секунду
 
в принципе можно и не сохранять старое состояние, а отправлять на брокер, скажем каждую секунду
А я так не заспамлю брокера? Наверное проще сохранять старое состояние в переменной.
Может быть не совсем понятно объяснил. Нужно управлять светодиодом как из приложения, так и с помощью кнопки (кнопка не фиксируемая). На данный момент, получилось только управлять из приложения.
П.С. я тут сейчас задумался, а возможно ли считать состояние пина который сконфигурирован как выход?
 

Victor

Administrator
Команда форума
А я так не заспамлю брокера? Наверное проще сохранять старое состояние в переменной.
да, конечно
Нужно управлять светодиодом как из приложения, так и с помощью кнопки (кнопка не фиксируемая). На данный момент, получилось только управлять из приложения.
то, что касается логики, то делайте все как обычно, просто не забывайте отсылать status, чтобы мобильное приложение знало, что у вас изменилось
(я к тому, что digitalWrite() у вас в фрагменте скетча правильный )
возможно ли считать состояние пина который сконфигурирован как выход?
не, не стоит на это рассчитывать
 
Спасибо большое, за активное участие! Потопал вникать в третий пример... Я вас ещё помучаю вопросами, но скорее всего позже :)
 
Пожелание к приложению. Сделайте пожалуйста возможность сохранения нескольких конфигураций подключения к брокеру.
 
Огромная просьба ко всем, кто написал какой-либо скетч, работающий с IoT Manager...
Добрый день. Написал скетч и даже попытался его выложить на github правда не знаю на сколько у меня это получилось, т.к. делаю я это в первый раз...
Краткое описание: esp8266 -01 опрашивает датчик давления BMT180, полученные данные (давление и температуру) отправляет брокеру. IoT Manager берет эти данные у брокера и отображает на экране мобильного телефона. Выглядит это примерно вот так:
Screenshot_2016-02-08-18-02-31_ru.esp8266.iotmanager.png
Библиотека для BMP180 прикреплена внизу.
Код:
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;

String davlen;
String temp;
const char *ssid =  "****";            // cannot be longer than 32 characters!
const char *pass =  "*****";       // WiFi password

String prefix   = "/IoTmanager";      // global prefix for all topics - must be some as mobile device
String deviceID = "dev04";            // thing ID - unique device id in our project

WiFiClient wclient;

// config for cloud mqtt broker by DNS hostname ( for example, cloudmqtt.com use: m20.cloudmqtt.com - EU, m11.cloudmqtt.com - USA )
String mqttServerName = "m20.cloudmqtt.com";            // for cloud broker - by hostname, from CloudMQTT account data
int    mqttport = 11536;                                // default 1883, but CloudMQTT.com use other, for example: 13191, 23191 (SSL), 33191 (WebSockets) - use from CloudMQTT account data
String mqttuser =  "*****";                              // from CloudMQTT account data
String mqttpass =  "*****";                              // from CloudMQTT account data
PubSubClient client(wclient, mqttServerName, mqttport); // for cloud broker - by hostname


// config for local mqtt broker by IP address
//IPAddress server(192, 168, 1, 100);                        // for local broker - by address
//int    mqttport = 1883;                                    // default 1883
//String mqttuser =  "test";                                     // from broker config
//String mqttpass =  "test";                                     // from broker config
//PubSubClient client(wclient, server, mqttport);            // for local broker - by address

String val;
String ids = "";
int newValue, newtime, oldtime, freeheap;

const int nWidgets = 2;
String sTopic      [nWidgets];
String stat        [nWidgets];
int    pin         [nWidgets];
String thing_config[nWidgets];
StaticJsonBuffer<1024> jsonBuffer;
JsonObject& json_status = jsonBuffer.createObject();
String string_status;

void FreeHEAP() {
  if ( ESP.getFreeHeap() < freeheap ) {
    if ( ( freeheap != 100000) ) {
       Serial.print("Memory leak detected! old free heap = ");
       Serial.print(freeheap);
       Serial.print(", new value = ");
       Serial.println(ESP.getFreeHeap());
    }
    freeheap = ESP.getFreeHeap();
  }
}

String setStatus ( String s ) {
  json_status["status"] = s;
  string_status = "";
  json_status.printTo(string_status);
  return string_status;
}
String setStatus ( int s ) {
  json_status["status"] = s;
  string_status = "";
  json_status.printTo(string_status);
  return string_status;
}
void initVar() {

  sTopic[0] = prefix + "/" + deviceID + "/BMP180_temp";
  stat  [0] = setStatus (0);
  sTopic[1] = prefix + "/" + deviceID + "/BMP180_davlen";
  stat  [1] = setStatus (1);

  JsonObject& root = jsonBuffer.createObject();
  JsonObject& cfg  = jsonBuffer.createObject();

  root["id"] = 0;
  root["page"] = "BMP180";
  root["widget"] = "display-value";
  root["class1"] = "item no-border";                          // class for 1st div
  root["style1"] = "";                                        // style for 1st div
  root["descr"]  = "Температура";                            // text  for description
  root["class2"] = "balanced";                                // class for description from Widgets Guide - Color classes
  root["style2"] = "font-size:20px;float:left;padding-top:10px;font-weight:bold;"; // style for description
  root["topic"] = sTopic[0];
  root["class3"] = "";                                        // class for 3 div - SVG
  root["style3"] = "float:right;";                            // style for 3 div - SVG
  root["height"] = "40";                                      // SVG height without "px"
  root["color"]  = "#52FF00";                                 // color for active segments
  root["inactive_color"] = "#414141";                         // color for inactive segments
  root["digits_count"]   = 6;                                 // how many digits

  root.printTo(thing_config[0]);

/////

  root["id"] = 1;
  root["page"] = "BMP180";
  root["widget"] = "display-value";
  root["class1"] = "item no-border";                          // class for 1st div
  root["style1"] = "";                                        // style for 1st div
  root["descr"]  = "Давление (мм.рт.ст)";                            // text  for description
  root["class2"] = "balanced";                                // class for description from Widgets Guide - Color classes
  root["style2"] = "font-size:20px;float:left;padding-top:10px;font-weight:bold;"; // style for description
  root["topic"] = sTopic[1];
  root["class3"] = "";                                        // class for 3 div - SVG
  root["style3"] = "float:right;";                            // style for 3 div - SVG
  root["height"] = "40";                                      // SVG height without "px"
  root["color"]  = "#52FF00";                                 // color for active segments
  root["inactive_color"] = "#414141";                         // color for inactive segments
  root["digits_count"]   = 3;                                 // how many digits

  root.printTo(thing_config[1]);
//////////////////////////////////////

}
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!");
    }
    FreeHEAP();
}
void pubConfig() {
  bool success;
  success = client.publish(MQTT::Publish(prefix, deviceID).set_qos(1));
  if (success) {
      delay(500);
      for (int i = 0; i < nWidgets; i = i + 1) {
        success = client.publish(MQTT::Publish(prefix + "/" + deviceID + "/config", thing_config[i]).set_qos(1));
        if (success) {
          Serial.println("Publish config: Success (" + thing_config[i] + ")");
        } else {
          Serial.println("Publish config FAIL! ("    + thing_config[i] + ")");
        }
        delay(150);
      }   
  }
  if (success) {
     Serial.println("Publish config: Success");
  } else {
     Serial.println("Publish config: FAIL");
  }

  for (int i = 0; i < nWidgets; i = i + 1) {
      pubStatus(sTopic[i], stat[i]);
      delay(100);
  }   
}
void callback(const MQTT::Publish& sub) {
  Serial.print("Get data from subscribed topic ");
  Serial.print(sub.topic());
  Serial.print(" => ");
  Serial.println(sub.payload_string());

  if ( sub.payload_string() == "HELLO" ) {  // handshaking
     pubConfig();
  }
}

void setup() {
  Wire.pins(0, 2);
  if (!bmp.begin()) {
  Serial.println("Could not find a valid BMP085 sensor, check wiring!");
  while (1) {}
  }
  delay(50);
        temp = String(bmp.readTemperature());
        davlen= String(bmp.readPressure()/133);
        stat[0] = setStatus( temp );
        stat[1] = setStatus( davlen );

  WiFi.mode(WIFI_STA);
  initVar();
  oldtime = 0;
  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.println();
  Serial.println("MQTT client started.");
  FreeHEAP();
  freeheap = 100000;
  WiFi.disconnect();
  WiFi.printDiag(Serial);
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Connecting via WiFi to ");
    Serial.print(ssid);
    Serial.println("...");

    WiFi.begin(ssid, pass);

    if (WiFi.waitForConnectResult() != WL_CONNECTED) {
      return;
    }
          
    Serial.println("");
    Serial.println("WiFi connect: Success");
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  }

  if (WiFi.status() == WL_CONNECTED) {
    if (!client.connected()) {
      Serial.println("Connecting to MQTT server ...");
      bool success;
      if (mqttuser.length() > 0) {
        success = client.connect( MQTT::Connect( deviceID ).set_auth(mqttuser, mqttpass) );
      } else {
        success = client.connect( deviceID );
      }
      if (success) {
        client.set_callback(callback);
        Serial.println("Connect to MQTT server: Success");
        client.subscribe(prefix); // for receiving HELLO messages and handshaking
        pubConfig();
      } else {
        Serial.println("Connect to MQTT server: FAIL");
        delay(1000);
      }
    }

    if (client.connected()) {
      newtime = millis();
      if (newtime - oldtime > 10000) { // publish data every 100 sec
     
     
        temp = String(bmp.readTemperature());
        davlen= String(bmp.readPressure()/133);
        stat[0] = setStatus( temp );
        stat[1] = setStatus( davlen );
          for (int i = 0; i < nWidgets; i = i + 1) {
            pubStatus(sTopic[i], stat[i]);
            delay(100);
          }
        oldtime = newtime;
      }
      client.loop();
    }
  }
}

P.S. Хочу попросить разрешения, на публикацию статьи о данном приложении у себя на сайте.
 

Вложения

Последнее редактирование:

Victor

Administrator
Команда форума
Краткое описание: esp8266 -01 опрашивает датчик давления BMT180, полученные данные (давление и температуру) отправляет брокеру. IoT Manager берет эти данные у брокера и отображает на экране мобильного телефона
Классно, мне нравится
попытался его выложить на github правда не знаю на сколько у меня это получилось
не получилось, по крайней мере, здесь нет. почитайте про [inline]pull request[/inline] если есть желание научиться, если нет - скажите я залью сам, или залейте в свой собственный, я поставлю у себя ссылку на гитхабе. Только вот библиотеку лучше со ссылкой на автора (для обновлений)
Хочу попросить разрешения, на публикацию статьи о данном приложении у себя на сайте.
Да, разумеется. Если нужно в чем-то мое участие - без проблем, с удовольствием помогу.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу