東京工業大学
デジタル創作同好会

2017年10月24日 | メンバーブログ

ラズパイとTwitterで外から家のエアコンをONONONONON!!!

satoriku

はじめましてsatorikuです。10月24日、アドベントカレンダー2日目です。

何も考えないでいつでもできるよ!!って言ったらこの日になりましたがテスト×2+課題×2と重なって死んでおります。(予定確認しなかった私が悪いんだよ、仕方ないね。)

去年のアドベントカレンダーではunityでなんか適当なのを作ってましたが、今unityでちゃんとゲーム作ってます。楽っちゃ楽だけど色々大変ですね...特にgitとかでの進捗管理、コンフリクトしスギィ!

今回はタイトル通りラズパイで外からエアコンを操作するものを作ったのでそれについて書いていきます。

動機

暑い夏の日、暑い外から帰宅したら涼しい部屋でゲームでもしたいですよね。しかし私の部屋は二階角部屋、1日熱せられたその部屋はクッソ暑くなってます。玄関開けて階段上がってくとだんだん気温が上がってくのが実感できるくらいです。タイマー付ければ良いのですが我が家のエアコンは安物なので6時間後までしか設定できませんし何時に帰ってくるかなんて朝わかりません...外から帰ったら涼しい部屋でくつろぎたい!じゃあ外から帰る前にエアコン付けられるようにしよう!ということで作りました。

ラズパイでエアコンを付ける

https://qiita.com/KAKY/items/55e6c54fa2073cdc0bbe
こちらを参考にさせていただきました。
lircというソフトを使ってリモコンの赤外線を読み取って保存、それを赤外線LEDで送信できるようにします。
やり方はほとんど↑のサイトに書いてある通りでソフトの設定とちょっと電子工作するくらいです。

こんな感じでつないであります。一番左がラズパイ本体、真ん中が赤外線LED、右がLEDの電源でコンセントまでつながってます。
LEDの電源はラズパイからとっても良かったのですがLEDの消費電力がそこそこあったのと今後の拡張性を考えてコンセントから取って色々繋げるようにしておきました。拡張性は大事です。LEDはコンセントからの電源にしてラズパイの信号でトランジスタ使ってスイッチングするようにしました。
右下に伸びているコードは後述する温度計につながっています。
ちゃんと読み取れなかったりソフトが上手く起動しなかったりして苦戦しましたがなんとかなりました。
これでコマンドを打てばエアコンを操作できるようになります。
エアコンのコマンドはリモコンのボタン通りに1℃あげる、下げるというのではなくn℃にする、電源をつける、電源を切る、というものです。この内登録したのは20℃で電源をつける、電源を切る、とn℃にするというものです。つけるときは一気に涼しくしたいのでこれで十分です。全部登録するの面倒だった
このうちTwitterから操作できるのはオン・オフだけ。温度調整はどうせ実際のリモコンでやるので...

Twitterから操作する

ここが今回のメインです。Twitterからラズパイを操作してエアコンを付けられるようにします。

なぜTwitterなのか

家のサーバーを外から操作する方法は色々ありますよね。webを作るとかスマホアプリを作るとか。しかしなぜTwitterなのか、理由は以下の二つです。

・設定が簡単

webとかスマホアプリでやろうとするとsslの設定したりhtml書いたりcss書いたりjs書いたりphp書いたりアプリ作ったり...結構やることが多いんですよね...しかもこの中で私がやったことあるのはhtmlとcssだけ...
強い人なら一瞬でやってしまいそうですが...(私にはそんな技術は)ないです。まあ勉強すれば良いんですがこれを作り始めたのが6月、夏まで時間が無かったのでさっさと作りたかったので今回は却下です。そのうちLAN内から操作できるくらいのwebは作りたいですね

ここでTwitterの登場です。実は以前TwitterでTLを監視して他人へのリプ以外のツイートにクソリプを送るbotを作ったことがありました。つまりアプリの認証をしてツイート内容を見て何かをする、というものはもう既に出来てたわけです。今回はコレを全部流用したので今回ほとんどコード書いてないです。認証をするコードを分けて書いて汎用化してくれた昔の私に圧倒的感謝!

・使いやすい

使うときにはwebならブラウザを、アプリを作ればそのアプリを開く必要があります。ここで私のスマホのバッテリーの使用状況を見てみましょう。

はい、ほとんどTwitterですね。スマホ使ってるときはだいたいTwitterしてるのでTwitterで操作できればアカウントを切り替えるだけで出来ます。いちいちアプリを閉じたりせずに済むので楽ですね。

作った

まずTwitterで新しいアカウントを作ってそれにアプリを設定します。そのアプリをラズパイで常時動かしてTLを監視し、自分のツイートを見てそれによってコマンドを打てるようにすればエアコンを操作できるようになります。
アプリのコードは以下です。クソリプ用コードちょっと書き換えただけ

#!/usr/bin/ruby
require 'twitter'
require 'csv'
require_relative 'setclient'#自作したアプリ認証用のスクリプト
streamingclient=setStreamingclient
client=setRESTingclient
client.update("start"+Time.now.to_s)
#client.update("start_",Time.now)
# userstreamを表示する
begin 
streamingclient.user  do |tw|
     if tw.is_a?(Twitter::Tweet)
	if tw.user.screen_name=="Twitterの垢名" #自分のツイートを見て
		id=tw.id
		if /エアコンけして/=~tw.text
		client.destroy_status(id) #短時間で同じツイートができなくなるのでつい消し
		client.update("エアコンを消します\n"+Time.now.to_s)#同じツイートにならないために時間を追加してツイート
		system('irsend SEND_ONCE aircon off')#電源を切る
		
		end
		if /エアコンつけて/=~tw.text
	        client.destroy_status(id)#短時間で同じツイートができなくなるのでつい消し
                client.update(" エアコンをつけます\n"+Time.now.to_s)#同じツイートにならないために時間を追加してツイート
                system('irsend SEND_ONCE aircon on')#電源をつける
		system('irsend SEND_ONCE aircon temp_20')#温度を20℃にする
                end
		if /いきてる?/=~tw.text
		client.destroy_status(id)#短時間で同じツイートができなくなるのでつい消し
		client.update("いきてるよ\n"+Time.now.to_s)#同じツイートにならないために時間を追加
		end
	end
  end
end
rescue #たまに吐く例外のための復帰
puts "Exception"+Time.now.to_s
sleep 10
retry
end

主にやってるのはツイートみてコマンド打ってるだけです。
あと同じツイートの規制に引っかからないようなちょっとした工夫とたまに例外吐くのでそれの復帰があるくらいです。

部屋の温度を計測する

外からエアコンをつける時の参考になるようにラズパイに温度計を付けて温度を知れるようにしました。

これが温度計です。先程の写真で右下に伸びていたコードの先につながっています。
http://deviceplus.jp/hobby/raspberrypi_entry_039/
こちらのサイトを参考にして、コードもお借りして実装しました。10分ごとに温度、湿度、気圧を計測してcsvに書き込み、それを読み込んで10分ごとにツイートするようになってます。
毎時10n分に計測して10n+1分にツイートします。(0≦n≦5)
ツイートする部分のコードは以下の通りです。保存してあるcsvを開いて最新データをツイートしてます。

require 'twitter'
require 'csv'
require_relative 'setclient'
client=setRESTingclient
fg=CSV.read("/home/rika/temp_control/temp_datas/"+Date.today.strftime("%Y%m%d")+".csv").last
 client.update("時間#{fg[0]}\n温度  #{fg[2]}℃\n気圧  #{fg[1]}\hPa\n湿度  #{fg[3]}%\n"+Time.now.to_s)


こんな感じで10分毎にツイートされます。これを見てエアコンをつけるかどうか決めます。本垢でフォローしてあるので普通にTwitterをしてれば流れてきますから思い出せます。

作ってみて使ってみて

上でも書いたとおり今回ほとんどコード書いてないです。一番時間かかったのはlircの謎のエラーとの格闘です。(ならそこ書けよと思うでしょうが4ヶ月くらい前のことなので忘れましたごめんなさい許してくださいなんでもry)Twitterに関する部分は既存のコードの流用、書き換えで済んだので結構一瞬でした。
実際にひと夏使ってみましたがなかなか便利です。帰り道でエアコンをつければ1時間くらいで帰ってめっちゃ涼しい部屋に入れます。いいっすねぇ~(たまに忘れて暑い家に帰宅することもありましたが)

終わりに

この記事書く前にちょっと調べてみたら似たようなことやってる人もう既にいるみたいですね。有料ですが似たようなサービスもあります。でも色々いじって楽しかったですしTwitterで操作することでかなり便利に使えているので結構満足しています。だがしかし、我が家のエアコンは安物なので冷房しかないんですよ、暖房がないので冬は使えません。でもせっかくラズパイ買ったのでエアコン以外にも色々やってみたいです。Twitterから家のメインPC起動したりとか。あと最近GoogleHomeが発売されて音声で色々操作できるみたいですが...声かけてエアコン付けられたら楽しいよねとか。あと今回ツイートによって条件分岐してコマンド叩いてましたがツイートをコマンドに直接ぶち込めばSSH的な使い方もできるんじゃないでしょうか。
結構夢が広がりますね~。何かやったら来年のadcにでも書くかもしれないです。あまり期待しないでお待ち下さい。

ということで今回の記事は以上です、ありがとうございました。

明日はHummingの記事です!乞うご期待!!

この記事を書いた人
satoriku

この記事をシェア

このエントリーをはてなブックマークに追加

関連する記事

2017年12月26日
Splatoon2~ボムの使い方~
shigurure
2017年12月25日
RustでMCMC(Metropolis-Hasting)
David
2017年12月25日
NinjaFlickerが完成しました
gotoh

活動の紹介

カテゴリ

タグ