Foddy / node-red-contrib-huemagic

Philips Hue node to control bridges, lights, groups, motion sensors, temperature sensors and Lux sensors using Node-RED.
https://flows.nodered.org/node/node-red-contrib-huemagic
Apache License 2.0
201 stars 67 forks source link

Uncaught Exception: Cannot read properties of undefined (reading 'length') #302

Closed unclej84 closed 2 years ago

unclej84 commented 2 years ago

Describe the bug Updated NodeRED to 2.2.0 (NodeJS 16) today and no I constantly get Uncaught exception errors on starting up

Expected behavior No crash on startup

Log TypeError: Cannot read properties of undefined (reading 'length') at new HueBridgeMessage (/data/node_modules/node-red-contrib-huemagic/huemagic/utils/messages.js:17:61) at HueBridge.get (/data/node_modules/node-red-contrib-huemagic/huemagic/hue-bridge-config.js:306:23) at /data/node_modules/node-red-contrib-huemagic/huemagic/hue-bridge.js:84:30 at EventEmitter.<anonymous> (/data/node_modules/node-red-contrib-huemagic/huemagic/hue-bridge-config.js:556:7) at EventEmitter.emit (node:events:390:28) at EventEmitter.emit (node:domain:475:12) at HueBridge.pushUpdatedState (/data/node_modules/node-red-contrib-huemagic/huemagic/hue-bridge-config.js:275:16) at Timeout._onTimeout (/data/node_modules/node-red-contrib-huemagic/huemagic/hue-bridge-config.js:177:13) at listOnTimeout (node:internal/timers:557:17) at processTimers (node:internal/timers:500:7)

Please complete the following information:

Additional context Problem occured after upgrade to Node-RED 2.2.0 but even reverting image back to 2.1.6 does not work. Before it worked with 4,1.0 on 2.1.6

unclej84 commented 2 years ago

The responsible line in messages.js seems to be this.message.payload.starterKitId = resource.starterkitid.length > 0 ? resource.starterkitid : false;. The api returns "starterkitid": "", in the config section of the json. I have then tried to set it to false by replacing the line with this.message.payload.starterKitId = false; but got another error.

TypeError: Cannot convert undefined or null to object at Function.entries (<anonymous>) at new HueBridgeMessage (/data/node_modules/node-red-contrib-huemagic/huemagic/utils/messages.js:45:39) at HueBridge.get (/data/node_modules/node-red-contrib-huemagic/huemagic/hue-bridge-config.js:306:23) at /data/node_modules/node-red-contrib-huemagic/huemagic/hue-bridge.js:84:30 at EventEmitter.<anonymous> (/data/node_modules/node-red-contrib-huemagic/huemagic/hue-bridge-config.js:556:7) at EventEmitter.emit (node:events:390:28) at EventEmitter.emit (node:domain:475:12) at HueBridge.pushUpdatedState (/data/node_modules/node-red-contrib-huemagic/huemagic/hue-bridge-config.js:275:16) at Timeout._onTimeout (/data/node_modules/node-red-contrib-huemagic/huemagic/hue-bridge-config.js:177:13) at listOnTimeout (node:internal/timers:557:17) at processTimers (node:internal/timers:500:7)

Is seems that the lookup of whitelist does also not work - the api returns this directly after starterkitid. These are the last two entries of the config section.

The fields touchlink, autoupdate and updated are not included in the config section. Api-Version is shown as 1.48.0.

If you need further information or details, please let me know.

rotor5 commented 2 years ago

Hello, I have the same Issue and would be happy if there is any solution for this.

mkloss33 commented 2 years ago

Hi all, same here for me. NodeRed crashing since a couple of days with the very same error message.

TypeError: Cannot read properties of undefined (reading 'length') at new HueBridgeMessage (/home/pi/.node-red/node_modules/node-red-contrib-huemagic/huemagic/utils/messages.js:17:61) at HueBridge.get (/home/pi/.node-red/node_modules/node-red-contrib-huemagic/huemagic/hue-bridge-config.js:306:23) at /home/pi/.node-red/node_modules/node-red-contrib-huemagic/huemagic/hue-bridge.js:84:30 at EventEmitter.<anonymous> (/home/pi/.node-red/node_modules/node-red-contrib-huemagic/huemagic/hue-bridge-config.js:556:7) at EventEmitter.emit (node:events:390:28) at HueBridge.pushUpdatedState (/home/pi/.node-red/node_modules/node-red-contrib-huemagic/huemagic/hue-bridge-config.js:275:16) at Timeout._onTimeout (/home/pi/.node-red/node_modules/node-red-contrib-huemagic/huemagic/hue-bridge-config.js:177:13) at listOnTimeout (node:internal/timers:557:17) at processTimers (node:internal/timers:500:7)

unclej84 commented 2 years ago

Hello,

not sure when Foddy will have time to investigate / fix this so maybe my temporary solution also helps you. I checked the API output manually via: https://<bridge-ip>/api/<api-key> for the values of starterkitid and whitelist. Then I checked messages.js in huemagic/utils/-folder and adjusted it manually here (in my case the string was empty so I just put = false;) and here (Just if you need the user listing function - otherwise leave it and just comment the for loop). Finally I commented this lines out (the whole For-loop). After that it is working for now for me. Hope this helps you for now too.

Regards Jörg

jeroenhe commented 2 years ago

I tried upgrading from 3.0.0 and it looks like I have the same exception. I've reverted back to 3.0.0 which (obviously?) fixed the issue. Thank you for posting the work-around, I might try that later.

unclej84 commented 2 years ago

@jeroenhendricksen please note that the migration to 4.X.X also requires some additional adjustment to the nodes as stated here because of the UUIDs in the API.

Rayhzvj commented 2 years ago

Currently facing the same issues and this prevent NR from starting.

Swiftnesses commented 2 years ago

@unclej84 this got me up and running again - thank you.

memoir commented 2 years ago

Same issue on a fresh installation, not upgrading from a previous version.

ptweety commented 2 years ago

Hello,

not sure when Foddy will have time to investigate / fix this so maybe my temporary solution also helps you. I checked the API output manually via: https://<bridge-ip>/api/<api-key> for the values of starterkitid and whitelist. Then I checked messages.js in huemagic/utils/-folder and adjusted it manually here (in my case the string was empty so I just put = false;) and here (Just if you need the user listing function - otherwise leave it and just comment the for loop). Finally I commented this lines out (the whole For-loop). After that it is working for now for me. Hope this helps you for now too.

Regards Jörg

Hi @unclej84 ,

wouldn't it be better to change the respective lines like this:

this.message.payload.starterKitId = resource.starterkitid && resource.starterkitid.length > 0 ? resource.starterkitid : false;

and

        // GET USERS
        if (resource["whitelist"]) {
            for (const [userID, user] of Object.entries(resource["whitelist"]))
            {
                this.message.payload.users.push({
                    user: userID,
                    name: user["name"],
                    created: user["create date"],
                    lastAccess: user["last use date"]
                });
            }   
        }
unclej84 commented 2 years ago

Hi @ptweety,

I am not so deep in JS to know if the evaluation already stops when the first &&-part stops or if he is still trying to evaluate the second part which throws the error. So, I have to rely on your knowledge here. The second part of course looks good.

But anyway, the question is why it does not get the information when I see them in the API.

For error handling your solution is good but still the - let's say underlying issue - should be investigated and hopefully solved.

ptweety commented 2 years ago

Well, the issue is simply that the structure of the incoming data (i.e. the resource object) is not guaranteed. e.g.:

resource = {
  bridge_id: "001788fffe40cd07",
  id: "40b4b12b-330f-420e-9e39-78765225f1a1",
  id_v1: "",
  time_zone: {
    time_zone: "Europe/Berlin",
  },
  type: "bridge",
  updated: "2022-02-12T14:38:48+01:00",
  types: [
    "bridge",
  ],
}

You can see, that there is no starterkitid or whitelist. If you then access children of these elements without checking the existence of the element itself you get the exception.

in Line 34 there is a proper check already in the code:

this.message.payload.touchlinkEnabled = (resource["touchlink"] && resource["touchlink"] == true) ? true : false;
Rollem1 commented 2 years ago

Hi @unclej84, @ptweety,

Thanks unclej84 for pointing me to this thread - I had opened another topic but on reflection this is the same issue I had. Just to confirm I tried both of your fixes and they both work for me.

Cheers! Jon

dmoibm commented 2 years ago

Hi @ptweety

Thanks! Your solution works fine!

cmuench commented 2 years ago

Any chance that this can be merged? I patched my local node-RED and can also confirm that the PR fixes the issue on my machine.

isaac-the-newt commented 2 years ago

Hi all,

I've found that disabling the HUE BRIDGE node still allows HUE devices to function with Node-Red without the continual error trapping and restarting of Node-Red described by others in this thread. I had raised this issue with Foddy some time ago but as it has gone unresolved, I had to find a work around. HUE disabled

lougreenwood commented 2 years ago

Thanks for the tip @isaac-the-newt, but it doesn't help when this error stops Node Red from being able to start.

isaac-the-newt commented 2 years ago

Hi Foddy,

Thanks for the update. Alas version 4.2.0 appears to have introduced another error when commanding the lights.... TypeError: Cannot read properties of undefined (reading 'apply') As well, the bridge is reconnecting continually spamming the log file (log set to INFO level logging).

21 Mar 11:00:38 - [info] [hue-bridge:Philips hue] Initializing the bridge (192.168.0.150)… 21 Mar 11:00:38 - [info] [hue-bridge:Philips hue] Error requesting info from the bridge. Reconnect in some secs. undefined 21 Mar 11:00:38 - [info] [hue-bridge:Philips hue] Initializing the bridge (192.168.0.150)… 21 Mar 11:00:39 - [info] [hue-bridge:Philips hue] Error requesting info from the bridge. Reconnect in some secs. undefined 21 Mar 11:00:39 - [info] [hue-bridge:Philips hue] Initializing the bridge (192.168.0.150)… 21 Mar 11:00:39 - [info] [hue-bridge:Philips hue] Connected to bridge 21 Mar 11:00:39 - [info] [hue-bridge:Philips hue] Connected to bridge 21 Mar 11:00:39 - [info] [hue-bridge:Philips hue] Connected to bridge 21 Mar 11:00:40 - [info] [hue-bridge:Philips hue] [object Object] 21 Mar 11:00:40 - [info] [hue-bridge:Philips hue] Processing bridge resources… 21 Mar 11:00:40 - [info] [hue-bridge:Philips hue] Initial emit of resource states… 21 Mar 11:00:40 - [info] [hue-bridge:Philips hue] Processing bridge resources… 21 Mar 11:00:40 - [info] [hue-bridge:Philips hue] Initial emit of resource states… 21 Mar 11:00:41 - [info] [hue-bridge:Philips hue] Keeping nodes up-to-date… 21 Mar 11:00:41 - [info] [hue-bridge:Philips hue] Subscribing to bridge events… 21 Mar 11:00:41 - [info] [hue-bridge:Philips hue] Keeping nodes up-to-date… 21 Mar 11:00:41 - [info] [hue-bridge:Philips hue] Subscribing to bridge events… 21 Mar 11:00:49 - [info] [hue-bridge:Philips hue] Error requesting info from the bridge. Reconnect in some secs. undefined 21 Mar 11:00:49 - [info] [hue-bridge:Philips hue] Initializing the bridge (192.168.0.150)… 21 Mar 11:00:49 - [info] [hue-bridge:Philips hue] Error requesting info from the bridge. Reconnect in some secs. undefined 21 Mar 11:00:49 - [info] [hue-bridge:Philips hue] Initializing the bridge (192.168.0.150)… 21 Mar 11:00:49 - [info] [hue-bridge:Philips hue] Connected to bridge 21 Mar 11:00:49 - [info] [hue-bridge:Philips hue] Connected to bridge 21 Mar 11:00:50 - [info] [hue-bridge:Philips hue] Processing bridge resources… 21 Mar 11:00:50 - [info] [hue-bridge:Philips hue] Initial emit of resource states… 21 Mar 11:00:50 - [info] [hue-bridge:Philips hue] Processing bridge resources… 21 Mar 11:00:50 - [info] [hue-bridge:Philips hue] Initial emit of resource states… 21 Mar 11:00:51 - [info] [hue-bridge:Philips hue] Keeping nodes up-to-date… 21 Mar 11:00:51 - [info] [hue-bridge:Philips hue] Subscribing to bridge events… 21 Mar 11:00:51 - [info] [hue-bridge:Philips hue] Keeping nodes up-to-date… 21 Mar 11:00:51 - [info] [hue-bridge:Philips hue] Subscribing to bridge events… 21 Mar 11:00:59 - [info] [hue-bridge:Philips hue] Error requesting info from the bridge. Reconnect in some secs. undefined 21 Mar 11:00:59 - [info] [hue-bridge:Philips hue] Initializing the bridge (192.168.0.150)… 21 Mar 11:00:59 - [info] [hue-bridge:Philips hue] Connected to bridge 21 Mar 11:01:00 - [info] [hue-bridge:Philips hue] Processing bridge resources… 21 Mar 11:01:00 - [info] [hue-bridge:Philips hue] Initial emit of resource states… 21 Mar 11:01:01 - [info] [hue-bridge:Philips hue] Keeping nodes up-to-date… 21 Mar 11:01:01 - [info] [hue-bridge:Philips hue] Subscribing to bridge events… 21 Mar 11:01:10 - [info] [hue-bridge:Philips hue] Initializing the bridge (192.168.0.150)… 21 Mar 11:01:10 - [info] [hue-bridge:Philips hue] Error requesting info from the bridge. Reconnect in some secs. undefined 21 Mar 11:01:10 - [info] [hue-bridge:Philips hue] Initializing the bridge (192.168.0.150)… 21 Mar 11:01:10 - [info] [hue-bridge:Philips hue] Connected to bridge 21 Mar 11:01:10 - [info] [hue-bridge:Philips hue] Connected to bridge 21 Mar 11:01:11 - [info] [hue-bridge:Philips hue] Processing bridge resources… 21 Mar 11:01:11 - [info] [hue-bridge:Philips hue] Initial emit of resource states… 21 Mar 11:01:11 - [info] [hue-bridge:Philips hue] Processing bridge resources… 21 Mar 11:01:11 - [info] [hue-bridge:Philips hue] Initial emit of resource states… 21 Mar 11:01:12 - [info] [hue-bridge:Philips hue] Keeping nodes up-to-date… 21 Mar 11:01:12 - [info] [hue-bridge:Philips hue] Subscribing to bridge events… 21 Mar 11:01:12 - [info] [hue-bridge:Philips hue] Keeping nodes up-to-date… 21 Mar 11:01:12 - [info] [hue-bridge:Philips hue] Subscribing to bridge events… 21 Mar 11:01:12 - [error] [hue-light:Dining Table 1] TypeError: Cannot read properties of undefined (reading 'apply') 21 Mar 11:01:12 - [error] [hue-light:Kitchen Bench] TypeError: Cannot read properties of undefined (reading 'apply') 21 Mar 11:01:12 - [error] [hue-light:Backroom] TypeError: Cannot read properties of undefined (reading 'apply') 21 Mar 11:01:12 - [error] [hue-light:Dining Table 2] TypeError: Cannot read properties of undefined (reading 'apply') 21 Mar 11:01:20 - [info] [hue-bridge:Philips hue] Error requesting info from the bridge. Reconnect in some secs. undefined 21 Mar 11:01:20 - [info] [hue-bridge:Philips hue] Initializing the bridge (192.168.0.150)… 21 Mar 11:01:20 - [info] [hue-bridge:Philips hue] Error requesting info from the bridge. Reconnect in some secs. undefined 21 Mar 11:01:20 - [info] [hue-bridge:Philips hue] Initializing the bridge (192.168.0.150)… 21 Mar 11:01:20 - [info] [hue-bridge:Philips hue] Error: Request failed with status code 503 21 Mar 11:01:21 - [info] [hue-bridge:Philips hue] Connected to bridge 21 Mar 11:01:22 - [info] [hue-bridge:Philips hue] Processing bridge resources… 21 Mar 11:01:22 - [info] [hue-bridge:Philips hue] Initial emit of resource states… 21 Mar 11:01:22 - [info] [hue-bridge:Philips hue] Keeping nodes up-to-date… 21 Mar 11:01:22 - [info] [hue-bridge:Philips hue] Subscribing to bridge events… 21 Mar 11:01:30 - [info] [hue-bridge:Philips hue] Error requesting info from the bridge. Reconnect in some secs. undefined 21 Mar 11:01:30 - [info] [hue-bridge:Philips hue] Initializing the bridge (192.168.0.150)… 21 Mar 11:01:30 - [info] [hue-bridge:Philips hue] Connected to bridge 21 Mar 11:01:32 - [info] [hue-bridge:Philips hue] Processing bridge resources… 21 Mar 11:01:32 - [info] [hue-bridge:Philips hue] Initial emit of resource states… 21 Mar 11:01:32 - [info] [hue-bridge:Philips hue] Keeping nodes up-to-date… 21 Mar 11:01:32 - [info] [hue-bridge:Philips hue] Subscribing to bridge events… 21 Mar 11:01:51 - [info] [hue-bridge:Philips hue] Error requesting info from the bridge. Reconnect in some secs. undefined 21 Mar 11:01:51 - [info] [hue-bridge:Philips hue] Initializing the bridge (192.168.0.150)… 21 Mar 11:01:51 - [info] [hue-bridge:Philips hue] Connected to bridge 21 Mar 11:01:51 - [info] [hue-bridge:Philips hue] [object Object] 21 Mar 11:01:51 - [info] [hue-bridge:Philips hue] Error requesting info from the bridge. Reconnect in some secs. undefined 21 Mar 11:01:51 - [info] [hue-bridge:Philips hue] Initializing the bridge (192.168.0.150)… 21 Mar 11:01:52 - [info] [hue-bridge:Philips hue] Connected to bridge 21 Mar 11:01:53 - [info] [hue-bridge:Philips hue] Processing bridge resources… 21 Mar 11:01:53 - [info] [hue-bridge:Philips hue] Initial emit of resource states… 21 Mar 11:01:53 - [info] [hue-bridge:Philips hue] Keeping nodes up-to-date… 21 Mar 11:01:53 - [info] [hue-bridge:Philips hue] Subscribing to bridge events… 21 Mar 11:02:01 - [info] [hue-bridge:Philips hue] Error requesting info from the bridge. Reconnect in some secs. undefined 21 Mar 11:02:01 - [info] [hue-bridge:Philips hue] Initializing the bridge (192.168.0.150)… 21 Mar 11:02:01 - [info] [hue-bridge:Philips hue] Connected to bridge 21 Mar 11:02:03 - [info] [hue-bridge:Philips hue] Processing bridge resources… 21 Mar 11:02:03 - [info] [hue-bridge:Philips hue] Initial emit of resource states… 21 Mar 11:02:03 - [info] [hue-bridge:Philips hue] Keeping nodes up-to-date… 21 Mar 11:02:03 - [info] [hue-bridge:Philips hue] Subscribing to bridge events… 21 Mar 11:02:22 - [info] [hue-bridge:Philips hue] Error requesting info from the bridge. Reconnect in some secs. undefined 21 Mar 11:02:22 - [info] [hue-bridge:Philips hue] Initializing the bridge (192.168.0.150)… 21 Mar 11:02:22 - [info] [hue-bridge:Philips hue] Connected to bridge 21 Mar 11:02:23 - [info] [hue-bridge:Philips hue] Error requesting info from the bridge. Reconnect in some secs. undefined 21 Mar 11:02:23 - [info] [hue-bridge:Philips hue] Initializing the bridge (192.168.0.150)… 21 Mar 11:02:23 - [info] [hue-bridge:Philips hue] Connected to bridge 21 Mar 11:02:23 - [info] [hue-bridge:Philips hue] Processing bridge resources… 21 Mar 11:02:23 - [info] [hue-bridge:Philips hue] Initial emit of resource states… 21 Mar 11:02:24 - [info] [hue-bridge:Philips hue] Keeping nodes up-to-date… 21 Mar 11:02:24 - [info] [hue-bridge:Philips hue] Subscribing to bridge events…

ptweety commented 2 years ago

Hi @isaac-the-newt, better open up a new issue with your log, since yours is a different error as originally reported here.