eucalyのアイコン画像
eucaly 2024年08月12日作成 © MIT
セットアップや使用方法 セットアップや使用方法 閲覧数 298
eucaly 2024年08月12日作成 © MIT セットアップや使用方法 セットアップや使用方法 閲覧数 298

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

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

こんにち、ゆうかりです。

今回は、パナソニックのHEMSシステム、「aiseg2」のWeb画面を。
弄ってみた的なお話です。

留意事項
・今回のお話は、HEMSのセキュリティレベルを著しく下げます!
・「何がキケンか分からない」ヒトは、マネしないで下さい!
・くれぐれも、適切な運用を!

aiseg2のWeb画面?

えぇ、パナソニックのaiseg2は、基本的には、Web画面で操作します。
キャプションを入力できます

httpアクセスで、直接機材のWebサーバにアクセスしてね。
httpsでも、クラウドにあるサーバにでも、アプリ経由でもありません。
 *そのへんは別途用意されておりますが、アプリとか。

まあ、設計は10年程度前で。
その時に使われてた、それなりの仕組みが用意されております。
これが微妙にウザったかったりします。

aiseg2 Web画面の課題点

このWeb画面、情報がリアルタイムで更新されたりしますし、各メニューはURLが別になっているので、例えばKIOSK化したタブレット端末とかで表示させっぱなしにしたい!、みたいな。
でも、無理なんです。

Digest認証

aiseg2は、扱いが微妙にめんどくさい、「Digest認証」が使われています。
Basic認証であれば、Headerに細工すればOK!なのですが、Nonceが絡むDigest認証では、そうは問屋が卸しません。
Webサイト開くたびに、「認証しますか?」的な画面が出てきてしまいます。
キャプションを入力できます
なんかこううざったい

タイムアウト処理

aiseg2の画面は、放置してると5分くらいでタイムアウトします。
キャプションを入力できます
いや更新停止すんなよ

プロキシで解決してみよう

つーわけで、ローカルにプロキシサーバを建て、課題点の解決を謀っていきましょう!。
と、気合入れて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関数の操作を弄り、画面更新停止を潰す

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画面」を楽しむことができます。
キャプションを入力できます
こんなかんじに。

また、Digest認証を経ずにaiseg2の操作も、工夫次第で可能となるため、例えばArduino経由でaiseg2を操作!、なんてのも実装できたりするかも知れません。

それでは、楽しいHEMS生活を!。

eucalyのアイコン画像
いつも、てきとうです
  • eucaly さんが 2024/08/12 に 編集 をしました。 (メッセージ: 初版)
ログインしてコメントを投稿する