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

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

джеки

New member
....всех С Новым Годом!......люди добрые может кто подскажет куда врезать в код - IoTmanager - vibrate:50 + beep: 1 надо так чтоб при изменённом состоянии на входе GPIO письчало и дребезжало
 

Mоnk

Member
Подскажите.
Потребовалось использовать Push- сообщения. Как сформировать http запрос? Можно пример?
Ссылка в инструкции на onesignal не рабочая.
Хотите сказать, что iot-manager-demo/PushNotifications.ino at master · 4refr0nt/iot-manager-demo · GitHub не работает?

Код:
void loop()
{
  delay(7000);
      String freeheap = String(ESP.getFreeHeap());
      push(freeheap);
}

void push(String push_msg)
{
  WiFiClientSecure push_client;
  if (!push_client.connect("onesignal.com", 443)) return;

  String push_data = "{\"app_id\": \"8871958c-5f52-11e5-8f7a-c36f5770ade9\",\"include_player_ids\":[\"Тут-Код-телефона-из-ИотМанагера\"],\"android_group\":\"IoT Manager\",\"contents\": {\"en\": \"" + push_msg + "\"}}";

  push_client.println("POST /api/v1/notifications HTTP/1.1");
  push_client.print("Host:");
  push_client.println("onesignal.com");
  push_client.println("User-Agent: esp8266.Arduino.IoTmanager");
  push_client.print("Content-Length: ");
  push_client.println(push_data.length());
  push_client.println("Content-Type: application/json");
  push_client.println("Connection: close");
  push_client.println();
  push_client.println(push_data);
}
 

Mоnk

Member
....всех С Новым Годом!......люди добрые может кто подскажет куда врезать в код - IoTmanager - vibrate:50 + beep: 1 надо так чтоб при изменённом состоянии на входе GPIO письчало и дребезжало
Код:
\"widgetConfig\":{\"alertTitle\":\"Вопрос:\",\"alertText\":\"Включить непрерывный нагрев?\"
\"toastLong\":\"Настройки сохранены\"
или еще как нибудь...
 
Последнее редактирование:

джеки

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

джеки

New member
....короче я так понял что есть как вариант прописать в - void pub status .....так в базовом примере идёт вибрация (для temp).....а мне нужно при сработке GPIO......короче я вот чё пробовал --
 

Вложения

Mоnk

Member
.....эх Monk.....что ты всё вокруг да около вертишь ,ты по конкрентнее напиши .....чтоб работало
На Вас, милочка, не угодишь! Пишу по пунктам, игнорируете. Даю подсказку - "вокруг да около" в ответ.
В любом случае, как говорили древние (греки) - "чаще поворачивай стиль". В том смысле, что "нужные" кавычки в коде необходимо экранировать.
 

Mоnk

Member
@blue_shark, примите мои искренние извинения за излишне фамильярное обращение, а именно "пацанчик". И в подтверждение моих слов протестированный буквально сейчас эскиз.
Код:
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <ESP8266Ping.h>        //---------- https://github.com/dancol90/ESP8266Ping

const char* remote_host = "www.google.ru"; // Для ping www.google.ru
const char* bssid[] =
  {
  "00:26:99:70:ED:90"  // WhiteBox-2
  };
const char* ssid[] =
  {
  "WhiteBox-2"
  };
const char* password[] =
  {
  "тут пароль от точки доступа"
  };

void setup()
{
}

void loop()
{
  WiFi.begin(ssid[0], password[0]);
  delay(7000);
 
    if(Ping.ping(remote_host))  // if(Ping.ping(remote_ip))
    {
      String freeheap = String(ESP.getFreeHeap());
      freeheap = freeheap + " " + String(ssid[0]) + " GooglePing ok";
      push(freeheap);
    }
    else
    {
      String freeheap = String(ESP.getFreeHeap());
      freeheap = freeheap + " " + String(ssid[0]) + " GooglePing failing";
      push(freeheap);
    }

  WiFi.disconnect();
  delay(5000);
}

void push(String push_msg)
{
  WiFiClientSecure push_client;
  if (!push_client.connect("onesignal.com", 443)) return;

  String push_data = "{\"app_id\": \"8871958c-5f52-11e5-8f7a-c36f5770ade9\",\"include_player_ids\":[\"тут push id из мобильного устройства\"],\"android_group\":\"IoT Manager\",\"contents\": {\"en\": \"" + push_msg + "\"}}";

  push_client.println("POST /api/v1/notifications HTTP/1.1");
  push_client.print("Host:");
  push_client.println("onesignal.com");
  push_client.println("User-Agent: esp8266.Arduino.IoTmanager");
  push_client.print("Content-Length: ");
  push_client.println(push_data.length());
  push_client.println("Content-Type: application/json");
  push_client.println("Connection: close");
  push_client.println();
  push_client.println(push_data);
}
Screenshot_2018-01-06-14-27-21.png Screenshot_2018-01-06-14-30-16.png
 

Mоnk

Member
Про stable/package 2.4.0...
Тщательно почистил систему от АрдуиныАйДИ, установил arduino-1.8.5-windows, накатил stable/package_esp8266 2.4.0, освежил левые библиотеки (в том числе #include <PubSubClient.h> // GitHub - Imroy/pubsubclient: A client library for the ESP8266 that provides support for MQTT), скомпилил рабочий эскиз.
Погоревал над увеличившимся размером бинарника, порадовался увеличившемуся на 2К размеру свободной оперативки.
Радовался недолго. До брокера данные не долетают, НТТР-обновлялка вроде работает, но криво.
Разбираться не стал. Вернул 2.3.0. Все ожило и задышало.
 

джеки

New member
@blue_shark, примите мои искренние извинения за излишне фамильярное обращение, а именно "пацанчик". И в подтверждение моих слов протестированный буквально сейчас эскиз.
Код:
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <ESP8266Ping.h>        //---------- https://github.com/dancol90/ESP8266Ping

const char* remote_host = "www.google.ru"; // Для ping www.google.ru
const char* bssid[] =
  {
  "00:26:99:70:ED:90"  // WhiteBox-2
  };
const char* ssid[] =
  {
  "WhiteBox-2"
  };
const char* password[] =
  {
  "тут пароль от точки доступа"
  };

void setup()
{
}

void loop()
{
  WiFi.begin(ssid[0], password[0]);
  delay(7000);
 
    if(Ping.ping(remote_host))  // if(Ping.ping(remote_ip))
    {
      String freeheap = String(ESP.getFreeHeap());
      freeheap = freeheap + " " + String(ssid[0]) + " GooglePing ok";
      push(freeheap);
    }
    else
    {
      String freeheap = String(ESP.getFreeHeap());
      freeheap = freeheap + " " + String(ssid[0]) + " GooglePing failing";
      push(freeheap);
    }

  WiFi.disconnect();
  delay(5000);
}

void push(String push_msg)
{
  WiFiClientSecure push_client;
  if (!push_client.connect("onesignal.com", 443)) return;

  String push_data = "{\"app_id\": \"8871958c-5f52-11e5-8f7a-c36f5770ade9\",\"include_player_ids\":[\"тут push id из мобильного устройства\"],\"android_group\":\"IoT Manager\",\"contents\": {\"en\": \"" + push_msg + "\"}}";

  push_client.println("POST /api/v1/notifications HTTP/1.1");
  push_client.print("Host:");
  push_client.println("onesignal.com");
  push_client.println("User-Agent: esp8266.Arduino.IoTmanager");
  push_client.print("Content-Length: ");
  push_client.println(push_data.length());
  push_client.println("Content-Type: application/json");
  push_client.println("Connection: close");
  push_client.println();
  push_client.println(push_data);
}
Посмотреть вложение 5395 Посмотреть вложение 5396
послушай Monk...твои протестированные эскизы не помогают решить мою задачку......у меня ни чего не получается
 

джеки

New member
......с этим вроде разобрался.....вот только не пойму как запускаются примеры по протоколу v 2.0..........в них нет ssid, а в базовые примеры не запускаются выдаёт ошибку var config................где вообще описание по данному материалу смотреть???
 

джеки

New member
JavaScript:
// Demo device emulator "Boiler: thermostat with adjustable hysteresis"
//
// IoT Manager
// for Android https://play.google.com/store/apps/details?id=ru.esp8266.iotmanager
// for iOS     https://itunes.apple.com/us/app/iot-manager/id1155934877
//
// version     : 1.1
// IoT Manager : 1.4.8 and above
//
////////////////////////////////////////////////
#define var;
////////////////////////////////////////////////
var config = require("./config");
var host = config.host;
var port = config.port;
var user = config.user;
var pass = config.pass;
////////////////////////////////////////////////

var mqtt = require('mqtt');
var opt = {
  host       : host,
  port       : port,
  username   : user,
  password   : pass,
  clientId   : 'mqtt-js_' + Math.random().toString(16).substr(2, 8),
  protocolId : 'MQTT',
  connectTimeout: 3000
};


var heater = false;
var waterTemp = 20;
var hiTemp    = 40;
var hysteresis= 5;
var lowTemp   = hiTemp - hysteresis;
var manualStop= false;
var lastHeater= true;
var lastAlert = true

var deviceID = "boiler-0001";
var prefix   = "/IoTmanager";
var config   = [solije];
var client   = mqtt.connect(opt);

// First line
var widget   = "anydata";
var id       = "0"
config[0] = {
  id     : id,
  page   : "boiler",
  pageId : 1,
  widget : widget,
  class1 : "item no-border",
  style2 : "font-size:16px;",
  topic  : prefix + "/" + deviceID + "/" + widget + id,
  class3 : "calm text-center",
  style3 : "font-size:20px;",
  status : "Boiler"
};


// -
widget    = "simple-btn";
id        = "1"
config[1] = {
  id     : id,
  page   : "boiler",
  pageId : 1,
  widget : widget,
  class1 : "text-left no-padding-right col-xs-4",
  class2 : "calm",
  topic  : prefix + "/" + deviceID + "/" + widget + id,
  class3 : "button button-calm icon ion-minus",
  style3 : "height:70px;",
};

// temp
widget    = "display-value";
id        = "2"
config[2] = {
  id     : id,
  page   : "boiler",
  pageId : 1,
  widget : widget,
  class1 : "text-center no-padding-left no-padding-right col-xs-4",
  topic  : prefix + "/" + deviceID + "/" + widget + id,
  height : "70",
  color  : "#58b7ff",
  inactive_color : "#414141",
  digits_count   : 2
};

// +
widget    = "simple-btn";
id        = "3"
config[3] = {
  id     : id,
  page   : "boiler",
  pageId : 1,
  widget : widget,
  class1 : "text-right no-padding-left col-xs-4",
  class2 : "calm",
  topic  : prefix + "/" + deviceID + "/" + widget + id,
  class3 : "button button-calm icon ion-plus",
  style3 : "height:70px;",
};

// Current temp
widget    = "anydata";
id        = "4"
config[4] = {
  id     : id,
  page   : "boiler",
  pageId : 1,
  widget : widget,
  class1 : "item no-border",
  style2 : "font-size:16px;float:left",
  descr  : "Current water temp",
  topic  : prefix + "/" + deviceID + "/" + widget + id,
  class3 : "assertive",
  style3 : "font-size:40px;font-weight:bold;float:right",
};

// Heater status
widget    = "anydata";
id        = "5"
config[5] = {
  id     : id,
  page   : "boiler",
  pageId : 1,
  widget : widget,
  class1 : "item no-border",
  style2 : "font-size:16px;float:left;line-height:1.5em;",
  descr  : "Heater status",
  topic  : prefix + "/" + deviceID + "/" + widget + id,
  class3 : "light padding-left padding-right rounded",
  style3 : "font-size:20px;font-weight:bold;float:right;line-height:1.5em;",
};

// Stop
widget    = "simple-btn";
id        = "6"
config[6] = {
  id     : id,
  page   : "boiler",
  pageId : 1,
  widget : widget,
  topic  : prefix + "/" + deviceID + "/" + widget + id,
  class1 : "item no-border padding-bottom",
  descr  : "Emergency Stop heating",
  class2 : "assertive padding-top",
  style2 : "font-size:16px;float:left;",
  class3 : "button icon ion-checkmark-circled",
  style3 : "float:right;",
  widgetConfig : {
    fill : "#FF5050",
    fillPressed : "#FF7070",
    label: "#FFFFFF",
    labelPressed: "#000000",
    alertText     : "A you sure?", // confirmation will be show after button pressed
    alertTitle    : "Stop heating",
  }
};


client.on('connect', function () {
  console.log('Broker connected');
  client.subscribe(prefix, { qos : 1 }); // HELLO expected
  client.subscribe(prefix + "/" + deviceID +"/+/control", { qos : 1 }); // all command
  pubConfig();
});

client.on('error', function () {
  console.log('error');
});

client.on('offline', function () {
  console.log('! offline');
});

client.on('message', function (topic, message) {
 
  //console.log("msg: " + topic.toString() + " => " + message.toString());

  if (topic.toString() === prefix && message.toString() == "HELLO" ){
    console.log('HELLO detected');
    pubConfig();
  }
  if (topic.toString() === config[1].topic + "/control" ){
    console.log("Receive command: max temp dec");

    hiTemp  = hiTemp - 1;
    lowTemp = lowTemp - 1;
   
    manualStop = false;
    pubControlTempStatus();
  }
  if (topic.toString() === config[3].topic + "/control" ){
    console.log("Receive command: max temp inc");

    hiTemp = hiTemp + 1;
    lowTemp = lowTemp + 1;

    console.log("New temp:" + hiTemp);
    if (hiTemp >= 90) {  // do not overheat
       hiTemp = 90;
    }
    if (manualStop) {
       client.publish(config[6].topic + "/status", JSON.stringify(config[6]),{ qos : 1 });
    }

    manualStop = false;
    pubControlTempStatus();
  }
  if (topic.toString() === config[6].topic + "/control" ){
    console.log("!!! Receive command: manualStop heater control");

    var newStyle = {
        descr  : "Heating already stopped",
//        class3 : "button button-light icon ion-close-circled"
    }
    client.publish(config[6].topic + "/status", JSON.stringify(newStyle),{ qos : 1 });

    manualStop = true;
    heater = false;
    pubControlTempStatus();
    pubHeaterStatus();
  }
});
////////////////////////////////////////////////
function pubConfig() {
    client.publish( prefix, deviceID );
    config.forEach(function(item, i, arr) {
      client.publish(prefix + "/" + deviceID + "/config", JSON.stringify(item),{ qos : 1 });
    });   
    setTimeout(function() {
       pubControlTempStatus();
       pubHeaterStatus(true);
    }, 500);
}

////////////////////////////////////////////////
function pubAlert() {
   widget = "anydata";
   id     = "7"
   var cfgAlert = {
     id     : id,
     page   : "boiler",
     pageId : 1,
     widget : widget,
     class1 : "item rounded text-center no-padding",
     class2 : "assertive-bg light",
     style2 : "font-size:20px;font-weight:bold",
     descr  : "FREEZE ALERT !!!",
     topic  : prefix + "/" + deviceID + "/" + widget + id
   }; 
   cfgNoAlert = {
     id     : id
   };
   if (waterTemp <= 5) {
      if (waterTemp < 0) waterTemp = 0;
      if (lastAlert) {
          client.publish(prefix + "/" + deviceID + "/config", JSON.stringify(cfgAlert),{ qos : 1 });
          console.log("Pub Alert!")
          lastAlert = !lastAlert
      }
   } else {
      if (!lastAlert) {
          client.publish(prefix + "/" + deviceID + "/config", JSON.stringify(cfgNoAlert),{ qos : 1 });
          console.log("Pub no alert")
          lastAlert = !lastAlert
      }
   }
}
////////////////////////////////////////////////
function pubWaterTempStatus() {
  client.publish( config[4].topic+"/status", JSON.stringify({ status: waterTemp + "°C" }) );
}
////////////////////////////////////////////////
function pubControlTempStatus() {
  client.publish( config[2].topic+"/status", JSON.stringify({ status: hiTemp }) );
}
////////////////////////////////////////////////
function pubHeaterStatus( force ) {
  if (lastHeater !== heater || force) {
        var newStyle;
        var newStyle1;
        if (heater) {
            newStyle = { status : "ON",  class3 : "assertive-bg light padding-left padding-right rounded" }
            newStyle1 = {
                descr  : "Emergency Stop heating",
                class2 : "assertive padding-top",
                class3 : "button icon ion-checkmark-circled",
                widgetConfig : {
                fill        : "#FF5050",
                fillPressed : "#FF7070",
                disabled: 0
              }
            }
        } else {
            newStyle = { status : "OFF", class3 : "calm-bg light padding-left padding-right rounded" }
            newStyle1 = {
                descr  : "Heating already stopped",
                class2 : "calm padding-top",
                class3 : "button icon ion-close-circled",
//                style3 : "display:none;",
                widgetConfig : {
                 fill : "#AAAAAA",
                 fillPressed: "#EEEEEE",
                 disabled: 1
                }
            }
        }
        lastHeater = heater;
        client.publish( config[5].topic + "/status", JSON.stringify(newStyle)  );
        client.publish( config[6].topic + "/status", JSON.stringify(newStyle1) );
  }
}
////////////////////////////////////////////////
// run main
console.log('Start');

setInterval(function() {
   // check current temp and run heater
   if (waterTemp < hiTemp && !heater) {
      if (waterTemp < lowTemp && !manualStop) {
         heater = true;
         pubHeaterStatus();
      }
   }
   if (waterTemp < lowTemp && !manualStop) {
      heater = true;
      pubHeaterStatus();
   }
   if (waterTemp >= hiTemp ) {
      heater = false;
      pubHeaterStatus();
   }
}, 200);

setInterval(function() {
   if (heater && !manualStop) {
      waterTemp = waterTemp + 1;
      console.log("waterTemp inc="+waterTemp);
      pubAlert();
      pubWaterTempStatus();
   }
}, 1000);
setInterval(function() {
   if (!heater || manualStop) {
      waterTemp = waterTemp - 1;
      console.log("waterTemp dec="+waterTemp);
      pubAlert();
      pubWaterTempStatus();
   }
}, 1000);

////////////////////////////////////////////////
 

джеки

New member
@Mоnk
.....эт ты правильно подметил --" долгое нудное чтение в Гугле.".....тычешь туда сюда в разные сайты пытаешься понять как работает тот или иной код.....толку мало время течёт......и что спрашивается автору трудно ему было сразу пример хоть один прописать для незнаек.........где вот этот автор --- АВТОР!!! отзовитесь!!!
 
Последнее редактирование:

Mоnk

Member
Что то как то тихо стало...
display-value и сдвиг закладок всё в той же стадии...
 
Сверху Снизу