google home miniにベランダの気温を報告させる

昨年末にgoogle-home-notifierを試したときに思ったことを実現してみた。
何をできるかというと、
google home miniに「外の気温は?」と聞くと、「ベランダの気温は27.0度です。」と答えてくれるというもの。

概略を書いておくと
iftttのthisのGoogle Assistantで「外の気温は?」をトリガーにwebhookを動かす。それを自宅のraspberry pi上のhttpd(sslと認証は入れてある)で待受。webhookが来たら、自宅のセンサーの値をためてるmysqlから最新のベランダ気温をjsonで取ってくる。google homeに応答させる「ベランダの気温はxx度です。」を作って、google-home-notifierにrequests.postして、google-home-notifierがgoogle homeに話させて完了。google-home-notifierのngrokは使わないので止めた。センサーのデータは直接、ベランダのセンサーをコントロールしてるESP32に聞いてリアルタイムのデータのjsonももらえる。最初はそっちでやってた。他のセンサーと統一するためにDBから取得とした。で、雨センサー版も作ったけども音声トリガーが難しい。「雨降ってる?」だとgoogle home標準の天気機能が動いてしまう。要改善です。

使った実感として去年末も思ったがgoogle-home-notifierだと音声音量が小さいのよ、普通のgoogle homeの会話音声よりも。仕組み的に喋らせたいテキストからgoogle-tts-apiでmp3を作って再生させてる様だけども音量のパラメータが見当たらない。今春から使えるGoogle Cloud Text-to-Speech ならVolume Gain Controlもあるようなので、こっち対応させるかと。あ、誰か作ってるかも、検索検索っと。
もう1個改善したいのは、トリガーを引いたgoogle homeに応答を話させる事。居間と寝室にgoogle homeがあるけれど、今は居間のgoogle homeしか問い合わせ結果を話せない。iftttのGoogle Assistantがどの子からのトリガーかを伝える機能が無いから居間固定にしてる。google、iftttのアカウントを分ければできそうだけれど、そうするとスマートホーム機能が・・・。

クラウドでなく自宅内の細々Linux機をいじる

piの構築を楽にするべくansibleを使うべくCentOSを入れようとx86なマシンを出してきた。Livaの初期型。メモリ2GでストレージはeMMC64Gでファンレス。Windows8が入ってて10にアップグレードしてあったけど捨ててCentOS7.4を投入した。CentOS、昔はeMMCにはインストールできなかったが、時が解決したようで何の問題も無かった。
で、SElinuxはdisabledにしたが、firewalldはiptableに戻すこと無くそのまま使う。通知メール用に最近取得したsendgridの無料アカウントでpostfixからメールも送れるようにした。logwatchもいれて、どうせなのでpiでやってるdnsmasqをこっちに移した。

その後、pi zero wでwi-sunモジュールのテストを試みるがまったくつながらない。pi B+では動いたのだが・・・。いろいろ調べると最近のbluetooth搭載piはttyAMA0がBTと直結になって邪魔してるみたい。切り離し方法を見つけてそのとおりにやったら無事動作しました。

センサ関連だいたい移行

 雨センサを移行したので今までの arduino,mbedの環境を停止し片付けた。雨センサのXBeeからの情報はraspberry piにUSB-UARTアダプタでつないだXBeeで受信してる。受信ソフトはpython3 (3.6)で書いて。XBeeのライブラリはxbee-python。digi謹製のdigi-xbeeと両方試したが前者の方がほしい情報に早く行きついた。余裕あるときにdigi-xbee用に書き換えてもよい。
 っていうより、雨なのに雨センサが感知してないです。コード断線したかな、チェックしよう。センサーの電池の電圧はXBeeのremote_at(%V)でモニターできてます。センサー側がperiodic sleepで寝てるので、雨データを送ってきた時に寝る前にすかさずremote_atを送り込んで返してもらってます。
 さて、ベランダのセンサーの値はココのperconaとambientにおくってるけど、piにも置いておこうとsqliteを検討。そのデータをすぐみられるように、piにAmazonでタイムセールになってた5インチモニタをつけた。静電容量で無く感圧だがタッチパネル。で、表示するアプリの環境はErectronを考えてる。となると、センサーか読みとってここやambientに送ってる部分やXBeeまわりを node.jsに変えたくなるなぁ。どうも pythonの閉じがないブロックに慣れない。


わかりにくいけど、やっぱ切れてました。センサー接続部が。まとめ買いした基板のあまりがあったので、線をはんだ付けして取り替えました。線をよじってつなげるだけでも片手だと大変です。なので右手も参加してもらうんだけど手関節(=手首)が自由に動かないもんだから方向が合わないんです。

風が強いので工作ひきこもり

 ベランダにあらたに作ったLuxセンサが滑らかな値にならないので、CDSでの分圧のADC入力を追加した。ESP8266の時は0-1V測定で使いづらかったADCもESP32では減衰器が入って0-3.6Vで測れるのでgood。1個センサーがふえるとベランダハード&ソフト・中継用mbedとRaspberry Pi・AWSのDBと変更をかける必要がある。
 ベランダのハード&ソフトを変えるので、雨除けジップロックも横向きに変更。雨が電源のUSBケーブルを伝ってESP32まで届かないように。
 つづいて、雨センサーの中継の変更。PiにコーディネータのXBeeつないで対応する。この実験中に雨センサのケースを破壊してしまった。紫外線でもろくなってた。同じプラケースを宅内で捜索してなんとか発見。こいつの中も結露とかの所為かXBeeの金属部分に錆がういていた。で、Xbee-Python、まだ理解しきれてない。ArduinoとmbedはC/C++だったから楽だったけど、慣れれば何とかなるでしょう。今週末までにPythonに移行したい。

とりあえずambient

センサー値をjsonで吐くとこまでは作っておいたので、raspberry piにてpythonでちょろっと。

headers = {“content-type”: “application/json”}
r = requests.get(url, headers=headers)
json_dict = r.json()

こんな感じで取ってきて

am_dict[‘d1’] = format(json_dict[‘BME280’][‘Press’][‘value’])

am = ambient.Ambient(99999, ‘1234567890’)
ret = am.send(am_dict)

こんな感じでambientに送信。

これでグラフで見られます。
いやー楽チンすぎる。


(まだデータがすくないからギザギザですが)

音声による赤外線リモコンで明りの制御

結局、pi zero wとRPZ-IR-Sensor phatで作成。ESP-IRの赤外線LEDは指向性が強くて使いづらいのでやめた(特定の機器の赤外線受光部近くで使うには良いが)。スマートスピーカとの連携はIFTTTを使用してwebhooksで受信。外部公開するので、webサーバまわりはなるべく不要な機能を消して、SSL(オレオレ証明)と認証は実装した。このphatはBME280(気圧、湿度、温度センサー)、TLS2561(照度センサー)も載ってるのでこれらも利用する予定。

で、居間の自分の机の上で疎通テストをしてたら天井が「ピッ」と鳴る。寝室のシーリングライトのリモコンコマンドなのだが(笑)。どうやら居間のシーリングライトの1つが寝室と同じリモコン対応機だった模様。結婚前のツレが持ってた物でリモコンもなくなってるから気づかなかった。寝室と同じコードでいける。

というわけでpi zero wをもう1セット購入した。居間は半分テスト用半分実用程度。

音声コマンドはショートカット化して、「寝室 つけて|消して|豆球」でOK。場所の特定はどこのHomeに言ったかで判断できるといいんだが。スマートホーム機能でなくIFTTT連携でやってるんじゃ難しいか。
Google AIY Voice Kitもゲットしたので、Google系のスピーカが3つです。Amazon系は招待状が全然来ないからdot1台だけ。どうなってるんだ?>招待状。

片手ではんだ付け

raspberry pi zero wのhatにピンヘッダをつけるべく、片麻痺になってから初めてのはんだ付けをした。

基板はテーブルに置いたままで、左手にはんだごて、右手にハンダの体勢。で、やってみると右手のハンダをうまく当てられない。仕方なしにコテ先にハンダをのせてからはんだ付けしたい部分にあてる。本来は、コテ先で付ける部分を熱して、そこにハンダを点けて溶かすんだが。で、ハンダがのったコテ先が震える震える。短く持って、前腕をテーブルの端に当てて安定させる。いやー難しい。数カ所ハンダブリッジが出来てしまったが、溶かし直してなんとか修正。40ピン全部はやってられないので、信号が必要なピンと両端の4ピン、4ピンをはんだ付けして完了。

はてさて動作確認は一発でOKでした。左手の精度と支持力をあげれば、結構はんだ付けできそう。2.54mmピッチ以上に限るけどね。

google home notifier

試してみましたよ。Linux mint 17.3 mateだとnodejsでエラーが。Ubuntu 17.10をVirtualBoxで仕立てたけどなんかエラーでるねぇ。ってかUbuntu、 FcitxじゃなくiBusデフォになってたりする?
結局、どこのご家庭でも常備されてるRaspbery Piで成功しました。ただ文言を話すだけなら ATmegaのAquesTalk pico LSIでも出来るからなぁ。

スマートスピーカテスト

寝室の照明をコントロールする手始め。
Google home miniをつかって音声コマンドをテストした。IFTTTを使用。Google home miniに「メールして」とお願いすると、自分のメールアドレスに「メールしたよ」という本文のメールが届くだけ。thatの部分をwebhookに変えて、自宅内のマイコンのWebサーバを引っ張らせて照明の赤外線リモコンと同じ発光をすれば良い。マイコンを外にさらすのもアレだけど、OSが無い分raspberry piとかをさらすよりは良いだろう。IFTTTでなくて直接宅内でスマートスピーカからRESTできるといいんだが、「Actions on Google」の「Actions SDK」 の方も試してみたい。宅内ローカル環境としてサーバ兼赤外線発光機を立てるならpiもありだな。pi zero wも1枚だけあるし。

AIスピーカーと家電の連携ネタ

 Google Home MiniやAmazon Echo Dotでのホームオートメーション。既製品は結構高価な上、値下がりしてたものも高騰してる感じ。じゃあ自分で作るかと。
 うちの寝室はエアコンとシーリングライトが赤外線リモコン対応。シーリングライトのリモコンは点灯ボタンと消灯ボタンが独立してるタイプ。以前ラズベリーパイのi2sDAC音楽プレイヤーを作った時に、ミニコンポを操作出来るように赤外線リモコンを作っていたからこれの応用で行けるだろうと。部品点数も少ないから、ブレッドボード、できればハンダゴテ握りたいかな。あ、照明リモコンはオンオフが共通ボタンタイプだったとしても、照度センサー付けとけば、今点いてるか消えてるかは判断できるなぁ。このあたりが自作だと出来合いの赤外線リモコンより柔軟性はある。ソフト的にはRESTでオンオフできるインターフェイスを宅内LANに公開しときゃ良いのかな?
 ちっとぐぐったらRaspbery Piなんざ使うまでもなくESP-WROOM-32でやってる例があった。ESP32は2つくらい持ってるからこっちのほうが良さそう。単独でADC使えるし。