ChatGPTにいろいろと教えてもらいながら、MQTT通信でESP32から発信されるデータをDashというダッシュボードに表示するアプリケーションを構築してみました。以下のような感じで電圧と温度をブラウザ上で表示した(温度と電圧のデータはダミーデータ)。
今回の成果物
以下のGithubに置いてあります。
https://github.com/takurot/ESP32_MQTT
- ESP32のコード
- MQTTブローカーの設定(README)
- MQTTブローカーからデータを受け取ってデータベースに保存するスクリプト
- データベースを定期的に見に行って値をダッシュボードに表示するスクリプト
一連のChatGPTとのやり取り
コード上で修正が必要だったところ
- サーバー側のSQLの記述に、特にリクエストしていなかったtimestampが入っていて、当初動かなかった。この辺はちょっと修正しているが、その他の部分はほとんど使える。
- 証明書で暗号化通信を試みたが、なぜかMosquittoとESP32が認証ファイルエラーでつながらなかった。ChatGPTの問題というよりは、実行環境の問題のような気がしているがまだよくわかっていない。暗号化通信の部分はコードをコメント化している。ユーザー認証はちゃんと動いた。
- 以下の回答はChatGPTが間違いを認めているのがちょっと面白い。たまに細かいところの整合が取れない時があるのかも。コードは一度に生成してもらったほうがよいかもしれない。
ChatGPT回答
-
スクリプトの分離について:
一般的に、異なる役割を持つコードは別々のスクリプトやモジュールに分けることが推奨されます。これにはいくつかの理由があります:- 単一責任原則: 一つのスクリプトやモジュールは一つの明確な役割や機能を持つべきです。これにより、コードの保守やデバッグが容易になります。
- 再利用性: 分離されたモジュールは、必要に応じて他のプロジェクトで再利用しやすくなります。
- 可読性: より小さな、特定の機能に特化したスクリプトは、大きな一つのスクリプトよりも読みやすくなります。
したがって、MQTTを介してデータを受け取りデータベースに保存するスクリプトと、Dashを使用してデータベースの内容をグラフとして表示するスクリプトは、通常別々のファイルに配置するのが良いでしょう。
-
データベース名について:
私の回答での不整合を指摘していただき、ありがとうございます。以前の例ではデータベースの名前としてsensors.db
を使用しましたが、このDashスクリプトではdata.db
としてしまいました。実際には、両方のスクリプトで同じデータベース名を使用する必要があります。したがって、Dashのスクリプト中のデータベース名もsensors.db
に修正すべきです。
前述の例から次の部分を:
conn = sqlite3.connect('data.db')
次のように修正してください:
conn = sqlite3.connect('sensors.db')
このように統一しておくことで、両方のスクリプトが同じデータベースを参照・操作することが確実となります。
所感
- MQTTのこととかユーザー認証のこととか確認方法とかを聞きながら、ちょっとづつ知識を増やしてアプリケーション構築することができるので、多少時間はかかりながらも異分野のコードを短時間で作成することができる。
- ユーザー認証をする、などあとから仕様が追加になったりした場合は、全部を再作成してもらったほうがよい。
- 注意すべきポイントもその都度教えてくれる。
- 微々たる間違いはあるが、すべてを否定するほどのことでもない。よく知ってる先輩、くらいの位置づけ(多少間違うこともある)。
- 出力されるエラーについても詳しく教えてくれる。