I have 3 Particle Xenons and 1 Argon. The 3 Xenons are sending their battery to the Ubidot dashboard every time a timer expires. When the timer is called voltage i sent as follow
#ifdef Xenon
void timerUbidotInformation(void){
float voltage = analogRead(BATT) * 0.0011224;
Particle.publish("voltage", String::format("%.2f",voltage), PRIVATE);
Particle.subscribe("particle/device/name", Name_of_Device); // get the device name
Particle.publish("particle/device/name"); // ask the cloud for the name to be sent to you
ubidots.add(dev_name, voltage);
ubidots.meshPublishToUbidots("Ubidots"); // webhook its publishing to on particle consol
}
#endif
This seems to only work after the 2nd time the function is called. On the first time it seems to publish the battery voltage as a label with “0” data.
I suspect the error is being generated by some gateway configurations. Could you share the code you are using in the Argon? This way I can evaluate the actual configurations, and check if they are the cause of the problem.
Hi there, which protocol are you using in your gateway? If you use HTTP or TCP, they have implemented a throttling of 20 seconds in the gateway side to avoid memory issues, so I suspect that some of the data of your nodes is being rejected because of this. My advise for two or more nodes is to use UBI_PARTICLE as iot protocol in your gateway, in this way you will use particle webhooks and won’t be affected by the library’s throttling.
Thanks Guys, I am using Ubidots ubidots(“webhook”, UBI_PARTICLE); on both Argon and Xenon.I removed 2 xenons and only have one connected so that I can see whats happening.
It looks like a timing issue between the Mesh.ready() and the request of dev_name, Not much code on my Argon that would influence this except in the setup.
I am now experimenting with " waitUntil(Particle.connected); " as I suspect im requesting the name to be returned before its connected.
#define Argon // all below is for argon gateway
int led2 = D7;
bool DetonateSatus = 0; // holds the status for detonation.
SYSTEM_THREAD(ENABLED);
const char *EVENT_NAME = "Beacon MAC"; // here we need to change it to name of node if possible
/********************************************************************************************/
//Ubidots
const char* WEBHOOK_NAME = "Ubidots";
Ubidots ubidots("webhook", UBI_PARTICLE);
//Ubidots ubidots(UBIDOTS_TOKEN, UBI_INDUSTRIAL, UBI_MESH);
void setup() {
SYSTEM_MODE(AUTOMATIC);
Particle.keepAlive(20);
Serial.begin(115200);
pinMode(led2, OUTPUT); // output for triggered led
BLE.setTxPower(-8); // Use lower power // Use lower power -20, -16, -12, -8, -4, 0, 4, 8.
timer.start(); // start timer to send info to ubidots once per hour or whatever its set to
//ubidots.setDebug(true); // Uncomment this line for printing debug messages
ubidots.setCloudProtocol(UBI_PARTICLE);
softDelay(5000); // Allow board to settle
}
That probably may be the issue, would you mind to uncomment the setDebug() and to print what do you get in your serial monitor for both node and gateway?
Adding “ubidots.setDebug(true);” in my Xenon setup for some reason does not print out any debug or payload info. What I did was inserted some Serial.printlnf statements at each step to see when the name is copied. my findings and my solution below.
//when timer expires send battery voltage with Xenon name.
void timerUbidotInformation(void){
float voltage = analogRead(BATT) * 0.0011224;
Particle.publish("voltage", String::format("%.2f",voltage), PRIVATE);
// get the device name
waitUntil(Particle.connected);
Particle.subscribe("particle/device/name", Name_of_Device);
softDelay(3000);
Particle.publish("particle/device/name"); // ask the cloud for the name to be sent to you
ubidots.add(dev_name, voltage); //pair Vbatt with name of Xenon
ubidots.meshPublishToUbidots("Ubidots"); // webhook its publishing to on particle console
}
// used for getting the device name ***********************************************
void Name_of_Device(const char *topic, const char *data) {
strncpy(dev_name, data, sizeof(dev_name)-1);
Serial.printlnf("received name from subscribe/publish call : %s", dev_name);
publishName = true;
strncpy(VARIABLE_LABEL, dev_name, sizeof(dev_name));
Serial.printlnf("variable label %s", VARIABLE_LABEL);
//when timer expires send battery voltage with Xenon name.
void timerUbidotInformation(void){
waitUntil(Particle.connected);
Particle.subscribe("particle/device/name", Name_of_Device);
softDelay(3000);
Particle.publish("particle/device/name"); // ask the cloud for the name to be sent to you
}
// used for getting the device name ***********************************************
void Name_of_Device(const char *topic, const char *data) {
strncpy(dev_name, data, sizeof(dev_name)-1);
Serial.printlnf("received in supscribe/publish request%s: %s", topic, dev_name);
publishName = true;
strncpy(VARIABLE_LABEL, dev_name, sizeof(dev_name));
Serial.printlnf("variable label that is copied from dev_name : %s", VARIABLE_LABEL);
float voltage = analogRead(BATT) * 0.0011224;
Particle.publish("voltage", String::format("%.2f",voltage), PRIVATE);
ubidots.add(VARIABLE_LABEL, voltage); //pair Vbatt with name of Xenon
Serial.printlnf("variable label that is uploaded to ubidots : %s", VARIABLE_LABEL);
ubidots.meshPublishToUbidots("Ubidots"); // webhook its publishing to on particle consol
Hi there @Melt777, thanks for sharing your solution, my thoughts are related with the variable dev_name , probably there is a type issue (the add() method expect a const char* type) or that array is not being populated as fast as you need.
Anyway, I am glad to know that it is working properly at your side.