Appie Dash Button

Robijntje, awwww

Op kantoor hadden we nog wat overgebleven AWS IOT buttons liggen, aangezien die toch maar lagen te verstoffen, had ik een idee, waarom niet een Nederlandstalige Dash-Button maken?

Amazon heeft de Dash button helaas alleen in de US uitgebracht, terwijl ik zeker weet dat er hier ook een markt voor moet zijn, beetje babbelen met Unilever, en je kunt zo hup je pindakaas bestellen met een knop in de kast. Afijn, let’s get cracking.

Hoe werkt?

Het werkt als volgt. De IOT button heeft een batterijtje in zich, en slaapt vrijwel altijd. Pas als je op de button drukt, wordt ie wakker en wordt er geregistreerd wat voor actie je doet (1x klikken, 2x klikken, lang klikken). Ondertussen connect ie over je wifi verbinding naar de AWS IOT service. Daar registreert ie zn nieuwe state en triggered een event. In AWS IOT kun je daar vervolgens een actie aan hangen. Bijvoorbeeld het versturen van een mailtje, een lambda call, of bijvoorbeeld iets met S3.

IOT Button

De AWS IOT buttons werken vrij simpel, ze registreren zich direct binnen je eigen AWS account, en daarna kun je ze via de AWS IOT service vrij simpel koppelen aan een Lambda functie. Een beetje crea-bea, print, knip en plakwerk voor het logo (.ai file vindt je hierrrrr, en een home-grown Robijn button is geboren.

Ah.nl api

Op ah.nl (nee, appie.nl), is een ‘hidden’ rest service beschikbaar. Ik zeg ‘hidden’, want zo hidden is ie niet. Zo’n beetje alle calls die je wilt gebruiken zijn gewoon beschikbaar (toevoegen/verwijderen, multiple lists, etc). Ik heb al een paar keer (via oa Twitter) gevraagd of er een publieke api beschikbaar is, maar helaas.

Hidden? Not so much

Welnu, niet getreurd. Ik heb een hele basale api client gemaakt voor de service (zie Github). Ik heb wel alleen het ‘toevoegen’ aan je lijstje geïmplementeerd (meer had ik atm niet nodig), PR’s zijn uiteraard van harte welkom ;)

De button voegt het item uiteindelijk alleen toe aan je lijstje. Het is uiteindelijk vrij simpel om het ook zo te maken dat er ook daadwerkelijk besteld en bezorgd wordt (mits je op rekening kunt bestellen), maar aangezien ik vaak genoeg boodschappen doe, is dat niet echt nodig (nog afgezien van de bezorgkosten).

Lambda magic

De AWS IOT button roept dus uiteindelijk een Lambda function aan. In de IOT button heb ik per button in de attributes een product_id gezet van ah.nl (die haal je uit de url op ah.nl), bijvoorbeeld zoiets:

$ aws iot describe-thing --thing-name iotbuttonG030JF0FOO4UBAR
{
    "attributes": {
        "product": "color",
        "product_id": "wi211029"
        "foo": "bar"
    },
    "thingName": "iotbuttonG030JF0FOO4UBAR",
    "defaultClientId": "iotbuttonG030JF0FOO4UBAR"
}

Wanneer de Lambda call aangeroepen wordt, krijg je die attributes mee:

{
	"batteryVoltage": "1603mV",
	"serialNumber": "G030JF0FOO4UBAR",
	"clickType": "SINGLE"
}

Vervolgens kun je in je Lambda call een lookup doen adhv het serialnumber in de AWS iot service (via de aws-sdk), waarmee je de attributes voor het device kunt ophalen. De Lambda call roept daarna via de appie client de ah.nl api aan, met de juist productcode:

import boto3
import requests
import appie

client = boto3.client('iot')

username = 'foobar'
password = 'jemoeder'
appie = appie.Api(username, password)

def handler(attributes, context):
    button = client.describe_thing(
        thingName='iotbutton-%s' % attributes['serialNumber']
    )

    product_id = button['attributes']['product_id']
    appie.add(product_id)

Als je nu je lijstje refreshed op je mobiel (of ah.nl), staan daar je nieuwe producten. It’s magic!

ESP8266

Omdat AWS maar heel af en toe van die AWS IOT buttons weggeeft (ik weet alleen van vorig jaar op RE:Invent), is het wat lastiger om dit te doen zonder die AWS IOT Button. Je kunt de appie client uiteraard wel vrij simpel implementeren en runnen op je Raspberry Pi oid.

Ik ben begonnen aan een implementatie van de AWS v4 Signature voor de ESP8266 (fork), aangezien de standaard libraries van AWS v4 niet voldoende geïmplementeerd zijn voor de IOT service (afaik). Een groot voordeel van ESP8266 is dat ie bizar goedkoop is, en dat er ook een port van de Arduino libraries voor gemaakt zijn. Lekker makkelijk om mee te beginnen dus.

Met de ESP8266 kun je nog veel meer toffe dingen doen icm Lambda en AWS IOT, de temperatuur meten in al je kamers, de opbrengst van je zonnepanelen, bewegingsmelders, automatisch licht uitzetten als je van huis gaat, etc. En via Lambda kun je dan ook weer triggers inbouwen, als de temperatuur lager komt dan X, zet de thermostaat hoger. Of als mijn telefoon connect met mn wifi thuis, zet alle lampen in de gang en woonkamer aan.

Frikkin' koud op zolder

Temperatuur loggen met de ESP8266 en een thermistor op de ADC poort via AWS IOT, gelogged in een AWS CloudWatch Dashboard met custom metrics, bullshit bingo++ :D