2017年6月29日木曜日

バケツ稲作定点観測アニメーション

バケツ稲作のRasbperry Piカメラの定点観測を始めて約3週間が経過しました。
残念ながら最初の稲はダメになってしまいましたが、次の稲は今の所すくすくと成長しています。発芽時期が遅かったので、秋までに実ってくれるかどうか心配です。

折角定点観測しているので、写真をつなげてアニメーションにしてみました。

ダメになった最初の稲

雨が降ったり、藻が湧いたり、意外と変化に富んでいますね。


次の稲

こちらはまだ数日分しか写真がありませんが、着実に成長している様子がわかります。また来月あたりにもアニメーション作ってみようと思います。青々と成長した姿がお見せできるといいのですが。



2017年6月19日月曜日

外出先からHDDレコーダーを起動して録画予約

観たいテレビ番組があったのに、録画予約を忘れて外出してしまった。よくありますよね。

最近のHDDレコーダーには、メーカーが用意したクラウドサービスを使って外出先から予約ができるものも多いですが、少し前の機種ではそうもいきません。私は東芝のRD-BZ810という機種を使っています。メールを使った外出先からの予約録画の機能はありますが、使い勝手が悪く使っていません。

この機種は、

  • マジックパケットによるWake-on-LANが可能
  • ウェブブラウザからの予約録画可能
という特長があります。ということは、HDDレコーダーの80番ポートをポート開放することができれば、先日の記事「自宅のPCを外出先からボタン一つで起動」がそのまま使えます。しかし、私の場合、すでに80番ポートは別の用途に使ってしまっていますのでこの方法が使えません。HDDレコーダーのhttpサーバーのポート番号の変更も多分できません。
そこで、Raspberry Piを、外出先からHDDレコーダーのhttpサーバーへの中継にも使おうと考えました。具体的にはリバースプロキシサーバーの機能を持たせて、外出先から自宅のグローバルIPの9005番へのアクセスをRaspbery Piで受けて、Raspberry PiからHDDレコーダーの80番ポートへ転送するようにします。
Wake-on-LANのきっかけには、先日の記事と同様にスマートフォンのボタンを使います。
  1. スマートフォンのボタンを押す
  2. ConnectからのWebHookをRasbperry Piで受ける
  3. Rasbperry PiからHDDレコーダーにWake-on-LANのマジックパケットを送信
  4. Rasbeprry PiからConnectにWebHookでURLを送信する
  5. ConnectからスマートフォンにURLを通知
  6. スマートフォンで通知をタップするとブラウザが起動して、自宅のHDDレコーダーに接続される。
という流れです。2〜5はConnectのシナリオとRasbpery Piのプログラムが協調して自動で動くので、意識して操作するのは1と6だけです。


前提知識

この記事では、下記の説明は省略します。
  • 自宅ネットワークの固定グローバルIPまたはダイナミックDNS設定手順
  • 自宅ネットワークのポート開放手順
  • HDDレコーダーに自宅LAN内の固定IPアドレスを設定する手順

用意するもの

  • HDDレコーダー
    • Wake-on-LANの機能を持つこと
    • ブラウザから録画予約可能なこと
  • Raspberry Pi
    • SDカードにraspbianインストール済み
    • 有線LANまたは無線LAN
  • ネットワーク環境
    • インターネットに常時接続
    • グローバルアドレスで接続されていること
    • 固定グローバルIPまたはダイナミックDNSが使えること
  • スマートフォン
    • iOS 9.3以降のiPhone

作業1 HDDレコーダーに固定IPアドレスを設定

ルーターの設定でDHCPで固定IPを払い出すように設定する方法と、HDDレコーダーの設定で、DHCPではなく固定IPを使うようにする方法があります。詳細は省略します。

作業2 Raspberry Piにetherwakeをセットアップ

etherwakeをインストールして、一般ユーザーからもWake-on-LANのマジックパケットを送信できるようにします。
  • sudo apt-get install -y etherwake
  • sudo chmod +s /usr/sbin/etherwake
HDDレコーダーがオフの状態で、テストしてみましょう。下記のeth0はRasbperry Piが有線LANに接続されている場合の例です。無線LANの場合はwlan0に変更してください。また、XX:XX:XX:XX:XX:XXはHDDレコーダーのMACアドレスに書き換えてください。
  • etherwake -i eth0 -b -D XX:XX:XX:XX:XX:XX
コマンド実行してHDDレコーダーが起動すればOKです。

作業3 Raspberry Piのプログラムを用意

まずは最新の安定版nodejsをセットアップしましょう。
  • sudo apt-get install -y nodejs npm
  • sudo npm cache clean
  • sudo npm install n -g
  • sudo n stable
  • node --version
このブログ執筆時点ではv8.0.0がインストールされました。続いて、webhookのプログラムです。
  • sudo apt-get install -y uuid-runtime
  • mkdir webhook_etherwake_recorder
  • cd webhook_etherwake_recorder/
  • npm install express
  • npm install body-parser
  • npm install http-proxy
下記の内容をwebhook_etherwake_recorder.jsというファイル名で保存します。このプログラムはConnectからのWebHookの受信、HDDレコーダーへのマジックパケットの送信、ConnectへのWebHookの送信、インターネットからHDDレコーダーへのhttpの転送(リバースプロキシサーバー)の機能をまとめたものです。




プログラムの先頭のTOKEN、MACADDR、IP、PUBLIC_HOST、POST_URLは書き換えます。TOKENはuuidgenコマンドで生成したランダムなUUIDを使うのが良いでしょう。これが漏洩すると、誰でもあなたのHDDレコーダーを起動できるようになります(大した実害はないかもしれませんが)。MACADDRとIPは、それぞれHDDレコーダーのMACアドレスとIPアドレスに書き換えます。PUBLIC_HOSTは固定グローバルIPまたはダイナミックDNSのホスト名(FQDN)に書き換えます。POST_URLは後で書き換えます。

作業4 ポート開放

Raspberry Piのポート9004, 9005をインターネットからアクセスできるようにポート開放します。

作業5 Connectアプリをインストール

スマートフォンにCodyl Connectアプリがインストールされていなければ、インストールします。AppStoreでcodylで検索するか、下記のリンクから開いてください。


Connectのアカウント登録がまだであれば、Connectアプリからアカウント登録が可能です。アカウント登録を済ませて、ログインしましょう。

作業6 シナリオ作成

ブラウザからCodyl Connectにログインしてシナリオを作成します。
  • (1)シナリオタブから「新規シナリオ作成」をクリック
  • (2)わかりやすいシナリオ名に変更
  • (3)説明を書く
  • (4)再実行頻度を0分に変更
  • (5)「イベントウォーク新規作成」をクリック
  • (6)mainの箱の下のプラス記号をクリックしてステートを追加
  • (7)追加されたステート(state2)をクリック
  • (8)「ステートにコネクターを追加」をクリック
  • (9)新しいコネクターを作成を選んで、「ボタン」を選択
  • (10)4つのボタンのうち好きなものを選択
  • (11)「作成」をクリック
  • 12)メソッドに「TRIGGER: when pushed」を選択
  • (13)textの値に「HDDレコーダー起動」と記述。この文字列がスマートフォンのボタンに表示されます。一番下の「閉じる」をクリック
  • (14)state2の下のプラス記号をクリックしてステートを追加、追加されたステート(state5)をクリック。
  • (15)「ステートにコネクターを追加」をクリック
  • (16)新しいコネクターを作成を選んで、「WebHook」を選択
  • (17)わかりやすい名前を入力(例:「WebHook(HDDレコーダー起動)」)
  • (18)外部サービスのURLに、「http://自宅のアドレス:9004/wake」と入力。自宅のアドレスには固定IPの場合はIPアドレス、ダイナミックDNSの場合はDNSホスト名を入れます。
  • (19)「作成」をクリック
  • (20)メソッドに「ACTION: post message」を選択
  • (21)tokenの値にRaspberry Piで設定したTOKENを入力。一番下の「閉じる」をクリック。
  • (22)state5の下のプラス記号をクリックしてステートを追加、追加されたステート(state8)をクリック。
  • (23)「ステートにコネクターを追加」をクリック
  • (24)コネクター一覧から「WebHook(HDDレコーダー起動)」を選択
  • (25)メソッドに「TRIGGER: when received」を選択
  • (26)message_TTLの値に1を入力。一番下の「閉じる」をクリック。

  • (27)state8の下のプラス記号をクリックしてステートを追加、追加されたステート(state11)をクリック。
  • (28)「ステートにコネクターを追加」をクリック
  • (29)コネクター一覧から「プッシュ通知」を選択。まだ作成していなければ、新しいコネクターを作成を選んで、「プッシュ通知」を選択して作成。
  • (30)メソッドに「ACTION: push message」を選択
  • (31)messageに、「HDDレコーダーを起動しました。{{label_10.url}}」を入力。一番下の「閉じる」をクリック。
  • (32)上部のリストからシナリオ名をクリックしてシナリオプロパティ画面に戻る
  • (33)スケジュール設定を有効にする

これでシナリオの設定は完了です。

作業7 Raspberry Piのプログラムを完成させる

webhook_etherwake_recorder.jsの変更部分のうち、作業3で後回しにしていた、POST_URLを書き換えます。コネクタータブから「WebHook(HDDレッコーダー起動)」を選択したときに表示される「外部サービス→Connect」のWebHook URLをコピーして、POST_URLの値としてください。




準備ができたら早速起動してみましょう。下記のコマンドで起動したらListening on port 9004と表示されます。
  • chmod +x webhook_etherwake_recorder.js
  • ./webhook_etherwake_recorder.js
別のシェルから下記のコマンドを実行して動作確認します。(XXXXの部分は設定したTOKENに変更してください)
  • curl -X POST -H "Content-type:application/json" -d '{"token":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"}' http://localhost:9004/wake
OKと表示されて、レコーダーが起動することを確認しましょう。

続いてこのプログラムをRaspberry Piで自動的に起動するように設定します。
  • crontab -e
    • @reboot /usr/local/bin/node $HOME/webhook_etherwake_recorder/webhook_etherwake_recorder.js > /dev/null 2>&1 &

リブート後、先ほどのcurlコマンドをもう一度実行して、正しく動作することを確認します。

完成

シナリオの動作中は、スマートフォンのConnectアプリ上で、「HDDレコーダー起動」ボタンがアクティブになります。



このボタンを押したらHDDレコーダーが起動し、スマートフォンにプッシュ通知が届きます。



通知をタップすると、メッセージが表示されます。


このメッセージの矢印アイコンをタップすると、ブラウザが起動し、HDDレコーダーに接続します。


その後は、自宅で接続しているときと同様に予約録画が可能です。私の所有している機種の場合は、録画予約一覧から、新規予約を選択します。


HDDレコーダーの残り容量が少ないときなど、HDDレコーダーの画面にアラートが通知されているときには、リモコンでアラートを解除するまでは新規予約ができないようです。ここまで準備して外出先でその状態になるととても残念なので、ご注意を。

また、ボタンを押してから通知が届いたタイミングでは、まだHDDレコーダーが起動完了していない場合があります。その場合はスマホのブラウザに「Proxy error」と表示されます。少し待ってリロードしてみてください。

    2017年6月15日木曜日

    本日発売のラズパイマガジン2017年8月号にも執筆記事が掲載されました

    特集5「ラズパイで簡単クラウド連携・カメラ画像やセンサーデータ自動保存、LINEやGoogle表計算アプリで結果を表示」(P87〜)です。





    拙稿の記事は先週発売された日経Linuxと記事内容はほぼ同様ですが、日経Linuxではページ数の関係でダウンロード配布となった後半部分の詳細もラズパイマガジンでは誌面に載っています。他にも、ラズパイ+電子工作の記事が盛りだくさんで、わくわくする内容になっています。是非ご覧ください。一般書店で購入可能です。また、Amazonなどの通販でもお求めになれます。上の表紙イメージをクリックするとAmazonの商品紹介のページに飛べます。

    ラズパイマガジンの記事のリンクからこのブログを訪問してくださった方へ


    記事をお読みいただきありがとうございました。感想やコメントなど、下のコメント欄からいただけると幸いです。また、Case2を試してみたいけれどはんだ付けはちょっとという方へ、はんだ付け済みの部品セットを用意しています。こちらの記事を参照ください。Case2の実測データも公開しています。

    2017年6月9日金曜日

    撮影写真をGoogleドライブに上げてFacebookに投稿

    今年もバケツ稲作始めました。去年、収穫直前にスズメにやられて壊滅的な不作だったので、種もみも不足している状況からのスタートです。まともに育つかどうか、不安です。

    日経Linux記事2017年7月号のCase 1の応用編を紹介します。撮影写真をGoogleドライブに上げてFacebookに投稿します。ルーフバルコニーのバケツ稲作の生育の様子を毎日Facebookに投稿するように設定してみました。



    Facebookに投稿した結果はこちらです。Facebookはタイムラインに写真を表示してくれるので、いい感じですね。

    ポイントは、LINE通知コネクターの代わりにFacebookコネクターを使って、メソッドにACTION: post messageを選択。textには投稿したいメッセージを入力して、linkに{{label_7.view_link}}を入力します。それ以外は日経Linux2017年7月号の記事(特別企画P91〜)の通りで動きます。




    2017年6月8日木曜日

    日経Linux2017年7月号に執筆記事が掲載されました

    本日発売の日経Linux2017年7月号の特別企画「ラズパイで簡単クラウド連携・画像やデータをLINEや表計算アプリで表示」(P91〜)です。





    Codyl ConnectのWebHookコネクターを使って、Raspberry Piのカメラやセンサーと、GoogleドライブやLINEといったインターネット上のサービスとを連携しています。是非ご覧ください。一般書店で購入可能です。また、Amazonなど、インターネットショッピングでもお求めになれます。上の表紙イメージをクリックするとAmazonの商品紹介のページに飛べます。

    日経Linuxの記事のリンクからこのブログを訪問してくださった方へ


    記事をお読みいただきありがとうございました。記事はいかがでしたか?感想やコメントなどありましたら、下のコメント欄からお知らせいただけると幸いです。また、本ブログでもいろいろと具体例を紹介していきますので、今後とも、ときどき訪問してみてください。

    「Case2」の構成で、私の自宅で2017年5月の1ヶ月間計測・蓄積した実データ入りのスプレッドシートを公開します。下記のリンクからご覧ください。一度設定してしまえば、このようにデータが蓄積されます。シート1は生データ、シート2はグラフです。


    また、「Case2」を試してみたいけれど、はんだ付けはちょっとという方へ。はんだ付け、ブレッドボード上の配線済みの下の写真のセットを1つ4,500円(送料込み)にてお譲りします。Raspberry Pi本体は付属しません。先着5名様のみです。納期は2週間程度をみてください。当方で動作確認は行いますが、無保証です。私個人によるプライベートの時間で作業します。所属する会社は無関係です。ご希望の方は、右の連絡フォームから、メールアドレスとメッセージ欄に「センサー希望」と入力して送信してください。送金方法など詳細は追ってこちらからメールでご連絡します。





    2017年6月6日火曜日

    Raspberry Piを屋外でカメラサーバーにするための囲いを作ってみた

    今年もルーフバルコニーでバケツ稲作することにしました。

    Raspberry Piに専用カメラをつけて、毎日決まった時間に撮影して成長の具合や水加減をチェックしようと思います。屋外で使うために雨に濡れないように工夫して囲いを作ってみました。


    用意するもの

    • Raspberry Pi
      • 本体
      • 標準カメラモジュール
      • 電源
      • 無線LAN
      • 標準カメラがセットできるケース
    • 屋外用電源ケーブル


    • ワイヤーネット(62cmx29cm)3つ(ダイソーで購入)

    • 延長ケーブル(ダイソーで購入)
      • 屋外用電源ケーブルと、Rasbperry Pi用電源が形の関係で直接は繋げないため必要です。70cmのものを購入しましたが、短いものが入手できれば短いもので問題ありません。
    • プラスチックケース(24cmx22cmx14cm)(ダイソーで購入)
      • 屋根として使います。
    • 結束バンド
    • 割り箸2つ

    組み立て

    ワイヤーネットを3つ、結束バンドでコの字型に組みます。これにプラスチックケースをかぶせて、屋根ができることを確認します。
    ワイヤーネットの内側に、屋外用電源ケーブル、延長ケーブル、Rasbperry Piの電源を結束バンドで固定します。

    Rasbperry Piを挟むように割り箸を結束バンドで固定します。
    割り箸をワイヤーネットに固定します。
    屋根代わりのプラスチックケースを被せて完成
    バルコニーの手すりにしっかりと固定します。
    raspistillコマンドで撮影してみました。

    簡易なものなので、台風など悪天候が予想される時には屋内にしまった方がよさそうです。

    2017年6月1日木曜日

    Raspberry Piと人感センサーで簡易見守りシステム

    神田に用事があったので、ちょっと足を伸ばして秋葉原の秋月電子通商で、人感センサー(焦電型赤外線センサーモジュールSB612A)を600円+消費税で買ってきました。お目当は400円の別のもの(通販コード M-09627)だったのですが、在庫切れということで、ほぼ同じようなものを選びました。


    http://akizukidenshi.com/catalog/g/gM-08767/

    これとRaspberry Piで簡易見守りシステムを作ろうと思います。Rasbperry Piの近くで人が活動したかどうかを検出して、一日に一度だけLINEに通知するシステムです。
    1. 毎朝6:00に見守りを開始
    2. 人の活動を検出したらLINEに通知して終わり
    3. 夜22:00まで一度も人の活動を検出しなかったらLINEに警告を通知して終わり
    ポート開放やダイナミックDNSは不要です。半田付けも必要ありませんので、比較的お手軽です。

    用意するもの

    • 焦電型赤外線センサーモジュールSB612A
    • ジャンパーケーブル(メスーメス)3本
    • Raspberry Pi
      • SDカードにraspbianインストール済み
        • (2017-04-10-raspbian-jessie-liteを使いました)
      • 有線LANまたは無線LAN
    • ネットワーク環境
      • インターネットに常時接続
    • LINEアカウント
      • メールアドレスが登録されていること

    作業1 Raspberry Piにwiringpiをインストール

    下記のコマンドでwiringpiをインストールします。
    • sudo apt-get -y install wiringpi

    作業2 人感センサーをRasbperry Piに接続

    Raspberry Piをシャットダウンして電源オフにします。センサーとRasbperry Piを接続します。
    • 人感センサーの+とRaspberry Piの5V
    • 人感センサーの-とRasbperry PiのGND
    • 人感センサーのOUTとRaspberryPiのGPIO17


    センサーを固定する良いアイデアが無いので、ジャンパーケーブルむき出しの状態で適当な場所に置いています。

    Rasbperry Piを起動、ログインして、下記コマンドを実行します。
    • while true; do sleep 1; gpio -g read 17; done
    部屋に人が居る間は1が、部屋から人が居なくなってしばらくすると0が表示されることを確認します。うまく0に戻らないときは、DELAYダイアルを動かして調整します。部屋に居ても、動かずにじっとしていると0に戻るようです。トイレの自動点灯する照明もそうですね。DELAYは最も短い設定(2秒)でも問題ありません。

    余談ですが、実験中に、部屋から出ても延々1が出続ける状況に陥りました。DELAYが長すぎるのかと思ってDELAYダイヤルをあれこれいじってみても変わりません。なぜだろうと首をひねっていたら、いつのまにか猫が部屋に居たというオチでした。人感センサーですが、当然猫にも反応しますよね。


    作業3 シナリオ作成

    ブラウザからCodyl Connectにログインして簡易見守り用のシナリオを作成します。Connectのアカウント登録がまだでしたら、「新規アカウント登録はこちら」のボタンからアカウントを登録してから以下に進んでください。
    • (1)シナリオタブから「新規シナリオ作成」をクリック
    • (2)わかりやすいシナリオ名(例:人感センサー見守り)に変更
    • (3)説明を書く
    • (4)スケジュール設定を「指定時刻に一度実行」にする
    • (5)実行開始時刻を6:00にする
    • (6)イベントウォーク新規作成をクリック

    • (7)mainの箱の下のプラス記号をクリックしてステートを追加

    • (8)追加されたステート(state2)をクリック
    • (9)「ステートにコネクターを追加」をクリック

    • (10)新しいコネクターを作成を選んで、「WebHook」を選択
    • (11)後でコネクター一覧から選ぶときにわかりやすくするために名前に「(人感センサー)」を追加
    • (12)他は既定値のままでOK、「作成」をクリック



    • (13)メソッドに「TRIGGER: when received」を選択
    • (14)message_TTLを0にする。
    • (15)__output__に「人感センサーが反応しました」と入力。これが人感センサーが反応したときにLINEに通知されるメッセージになります。
    • (16)「ステートにコネクターを追加」をクリック

    • (17)「メソッドバスケット」を選択。リストに無ければ新規作成から「メソッドバスケット」を選択。
    • (18)メソッドに「TRIGGER: at timeout」を選択
    • (19)timeoutを960にする。(16時間×60=960分)
    • (20)__output__に「警告:人感センサーが反応しませんでした」と入力。これが人感センサーが16時間反応しなかったときにLINEに通知されるメッセージになります。
    • (21)「閉じる」をクリック

    • (22)state2の下のプラス記号をクリックしてステートを追加、追加されたステート(state6)をクリック。
    • (23)「ステートにコネクターを追加」をクリック 

    • (24)新しいコネクターを作成を選んで、「LINE通知」を選択
    • (25)「アカウントに接続」をクリック

    • (26)LINEの認証画面が出るので、メールアドレスとパスワードで認証した後、「1:1でLINE Notifyからの通知を受け取る」を選択。
    • (27)「同意して連携する」をクリック
    • (28)メソッドに「ACTION: notify」を選択
    • (29)textに「{{state2.__output__}}」を入力。
    • (30)「閉じる」をクリック
    • (31)上部のリストからシナリオ名をクリックしてシナリオプロパティ画面に戻る
    • (23)スケジュール設定を有効にする

    これでシナリオの設定は完了です。

    RaspberryPiでWebHookを送信するスクリプトの作成

    RaspberryPiにログインして、下記のスクリプトを~/webhook_pir/webhook_pir.shという名前で作成します。実行権限も付与しておきます。




    スクリプト中のPOST_URLは、WebHookコネクターの「ConnectのWebHook URL」に書き換えます。コネクター一覧から「WebHook(人感センサー)」を選択すると表示されます。

    テスト実行してみます。「人感センサー簡易見守り」シナリオ の「今すぐ実行」ボタンをクリックします。


    続いて、Rasbperry Piで先ほどのwebhook_pir.shを起動します。LINEに以下のような通知が届きます。webhook_pir.shはずっと動き続けますので、確認が終わったらCTRL+cで終了させましょう。


    うまく動かない場合は、webhook_pir.shで何箇所かコメントアウトしてあるデバッグ用のechoコマンドを有効にして、どこまで処理が進んでいるか確認してみましょう。

    自動起動

    Raspberry Piでwebhook_pir.shが自動的に起動するように設定します。(2019/06/27修正:$HOMEの参照をやめ、フルパス記述に変更)

    • crontab -e
      • @reboot /home/pi/webhook_pir/webhook_pir.sh > /dev/null 2>&1 &
    これで、毎日、見守り結果の通知がLINEで届くようになります。

    ラズパイでLet's Encryptの証明書更新に失敗

    ラズパイを自宅用の各種サーバー(DNS、メール、ウェブ他)として使っています。httpsのサーバー証明書の発行・更新にはLet's Encriptを使っています。今日たまたま証明書を更新しようとすると下記のエラーに陥りました。何度やっても失敗します。 ma...