温湿度計作り (5) : Raspberry PiのWebサーバ送信
前回までで、Raspberry Piのデータを取得し、Bluetoothやssh・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にログインします。
このような画面が出てくるので、まずは、
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 ;
等と入力。データベース内にテーブルが作成されることを確認します。
次に、Raspberry Piからの通信を受けるためのPHPファイルを、サーバー側に用意しましょう。下記ファイルをXserver側にアップロードしておきます。PHPファイルに記載する、データベース名、ユーザー名、ホスト名は、XFREEのPHP・MySQLサーバーのサーバー管理パネルのページに記載されています(下図参照)。
<?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に以下のようにデータを追加することができるようになります。
あとはデータを表示するViewerのページを作るだけですね!
スマホ等からでも簡単に、家の温度・湿度・照度等が見れそうです。