iPhoneだけでZERO WH + Ambient（おまけでsamba付き）

今更ながら、Rasperry PI ZERO WH +  DHT11の取得データをambientに送る記事を書いてみる（samba設定のおまけ付き）。

でもまあ、それだけじゃ面白くないのでヘッドレスでOSインストール以外はiPhone（たぶんAndoroidでもAndroid用ターミナルソフト等を使えば違いはないと思う)だけを使って全て設定、操作を行ってみる。

#●前準備　iphone用ソフトの選定：
app store からいくつかターミナルソフトとネットワークツールを落としてきてざっと起動して使うソフトを絞り混んだ。

##・ターミナル
自分的にはターミナルは、TermiusとShellyが使いやすかった。
Termiusは、特殊キーパレット（tabやctrlなどが入力できるパレット）と、タッチ操作でのバックスクロールとカーソル操作の切り替えが使いやすかったのでこちらを選択。

##・ネットワークツール
Net Analyzer がシンプルで使いやすかったので、これを選択。Network Utilsも高機能で良かったが逆に高機能すぎると思い次点とした。

##・iPhoneからのsambaアクセス
標準アプリの、「ファイル」を使用。

##・選外だが面白かったソフト
PiHelperというソフトが、RasPIに接続すると、RasPIの状態取得グラフ表示（CPU使用率、メモリー使用率、プロセス、ストレージ使用量、残容量、CPU温度）、GPIO確認（WiringPiを入れないと状態が見れないが）、ターミナル、SFTPがひとつのソフトで使えて面白かったかったが、ターミナルがちょっと残念な出来だったので選外とした。

#●実際の作業：
##①OS（Rasbberry PI OS LITE)のインストール
ターゲットがRaspberry PI ZERO WHでヘッドレスということでOSはRasbberry PI OS LITEを選択した。
ライティングソフトはRaspberry PI Imagerを使用。
#####1)SDのフォーマット
Operating Systen からERASEを選んで消去します。
![Page2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361822/871b48a2-e8c9-4158-1f6d-d4bd87af3179.png)

![Page1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361822/399df73e-0d2b-3547-eb6f-e775046425e5.png)

この後、SDカードドライブを選び、WRITEで消去します。
そのあと、SDカードの抜き差しを行う（消去後、自動的にejectされるため）

#####2)OSの選択
Operating system →　Raspberry Pi Os(other) → Raspberry Pi OS Lite(32-bit) を選ぶ
![Page3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361822/ea4cbc6e-e425-67ec-9424-f9f0154bf767.png)

![Page4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361822/faa600c2-72ec-939f-c477-f975eb11f8ff.png)


#####3)Shit+Ctrl+xで高度オプションメニューを開いてwifi設定
(SSID、Passwardは適宜設定してください)
![Page6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361822/c105fd32-b04c-40b7-0826-f1b3de53c7cc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361822/d099cc62-ddb1-ae63-bd4b-68e188245f6a.png)



#####4)書き込み
WRITEボタンで書き込みをします。
![Page5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361822/6b75754c-3c8f-f265-fe78-1fc73876087d.png)


#####5)Raspberry PI ZEROにSDを入れて起動
LEDがチカチカしている間は初期か処理が動いているので、連続点灯になるまで待つ
（ただし、これはSDやネットの速度が影響しますので一概には言えませんが大体4～5分待てば大丈夫だと思います)

##②Raspberry PI ZERO のIP検索、ターミナルの接続 
#####1)Net Analyzerを起動しLAN画面を開く
#####2)Scanボタンを押して、RasPIのIPを確認
#####3)Termiusを起動
#####4)「+」ボタンを押下し次に「New Host」ボタンを押下
#####5)Hostnameに先程確認したIPを入力
#####6)OS書き込み時に設定したUsername、Passwordを設定する。設定していない場合はUsername「pi」、Password「raspberry」を設定する。
Username、Passwordを設定しない場合は、接続時に毎回入力する。
#####7)Aliasには自分が分かりやすい名前をつけておくと良い。
#####8)Saveボタンで保存
#####9)先程設定したホストがHosts以下に並ぶのでそれを押下
#####9‘)Username、Passwordを設定していない場合は、Username、Passwordを入力してログイン
#####10)OSの更新
sudo apt update
sudo apt full-upgrade
(full-upgrade を行うと、不要なパッケージの削除までしてくれる)
ディスクスペースが欲しい場合は以下のコマンドを実行して、キャッシュをクリアする。
sudo apt clean

##③gitのインストール
もう、これは単純に
sudo apt install git
でインストール完了します。

##④sambaのインストール、立ち上げ
#####1)インストールは
sudo apt install samba
#####2)公開フォルダの作成
mkdir public
#####3)smb.confの設定
sudo nano /etc/samba/smb.conf
で開き[printers]設定の後ろに下記を追加

```
[pi]
comment = Share
path = /home/pi/public
force user = pi
browsable = yes
guest ok = no
create mask = 0666
directory mask = 0777
read only = no
```

#####4)sambaユーザーの登録
(このユーザーはログインユーザーとして登録されている必要があるので"pi"以外のユーザーを使う場合はそっちも登録して下さい)
sudo smbpasswd -a pi
で登録すると
New SMB password:
Retype new SMB password:
と2回パスワードを要求されるので任意のパスワードを設定してください。(こちらはsambaアクセス専用のパスワードになります)
#####5)sambaサーバーの再起動
ここまで出来たら、sambaサーバーの再起動をします。
sudo service smbd restart
#####5‘)sambaへのアクセス
######(1)「ファイル」アプリを開いて、ブラウズの右上に○の中に...が入っているボタンがあるのでそれを押下
######(2)「サーバへ接続」ボタンを押下
######(3)サーバ名にRasPI のIPを入れる(サーバ名を入れても良い)
######(4)次に「サーバ接続」画面が出るので
ユーザーの種類は「登録ユーザー」を選択
名前(ログインユーザー名の事)とパスワードを設定
#####(5)右上の「次へ」ボタンを押せばアクセス出来ます
#####(5‘)次回以降は「ブラウズ」の下の方に「共有」グループが出来、そこにサーバ名ボタン出来るので、そこからアクセス出来ます。

##⑤ambientの設定
#####1)下記ambientサイトをサファリで開く
https://ambidata.io
#####2)左上の「三」をタップし、「ユーザー登録（無料）」をタップ
#####3)メールアドレス、パスワードを設定し「ユーザー登録（無料）」をタップすると認証メールが送られます。
#####4)認証メールを開くと、登録するためのアドレスが記載されているので、それをタップすると認証されます。
#####5)左上の「三」をタップし、「ログイン」をタップ
#####6)先程登録した、メールアドレスとパスワードを入力し「ログイン」ボタンをタップしてログインします。
#####7)チャンネルリスト画面が出るので下側にある「チャンネルを作る」ボタンをタップすると新規チャンネルが生成されます。
#####7’）ここでチャンネルIDとライトキーをメモしておきます。（このIDとキーでデータ記録をしていきます）
#####8)ambient のpythonライブラリのインストールは下記コマンドをターミナルで実行
pip3 install git+https://github.com/TakehikoShimojima/ambient-python-lib.git
#####9)チャンネル設定は、後でも出来ますし、設定しなくても問題ありません。
######9-1)一番右端の「...」(設定ボタン)を押下
######9-2)「設定変更」ボタンを押下
######9-3)「チャンネル名」、「説明」、「データ名1」、「データ名2」を適宜設定
######9-4)下の方の「チャンネル属性を設定する」ボタンを押下

##⑥DHT11を使って温度、湿度を測定出来るようにする（ハード）
今回は、DATA線がプルアップされているものを使いましたが、センサーだけの物を使う場合はDATA線を4.7KΩ程度でプルアップして使います。

接続は、下記の通り
DHT11 ー　raspberry pi 
VDD   ー　3.3V(1Pin)
GND   ー　GND(6Pin)
DATA  ー　GPIO 14(8Pin)

:::note info
電源は5Vにつなぐと、GPIOに5Vがかかってしまいます。
raspberry pi のGPIO入出力は3.3Vなので5Vがかからないように注意。
:::

raspberry pi 側
![AE4DC774-E3EE-4931-9C51-9680B8886B34.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361822/57f95710-591f-07e6-82ba-186dc80c1cad.jpeg)

DHT11側

![B7536BC6-D1D5-4172-B56C-61CE21F4BB3E.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361822/b2fecc3d-c5f7-08e7-a11f-b5af3f99efec.jpeg)


##⑦DHT11を使って温度、湿度を測定出来るようにする（ソフト）
#####1)gitでDHT11のpythonライブラリを取得する
git clone https://github.com/szazo/DHT11_Python.git

2)Pythonスクリプト

:::note info
ambient への送信設定
ambi = ambient.Ambient(ChannelID, "write key")
の行でambient のチャンネルIDとwrite keyを記載しておきます。
:::

```DHT11_Python/dht11ambient.py
import RPi.GPIO as GPIO
import dht11
import time
import datetime
import ambient

# initialize GPIO
GPIO.setwarnings(True) 
GPIO.setmode(GPIO.BCM) 

#Set Ambient
ambi = ambient.Ambient(ChannelID, "write key")

# read data using pin 14
instance = dht11.DHT11(pin=14)

# read from dht11
while True:
    result = instance.read()
    if result.is_valid():
        break
    time.sleep(6)

temp = result.temperature
humi = result.humidity

print(str(datetime.datetime.now()) + \
    " %-3.1f " % temp + \
    " %-3.1f " % humi)

#send to ambient
result_ambi = ambi.send({"d1": temp, "d2": humi})

GPIO.cleanup()
```

#####3)上記が出来たら実行してみる。
python3 dht11ambient.py
#####4)ターミナルに下記のように表示され、ambientのグラフにデータが記録されていれば成功です。
2021-12-12 03:55:22.041602 21.5  31.0 
#####5)ambient のチャートを見るには、チャンネルリストの、チャンネル番号をタップすれば見れます。
このとき、チャートのタイトル部分をタップするとチャートの設定を変更できます。

##⑩定期的にデータを取得するためのcronの設定
1)crontabにスケジュールを追加
crontab -e

:::note info
注意
ユーザー権限で設定するためsudo は付けません
(crontabはユーザー毎に設定できるため)
:::

```
Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.tiny
  3. /bin/ed

Choose 1-3 [1]: 1
```

とし(上記はエディタにnanoを選択している)最終行に下記を追加
（下記は10分単位にスクリプトが起動する設定です）

```
*/10 * * * * python3 /home/pi/DHT11_Python/dht11ambient.py >> /home/pi/public/dht11.log 2>&1
```

2)cron の再起動を行います
sudo /etc/init.d/cron restart

3)cron の状態確認
sudo /etc/init.d/cron status

```
● cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2021-12-14 04:49:32 GMT; 10s ago
       Docs: man:cron(8)
   Main PID: 5959 (cron)
      Tasks: 1 (limit: 415)
        CPU: 26ms
     CGroup: /system.slice/cron.service
             └─5959 /usr/sbin/cron -f
```

上記のように
Loaded: 　が　loaded　になっており
Active: 　が　active 　になっていれば問題ないです。

#●結果確認：
下記のように時間毎の折れ線グラフが出ていれば成功です。
下記は、チャートのタイトルバーから設定できる項目を設定しています。
![居室の温湿度測定 -Ambient.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361822/d31cd38f-df78-eb9d-2cec-db33ca3bb15b.png)

また、「ファイル」アプリでdth11.logがアクセス取得できれば、こちらも問題ありません。


#●最後にこの実験で思ったこと：
最近の学生は、PCを使ったことがない人がかなりいると聞いていたが（理系の学生さんでも、大学入るまで使ったことがなかったという人もいると聞いた事が...）、OSインストールと配線以外スマホだけで操作しても全く苦にならなかった。
コード組んだ時でさえ、PCより操作性は多少落ちるが全然問題なかった。
もしかすると、この先実機操作以外はリモートワークで、自宅ではPC、出先でスマホで仕事ってのが当たり前になってくるのかなと思った。
下手すると、PCを『使ったことがない』プログラマーってのが出現してもおかしくないかもしれない。