はじめに
今回はSOFIXソフト・MINISFORUMを使用して
「Milesight」でデジタル温湿度計を撮影し、その画像から数値を読み取り、デジタルデータに変換、認識結果をCSV形式で出力させる
今回は前回の続きであるSOFIXCANΩEyeで認識した結果をInfluxDBに格納し、Garafanaで可視化させる方法を紹介する

SOFIXCANΩEyeのインストール・カメラセットアップが終わっていない場合、WebAPIの仕様が分からない場合は、以下のブログを参照


環境
SOFIXCANΩEyeからのデータをNodeREDで取得し、Dockerで展開しているInfluxDBに格納、同じくDockerで展開しているGrafanaで認識したデータを可視化させている
動作イメージ


Node-REDのフロー作成
[ 全体像 ]

① injectノード
・「injectノード」を追加
・「繰り返し」を「指定した時間間隔」→「1秒」に変更

➁ http requestノード
・「http requestノード」を追加
・ http requestノードを開き、URLの項目に最新の認識結果を取得するHTTPを記入

➂ Functionノード(データを分ける)
・「Functionノード(データを分ける)」を追加
・ 以下のコードを入力
→ このコードでデータを分割して配列に変換している
// 入力されたテキストデータを改行で分割して配列に変換
let lines = msg.payload.split('\n');
// 空のエントリをフィルタリング
msg.payload = lines.filter(line => line.trim() !== '');
return msg;
➃ splitノード
・「splitノード」を追加
➄ Functionノード(加工)
・「Functionノード(加工)」を追加
・ 以下のコードを入力
→ このコードでエラーの数値をデータに格納しないように除外し、出力されるデータの形式を編集している
let line = msg.payload;
let data = line.split(',');
let timestamp = data
;
let temperatureStr = data[10].replace(/"/g, '');
let humidityStr = data[13].replace(/"/g, '');
// 数値の中にが含まれている場合はエラーログを出力し、データを格納しない
if (temperatureStr.includes('') humidityStr.includes('*')) {
node.error("Invalid sensor data: " + line, msg);
return null; // データを次のノードに送信しない
}
let temperature = parseFloat(temperatureStr);
let humidity = parseFloat(humidityStr);
// 数値が正しく読み取れない場合もエラーログを出力し、データを格納しない
if (isNaN(temperature) isNaN(humidity)) {
node.error("Invalid sensor data: " + line, msg);
return null; // データを次のノードに送信しない
}
msg.payload = {
timestamp: timestamp,
temperature: temperature,
humidity: humidity
};
return msg;
➅ Debugノード
・「Debugノード」を追加
⑦ Influxdb outノード
・ influxDBで新規バケットを作成
・「influxdb outノード」を追加
・ influxDBノードを編集
編集方法の詳細は過去のブログを参照


⑧ 出力結果確認
・「デプロイ」をした後に、Injectノードの左にあるボタンを押して、フローを実行する
→ デバッグタブで出力結果を確認できる(下記の画像)

InfluxDBでデータを確認
①「Data Explorer」を開く
➁「influxDBノード」で設定した「バケット」・「Measurment」・「field」を選択
→ 下の画像のようにテーブルにデータが格納されていれば成功

Grafanaで可視化
①「Grafana」と「InfluxDB」を接続
詳細な接続方法は過去のブログを参照

➁ ダッシュボードを作成し、以下のクエリを入力
・「温度」のクエリ
from(bucket: "omega-eye-realtime")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "sofixcan")
|> filter(fn: (r) => r._field == "temperature")
|> yield(name: "mean_temperature")
・「湿度」のクエリ
from(bucket: "omega-eye-realtime")
|> range(start: -inf)
|> filter(fn: (r) => r._measurement == "sofixcan")
|> filter(fn: (r) => r._field == "humidity")
|> yield(name: "mean_humidity")
➂ グラフと比較


・温度と湿度のグラフ
