thingsboard-client-sdk: [Question] Server-Side RPC: Receiving Attributes doesn't work

  • Generic
  • Rule Engine(?)

Description Hey guys,

i’m currently working on a server-side rpc application. I basically want to turn on an analog LED via TB. The later works fine (see picture), but when I also want to mirror the analog led on my dashboard, like in this tutorial. Therefore I created a server-side attribute called ‘ledStatus’ and linked an led indicator to its changes. To send the status i use this TB-function for example:

client.sendAttributeBool("ledStatus", ledStatus);

The problem is that TB doesn’t seemt to receive the change of the ledStatus. Am I missing something? Do i maybe have to make a rule chain to process information coming from the device?

I hope my problem is kind of understandable. Suggestions are always appreciated 😃

Greetings Reno

grafik

Here is the current code. I use the Arduino IDE for coding:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ThingsBoard.h>

// AP-DE
#define home "XXXXX"
#define homepw "XXXXXXXX"

// Auswahl des TB-Access Points:
#define TB_TOKEN "XXXXXX" 
#define TB_SERVER "demo.thingsboard.io"
//#define TB_PORT 1883

// Initialization:
WiFiClient wifiClient;           
ThingsBoard client(wifiClient);  

// Select AP:
const char* ssid = home;      
const char* password = homepw;

// Other Variables:
const int led = D2;
bool ledStatus = false;
bool previousState = false;

int status = WL_IDLE_STATUS;

void setup() {

  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  Serial.begin(9600);               
  InitWiFi();                             
  client.connect(TB_SERVER, demo_TOKEN);  // Definition des MQTT-Server
}

///////////////////// RPC-SETTINGS /////////////////////

RPC_Response processSwitchChange(const RPC_Data& data) {
  Serial.println("Received 'processSwitchChange'-method: ");
  char params[10];
  serializeJson(data, params);
  String _params = params;

  if (_params == "true") {
    Serial.println("SWITCH: ON");
    ledStatus = true;
    return RPC_Response("processSwitchChange", "true");

  } else if (_params == "false") {
    Serial.println("SWITCH: OFF");
    ledStatus = false;
    return RPC_Response("processSwitchChange", "false");
  }
}

const size_t callbacks_size = 1;
RPC_Callback callbacks[callbacks_size] = {
  { "processSwitchChange", processSwitchChange }
};

bool subscribed = false;  //RPC-Subscribe Status

///////////////////////////////////////// //Serial.printf(previousState != ledStatus ? "true" : "false");

void loop() {

  // Maintain connection
  if (!client.connected()) {
    reconnect();
  }

  checkRPC_Subscription();

  // Sends 
  if (previousState != ledStatus) {
    Serial.println();
    Serial.println("[SWITCH STATE CHANGED]");

    if (ledStatus == true) {
      digitalWrite(led, HIGH);
      Serial.println("LED: ON");
      client.sendAttributeBool("ledStatus", true);
    } else {
      digitalWrite(led, LOW);
      Serial.println("LED: OFF");
      client.sendAttributeBool("ledStatus", false);
    }

    previousState = ledStatus;
  }

  client.loop();
}

/////////////////////////////// OTHER FUNCTIONS ////////////////////////////////////

void InitWiFi() {
  Serial.print("Connecting to Access Point...");
  WiFi.begin(ssid, password);  // Eingabe der Zugangsdaten

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);  // "." bis Verbindung hergestellt ist
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());
}

void reconnect() {
  while (!client.connected()) {

    status = WiFi.status();
    if (status != WL_CONNECTED) {
      InitWiFi();
    }

    // Reconnect
    Serial.print("Connecting to ThingsBoard Device ...");
    if (client.connect("ESP8266 Device", TB_TOKEN, NULL)) {
      Serial.println("[DONE]");
    } else {
      Serial.print("[FAILED] Retrying in 5 seconds]");
      delay(5000);
    }
  }
}


void checkRPC_Subscription() {
  if (!subscribed) {
    Serial.println("Subscribing for RPC...");

    if (!client.RPC_Subscribe(callbacks, callbacks_size)) {
      Serial.println("Failed to subscribe for RPC");
      return;
    }

    Serial.println("Subscribe done");
    subscribed = true;
  }
}

Environment

  • OS: Win10,
  • ThingsBoard: TB Demo
  • Browser: Firefox

About this issue

  • Original URL
  • State: closed
  • Created a year ago
  • Comments: 85 (39 by maintainers)

Most upvoted comments

Okay I found the issue:

  1. The file you need to download is the .jar not the .java that was a mistake on my part sorry, you can download it from the Release page on the GitHub repository
  2. Then change the command too java -jar EspStackTraceDecoder.jar xtensa-lx106-elf-addr2line code.elf exception.txt
  3. I’m also pretty sure the xtensa you got didn’t work for me, using the ESP32 xtensa I had in my folder seemed to work tough. It was in this path /home/<user>/.platformio/packages/toolchain-xtensa-esp32/bin/. It seems like they can be used interchangeably not 100% sure about it tough

The output I got was

Exception Cause: 3  [LoadStoreError: Processor internal physical address or data error during load or store]

0x4022179e: strnlen at /workdir/repo/newlib/newlib/libc/string/strnlen.c:38 (discriminator 1)
0x4026f6ff: system_get_sdk_version at ??:?
0x4020b068: PubSubClient::connect(char const*, char const*, char const*, char const*, unsigned char, bool, char const*, bool) at C:\Program Files\Arduino IDE/c:\Users\Renaud Kenfack\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.cpp:196
 (inlined by) PubSubClient::connect(char const*, char const*, char const*, char const*, unsigned char, bool, char const*, bool) at C:\Program Files\Arduino IDE/c:\Users\Renaud Kenfack\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.cpp:181
0x4020e830: uart_write at C:\Program Files\Arduino IDE/C:\Users\Renaud Kenfack\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.0\cores\esp8266/uart.cpp:544
0x4026f6ff: system_get_sdk_version at ??:?
0x4020ba18: HardwareSerial::write(unsigned char const*, unsigned int) at C:\Program Files\Arduino IDE/C:\Users\Renaud Kenfack\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.0\cores\esp8266/HardwareSerial.h:193
0x4020b250: PubSubClient::connect(char const*, char const*, char const*) at C:\Program Files\Arduino IDE/c:\Users\Renaud Kenfack\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.cpp:171
0x4020bd68: Print::println() at C:\Program Files\Arduino IDE/C:\Users\Renaud Kenfack\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.0\cores\esp8266/Print.cpp:182
0x40205f6e: ThingsBoardSized<64u, 8u, ThingsBoardDefaultLogger>::connect_to_host(char const*, char const*, char const*) at C:\Program Files\Arduino IDE/c:\Users\Renaud Kenfack\Documents\Arduino\libraries\ThingsBoard\src/ThingsBoard.h:1018
0x4020573c: InitWiFi() at C:\Program Files\Arduino IDE/C:\Users\Renaud Kenfack\Documents\Arduino\Code_Sensor+RPC_TBv08/Code_Sensor+RPC_TBv08.ino:216
0x402115c4: std::_Function_handler<bool (), settimeofday::{lambda()#1}>::_M_manager(std::_Any_data&, std::_Function_handler<bool (), settimeofday::{lambda()#1}> const&, std::_Manager_operation) at time.cpp:?
0x402060f8: setup at C:\Program Files\Arduino IDE/C:\Users\Renaud Kenfack\Documents\Arduino\Code_Sensor+RPC_TBv08/Code_Sensor+RPC_TBv08.ino:37
0x4020d2e8: loop_wrapper() at C:\Program Files\Arduino IDE/C:\Users\Renaud Kenfack\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.0\cores\esp8266/core_esp8266_main.cpp:198
0x40100f65: cont_wrapper at C:\Program Files\Arduino IDE/C:\Users\Renaud Kenfack\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.0\cores\esp8266/cont.S:81

Problem solved. I forgot to add the ‘Save Attributes’-Node and the ‘Post Attributes’ in my Root Rule Chain.

But yeah trying it in 0.6.0 sounds good.

I’ll keep you posted.

Thank you very much for your time and help so far!

Interesting, I see your point i’ll try to change that.

Perfect I’ll see that the issue we found get’s merged into the base library sometime soon, but besides that it seems to work nice 😄.

This could help. Im using version 0.6 becasue i had issues with libraries in 0.7.1. I will keep you postd