SwitchBot温湿度計から取得した値を使って絶対湿度を出力
SwitchBot温湿度計の値をRaspberryPiで取得する方法は以前の記事(「RaspberryPiで室温の計測(SwitchBot 温湿度計)」)を見ていただくとして、今回は新型コロナウィルス対策で話題の「絶対湿度」を計算して出力してみたいと思います。
SwitchBot 温湿度計
気温と相対湿度と絶対湿度
温湿度計などに表示される湿度は、「相対湿度」を表しています。これは、空気中には気温ごとに水蒸気を含むことが出来る量の限界(飽和水蒸気量)が決まっているのですが、その限界(飽和水蒸気量)に対して、実際の水蒸気が何%含まれているかを示すものです。
飽和水蒸気量は、温度が高くなれば大きくなり、温度が低くなれば小さくなります。そのため、「相対湿度」が同じ50%でも、気温が30度の場合と15度の場合では、含まれる水蒸気量は異なります。湿度が同じくらいでも気温の低い冬の方が乾燥していると感じるのはこのせいですね。
一方、 「絶対湿度」とは、縦横高さ1メートルの空間に含まれる水蒸気の重さが何グラムかを示すものになります。
絶対湿度とインフルエンザの流行の相関について
宮城県医師会のホームページ(Excelによるインフルエンザ流行予測)に、「気象とインフルエンザの流行との相関関係を長年調べた結果、日本では絶対湿度(1立方メーターの空気中の水蒸気の量)が11g以下でインフルエンザが始まることがわかった」とあります。また、7g/㎥以下になるとさらに流行が起こりやすくなるそうです。
SwitchBot温湿度計の温度と相対湿度から絶対湿度を算出
前回の記事では、温度と相対湿度、バッテリー情報を取得するPythonスクリプトを作成しました。これで得られる湿度は、相対湿度なので、温度と相対湿度を元に絶対湿度を算出します。
絶対温度(abshumid)は、SwitchBot温湿度計より得られた温度(temp)と湿度(humid)より、以下の式で近似値を計算することができます。
#絶対湿度の計算 abshumid = round(217 * 6.1078 * pow(10, 7.5*temp/(temp+237.3)) / (temp + 273.15) * humid / 100, 1)
前回のソースコードに絶対湿度の出力を加えて完成です。
#!/usr/bin/python3
import struct
import sys
from bluepy.btle import Scanner, DefaultDelegate
args = sys.argv
# macアドレスは小文字にする
macaddr = str.lower(args[1])
#Broadcastデータ取得用デリゲート
#class SwitchbotScanDelegate(btle.DefaultDelegate):
class SwitchbotScanDelegate(DefaultDelegate):
#コンストラクタ
def __init__(self, macaddr):
#btle.DefaultDelegate.__init__(self)
DefaultDelegate.__init__(self)
#センサデータ保持用変数
self.sensorValue = None
self.macaddr = macaddr
# スキャンハンドラー
def handleDiscovery(self, dev, isNewDev, isNewData):
# 対象Macアドレスのデバイスが見つかったら
if dev.addr == self.macaddr:
# アドバタイズデータを取り出し
for (adtype, desc, value) in dev.getScanData():
#環境センサのとき、データ取り出しを実行
if desc == '16b Service Data':
#センサデータ取り出し
self._decodeSensorData(value)
# センサデータを取り出してdict形式に変換
def _decodeSensorData(self, valueStr):
#文字列からセンサデータ(4文字目以降)のみ取り出し、バイナリに変換
valueBinary = bytes.fromhex(valueStr[4:])
#バイナリ形式のセンサデータを数値に変換
batt = valueBinary[2] & 0b01111111
isTemperatureAboveFreezing = valueBinary[4] & 0b10000000
temp = ( valueBinary[3] & 0b00001111 ) / 10 + ( valueBinary[4] & 0b01111111 )
if not isTemperatureAboveFreezing:
temp = -temp
humid = valueBinary[5] & 0b01111111
#絶対湿度の計算
abshumid = round(217 * 6.1078 * pow(10, 7.5*temp/(temp+237.3)) / (temp + 273.15) * humid / 100, 1)
#dict型に格納
self.sensorValue = {
'SensorType': 'SwitchBot',
'MacAddr': self.macaddr,
'Temperature': temp,
'Humidity': humid,
'AbsHumidity': abshumid,
'Battery': batt
}
# macaddr指定した温湿度センサの値を取得
scanner = Scanner().withDelegate( SwitchbotScanDelegate(macaddr) )
#スキャン(timeout=5s)
scanner.scan( 5.0 )
#出力
print('MacAddr = ' + scanner.delegate.sensorValue['MacAddr'])
print('Tempreture = ' + str( scanner.delegate.sensorValue['Temperature']) )
print('Humidity = ' + str( scanner.delegate.sensorValue['Humidity']) )
print('AbsHumidity = ' + str( scanner.delegate.sensorValue['AbsHumidity']) )
print('Battery = ' + str( scanner.delegate.sensorValue['Battery']) )

