Raspberry PiでPythonからAdafruit_DHTを使おうとしたときに遭遇したエラーについて

# 導入
Raspberry Piで[AM2302](https://akizukidenshi.com/catalog/g/gM-07002/)という温湿度センサを、Adafruit_DHTというパッケージを使用し、Pythonで扱うことを試みるとエラーが生じた。
インストール時のエラーは簡単な操作を行うことによって回避できるが、実際に温度・湿度を取得する際に生じるエラーまでは回避できなかったため、そのエラーまで回避することを行った。

コンピュータはRaspberry Pi 4B/4GB, OSはRaspbian lite, Ubuntu Server20.04の両方でエラーが生じたのを確認し、Pythonはpyenvから3.8.5をインストールし、Pipenvを使用。

# 遭遇したエラー
まずは素直にpipenvからインストールを行おうとする。

```shell
$ 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](https://github.com/adafruit/Adafruit_Python_DHT)から落とし、使用している機器がRaspberry Piである事を表すパラメータを加えて手動でインストールを行う。

```shell
$ 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
```
インストールが完了したことを確認したので、実際に温度の取得を行ってみる。

```shell
$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から情報を得ている](https://github.com/adafruit/Adafruit_Python_DHT/blob/master/Adafruit_DHT/platform_detect.py#L47)。
ここで得られたプラットホームの固有情報に\('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

```Python
>>> import platform
>>> platforfm.platform()
'Linux-5.4.51-v7l+-armv7l-with-glibc2.28'
```
Python3.7.9

```Python
>>> import platform
>>> platforfm.platform()
'Linux-5.4.51-v7l+-armv7l-with-debian-10.4'
```
## 余談
そもそも上記のもので検出を狙っているのはBeaglebone Blackという機器であり、Raspberry Piは[別の場所](https://github.com/adafruit/Adafruit_Python_DHT/blob/master/Adafruit_DHT/platform_detect.py#L40)で検出を狙っている。しかしRaspberry Pi 4B上で/proc/cpuinfoに記載されているHardwareの項目はBCM2711で、このプログラムからは検出されない。

# 追記

そもそも[Adafruit_Python_DHTのリポジトリ](https://github.com/adafruit/Adafruit_Python_DHT)は現在アーカイブされており、メンテナンスされていないものでした。
その代わり、[Adafruit_CircuitPython_DHTのリポジトリ](https://github.com/adafruit/Adafruit_CircuitPython_DHT)があるのでこちらを利用してださいとの事です。
こちらの方なら、Python3.8.5でも問題なくインストールできました。
ただ、利用する際はRPi.GPIOというパッケージもインストールしないとインポートできない点に注意が必要です。
利用する際は下のコマンドで、Adafruit_CircuitPython_DHTとRPi.GPIOをインストールしてください。

```shell
$ pip install adafruit-circuitpython-dht RPi.GPIO
```
下はRPI.GPIOをインストールしていない環境でadafruit-circuitpython-dhtをインポートしようとした場合。

```python
>>> 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'
```