# Write object to context variable

**URL:** <https://discourse.nodered.org/t/write-object-to-context-variable/76145>\
**Category:** General\
**Tags:** mqtt\
**Created:** [5 March 2023 15:43 UTC](https://discourse.nodered.org/t/write-object-to-context-variable/76145 "2023-03-05T15:43:15Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![widert](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/widert/32/57557_2.png) [@widert](https://discourse.nodered.org/u/widert)\
**Post date:** [5 March 2023 15:43 UTC](https://discourse.nodered.org/t/write-object-to-context-variable/76145/1 "2023-03-05T15:43:15Z")

</div>

I have a MQTT message that comes in looking like this:

```auto
topic: "zigbee2mqtt/lys/baderom/tak"
payload: object
brightness_relay: 254
linkquality: 58
state: "OFF"
state_relay: "OFF"

```

I am deducting the structure using the following:

```auto
const room = msg.topic.split("/")[2];
const light = msg.topic.split("/")[3];
const status = msg.payload.state.toLowerCase();
const brightness = msg.payload.brightness_relay;

```

Using context.set, I would like to store to store these (status) messages in the following format:

```auto
{
  "room": {
     "light": {
       "status" = status
       "brightness" = brigthness
     }
     "light": {
       "status" = status
       "brightness" = brigthness
     }
  "room": {
     "light": {
       "status" = status
       "brightness" = brigthness
     }
     "light": {
       "status" = status
       "brightness" = brigthness
     }
}    

```

How can I do this using context.set?

Thanks,  
Tom

---

<div class="post-metadata">

**Author:** ![E1cid](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/e1cid/32/77971_2.png) [@E1cid](https://discourse.nodered.org/u/E1cid)\
**Post date:** [5 March 2023 15:46 UTC](https://discourse.nodered.org/t/write-object-to-context-variable/76145/2 "2023-03-05T15:46:43Z")

</div>

Impossible, an object can only have one property called room. In your base object you have 2. You room objects have to properties called light also impossible.  
If you mean room is changing and the output would be

```auto
{
    "baderom": {
        "tak": {
            "status": "off",
            "brightness": 254
        }
    },
    "baderom1": {
        "tak1": {
            "status": "off",
            "brightness": 254
        }
    }
}

```

then

```auto
const room = msg.topic.split("/")[2];
const light = msg.topic.split("/")[3];
const status = msg.payload.state.toLowerCase();
const brightness = msg.payload.brightness_relay;
context.set(`store.${room}.${light}`, {status,brightness})
return msg;

```

---

<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:** [5 March 2023 16:05 UTC](https://discourse.nodered.org/t/write-object-to-context-variable/76145/3 "2023-03-05T16:05:43Z")

</div>

Perhaps you mean that the outermost layer should be an array?

---

<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:** [5 March 2023 16:07 UTC](https://discourse.nodered.org/t/write-object-to-context-variable/76145/4 "2023-03-05T16:07:46Z")

</div>

Or perhaps you meant, where you say `"room"`, it should be, for example, `"tak"`, and similarly for the light.

---

<div class="post-metadata">

**Author:** ![widert](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/widert/32/57557_2.png) [@widert](https://discourse.nodered.org/u/widert)\
**Post date:** [5 March 2023 16:17 UTC](https://discourse.nodered.org/t/write-object-to-context-variable/76145/5 "2023-03-05T16:17:29Z")

</div>

Yes, that is correct!

---

<div class="post-metadata">

**Author:** ![widert](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/widert/32/57557_2.png) [@widert](https://discourse.nodered.org/u/widert)\
**Post date:** [5 March 2023 16:19 UTC](https://discourse.nodered.org/t/write-object-to-context-variable/76145/6 "2023-03-05T16:19:47Z")

</div>

I'm sorry, bad explanation from my side, this is how it should look like:

```auto
{
  "baderom": {
     "tak": {
       "status" = "on",
       "brightness" = 235
     }
     "vegg": {
       "status" = "off"
       "brightness" = 192
     }
  "gjestebad": {
     "tak": {
       "status" = "on"
       "brightness" = 211
     }
     "vegg": {
       "status" = "off"
       "brightness" = 121
     }
}   

```

---

<div class="post-metadata">

**Author:** ![widert](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/widert/32/57557_2.png) [@widert](https://discourse.nodered.org/u/widert)\
**Post date:** [5 March 2023 16:23 UTC](https://discourse.nodered.org/t/write-object-to-context-variable/76145/7 "2023-03-05T16:23:35Z")

</div>

So whenever I receive a message with e.g. topic: "zigbee2mqtt/lys/stue/vegg", I need the "stue" and "vegg" "status" and "brightness" to be updated...

---

<div class="post-metadata">

**Author:** ![jbudd](https://avatars.discourse-cdn.com/v4/letter/j/5f8ce5/32.png) [@jbudd](https://discourse.nodered.org/u/jbudd)\
**Post date:** [5 March 2023 17:03 UTC](https://discourse.nodered.org/t/write-object-to-context-variable/76145/8 "2023-03-05T17:03:00Z")

</div>

Well that's not valid JSON.  
Can you confirm that this is what you want your context variable to contain?

```auto
{
 "baderom":{
   "tak":{"status":"on","brightness":235},
   "vegg":{"status":"off","brightness":192}
 },
 "gjestebad":{
   "tak":{"status":"on","brightness":211},
   "vegg":{"status":"off","brightness":121}
 }
}

```

Which you can access by (eg) `<variable name>.gjestebad.tak.brightness`

---

<div class="post-metadata">

**Author:** ![widert](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/widert/32/57557_2.png) [@widert](https://discourse.nodered.org/u/widert)\
**Post date:** [5 March 2023 17:56 UTC](https://discourse.nodered.org/t/write-object-to-context-variable/76145/9 "2023-03-05T17:56:29Z")

</div>

Yes, that is correct 😀

---

<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:** [5 March 2023 18:13 UTC](https://discourse.nodered.org/t/write-object-to-context-variable/76145/10 "2023-03-05T18:13:43Z")

</div>

Something like, untested:

```auto
let data = context.get("data") || {}
data[room] = data[room] || {}
data[room][light] = {status: status, brightness: brightness}
context.set("data", data)

```

---

<div class="post-metadata">

**Author:** ![widert](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/widert/32/57557_2.png) [@widert](https://discourse.nodered.org/u/widert)\
**Post date:** [5 March 2023 18:27 UTC](https://discourse.nodered.org/t/write-object-to-context-variable/76145/11 "2023-03-05T18:27:11Z")

</div>

Perfect, thanks!!

---

<div class="post-metadata">

**Author:** ![E1cid](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/e1cid/32/77971_2.png) [@E1cid](https://discourse.nodered.org/u/E1cid)\
**Post date:** [5 March 2023 18:33 UTC](https://discourse.nodered.org/t/write-object-to-context-variable/76145/12 "2023-03-05T18:33:22Z")

</div>

> [@E1cid](#):
>
> ```auto
> const room = msg.topic.split("/")[2];
> const light = msg.topic.split("/")[3];
> const status = msg.payload.state.toLowerCase();
> const brightness = msg.payload.brightness_relay;
> context.set(`store.${room}.${light}`, {status,brightness})
> return msg;
> 
> ```

@widert the solution I posted 3 hours ago didn't work then?

---

<div class="post-metadata">

**Author:** ![widert](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/widert/32/57557_2.png) [@widert](https://discourse.nodered.org/u/widert)\
**Post date:** [5 March 2023 21:14 UTC](https://discourse.nodered.org/t/write-object-to-context-variable/76145/13 "2023-03-05T21:14:18Z")

</div>

I'm sorry, but I managed to miss your proposed solution...

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/1X/d073cd938eafa2e558d7c2cd59003b3ef4963033.png) [@system](https://discourse.nodered.org/u/system)\
**Post date:** [19 March 2023 21:14 UTC](https://discourse.nodered.org/t/write-object-to-context-variable/76145/14 "2023-03-19T21:14:21Z")

</div>

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.
