Arduino IDE を使って Tasmota を Mosquitto TLS + パスワード認証に対応するようビルドする。

※超初心者が書いた自分への備忘録です。

[公式サイトのArduino IDE](https://github.com/arendst/Sonoff-Tasmota/wiki/Arduino-IDE)を参考に進めていく。  

[公式サイト](https://github.com/arendst/Sonoff-Tasmota)の clone and download からtempにzipをダウンロードして解凍する。

## platform.txt, boards.txt, espupload.py をコピーする。
Arduino IDE のアプリケーションデータフォルダとして
`C:\Users\xxx\AppData\Local\Arduino15` に各種データが保存されている。

私の環境では
`C:\Users\xxx\AppData\Local\Arduino15 ⇒ C:\Users\xxx\OneDrive\AppData\Local\Arduino15` とシンボリックリンクを設定している。

- 解凍した中からファイルをコピーする。※オリジナルファイルはバックアップしておく。
バックアップ

```bash
cd "C:\Users\admin\OneDrive\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\"
move platform.txt platform.txt.bak
move boards.txt boards.txt.bak
cd "C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\tools\"
move espupload.py espupload.py.bak
```
カレントディレクトリ Sonoff-Tasmota-6.4.1 として三つのファイルをコピーする。
platform.txt
boards.txt
espupload.py

```shell
cd "C:\Users\admin\OneDrive\Documents\Arduino\Sonoff-Tasmota-6.4.1"

copy /y "arduino\version 2.5.0\platform.txt" "C:\Users\admin\OneDrive\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\"
copy /y "arduino\version 2.5.0\boards.txt" "C:\Users\admin\OneDrive\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\"
copy /y "arduino\espupload.py" "C:\Users\admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\tools\"
```

## lib フォルダのライブラリをコピーする。

```shell
xcopy /Y /Q /S /E lib\* "C:\Users\admin\OneDrive\Documents\Arduino\libraries\" 
```
ビルドして重複するライブラリがあったら Tasmota で使わない方を削除する

## sonoff フォルダをコピーする。

```shell
xcopy /Y /Q /S /E sonoff ..\
```

## Mosquitto TLS 通信する為に [Tasmota にフィンガープリント](https://github.com/arendst/Sonoff-Tasmota/wiki/Securing-your-IoT-from-hacking) を設定する
- mosquitto のフィンガープリントを取得する（Pi にログインして実行する）

```bash
openssl s_client -connect localhost:8883 < /dev/null 2>/dev/null | openssl x509 -fingerprint -noout -in /dev/stdin | sed 's/^.*=//' | sed 's/:/ /g'
```
- [my_user_config.h](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/my_user_config.h) の91～92行に フィンガープリント、ユーザー名、パスワードをセットする

```c++
#define MQTT_HOST              "pi.local"                // [MqttHost]
#define MQTT_FINGERPRINT1      "A5 02 FF 13 99 9F 8B 39 8E F1 83 4F 11 23 65 0B 32 36 FC 07"  // [MqttFingerprint1]
#define MQTT_FINGERPRINT2      "A5 02 FF 13 99 9F 8B 39 8E F1 83 4F 11 23 65 0B 32 36 FC 07"  // [MqttFingerprint2]
#define MQTT_PORT              8883              // [MqttPort] MQTT port (10123 on CloudMQTT)
#define MQTT_USER              "DVES_USER"       // [MqttUser] MQTT user
#define MQTT_PASS              "DVES_PASS"       // [MqttPassword] MQTT password
```


## Arduino IDE でアップロード設定をする。
ツール ＞
![arduinoide242b.png](https://qiita-image-store.s3.amazonaws.com/0/366837/bbce2452-f111-ee51-5a09-966274dbdba0.png)
Upload Using ： Sereal    ※先ずはUSBケーブルでテストする。

## コンパイルする。
ファイル ＞ 開く ＞ sonoff\sonoff.ino
コンパイルだけを実行する。
無事エラーなしでコンパイル完了！

## Witty にアップロードする。
COM7 でアップロード実行。
完了すると、RGB-LEDのブルー（GPIO13）が点滅した。
シリアルモニタを表示してWittyをリセットした。

```shell
00:00:00 Project sonoff Sonoff Version 6.4.1(sonoff)-2_5_0_BETA2
00:00:00 WIF: WifiManager active for 3 minutes
00:00:00 HTP: Web server active on sonoff-4540 with IP address 192.168.4.1
00:02:00 RSL: tele/sonoff/UPTIME = {"Time":"1970-01-01T00:02:00","Uptime":"0T00:02:00"}
00:03:02 APP: Restarting

ets Jan 8 2013,rst cause:2, boot mode:(3,7)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v0fd86a07
~ld

00:00:00 Project sonoff Sonoff Version 6.4.1(sonoff)-2_5_0_BETA2
00:00:00 WIF: WifiManager active for 3 minutes
00:00:00 HTP: Web server active on sonoff-4540 with IP address 192.168.4.1
00:02:00 RSL: tele/sonoff/UPTIME = {"Time":"1970-01-01T00:02:00","Uptime":"0T00:02:00"}

00:03:02 APP: Restarting

 ets Jan  8 2013,rst cause:2, boot mode:(3,7)

load 0x4010f000, len 1384, room 16 
tail 8
chksum 0x2d
csum 0x2d
v0fd86a07
~ld

00:00:00 Project sonoff Sonoff Version 6.4.1(sonoff)-2_5_0_BETA2
00:00:00 WIF: WifiManager active for 3 minutes
00:00:00 HTP: Web server active on sonoff-4540 with IP address 192.168.4.1
```
何もしなければ３分経つとリスタートする仕様のようだ。

## Sonoff for Witty にアクセスする。
PCのWiFiを sonoff-xxxx に接続して
ブラウザで 192.168.4.1 にアクセスすると
![sonoff-web-start.jpg](https://qiita-image-store.s3.amazonaws.com/0/366837/f81f38e8-4124-4a3c-0f2b-a2bd2ab07bb6.jpeg)
AP1, AP2 に家のWiFiをセットしたら設定終了で 192.168.4.1 の接続が切断される。

フィンガープリントチェックでエラーが出る。

orz


# 6.4.1 では TLS 接続できなかったので 5.14.0 にダウングレードして再チャレンジ
- [Tasmota-5.14.0](https://github.com/arendst/Sonoff-Tasmota/archive/v5.14.0.zip) 上記と同じ手順で配置
- Arduino IDE > ツール > ボード > ボードマネージャー > 検索 ESP8266 > 2.4.1 にダウングレード
- Arduino IDE > ツール のアップロード設定を前記と同じようにする

```css
#define STA_SSID1              "SSID"                // [Ssid1] Wifi SSID
#define STA_PASS1              "パスワード"                // [Password1] Wifi password


#define MQTT_HOST              "Mosquitto IP"                // [MqttHost]
#define MQTT_FINGERPRINT1      "フィンガープリントセット"  // [MqttFingerprint1]
#define MQTT_FINGERPRINT2      "フィンガープリントセット"  // [MqttFingerprint2]
#define MQTT_PORT              8883              // [MqttPort] MQTT port (10123 on CloudMQTT)
#define MQTT_USER              "ユーザー名"       // [MqttUser] MQTT user
#define MQTT_PASS              "パスワード"       // [MqttPassword] MQTT password

225行付近 コメント外す
#define USE_MQTT_TLS                             // Use TLS for MQTT connection (+53k code, +15k mem)

その他全てのサービスをコメントアウトして超ダイエット
```
- ビルド書込み

```
00:00:00 WIF: Connecting to AP1 Abo in mode 11N as sonoff-4540...
00:00:06 WIF: Connected
00:00:07 MQT: Attempting connection...
00:00:07 MQT: Verify TLS fingerprint...
00:00:07 MQT: Verified using Fingerprint1
00:00:07 MQT: Connected
00:00:07 MQT: tele/sonoff/LWT = Online (retained)
00:00:07 MQT: cmnd/sonoff/POWER = 
00:00:07 MQT: tele/sonoff/INFO1 = {"Module":"Sonoff Basic","Version":"5.14.0","FallbackTopic":"DVES_1811BC","GroupTopic":"sonoffs"}
00:00:07 MQT: tele/sonoff/INFO3 = {"RestartReason":"External System"}
00:00:09 MQT: stat/sonoff/RESULT = {"POWER":"OFF"}
00:00:09 MQT: stat/sonoff/POWER = OFF
00:00:16 MQT: tele/sonoff/STATE = {"Time":"1970-01-01T00:00:16","Uptime":"0T00:00:15","POWER":"OFF","Wifi":{"AP":1,"SSId":"Abo","RSSI":64,"APMac":"6A:3B:38:B4:C7:02"}}
00:02:00 MQT: tele/sonoff/UPTIME = {"Time":"1970-01-01T00:02:00","Uptime":"0T00:01:59"}
00:05:16 MQT: tele/sonoff/STATE = {"Time":"1970-01-01T00:05:16","Uptime":"0T00:05:15","POWER":"OFF","Wifi":{"AP":1,"SSId":"Abo","RSSI":58,"APMac":"6A:3B:38:B4:C7:02"}}
00:10:01 APP: Serial logging disabled
```

Mosquitto TLS + パスワード認証で接続成功！！
<br>
<br>
<br>
# 6.4.1 + 2.5.0 TLS + パスワード認証で接続成功！！
- [公式のフォーラム](https://github.com/arendst/Sonoff-Tasmota/issues/4952)で 6.4.1+2.5.0 で失敗する現象の議論の中でAxTLSを使うと成功したよとの書込みを参考にやってみた。
- VSCode + PlatformIO 環境でやった。
- sonoff.ino ３６行目付近に

```scala

#ifdef USE_CONFIG_OVERRIDE
  #include "user_config_override.h"         // Configuration overrides for my_user_config.h
#endif

// 以下追加
#define USING_AXTLS
#if defined(USE_MQTT_TLS) && defined(ARDUINO_ESP8266_RELEASE_2_5_0) && defined(USING_AXTLS) 
  #include <ESP8266WiFi.h>
  #include "WiFiClientSecureAxTLS.h"
  using namespace axTLS;
  #warning @@@@@@@@@@@ USING_AXTLS @@@@@@@@@@@
#endif // USING_AXTLS
```
- prlatform.ini を書き換えて実行

```c++
00:00:00 Project sonoff Sonoff Version 6.4.1.19(sonoff)-2_5_0
00:00:00 WIF: Connecting to AP1 aterm-b0135f-g in mode 11N as sonoff-4540...
00:00:04 WIF: Connected
00:00:04 HTP: Web server active on sonoff-4540 with IP address 192.168.0.7
03:44:12 MQT: Attempting connection...
03:44:12 MQT: Verify TLS fingerprint...
03:44:12 MQT: Verified using Fingerprint1
03:44:12 MQT: Connected
03:44:12 MQT: tele/sonoff/LWT = Online (retained)
03:44:12 MQT: cmnd/sonoff/POWER =
03:44:12 MQT: tele/sonoff/INFO1 = {"Module":"Sonoff Basic","Version":"6.4.1.19(sonoff)","FallbackTopic":"cmnd/DVES_1811BCBC_fb/","GroupTopic":"sonoffs"}
03:44:12 MQT: tele/sonoff/INFO2 = {"WebServerMode":"Admin","Hostname":"sonoff-4540","IPAddress":"192.168.0.7"}
03:44:12 MQT: tele/sonoff/INFO3 = {"RestartReason":"Software/System restart"}
03:44:12 MQT: stat/sonoff/RESULT = {"POWER":"OFF"}
03:44:12 MQT: stat/sonoff/POWER = OFF
```