Davis Instruments の気象観測機器

1. 概要

仕事、自動化、家庭生活など、ほぼあらゆる場面でで、 気象データを必要とする状況は極めて多いのですが、私の場合は、 長野県での現役経営者時代、長年 Davis InstrumentsWeather Monitor II の RS232 出力を MOXA の Device Server で LAN 変換する方法で使ってきました。 既に生産中止になった旧機種ですが、30 年を経過した今でも動いています。

現時点での 現行機種 は手軽に使える Vantage VUE と、 高機能な Vantage Pro2 ですが、 私自身は引退後、東京に戻ってからは、自宅で Vantage VUE を WatherLinkIP で LAN 収容する方法で使っています。

Vantage VUE は気圧、温度、湿度、風速、風向、 雨量センサをコンパクトな一体型にまとめたもので、 屋外センサと屋内センサ(コンソール)間は 900 MHz 小電力無線を使った接続ですから、 設置が極めて容易です。 ただ、屋外センサの電力は内蔵太陽電池と大容量キャパシタの組合せで賄えない 時間帯に内蔵リチウム電池を使うため、 何年かに一度は電池交換が必要で、家屋の高いところに設置するのは避けたいですから、 風速や風向の精度が必要な場合は、有線接続の機種が良いと思います。

ただ、それでも、 私の場合は東京都世田谷区の街中の自宅2階のベランダに設置した Vantage VUE の風速データ記録と家屋の換気管理に重要な屋外 CO2 データ測定値を見比べた結果、 現在の建築法規と建築基準が前提としている 400 ppm に対して、 実際の屋外 CO2 濃度は 700 ppm 程度まで上昇する場合があって、 建築法規や衛生法規が要求する屋内 CO2 濃度 1,000ppm 以下の実現は極めて困難で、 屋外 OC2 濃度が東京圏広域での大気の動きに大きく左右されているという、 これまで知られていなかった事実に気づきました。 (注1)

また、(無線免許不要の)小電力無線の仕様が日本とアメリカで異なるため、 アメリカ仕様の製品を日本で使うことができず、 日本では AOR が日本向けに仕様を変更した製品を販売しています。 (注2)

Vantage Pro2 は気圧、温度、湿度、風速、風向に加えて、 農業等で重要な全天日射量、紫外線強度、土壌水分、 葉面湿潤度を含むセンサの追加ができて、システムの自由度があり、 センサとコンソール間の接続も有線と無線の選択ができます。 ただ、無線の場合、 日本向け製品はアメリカの小電力無線と比べて通信可能な距離が短いため、 使える場面が限られるのが残念です。

以下、本題に入りますが、 これらの製品をコンピュータ・システムに接続する手段としては、

  6510 SER ....... RS232 接続
  6510 USB ....... USB 接続
  WeatherLinkIP .. LAN (Ethernet) 接続 (現在は生産終了だが、上位互換の代替品あり)
  WeatherLink Live .. WiFi or LAN (Etherney) 接続
が用意されていますが、これらは WeatherLink Live を除いて、 単純なコンピュータ・インタフェースでなく、 データロガー (Data Logger) を兼ねていて、 一定時間毎(デフォルトでは 30 分)に測定データを記録してくれるため、 データ収集を行うコンピュータ障害時のバックアップもできます。

自分でプログラムを書いて使う場合は WeatherLinkIP が最も使いやすいのですが、最近、生産中止になりました。しかし、 Meteo Pi Ethernet Logger というポーランド製の上位互換品が SCALED INSTRUMENTS等から購入できて、 機能的には WeatherLinkIP よりよくできています。

DAVIS 社自体はこれらのインタフェースを使うための Windows 用バイナリだけを 供給しているのですが、 6510 SER のコンソール・コンピュータ間の通信プロトコル Vantage Pro, Vantage Pro2 and Vantage Vue Serial Communication Reference Manual という仕様書が公開されていて、 ユーザーが自分でプログラムを書くのは簡単です。

6510 SERはオーソドックスな RS-232 インタフェースですが、 コンピュータの RS232 port、あるいは、 USB-RS232 変換アダプターを使ってコンピュータに直接接続したり、 RS232-LAN 変換器を使って LAN 接続するなど自由度が大きいです。 (注3)

6510 USB は Silicon Labs CP2102 USB to UART Bridge Controller (LSI) を 使ったもので、FreeBSD では uslcom ドライバーで /dev/caU0 などと認識され、 6510 SER と同じ通信手順が使えます。(注4)

WeatherLinkIP の場合はポート 22222 を使った TCP 接続で、 これも 6510 SER と同じ通信手順が使えます。

WeatherLink Live は温度、湿度、気圧センサを内蔵し、 スマートホンの専用アプリ (application software) でBluetooth 接続して、 WiFi や (有線)LAN 接続の条件を設定、 小電力無線で接続する観測機器(無線接続の Vantage VUE, Vantage Pro2 など)の選定、 Davis Instruments 社の wdi.weatherlink.com サーバーへの接続設定を行う 設計になっています。 (注5)

一般のコンピュータとのインタフェースは WEB API で JSON 形式の現在値を出力するか、 一定時間間隔で現在値を broadcast するだけになってしまいましたので、 curl でデータを読み出して awk などで処理するとか、 pythonruby などで WEB サーバーにアクセスして JSON 形式のデータを処理するといった使いかたになります。 (注6)

また、WeatherLink Live にはデータロガー機能がなく、 必要な場合は DAVIS 社の有料データ蓄積サービスを https://www.weatherlink.com/ を使ってほしいということらしいのですが、 自動化に使う場合は、すべてを自分で管理するほうが応用範囲も広く、 コストも下がりますから、現状では 6510 SER + Device Server か Meteo Pi を使う方法が良いと思います。

2. ネットワーク収容

6510 SER6510USBで直接コンピュータに接続する場合は、 tipcu コマンドでテストできる単純なシリアル通信で、 「買ってみなければわからない」という状況にはならないと思いますので、 以下、 WeatherStation をネットワーク (LAN, WSLAN) に収容する方法を説明します。

DAVIS Weather Station をネットワークに収容する方法としては、

  6510 SER ----------- Device Server --- LAN(有線) or WiFi(無線)
  WeatherLinkIP ------ LAN (有線)
  Meteo Pi ----------- LAN (有線)
  WeatherLink Live --- LAN(有線) or WiFi(無線)
があります。

2.1 Serial Communication Protocol が使えるケース

6510 SERMOXAのシリアルデバイスサーバーなどで LAN 収容する場合、あるいは、 WeatherLinkIPMeteo Pi Ethernet Loggerで LAN 収容する場合は、 Serial Communication Protocolが使えますから、 TCP 接続で Serial Communication Protocol を実行するプログラムを書けば Unix でも使えます。 これらはデータロガー機能を持っていますから、 Davis の有料データ保存サービスを必要としないのが利点です。

シリアルデバイスサーバーを使う場合は RS232 の通信条件 (baud rate, data bits, parity, stop bit) と LAN 接続条件 (IP address, SubnetMask, Gateway) をシリアルデバイスサーバー側で設定しますから、通信プログラムは簡単になります。

WeatherLinkIPMeteo Pi の場合は、 簡単な WEB server を内蔵していて、 初期設定では DHCP で自分の IP address を取得する設計になっているのですが、 ブラウザで取得した IP address にアクセスすると、 IP address を変更、固定したり、 Davis 社の wetherlink.com サーバーでの観測データの保存、 一般公開の可否を選択できるようになっています。

つまり、当初はブラウザで指定すべき IP address がわかりませんので、 自分のネットワークの DHCP server の IP adress 割り当て状況を調べ、 WeatherLinkIPMeteo Pi の MAC Address (Ethernet のハードウェア ID) から、割り当てられた IP addrss を見付けなければなりません。 WeatherLinkIP の MAC Address は製品の LAN ケーブル受け口に表示され、 Meteo Pi の場合は DHCP server に Device name 「MeteoPi-Ethernet」を知らせますので、 DHCP server の状態表示から IP address を知ることができます。

こうして IP address を固定できれば、 安定したネトワーク接続ができて、 TCP 接続で気象観測機器を制御するプログラムを書くことができます。

2.2 WeatherLink Live の場合

WeatherLink Live の場合は、MAC address が本体底部に表示され、 初期状態では DHCP サーバーから IP address を取得しますが、 Bluetooth 接続したスマートホンの WeatherLink App で、 DHCP 以外に、任意の IP addres を設定(固定)することができます。

なお、mDNS で weatherlink._tcp.local. を使って IP address を知ることもできて、 mDNS による検索は例えば Android の「Service Brouser」 App が便利です。

また、Serial Communication Protocol は使えず、 コンピュータで測定データを取得する方法は下記 WEB API のみで、 例えば、WeatherLink Live の IP adress 192.168.2.31 からのデータ取得なら

  http://192.168.2.31:80/v1/current_conditions
にアクセスすると、JSON形式のデータが取得できて、通常、 それをブラウザが見やすく整形表示してくれます。

データ取得を自動化したい場合は、例えば、

  curl -X GET -H "application/json" http://192.168.2.31:80/v1/current_conditions
が良いと思います。

この他、一定時間間隔で測定データを boroadcast (port 22222 UDP) させることもできますが、詳細は

https://weatherlink.github.io/weatherlink-live-local-api/

を見てください。

私の場合は Davis 社のサーバーにデータを送る必要がないのですが、 接続しないことにはネトワークで使える状態になりません。 しかも、無料で使える BASIC 契約だと、 絶えず『有料契約への移行』を促される仕組みになっていて、 subscription service を強制する仕組みは肌に合わず、使う気がなくなりました。

WeatherLink Live から wdi.weatherlink.com へのデータの upload を止めるには 宛先 port 5621 の TCP パケットを止めるしかなさそうです。 (注7)

3. サンプルプログラム

IP 接続、USB 接続、RS232 接続に使える Serial Communication Protocol を使うプログラム例を付けておきます。

FreeBSD-12.1 と Linux 4.15.0 でのみ確認してあります。

サンプルプログラム

注1 - Vantage Vue 内蔵リチウム電池

内蔵リチウム電池には CR123A が使われていて、 東京都世田谷区での使用実績としては 5 年近く持ちました。 本体の底の蓋を開いて交換する仕組みですから、 人が容易に近づける場所に設置する必要があって、 正確な風速や風向を知りたい場合は有線接続の Vantage Pro2 のほうが良いと思います。

注2 - 小電力無線

電波を利用する無線機器は原則として免許申請が必要ですが、 特定小電力無線機の場合は免許不要です。 ただ、この条件が国によって異なり、 アメリカの製品は日本では使えません。 残念なことに、日本の特定小電力無線機はアメリカの半分程度しか到達距離がないため、 広い農業用地等では使えません。

注3 - 6510 SER, 6510 USB の通信条件

通信条件は 19200 bps, 8 bit, 1 stop, no parity になっています。 接続後に baud コマンドで、 1200, 2400, 4800, 9600, 14400, 19200 bps に変更できますが、 このコマンドを必要とする状況はないと思います。

注4 - Linux での 6510 USB

Linux では /dev/ttyUSB0 などと認識されます。

注5 - WeatherLink Live App

Davis Instruments 社は Android 用を Gogle Play、Apple 用を Apple App Sore で WeatherLink という名称で公開しています。 wdi.weatherlink.com は WeatherLink Live のデータ収集専用のサーバーで、 収集したデータの公開は https://www.weaherlink.com/ で行われます。

注6 - JSON 形式のデータ処理例

curl (Client for URLs) は Unix で多用されるコマンドで、 URL (Uniform Resource Locator) で指定できるインターネット上のリソースのダウンロードや アップロードに使います。

awk は Unix の古いコマンドの一つですが、 c 言語のサブセットに正規表現を中心とした文字列処理を組み込んだスクリプト言語で、 事務処理やデータ処理に気軽に使える非常に優れた言語設計です。

JSON (JavaScript Object Notation) はデータ交換フォーマットの一つで、 データ構造を

  オブジェクト - 名前:値
  リスト       - 順序付きの文字列
と '{', ':', ',', ' ', .. などの演算子の組合せで表現したもので、 c, c++, Java, JavaScript, Perl, Python などのプログラムによる 簡単な構文解析で解釈できるように設計されています。

curl と awk の組合せなら、例えば

#! /bin/sh
# Davis WeatherLink Live
curl -s http://192.168.2.31:80/v1/current_conditions 2>/dev/null |
/usr/bin/awk '
{
  s = $0
  if (index(s, "{\"data\":{") != 1)
        error("input data error", s)
  print "data:"
  s = substr(s, 10, length(s) - 10)
  k = index(s, ",")
  print " ", substr(s, 1, k - 1)
  s =  substr(s, k + 1)
  k = index(s, ",")
  print " ", substr(s, 1, k - 1)
  s =  substr(s, k + 1)
  k = index(s, "}]},")
  e = substr(s, k + 4)
  s = substr(s, 1, k + 1)
  if (index(s, "\"conditions\":[") != 1)
        error("input data error", s)
  s = substr(s, 16)
  s = substr(s, 1, length(s) - 2)	# /}]}$/
  print " ", "conditions:"
  k1 = split(s, a, "},{")
  for (i = 1; i <= k1; i++) {
    print " ", i ":"
    k2 = split(a[i], b, ",")
    for (j = 1; j <= k2; j++)
        print "   ", b[j]
  }
  print e
}
function error(s, t) {
  print s ":", t >"/dev/stderr"
  print s ":", t >"/dev/stderr"
  exit 1
}
'
これは WeatherLink Live 固有のデータ構造に対処するだけですが、 本格的に JSON の解析を awk で行ったのが https://github.com/step-/JSON.awk です。

python なら、例えば

#! /bin/sh
# Davis WeatherLink Live
python -c '
import json, sys, urllib.request
response = urllib.request.urlopen("http://192.168.3.237:80/v1/current_conditions
html = response.read()
record = json.loads(html.decode())
print("data:")
data = record["data"]
print(" did:", data["did"])
print(" ts :", data["ts"])
print(" conditions:")
conditions = data["conditions"]
for i in range(len(conditions)):
  print(" ", i, ":")
  json_str = json.dumps(conditions[i])
  item = list(json.loads(json_str).items())
  for j in range(len(item)):
    print("   ", item[j])
print(" error:", record["error"])
'
ruby なら、例えば
#!/usr/bin/env ruby
require 'net/http'
require 'json'
url = URI.parse("http://192.168.3.237:80/v1/current_conditions")
https = Net::HTTP.new(url.host, url.port)
req = Net::HTTP::Get.new(url.path)
res = https.request(req)
hash = JSON.parse(res.body)
json_str = JSON.pretty_generate(hash)
puts json_str

注7 - WeatherLink Live の wdi.weatherlink.com への自動 upload 停止法

Davis 社の他の製品と違って、 WeatherLink Live には自動 upload を止める手段がありません。

Wireshark などで調べて見ると、 WeatherLink Live は Davis server の IP address を DNS で調べ、 その port 5621 への TCP 接続で、Davis server に測定データを自動送信しますから、 Davis server への接続を止める最も簡単な方法は、 port 5621 宛パケットをルーターで止めることです。

例えば、YAMAHA ルーターなら

  ip filter 1008 reject * * tcp * 5621
を LAN port への入力フィルタとして設定すれば、 WeatherLink Live が DHCP でも IP address 固定でも upload を止めることができます。

平林 浩一, 2022-02