Hack Day 2021でLINE CLOVA賞をもらった

3/20~21に開催されたハッカソンイベントHack Day 2021に出場し、入賞することができました。 https://hackday.jp/

2021 03 21 HackDay about ※QRコード現在動作しません

つくったもの

開催期間1日で「早起きは3MONのToken」というサービスを開発しました。

Hack Dayは成果発表を90秒のプレゼンで行うのですが、その時の動画です。

こちらの成果物でOCRの提供元企業から「LINE CLOVA賞」を頂きました。

構成

ざっくりとした構成はこんな感じになっています。

今回のイベントでは各協賛企業からAPI等が提供されており、利用は自由でした。 普段有償で利用できないサービスも多くせっかくなのでと言うことで、弊チームではLINE CLOVA OCR, LINE Blockchain, Scalar DLの3つの提供技術を利用しました。

hackday 2021 04 04 11 44 25

フロントエンドはReact・他のバックエンドはGoで記述しました。

スケジュール感

  • 2/22: 申し込み・何をつくるかざっくり通話
  • 3/5: LINE OCRのAPI検証を始める
  • 3/11: ハックヌードルが届く
  • 3/14: Scalar DLの検証を始める
  • 3/16: LINE Blockchainの検証を始める
  • 3/20: ハッカソン当日

    • 12:00 開会式に出遅れる
    • 13:30 LINE BOT/LIFFアプリの原型が動くにリッチメニューを設定
    • 15:00 LINE Blockchainとの連携の初期部分が完成・Docker Compose化する
    • 15:50 チーム専用のDiscord通話チャンネルに知らない人が入ってくる
    • 17:00 BOTの一通りの遷移が出来てくる
    • 17:15 独自トークン56tokenがいっぱいできる
    • 17:30 他の人が既に結構スライド作り込んでいることを知りビビる
    • 18:10 揺れる https://twitter.com/UN_NERV/status/1373200929655123976
    • 19:30 LINE LIFFアプリ上でOCRが動く
    • 21:00 LINE BlockchainのMONトークンの付与・トランザクション履歴を取得するAPIが完成する
    • 23:00 LIFF SDKのバグを踏んでAndroidだけ動かない
    • 01:15 OCRで正解を入力するとMONトークンがもらえるようになる
    • 02:00 ロゴ・作品概要が出来る そして寝る
    • 10:00 起きる
    • 11:20 Scalar DLのContractが完成する
    • 12:00 開発時間が終了
  • 3/27: 表彰

副賞

頂いた「LINE CLOVA賞」の商品としてline clova friendsを頂きました。 ありがとうございます!

DSC 7476

感想

  • オンライン・在宅ハッカソン良い

    • いつもの慣れた環境で集中できる
    • いつもの布団で寝れる
    • メンバーがリモートに慣れていたので連携には困らなかった
  • API

    • LINE FILLアプリ割と簡単に作れて便利
    • Scalar DLのコントラクトがJavaで書けたので開発時間は短かった
    • LINE CLOVA OCRの認識精度にびっくりした Playgroundでコードを書かずに試せるのも良い

プレゼン資料等

発表資料

技術紹介

続きを読む

SwitchBot温湿度計をGrafanaで可視化

Bluetoothで通信できる"SwitchBot温湿度計"を利用して、Goで温湿度を取得・Prometheusへメトリクスを投げ込み、Grafanaで可視化する話です。

DSC 7339

説明書によると単4電池2本で1年持つらしいです。すごい。

DSC 7340

一応URL https://www.switchbot.jp/meter

BLE

よく出回っている他の温湿度計(tuya home等)は、ほとんどBLE通信が暗号化されており、利用者が自由に内容を参照することが出来ません。 生活周期だとかのパーソナルデータなので、当然といえば当然の流れなんですが寂しい。 そんな中、SwitchBotは技適付き・暗号化なしというプログラマーフレンドリーな仕様です。

ペイロード内容も公開されており、その内容は非常にシンプルです。 サービスUUID cba20d00-224d-11e6-9fb8-0002a5d5c51b で8byte読んで、その内容をパースするのみです。 詳しい内容は以下を参照してください。

https://github.com/OpenWonderLabs/python-host/wiki/Meter-BLE-open-API

ハマった箇所としては、PassiveScanだとServiceDataを返さないようで、データを取得するためにはActiveScanを行う必要が有るということでした。 こちらの記事で記述されており非常に助かりました。

https://qiita.com/warpzone/items/11ec9bef21f5b965bce3

Goでの記述

Pythonでの取得コードは上のGitHubリポジトリで公開されているのですが、どうしてもGoで書きたいという気持ちがあったので温湿度を取得するコードをGoで記述しました。 Prometheusへとストアしたいので、Exporterの実装も合わせて行っています。

https://github.com/kamijin-fanta/temperature-collector/blob/master/main.go

最初はBLEライブラリに https://github.com/paypal/gatt を利用しようと思っていたのですが、ActiveScanを行う方法が無く、独自のHCIコマンドを送信するのも難しそうなので https://github.com/go-ble/ble を利用しています。

Prometheus, Grafana

Raspberry Pi 3で動かしたかったので、 GOOS=linux GOARCH=arm GOARM=7 をつけてビルドを行い、以下のような雑なSystemd Unitファイルを作成してデーモンとして動作させます。

#cat /etc/systemd/system/temperature-collector.service 
[Unit]
Description=Temperature prometheus collector
After=network-online.target

[Service]
Type=simple
Restart=always
LimitCORE=infinity
ExecStart=/home/pi/temperature-collector_armv7
PermissionsStartOnly=true
StandardOutput=null

[Install]
WantedBy=multi-user.target

適当にPrometheusの設定も追記しておきます。

scrape_configs:
  - job_name: 'temperature'
    static_configs:
      - targets:
        - hostname:2112

Grafanaでダッシュボードを用意してやれば完成です。

temperature collector 2021 03 17 00 06 36

温度計本体は、適当に袋を被せて室外に置いてみました。

続きを読む