# Some useful wee bits of code from my Node-red datalogge

**URL:** <https://discourse.nodered.org/t/some-useful-wee-bits-of-code-from-my-node-red-datalogge/67300>\
**Category:** Share Your Projects\
**Tags:** node-red-dashboard, function-node\
**Created:** [3 September 2022 21:35 UTC](https://discourse.nodered.org/t/some-useful-wee-bits-of-code-from-my-node-red-datalogge/67300 "2022-09-03T21:35:30Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![nickatredbox](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/nickatredbox/32/67318_2.png) [@nickatredbox](https://discourse.nodered.org/u/nickatredbox)\
**Post date:** [3 September 2022 21:35 UTC](https://discourse.nodered.org/t/some-useful-wee-bits-of-code-from-my-node-red-datalogge/67300/1 "2022-09-03T21:35:30Z")

</div>

Folks may find this interesting and useful

 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/8/7/870b36890eac44862232ba103fc28c1f28a700ac.png)

Uses Hubitat Elevation MakerAPI

Grabs all device details periodically of when poked from Hubitat Elevation

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

As an aside I would really like a Rule Machine trate limiting option. I manage this currently as shown above with a cancelable timer. Does anyone have a better idea?  
Also how about allowing a response from an HTTP request to be assigned to a variable in RM.

```auto
var msg1 = {};
var devs = [];

var a = {};

var obj = {};
var names = [];
var values = [];

for(j = 0;j < msg.payload.length;j++)
{
    
    var label = msg.payload[j].label;
    var name = msg.payload[j].name;
    var id = msg.payload[j].id;
    a = msg.payload[j].attributes;
    
    var dev = {};
    dev.id = id;
    dev.label = label;
    dev.name = name;
    dev.attributes = a;
    devs.push( dev );
    

}

msg1.payload = devs;

return msg1;

```

Then a function for each device for selecting data

```auto
var msg1 = {};

var devicelabel = "Outside Heat Index";

msg1.topic = devicelabel;

var obj = {};
var names = [];
var values = [];

for(j = 0;j < msg.payload.length;j++)
{
    //node.warn( msg.payload[j]);
    
    if( msg.payload[j].label == devicelabel)
    {
        obj = msg.payload[j];
                
        var a = obj.attributes;
        
        for(i = 0;i < a.length;i++)
        {
            var val = a[i];
        
            obj[val.name] = (val.currentValue == 999 ? 0 : val.currentValue);            
            
        }
        
        msg1.payload = obj.attributes;
        msg1.payload.devicelabel = devicelabel;
       
        break;
    }

}

return msg1;

```

I have a Hubitat Elevation Hub with a mix of Shelly plus various other Arduino, Zigbee Xiaomi and Sonoff devices. No Zwave so far, quite a few polled LAN based Arduino and Shelly devs.

```auto

```

---

<div class="post-metadata">

**Author:** ![tve](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/tve/32/59475_2.png) [@tve](https://discourse.nodered.org/u/tve)\
**Post date:** [3 September 2022 21:37 UTC](https://discourse.nodered.org/t/some-useful-wee-bits-of-code-from-my-node-red-datalogge/67300/2 "2022-09-03T21:37:26Z")

</div>

dunno if it's just for me, but none of your images are showing...

---

<div class="post-metadata">

**Author:** ![zenofmud](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/zenofmud/32/316_2.png) [@zenofmud](https://discourse.nodered.org/u/zenofmud)\
**Post date:** [3 September 2022 22:13 UTC](https://discourse.nodered.org/t/some-useful-wee-bits-of-code-from-my-node-red-datalogge/67300/3 "2022-09-03T22:13:42Z")

</div>

I see them fine,. Try clearing your browser cache.

---

<div class="post-metadata">

**Author:** ![tve](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/tve/32/59475_2.png) [@tve](https://discourse.nodered.org/u/tve)\
**Post date:** [3 September 2022 23:45 UTC](https://discourse.nodered.org/t/some-useful-wee-bits-of-code-from-my-node-red-datalogge/67300/4 "2022-09-03T23:45:11Z")

</div>

Yup, works now, I guess editing the links does wonders 😃...

> [@nickatredbox](#):
>
> As an aside I would really like a Rule Machine trate limiting option. I manage this currently as shown above with a cancelable timer. Does anyone have a better idea?

I'm not seeing the cancelable timer. The delay node has a rate limiting option.

> [@nickatredbox](#):
>
> Also how about allowing a response from an HTTP request to be assigned to a variable in RM.

Not sure what you mean. Also not sure what RM refers to.

---

<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:** [4 September 2022 00:32 UTC](https://discourse.nodered.org/t/some-useful-wee-bits-of-code-from-my-node-red-datalogge/67300/5 "2022-09-04T00:32:47Z")

</div>

Hi @nickatredbox, welcome to the forum. Thanks for sharing.

In the interest of sharing, here is how I think those 2 functions could be cleaned up and combined into 1...

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

_Note: the below is untested & I had to guess the label names - they will need adjusting. Hopefully though it gives you some tips_

```javascript
const reformatted = msg.payload.map(e => {
    return {
        label: e.label,
        name: e.name,
        id: e.id,
        ...e.attributes
    }
})

let msg1, msg2, msg3
const OutsideHeatIndex = reformatted.find(e => e.label === "Outside Heat Index")
const HouseHumidity = reformatted.find(e => e.label === "House Humidity")
const DeviceHeatingPower = reformatted.find(e => e.label === "Device Heating Power")

if (OutsideHeatIndex) {
    msg1 = { payload: OutsideHeatIndex}
}
if (HouseHumidity) {
    msg2 = { payload: HouseHumidity}
}
if (DeviceHeatingPower) {
    msg3 = { payload: DeviceHeatingPower}
}

return [msg1, msg2, msg3];

```

Some more tips...

1. Use the monaco editor (default editor in node-red v3.0.2) - it will show you things like undeclared variables
2. Try to use `const` and `let` instead of `var`
3. Read up on [array.map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) and [array.find](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find) functions
