![見出し画像](https://assets.st-note.com/production/uploads/images/108693106/rectangle_large_type_2_40859a4054565de39fa116e760127544.png?width=1200)
TWSNMP FCに計測器のプロトコルLXIのポーリングを追加
今朝は4時半から開発開始です。
昨日、SNMPのポーリングをJavaScriptで行うモードを追加しました。その応用で計測器のプロトコルLXIもJavaScriptから行うモードを作りました。
![](https://assets.st-note.com/img/1687211644761-4aewmvptWZ.png?width=1200)
のような感じです。
![](https://assets.st-note.com/img/1687211727647-PIA3IZjLV8.png?width=1200)
ポーリングの種別をLXIにすれば、lxiQuery()という関数が判定スクリプトで使えるようになります。lxiCommand()という関数もつけましたが、応答がズレてしまうので使えません。全部lxiQueryでいけるような気がします。
スクリプトは
var r = lxiQuery("READ?");
setResult("lxi",r);
r && r *1 > 0.0
のような感じです。
LXIは、
コマンドを実行して応答が返らない対策で、JavaScriptの実行環境ottoの機能でタイムアウトするようにしてあります。
こんなコードです。
var errJsHalt = fmt.Errorf("jshalt")
func runJavaScriptWithTimeout(vm *otto.Otto, s string, timeout int) (otto.Value, error) {
start := time.Now()
defer func() {
duration := time.Since(start)
if caught := recover(); caught != nil {
if caught == errJsHalt {
log.Printf("lxi polling script took to long! Stopping after: %v\n", duration)
return
}
panic(caught) // Something else happened, repanic!
}
log.Printf("lix polling script successfully: %v\n", duration)
}()
vm.Interrupt = make(chan func(), 1) // The buffer prevents blocking
watchdogCleanup := make(chan struct{})
defer close(watchdogCleanup)
go func() {
select {
case <-time.After(time.Duration(timeout) * time.Second): // Stop after timeout seconds
vm.Interrupt <- func() {
panic(errJsHalt)
}
case <-watchdogCleanup:
}
close(vm.Interrupt)
}()
return vm.Run(s)
}
いちおう動作したのですが、panicとか使っているので、LXIのパッケージのほうで対策したほうがよさそうな気がしてきました。GitHUBでforkして対応したいと思いますが、今朝は時間切れになってしまいました。
明日に続く
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。