自分家の不満を解消するためにつくったIoTデバイスで GUGEN2018に出た話

# はじめに
現職の枠組みの外で、趣味で モノづくりをする有志活動に参加していて、
今年の最大成果としてGUGEN2018へ出品した成果報告の内容が、
AdventCalendarにとても合いそうだと、後輩からそそのかされたので投稿してみます。

# GUGENとは
[GUGEN公式HP](https://gugen.jp/) より、
> GUGENは日本最大級のオリジナルハードウェアコンテストです
> 2013年からはじまりました「GUGENコンテスト」も今年で6年目、前身となる「電子工作コンテスト（2009～2012年開催）」から数えて10年目となり、実用性や商品性の高いアイデアを表彰するMakersの登竜門となっております。

というコンテストです。

# 作ったモノ
チームとして、3作品エントリーし一次審査通過は2作品。
その中でも、ソフトエンジニアな自分がもっとも貢献できた[ConecO-mass](https://gugen.jp/entry2018/2018-081)を紹介します。

### ConecO-massコンセプト
非IoTデバイスにくっつける重さ計測デバイス！
家庭にある消耗品にくっつけられる重さセンサー。
重さを計測して、管理でき、残量が無くなりかけたらLINE通知する
IoTデバイスを日曜ハックしてみました！
![ConecO-massコンセプト.png](https://qiita-image-store.s3.amazonaws.com/0/258294/c9880548-fe88-d32a-a83c-762e5d6ef532.png)

### ハードウェア構成
ハードウェアはシンプルに。
もしかしたらコンテスト優勝して量産するかも？をモチベーションに、
初めから全力で小型化・簡素化に取り組みました。
電気的な部分は、ボタン電池、BLEマイコン、感圧センサーのみ！
そして、ポイントの何にでもくっつく部分をかなり模索・考えました。
靴下半分に切り出して磁石と鉄板でくっつける！
![HW構成.png](https://qiita-image-store.s3.amazonaws.com/0/258294/be05a659-0436-2d49-5023-ea0d301a59af.png)

あと本番は[ピタッとマグ](https://item.rakuten.co.jp/petittomall/tjbm-pbwg_tk_w/?scid=af_pc_etc&sc2id=af_113_0_10001868)という商品を使ってかなり収まりのイイ感じになりました。
![gugen本番.png](https://qiita-image-store.s3.amazonaws.com/0/258294/2ae4aedf-ac21-0f26-6b51-0ec09095a0c7.png)
ハードウェアカバーの丸い筒は、ビニール配管を切断・塗装して作ったり。
ほんとうに身近なモノをフル活用して製作にあたりました。

### ソフトウェア構成
自分が一番貢献できた、ソフト実装部。
Viewの実装は、[bluejelly](https://github.com/electricbaka/bluejelly)というOSSを利用し、JavaScriptのみで、Bluetooth通信と表示を実装しました。
↓こんな感じ。(ソース全体は非公開プロジェクトです、すみません！)
![ConecO-serverCap.png](https://qiita-image-store.s3.amazonaws.com/0/258294/ed47e94e-8414-2ec1-920f-4b645638adf4.png)

LINE通知はPythonで行ったのですが、データのやりとりには、
以前作った[Stack-String-Service](https://github.com/nekotarolu/stack-string-service)を利用。
※Qiitaにもまとめています。
[「マイクロサービスアーキテクチャを自分なりに捉えて、Stack<String>というマイクロサービスを作ってみた。」](https://qiita.com/nekotarolu/items/29d8fcdbf6a01643947b)

JavaScriptで取得した値はたった４行で外のサーバーへ通知できます。

`````
        var xhr = new XMLHttpRequest();
        var url = "https://stack-string.herokuapp.com/PushStack?string="
          + encodeURIComponent(value + "," + notificationValue + "," + objectNameValue);
        xhr.open("POST", url, true);
        xhr.send("");
`````

https://stack-string.herokuapp.com にて、
実際にサービスをデプロイしているので、本番も上記のコードで動かしてました。

そして、クライアント側はPythonにて、

`````
import requests
r = requests.get("https://stack-string.herokuapp.com/PopStack")
`````

こんだけ。ね、簡単でしょ？
あとは、GETしてきた`r`でとれた値に応じて、LINE通知をするのを実装して、

<img width="375" alt="coneco-lineNotify.png" src="https://qiita-image-store.s3.amazonaws.com/0/258294/7c6183e8-30e4-9dc3-c71c-41ddfd8f489a.png">

これで日用使いにことたりる、IoTハックができ、
コンテストにも出せるクオリティとなりました！

## 作成秘話
自分は、よく牛乳を飲むのですが。
牛乳って冷蔵庫に入っているとき、どれくらい入ってるかわからないじゃないですか。
出先で買い物してる間に家族が飲んだりしてたら買ってくればよかったと後悔したり。
なので、冷蔵庫から出して使ったときに計測してなくなりかけたらLINE（外に）通知する。
構成にこだわって作り始めました。

消耗品だからこそ、IoT化も進まないだろうし、
Conecoという名前は、Conect Object(なんにでも接続する）という意味をこめてます。

また、名前にもしたからには、
> 上のアタッチメントは何にでもくっつく。
> 下のセンサーはアタッチメントより上の形に依存しない。

と、ハードもソフトもモジュール的に疎結合になるよう徹底しました。
副産物的に詰め替えや洗い物対応できたという感じ。

# おわりに。この記事を通じて
私は、日ごろ某メーカーにて、組み込みソフトの開発を担当しています。
このGUGENには、会社のメンバーと、有志団体(趣味)として出展しました。
決して私一人の手柄ではありません。

日ごろ、仕事としてメカ、電気、ソフトを専門とする人があつまり、
こぞって同じ目的に向かうとサクッと綺麗にモノができあがる。
ということが分かった、とても良い体験であり、
日々の業務は、こういった非日常のアウトプットの質を向上させると確認できました。
みなさんも、とっさのアウトプットが上質であるよう日々の業務に取り組みましょう！