How or where do I search a array? Using the Unifi Node looking for RogueAPs mac and signal strength.
Use a function node and the
Or an equivalent using a change node and JSONata
thanks how do I find the name of the array? In the example its myArray , my output not sure suspect I need to put this into x to name it?
The name of the array, according to your screenshot is msg.payload
There’s a great page in the docs that will explain how to use the debug panel to find the right path to any data item.
Pay particular attention to the part about the buttons that appear under your mouse pointer when you over hover a debug message property in the sidebar.
Thanks and yes got that and can filter with a change node. What I want to figure out is searching the combined output for new bssid or oui for example from the combined output of the array (msg.payload). Looking for new bssid or oui not seen before. So this means I want to search the array for new unknown devices? Hopefully this makes sense.
So from what you say you want to identify any device not yet seen. The example Steve-Mcl pointed at provides the answer. You have to keep an array of known devices and compare the two arrays. From Stack Overflow (plus a bit),
const filterObjectArray = (arr, filterArr, filterProperty) => ( arr.filter(el => filterArr.every(f => f[filterProperty] !== el[filterProperty] ) ) )
let knownDevices = context.get('knownDevices', 'file') ||  let deviceArray = msg.payload let unknownDevices = filterObjectArray(deviceArray, knownDevices, 'bssid') .... do what ever you want with array of unknown devices // Add unknown devices to known devices knownDevices.push(...unknownDevices) context.set('knownDevices', knownDevices, 'file')
The bssid should be unique so this should cover new oui properties also, but if you want to identify new oui properties as a separate check, rinse and repeat above using 'oui' as the
You can do something similar to find non optimum signal strength
const minSignal = -40 const maxSignal = 30 const result = deviceArray.filter(device => device.signal < minSignal || device.signal > maxSignal)
Thanks Buckskin so I have added to a function node on message.
So this adds the knowdevices to unknown and does it compare?
knownDevices.push(...unknownDevices) context.set('knownDevices', knownDevices, 'file')
Tried to review each portion of the code added // expressions/operators
So this should only return results between 30 to -40
device.signal less than minSignal || device.signal more than maxSignal
const minSignal = -40 const maxSignal = 30
The use of the functions were examples and provide different results. You haven't added the results to the msg.
If you are after both unknown devices and bad signals then try
let msg.unknownDevices = unknownDevices
to get an array of unknownDevices, and after
const result = deviceArray.filter(device => device.signal < minSignal || device.signal > maxSignal)`
let msg.badSignal = result return msg
You will then have to monitor
msg.badSignal instead of
msg.payload. Use a debug node set to 'complete message object'
If you just want devices with a bad signal just use
let msg.payload = deviceArray.filter(device => device.signal < minSignal || device.signal > maxSignal)
maxSignal values to whatever values you are actually defining as bad
Thanks but still not understanding, could you give me a complete example of any device with its bssid, a signal of say 30 max, -40 min to then give a msg output (will use (MQTT). What I am trying to do is detect any device not on the wireless ie not connected and beaconing that has a signal between 30-40 with its BSSID to say that there is a unknown device close by? TIA.