[[406443]] 温室の温度、湿度、周囲光は、マイクロコントローラ、センサー、Python、MQTT を使用して継続的に追跡されます。
CircuitPythonは、マイクロコントローラボードと対話するための革新的な方法を提供します。この記事では、CircuitPythonを使用して温室内の温度、湿度、周囲光を監視し、CircuitPython MQTTクライアントを使用してその結果をMQTTプラットフォームにパブリッシュする方法を説明します。仲介者MQTT キューをサブスクライブし、複数のプログラムで情報をさらに処理できます。 このプロジェクトでは、シンプルな Python プログラムを使用して、Prometheus 形式のデータ収集エンドポイントを公開する Web サーバーを実行し、継続的な監視のために監視メトリックを Prometheus にプルします。 CircuitPythonは、Adafruitが低価格のマイクロコントローラ開発ボードで動作するように作成したオープンソースのPythonディストリビューションです。CircuitPythonは、互換性のある開発ボードと連携するためのシンプルな開発環境を提供します。開発ボードを接続するとマウントされるCIRCUITPYTHONルートドライブにcode.pyファイルを作成することで、プログラムを開始できます。CircuitPythonは開発ボードへのシリアル接続も提供しており、対話型インタープリタ(REPL)セッションもサポートしているため、Pythonコードを使用してボードとリアルタイムでやり取りできます。 Adafruitのウェブサイトでは、CircuitPythonを使い始めるのに役立つ豊富なドキュメントを提供しています。まず、「CircuitPythonへようこそ」ガイドをご覧ください。このガイドは、CircuitPythonを使って開発ボード上でコードを実行し、REPLを操作する方法を学ぶのに役立ちます。また、Adafruitが販売する多くの開発ボードやセンサーで使用できるCircuitPythonライブラリとサンプルのコレクションをインストールする方法についても説明しています。次に、「CircuitPythonの基礎」ガイドを読んで、CircuitPythonの機能についてさらに詳しく学びましょう。このガイドには、特定の互換性のある開発ボードでCircuitPythonを使用する方法に関する情報へのリンクも含まれています。最後に、他のオープンソースソフトウェアと同様に、CircuitPythonのソースコードを調べたり、リリースの問題に対処したり、貢献したりすることができます。 マイクロコントローラシステムは非常にシンプルです。このサンプルプロジェクトを完了するには、以下のものが必要です。 - Raspberry Pi 4 : マイクロコントローラー システムをプログラムするにはコンピューターが必要です。私は Raspberry Pi 4 を使用しました。
- CircuitPython 対応マイクロコントローラー: WiFi、周囲光センサー、Qwiic ケーブル入力を内蔵した Adafruit Feather S2 を使用しました。
- マイクロコントローラーのWiFi :Feather S2にはWiFiが内蔵されています。お使いのマイクロコントローラーにWiFiが内蔵されていない場合は、開発ボード用のWiFi拡張ボードが必要になります。
- センサー:Feather S2には環境光センサーが内蔵されているため、温度と湿度センサーも必要でした。Adafruit、SparkFun、Amazonなど、多くのメーカーから選択肢があります。私はAdafruitのセンサーと、Feather S2入力対応のQwiicケーブルを使用しました。ほとんどのSparkFunセンサーはAdafruitライブラリで動作しますが、Adafruit以外からセンサーを購入した場合は、CircuitPython互換のPythonライブラリを自分で探す必要があるでしょう。
- パッチコードとケーブル:ブレッドボードやはんだ付けを使わないように、AdafruitのQwiicケーブルを使用しています。SparkFunが販売しているケーブルキットにも、長さの異なるケーブルが揃っています。
センサーをコンピューターに接続する前に、マイクロコントローラーに接続します。 センサーをマイクロコントローラに接続する これで、USB ケーブルを使用してマイクロコントローラーをコンピューターに接続できます。 このガイドに従って、Raspberry Pi システムに Mosquitto MQTT メディエーターと Mosquitto クライアントをインストールできます。Raspberry Pi を長期サーバーとして使用する場合は、ネットワーク上で Raspberry Pi 4 に静的 IP アドレスを設定してください。Mosquitto メディエーターが起動したら、ユーザー名/パスワードファイルを作成し、メディエーターを使用してメッセージをパブリッシュおよびサブスクライブする際にクライアントが使用する認証情報を設定してください。 Raspberry PiでMosquittoクライアントを使用してMQTTメディエーターをテストできます。2つのターミナル(ヘッドレスシステムの場合は2つのSSHセッション)を開きます。 ターミナルに次のように入力します。 -
mosquitto_sub - h localhost - u $user - P $pass - t "mqtt/test"
このコマンドは、 mqtt/testキューに公開されたメッセージをリッスンする継続的に実行されるプロセスを開始します。 ターミナル2で以下を入力します。 -
mosquitto_pub - h localhost - u $user - P $pass - t "mqtt/test" - m hello `
このコマンドはmqtt/testキューにメッセージを公開し、ターミナル 1 の出力に表示されます。 これで、ターミナル 1 で実行されているsubコマンドを終了できます。 Mosquitto の仲介機能により、クライアントはサブスクライバーがいないキューであっても、任意のキューにメッセージをパブリッシュできます。これらのメッセージは永久に失われますが、クライアントが引き続きメッセージをパブリッシュすることを妨げるものではありません。 3 番目のターミナルを開き、次のキュー (コントローラーがメッセージを公開するキュー) をサブスクライブします。 これで、マイクロコントローラーをコーディングし、そのメトリックを Raspberry Pi 4 で実行されている MQTT 仲介者に公開する準備が整いました。 Adafruit には、CircuitPython ライブラリ コレクションを使用してマイクロコントローラーを WiFi ルーターに接続し、監視メトリックを MQTT 仲介者に公開する方法を説明する優れたドキュメントがあります。 以下のライブラリをCIRCUITPYTHON/libディレクトリにインストールしてください。これらは温室モニタリングに使用されます。これらのライブラリは、AdafruitのCircuitPythonライブラリコレクションから入手できます。 -
adafruit_bus_device : 複数の .mpy ファイルを含む Python パッケージ フォルダー (.mpy ファイルはスペースを節約するために圧縮された Python ファイルです)。 -
adafruit_requests : 単一の.mpyファイル adafruit_register : パッケージフォルダadafruit_minimqtt : パッケージフォルダadafruit_si7021 : 温度センサーと湿度センサーをサポートするために使用される単一の .mpy ファイル。
ライブラリをインストールしたら、 CIRCUITPYTHONフォルダーのcode.pyファイルに次のコードを追加します。 -
import time -
import ssl -
import socketpool -
import wifi -
import adafruit_minimqtt . adafruit_minimqtt as MQTT -
import board -
from digitalio import DigitalInOut , Direction , Pull -
from analogio import AnalogIn -
import adafruit_si7021 -
-
# Add a secrets . py to your filesystem that has a dictionary called secrets with "ssid" and -
# "password" keys with your WiFi credentials . DO NOT share that file or commit it into Git or other -
# source control . -
# pylint : disable = no - name - in - module , wrong - import - order -
try : -
from secrets import secrets -
except ImportError : -
print ( "WiFi secrets are kept in secrets.py, please add them there!" ) -
raise -
-
print ( "Connecting to %s" % secrets [ "ssid" ]) -
wifi . radio . connect ( secrets [ "ssid" ], secrets [ "password" ]) -
print ( "Connected to %s!" % secrets [ "ssid" ]) -
### Feeds ### -
light_feed = "greenhouse/light" -
temp_feed = "greenhouse/temperature" -
humidity_feed = "greenhouse/humidity" -
-
# Define callback methods which are called when events occur -
# pylint : disable = unused - argument , redefined - outer - name -
def connected ( client , userdata , flags , rc ): -
# This function will be called when the client is connected -
# successfully to the broker . -
print ( "Connected to MQTT!" ) -
-
def disconnected ( client , userdata , rc ): -
# This method is called when the client is disconnected -
print ( "Disconnected from MQTT!" ) -
-
-
def get_voltage ( pin ): -
return ( pin . value * 3.3 ) / 65536 -
-
# Create a socket pool -
pool = socketpool . SocketPool ( wifi . radio ) -
-
# Set up a MiniMQTT Client -
mqtt_client = MQTT . MQTT ( broker = secrets [ "broker" ], port = secrets [ "port" ], username = secrets [ "aio_username" ], password = secrets [ "aio_key" ], socket_pool = pool , ssl_context = ssl . create_default_context (),-
) -
-
# Setup the callback methods above -
mqtt_client . on_connect = connected -
mqtt_client . on_disconnect = disconnected -
-
# Connect the client to the MQTT broker . -
print ( "Connecting to MQTT..." ) -
mqtt_client . connect () -
-
# Create library object using our Bus I2C port -
sensor = adafruit_si7021 . SI7021 ( board . I2C ()) -
light_pin = AnalogIn ( board . IO4 ) -
-
while True : -
# Poll the message queue mqtt_client . loop ()-
-
# get the current temperature light_val = get_voltage ( light_pin ) temp_val = (( sensor . temperature * 9 )/ 5 ) + 32 humidity_val = sensor . relative_humidity-
-
# Send a new messages mqtt_client . publish ( light_feed , light_val ) mqtt_client . publish ( temp_feed , temp_val ) mqtt_client . publish ( humidity_feed , humidity_val )-
time . sleep ( 0.5 )
コードを保存してください。シリアルモニターに接続して、プログラムがMQTT中継器にどのように接続するかを確認してください。Raspberry Pi 4のターミナルを、パブリッシュキューをサブスクライブしているターミナルに切り替えて、出力を確認することもできます。 MQTTのようなパブリッシュ/サブスクライブ型ワークフローは、マイクロコントローラーシステムに多くのメリットをもたらします。複数のマイクロコントローラーとセンサーを組み合わせて、同じシステムに対して異なるメトリクスを報告したり、同じメトリクスの複数の測定値を並列に報告したりできます。また、複数の異なるプロセスが様々なキューをサブスクライブし、これらのメッセージに並列で応答することも可能です。さらに、複数のプロセスが同じキューをサブスクライブし、メッセージに対して異なるアクションを実行することも可能です。例えば、値が高すぎる場合に通知メールを送信したり、メッセージを別のMQTTキューに送信したりといったことが可能です。 もう1つの選択肢は、マイクロコントローラを外部キューにサブスクライブさせることです。これにより、マイクロコントローラにセッションの終了や新規セッションの開始などのアクションを実行するよう信号を送ることができます。最後に、パブリッシュ/サブスクライブ型ワークフローは、低消費電力のマイクロコントローラシステム(バッテリーや太陽光発電を使用するシステムなど)に適しています。これらのデバイスは、長いレイテンシ期間の後に監視メトリクスを一括でパブリッシュし、リターン間のインターバルで電力を大量に消費するWi-Fiブロードキャストを停止できるためです。 これらのメトリクスを処理するために、Pythonクライアントを作成し、Paho Python MQTTクライアントを使用してメトリクスキューをサブスクライブしました。また、公式のPrometheus Pythonクライアントを使用してWebサーバーも作成しました。このクライアントは、これらのメトリクスをダッシュボード情報として使用するPrometheus準拠のデータ収集エンドポイントを生成します。PrometheusサーバーとMosquitto MQTT仲介サーバーは、同じRaspberry Pi 4上で動作しています。 -
from prometheus_client import start_http_server , Gauge -
import random -
import time -
import paho . mqtt . client as mqtt -
gauge = { -
"greenhouse/light" : Gauge ( 'light' , 'light in lumens' ), -
"greenhouse/temperature" : Gauge ( 'temperature' , 'temperature in fahrenheit' ), -
"greenhouse/humidity" : Gauge ( 'humidity' , 'relative % humidity' ) -
} -
try : -
from mqtt_secrets import mqtt_secrets -
except ImportError : -
print ( "WiFi secrets are kept in secrets.py, please add them there!" ) -
raise -
def on_connect ( client , userdata , flags , rc ): -
print ( "Connected with result code " + str ( rc )) -
# Subscribing in on_connect () means that if we lose the connection and -
# reconnect then subscriptions will be renewed . client . subscribe ( "greenhouse/light" ) client . subscribe ( 'greenhouse/temperature' ) client . subscribe ( 'greenhouse/humidity' )-
def on_message ( client , userdata , msg ): topic = msg . topic payload = msg . payload gauge [ topic ]. set ( payload )-
client = mqtt . Client () -
client . username_pw_set ( mqtt_secrets [ "mqtt_user" ], mqtt_secrets [ 'mqtt_password' ]) -
client . on_connect = on_connect -
client . on_message = on_message -
client . connect ( 'localhost' , 1883 , 60 ) -
if __name__ == '__main__' : -
# Start up the server to expose the metrics . client = mqtt . Client () client . username_pw_set ( 'london' , 'abc123' ) client . on_connect = on_connect client . on_message = on_message client . connect ( 'localhost' , 1883 , 60 ) start_http_server ( 8000 ) client . loop_forever ()
次に、エンドポイント データをlocalhost:8000に収集するように Prometheus サーバーを構成しました。 Greenhouse MQTTマイクロコントローラープロジェクトのコードはGitHubからアクセスできます。このプロジェクトはMITライセンスの下でライセンスされています。 |