(2015-12-4)[[%%%別ページ%%%>network-io_on_universal_circuit_board#q933b869]]にネット経由で操作できる赤外線リモコンの作例を追加しました。
----
(2014-10-23)本ページのシステムをRaspberry Piでリニューアルしました。
[[携帯からインターネット経由で赤外線命令を発行して既設エアコンを操作(Raspberry Pi活用編)>internet-ir-aircon-raspberry-pi]]
----
(2013-7-21)本ページでは市販の学習リモコンを''強引に''外部から操作、[[%%%このページ%%%>remote-sys]]では有線リモコンを乗っ取って''強引に''外部から操作しているわけですが、新たに[[%%%Wake on LAN非対応のPCを''強引に''リモートから起動する%%%>network-io_on_universal_circuit_board]]という作例が加わりました。(2016-3-15)''強引''シリーズに新ネタが加わりました。[[%%%自動化非対応の機器を高機能なUSB接続ステータスLEDリーダーを接続することで自動化する例%%%>aggressive-automation]]です。
----
(2011-10-13)[[%%%同等の市販品へのリンク%%%>#commercial_product]]を追加しました。
----
TITLE:携帯からインターネット経由で赤外線命令を発行して既設エアコンを操作
RIGHT:初出 2011-8-17
RIGHT:最終更新 2013-3-19
LEFT:
[[%%%以前から公開しているこのページ%%%>remote-sys]]では古い(1985年製)の有線リモコン式のエアコンをインターネット対応させた例を紹介していますが、本ページでは”今どき(2011年購入)の、しかしインターネット非対応で、既設の”赤外線リモコンで操作する形式のエアコンをインターネット対応させてネット経由で操作する一例を紹介します。
#br
まず断っておきますが、本ページで紹介するシステムは、
[[&ref(internet-ir-aircon_1_s.jpg);:http://wikiwiki.jp/disklessfun/?plugin=attach&pcmd=open&file=internet-ir-aircon_1_b.jpg&refer=internet-ir-aircon]]
&size(7){画像をクリックすると大きな画像で表示されます。};
このようにリモコンの''ONとOFFのボタンが別々''となっている機器を前提としています。幸いなことに最近のエアコンの大半はこのような仕様になっているようです。電源のONとOFFがトグルボタンになっているエアコンの場合は[[このページ>remote-sys]]のようなフィードバック制御を独自に追加するか、HA端子を利用する必要があります。
#br
私は[[%%%ここ%%%>remote-sys]]とか[[%%%ここ%%%>misc1#zfa28b92]]でHA端子の利用について触れていますが、最近主流の(フィードバック制御の要らない)ONとOFFのボタンが別々になっているエアコンの場合には、HA端子を利用するよりも、本ページのように赤外線を介してリモート操作するシステムの方が適している(リーズナブルにシステム構築できる)と思います。
#br
#contents
#br;
&aname(commercial_product);
** (2011-10-13追記)同等の市販品 [#vda9d9fd]
リーズナブルな価格の市販品がありました。
#br
[[%%%&color(Blue){Amazon.co.jp クールテクノロジーズ HMS-350Y/RM スマートゲートキット(赤外線リモコン)};%%%:http://www.amazon.co.jp/%E3%82%AF%E3%83%BC%E3%83%AB%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%BC%E3%82%BA-HMS-350Y-RM-%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%82%B2%E3%83%BC%E3%83%88%E3%82%AD%E3%83%83%E3%83%88%EF%BC%88%E8%B5%A4%E5%A4%96%E7%B7%9A%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3%EF%BC%89/dp/B00498TWZI]]
#br
[[%%%&color(Blue){HMS-350Y/RMの販売元 クールテクノロジーズ};%%%:http://www.qool-tech.co.jp/product/h350y/index.html]]
#br
[[%%%&color(Blue){目的をペットの遠隔みまもりに特化させてHMS-350Y/RMを販売しているサイト};%%%:http://www.mimamoripet.com/]]

&aname(overall);
** 全景 [#y18044f8]
[[&ref(internet-ir-aircon_2_s.jpg);:http://wikiwiki.jp/disklessfun/?plugin=attach&pcmd=open&file=internet-ir-aircon_2_b.jpg&refer=internet-ir-aircon]]
&size(7){画像をクリックすると大きな画像で表示されます。};
今回は一から製作したわけではなく、[[%%%前のシステム%%%>remote-sys]]を流用しました。
元々作っていたものを流用したものだし、[[前のシステム>remote-sys]]も今回のシステムも見栄えを気にしなくていい環境だったので、大袈裟な外見になっています。
全体のシステム構成も[[%%%こちら%%%>remote-sys]]とほぼ同じです。違いはこの写真や[[%%%この写真%%%>#console]]に写っているとおりです。

&aname(console);
** 対象のエアコンと同じ部屋に追加設置するもの(赤外線命令発射装置) [#jec240fb]
[[&ref(internet-ir-aircon_4_s.jpg);:http://wikiwiki.jp/disklessfun/?plugin=attach&pcmd=open&file=internet-ir-aircon_4_b.jpg&refer=internet-ir-aircon]]
&size(7){画像をクリックすると大きな画像で表示されます。};
中央にエアコンの赤外線命令を学習させた市販の学習リモコン [[%%%ソニー・RM-VL501%%%>#universal_remote]]を殻割りして取り出した基板を取り付けてあり、赤外線は真上に発射されます。RM-VL501の基板にはワニ口クリップを取り付けるという原始的な方法をとっています。基板の反対側には絶縁のシートを挟んでいます。赤外線命令の発射の方法は、ある一定時間(現在は0.4秒間)リレーで短絡するという方法です。手でボタンを押す操作をエミュレートしているわけです。ちなみに0.4秒間というのは[[%%%以前のシステム%%%>remote-sys]]での時間をそのままにしている為で、実際にはもっと短い時間でも大丈夫だと思います。0.4秒間というのは多少長すぎると思いますが、赤外線命令が2回発射されてしまうまでには至っていません。
#br
RM-VL501には補助基板(左側を占める大きな基板)から出ている5Vをさらに降圧して作成した(ちょっと高すぎですが)3.3Vを供給しています。
#br
PICNICのファームウェアは[[%%%以前%%%>remote-sys]]のままです。また補助基板のハードも変更なしです。変更したのは補助基板上の[[マイコン(PIC16F84A)のファームウェア>#firmware]]とwebサーバーの[[ラッパーcgiのソース>#cgi_source]]です。以前のシステムでの状態は[[%%%こちら%%%>remote-sys#photo2]]を参照下さい。

&aname(universal_remote);
*** 赤外線命令の発行は市販の学習リモコンを利用 [#t564a655]
[[&ref(internet-ir-aircon_3_s.jpg);:http://wikiwiki.jp/disklessfun/?plugin=attach&pcmd=open&file=internet-ir-aircon_3_b.jpg&refer=internet-ir-aircon]]
&size(7){画像をクリックすると大きな画像で表示されます。};
エアコン用の学習リモコンを作るのは面倒だと思ったので、赤外線命令を発行する機能については手持ちの市販品の学習リモコンを利用することにしました。7年前に購入して殆ど遊んでいたソニーのRM-VL501です。
#br
この方法は見た目には洗練されていませんが、製作に関する敷居を下げるという意味ではとても良い方法だと思います。この方法を採ったからこそ皆さんにこのシステムを紹介しようという気持ちが起ころうというものです。
#br
さてRM-VL501は既にディスコンです。同様にシステムを構築したいと思われる方は安くて機能を満たせる他の学習リモコンを見つけたいと思われることでしょう。しかし現在のエアコンの赤外線命令は非常に長いので、あまり安物の学習リモコンだと利用できないかもしれません。ちなみに市場最廉価クラスの[[%%%RC23BK%%%>remocon_etc#RC23BK]]は利用できません。
#br
もちろん純正リモコンを補修部品として追加購入して利用してもいいかと思います。純正リモコンの基板に導電性接着剤でリード線を取り付けるというのが市販のリモコンを利用する方法の中では最も信頼性を高められるやり方だと思います。逆に学習リモコンを利用した場合のメリットとしては、「ワニ口クリップで挟みやすい場所にあるボタン」を好きなように選べることだと思います。
#br
(2011-10-13追記)
数社からエアコン用の汎用リモコンが販売されているようです。それらを用いた方がずっと安く済みます。
たとえば、
[[%%%&color(Blue){Amazon.co.jp オーム電機 OAR-10R エアコン汎用リモコン};%%%:http://www.amazon.co.jp/%E3%82%AA%E3%83%BC%E3%83%A0%E9%9B%BB%E6%A9%9F-%E3%82%A8%E3%82%A2%E3%82%B3%E3%83%B3%E6%B1%8E%E7%94%A8%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3-%EF%BC%AF%EF%BC%A1%EF%BC%B2%EF%BC%8D%EF%BC%91%EF%BC%90%EF%BC%B2/dp/B001CLC5F4]]

&aname(picnic);
*** ネットワーク接続機能にはPICNICを利用 [#k3d467cf]
[[%%%前のシステム%%%>remote-sys]]から殆どを受け継いでいるのでネットワーク接続機能には引き続き[[%%%PICNIC Ver.2%%%:http://akizukidenshi.com/catalog/g/gK-00102/]]を利用しています。
#br
PICNICの他にもネットワーク経由でCMOSレベルのポートのHigh, Lowを制御できる組み込みボードはいくつかありますから、それを利用してもいいと思います。その選択には[[%%%こちら%%%>#cgi_source]]を参考にして頂けると思います。

&aname(auxiliary_board);
*** 補助基板 [#d603f012]
補助基板([[%%%この写真の左側の多くを占める大きな基板%%%>#console]])は[[%%%このシステム%%%>remote-sys]]用の流用ですので[[%%%こちらの回路図%%%:http://wikiwiki.jp/disklessfun/?plugin=attach&pcmd=open&file=remote-sys_circt_b.png&refer=remote-sys]]を見て下さい。見ればわかると思いますが、今回のシステムでは使用していない部分も多いです。
#br
回路図上のエアコンA用のリレーに「冷房」ボタンを挟んだ緑のワニ口クリップを、エアコンB用のリレーに「停止」ボタンを挟んだ白のワニ口クリップを接続しています。今回のシステムではフィードバック制御がありませんからフォトトランジスタTPS615を用いた部分は未使用です。
#br
「[[%%%PICNICを手元で操作できるスイッチ%%%>picnic-patch]]」は一応そのまま使っていますが、標準添付のリモコンがすぐ側にあるわけで、今回のシステムとしては別に必須ではないと思います。
#br
本当はリレーを1個追加して「暖房」ボタンも設けたかったですが、面倒なのでやめました。冬も使うならワニ口クリップの位置を隣のボタン上に移動させて対応することになりそうです。既に隣のボタンは暖房の赤外線命令を学習済みです。
#br
システムの作り方(設計方針)によってはこの補助基板はリレー作動回路だけのシンプルなものにすることが可能な筈です。[[%%%こちら%%%>#cgi_source]]に説明を載せています。

&aname(web_interface);
** 携帯画面(PICNICのWeb画面をラップしたもの) [#x5b1dd78]
この画面のCGIサーバは現在、「[[&color(Blue){%%%DD-WRT+optware%%%};>add_usb-port_to_dd-wrt]]」で構築しています。以前は[[&color(Blue){%%%CFリードオンリー運用のx86 Linux%%%};>onecddebian]]でした。(2013-3-19追記)
#br
*使用していないポートを操作するボタンは消しています。必要が生じればまた戻すでしょう。
[[&ref(internet-ir-aircon_5_s.png);:http://wikiwiki.jp/disklessfun/?plugin=attach&pcmd=open&file=internet-ir-aircon_5_b.png&refer=internet-ir-aircon]]
&size(7){画像をクリックすると大きな画像で表示されます。};
実際にはこのキャプチャー画像はLAN内のパソコンからアクセスした際のものです。携帯からアクセスした場合は1行目の文字とQRコードは表示しません。(参考:[[%%%以前のシステムでの携帯画面%%%>remote-sys#photo6]])

#br
「冷房」ボタンといっても、単に冷房をオンにするだけではありません。現在のエアコンの赤外線命令は同時に温度、風速、風向きの情報を含んでいます。''つまり、学習リモコンに赤外線命令を学習させる際には温度、風速、風向きをきっちりと決定しておく必要があります。''

&aname(firmware);
** 補助基板のファームウェア [#ke8cdda4]
MPASM用
''ダウンロード'' &ref(internet-ir-aircon.asm,nolink);

[[%%%このページ%%%>remote-sys]]のファームウェアの改造板です。元々が初めて私が作ったPICプログラムなので、使用している構文が少なくて逆に読みやすいかと思います。
#br
このプログラムでやっていることは、入力ポートがLowからHigh、もしくはHighからLowに変化した際に一定時間(約0.4秒間)リレーを閉状態にすることだけです。[[%%%下%%%>#cgi_source]]にも書いていますが、この程度の簡単な処理はPICNICのファームウェアに組み込んでしまって、補助基板側のマイコンを廃することも十分可能な筈です。

&aname(cgi_source);
** 携帯画面(PICNICのラッパーcgi)のソース [#l3857cdb]
''ダウンロード'' &ref(stateful-to-stateless_onoff.cgi.zip,nolink);

[[%%%このページ%%%>remote-sys]]のcgiプログラムの改造板です。
ステートフルな(ON・OFFの区別がある)PICNICのインターフェースをステートレスに変換する機能を追加しています。
具体的な仕組みとしては、ユーザからは「どのポートを操作(更新)したいか」だけを受付け、更新する瞬間にPICNICから最新のステータスを自動的に取得し、瞬時にその反対のステート(HighもしくはLow)で更新をおこなう仕様となっています。
#br
もちろんPICNICのファームウェアを変更し、PICNIC自体をステートレスに改造するやり方もあるのですが、今回は既にある補助基板をそのまま生かす形式を選択しました。
#br
PICNIC以外にもネットワーク経由でステートフルにON・OFFする(High, Lowを切り替える)組み込み基板はいくつか(沢山)あります。その中には最初から完成品の形式で販売されていてカスタマイズが難しいものがあります。今回採った方法はそのような場合にも応用可能だと思います。
#br
ちなみにPICNIC自体をステートレスに改造した場合はリレー動作用のパルスもPICNICで発生させることになります。そうすると、手元で操作するスイッチも要らないとすると補助基板にマイコンは必要なくなり、リレーを動作させる回路だけあればいいことになります。またこの改造をおこなうと同時にPICNIC内蔵のwebサーバの改造も必須となり、結果的にラッパーcgiサーバを省くことも十分可能となります。今回の私は元々あった補助基板と一体になった大きな操作盤をそのまま生かしましたが、一から構築する方はPICNIC自体の改造にチャレンジなさってもいいかと思います。新PICNICの方なら改造もし易いと思います。

&aname(check_and_warning_sendmail);
** 設定室温に達すると冷房をつけた上で携帯電話にメールを送信するPerlスクリプト [#l3425cdb]
ごく簡単なものですが十分役に立つものです。仕様はご自分の状況に合わせて適宜変更して頂きたいですが、たとえば室内犬が熱中症になるのを防ぐとか自宅サーバの故障を防ぐ用途なんかだと殆どそのまま使えるのではないかと思います。
このPerlスクリプトを動かすサーバはPICNICと同一ネットワーク上にある必要はありません。設定によってはインターネット越しも可能です。
-(最近は対応していないと使い物になりませんから、当然)SMTP認証に対応しています。
-PICNIC(もしくはそれに類するもの)にアクセス可能な常時稼動のサーバにcron登録しておくべきものです。
-一般ユーザ権限でOKです。
-当該のサーバに一般的なメール関係の環境構築の必要はありません。
-やるべきことは必要なPerlパッケージのインストールとcron登録だけです。

''ダウンロード'' &ref(check_and_warning_sendmail.pl,nolink);
 #!/usr/bin/perl
 
 # このスクリプトはEUC-JPで保存されている必要があります。
 
 # Debian, Ubuntu系の場合の追加インストールが必要なパッケージ
 # libnet-smtpauth-perl libjcode-pm-perl libwww-perl 
 
 use Net::SMTP_auth;
 use Jcode;
 use Encode;
 use LWP::Simple;
 
 
 $smtpserver = 'smtp.hoge.ne.jp:587';               # SMTP認証でアクセスするサーバ
 $smtpacount = 'fugafuga@hoge.ne.jp';               # SMTP認証用のアカウント
 $smtppasswd = 'SECRET';                            # SMTP認証用のパスワード
 $myrealmailaddress = 'fugafuga@hoge.ne.jp';        # 自分の本当のメールアドレス
 $tomailaddress1 = 'foobar@docomo.ne.jp';           # 宛先アドレス
 $tomailaddress2 = 'foobar@hoge.ne.jp';             # 宛先アドレス
 $bccmailaddress = $smtpacount;
 $fromaddress = 'remotecontroleradmin@dummy.com';   # 宛先側で個別の受信設定をおこな
                                                    # えば実在しないアドレスも可
 $remoteaddress="192.168.1.9";                      # PICNICのアドレス
 $limittemp = 34;                                   # メールを送信し始める室温(摂氏)
 
 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
 $nowdate = sprintf("%d年%d月%d日 %d時%d分%d秒", $year + 1900, $mon +1, $mday,
  $hour, $min, $sec);
 
 $html = get ("http://$remoteaddress/");
 
 if ( $html eq '' ) {
 	&make_smtp_error_msg();
 	mailsend();
 	exit;
 }
 
 
 # 室温
 $html =~ />(\d+) Celsius</;
 $Celcius=$1;
 
 $port='RB4';
 # RB4(冷房ボタン用ポート)の現在値の反対
 $opposite_level=&get_opposite_level($port);
 
 
 if ( $Celcius >= $limittemp ) {
 
 $html = get ("http://$remoteaddress/modify.cgi\?$port=$opposite_level");
 
 if ( $html eq '' ) {
 	&make_smtp_error_msg();
 	mailsend();
 	exit;
 }
 
 
 $Subject="室温が$Celcius度です。冷房をつけました。";
 $Body="$nowdate\n室温は現在$Celcius度です。\nたった今、冷房をつけました。";
 mailsend();
 }
 
 
 sub mailsend {
 $smtp = Net::SMTP_auth->new("$smtpserver");
 $smtp->auth('CRAM-MD5', "$smtpacount", "$smtppasswd");
 
 $smtp->mail("$myrealmailaddress");
 $smtp->to("$tomailaddress1","$tomailaddress2");
 $smtp->bcc("$bccmailaddress");
 
 &Jcode::convert($Subject, 'jis', 'euc');
 &Jcode::convert($Body, 'jis', 'euc');
 
 $smtp->data();
 $smtp->datasend("From:$fromaddress\n");
 $smtp->datasend("To:$tomailaddress1\n");
 $smtp->datasend("To:$tomailaddress2\n");
 $smtp->datasend("Subject:".encode('MIME-Header-ISO_2022_JP', $Subject)."\n");
 $smtp->datasend($Body);
 $smtp->dataend();
 $smtp->quit;
 
 return;
 }
 
 sub get_opposite_level {
 $word = @_[0];
 $htmlw = $html;
 $htmlw =~ /$word([^ ]+) ([^ ]+) ([^ ]+).*</;
 $ret = $3;
 $ret =~ s/High/L/;
 $ret =~ s/Low/H/;
 return $ret;
 }
 
 sub make_smtp_error_msg {
 $Subject="コントローラにアクセスできません。";
 $Body="$nowdate\nコントローラにアクセスできません。\n電源等を確認して下さい。";
 }
#br
* ご要望、ご意見、質問を下のフォームにどうぞ&br;(でもここより、[[掲示板>board]]や[[書き込みフォーム>form]]のページに書いて頂いた方が気づき易いと思います。) [#ob204da9]
#areaedit(nofreeze,noauth,btn:[修正(書き間違った場合にご利用下さい)])
#comment
#areaedit(end)