ラズパイで温度監視
諸事情で部屋の温度監視が必要になったのでラズパイで作ってみた。以前から興味はあったけど用途が思いつかなかったのでこれ幸いと初挑戦。
買ったもの
Raspberry Pi Zero WH(スターターキット)
USB電源(ラズパイ3対応のスイッチ付き 5V 2.5A)
microSD(32GB Class10)
DHT11温度センサーモジュール
全部で約5,400円。
初期設定
PC(Win10)にてmicroSDをフォーマット後、ダウンロードしたraspbian Stretch LiteをEtcherで焼き焼き。ヘッドレスセットアップするのでbootパーティションと思しきところに中身空の「ssh」というファイルを作成。wpa_supplicant.confファイルも作成してWiFiの接続情報を記入。詳細はググってください。
ラズパイにmicroSDをセットして起動し、PCからraspberrypi.local宛でssh接続まで確認。pi/raspberryでログインできる。(bonjourはじめて知った)
プロキシ環境下なので環境変数を.bash_profileにセット。
$ vi ~/.bash_profile
export HTTP_PROXY=http://xxxx:nn
export HTTPS_PROXY=https://xxxx:nn
export FTP_PROXY=ftp://xxxx:nn
再ログインして色々更新しておく。
$ sudo apt-get update
$ sudo apt-get upgrade
ローカライゼーション関係を設定。
$ sudo raspi-config
日時合わせの設定。参照するNTPサーバーを設定する。
$ vi /etc/systemd/timesyncd.conf
一応パスワード変えておく。
$ passwd
作るもの
温湿度センサーDHT11からpythonでデータを読み込んで、1時間毎にMicrosoft Teamsに投稿する。
$ sudo apt-get install git
$ sudo apt-get install python3-pip
$ vi .gitconfig
[http]
proxy = http://xxxx:nn
[https]
proxy = https://xxxx:nn
[url "https://"]
insteadOf = git://
$ git clone https://github.com/szazo/DHT11_Python.git
$ sudo pip install rpi.gpio --proxy=xxxx:nn
配線
DHT11は基盤付きの3本足。+を3.3V、outをGPIO17、-をGNDに接続。
テスト
ライブラリ付属のサンプルを、GPIOのところだけ修正して実行してみる。
$ cd ~/DHT11_Python
$ vi dht11_example.py
(GPIOの番号を修正)
$ python3 dht11_example.py
サンプルは1秒毎に測定結果を表示するものだが、はじめの1回しか表示されない。あとは何分待ってもずっとエラー・・・
$ python dht11_example.py
毎秒とはいかないが、5秒に1回ぐらいは表示される。python3系だと上手くいかないらしい。2系でもエラー多すぎだが。原因はよくわからん・・・とりあえず、2系で続きをやる。
Microsoft Teamsに投稿
Teamsにチャンネル作って、コネクタからIncoming Webhookをセットアップ。URLを控えておく。
$ sudo pip install requests --proxy=xxxx:nn
投稿のサンプルはコレ。
# -*- coding: utf-8 -*-
import requests, jsonWEB_HOOK_URL = "https://outlook.office.com/webhook/xxxx"
requests.post(WEB_HOOK_URL, data = json.dumps({
'text': u'通知内容',
}))
$ python test.py
requestsがないと怒られる。pipがpython3系だったのが原因だった。get-pip.pyなるもので取ってこれるらしいので、curlで取ってくる。の前に準備。
$ vi ~/.curlrc
proxy="http://xxxx:nn"
$ curl -O https://bootstrap.pypa.io/2.6/get-pip.py
$ sudo python get-pip.py$ sudo pip install requests --proxy=xxxx:nn
これで投稿できるようになった。
仕上げ
DHT11のサンプルとTeams投稿サンプルを組み合わせてスクリプトを作成。常駐ではなくcronで1時間毎に起動する。
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import dht11
import time
import datetime
import requests
import json# Teams webhook url
WEB_HOOK_URL = "https://outlook.office.com/webhook/xxxx"# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()# read data using pin 14
#instance = dht11.DHT11(pin=14)
instance = dht11.DHT11(pin=17)counter = 0
while True:
counter += 1
result = instance.read()
if result.is_valid():
requests.post(WEB_HOOK_URL, data = json.dumps({
'text': u'室温 %d C' % result.temperature,
}))
break
else:
if counter > 20:
requests.post(WEB_HOOK_URL, data = json.dumps({
'text': 'failed.',
}))
breaktime.sleep(2)
GPIO.cleanup()
このままcronで起動しても環境変数読み込まないのでプロキシ超えられない。bashでラップする。(-lオプション)
$ vi tempmonitor.sh
#! /bin/bash -l
python /home/pi/tempmonitor/tempmonitor.py
$ chmod +x /home/pi/tempmonitor/tempmonitor.sh
$ crontab -e
0 * * * * /home/pi/tempmonitor/tempmonitor.sh
感想
安定稼働したら指定温度以上になったときだけ投稿するように修正する予定。