2017年5月29日月曜日

パナソニックの照明を制御する

我が家の建物にはパナソニック製の照明が備え付けられています。
そして、入居してしばらくは気づかなかったのですが、どうもこの照明、リモコンに対応しているようです。部屋にはリモコンが備え付けられていませんでした。

型番をググって説明書を見ると、リモコンはHK9487MMというものらしいです。Amazonで2500円程度…。高いな…。

さて、説明書やリモコンの画像を見ると、どうも下記のボタンがあるようです。
  • 点灯(普段)
  • 全灯
  • 常夜灯
  • 消灯
  • 白い色(調色ボタン)
  • 暖かい色(調色ボタン)
  • 明るい(明暗ボタン)
  • 暗い(明暗ボタン)
  • おやすみ30(30分タイマー)
  • チャンネル選択(1,2,3)
  • チャンネル確定
ほうほう、壁のボタンだと全灯→暗め→常夜灯しか切り替えられませんが、こんなにいろいろな機能があるようです。

手元にリモコンがあれば、赤外線フォトトランジスタとかを使ってコードを解析すればいいのですが、無いのでどうしようもありません。

赤外線通信の方式

どうもググるところによると、この手の赤外線通信はおおよそ3種類あるそうです。NECフォーマット、SONYフォーマット、家電協フォーマットがその3種類ですが、パナソニック製照明はどうも家電協フォーマットのようです。

赤外線リモコンの通信フォーマット

細かいプロトコルはこのページに詳しく書いてあります。
T=425usとして、赤外線LEDを38kHzで点滅させている状態(duty比1:2)をON、消灯させている状態をOFFとすると、0はONを1T、OFFを1Tで1はONを1T、OFFを3Tで表現するようです。

ここでハマったことは、最後のビットを送信し終わった後にONを1Tだけ送ってストップビットとすることです。このストップビットを送らないと、最後のビットでOFFが1T続いたのか3T続いたのかがわからないので、最後のビットを読むことができません。結果、デコードエラーとなり受け付けてくれません。

送信データの内容

さて、具体的にどんな信号を送ればいいかと言うと、このサイトに書いてありました。

iRemo2 リモコン・データベース

例えば、CH1の全灯コマンドは

0x344A9034A4

です。
上記のフォーマットに当てはめてみると、「0x344A」がパナソニックのカスタマーコードのようです。その次の「9」が、この16bit値を4bitずつ区切ってXORを取ったパリティです。
次は、「0x034」が命令コード本体で、最後の「A4」は、カスタマーコードのパリティを含んだ「0x9034」の16bit値を8bitずつ区切ってXORを取ったパリティのようです。

すなわち、パナソニック照明に何かしらのコマンドを送るのにキーとなるのはたったの12bit分です。
しかも、上記のページにはコマンドがある程度書いてあります。

さて、その肝になる12bit分をリストに書いてみるとこうなります。

0000 0101 0100 CH1 明るく
0000 0100 1100 CH2 明るく
0000 0101 1100 CH3 明るく
0000 1011 0100 CH1 点灯(普段)
0000 1010 1100 CH2 点灯(普段)
0000 1011 1100 CH3 点灯(普段)
0000 1101 0100 CH1 暗く
0000 1100 1100 CH2 暗く
0000 1101 1100 CH3 暗く
0000 1111 0100 CH1 消灯
0000 1110 1100 CH2 消灯
0000 1111 1100 CH3 消灯
0000 0111 0100 CH1 常夜灯
0000 0110 1100 CH2 常夜灯
0000 0111 1100 CH3 常夜灯
0000 0011 0100 CH1 全灯
0000 0010 1100 CH2 全灯
0000 0011 1100 CH3 全灯

さて、ここまで見ると(わざとらしく色分けしていますが)見えてきます。
最初の4bit、最後の3bitはよくわかりませんが、5~7bit目は点灯内容を表すコード、8,9bit目はチャンネルに対応しています。

ここまでの話はMSBからデータを送信しているとの仮定ですが、LSBから送信していたとするとチャンネルのbitがそのままチャンネル番号に対応していると言えそうですが、まあ細かいことなのであまり気にしないことにしましょう。MSBから送っていると考えたほうがわかりやすいですし。

他の送信コード

最初にリモコンの外見等から見た機能の中で、上記のコードに含まれていないものがあります。
  • 白く
  • 黄色く
  • おやすみ30(30分タイマー)
  • チャンネル確定
といったところでしょうか。
最初は上記の青色部分が「000」と「100」の2通りが無いので、これが「白く」と「黄色く」に対応するのかなと思いましたが、どうも違うようです。

とりあえず、チャンネルの位置を8,9bit目として他の部分で10bit分。これを総当たりすれば1024通りです。「白く」「黄色く」の調色ボタンは1回押しただけでは変化がわかりにくいので、20回くらい連打するべきでしょう。
20回の連打に3秒かければ、だいたい1時間くらいで総当たりが終わります。その間にゴロゴロしながらアニメでも見ていればいいでしょうと思いながらやってみました。

そうすると、一部のコードが見つかりましたが全部は見つかりませんでした。
うーん、こうなったら12bit総当たりだ!それでも4時間くらいですしまあ何とかなるでしょう。

というわけで洗いだしたコードが下記の通りになります。

1100 110‬‬1 0001 CH1 黄色
1100 1011 0001 CH2 黄色
1100 1111 0001 CH3 黄色
1100 100‬0 1001 CH1 黄色く
1100 1010 1001 CH2 黄色く
1100 100‬1 1001 CH3 黄色く
1100 010‬1 0001 CH1 白
1100 0011 0001 CH2 白
1100 0111 0001 CH3 白
1100 0000 1001 CH1 白く
1100 0010 1001 CH2 白く
1100 000‬1 1001 CH3 白く
1100 1000 0101 CH1 タイマー
1100 0101 0101 CH2 タイマー
1100 110‬0 1101 CH3 タイマー
1100 010‬1 1011 CH1 チャンネル変更
1100 110‬‬1 1011 CH2 チャンネル変更
1100 001‬‬‬1 1011 CH3 チャンネル変更

リモコンにはない、「(最も)黄色にする」「(最も)白にする」 というコマンドもオマケで見つかりました。
ですが、これを見てもどこがチャンネルと言うべきか、どこが点灯内容と言うべきかいまいちよくわからないコードです。色関係のコマンドでは少し共通性はありますが、タイマーやチャンネル変更を合わせたコマンドを見てもいまいち規則性はわかりませんでした。
誰か解読できた人がいたら教えてください。

実装(ダイジェスト)

さて、これをESP8266に実装し、基板を作成して箱に収めるとこんな感じになります。



ESP8266なのでWi-Fiで操作できます。
ウェブブラウザでも操作できますが、せっかくなのでスマホアプリも作ってみました。
まあこの辺の製作話はまた今度、気が向いたらにしましょう。

ではでは。