日常生活の物理|身近で体験できる科学のブログ

日常に関すること、何でもつぶやきます。物理的な視点を加えることが多いかも。

温湿度計作り (5) : Raspberry PiのWebサーバ送信

前回までで、Raspberry Piのデータを取得し、Bluetoothssh・scpコマンドでパソコンにデータを送信するところまでは出来たのですが、これで毎日の温湿度を計測するには、まだ使いづらい。。

そこで、Webサーバを立てて、Raspberry Piのデータを送信し、スマホ等からいつでも見られるようにしよう、と考えました。下記サイトにRaspberry Piのデータ送信方法について詳しく纏められていたので、参考にさせて頂きました.。http://independence-sys.net/main/?p=3973

 これを進めるにあたっては、Webサーバーを借りたり、PHPやhtml等のコードは、最低限の知識が必要です。サーバーは無料のものでも十分で、Xserver(xfree)を使うことにしました。 https://www.xdomain.ne.jp/login/member.php


Xserverをレンタルしたら、PHPMyAdminにログインします。
f:id:dailyphysics:20210109154547p:plain

このような画面が出てくるので、まずは、

CREATE TABLE `sensorvalues` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `datetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `temp` float NOT NULL,
  `hum` float NOT NULL,
  `lux` float NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=316 ;

等と入力。データベース内にテーブルが作成されることを確認します。
f:id:dailyphysics:20210109154634p:plain


次に、Raspberry Piからの通信を受けるためのPHPファイルを、サーバー側に用意しましょう。下記ファイルをXserver側にアップロードしておきます。PHPファイルに記載する、データベース名、ユーザー名、ホスト名は、XFREEのPHPMySQLサーバーのサーバー管理パネルのページに記載されています(下図参照)。
f:id:dailyphysics:20210109154645p:plain


sql.php

<?php
// mysql:host=ホスト名;dbname=データベース名;charset=文字エンコード
$dsn = 'mysql:host=XXXXXX.php.xdomain.ne.jp;dbname=YYYYYYYYYY;charset=utf8';

// データベースのユーザー名
$user = 'ZZZZZZZZZZ';

// データベースのパスワード
$password = 'AAAAAAAAAAA';
$pdo = new PDO($dsn, $user, $password);

 switch ($_SERVER['REQUEST_METHOD']) {
    case 'GET':
        echo json_encode("GET start");
        $st = $pdo->query("SELECT * FROM sensorvalues");
        echo json_encode($st->fetchAll(PDO::FETCH_ASSOC));
        break;

    case 'POST':
        echo json_encode("POST start");
        $in = json_decode(file_get_contents('php://input'), true);
        if (!isset($in['id']))
        {
                $st = $pdo->prepare("INSERT INTO sensorvalues(datetime,temp,hum,lux) VALUES(:datetime,:temp,:hum,:lux)");
        }
        $st->execute($in);        
        break;
}
?>

これで通信の受け手側のプログラムが完成しました。
続いて、Raspberry Pi側の送信プログラムを記述します。

【Web_Upload.py】

import requests
import json
from datetime import datetime
def uploadSensorValues(temp, hum, lux):
url = 'http://XXXXXXXXXXX.php.xdomain.jp/sql.php'
sensorsdata = {'datetime':datetime.now().strftime("%Y/%m/%d %H:%M:%S"),'temp':temp,'hum':hum,'lux':lux}
print json.dumps(sensorsdata)
headers = {'content-type': 'application/json'}
res = requests.post(url, data=json.dumps(sensorsdata), headers=headers, verify=False)
print res.text
print res.status_code
pass

def main():
uploadSensorValues(11.8, 11.1, 51.1)
if __name__ == '__main__':
main()

このファイルをRaspberry Pi側で実行します。
すると、Webサーバーと通信して、PHPMyAdminに以下のようにデータを追加することができるようになります。
f:id:dailyphysics:20210109154846p:plain

あとはデータを表示するViewerのページを作るだけですね!
スマホ等からでも簡単に、家の温度・湿度・照度等が見れそうです。