# Stream analytics

**URL:** <https://discourse.nodered.org/t/stream-analytics/43721>\
**Category:** General\
**Created:** [5 April 2021 19:08 UTC](https://discourse.nodered.org/t/stream-analytics/43721 "2021-04-05T19:08:55Z")\
**Posts on this page:** 20\
**Page:** 2

<div class="post-metadata">

**Author:** ![Colin](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/colin/32/17040_2.png) [@Colin](https://discourse.nodered.org/u/Colin)\
**Post date:** [7 April 2021 08:12 UTC](https://discourse.nodered.org/t/stream-analytics/43721/21 "2021-04-07T08:12:44Z")

</div>

Show us how you have configured the serial node to give that output. Also I think you had better show us your latest Arduino code.

---

<div class="post-metadata">

**Author:** ![Alex95](https://avatars.discourse-cdn.com/v4/letter/a/74df32/32.png) [@Alex95](https://discourse.nodered.org/u/Alex95)\
**Post date:** [7 April 2021 15:14 UTC](https://discourse.nodered.org/t/stream-analytics/43721/22 "2021-04-07T15:14:25Z")

</div>

Yes of course. Serial node has the following form:

 ![COM5 NEW](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/7/6/76c5384376b96a3aa79042fd6a35c6884744f561.png)

And the code of server lora has the following form:

```auto

#include <Adafruit_BusIO_Register.h>
#include <Adafruit_I2CDevice.h>
#include <Adafruit_I2CRegister.h>
#include <Adafruit_SPIDevice.h>

#include <SPI.h>
#include <RH_RF95.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeMonoBold12pt7b.h>

RH_RF95 rf95;
int led = 13;
unsigned long int millisBefore;
int turn = 0;
int h, t, mmwaterValue;

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup()
{
  pinMode(led, OUTPUT);
  Serial.begin(115200);
  while (!Serial) ; // Wait for serial port to be available
  if (!rf95.init())
    Serial.println("init failed");
  rf95.setFrequency(868.0);
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Don't proceed, loop forever
  }
  // Clear the buffer
  display.clearDisplay();
  printText();
  delay(1500);
}
void loop()
{
  // Now wait for a reply
  uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);
  if (rf95.waitAvailableTimeout(500))
  {
    if (rf95.recv(buf, &len))
    {
      
      String dataTotal = (char*)buf;
  
      explode(dataTotal);
    }
    else
    {
      Serial.println("recv failed");
    }
  }
  printText();
  display.display();
  delay(300);
  display.clearDisplay();
  
}
void explode(String req) {
  char str[20];
  req.toCharArray(str, 20);
  char * pch;
  pch = strtok (str, "-");
  
  while (pch != NULL)
  {
    String sementara = pch;
    turn++;
    if (turn == 1) {
      
      //Serial.println(h);
      h = sementara.toFloat();
    }
    
    if (turn == 2) {
      
      //Serial.println(t);
      t = sementara.toFloat();
    }
    if (turn ==3) {
      
      //Serial.println(mmwaterValue);
      mmwaterValue = sementara.toFloat();
    }
    pch = strtok (NULL, "-");
    delay(100);
  }
   //Serial.println(h);
   //delay(5000); // vazoyme to delay etsi wste i node red na ksexwrisei ta dedomena apo to Arduino 
   //Serial.println(t);
   //delay(5000); //vazoyme to delay etsi wste i node red na ksexwrisei ta dedomena apo to Arduino
   //Serial.println(mmwaterValue);
   //delay(5000); //vazoyme to delay etsi wste i node red na ksexwrisei ta dedomena apo to Arduino
   String json = "{\"humidity\": " + String(h) + ", \"temperature\": " + String(t)+ ", \"water\": " +String(mmwaterValue) +" }";
   Serial.println(json);
  turn = 0;
  
}

void printText() {
  display.setFont(&FreeMonoBold12pt7b);
  display.setTextColor(WHITE); // Draw white text
  display.setCursor(0, 28); // Start at top-left corner
  display.print(t);
  display.drawCircle(34, 8, 3, WHITE);
  display.setCursor(40, 27);
  display.print("C");
  display.setCursor(80, 28);
  display.print(h);
  display.print("%");
}

```

---

<div class="post-metadata">

**Author:** ![Colin](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/colin/32/17040_2.png) [@Colin](https://discourse.nodered.org/u/Colin)\
**Post date:** [7 April 2021 15:47 UTC](https://discourse.nodered.org/t/stream-analytics/43721/23 "2021-04-07T15:47:32Z")

</div>

I have edited your post to add tripple backticks round the code so we can see what is really there.

You said you had configured the node to split on `}` but you have it splitting on `\n`

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [7 April 2021 15:57 UTC](https://discourse.nodered.org/t/stream-analytics/43721/24 "2021-04-07T15:57:08Z")

</div>

Can you try changing this...

> [@Alex95](#):
>
> ```auto
> String json = "{\"humidity\": " + String(h) + ", \"temperature\": " + String(t)+ ", \"water\": " +String(mmwaterValue) +" }";`
> Serial.println(json);
> 
> ```

to this...

```auto
String json = "{\"humidity\": " + h + ", \"temperature\": " + t + ", \"water\": " + mmwaterValue +" }\n";`
Serial.print(json);

```

---

<div class="post-metadata">

**Author:** ![Alex95](https://avatars.discourse-cdn.com/v4/letter/a/74df32/32.png) [@Alex95](https://discourse.nodered.org/u/Alex95)\
**Post date:** [7 April 2021 16:31 UTC](https://discourse.nodered.org/t/stream-analytics/43721/25 "2021-04-07T16:31:37Z")

</div>

i changed it and but i have this error:

 ![erroe](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/6/e/6e3d7f233f33d0777f76a8fad28e9ff778ab3d31.png)

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [7 April 2021 16:39 UTC](https://discourse.nodered.org/t/stream-analytics/43721/26 "2021-04-07T16:39:12Z")

</div>

Odd, according to `String` documentation, concatenating ints was OK.

Please try one more time...

```auto
String json = "{\"humidity\": " + String(h) + ", \"temperature\": " + String(t)+ ", \"water\": " +String(mmwaterValue) +" }\n";`
Serial.print(json);

```

And set the serial node config to split on `\n`

---

<div class="post-metadata">

**Author:** ![Alex95](https://avatars.discourse-cdn.com/v4/letter/a/74df32/32.png) [@Alex95](https://discourse.nodered.org/u/Alex95)\
**Post date:** [7 April 2021 16:44 UTC](https://discourse.nodered.org/t/stream-analytics/43721/27 "2021-04-07T16:44:58Z")

</div>

> [@Steve-Mcl](#):
>
> And set the serial node config to split on `\n`

i haven't error in Arduini code but the debug is still the same..

 ![debug1](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/7/d/7df22b7e8f737778d806d5366219ca169b0bfe21.png)

and the seiral node:

![node](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/0/8/085531bb91e99f6d81b2938ccd43604d93d3cb23.png)

---

<div class="post-metadata">

**Author:** ![Colin](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/colin/32/17040_2.png) [@Colin](https://discourse.nodered.org/u/Colin)\
**Post date:** [7 April 2021 17:44 UTC](https://discourse.nodered.org/t/stream-analytics/43721/28 "2021-04-07T17:44:08Z")

</div>

Try splitting on a gap of 100ms rather than a character and see what you get.

---

<div class="post-metadata">

**Author:** ![Alex95](https://avatars.discourse-cdn.com/v4/letter/a/74df32/32.png) [@Alex95](https://discourse.nodered.org/u/Alex95)\
**Post date:** [7 April 2021 18:17 UTC](https://discourse.nodered.org/t/stream-analytics/43721/29 "2021-04-07T18:17:17Z")

</div>

Unfortunately the same..

![com5 node](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/5/c/5c45884c37bf81902a2451ee73cb113ac0eb1931.png)

 ![same debug](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/1/7/178f1384c141eb64eeef318699acbfb61ae928a3.png)

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [7 April 2021 18:25 UTC](https://discourse.nodered.org/t/stream-analytics/43721/30 "2021-04-07T18:25:01Z")

</div>

very very strange.

Would you indulge me with these tests?...

#### TEST 1...

```auto
String json = "1,2,3\n";
Serial.print(json);

```

#### TEST 2...

```javascript
String json = String(h) + "," + String(t) + "," + String(mmwaterValue) + "\n";
Serial.print(json);

```

#### TEST 3...

```javascript
String json = "\"humidity\": 1, \"temperature\": 2, \"water\": 3 \n";
Serial.print(json);

```

#### TEST 5...

```javascript
String json = "{\"humidity\": 1, \"temperature\": 2, \"water\": 3 }\n";
Serial.print(json);

```

---

<div class="post-metadata">

**Author:** ![Alex95](https://avatars.discourse-cdn.com/v4/letter/a/74df32/32.png) [@Alex95](https://discourse.nodered.org/u/Alex95)\
**Post date:** [7 April 2021 18:34 UTC](https://discourse.nodered.org/t/stream-analytics/43721/31 "2021-04-07T18:34:49Z")

</div>

> [@Steve-Mcl](#):
>
> Would you indulge me with these tests?...

yes i will try and i will let you know. By the way in serial mode what have i do? to put split input "after a timeout of 100 ms" or "on the character \n?"

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [7 April 2021 18:42 UTC](https://discourse.nodered.org/t/stream-analytics/43721/32 "2021-04-07T18:42:54Z")

</div>

> [@Alex95](#):
>
> split input "after a timeout of 100 ms" or "on the character \n?"

It _should_ work with `\n` but try both if necessary.

---

<div class="post-metadata">

**Author:** ![Alex95](https://avatars.discourse-cdn.com/v4/letter/a/74df32/32.png) [@Alex95](https://discourse.nodered.org/u/Alex95)\
**Post date:** [7 April 2021 19:39 UTC](https://discourse.nodered.org/t/stream-analytics/43721/33 "2021-04-07T19:39:39Z")

</div>

> [@Steve-Mcl](#):
>
> `String json = "{\"humidity\": 1, \"temperature\": 2, \"water\": 3 }\n";`

So here are outputs..

TEST 1:

 ![dokimi_1](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/d/f/df4e74d30ddeb7bb780a7bc247ff25387a6183d9.png)

TEST 2:

 ![doikimi_2](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/c/f/cf48e836edb3ac3b96a950c63701cf7907d77139.png)

TEST 3:

 ![dokimi_3](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/f/e/fe27563c13295cc2d5ecc1429af2311c91b99e63.png)

TEST 4:

 ![dokimi_4](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/0/f/0ff4ee3c4c3e0e1c9331bb6977e0e24d82ddcd5a.png)

It's really stranger..pff..

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [7 April 2021 20:09 UTC](https://discourse.nodered.org/t/stream-analytics/43721/34 "2021-04-07T20:09:46Z")

</div>

Yes indeed.

Oh, well, at least you have a solution you can use.

  

So use TEST2 version, feed the COM port to a function node with this code...

```auto
var pl = msg.payload.trim();
if(!pl) return null;
var parts = pl.trim().split(",");
if(parts.length < 3) return null;

msg.payload = {
    humidity: pl[0],
    temperature: pl[1],
    water: pl[2]
}
return msg;

```

  

### --- alternatively ---
  

If you want 3 individual values with a topic (for MQTT) then ...

```auto
var pl = msg.payload.trim();
if(!pl) return null;
var parts = pl.trim().split(",");
if(parts.length < 3) return null;
var msg1 = {
    topic: "humidity",
    payload: pl[0]
}
var msg2 = {
    topic: "temperature",
    payload: pl[1]
}
var msg3 = {
    topic: "water",
    payload: pl[2]
}
return [[msg1, msg2, msg3]];

```

---

<div class="post-metadata">

**Author:** ![Alex95](https://avatars.discourse-cdn.com/v4/letter/a/74df32/32.png) [@Alex95](https://discourse.nodered.org/u/Alex95)\
**Post date:** [7 April 2021 20:40 UTC](https://discourse.nodered.org/t/stream-analytics/43721/35 "2021-04-07T20:40:35Z")

</div>

not bad!!! it's very close to be correct. Here is the result:

1st code (with no MQTT):

 ![maybe correct](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/7/2/725cc2c50865747c2a77e22e8f314aea269802c9.png)

2nd code:

 ![maybe_correct2](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/f/f/ff937e504bdd4c43e0939fe0b7d7085fad19321f.png)

Geberally it's correct, i think that with this way, node red, "understands" which value is which. Now the only problem is the results. Actually, in my room humidity is 62 and temperature is 21.

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [7 April 2021 20:47 UTC](https://discourse.nodered.org/t/stream-analytics/43721/36 "2021-04-07T20:47:35Z")

</div>

Oops.

Try this...

```auto
var pl = msg.payload.trim();
if(!pl) return null;
var parts = pl.split(",");
if(parts.length < 3) return null;

msg.payload = {
    humidity: Number(parts[0]),
    temperature: Number(parts[1]),
    water: Number(parts[2])
}
return msg;

```

![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/e/6/e669859779a1313a5fcbb578c68739ecc9ac8149.png)

![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/3/d/3d4382c2deaf12810d49e5e11cb1624f8fdff5ef.png)

demo flow...

```auto
[{"id":"dfb8f894.a94758","type":"function","z":"8c0d4c46.2bfb5","name":"","func":"var pl = msg.payload.trim();\nif(!pl) return null;\nvar parts = pl.split(\",\");\nif(parts.length < 3) return null;\n\nmsg.payload = {\n humidity: Number(parts[0]),\n temperature: Number(parts[1]),\n water: Number(parts[2])\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":732,"y":1072,"wires":[["7e7a56b6.ef8648"]]},{"id":"4a2a8e76.9a358","type":"inject","z":"8c0d4c46.2bfb5","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"60,22,0","payloadType":"str","x":546,"y":1072,"wires":[["dfb8f894.a94758"]]},{"id":"7e7a56b6.ef8648","type":"debug","z":"8c0d4c46.2bfb5","name":"","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":918,"y":1072,"wires":[]}]

```

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [7 April 2021 20:49 UTC](https://discourse.nodered.org/t/stream-analytics/43721/37 "2021-04-07T20:49:17Z")

</div>

Alternative version (separate messages - for MQTT)

![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/3/4/3434a673d74b319e1b3f805b75633dd3cafc1009.png)

```auto
var pl = msg.payload.trim();
if(!pl) return null;
var parts = pl.trim().split(",");
if(parts.length < 3) return null;
var msg1 = {
    topic: "humidity",
    payload: Number(parts[0])
}
var msg2 = {
    topic: "temperature",
    payload: Number(parts[1])
}
var msg3 = {
    topic: "water",
    payload: Number(parts[2])
}
return [[msg1, msg2, msg3]];

```

---

<div class="post-metadata">

**Author:** ![Alex95](https://avatars.discourse-cdn.com/v4/letter/a/74df32/32.png) [@Alex95](https://discourse.nodered.org/u/Alex95)\
**Post date:** [7 April 2021 21:01 UTC](https://discourse.nodered.org/t/stream-analytics/43721/38 "2021-04-07T21:01:33Z")

</div>

It works!!! Thank you very very much!!! honestly!!! Tommorow, i might ask you another question, about connection node-red with power bi.

Again, thank you very very much!!!!

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [8 April 2021 08:03 UTC](https://discourse.nodered.org/t/stream-analytics/43721/39 "2021-04-08T08:03:15Z")

</div>

> [@Alex95](#):
>
> It works!!! Thank you very very much!!! honestly!!!

You're welcome. Glad it is working for you.

> [@Alex95](#):
>
> Tommorow, i might ask you another question, about connection node-red with power bi.

If you do have new (different) questions, please start a new thread instead of asking here.

PS, you should mark one of the posts in this thread as the solution.

---

<div class="post-metadata">

**Author:** ![Alex95](https://avatars.discourse-cdn.com/v4/letter/a/74df32/32.png) [@Alex95](https://discourse.nodered.org/u/Alex95)\
**Post date:** [9 April 2021 15:46 UTC](https://discourse.nodered.org/t/stream-analytics/43721/40 "2021-04-09T15:46:10Z")

</div>

ok i will do it!! thank you very much again.

[Previous page](https://discourse.nodered.org/t/stream-analytics/43721.md?page=1)

[Next page](https://discourse.nodered.org/t/stream-analytics/43721.md?page=3)
