エリック・エヴァンスのドメイン駆動設計 1章を読んで
上記のイベント参加前に「エリック・エヴァンスのドメイン駆動設計 1章」を読んでの殴り書きです。
活動のサイクル
現在着目しているシナリオにドメインモデルが適応しているか
ドメインモデルあるいはシナリオで登場する言葉に違和感はないか?
- そっちでは「XX」って書いてあるけど、普段は「YY」って言っているやつねという発言がそれにあたると考える
- 2章をチラ見したら熱く語られている。とにかくばらばらの言葉を使っているとコストがあまりにも高くつきすぎる
不要な概念はないか
電源制御のコンテキストの中で停電
が発生した際のシステムのふるまいをモデリングしていた。
具体的には、停電発生時に、UPSが落ちきる前にシステムを安定状態に持っていくというものをモデルに入れていた。
しかし、電源制御なので、電源周りを責務するはずで、
- 内外部の状態、指示に応じて電源をONしたりOFFしたりする
- 電源の現在の状態を通知にしたり、要求に対して応答したりする
以上のことを実施するとおかしいという指摘が入った。
結果としてシステムを安定状態に持っていくのはシステムがわのコンテキスト側でモデリングし、
電源制御はUPS時間待機し、システムの安定状態を受信するか、UPS時間が満了した場合に電源を落とすというモデルに変更した。これで、モデルはすっきりし、電源制御の役割も明確化した。完ぺきではないかもしれないが、エヴァンス本でのモデルの蒸留
(不要な概念の排除)を体験した。
所感
水中ポンプを動かす
背景
1,2年前に水中ポンプを動かそうとしたら動きませんでした。 マイコンで水中ポンプを制御して、植物の世話をするようなものにあこがれていたのですが、そもそも水中ポンプ制御自体ができなかったので投げていました。 先日ひょんなことから水中ポンプを手に入れたので、もう一度チャレンジしたらうまくいったので、備忘録として残しておきます。
準備物
- AC100V/DC9V
- ブレッドボード電源モジュールアダプタシールド3.3V / 5V
- ブレッドボード
- 水中ポンプ DC5V 100-200mA
- シリコンチューブ(7mm×10mm 1M)
水中ポンプ用に5Vをつくりたかっただけなので、AC100V/DC5V電源があれば、それ単体で実現できますが手元になかったので、この構成で実現します。
検証
シンプルにつなぐだけで、動きました。 リレーで制御して、電源周りをもっとすっきりさせれば、M5StickCなんかでお手軽に制御できそうです。 材料がそろえば試してみたいと思います。
puppyCを動かす
M5StickCのハットです。
虫ような動きをするらしいのですが、前になかなか動きませんでした。かろうじて前進したコードを置いておきます。
M5StickC+UIFlow+ThingSpeakで軽量で意味のないIoTシステムを作る
概要
とにかくM5StickCのボタンを押すと、web上でボタンを押したことが確認できるだけのものを作ります。 IoTシステムを作る際にM5StickC側であまり悩みなくなかったためお試しでやってみました。
ThingSpeakは以下の理由により、今回の目的に合致しているため採用しました。 - Web APIが提供されていること - 送ったデータを勝手にプロットしてくれるところ - ごちゃごちゃした設定がいらないところ
Web APIではなく、mqttなどでデータを送信するのがIoTの主流のようですが、 UIFlowベースでAWSなどに接続している記事は見当たらなかったため、Web APIを選択しました。
準備するもの
- M5StickC
- ThingSpeakのアカウントとチャンネル ※アカウント作成とチャンネル生成は省略します
UIFlowのコード
内容としては以下のようになります
- wifi接続
- Aボタンを押すとカウントアップした値を送信
- 応答結果を表示
httpのURLはThingSpeakのMyChannelの「Write a Channel Feed」を参考にして貼り付けます。
使用感
注意点としては、ボタンを押すのは15秒以上あけてから送信しないとThingSpeakが値をとってくれないことです。 これは無料版アカウントの仕様で、有料版なると1秒おきでも問題ないようです。
M5StickCのAボタンを押すと、通知が送信されて、ThingSpeakに無事表示されていることが確認できました
所感
Httpはrequest成功で200を返すのに、UIFlow上ではFailのほうに入ってきて判定してしまうところがわかりにくかったです。 どんな時にsucccessになるのだろうか。
あと、15秒以内に発行した場合、Httpブロックから出てこないことが多々ありました。 この状況になってしまうと使い物にならないため、実運用では気を付けないといけないと感じました。 タイマーなどで対策しても良いと思いましたが、根本的解決ではなさそう...
6060-PUSHをm5stickCで動かす
概要
6060-PUSHはm5stack公式で販売しているアプリケーションモジュールです。 switch scienceは取扱などがなく、amazonではも2020年6月現在取扱がないので、 m5stack公式やほかのどこかで調達する必要があります。
https://m5stack.com/products/m5stack-6060-push
準備物
- 6060-PUSH
- 6060-PUSH用のRS485の端子台
- m5stickc
- RS485Unit(またはhut)
- 丸穴の9VDC電源
- RS485用の通信線と電源線計4線
組み立て
写真のようにつなぎます。 6060-PUSH側に電源を供給していればRS485経由でm5stickCに電源が供給されますが、この状態でm5stickCに書き込む場合はそのままusbを接続しても問題ありませんでした。
6060-PUSHのコード
6060-PUSHはRS485経由でコマンド経由で指示します。 コマンド一覧は、以下に書いてあります。 https://docs.m5stack.com/#/en/1515/6060-push
m5stickcのコード
UI-FLOWで以下のようなコードを書きます。
概要としては、m5stickCのBボタンで操作を選んでAボタンで確定し、指示します。
- MoveZ:原点に移動します
- MoveM:中間程度の位置に移動します
- MoveH:一番上の位置まで移動します
- ReadP:ポジション位置を確認するコマンドです。実質使いません
Moveの実際の値はX46.0を最高値にしてみました。48.0程度を指定すると一番上部に当たったのちさらに上昇しようとして異音がしたため、46を最大値としています。
RS485Unitではなく、Hutを使う場合は送信ピンと受信ピンをHut用のものに変更してください。
動かした様子
ドアの開閉取得をTWELITEで試す。とりあえず試す。
MONO WIRELESSを動かす
ドア開閉が取れたらいいねという話を友人としていて、ドアにつけるなら電池問題と通信問題がなー思っていたのですが、後日TWELITEがいいという話をいただいたので、購入して試しました。 写真は後日気が向けば。
購入したもの
品物 | URL |
---|---|
BLUE PAL | |
OPEN-CLOSE SENSE PAL | |
MONOSTICK | |
TWELITE R | |
CR2032 | |
とりあえず動かしてみる
ホスト側
- MONOSTIcKをUSBをPCに挿す
- TWELITEプログラマをダウンロード https://mono-wireless.com/jp/products/TWE-APPS/LiteProg/index.html
- 親機のバイナリをダウンロード https://mono-wireless.com/jp/products/TWE-APPS/App_pal/parent.html
- TWELITEプログラマを起動
- 「App_PAL-Parent-BLUE-MONOSTICK」を指定して書き込み
- TWELITEプログラマを終了
- パルビューアをダウンロード https://mono-wireless.com/jp/products/TWE-APPS/App_pal/palviewer.html
- パルビューアを起動する。COMはMONOSTICKのもの。ボーレートはそのまま
- tag viewをmagに合わせる
エッジ側
- BLUE PAL + OPEN-CLOSE SENSE PAL + CR2032
結果
デバイスに磁石を近づけると、みれた。プログラムレスでここまでいけるのは素晴らしい
参考
いろいろみたけど、ミクミンPさんのtweetが参考になりました。