導入
Raspberry PiでAM2302という温湿度センサを、Adafruit_DHTというパッケージを使用し、Pythonで扱うことを試みるとエラーが生じた。
インストール時のエラーは簡単な操作を行うことによって回避できるが、実際に温度・湿度を取得する際に生じるエラーまでは回避できなかったため、そのエラーまで回避することを行った。
コンピュータはRaspberry Pi 4B/4GB, OSはRaspbian lite, Ubuntu Server20.04の両方でエラーが生じたのを確認し、Pythonはpyenvから3.8.5をインストールし、Pipenvを使用。
遭遇したエラー
まずは素直にpipenvからインストールを行おうとする。
$ pipenv install Adafruit_DHT
Installing Adafruit_DHT…
Error: An error occurred while installing Adafruit_DHT!
Error text: Collecting adafruit_dht
Downloading Adafruit_DHT-1.4.0.tar.gz (15 kB)
Building wheels for collected packages: adafruit-dht
Building wheel for adafruit-dht (setup.py): started
Building wheel for adafruit-dht (setup.py): finished with status 'error'
Running setup.py clean for adafruit-dht
Failed to build adafruit-dht
Installing collected packages: adafruit-dht
Running setup.py install for adafruit-dht: started
Running setup.py install for adafruit-dht: finished with status 'error'
---
中略
---
✘ Installation Failed
インストールが失敗したことを確認できた。
次に、パッケージをGitHubから落とし、使用している機器がRaspberry Piである事を表すパラメータを加えて手動でインストールを行う。
$ git clone https://github.com/adafruit/Adafruit_Python_DHT.git
$ cd Adafruit_Python_DHT
$ python setup.py install --force-pi
Finished processing dependencies for Adafruit-DHT==1.4.0
インストールが完了したことを確認したので、実際に温度の取得を行ってみる。
$python
>>> import Adafruit_DHT
>>> Adafruit_DHT.read_retry(Adafruit_DHT.AM2302, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/pi/Projects/temp/Adafruit_Python_DHT/Adafruit_DHT/common.py", line 94, in read_retry
humidity, temperature = read(sensor, pin, platform)
File "/home/pi/Projects/temp/Adafruit_Python_DHT/Adafruit_DHT/common.py", line 80, in read
platform = get_platform()
File "/home/pi/Projects/temp/Adafruit_Python_DHT/Adafruit_DHT/common.py", line 63, in get_platform
raise RuntimeError('Unknown platform.')
RuntimeError: Unknown platform.
となる。
解決法
Python3.8.5の使用を辞め、Python3.7.9を使用する。
解説
Adafruit_DHTでは、パッケージが使用されているプラットフォームの検出にPythonの標準ライブラリであるplatformから情報を得ている。
ここで得られたプラットホームの固有情報に('armv7l-with-debian', 'armv7l-with-ubuntu', 'armv7l-with-glibc2.4', 'armv7l-with-arch')のいずれかが含まれていれば動作する。
このとき、Python3.8.5とPython3.7.9の出力が異なっていることがエラーの原因となっていた。
下は実際にRaspbian lite上でplatformの情報をそれぞれのPythonのバージョンから確認したものである。
Python3.8.5
>>> import platform
>>> platforfm.platform()
'Linux-5.4.51-v7l+-armv7l-with-glibc2.28'
Python3.7.9
>>> import platform
>>> platforfm.platform()
'Linux-5.4.51-v7l+-armv7l-with-debian-10.4'
余談
そもそも上記のもので検出を狙っているのはBeaglebone Blackという機器であり、Raspberry Piは別の場所で検出を狙っている。しかしRaspberry Pi 4B上で/proc/cpuinfoに記載されているHardwareの項目はBCM2711で、このプログラムからは検出されない。
追記
そもそもAdafruit_Python_DHTのリポジトリは現在アーカイブされており、メンテナンスされていないものでした。
その代わり、Adafruit_CircuitPython_DHTのリポジトリがあるのでこちらを利用してださいとの事です。
こちらの方なら、Python3.8.5でも問題なくインストールできました。
ただ、利用する際はRPi.GPIOというパッケージもインストールしないとインポートできない点に注意が必要です。
利用する際は下のコマンドで、Adafruit_CircuitPython_DHTとRPi.GPIOをインストールしてください。
$ pip install adafruit-circuitpython-dht RPi.GPIO
下はRPI.GPIOをインストールしていない環境でadafruit-circuitpython-dhtをインポートしようとした場合。
>>> import adafruit_dht
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/pi/temp/.venv/lib/python3.8/site-packages/adafruit_dht.py", line 34, in <module>
from digitalio import DigitalInOut, Pull, Direction
File "/home/pi/temp/.venv/lib/python3.8/site-packages/digitalio.py", line 15, in <module>
from adafruit_blinka.microcontroller.bcm283x.pin import Pin
File "/home/pi/temp/.venv/lib/python3.8/site-packages/adafruit_blinka/microcontroller/bcm283x/pin.py", line 2, in <module>
import RPi.GPIO as GPIO
ModuleNotFoundError: No module named 'RPi'