編集履歴一覧に戻る
eucalyのアイコン画像

eucaly が 2024年08月12日16時36分54秒 に編集

初版

タイトルの変更

+

HEMSで遊んでみる aiseg2のWeb画面ハック編

タグの変更

+

HEMS

+

スマートホーム

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

セットアップや使用方法

ライセンスの変更

+

(MIT) The MIT License

本文の変更

+

こんにち、ゆうかりです。 今回は、パナソニックのHEMSシステム、「aiseg2」のWeb画面を。 弄ってみた的なお話です。 **留意事項** **・今回のお話は、HEMSのセキュリティレベルを著しく下げます!** **・「何がキケンか分からない」ヒトは、マネしないで下さい!** **・くれぐれも、適切な運用を!** # aiseg2のWeb画面? えぇ、パナソニックのaiseg2は、基本的には、Web画面で操作します。 ![キャプションを入力できます](https://camo.elchika.com/6d7ea5f3b2357090a9575a8ef4832e43134f68c5/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f65343363333931342d646532612d343638642d386234372d376236383162306331373161/) httpアクセスで、直接機材のWebサーバにアクセスしてね。 httpsでも、クラウドにあるサーバにでも、アプリ経由でもありません。  *そのへんは別途用意されておりますが、アプリとか。 まあ、設計は10年程度前で。 その時に使われてた、それなりの仕組みが用意されております。 これが微妙にウザったかったりします。 # aiseg2 Web画面の課題点 このWeb画面、情報がリアルタイムで更新されたりしますし、各メニューはURLが別になっているので、例えばKIOSK化したタブレット端末とかで表示させっぱなしにしたい!、みたいな。 でも、無理なんです。 ## Digest認証 aiseg2は、扱いが微妙にめんどくさい、「Digest認証」が使われています。 Basic認証であれば、Headerに細工すればOK!なのですが、Nonceが絡むDigest認証では、そうは問屋が卸しません。 Webサイト開くたびに、「認証しますか?」的な画面が出てきてしまいます。 ![キャプションを入力できます](https://camo.elchika.com/1ad42a91d0105a9aaade50317c2873b2dc3e05eb/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f39366663666165652d336133392d343964302d396438382d623731343432353633613137/) なんかこううざったい ## タイムアウト処理 aiseg2の画面は、放置してると5分くらいでタイムアウトします。 ![キャプションを入力できます](https://camo.elchika.com/fd17fadea777eb8307f6e0332927b615112ed6ac/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f66613535633635372d356136392d343431312d616234352d613566393161623731663332/) いや更新停止すんなよ # プロキシで解決してみよう つーわけで、ローカルにプロキシサーバを建て、課題点の解決を謀っていきましょう!。 と、気合入れてmod_proxyとか研究してたのですが、Digest認証回りの取り回しが偉くめんどくさいつーかナレッジが無いので、あきらめの方向で。 適当にプロキシを組んでぱわー解決することにしました。 # プロキシのやりざま ・同一ネットワークに適当なLinux的な端末を置く **・Linux的な端末に、IPアドレスを振る(ルート使うので、既にWebサーバ運用してるなら、2つめの、ね)** ・ApacheとPythonを導入 **・適当なディレクトリにプロキシソフトを置く** **・プロキシソフトに対してScriptAliasを向ける** ・ディストリビューションにもよるけれども、cgiだのvirtualhostだのを有効化しておく ・アクセスして幸せになーる て感じです。 この記事では、太字のところを書き下していきます。 なお、使用しているLinux的な端末は、Archlinux + apache2.4ですが、まあ他のディストリビューションでも似たようなもんだと思います。 # Linux的な端末に、IPアドレスを振る aiseg2は、絶対ディレクトリ記載をしていて、更にajax的なアクセスも実装されているため、baseタグとかでのルート指定は難しい感じです。 なので、プロキシに対しても、ルートを与えてあげる必要があります。 既に端末にWebサーバが起動している場合、IPアドレスを別に振り、当該IPアドレスに対するVirtualHostってことで実装してみようかと。 もちろん、名前解決ベースのVirtualHostでも構いません、DNSサーバとか、hostsとかね。 ipコマンドで、さっくりと ``` ip addr add 10.20.30.40/24 dev enp1s0 label enp1s0:1 ``` # 適当なディレクトリにプロキシソフトを置く 今回は、pythonベースで、プロキシソフトを書きました。 このプロキシソフトでは、以下な感じのものを実装しています。 ・Digest認証の解除  ・Digest認証付で上位アクセス  ・下位へは特に認証を求めない   (認証が必要な場合は、Apache側で実装できる!) ・キャッシュコントロール  ・ヘッダの「Cache-Control」を操作  ・no-cache / max-ageを操作  ・aiseg2の場合、「contents」がURLの中にある場合、静的コンテンツなので、キャッシュ有効化 ・無操作時画面更新停止の抑制  ・「operation_check.js」が、本機能を担当  ・中身のcheckとreset関数の操作を弄り、画面更新停止を潰す ```python:aisegproxy #! /usr/bin/env python import os import requests from requests.auth import HTTPDigestAuth import sys user = 'aiseg' password = '0120370009' host = '10.20.30.216' uri = os.environ['REQUEST_URI'] method = os.environ['REQUEST_METHOD'] #uri = '/data/electricflow/111/update' #method = 'POST' url = 'http://' + host + uri if method == 'GET': response=requests.get(url, auth=HTTPDigestAuth(user,password)) if method == 'POST': bodydatastdin = sys.stdin.read() bodydata = 'data: {}' response=requests.post(url, auth=HTTPDigestAuth(user,password), data=bodydata) headercachecontrol = 'no-cache' if 'contents' in uri: headercachecontrol = 'max-age=31536000' headercontenttype = response.headers['Content-Type'] headerlength = len(response.content) if 'operation_check.js' in uri: jsdata = ''' function stratCheckTimer() { var e = new OperationCheck; checkTimer = setInterval(function() { e.check() }, 1e3) } function stopCheckTimer() { clearInterval(checkTimer) } var OperationCheck = function() {}, checkTimer; OperationCheck.prototype.time = 0, OperationCheck.prototype.check = function() { this.time = 0 } , OperationCheck.prototype.reset = function() { this.time = 0 } , document.addEventListener("DOMContentLoaded", function() { var e = new OperationCheck; checkTimer = setInterval(function() { e.check() }, 1e3), document.addEventListener("click", function(t) { e.reset() }) }); ''' jsdatabin = jsdata.encode() headerlength = len(jsdatabin) outputheader = 'Connection: close' + "\n" + 'Cache-Control: ' + headercachecontrol + "\n" + 'Content-type: ' + headercontenttype + "\n" + 'Content-length: ' + str(headerlength) + "\n\n" sys.stdout.buffer.write(outputheader.encode()) sys.stdout.buffer.write(jsdatabin) else: outputheader = 'Connection: close' + "\n" + 'Cache-Control: ' + headercachecontrol + "\n" + 'Content-type: ' + headercontenttype + "\n" + 'Content-length: ' + str(headerlength) + "\n\n" sys.stdout.buffer.write(outputheader.encode()) sys.stdout.buffer.write(response.content) ``` # プロキシソフトに対してScriptAliasを向ける VirtualHostであれば、割と簡単です。 ``` <VirtualHost 10.20.30.217:80> ScriptAlias / "/opt/aisegproxy/" </VirtualHost> ``` これだけ。 留意点は、例えば上記の場合、「/opt/aisegproxy」がスクリプトそのものであり、ディレクトリじゃないですよ!って感じです。 これで、ルートアクセスからプロキシソフトに渡せるようになります。 VirtualHostを使わない場合、DocumentRootあたりと衝突するかも知れません、要調査!。 # これでやりほうだい 例えば、KIOSK化したラズパイや、GoogleTV端末、adbでイタズラしたタブレット辺りを用意すれば、気軽に「出しっぱなしのHEMS画面」を楽しむことができます。 ![キャプションを入力できます](https://camo.elchika.com/f8d2b57dfe2d97d039c3bfae7109433359dc4b6f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666637633237372d646465642d343333632d393736342d6162303436346433326631302f33646563396161662d616131662d346366342d623432382d613536353733663765376162/) こんなかんじに。 また、Digest認証を経ずにaiseg2の操作も、工夫次第で可能となるため、例えばArduino経由でaiseg2を操作!、なんてのも実装できたりするかも知れません。 それでは、楽しいHEMS生活を!。