DHT22+RaspZW2の温湿度データを、遠く離れたFideafact.ddns.netに送ってWordPressでグラフで見る方法 Part2

構成としては、2台(1台でも複数台でも)の Raspberry Pi Zero W 2 + DHT22 から定期的に温湿度を測定し、外部サーバー Fideafact.ddns.net にHTTPで送信し、WordPress側でDB保存・グラフ表示する形です。

全体構成

DHT22 + Raspberry Pi 1
        |
        | HTTPS POST
        v
Fideafact.ddns.net / WordPress / API
        ^
        | HTTPS POST
        |
DHT22 + Raspberry Pi 2

WordPressページでグラフ表示

おすすめ方式

  1. Raspberry PiでDHT22を読む
  2. WordPressに専用APIを作る
  3. 温度・湿度・端末ID・時刻をWordPressのDBへ保存
  4. WordPress固定ページにChart.jsでグラフ表示

1. Raspberry Pi側

DHT22配線例です。

DHT22 VCC  -> 3.3V
DHT22 GND  -> GND
DHT22 DATA -> GPIO4

Pythonライブラリを入れます。

送信用スクリプト例です。

自動起動は cron でできます。

crontabに追加:


2. WordPress側に保存APIを作る

一番シンプルなのは、WordPressに小さな自作プラグインを入れる方法です。

wp-content/plugins/dht22-logger/dht22-logger.php を作ります。

WordPress管理画面で DHT22 Logger を有効化します。


3. WordPressでグラフ表示

固定ページに以下のようなHTMLを入れます。
Chart.jsを使います。

これでWordPressページ上に、2台分の温度・湿度グラフが表示されます。


注意点


また、DHT22は読み取り失敗がそこそこあるので、Raspberry Pi側では失敗時に再試行する設計にすると安定します。

実用的には、測定間隔は 1分〜5分 くらいがおすすめです。DHT22は高頻度測定には向きません。が、DHT22を使用する場合「5分に1回送信すればよいので、1分間間で測定して、その合計の平均値を送る」やり方です。

1分間だけ複数回測定して平均し、5分に1回だけサーバーへ送信する方式は、DHT22でも実用的です。

5分周期 
├─ 最初の1分間: 2〜3秒ごとに測定 
│  └─ 異常値や読み取り失敗は捨てる 
├─ 平均値を計算 
├─ Fideafact.ddns.netへ送信 
└─ 残り約4分待機

DHT22は高頻度に読めないので、2秒未満では読まない方がいいです。
1分間なら、2秒ごとで最大30回、3秒ごとで約20回測れます。安定性重視なら 3秒ごと がおすすめです。

送るデータは平均値に加えて、測定回数も入れると後で便利です。

{
  "device_id": "raspi-1",
  "temperature": 24.6,
  "humidity": 53.2,
  "sample_count": 20
}

さらに良くするなら、単純平均よりも 外れ値除去つき平均 が向いています。

例:
1分間で20回測定
↓
明らかに変な値を除外
↓
上下1〜2個を捨てる
↓
残りを平均
↓
5分ごとに送信

DHT22はたまに読み取り失敗や飛び値が出るので、この方式だとグラフがかなり滑らかになります。

結論としては、DHT22をそのまま使うなら「3秒ごとに1分間測定 → 平均 → 5分ごと送信」が現実的でおすすめです。
センサーをSHT45に変える場合でも、この平均化方式は有効です。


参考

以下のように変更。

  • 5分ごとに送信
  • 送信前に 1分間で12回測定
  • 測定間隔は 5秒
  • None、範囲外、読み取りエラーは除外
  • 残った値から上下を捨てる
  • 平均値を送信

このコードでは、1サイクルが合計で約5分になります。
つまり 約1分測定 → 平均値を送信 → 残り約4分待機 です。

DHT22なら SAMPLE_INTERVAL = 5 はかなり安全です。もっと細かくしたい場合でも、DHT22では 2秒未満 にはしない方がよいです。


サーバー受け取る側の更なる効率化 BESTバージョン

fideafact.ddns.netで受け取ったデータはwordpresでDB保存・グラフ表示する形ですが。これをWordpressプラグインでする方法もあります。

WordPressプラグイン化する方法が一番きれいです。
Raspberry Piから https://fideafact.ddns.net/wp-json/dht22/v1/submit にPOSTし、WordPress側のプラグインが受信・DB保存・グラフ表示まで担当します。

プラグインでやる内容はこの3つです。

1. REST APIでデータ受信
2. WordPress DBに保存
3. ショートコードでグラフ表示

プラグイン構成

wp-content/plugins/dht22-logger/
└─ dht22-logger.php

dht22-logger.php

Raspberry Pi側の送信先

Python側はこのURLに送ります。

payloadには api_key と device_id を入れます。

2台目はこうします。

グラフ表示方法

WordPressの固定ページや投稿に、これを貼ります。

過去7日分なら:

これで2台分の温度・湿度が同じグラフに表示されます。

APIキーの your-secret-key は、長いランダム文字列に変えてください。
例:dht22_9sK3xQ7mP2vL8nR4zA1bY6


「Flaskで受け取ってMySQL保存」するpyコード

方向性としては「Flaskで受け取ってMySQL保存」はできます。
ただし、このコードのままだと 構文エラーで起動しません。さらに、WordPressでDB保存・表示したい場合は、WordPressプラグイン方式の方が管理しやすいです。

主な問題です。

  • Flask と request の import がありません
  • SQL文が途中で壊れています
    VALUES (%s, %s)> の > が不要
  • result の行が途中で壊れています
    str(r[2> になっている
  • device_id がないので2台のRaspberry Piを区別できません
  • APIキー認証がないので誰でも投稿できてしまいます
  • DBパスワードをコードに直書きしています
  • いま貼られたパスワードは公開扱いになるので、可能なら変更した方が安全です

修正版の最小例はこうです。

DBテーブルは例えばこうです。

ただし、結論としてはこうです。

WordPressでグラフ表示だけしたい
→ Flaskでも可能

WordPressでDB保存・管理・固定ページ表示までしたい
→ WordPressプラグイン方式がおすすめ

Flask方式にすると、WordPressとは別に Flask サーバー、MySQL、リバースプロキシ、常駐設定を管理する必要があります。
WordPressプラグイン方式なら wp-json で受信して、そのままWordPressのDBとショートコードでグラフ表示できるので、この用途にはかなり相性がいいです。

zero

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です