Home > Projects > Amazon DRS Promise: Never Miss Coffee Break Again!

Amazon DRS Promise: Never Miss Coffee Break Again!

Summary of Amazon DRS Promise: Never Miss Coffee Break Again!


Summary: An Arduino MKR1000-based device demonstrates Amazon Dash Replenishment Service (DRS) to automatically reorder coffee. The project uses AWS SNS, Login With Amazon, and the AmazonDRS Arduino library; it involves registering a Dash device and slots, obtaining authorization codes and refresh tokens, configuring Wi-Fi and slot IDs, and enclosing the MKR1000 in a 3D-printed case. The device triggers replenishment requests and can be tested as a test_device before switching to production.

Parts used in the Amazon DRS Promise: Never Miss Coffee Break Again!:

  • Ultrasonic Distance Sensor
  • LED (generic)
  • SparkFun Pushbutton switch 12mm
  • Resistor 100 ohm
  • Arduino MKR1000
  • 3D printed enclosure (STL/SKP files)
  • Computer with Arduino IDE

Amazon Dash Replenishment Service Automatic coffee ordering robot using Arduino MKR1000. Never miss another coffee break again!

Things used in this project

Hardware components

Ultrasonic Distance Sensor
× 1
LED (generic)
LED (generic)
× 1
Pushbutton switch 12mm
SparkFun Pushbutton switch 12mm
× 1
Resistor 100 ohm
Resistor 100 ohm
× 1
Arduino MKR1000
Arduino MKR1000
× 1

Software apps and online services

Arduino IDE
Arduino IDE
AWS SNS
Amazon Web Services AWS SNS
Amazon Web Services Amazon Dash Replenishment Service

Hand tools and fabrication machines

3D Printer (generic)
3D Printer (generic)

Story

Take note of your devices Model ID as well as the associated Slot IDs.

Login With Amazon and Authorization Code Grant

To simplify the process, we’re skipping the customer facing app and just hack our registration. Make sure you install postman.

here’s the message to send

https://www.amazon.com/ap/oa?client_id=<CLIENTID>&scope=dash%3Areplenish&scope_data=%7B%22dash%3Areplenish%22%3A%7B%22device_model%22%3A%22<DEVICEMODEL>%22%2C%22serial%22%3A%22<DEVICENAME>%22%2C%20%22is_test_device%22%3A%22true%22%7D%7Dtest&response_type=code&redirect_uri=https%3A%2F%2Fwww.getpostman.com%2Foauth2%2Fcallback

replace these:

<CLIENTID> : amazon Client ID like 
<DEVICEMODEL> is the device model, in my case I named it WalabotPi3
<DEVICENAME> is the name of device, I named it arduino123.

It’s currently setup as a test device so it won’t order. Go thru the process of selecting items for each slots. Complete it.

After that, In the address bar it would look something like this.

https://app.getpostman.com/oauth2/callback?code=<CODE>&scope=dash%3Areplenish

jot down the code, you will use it to setup device. code looks something like “ANdNAVhyhqirUelHGEHA”

Authorization

I cloned this repo, modified AmazonTokens.h file

#define client_id "amzn1.application-oa2-client.c0a2100c1af289b1bf4011c71f6029b3"
#define client_secret "ec48483c54c34a23a71aa8ccb2742902f7d3d00c2dd78fc5ac404eef0111e485"
#define redirect_uri "https%3A%2F%2Fwww.getpostman.com%2Foauth2%2Fcallback"

Zipped up the folder then installed the library in Arduino

Then open this example File>>Examples>>AmazonDRS>>authCodeGran and modify auth_code

#define auth_code "ANNnZjoWYoEIhEJrtLqL";

After running the authCodeGrant, look at the output on serial port. It will return something like this

refresh token = "Atzr|IwEBILdfysz66E9sRHsUobHgfh1X_h-esnBfcCdYjdcCfhGRkZqXujzXSN_3a8yqj5btX1B6NgbrmEX6wax_wmJ7Sgaaa39GbR-6hjDt_tHpKsFXPGwnIhy-14CWuE4oeYDWG4pCvQ4JEMKk2DiAsuwlUtoOVwaEOif1gWErh5rswCJ8mRhaXQ7SJhZB0CWYHm_ZA_PY8xTTVTUcZFqP7iz8kBw5QGDePyOb8NvJvSuBYYkwRQTj-qrytfdcHwMWOJc5QdoyPFpmchSfsMUpMqjDmwVPBfFzb0xZWYKxdUerSeKV1VVlS4Bwl2j-4gHnjHGohUsxau4Bn9SfG9McP-7RqD9Vmk3g--rsfACQ-uVLCJSJ29sBEMNkA5sxh9E9fpTwEw166WY-xBfYa_XB9aAU3n6Fn2yFM0I7ZpPIY1fy0gkdYkFOFD0uAOdoTFDxGXwbBWE";

Which is the refresh token for your device. Now go back and edit AmazonTokens.h at the Arduino Library Folder and change refresh token and authorization_grant_code

static String refresh_token = "Atzr|IwEBIIKDkzgMa5g7O0R1mLZZ6YZo-A1Ae5Ffj6wmV_rPbmAI0oixxTff8g3PN6MrOIEQpB9o_6BlDjiR6gkfRS_82Wp_0GWWvTrtYehcFJ8iKjuqf8n1ff9OrdHQU1_5nW_5Hf5loeIQ88TGazK2wy18UmOXOz1lbl9FDvWVQZl4t_6ggzDfMTVupvNr_ZtDrPm72auzoJIkGmGIM4S1RUw-Ru8X4q-UlzzYYfvRSJnPLAUTM3tTOEkv5e33SzExAaHl0tF22drRqvR1dEVlR_Zzw_IZ-1hzhIAvHrJs22K5dSEmkJKN7g8sD1tUKkn-ErMJhJrMehmvjwanF_O141Z5bVokmOLwiQKq_AYKGz8mJ0WPjBNQ3TbZ1g-3Xp-LqeMcKViNImcl1-_K89K5rupwAh-OmIPP5VhBArvhdeqEnreNU7LVLNoHvvyFB5ypwKQsHLe8";
static String authorization_grant_code = "ANNnZjoWYoEIhEJrtLqL";

Hardware

The hardware is enclosed in a 3D printed enclosure big enough to fit an Arduino Uno sized microcontroller with Wifi Shield. Lots of different hardware can be used. In this case we powered the device with a MKR1000 Arduino microcontroller. The MKR1000 has built in WiFi.

The enclosure is 3d printed, the STL and SketchUp files can be found below for download.

drs_circuit_diagram__kPL5cD56qt

Firmware

Here’s the code. Assign your wifi credentials.

char ssid[] = "XXXXXXXX"; //  your network SSID (name) 
char pass[] = "XXXXXXXX";    // your network password (use for WPA, or use as key for WEP) 

Assign the SlotID and Slot Number

#define slotNumber 1 //This will vary for multi slot devices - dash buttons typically only serve one product/slot 
static String slotStatus = "true"; //boolean which depicts if slot is available for replenishment 
static String slotId = "e2d8d2a3-ecf3-4532-bc02-a1bbb776bdf8";     //unique slot id ex: 0a5038b7-7609-4b81-b87e-3e291f386324 

Push the code to the Device. Watch the serial monitor, you’ll see something like this…

Placing Order 
Requesting Replenishment for slotId b6783dfa-838f-838f-838f-e1eae6049757 
HTTP/1.1 200 OK 
Server: Server 
Date: Sun, 26 Feb 2017 13:32:52 GMT 
Content-Type: application/json 
Content-Length: 170 
Connection: close 
x-amzn-RequestId: 127cd13d-fc28-11e6-ad46-a75ded86f73a 
x-amzn-type-version: com.amazon.dash.replenishment.DrsReplenishResult@1.0 
Vary: Accept-Encoding,User-Agent 
{"detailCode":"ORDER_INPROGRESS","eventInstanceId":"amzn1.dash.v2.o.ci5hNTc5MzlkMC1lZjRkLTQ4MjYtYTNhZC1iZjI3ODIzOGYxYzcuM2IyZjY0ZjItOWE4My00OWI0LTgyOGMtODA5ZTc2ODBhNTRl"}cm: 148 
Average cm: 24 
cm: 148 

That’s it. You’ll receive an email something like this…

coffee-kcup8_gN5gZgproA

Custom parts and enclosures

3D Printed Parts

STL and SKP files. Google Sketchup and STereoLithography files

Schematics

Code

coffeeAmazonDRS2.ino

Amazon DRS Promise: Never Miss Coffee Break Again! https://www.hackster.io/coffee-drinkers/amazon-drs-promise-never-miss-coffee-break-again-a88584

AmazonDRS

An Arduino library for WiFi101 connected devices implementing the Amazon Dash Replenishment API

Quick Solutions to Questions related to Amazon DRS Promise: Never Miss Coffee Break Again!:

  • What microcontroller is used in the project?
    The project uses an Arduino MKR1000 with built-in WiFi.
  • How do you authorize the device with Amazon?
    Use Login With Amazon to create a security profile and obtain a client ID and client secret, then perform an authorization code grant to get a refresh token as shown in the example.
  • Can this be tested without placing real orders?
    Yes, register the device as a test device by setting is_test_device to true during registration so it will not place real orders.
  • What software library is used to interact with Amazon DRS?
    The AmazonDRS Arduino library (from the andium/AmazonDRS repo) is used.
  • What cloud services are required?
    The project uses Amazon Web Services SNS and Amazon Dash Replenishment Service, plus Login With Amazon for authorization.
  • How do you configure network credentials on the device?
    Set the ssid and pass variables in the firmware with your Wi-Fi network SSID and password.
  • How do you specify which product slot to replenish?
    Assign the slotNumber and slotId values in the firmware using the Slot ID obtained during Dash device creation.
  • Is a custom enclosure required?
    The hardware is enclosed in a 3D-printed enclosure; STL and SKP files are provided for download.

About The Author

Ibrar Ayyub

I am an experienced technical writer holding a Master's degree in computer science from BZU Multan, Pakistan University. With a background spanning various industries, particularly in home automation and engineering, I have honed my skills in crafting clear and concise content. Proficient in leveraging infographics and diagrams, I strive to simplify complex concepts for readers. My strength lies in thorough research and presenting information in a structured and logical format.

Follow Us:
LinkedinTwitter
Scroll to Top