• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Прошу оказать помощь

vgkcom

New member
Прошу оказать помощь в присвоении widgetConfig в среде IDE arduino. Вроде разобрался в виджите Steel но не могу управлять конфигом, не отображается название и другие свойства widgetConfig.

Например
{
id :"1",
descr :"Steel 1",
widget :"steel",
topic :refix + "/" + deviceID + "/steel1",
widgetConfig : {
width : "auto",
height : 100,
type : "Linear",
titleString: "Thermometer 1",
unitString : "temp C",
threshold: 90
}

В ардуино задаю так. Виджет на телефоне появляется но без названия.

JsonObject& root1 = jsonBuffer.createObject();
root1["id"] = 1;
root1["descr"] ="Steel 1";
root1["widget"] ="steel";
sTopic[1] = prefix + "/" + deviceID + "/steel1";
root1[ "titleString"] = "Thermometer";
и так далее,
но root1["titleString"] ="Thermometer 1"; не отображает название.
как правильно задать widgetConfig.
 

Юрий Ботов

Moderator
Команда форума
Может не понял вопроса... но... если вы отправляете json с сервера на телефон, если он изначально "статичен", если в нем не надо заниматься подстановкой полей и т.п.... просто напишите json как он есть (ваше "например") сохраните в строку и передайте клиенту (телефону) эту строку. JsonObject предназначен скорее для разбора или динамического изменения нежели для создания статических документов.
 

tretyakov_sa

Moderator
Команда форума
Вот как это выглядит после всех обработок:
Код:
{
  "nWidgets": [
    {
      "id": "1",
      "descr": "Steel 1",
      "widget": "steel",
      "topic": "/steel1",
      "widgetConfig": {
        "width": "auto",
        "height": 100,
        "type": "Linear",
        "titleString": "Thermometer 1",
        "unitString": "temp C",
        "threshold": 90
      }
    }
  ]
}
Топик конечно нужно поправить.
 

vgkcom

New member
Вот как это выглядит после всех обработок:
Код:
{
  "nWidgets": [
    {
      "id": "1",
      "descr": "Steel 1",
      "widget": "steel",
      "topic": "/steel1",
      "widgetConfig": {
        "width": "auto",
        "height": 100,
        "type": "Linear",
        "titleString": "Thermometer 1",
        "unitString": "temp C",
        "threshold": 90
      }
    }
  ]
}
Топик конечно нужно поправить.
Спасибо за быстрый ответ, я начинающий программист и в основном беру примеры из готовых скетчей, этот написан для JS, и выдает ошибку:
Arduino: 1.6.5 (Windows 8.1), Плата"NodeMCU 1.0 (ESP-12E Module), 80 MHz, 115200, 4M (3M SPIFFS)"

Изменена опция сборки, пересобираем все

MQTTdisplay-value_widget_demo.ino: In function 'void initVar()':
MQTTdisplay-value_widget_demo:152: error: expected ';' before ':' token
MQTTdisplay-value_widget_demo:291: error: expected '}' at end of input
MQTTdisplay-value_widget_demo:291: error: expected '}' at end of input
Multiple libraries were found for "PubSubClient.h"

Used: D:\Скетч Arduino\libraries\pubsubclientesp8266

Not used: D:\Скетч Arduino\libraries\PubSubClient

expected ';' before ':' token

Это сообщение будет содержать больше информации чем
"Отображать вывод во время компиляции"
включено в Файл > Настройки
 

vgkcom

New member
Вот мой так сказать отладочный скетч:

Код:
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

const char *ssid =  "ASUS";            // cannot be longer than 32 characters!
const char *pass =  "qwer1234";       // 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 = "m10.cloudmqtt.com";            // for cloud broker - by hostname, from CloudMQTT account data
int    mqttport = 12416;                                // default 1883, but CloudMQTT.com use other, for example: 13191, 23191 (SSL), 33191 (WebSockets) - use from CloudMQTT account data
String mqttuser =  "test";                              // from CloudMQTT account data
String mqttpass =  "test";                              // from CloudMQTT account data
PubSubClient client(wclient, mqttServerName, mqttport); // for cloud broker - by hostname


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() {

  pin   [0] = A0;     // ADC
  sTopic[0] = prefix + "/" + deviceID + "/ADC";
  stat  [0] = setStatus (0);

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

  root["id"] = 0;
  root["page"] = "ADC";
  root["widget"] = "display-value";
  root["class1"] = "item no-border";                          // class for 1st div
  root["style1"] = "";                                        // style for 1st div
  root["descr"]  = "DisplayValue";                            // 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"]   = 5;                                 // how many digits
  root.printTo(thing_config[0]);

  // widget1
   JsonObject& root1 = jsonBuffer.createObject();
   root1["id"] = 1;
   root1["descr"] ="Steel 1";
   root1["widget"] ="steel";
   sTopic[1] = prefix + "/" + deviceID + "/steel1";
   stat  [1] = setStatus (1);
   root1["width"] ="auto";
   root1["height"] =100;
   root1["type"] = "Linear";

// вот тут как правильно задать конфиг

   root1[ "titleString"] = "Thermometer";   
   root1["unitString"] = "temp C";
   root1["threshold"] = 70;
   root1["lcdVisible"] = true;
   root1["thresholdVisible"] = true;
   root1["thresholdRising"] = true;

   root1.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).set_qos(1));
        if (success) {
          Serial.println("Publish config: Success (" + thing_config + ")");
        } else {
          Serial.println("Publish config FAIL! ("    + thing_config + ")");
        }
        delay(150);
      }    
  }
  if (success) {
     Serial.println("Publish config: Success");
  } else {
     Serial.println("Publish config: FAIL");
  }

       stat[0] = setStatus( analogRead(pin[0]) );
     
        int rrr = 100;
        stat[1] = setStatus (rrr);
     
  for (int i = 0; i < nWidgets; i = i + 1) {
      pubStatus(sTopic, stat);
      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() {
  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) { // read ADC and publish data every 10 sec
        stat[0] = setStatus( analogRead( pin[0] ) );
        pubStatus(sTopic[0], stat[0] );
        int rrr = 100;
        stat[1] = setStatus (rrr);
        pubStatus(sTopic[1], stat[1] );
        oldtime = newtime;
      }
      client.loop();
    }
  }
}
 
Последнее редактирование модератором:

vgkcom

New member
Все разобрался, перевел все в строку:
thing_config[1] = "{\"id\":1, \"descr\":\"Steel 1\",\"page\":\"ADC\",\"widget\":\"steel\",\"topic\":\"/IoTmanager/dev04/steel1\",\"widgetConfig\":{\"width\":\"auto\",\"height\":100,\"type\":\"Linear\",\"titleString\":\"Температура\",\"unitString\":\"°C\",\"threshold\":10,\"minValue\" : -10, \"maxValue\" : 30 } }";
 

джеки

New member
Юрий Ботов Здравствуйте....извините если не в тему....может поможете , я никак не могу врезать в код - IoTmanager2 .ino ( https://gist.github.com/4refr0nt/7d0ac08a5e530957b311rate)
"vibrate:50 + beep: 1" надо так чтоб при изменённом состоянии на входе GPIO2 письчало и дребезжало......я готов озолотить за помощь
 
Последнее редактирование:
Сверху Снизу