きっかけ
前にtelegramメッセージお知らせシステムを作りました。今から帰りますとか、ちょっと急ぎのメッセージを知らせるために作って、犬の動きもなかなかかわいいのですが(自賛)、ごめん、自分の部屋にいて聞こえなかった、ケータイがoffだった(サイレントモードのこと)、などの理由で、すぐに連絡が届かない事例がしばしばみられ、つい先日には、
「荷物が多くて重いから、駅まで迎えにきて」
という買い物帰りの切羽詰まった妻からの連絡が、家にいた誰にも伝わらずに、なんとかできませんかね、ということになった。
「すまん、離れにいたもんで」、とか、「かたじけない、拙者、菱の門(姫路城)にて用があり」
などと言えるような大きなおうちに住んでいるならともかく、息を止めて端から端まで往復できるような家でメッセージの着信連絡が行き届かないのはよくない。原因はかわいい犬の動き(しつこい!)も声も、Google Homeの読み上げも届かなかったことにあるので、別の方法で伝達範囲を広げることにしました。名付けてtelegramピンポーン!
前回作ったtelegram botにもう一つコマンドを教えて、Raspberry pi zeroW経由でドアベルを鳴らせるようにします。
システム拡張説明図
これまでのnotificationシステム構成はそのままに、ドアベルを鳴らす部分を追加します。Telegram botのプログラムには追加のコマンド(/bell, /bells)を扱うためのfunctionを追加します。
機材と工作
まず、音と光でお知らせ!タイプの無線ドアベルをポチりました(1400円ぐらい)。やたらある呼び出し音の中からド~ミ~ソ~ド~には聞こえるが二つの呼び出し機で微妙に音程がズレていて同時に鳴らすと音が揺れて聞こえる(エフェクターでいうとコーラスかけたみたい)ものを選んでセット。(注:音がズレている必要は全くありません)
次に、トランスミッター(ボタンがついてるボックス)を開けて工作。ボタンは単に接点となっているだけなので、接続させるべき二点(どれとどれがつながるかをテスターなどでチェックしましょう。よく間違えます)をケーブルで引き出します。
Raspberry pi zero W(四号機)にPimoroniのAutomation Hat Miniをのせ(いつも思うんですが、Adafruitから買ったほうが安い感じ)、引き出した線をCOM(コモン、いつもココ)とNO(Normally Open、普通はつながってない)に接続。
最後に、呼び出し機を離れや菱の門詰め所(ご邸宅、お屋敷にある場合)、あるいは子供部屋などに設置します。
これで機材の設置は完了です。トランスミッターのボタンを押して、本来の使い方で呼び出し音が鳴ることを確認しておきましょう。
Automation Hat-miniを使うための準備とテスト
さて、まずは、raspberry pi zero WでAutomation Hat-mini上のリレーを操作できるようにします。今回の拡張では、ボタンを押す、という部分をリレーに行ってもらいます。
実は最初は433MHzの送信シグナルをhackして、それをArduinoなどから飛ばす、おもしろそうだなそれ、ということを考えていたのですが、実験中によそのうちのベルが鳴ったりしても困りますし、ボタンを押す、にあたる動作をさせるほうがずっと簡単なので、今回はそうすることに決めました
引用:これができたらおもしろいのに、より。
python libraryのinstall
Automation Hat-miniは、pythonのlibraryを使って簡単にコントロールできるようになっています。まずはこのlibraryをraspberry pi zero Wに導入しましょう。
Raspberry pi zero Wにssh接続でログインします。
ここなんですが、ssh接続という部分は重要ではなく、ログインしてterminalからコマンドラインが使える状態にするということです。
引用:これ、説明しだすときりがないんだよな、より。
InstructionはPimoroniのページにあります。次のコマンドでlibraryのinstrallは完了します。
curl https://get.pimoroni.com/automationhat | bash
Installがうまくいっているのかどうかをチェックしましょう。python3と打ってpythonのinteractive shellをスタートし、import automationhatと打ってリターン。何もエラーが出ずにプロンプトが返ればinstallはうまくいっています。
automationhatによるリレーのon, offを試す
さて、automationhat libraryが入ってしまえば、リレーの操作は拍子抜けするほど簡単です。まずはpythonのinteractive shellで実験しましょう。以下をご覧ください。もうこれだけで使い方はわかるはずです。
リレーが動作すると、カチッ、という小さな音がします。何もつながなくても動作の確認はできます。ボタンを押す、をmimicするには、最後の「コレ。」のようなやり方になると思います。onにして、0.2秒待って、offにする。あまりonの時間が長いと、期せずして何度もベルが鳴ってしまい、実験中に家族から苦情がでます。
ここまで来ましたら、もうこのままでも何かに使えますね。Raspiからドアベルコントロール!
さて、今回は本家のtelegram botちゃんからの連絡を受けてドアベルを鳴らす、をしたいので、その「受けるため」、の部分を構築しましょう。今回もNode-Redを使ってやってみます。本家telegram botからのhttp postを受けて、Pythonスクリプトを走らせる、が目的です。
Node-Redのinstall
Raspberry pi zero WにNode-Redをinstall します。調べるといろいろでてきますが、たとえばNode-Red本家にあるページ。
同じLAN内にあるパソコンのブラウザを開き、Raspberry pi zero WのIPアドレス:1880にアクセスして、下のような画面が表示されればうまくいっています。
Automationhatを動かすPython code
以下のコードを書いて、ringBell.pyという名前でraspberry pi zero Wに保存します。/home/YOURUSERNAME/ringBell.py
(codeの一部がblogエンジンに勝手に解釈されてうまく表示されないので(困ったもんだ)、絵として張り付けてあります)
コマンドラインからpython3 ringBell.py 2などと打って、ベルが2回鳴ることを確認してみましょう。このコードはベルを何度鳴らすのか、をargv[ 1 ]としてとります。大きな数をいれて家族のひんしゅくを買わないようにしましょう。
Node-Red flowの作成
やりたいことは、
http postを受け、上で作ったpython codeを走らせる
それだけです。ここで、何回ベルを鳴らすのかがargumnentとしてpython codeに渡る必要があります。わかれば簡単なのですが、最初はそれってどうやるんだ?で困りました。以下を順にご覧ください。
flowの全体図は以下の通り。
まず、flowのテストで使うinjection nodeとhttp inノードから。payloadには辞書の形のデータを送り出してもらいます。keyは一つで’ring’のみ。ここではvalueに2をセットしてテスト用データとしています。
http inノードでは以下のようにすることで/doorbellめがけて飛んでくるpostを受けます。
exec nodeの設定は以下の通り。commandにある’pison’はご自分のuser名にしてください。payloadから’ring’に対応するvalueを取り出して(msg.payload.ring)、これをコマンドにappendします。これで上のコマンドのあとにring回数が追記されて実行されるようになります。
http responseは、何も設定していません。単にステータスコード200が返るだけなのですが、これがないとbot側のプログラムがうまく進行しません。必ず設置しましょう。debug nodeはpayloadの内容とexec nodeからのstdoutを確認するために設置してあります。
telegram bot側の追加function
bot側のcode全体は示しませんが、/bellあるいは/bellsで始まるメッセージから、アナウンスする文とベルを鳴らす回数とを得るfunctionを追加しました。このfunctionから以下のring(回数)を呼び出すことで、Raspberry pi zero Wに向かって情報が飛びます。
http://192.168.xx.48:1880/doorbellの部分が、上で作ったNode-Red flowのhttp in nodeを狙っているのがわかりますね。
スクリーンショット
/bellあるいは、/bellsコマンドで今回作ったピンポーンシステムが動作します。
使ってみて
昨日完成したばかりなのですが、さっそく
みんなー、ご飯ですよー
のお知らせに使われています。二台のベルはどちらも子供部屋に設置されているので、これはこれで使い道のひとつかもしれません。