こんにち、ゆうかりです。
今回は、パナソニックの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
さんが
2024/08/12
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する