QNAP TS-253D
動機
写真がiCloudに入らなくなってきたり、写真を共有する動機が発生したのでNASを導入した。ついでにwebサーバー機能も付いているらしく、それを使うことも念頭に入れた。予算と機能とのバランスでTS-253D。メモリ4Gを購入したがあとで増やせるらしい。
ストレージ
以前ベアボーンで自力でRAIDを組もうとして買ったTOSHIBA SSD 256GB x2
NAS仕様ではない。
2.5inchも普通にセットできる。
端子はケーブルタイプのものしか触ったことがなかったが、これは奥に端子の受け側がついていて、スライドして挿すタイプ。
設定
基本的にはググりながらやればなんとなくできる。
Web server
Web Server の欄で Enable Web Server のチェックを入れる。
RTX1210のスクラップで設定したポート番号を入れる。
Apply
VPN
VPNでL2TP/IPsecが使えないのでopenVPN
MariaDB5 + Grafana
ContainerのinfluxDBとGrafanaで室温データなどを可視化したかったが、influxDBの使い方がわからず断念。いろいろなネット記事を見ると、influx
で対話モードに入れるらしいが、それができなかった。
というわけで、DBはContainerでないMariaDBを使用した。さらにMariaDBには5と10があるが10はDBに接続できなかった(socketとかportの設定が悪い?)ので5を採用。
こちらを参考にさせていただいた。MariaDBはMySQLと互換性が高いので、この記事をそのまま(MySQLをMariaDBに読み替えることなく)実行すれば良い。ただし、インストールはMariaDBはAppCenterから、Grafanaはcontainerから。
##MariaDBのPATHを通す。
初期状態で通っていなかったので通す。
/usr/local/mysql/bin
でも/usr/local/mariadb/bin
でもログインできて、
データベースは同じものを指しているっぽい。bin
の上のディレクトリは両方とも異なるディレクトリシンボリックリンクされていて、パスにmariadbが含まれているけどbinのコマンドはmysqlになっておりよくわからない。mysqlの方から起動するとバックスペースが効かなくて不便なのでmariadbから起動した方が良い。前置きが長くなったが、~/.bashrc
に/usr/local/mariadb/bin
を追加。
export PATH=\
/bin:\
/sbin:\
/usr/bin:\
/usr/sbin:\
/usr/bin/X11:\
/usr/local/bin:\
/usr/local/mariadb/bin
source ~/.bashrc
MariaDBへの接続
mysql -uroot -p
パスワードはMariaDBをインストールしたときに設定した値。
CREATE DATABASE IF NOT EXISTS grafana_db;
CREATE TABLE IF NOT EXISTS grafana_db.sample_table (
id VARCHAR(10),
data_time DATETIME,
data_value int(10),
PRIMARY KEY( id, data_time )
);
use grafana_db;
次のコマンドは現在時刻に合わせて適宜修正。
INSERT INTO `sample_table` VALUES ('1001','2020-12-02 15:00:00', 1211);
次も' '内は適宜修正。
CREATE USER 'grafanaReader' IDENTIFIED BY 'password';
GRANT SELECT ON grafana_db.sample_table TO 'grafanaReader';
Grafana設定
Data Source
ContainerStationにURLが示されているのでそこへ行く。
ユーザー名とパスワードは初期値はともにadmin。
左の歯車マーク(Configuration)からData Sources を選択。
Add data sourceでMySQLを選択。
下のスクショではすでに実行済みなのでMySQLがひとつ登録されている。
下記のように埋める。参考サイトではHostがlocalhostになっているが、IPアドレスを入れないとエラーになる。grafanaはコンテナなので。
Save & test をクリックして✅Database Connection OK
と出ればOK。
Dashboard
下のスクショのようにDashboardを選択する。
下のスクショのように設定。時刻の部分はMariaDBに書き込んだテストデータの範囲が含まれるように設定。デフォルトではLast 5 minutes
などが入っているが、時刻指定が可能。
下の赤枠部分はsqlのselectになっている。
これで表示ができるはず。
次は実データで試したい。そのためにはWSP-WEOOM-02, BME280で取得したデータをwifi経由でMariaDBに書き込むところから。
秋月で買ったESP-WROOM-02開発ボードの書き込みができなくなっている。
windows10からもM1Macbookからも不可。ドライバを更新しても不可。一生ambientにデータを垂れ流す代物になってしまった。
類似製品の購入を検討する。
というわけで、今回はESP32-CAMでダミーの固定データを送信して、テストする。
ESP32-CAM → DB
今回参考にさせていただいたのは下記。
ESP32-CAM
inoファイル
ベースはESP32-CAMのコードで、カメラ機能を殺し、
//startCameraServer();
ssidのログイン情報はssid.h
に格納。
#include "ssid.h"
const char* ssid = MY_SSID;
const char* password = MY_SSID_PASS;
const char* remote_host = "192.168.x.y"; // php server
const int remote_port = xxxx; // php server
setup()
関数の最後に下記を追加。
double temp=24.1, humid=33.3, pressure=1013.0, vbat=1.0;
Serial.print("temp: ");
Serial.print(temp);
Serial.print(", humid: ");
Serial.print(humid);
Serial.print(", pressure: ");
Serial.print(pressure);
Serial.print(", vbat: ");
Serial.println(vbat);
WiFiClient client;
if(client.connect(remote_host, remote_port)){
Serial.println("client.connect OK.");
}else{
Serial.println("client.connect error.");
}
String request = "/db/store_data.php?point_id=" + WiFi.macAddress() + "&T=" + String(temp) + "&H=" + String(humid) + "&P=" + String(pressure) + "&V=" + String(vbat);
String req_line = "GET " + request + " HTTP/1.1\r\nHost: " + String(remote_host) + "\r\nConnection: close\r\n\r\n";
Serial.println(req_line);
client.print(req_line);
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client.stop();
return;
}
}
Serial.println("proccess finished.");
PHP
envdata_db.php
ログイン情報は別ファイルに。
require_once('../../Web2/db/db_connect.php');
$this->mysql= mysqli_connect($host, $user, $password, $data);
<?php
$host = "localhost";
$user = "username";
$password = "password";
$data = "envdata";
?>
store_data.php
そのまま
MariaDB5
-
create user
は@'localhost'
でないとうまく接続できなかった。指定なしで'%'だとダメ。 - envdataデータベースの全てのテーブルにinsertを許可。
MariaDB [(none)]> create database envdata ;
MariaDB [envdata]> use envdata;
MariaDB [envdata]> create user 'username'@'localhost' identified by 'password' ;
Query OK, 0 rows affected (0.00 sec)
MariaDB [envdata]> select user,host from mysql.user;
+---------------+-----------+
| user | host |
+---------------+-----------+
(略)
| username |localhost |
(略)
+---------------+-----------+
N rows in set (0.00 sec)
MariaDB [envdata]> grant insert ON `envdata`.* to 'username'@'localhost';
Query OK, 0 rows affected (0.00 sec)
MariaDB [envdata]> show grants for 'username'@'localhost';
+--------------------------------------------------------------------------------+
| Grants for username@localhost |
+--------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY PASSWORD '*...' |
| GRANT INSERT ON `envdata`.* TO 'username'@'localhost' |
+--------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
MariaDB [envdata]> select * from envdata;
+-----------+-------------------+-------+-------+---------+------+------+------+---------------------+
| serial_no | point_id | T | H | P | V | X1 | X2 | post_datetime |
+-----------+-------------------+-------+-------+---------+------+------+------+---------------------+
| 1 | xx:xx:xx:xx:xx:xx| 24.10 | 33.30 | 1013.00 | 1.00 | 0.00 | 0.00 | 2021-10-29 23:26:47 |
+-----------+-------------------+-------+-------+---------+------+------+------+---------------------+
1 rows in set (0.00 sec)
確認
ESP32-CAMのリセットボタンを押して
MariaDB [envdata]> select * from envdata;
をして値が追加されていればOK。
感想
inoからhttpリクエストを送っているがデバッグの方法がよくわからず、
ブラウザにgetのURLを入れたり、phpに直接アクセスしてechoデバッグしたり、phpにアクセスされたことを確認するためにファイルを生成したり、dbのユーザをcreateしてはdropしgrant設定を色々変えて反応を見たりと、なかなかヘビーだった。httpリクエストのデバッグは正攻法がありそうなのでひと段落したら勉強していきたい。
Grafana
このスクラップの2本目の記事と同じようにやれば表示できる。
最後のselectも適当にいじれば、温度・湿度を同時表示も可能。
ただし、時刻がズレる。
dbにはJSTで書き込むが、grafanaはUTCだと思って読み取るらしい。
なのでグラフの表示領域をnow-12h 〜 now+12hなどで表示した方が良い。
ESP-WROOM-02はarduino IDEを再起動したりなんか色々やっていたら接続できた。
結果的に下記のようになった。
フォルダ構造
FileStationから見えるフォルダはsshで入ったときには下記。
/share/CACHEDEV1_DATA
crontab
下記ページに詳細がある。
vi /etc/config/crontab
で開いて、下記を追記。
0,30 * * * * (QNAP保存先のパス)/`date "+%Y%m%d-%H%M%S"`.jpg http://(IPアドレス):(port number 2)/?action=snapshot
下記を実行。
crontab /etc/config/crontab && /etc/init.d/crond.sh restart
なんかコメントが出るがよくわからないが、実行はできている。
Stopping periodic command scheduler: Watchdog device not enabled.
crond.
Starting periodic command scheduler: Watchdog device not enabled.
crond.
python
QNAP store や下で入れるOPKG store からのpythonはパスがよくわからなかったので下の記事に従いコマンドで入れた。
/opt/bin/python3.10opkg install python3-pip
pip install ipython
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager....と出るがipythonは起動できた。