【Cerevo】Hackey のLED通知API で遊んでみた

この記事は おうちハック Advent Calendar 2015 22日目の記事です。

12月上旬に Hackey を注文してから1週間ほどで届いたのですが, 放置したまま Advent Calendar 投稿日まで 残り1日となってしまい, 慌てて使ってみました。

Hackeyとは何か

Hackey は Cerevo が発売したWebサービスをコントロールできるキースイッチです。値段は公式オンラインストアで 9,980円でした。

hackey.cerevo.comを見ると 用途としては, IFTTTのMaker ChannelやZapier等と連携して 定期的に買い換える洗剤などの消耗品の注文, 家族が家に帰ってきたことをSNSなどを通じて連絡 などを想定しているみたいです。

開封してみました。思ったより小さい印象です。

open-hackey

Setup はマニュアルを読みながら進めて, LEDを点滅させるテストまで特に問題ありませんでした。

Hackey の魅力のひとつは Webサービスと連携できる点で, 特に Server側を容易に変更できる 自分用Webサービスを運用している人にはとても相性が良いのではないでしょうか。H/W技術のハードルは無いに等しいので S/Wエンジニアにオススメです。

Hackeyには2種類のAPIが用意されています。

  • Webhook Action : 物理鍵を使ってHTTP POST でトリガーを送信
  • LED通知 : HTTP GET でトリガー受信してLEDを制御

Hackeyを自分用なんちゃってWebサービスと連携させる

今回は 自分用なんちゃってWebサービス (複数の証券口座や外貨預金口座の資産・損益をクローラで取ってきて 集約・管理している)と連携してみます。

やる事は単純で, LED通知 APIを使って 現物株や信用取引口座などの評価損益を集約し前日と比較して プラス or マイナスなのかを LEDの色を変えて通知することです。[1]

はじめに Dashboard にアクセスして “アクションを追加” から LEDの 色・秒数 を設定します。

点滅させる色の種類は 5色, 時間は 1 ~ 999sec の範囲で設定できます。
前日比 ±1%より小さい損益変動であれば, あまり気にしたくないので下記の 3色 / 60sec で登録しました。

  • 1%より大きい : 青色に点滅
  • -1%以上 ~ 1%以下 : 緑色に点滅
  • -1%より小さい : 赤色に点滅

登録が完了すると URL が発行されるので, これを Client側から HTTP で GETリクエストを送ります。この時, リクエストヘッダ, リクエストボディは無視されます。

hackey-setting-led-notification

続いて, Webアプリの Backend 側で 現在と 24時間前の各口座の損益を DB から取ってきて, それを集計して返す API Endpoint を作ります。

最後に, 先ほど発行されたURLを叩く Client を書きます。大体平日は, 23時には帰宅している事が多いので, 下記の Python コードを 毎日23時に Cronなどで定期実行します。[2]

# -*- coding: utf-8 -*-

import sys
import json
import requests

class Agent(object):
    def __init__(self):
        super(Agent, self).__init__()
        self.__env = {'host': '', 'name': '', 'password': '', 'notification-host': ''}

    @property
    def env(self):
        return self.__env

    @env.setter
    def env(self, env):
        self.__env = env

    def createNewSession(self):
        s = requests.Session()
        params = {
            'username': self.__env['name'],
            'password': self.__env['password'],
        }
        s.post('https://' + self.__env['host'] + '/login', data=params)
        return s

    # Get Profit and loss
    def getPL(self, session):
        r = session.get('https://' + self.__env['host'] + '/api/v1/asset/today')
        if r.status_code is 200:
            return json.loads(r.text)
        return {'error': r.status_code}

    # Notify Hackey by LED Notification API
    def notifyHackey(self, color):
        param = {
            'blue':  '4044af----------', # Higher than yesterday
            'green': '99e47c----------', # [-1.0, 1.0]
            'red':   '19670f----------'  # Lower than yesterday
        }
        r = requests.get('https://' + self.__env['notification-host'] + param[color])
        if r.status_code is 200:
            return r.text
        return {'error': r.status_code}

if __name__ == '__main__':
    agent = Agent()

    agent.env = {
        'host': 'my-domain',
        'name': 'me',
        'password': 'my-secret',
        'notification-host': 'hackey-app.cerevo.com/api/v1/blink/'
    }

    s = agent.createNewSession()

    pl = agent.getPL(s)
    if pl.has_key('error') == True:
    	sys.exit()

    change_rate = float(pl['today'] - pl['yesterday']) / float(pl['yesterday']) * 100

    color = 'green'
    if change_rate > 1.0:
    	color = 'blue'
    elif change_rate < -1.0:
    	color = 'red'

    agent.notifyHackey(color)

取りあえず 23時になると ちゃんと点滅してくれたので一安心です。

hackey-led

今回は, 分散している口座の損益を集計して, その結果を Hackey の LED点滅へと情報を縮約するような使い方をしてみました。

物理鍵を使わないなら, Hackey じゃなくてもいいよね...という声が聞こえてきそうです。
実際, その通りで本当は Webhook Action APIで何かできればよかったのですが, アイデアが思いつかなかったので...

Webhook Action APIを使ったら続きを書きたいと思います。


[1] 株価チェックは取引時間内にしていますが, 複数の口座に複数の株式が分散していると全体としての今日の損益を知りたくなります。だけど, 各サイトに毎回ログインするのは面倒くさかったりします。
[2] この時間は, ワールドビジネスサテライト が始める時間でもあるので, 1日のおさらいには丁度良さそうです。