Skip to main content

Amazon Dash Button with Node-RED built-in nodes

I bought an Amazon Dash button for experimentation (July 2017, in the UK). The part number I received was JK29LP (with FCC ID 2AETK-1013) which apparently is revision 2 of the hardware. There is a teardown here.

There are at least a couple of Node-RED nodes published but they both have dependencies which I wanted to avoid:

node-red-contrib-mydash requires tcpdump
node-red-contrib-amazondash requires libpcap

There is also a description here of a ping method but I did wonder if I could do it an alternative way without using the ping (which has its own complications due to needing root permissions on certain systems).

I configured the button using the Amazon app as far as the wireless SSID and password, and on a button press I could see the button appearing in my router Attached Devices table (DHCP address reservation). It only takes a short lease so it would appear and then disappear in the router table. This gave me a MAC address (and also an IP address but I would not need that).

At this point, a button press was generating a notification from the Amazon app that I hadn't finished the configuration process, as I had not selected a product. To resolve this, I added the MAC address into the filter list of my router so it would not be able to contact Amazon.

The revision 2 button makes a DHCP/BOOTP request over UDP on every button press , so I thought it would be easy to listen to the correct UDP port in Node-RED using the built-in node. Whilst the information here describes two UDP requests, the second request involving the IP address is not seen with the method below, so there is no need for deduplication.

I added a udp node to listen to udp messages on port 67 using ipv4, and output to a Buffer.


I extracted the MAC address as a hex string from the payload using a function node with a buffer copy:
var mac = Buffer.alloc(6);
msg.payload.copy(mac, targetStart=0, sourceStart=28, sourceEnd=34);
msg.mac = mac.toString('hex');
return msg;

The MAC address is inserted into the existing message. This then allows the MAC address of the request to be compared to the MAC address of the button in a flow, in order to determine a button press (and not a DHCP request from another device), or to differentiate between different buttons.

This method uses built-in nodes in Node-RED and is straightforward providing the MAC address can be determined for comparison purposes from your router DHCP table.

The behaviour if your system is already running a DHCP/BOOTP server on port 67 is undefined. In that case, I am not sure whether Node-RED will fail to bind to the port as a second process.

Comments

Popular posts from this blog

First steps with ESP32 (M5Stack BASIC Kit)

Hello World I have a micro-controller project idea that requires the following: LCD screen Buttons Bluetooth LE USB (for a dongle) I've had good experience with the ESP8266 (specifically the Wemos D1 Mini ) and thought I would try an ESP32. I discovered the M5Stack product range which is quite handy as it goes beyond barebones in its form factor, so I purchased an  M5Stack BASIC Kit as well as an M5Stack USB Module . My preferred language/programming environment is Arduino  with PlatformIO  as the IDE. I use Windows 10 and run PlatformIO in Visual Studio Code , so the first step is to download a Windows CP2104 driver for programming the M5Stack device (referred to as the M5Core). This is provided on the  Arduino IDE Development page of the M5Stack website (I am only using that page for the driver as I don't intend to use the Arduino IDE). The Windows driver can also be used with M5Stack's  EasyLoader software which is provided for test purposes. It'