ラズパイ4でInfluxdbを運用して2年弱、重くてたびたびフリーズして電源を切・入して無理やり再起動していましたが、とうとううまく起動しなくなりました。
なので、心機一転 新たにRaspberry Pi OSを導入して、今度はラズパイ4をメインの母艦にせずに処理速度が速いJetson nanoを母艦にしていきます。(一番下で以前のラズパイ4が壊れた様子を書きました。)
Raspberry Pi OS 新規インストール
ラズパイ4にInfluxDBを導入しないのでOSをクリーンインストールする。


Windowsにイメージをダウンロードして、exeを起動するとMicroSDカードとOSを選ぶ画面に。
オススメの最新Raspberry Pi OSを選んでフォーマットしたMicroSDカードを選んで書き込む。

書き込みが完了したらラズパイ4に挿して起動(初期時ちょっと時間がかかる)して言語とWifiを設定可能。
ネットには接続してるけどapt-getでエラー?
『ホスト raspberrypi の名前解決ができません:ホスト名にアドレスが割り当てられていません』とでる。
sudo vi /etc/hosts
127.0.0.0 Raspi4B
sudo vi /etc/hostname
Raspi4B
sudo reboot
上記のようにhots,hostnamを Raspi4B に共通して合わせて再起動したら治った。
SSHを有効にする
左上 > 設定 > Raspberry Piの設定で以下のようなウィンドウが開き、インターフェイス タブを選択して、SSHを有効にする。

OKボタンを押すと再起動せずにSSHが有効になった。
アップデート・アップグレード
sudo apt-get update && sudo apt-get upgrade -y
PythonのInfluxDBクライアント
pipない場合はまずはpipをインストールする。Jetson nanoは入っていたような?
sudo apt install python-pip
Jetson nanoのInfluxdbにPythonスクリプトから投げるときに必要です。
sudo pip install influxdb
下準備ができたのでそれぞれのセンサーの設定をしていきましょう。
Xiaomi 温湿度計ハック
BluetoothでXiaomiのアプリ Mi Homeと接続するタイプのの温湿度計をハックして、ラズパイでBluetoothで接続してセンシングしたデータをもらいます。
bluepy 導入
こんなエラーになった。
$ sudo pip install bluepy
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting bluepy
Using cached https://files.pythonhosted.org/packages/27/91/6cfca10bee9862f93015413cf9e6a52c3081a71f1518963396a055128f8e/bluepy-1.3.0.tar.gz
Building wheels for collected packages: bluepy
Running setup.py bdist_wheel for bluepy ... error
・・・以下省略・・・
libglib2.0-dev が足りなかったみたい。
$ sudo apt-get install python3-pip libglib2.0-dev -y
$ sudo pip install bluepy
これで bluepy インストールできた。
Pythonスクリプト
うちはベランダとリビングにXiaomi温湿度計を置いています。
$ sudo hcitool lescan
hcitoolでスキャンしてXiaomi温湿度計のBT MACアドレスを取得しました。
たしか?MACアドレスの最初の 4C:65:A8 あたりがXiaomiの製品だったような?うろ覚え・・・・
#!/usr/bin/env python2
import binascii
import base64
import requests
from bluepy.btle import UUID, Peripheral, ADDR_TYPE_PUBLIC, DefaultDelegate
from influxdb import InfluxDBClient
client = InfluxDBClient(host='192.168.31.53', port=8086, username='ユーザ名', password='パスワード', database='sensor')
measurement = 'air5'
one = {'place': 'Veranda','host': 'Mi_disp1'}
two = {'place': 'Living','host': 'Mi_disp2'}
# Xiaom key is MAC of BT sensor, value is sensor ID
sensor_dict = {}
sensor_dict["4C:65:A8:D0:8E:1C"] = 1
sensor_dict["4C:65:A8:DB:4E:75"] = 2
# constants for polling sensor; do not change!
BATTERY_HANDLE = 0x0018
TEMP_HUM_WRITE_HANDLE = 0x0010
TEMP_HUM_READ_HANDLE = 0x000E
TEMP_HUM_WRITE_VALUE = bytearray([0x01, 0x10])
battery_level = -1
sensor_id = -1
class TempHumDelegate(DefaultDelegate):
def __init__(self):
DefaultDelegate.__init__(self)
def handleNotification(self, cHandle, data):
if (cHandle == TEMP_HUM_READ_HANDLE):
data = data.rstrip(' \t\r\n\0')
#print(data)
temperature = data.split(" ")[0][2:]
humidity = data.split(" ")[1][2:]
comfort_type = get_comfort_type(humidity)
wvp = 6.1078*10**((7.5*float(temperature)/(float(temperature)+237.3)))
ssa = 217*wvp/(float(temperature)+273.15)
hd = (100-float(humidity))*ssa/100
print hd
#if (battery_level > -1):
if (sensor_id != -1 and battery_level > -1):
if (sensor_id == 1):
tags=one
elif (sensor_id == 2):
tags=two
json_body = [
{
'measurement': measurement,
'tags': tags,
'fields': {'housa': hd , 'temp': float(temperature) , 'humi': float(humidity) , 'battery': float(str(battery_level))}
}
]
client.write_points(json_body)
print(json_body)
#print sensor_id
def get_comfort_type(humidity):
comfort_type = "0"
if float(humidity) < 40:
comfort_type = "2"
elif float(humidity) <= 70:
comfort_type = "1"
elif float(humidity) > 70:
comfort_type = "3"
return comfort_type
def get_battery_value():
battery_value = 0;
try:
battery_value = p.readCharacteristic(BATTERY_HANDLE)
finally:
return int(binascii.b2a_hex(battery_value), 16)
def handle_temp_hum_value():
p.writeCharacteristic(TEMP_HUM_WRITE_HANDLE, TEMP_HUM_WRITE_VALUE)
while True:
if p.waitForNotifications(1.0):
break
for key, value in sensor_dict.iteritems():
try:
sensor_id = value
p = Peripheral(key)
p.withDelegate(TempHumDelegate())
battery_level = get_battery_value()
#print battery_level
handle_temp_hum_value()
p.disconnect()
except:
pass
実行しても取得できない時が多い。適当すぎる作りのPythonスクリプトがダメなのかも・・・
cron
最後に定期的に取得するためにCron設定
4-58/3 * * * * /usr/bin/python /home/pi/script/mi.py
WxBeacon2 設定
WxBeacon2 で温度・湿度・気圧・照度・騒音・紫外線・不快指数・熱中症危険度の情報をJetson nanoのInfluxDBに送って自宅の環境をグラフ化します。
python-bluez 導入
BluetoothをWxBeacon2で使う。
sudo apt-get install python-bluez
Jetson nanoではBluetoothが無いので、古いBluetoothドングルでも使えるかと思ったけど、無理でした。なのでラズパイ4のBluetoothでWxBeacon2のセンシングデータを取得してJetson nanoのInfluxDBに投げる。
hcitoolでテスト
Jetson nanoではうまくいかなかったけど、Raspberry Pi4は最初からBluetoothがあるのが便利♪
$ sudo hcitool lescan
LE Scan ...
BE:FF:50:00:38:03 ELK-BLEDOM
31:88:43:84:2F:83 (unknown)
BE:FF:50:00:38:03 (unknown)
CC:B0:D0:D2:F5:83 (unknown)
CC:B0:D0:D2:F5:83 (unknown)
DE:A5:17:19:24:31 (unknown)
FB:E7:85:97:29:D7 Hi-P1001-12AW400D7
CB:C0:08:B7:0F:57 (unknown)
CB:C0:08:B7:0F:57 Mi Smart Band 5
F8:A8:82:C6:33:97 IM
F8:A8:82:C6:33:97 (unknown)
EF:FC:25:C5:D2:4A (unknown)
EF:FC:25:C5:D2:4A (unknown)
43:EC:B9:15:04:10 (unknown)
43:EC:B9:15:04:10 (unknown)
C4:F1:D0:9E:2A:26 (unknown)
C4:F1:D0:9E:2A:26 (unknown)
4C:65:A8:D0:8E:1C (unknown)
以前作ったPythonスクリプトを流用
以下で詳しく説明しました。

バックアップからスクリプトファイル郡のomronディレクトリをJetson nanoの/home/ユーザー名/script/omronにコピーして作業する。
cp -r /media/pi/73a0c708-506d-4803-8438-845d18349ee8/pi/script/omron /home/pi/script/
スキャンしてみる
うまくいった。
$ sudo python /home/pi/script/omron/envsensor_observer.py
cron
最後にCronで定期的にデータを取得していきます。デーモンが残ってしまうので定期的にpkillも実行する。
@reboot sleep 50; /usr/bin/python /home/pi/script/omron/envsensor_observer.py
*/3 * * * * pkill -f envsensor_observer.py
3-58/10 * * * * /usr/bin/python /home/pi/script/omron/envsensor_observer.py
完成 Grafanaでグラフ表示
WxBeacon2は多くの環境センサーがあるのでデータを集めてグラフ化するのが楽しい。

Raspberry Pi vcgencmdでCPU温度・電圧などを計測してInfluxDBに保存
vcgencmdの使い方(英語)
vcgencmdの使い方はこちらに詳細が書いてあります。
CPU温度取得
$ cat /sys/class/thermal/thermal_zone0/temp 48312 $ vcgencmd measure_temp temp=47.8'C
やばい、CPU温度高くて落ちるみたい。
$ python script/raspi.py 70.4'C #CPU温度 1200126000 #CPU周波数 1.2375V #電圧 896M #CPUメモリ使用量 128M #GPUメモリ使用量
温度が上がって落ちる原因
原因はPM2.5のセンサーだった。なぜかCronがたまって温度があがる。
PM2.5センサーの実行スクリプトをCronから外したら温度があがらなくなった。
PM2.5センサーがラズパイから外れていたり、ちゃんとハマってない場合はPythonが溜まってメモリ使いすぎで落ちる。
PythonでInfluxDBにセンシングデータを送る
スクリプトは以下の方のを参考にInfluxDBにインサートするように改造させていただきました。ありがとうございますm(_ _)m

#!/usr/bin/python # -*- coding: utf-8 -*- import time import subprocess import sys from influxdb import InfluxDBClient client = InfluxDBClient(host='192.168.31.53', port=8086, username='root', password='パスワード', database='sensor') measurement = 'cpu' tags = {'host': 'Raspi4B'} def GetTmp(Cmd): result = subprocess.Popen(Cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) Rstdout ,Rstderr = result.communicate() return Rstdout def GetCpuFreq():#arm Cmd = 'vcgencmd measure_clock arm' CpuFreq = GetTmp(Cmd).split('=') return int(CpuFreq[1]) def GetCpuTemp():#cpu temp Cmd = 'vcgencmd measure_temp' CpuTemp = GetTmp(Cmd).split() CpuTemp_zero=CpuTemp[0].replace("temp=",'').replace("'C",'') return CpuTemp_zero def GetCpuVolts():#cpu V Cmd = 'vcgencmd measure_volts' CpuVolts = GetTmp(Cmd).split('=') CpuVoltsone =CpuVolts[1].replace("V\n",'') return CpuVoltsone def GetVoltsThro():#電圧の状態 Cmd = 'vcgencmd get_throttled' VoltsThro = GetTmp(Cmd).split('=') VT = VoltsThro[1].replace("\n",'') throarr = {'0xd0000':0,'0x0':1, '0x50000':2, '0x50005':3, '0x80000':4, '0x80008':5} #0:0xd0000 ???? #1:0x0 正常 #2:0x50000 過去に低電圧状態になった。今は正常 #3:0x50005 低電圧! #4:0x80000 熱でクロックダウン #5:0x80008 今現在熱でクロックダウン if VT in throarr: val = throarr[VT] return val if __name__=='__main__': CpuTemp = GetCpuTemp() CpuVolts = GetCpuVolts() VoltsThro = GetVoltsThro() #print CpuVolts CpuFreq = int(GetCpuFreq()/1000000) FieldArr = {'arm': float(CpuFreq) , 'cpu_temp': float(CpuTemp) , 'cpu_volt': float(CpuVolts)} if VoltsThro is not None: FieldArr['throttled'] = VoltsThro json_body = [ { 'measurement': measurement, 'tags': tags, 'fields': FieldArr } ] print(json_body) client.write_points(json_body)
Cronで定期的に実行
4-58/5 * * * * /usr/bin/python /home/pi/script/cpu.py
完成
vcgencmdコマンドを使ってJetson nanoのInfluxDBにラズパイのCPU温度などのデータを投げてGrafanaでグラフにしたのが以下の図、ラズパイ3が2台、ラズパイ4が1台のグラフを表示できました。

bh1750で照度計測
bh1750センサは↓こういった安いものです。
GPIOピン
bh1750 | ラズパイ |
VCC | 3.3V |
GND | GND |
SCL | GPIO3 |
SDA | GPIO2 |
ADDR | なし |
SPI/I2Cを有効にする設定
以下のように raspi-config でSPIとI2Cを有効にします。
$ sudo raspi-config
Interfacing Options > SPI > enabled
Interfacing Options > I2C > enabled
snd-bcm2835を追加
$ sudo vim /etc/modules
snd-bcm2835 ←追加
i2c-dev
ツールインストール
$ sudo sudo apt-get install libi2c-dev
$ sudo apt-get install git-core
もろもろ設定・インストール
$ sudo vim /etc/ld.so.conf include /etc/ld.so.conf.d/*.conf /usr/local/lib ←追加 $ sudo ldconfig $ sudo apt-get install bc
i2cdetectで認識されているか確認
23が出れば認識されてる。
$ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- 23 -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
bh1750で照度取得テスト
#!/bin/bash sudo i2cset -y 1 0x23 0x01 c sleep 1 sudo i2cset -y 1 0x23 0x20 c sleep 1 TMP=$(sudo i2cget -y 1 0x23 0x00 w) MSB="0x$(echo $TMP | cut -c 5-6)" LSB="0x$(echo $TMP | cut -c 3-4)" IL=$(((MSB<<8)|LSB)) printf "Illuminance: %.2f lx\n" $(echo "scale=2;$IL / 1.2" | bc) exit 0
正常のようです。
$ ./bh1750.sh Illuminance: 410.00 lx
python bh1750.py
$ sudo pip install smbus
適当に作った。
# encoding: utf-8 import smbus from influxdb import InfluxDBClient client = InfluxDBClient(host='192.168.31.53', port=8086, username='root', password='パスワード', database='sensor') measurement = 'air' tags = {'place': 'raspi-lx','host': 'Raspi4B'} bus = smbus.SMBus(1) addr = 0x23 lux = bus.read_i2c_block_data(addr,0x10) if __name__ == '__main__': value = str(round((lux[0]*256+lux[1])/1.2,3)) if value is not None: #print value json_body = [ { 'measurement': measurement, 'tags': tags, 'fields': {'lux': float(value)} } ] client.write_points(json_body) print(json_body) else: print "None"
Cron
2-57/7 * * * * /usr/bin/python /home/pi/script/bh1750.py
ラズパイ4に装着したその他のセンサー・PHAT
その他のセンサー類は過去記事で書きました。
BME280温湿度・気圧センサー
こちらの通りに設定しました。
cron
3-58/8 * * * * /usr/bin/python /home/pi/script/bme280.py
お部屋のPM2.5データをInfluxdbに送る
ラズパイ4とPM2.5
PM2.5センサーはこちらを使いました。
過去にこちら↓の記事で書きました。
cron
3-58/6 * * * * /usr/bin/python /home/pi/script/pm2.5.py
ラズパイ用Pimoroni(ピモロニ)PHAT
ラズパイ4にはPHATのScroll pHAT HDとPimoroni Touch PHATを付けてる。↓以下で説明しました。
自宅センシング復活
InfluxdbをJetson nanoで運用するようになって、ラズパイ4はBluetooth接続のセンサーを取得してJetson nanoのInfluxdbに投げる役目に変更。
Jetson nanoのほうが処理能力が速いようで、もうフリーズもせずにかなり快適になりました。

ただ、ラズパイ4は新規インストールしても、デスクトップ環境の動作が鈍く、マウスが一定時間動かないときが度々、デスクトップ環境ではあまり使えなかったのかな?
以前はこんなことなかったような気がしますが。早くもっと処理速度が速いラズパイ5出て欲しい。
ラズパイ4 その他の設定など
Wifiがブツブツ切れる?
なんだかWifiがブツブツ切れて調子悪い・・・
起動時5分くらいはWifiが切れるみたい。
WifiルーターのDHCPでIP固定設定をやめてみる。様子見
省電力モードOffにしても変わらず
sudo iwconfig wlan0 power off
Wifi 5Gと4Gの両方につないだので、それぞれを定期的に?接続しているみたい。
未解決
Vim
テキストファイル編集に便利なVimを入れる。
sudo apt-get install vim
スクリーンショット
デフォルトであるスクリーンショットは[Fn]+[p]キーでスクリーンショットが撮れるがスタートメニューなどは撮れないので、別のを導入。
spectacle導入
sudo apt-get install kde-spectacle -y
インストール後は、アクセサリ > Spectacleに入っていました。


Wifiがブツブツ切れる
Raspberry Pi OSをインストールして、使っているとWifiが定期的にブツブツと切断される。
電波が悪いと思ってWifi中継機に接続してもブツブツ途切れる。
Power Management:on になっている 未解決
以下のようにwlan0のPower Managementがオンになっているので、オフにする。
$ iwconfig wlan0
wlan0 IEEE 802.11 ESSID:"Xiaomi_wifi_5G"
Mode:Managed Frequency:5.18 GHz Access Point: 88:C3:97:C1:1D:73
Bit Rate=234 Mb/s Tx-Power=31 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:on
Link Quality=67/70 Signal level=-43 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
これはWifiを使わない間は省電力でWifiを切断するというものらしいのでオフにする。
sudo iwconfig wlan0 power off
オフにしたが??、そもそもがネットにアクセスしている時にも切断されるので意味はないみたい。
ディスプレイの解像度を下げる
こちらのサイトにラズパイ4は2560x1440にするとWifiが不安定になるとのこと。
現状は4Kディスプレイに接続していたので、フルHD1980x1080pxに下げてみる。
設定 > Screen Configuration

・・・解像度を下げてもWifiがブツブツ途切れる・・・未解決

Ping を打ち続けてれば切断されないみたい
ラズパイ3から以下のようにPingを打ち続けると切断されない。かな?
$ ping 192.168.31.111
PING 192.168.31.111 (192.168.31.111) 56(84) bytes of data.
Wifi 5Gでなくて2.4GHzに接続したほうが切断されにくいのかもれない。

5Gをやめて2.4GHzにしたら切断されにくくなったか、切断されなくなったみたいなので、しばらく様子をみます。
以下、ラズパイ4が壊れた様子。メモです。
ラズパイ4が壊れた!
アップデートして再起動したらラズパイが起動しなくなった。
bootフォルダの中身コピー
無理やり再起動を繰り返したのでbootフォルダの中身が消えたみたい。
こちらをダウンロードしてbootの中身をbootフォルダにコピーして起動する。
Failed to start load kernel modules
bootをコピーして起動したら最初のデーモンのメッセージまで行ったけど途中で止まって正常に起動しない。

ポータブルSSDさしたらなぜかちゃんと起動したが重くて調子が悪い。
うまくいかないので1年前のバックアップから復旧
まずはアップデート・アップグレードするが・・・
$ sudo apt-get update && sudo apt-get upgrade -y
以下のようになる。
E: Repository 'http://raspbian.raspberrypi.org/raspbian buster InRelease' changed its 'Suite' value from 'stable' to 'oldstable'
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
システムアップグレード・アップデート
以下を実行する。
$ sudo apt update --allow-releaseinfo-change
その後、再度アップデートする
$ sudo apt-get update && sudo apt-get upgrade -y
Influxdbが正常に動かないのでInfluxdbを再度インストール
ストップする。
sudo systemctl stop influxdb.service
再度上書き?インストール
sudo apt-get install influxdb
インストールしたらサービス開始。
sudo systemctl start influxdb.service
Influxdbステータス見てもうまく動いてない??
$ systemctl status influxdb.service
● influxdb.service - InfluxDB is an open-source, distributed, time series databa
Loaded: loaded (/lib/systemd/system/influxdb.service; enabled; vendor preset:
Active: activating (start) since Sat 2021-10-16 11:38:27 JST; 19s ago
Docs: https://docs.influxdata.com/influxdb/
Cntrl PID: 27033 (influxd-systemd)
Tasks: 15 (limit: 4915)
Memory: 651.5M
CGroup: /system.slice/influxdb.service
├─27033 /bin/bash -e /usr/lib/influxdb/scripts/influxd-systemd-start.
├─27034 /usr/bin/influxd -config /etc/influxdb/influxdb.conf
└─27124 sleep 1
10月 16 11:38:42 Raspi4B influxd-systemd-start.sh[27033]: ts=2021-10-16T02:38:42
10月 16 11:38:42 Raspi4B influxd-systemd-start.sh[27033]: ts=2021-10-16T02:38:42
10月 16 11:38:42 Raspi4B influxd-systemd-start.sh[27033]: InfluxDB API unavailab
10月 16 11:38:43 Raspi4B influxd-systemd-start.sh[27033]: InfluxDB API unavailab
10月 16 11:38:44 Raspi4B influxd-systemd-start.sh[27033]: ts=2021-10-16T02:38:44
10月 16 11:38:44 Raspi4B influxd-systemd-start.sh[27033]: InfluxDB API unavailab
10月 16 11:38:44 Raspi4B influxd-systemd-start.sh[27033]: ts=2021-10-16T02:38:44
10月 16 11:38:45 Raspi4B influxd-systemd-start.sh[27033]: InfluxDB API unavailab
10月 16 11:38:45 Raspi4B influxd-systemd-start.sh[27033]: ts=2021-10-16T02:38:45
10月 16 11:38:46 Raspi4B influxd-systemd-start.sh[27033]: InfluxDB API unavailab
lines 1-22/22 (END)
ダメっぽい。
Chronograf見てもエラーが目立つ

sudo chmod +x /usr/lib/influxdb/scripts/influxd-systemd-start.sh
うまく行かないだめですね。 あきらめてRaspberry Pi OS 新規インストールします。
今後、Influxdbはラズパイでは使わずJetson nanoで運用することにする。
コメント