Open9

QNAP TS-253D

ukiriukiri

動機

写真が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
https://tech-mmmm.blogspot.com/2017/08/qnapopenvpnvpn.html

ukiriukiri

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から。
https://ludwig125.hatenablog.com/entry/2020/12/05/064958

##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に書き込むところから。

ukiriukiri

秋月で買ったESP-WROOM-02開発ボードの書き込みができなくなっている。
windows10からもM1Macbookからも不可。ドライバを更新しても不可。一生ambientにデータを垂れ流す代物になってしまった。
類似製品の購入を検討する。
というわけで、今回はESP32-CAMでダミーの固定データを送信して、テストする。

ukiriukiri

ESP32-CAM → DB

今回参考にさせていただいたのは下記。

https://okiraku-camera.tokyo/blog/?page_id=7007

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()関数の最後に下記を追加。

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

ログイン情報は別ファイルに。

envdata_db.php
require_once('../../Web2/db/db_connect.php');
$this->mysql= mysqli_connect($host, $user, $password, $data);
../../Web2/db/db_connect.php
<?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リクエストのデバッグは正攻法がありそうなのでひと段落したら勉強していきたい。

ukiriukiri

Grafana

このスクラップの2本目の記事と同じようにやれば表示できる。
最後のselectも適当にいじれば、温度・湿度を同時表示も可能。
ただし、時刻がズレる。
dbにはJSTで書き込むが、grafanaはUTCだと思って読み取るらしい。
なのでグラフの表示領域をnow-12h 〜 now+12hなどで表示した方が良い。

ukiriukiri

ESP-WROOM-02はarduino IDEを再起動したりなんか色々やっていたら接続できた。
結果的に下記のようになった。

ukiriukiri

フォルダ構造

FileStationから見えるフォルダはsshで入ったときには下記。
/share/CACHEDEV1_DATA

ukiriukiri

crontab

下記ページに詳細がある。
https://wiki.qnap.com/wiki/Add_items_to_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.
ukiriukiri

python

QNAP store や下で入れるOPKG store からのpythonはパスがよくわからなかったので下の記事に従いコマンドで入れた。
https://mish.myds.me/wordpress/dev/2020/08/29/ts253d-setup-3-opkg/
/opt/bin/python3.10

opkg 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は起動できた。