天気予報をHueでお知らせ

2つのスマートライト「Hue」で、天気予報をお知らせします。天気情報はOpenWeatherのAPIを使っています。

OpenWeatherのAPIの用意

天気情報を取得できるOpenWeatherのAPIがあります。アカウント登録をすると無料で天気データのJSONを受け取ることができます。(1分間に60リクエストまで)

アカウント登録方法、各種設定についてはネット上に多くの情報があり、ここでは多く書きません。

今回は東京の3時間ごとの天気予報を、下記URLで取得します。

http://api.openweathermap.org/data/2.5/forecast?id=1850147&units=metric&cnt=2&appid=<取得したid>

  • id=1850147が東京
  • units=metricは摂氏で温度取得
  • cnt=2で3時間ごとに天気予報データを2件取得。

私はあまり出かけないので3~6時間後の天気を知れればそれでよいです。

3時間ごとの天気予報をHueでお知らせ

JavaScriptで定期的にAPIを呼んで、天気予報をHueの色に変換して伝えます。

  • 快晴・・・オレンジ
  • 晴れ・・・薄めのオレンジ※1
  • 曇り・・・白っぽいオレンジ※1
  • 雨・・・水色※2
  • 雪・・・白っぽい紫
  • その他(竜巻とか砂埃とか)・・・白

※1 雲が多いほど彩度・明度が下がり、白っぽく暗くなります。
※2 降水量が多いほど彩度・明度が上がり、鮮やかで明るい水色になります。

HueをjQueryで操作する

動作はブラウザとローカルのHTMLファイルで、簡単に試せます。

jQueryでHueを操作する方法はこちらをご確認ください。

もし、稼働しっぱなしのPCやラズパイがあれば、setintervalなどで定期的に上記JavaScriptを実行することで、天気予報のHueライトが更新されていきます。

jQueryでHueを制御する

スマートライト「Hue」。ローカルのブラウザでjQueryを使って簡単に操作できます。やってみれば簡単ですが、毎回やり方を忘れて調べることになります。また、HueにjQueryを使おうとする記事がほぼないので、ここに書き留めます。

Hueをローカルで制御する準備

前程として、Hueブリッジが必要です。また、公式アプリでHueライトの動作確認が済んでいる状態で話を進めます。

Hueをローカルから制御するには、HueブリッジのAPIを発行します。

http://0.0.0.0/api/XXXXXXXX/lights/1/state/

上記のようなアドレスに、{“on”:true} というようなJSONを送ると、ライトがONになります。

まずはHueブリッジのIPアドレスを調べます。

https://discovery.meethue.comへアクセスすると、”internalipaddress”:”0.0.0.0″というような、HueブリッジのIPアドレスが表示されます。

ここから先は、公式ページのHow to develop for Hue? Step 3に沿って進めたほうが確実です。

Googleページ翻訳でだいたい意味は分かり、このページに沿って設定するのが最速でした。

1点だけ、途中にHueブリッジの物理ボタンを押す必要があるので、注意が必要です。PCの画面のボタンではなく、ブリッジのボタンです。

Go and press the button on the bridge and then press the POST button again and you should get a success response like below.

jQueryでPUTすればよい

APIを発行出来たら、{“on”:true} というようなHueライトの状態を書いたJSONをPUTします。Web制作でPUTメソッドを使う機会はほぼなく、ブラウザによっては問題が起こりそうなので、jQueryに頼ります。

適当なHTML(test.htmlなど)をローカルに作りましょう。

13行目のurlは、先ほど調べたAPIのurlに書き換えてください。

また、もしHueライトを複数持っている場合、/lights/の後の数字を変えてみてください。Hue公式アプリで登録順に数字がふられていると思います。一つしかなければ/lights/1です。

書き換えが完了したら、このHTMLをブラウザで開きます。

するとHueライトが赤色に変わります。

APIにJSONをPUTするだけ。分かってしまうと、簡単です。

ブラウザのJavaScriptで、自由にライトを操作できるようになりました。

setIntervalのズレ(ラズパイ3のブラウザで確認)

10分間隔でスプレッドシートに温度・湿度を記録するJavaScriptを作りました。しかし、なぜか途中から5分前後の間隔で記録されています。ラズパイ3のブラウザでsetInterval()を使ったときに起こりました。

ブラウザで定期的に動作

温度センサーで取得した値を、obniz経由でラズパイ3のブラウザChromiumに表示させています。

タイマー処理はラズパイのブラウザ上で動作しています。

ブラウザのJavaScriptで、10分間隔で何か実行する場合、下記のような記述方法があります。

setInterval()で、10分(=600,000ミリ秒)ごとに実行する書き方です。

3時間後、タイマーが狂う

ラズパイを放置していたら、3時間後に突然大きなズレが発生していました。ちなみにラズパイはディスプレイをつないでいない状態です。

冒頭のスプレッドシートを再掲します。

開始3時間は10分間隔でしたが、その後5分前後の間隔になっています。

理由は分かりません。

ラズパイ3か、ブラウザが省電力モードに入ったのかもしれません。

処理速度が落ちて間隔が伸びるのかなと考えていましたが、逆に縮まるようです。

決まった時間に処理実行

解決策として、現在時刻の分が10で割りきれる数(例えば1:00, 1:10, 1:20, 1:30, 1:40, 1:50)の時だけ実行するようにします。

1分間に2回処理しないよう、前回から分が変わっている時だけ実行するようにしました。(もっと良い書き方があるかもしれません。)

このコードであれば、3時間以降でもだいたい10分間隔で実行してくれます。

ラズパイのブラウザを起動しっぱなしで温度を記録しようとするのはレアケースだと思いますが、参考になる人がいれば・・・。

obnizで温度・湿度センサー「SHT20」を使う

obnizのパーツライブラリにある温度・湿度センサー「SHT20」。パーツライブラリ以外にあまり情報がないので、起こったトラブルとその対処法を記録に残します。

温度・湿度センサー「SHT20」購入

SHT20は、Amazonで900円くらいで買えます。

ピンのはんだ付けは必要でした。

パーツライブラリのコード調整

SHT20のピンは4本ですが、サンプルコードでは6本指定があります。

adrとaddressmodeは、指定しなくても問題なく動作しました。

たまに出るエラーに注意

温度、湿度を定期的に取得していると、たまに下記のエラーが発生します。

i2c0: writing error. Communication Failed. Maybe, target is not connected.

エラーは大きく2パターンあり、数値を取得できない場合と、-2で取得する場合です。

特に気温-2度は、ありえる数字なので要注意です。

エラーの対処法

使う場面で対処は異なりますが、今回はエラーや不正値の場合、前回の値を代入する対処とします。

sensor.get・・・でエラーがでたら前回の値代入。

これだけでは解決せず、-2と取得することがあります。

センサーで取得する気温や湿度の値は、少数点15位くらいまであり、-2ピッタリになることはまずありえません。

もし、-2だった場合も、前回の値を代入することにしました。

追記:超高温・高湿度エラー

まだエラーが発生しました。

まれに、気温が「53.1℃」とか、湿度「96.8%」とか、異常に高い数値を取得してしまいます。

window.onerrorで、ブラウザがエラーを感知した時、前回の値を代入するように追記して、様子をみます。

obniz常時稼働にラズパイを使う

obnizとリレーモジュールの組み合わせで、遠隔で家電を操作する仕組みを作りました。しかし、操作画面のブラウザを閉じたら、obnizの動作が停止し、家電の電源が切れてしまいます。苦肉の策でラズパイを導入しました。

家電の電源を保持できない

スマホで、ホットカーペットと加湿器を、ネット経由でONにできます。

しかし、操作画面のブラウザを閉じたり、スリープになると、リレーモジュールへの通電が止まり、家電の電源が落ちてしまいます。

ブラウザを常時起動

電源が落ちないようにする方法を考えなければなりません。

このプロダクト、最終的には24時間稼働して、温度・湿度センサーにより、自動でホットカーペットと加湿器の電源をON/OFF切り替えようとしています。

常時稼働はいくつか方法がありそうですが、暫定的に、ラズパイのブラウザを起動しっぱなしにする方法をとりました。最も簡単です。

スマートではないですが、これでobnizが常時動作してくれます。

obnizを使わず、ラズパイだけでよかったのでは・・・と、考えてしまいますが、開発の早さでobnizを愛用してしまいます。

obnizで電源タップのリレーBOX

リレーモジュール付き電源タップを2つobnizにつなぎ、インターネット経由で家電のON/OFFを操作できる仕組みをつくりました。ほこりがかぶらないよう、ガラスのふた付き木箱に入れています。

木箱に穴を空ける

ダイソーの100円木箱を使っています。木工用ホールソーで、電源タップを通す穴を空けます。(子供がやる場合、十分注意してください。)

左右2つずつ、計4つの穴を空けました。

リレーモジュールのスペーサー取り付け

リレーモジュールを浮かせるため、スペーサーを取り付けます。

木箱に直接取り付けるより、別の木の板を用意したほうがお勧めです。

作業がしやすく、失敗も許されます。

ダイソーの木の板(MDF材 6枚入り)を用意し、裏から穴を空け、スペーサーをねじ止めします。

ネジ穴と、ネジ皿が入る穴を、2段階で開けると良さそうです。

ネジ皿用の穴は、途中まで掘り、木材の面からネジ皿が飛び出ないようにします。

電源タップリレーモジュールを取り付け

スペーサーに電源タップリレーモジュールを取り付けます。

2つの家電を操作したかったので、2組取り付けました。

obnizとリレーをつなぐ

obnizとリレーモジュールを、ジャンパーワイヤーでつなぎます。

単純につなぐと、6つのIOピンが必要ですが、VCCとGNDを2つのリレーで共用すると、4つで済みます。

小さいブレッドボードを木材に取り付け、配線します。

obnizのIOピンは、以下のように挿しています。

VCC・・0
GND・・1
リレーその1-SIG・・2
リレーその2-SIG・・3

IOピン2、3に電流を流すと、リレーがON/OFF切り替わります。

リレー制御コード

obnizコンソール、デフォルトのHTMLを少しいじっただけです。

“obnizID”のところに自分のIDを入れ、適当なブラウザで立ち上げると動作します。

配線整理

最後に、少し配線がこんがらがって、電源タップの導線もむき出しで危なかったので整理しました。

obnizに挿すジャンパーワイヤーは、4本つづりのものに替え、電源タップの導線には、絶縁テープを巻いています。

テスト実行

地味な変化で分かりにくいですが・・・スマホで2つの家電のON/OFFを切り替えることが出来ました。

防炎スプレー「ハイショーカー」の性能確認

防炎スプレー「ハイショーカー」に、どれだけ防炎能力があるか?実際に火を付けて試します。電子工作をしていると火事になる危険があるので、防炎スプレーで予防できるか知りたいです。

防炎スプレー比較実験

木の箱を用意します。左はそのままティッシュを入れ、右には箱に防炎スプレーをかけ、さらにティッシュを入れた後も、上から防炎スプレーをかけます。

ただのティッシュに火を付けてみる

左の箱のただのティッシュに火を付けました。

ティッシュは勢いよく燃え、25秒くらいかけて燃え尽きました。

箱の底が変色しています。日本の湿度だと、この火力で箱まで燃えることはないでしょう。

防炎スプレーのティッシュに火を付けてみる

今度は右の箱、防炎スプレーをかけたティッシュが乾いてから、火を付けてみます。

効果が見られ、火の付きが悪いです。

様々な場所に火を付けてみると、スプレーのかかりが少ないところが燃えています。

スプレー量が多ければ防炎になったかもしれません。

ゆっくりゆっくり煙を上げながら、燃えていきます。

一部、白い部分を残し、2分以上かけて、だいたい燃えました。

燃焼後の箱の中比較

灰を取り除き、箱の中を見てみます。やはり防炎スプレーをかけた右の方が、焦げた跡が少ないです。

動画で燃え方比較

動画で比較すると、防炎スプレーをかけることで燃えにくくなっていることが分かります。

(手振れで見にくくてごめんなさい。三脚使い、さらに同時に火を付けて比較すればよかった・・・)

大電流を扱う電子工作の場合、収納する箱に防炎スプレーをかけて燃えにくくするのは、一定の効果が期待できそうです。

電源用USBコネクタで手軽に動作テスト

前回制作したリレーモジュールのテストではマイコンを使いました。もっと簡単にテストする方法で、電源用USBコネクタから電源を取って試す方法があります。

電源アダプタ・リレーモジュール

秋月電子の「大電流大型リレーモジュールキット」を取り付けた電源アダプタです。家庭用100Vコンセントで動く家電を、リレーで制御できるようになります。

リレーモジュールに5Vの電流を流すと、電源タップの100Vにも電流が流れます。つなぎ方を変えれば、逆に5Vの電流を流して100Vの電流を止めることもできます。

電源用USBコネクタ

テスト用の5V電源を用意するとき簡単な方法は、秋月の「電源用マイクロUSBコネクタDIP化キット」を使うことです。

ブレッドボードやターミナルと組み合わせて、汎用的に使える5V電源となります。

リレーモジュールに5V電源のジャンパーワイヤーを指すと、動作確認ができました。

電源用USBコネクタは電子工作のテストで、しばしば役立ちます。

電源タップに大電流リレーモジュールを接続

一般的な100Vで動く家電を電子工作に組み込みたいとき、マイコンの電源では無理なので、リレー回路を使います。電源タップを改造して、100Vの家電を制御してみます。

大電流大型リレーモジュールキット

秋月電子で「大電流大型リレーモジュールキット」を買いました。一般家庭の100VACを、マイコンに使われる5Vの電流で制御できるようになります。

扱う電流が大きい時は、キット製品を買った方が安心です。

リレーモジュールキット組み立て

基板に部品をはんだ付けします。

はんだ付けする間隔が広いので、比較的やりやすかったです。

0.1m電源タップを改造

エレコム製の0.1m電源タップ(ACアダプタ)を使います。

これにリレーを取り付けましょう。

ケーブルには2本の導線が入っており、片方だけペンチでむき出しにします。

なお、電源タップの改造は、電気工事士の資格がなくても可能です。

むき出しにした導線を、このままリレーモジュールに取り付けるのは難しいです。

導線の長さが足りず、深く押し込めず、中途半端な接触で高熱になる恐れがあります。

家にあった圧着端子を使うことにしました。

圧着端子を導線に付けてから、さらに、はんだで固定します。

圧着端子を付けたら、それをリレーモジュールのターミナルに差し込み、しっかり固定します。

100VACのリレーのテスト

作成したリレー付き電源タップを家庭用コンセントに挿します。

電源タップの反対側には照明を取り付け、リレーモジュールにはobnizボード(マイコン)を取り付けます。

スマホからobnizボードを操作し、リレーに電流を流します。

すると、リレー内部で「カチッ!」と電磁石がくっつき、照明が通電して光りました。

問題なく動作しています。

追記:絶縁しました

導線のむき出し部分があると怖いので、絶縁しました。

herokuでnode.jsアプリをデプロイするまで(2)

HerokuでにWebアプリのファイルをアップした時、画像が読み込めない問題が起こりました。仕様上、「public」ディレクトリに画像などの静的ファイルを入れないといけないようです。

静的ファイルが読み込めない?

自作のWebアプリをアップデートしました。ページ数も増え、画像などの依存ファイルも増えました。

これをHerokuにアップしてみます。

アップにはGitを使い、コミットは問題なく行われたようです。

しかし、Webアプリにアクセスしてみると、アップしたファイルが404エラーとなってしまい、画像などが読み込めない問題が起こりました。

「public」ディレクトリ内に格納

Herokuの仕様で「public」ディレクトリ内のファイルしか、静的ファイルにアクセスできないようです。

私の場合、node.jsのサーバーファイルと、同じ階層にWebアプリのHTMLを作っていました。

これは管理上もよくないので、Webアプリに使う静的ファイルを、新規作成した「public」ディレクトリに格納しました。

階層の変更は簡単

「public」ディレクトリに格納したことで、階層が変わりました。

1階層深くなっています。

これは、サーバー起動ファイル(index.js)を編集すれば解決できます。※expressを使っている時の例です。

publicがルートになり、階層変更前と同じように読み込めるようになりました。

以上、備忘録を兼ね、記録します。