top of page

施設園芸のための環境制御システムUECSをOpenBlocks IoTで受信する (① UECS編)


はじめに


OpenBlocks IoTぷらっとホーム株式会社が提供するIoTゲートウェイです。センサーなどのIoTデバイスからデータを受信し、クラウドやデータセンターなどのバックエンドシステムに送信します。またその逆に、バックエンドシステムからIoTデバイスにデータを送信して制御することもできます。Linuxベースで高い汎用性を持つため、送受信前にデータの前処理や分析を行うエッジコンピューティングも可能です。


なお、今回使用したモデルとは違いますが、OpenBlocks IDMシリーズhttps://www.plathome.co.jp/product/openblocks-idm/ )にはプロンプト・Kの開発しているRealboardが搭載されています。ソフトウェア・ハードウェア一体型のIoT専用サーバーであり、プログラミングなしに、収集したデータの統合・グラフ化を自由自在に行うことができます。


UECS(ユビキタス環境制御システム)は、日本で開発された植物の施設生産のための環境制御システムです。産官学の枠を超えて施設園芸の自動化・IT化を目指して活動するユビキタス環境制御システム研究会(UECS研究会)によって詳細情報が公開されています。通信規約も公開されているため、他のシステムとの連携が可能です。


今回はOpenBlocks IoTでUECS規約に基づいたデータを受信する方法を、シンプルなプログラムを使って紹介します。


使用した機材


OpenBlocks IoT VX2





OpenBlocks IoT VX2を使用しました。有線インターフェイスとして2つのイーサネットポートとUSBポートを持ち、無線インターフェイスとしてWi-FiとBluetoothを搭載しています。また通信用のSIMカードを挿入することで、LTE通信も利用できます。IoTデバイスとの接続が容易で、設定もブラウザを通じたWebUIで行えます。







Arsprout Pi


Arsprout Piは、アルスプラウト株式会社が開発したUECS対応の汎用環境計測制御ボードです。Raspberry Pi上で動作し、気温、湿度、CO2濃度、照度などの施設園芸に求められる各種センサーを接続できます。また、UECS規約に基づいたデータ送受信が可能です。




Arsprout Piの起動


Arsprout Piを起動し、まずは開発用PCに接続してデータが受信できていることを確認します。Arsprout Piと開発用PCをLANケーブルで接続します。UECSデータはUDP通信で送信されます。UECSデータは特定のIPアドレスに送信するのではなく、ブロードキャストに送信されています。16520番ポートを使用するため、もし開発用PC側でブロックする設定になっている場合はポートを開放してください。


例としてGo言語で書かれたUECSデータ受信用のプログラムを使って、データを受信します。



go mod init uecs


uecsは任意の名前です。go mod init コマンドでモジュールを初期化します。

次に main.go というファイルを作成し、以下のコードを記述します。


package main

import (
    "encoding/json"
    "fmt"
    "net"
)

func main() {
    // UDP通信を開始
    // IPアドレスを指定せず全てのインターフェースの16520番ポートで待ち受けます
    addr, err := net.ResolveUDPAddr("udp", "0.0.0.0:16520")
    if err != nil {
        fmt.Println(err)
        return
    }

    // ポートを開きます
    conn, err := net.ListenUDP("udp", addr)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer conn.Close()

    for {
        // 受信用に1024バイトのバッファを用意
        // UECSの規約でパケットは480バイト以下と規定されています
        buf := make([]byte, 1024)

        // データを受信
        n, _, err := conn.ReadFromUDP(buf)
        if err != nil {
            fmt.Println(err)
            return
        }

        // 受信したデータをテキストのまま出力
        fmt.Println(string(buf[:n]))
    }
}

これでUDPから送られてくるデータが

<?xml version="1.0"?>
	<UECS ver="1.00-E10">
	<DATA type="InAirTemp" room="1" region="1" order="1" priority="29">23.0</DATA>
	<IP>192.168.1.64</IP>
</UECS>

のようなテキストなのが確認できます。


OpenBlocks IoT VX2の設定


OpenBlocks IoT VX2を電源に接続し、開発用PCとWi-Fiで接続します。初期設定ではSSIDは iotfamily_”本体シリアル番号 、パスワードは openblocksです。ブラウザで http://192.168.254.254:880 にアクセスするとWebUIが表示されます。初回ログイン時にユーザー名とパスワードを設定するようになります。


OpenBlocks IoTはデフォルトでは16520番ポートが開放されていません。UECSデータを受信するためには、ポートを開放する必要があります。WebUIの「システム」→「フィルター」から「フィルター開放設定」にチェックを入れます。

「拡張フィルタ設定ファイル編集」が表示されるので、下記を追記します


/sbin/iptables -A INPUT -p udp --dport 16520 -j ACCEPT


設定すると再起動を求められます。これで毎回再起動時にこの設定が読み込まれ、16520番ポートが開放されます。



OpenBlocks IoT VX2をネットワークに接続する



OpenBlocks IoT VX2をネットワークに接続します。Wi-FiはWebUIのために使用することとし、有線インターフェイスを使用します。UECSデータを受信するためには、OpenBlocks IoT VX2に固定IPアドレスを設定することをお勧めします。WebUIの「ネットワーク」→「基本」から「サービスネットワーク(Ethernet)」を確認します。 `eth0` にArsprout Piを接続することとし、IPアドレスに例えば `192.168.253.254/24` を設定します。`eth1` はインターネット接続用として使用することとし、DHCPでIPアドレスを取得します。設定すると再起動を求められます。


OpenBlocks IoT VX2のEther0ポートとArsprout PiをLANケーブルで接続します。Ether1ポートはルーターなどに接続します。


OpenBlocks IoT VX2でDockerを使ってUECSデータを受信する


Dockerの設定


OpenBlocks IoT VX2にはGo言語の実行環境が含まれていないため、先述のコードを実行するには実行環境の構築が必要です。今回はDockerを使用します。VX2はDockerがインストールされているため(WebUIはDockerで動作しているようです)、Dockerfileを用意することで実行環境が構築できます。


下記はDockerfileの例です。


# マルチステージビルドしています

# ビルドステージです
FROM golang:1.21-alpine AS builder
WORKDIR /usr/src
COPY go.mod go.sum ./
RUN go mod download && go mod verify
COPY . .
RUN go build -ldflags="-w -s" -o app

# 実行用ステージです
FROM alpine:3.14.3
WORKDIR /usr/app
COPY --from=builder /usr/src/app .
CMD ["app"]

docker-compose.yamlの例です


version: '3'

services:
  app:
    build: .
    ports:
      - "16520:16520/udp"
    # VX2の再起動時に自動起動します
    restart: always



docker-composeを使う場合、udpを受信するためのポートは16520:16520/udpのように/udpを記述します。



開発PCからOpenBlocks IoT VX2にファイルを送信する


開発PCからOpenBlocks IoT VX2にファイルを送信する方法として、シリアル通信経由でファイルを送信するlrzszが便利です。まず開発用PCとOpenBlocks IoT VX2のconsoleポートをUSBケーブルで接続します。


VX2にはデフォルトでlrzszがインストールされているのでVX2でのインストールは必要ありません。


開発用PCとしてMacOSを使っている場合、ターミナルを開いてlrzszをインストールできます。


brew install lrzsz

次にシリアル通信でVX2に接続します。



ls /dev/tty.*

を実行し、/dev/tty.usbserial-XXXXXXXX のようなデバイス名を確認します。


screen /dev/tty.usbserial-XXXXXXXX 115200

115200は「ボーレート(Baud rate)」といってデータ通信で使用される単位で、1秒間に何ビットのデータが送信されるかを示します


OpenBlocks IoT VX2のログイン画面が表示されたら、ユーザー名とパスワードを入力します。デフォルトのユーザー名は `root` 、パスワードは `0BSI0T` です。作業用に別途ユーザーを作成することをおすすめします。


sudo adduser USERNAME
sudo usermod -aG sudo USERNAME

上記で管理者権限をもつユーザーを作成できます。パスワードの設定やユーザーの情報を求められるので適切に入力してください


Ctrl-dでいったんログアウトし、作成したユーザーでログインし直します

そしてファイルを転送したいディレクトリに移動し、ファイルの転送を行います。


screenでは Ctrl-a を押した後に : を押すとコマンド実行モードに入ります。


:exec !! sz FILENAME


このように入力すると、ファイルが転送されます。


Dockerを使ってUECSデータを受信する


ファイルを転送したら、Dockerコンテナを起動してUECSデータを受信します。


docker-compose up -d


コンテナが起動し、UECSデータを受信する準備が整います。docker-compose logs -f でログを確認し、UECSデータが受信されているか確認しましょう。


screenを終了するにはCtrl-aを押した後にkを押します。


まとめと次回予告


OpenBlocks IoT VX2でUECSデータを受信する方法を紹介しました。今回はUECSをテキストデータとして受信しましたが、次回はUECSデータを解析し、時系列データベースCLOUDSHIPに保存してRealBoardで可視化します。CLOUDSHIP、RealBoardはIoTデータを収集・可視化する際に強力なツールです。お楽しみに!

閲覧数:13回
bottom of page