Изначально эта публикация задумывалась как вторая часть обзора лампы Sonoff B1 , где планировалось объяснить простоту обновления до открытой прошивки Sonoff-Tasmota по воздуху (OTA), кратко демонстрируя её возможности. Однако процесс занял более 10 часов из-за неоднозначной документации и настройки маршрутизаторов. Первая попытка с Sonoff B1 завершилась неудачей, поэтому использовался последовательный интерфейс, тогда как для Sonoff POW успешно применён метод SonOTA, позволивший перейти с родной прошивки на Sonoff-Tasmota без пайки или разборки.
Обновление ПО через плату USB-UART
Использование платы преобразователя USB-UART – наиболее распространённый метод замены родной прошивки на открытую (ESPurna или Sonoff-Tasmota) в устройствах Sonoff и других системах на ESP8266. Для коммутаторов типа Sonoff TH16 процесс прост:

Достаточно припаять 4-контактный разъем с шагом 2.54 мм, подключить плату и прошить образ через esptool. После завершения провода снимаются, разъем остаётся на месте, а корпус собирается обратно. С лампой Sonoff B1 сложнее: на плате отсутствуют сквозные отверстия, требуя пайки до шести проводов к малым контактным площадкам.
Необходимо припаять и подключить к преобразователю линии GND, Tx, Rx и 3.3V, а для входа в режим программирования замкнуть GPIO0 – поэтому добавляются два дополнительных провода для GPIO0 и ещё один GND.
Важное предупреждение: Никогда не подключайте последовательный преобразователь и сеть переменного тока одновременно. Это угрожает оборудованию и жизни.
Далее следует скачать последнюю версию прошивки , установить esptool, подключить преобразователь к компьютеру (он же обеспечит питание платы) и выполнить прошивку:
wget https://github.com/arendst/Sonoff-Tasmota/releases/download/v5.8.0/sonoff.bin
sudo pip install --upgrade esptool
esptool.py --port /dev/ttyUSB0 write_flash -fs 1MB -fm dout 0x0 sonoff.bin
При штатной работе вывод будет следующим:
esptool.py v2.1
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Compressed 481136 bytes to 329618...
Wrote 481136 bytes (329618 compressed) at 0x00000000 in 29.1 seconds (effective 132.3 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting...
Большинство устройств на рынке при первом запуске активируют режим точки доступа, но разработчики Sonoff-Tasmota предоставляют предсобранный образ в режиме клиента, подключающегося к точке доступа с SSID: indebuurt1 ; пароль: VnsqrtnrsddbrN. Это создаёт неудобства, так как требуется предварительная настройка роутера с этими данными перед подключением к домашней сети. Альтернатива – сборка из исходного кода с изменением настроек точки доступа для мгновенного подключения после прошивки. Желателен образ с режимом точки доступа по умолчанию. Для большинства устройств Sonoff это не проблема – переключение выполняется кнопкой (4 коротких нажатия), но Sonoff B1 её не имеет.
Представьте обновление дюжины ламп Sonoff B1: ручная пайка для каждой неэффективна. Решение – контактное приспособление с пружинными иглами , как показано ниже для AI Light. Достаточно извлечь лампу, зафиксировать приспособление, прошить через последовательный интерфейс, снять оснастку и установить лампу обратно.
Адаптация такого приспособления для Sonoff B1 возможна, хотя его существование неизвестно.
SonOTA – метод обновления прошивки Sonoff по воздуху
В идеале аппаратные манипуляции не требуются. Хотя ITEAD Studio пока не предоставляет официального способа загрузки кастомной прошивки, OTA-механизм был реверс-инженерным, и SonOTA (экспериментальная реализация) позволяет прошивать альтернативные firmware без вмешательства в аппаратную часть.
Метод в вики Sonoff-Tasmota не работает для Sonoff B1 из-за отсутствия широковещательного SSID в режиме сопряжения, но участник на GitHub успешно обновил лампу через подмену DNS. После частично удачной попытки с Sonoff B1, метод DNS-спуфинга был проверен на Sonoff POW. Схема взаимодействия компонентов:
- Домашний роутер – стандартный Wi-Fi маршрутизатор для доступа в Интернет
- Смартфон с eWelink необходим для настройки Wi-Fi на устройстве Sonoff и обновления до актуальной родной прошивки. Также полезен для проверки точек доступа.
- Wi-Fi ноутбук запускает SonOTA, эмулируя сервер обновлений ITEAD Studio (xx-disp.coolkit.cc)
- «Временный» роутер с подменой DNS перенаправляет запросы xx-disp.coolkit.cc на ноутбук с SonOTA, перехватывая процесс обновления. Требуется подключение к Интернету.
- Устройство Sonoff – целевое оборудование для обновления
Теоретически, роутер, DNS-спуфер и ноутбук можно объединить в Debian-роутере, но в данном случае использовались раздельные устройства из-за ограничений домашнего роутера и проблем с установкой SonOTA на временном маршрутизаторе.
Первоначальный этап: сопряжение устройства с приложением eWelink, подключение к домашнему роутеру и обновление прошивки до последней версии (в данном случае 2.0.4).

УвеличитьДалее настраивается временный роутер с подменой DNS. При отсутствии специализированного оборудования использовалась плата VS-RK3399 под Debian , сконфигурированная как роутер через hostapd и isc-dhcp-server по этим инструкциям . Конфигурация зависит от модели роутера и дистрибутива Linux. Основные использованные файлы:
- /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=VS-RK3399
channel=1
wpa=3
wpa_passphrase=1234567890
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
- /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
auto wlan0
iface wlan0 inet static
address 10.10.0.1
netmask 255.255.255.0
- /etc/dhcp/dhcpd.conf
subnet 10.10.0.0 netmask 255.255.255.0 {
range 10.10.0.2 10.10.0.16;
option domain-name-servers 10.10.0.1, 208.67.222.222;
option routers 10.10.0.1;
}
Следующий шаг – настройка подмены DNS. Первоначально тестировался dnsmasq с успешной проверкой через dig, но устройства всё равно соединялись с сервером ITEAD. Успех достигнут с dnsspoof. Установка в Debian:
sudo apt install dsniff
Конфигурационный файл /etc/dnsspoof.conf для перенаправления на ноутбук:
10.10.0.4 *-disp.coolkit.cc
Запуск:
sudo dnsspoof -i wlan0 -f /etc/dnsspoof.conf
dnsspoof: listening on wlan0 [udp dst port 53 and not src
10.10.0.1] 10.10.0.3.4096 > 8.8.4.4.53: 33432+ A? cn-disp.coolkit.cc
10.10.0.2.34067 > 8.8.4.4.53: 42715+ A? cn-disp.coolkit.cc
Настройка DNS-спуфинга заняла больше всего времени: помимо перезапуска служб, требовалась перезагрузка подключённых устройств. Эксперименты с файлами /etc/hosts в роутере и ноутбуке оказались излишними – важно только перенаправление запросов устройства Sonoff.
Перейдём к настройке Wi-Fi ноутбука. SonOTA работает под Linux и Windows; использовалась Ubuntu 16.04. Создаём рабочую директорию, загружаем код SonOTA и устанавливаем зависимости:
mkdir sonoff
cd sonoff
git clone https://github.com/mirko/SonOTA.git
cd SonOTA
sudo apt install python3-pip
sudo pip3 install --upgrade pip
sudo pip3 install -r requirements.txt
Запускаем скрипт SonOTA в режимах legacy и no provision:
sudo ./sonota.py --legacy --no-prov
После выбора Wi-Fi интерфейса, ввода SSID и пароля начинается поиск устройства:
Select IP address of the WiFi interface:
0: 10.10.0.4
Select IP address [0]:
WiFi SSID: VS-RK3399
WiFi Password: 12345667890
Using the following configuration:
Server IP Address: 10.10.0.4
WiFi SSID: VS-RK3399
WiFi Password: 12345667890
Starting stage2...
~~ Starting web server (HTTP port: 8080, HTTPS port 443)
~~ Waiting for device to connect
*** IMPORTANT! ***
** AFTER the first download is COMPLETE, with in a minute or so you should connect to the new SSID "FinalStage" to finish the process.
** ONLY disconnect when the new "FinalStage" SSID is visible as an available WiFi network.
This server should automatically be allocated the IP address: 192.168.4.2.
If you have successfully connected to "FinalStage" and this is not the IP Address you were allocated, please ensure no other device has connected, and reboot your Sonoff.
..........
Удалите устройство в eWelink, перезапустите сопряжение, подключив его к временному роутеру с включённой подменой DNS. Скрипт SonOTA начнёт передачу образа:
*** IMPORTANT! ***
** AFTER the first download is COMPLETE, with in a minute or so you should connect to the new SSID "FinalStage" to finish the process.
** ONLY disconnect when the new "FinalStage" SSID is visible as an available WiFi network.
This server should automatically be allocated the IP address: 192.168.4.2.
If you have successfully connected to "FinalStage" and this is not the IP Address you were allocated, please ensure no other device has connected, and reboot your Sonoff.
....<< HTTP POST /dispatch/device
>> /dispatch/device
>> {
"IP": "10.10.0.4",
"reason": "ok",
"port": 443,
"error": 0
}
2017-10-03 19:42:23,718 (INFO) 200 POST /dispatch/device (10.10.0.5) 2.49ms
2017-10-03 19:42:23,899 (INFO) 101 GET /api/ws (10.10.0.5) 2.26ms
2017-10-03 19:42:23,900 (DEBUG) << WEBSOCKET OPEN
2017-10-03 19:42:23,907 (DEBUG) << WEBSOCKET INPUT
2017-10-03 19:42:23,907 (DEBUG) << {
"model": "PSC-B01-GL",
"apikey": "760af2ff-d31f-40e2-88da-ae940c70a7ab",
"romVersion": "2.0.4",
"ts": 511,
"userAgent": "device",
"action": "register",
"version": 2,
"deviceid": "100002e69a"
}
~~~ device sent action request, acknowledging / answering...
2017-10-03 19:42:23,908 (INFO) We are dealing with a PSC-B01-GL model.
~~~~ register
>> {
"config": {
"hbInterval": 145,
"hb": 1
},
"apikey": "07c5f29c-ffe2-4f71-b556-e95c2549a985",
"deviceid": "100002e69a",
"error": 0
}
2017-10-03 19:42:23,916 (DEBUG) << WEBSOCKET INPUT
2017-10-03 19:42:23,916 (DEBUG) << {
"userAgent": "device",
"action": "date",
"apikey": "07c5f29c-ffe2-4f71-b556-e95c2549a985",
"deviceid": "100002e69a"
}
~~~ device sent action request, acknowledging / answering...
~~~~ date
>> {
"date": "2017-10-03T19:42:23.917Z",
"apikey": "07c5f29c-ffe2-4f71-b556-e95c2549a985",
"deviceid": "100002e69a",
"error": 0
}
2017-10-03 19:42:23,926 (DEBUG) << WEBSOCKET INPUT
2017-10-03 19:42:23,926 (DEBUG) << {
"userAgent": "device",
"action": "update",
"params": {
"switch": "off",
"power": "0",
"startup": "off",
"staMac": "5C:CF:7F:20:DA:5B",
"fwVersion": "2.0.4",
"rssi": -60
},
"apikey": "07c5f29c-ffe2-4f71-b556-e95c2549a985",
"deviceid": "100002e69a"
}
~~~ device sent action request, acknowledging / answering...
~~~~ update
>> {
"apikey": "07c5f29c-ffe2-4f71-b556-e95c2549a985",
"deviceid": "100002e69a",
"error": 0
}
>> {
"params": {
"switch": "off"
},
"apikey": "07c5f29c-ffe2-4f71-b556-e95c2549a985",
"from": "hackepeter",
"ts": 0,
"userAgent": "app",
"action": "update",
"sequence": "1507034543928",
"deviceid": "100002e69a"
}
>> {
"params": {
"switch": "on"
},
"apikey": "07c5f29c-ffe2-4f71-b556-e95c2549a985",
"from": "hackepeter",
"ts": 0,
"userAgent": "app",
"action": "update",
"sequence": "1507034543928",
"deviceid": "100002e69a"
}
>> {
"params": {
"switch": "off"
},
"apikey": "07c5f29c-ffe2-4f71-b556-e95c2549a985",
"from": "hackepeter",
"ts": 0,
"userAgent": "app",
"action": "update",
"sequence": "1507034543929",
"deviceid": "100002e69a"
}
>> {
"params": {
"switch": "on"
},
"apikey": "07c5f29c-ffe2-4f71-b556-e95c2549a985",
"from": "hackepeter",
"ts": 0,
"userAgent": "app",
"action": "update",
"sequence": "1507034543929",
"deviceid": "100002e69a"
}
>> {
"params": {
"switch": "off"
},
"apikey": "07c5f29c-ffe2-4f71-b556-e95c2549a985",
"from": "hackepeter",
"ts": 0,
"userAgent": "app",
"action": "update",
"sequence": "1507034543929",
"deviceid": "100002e69a"
}
>> {
"params": {
"model": "PSC-B01-GL",
"binList": [
{
"downloadUrl": "http://10.10.0.4:8080/ota/image_user1-0x01000.bin",
"name": "user1.bin",
"digest": "97fe70d737390bbde7b8d208c79d590e29fc76962623c7bd198ee210210ea616"
},
{
"downloadUrl": "http://10.10.0.4:8080/ota/image_user2-0x81000.bin",
"name": "user2.bin",
"digest": "e6d0cbb641542bd0a27e6c4628fc9331f1f5d3ac3afa42c9307569cf4d70fcdc"
}
],
"version": "23.42.5"
},
"apikey": "07c5f29c-ffe2-4f71-b556-e95c2549a985",
"ts": 0,
"userAgent": "app",
"action": "upgrade",
"sequence": "1507034543936",
"deviceid": "100002e69a"
}
...<< HTTP POST /dispatch/device
>> /dispatch/device
>> {
"IP": "10.10.0.4",
"reason": "ok",
"port": 443,
"error": 0
}
2017-10-03 19:42:30,162 (INFO) 200 POST /dispatch/device (10.10.0.5) 2.14ms
2017-10-03 19:42:30,338 (INFO) 101 GET /api/ws (10.10.0.5) 1.78ms
2017-10-03 19:42:30,338 (DEBUG) << WEBSOCKET OPEN
2017-10-03 19:42:30,346 (DEBUG) << WEBSOCKET INPUT
2017-10-03 19:42:30,347 (DEBUG) << {
"model": "PSC-B01-GL",
"apikey": "760af2ff-d31f-40e2-88da-ae940c70a7ab",
"romVersion": "2.0.4",
"ts": 744,
"userAgent": "device",
"action": "register",
"version": 2,
"deviceid": "100002e69a"
}
~~~ device sent action request, acknowledging / answering...
2017-10-03 19:42:30,347 (INFO) We are dealing with a PSC-B01-GL model.
~~~~ register
>> {
"config": {
"hbInterval": 145,
"hb": 1
},
"apikey": "516a6939-be2e-4494-8ad9-94d836df2a64",
"deviceid": "100002e69a",
"error": 0
}
2017-10-03 19:42:30,357 (DEBUG) << WEBSOCKET INPUT
2017-10-03 19:42:30,357 (DEBUG) << {
"userAgent": "device",
"action": "date",
"apikey": "516a6939-be2e-4494-8ad9-94d836df2a64",
"deviceid": "100002e69a"
}
~~~ device sent action request, acknowledging / answering...
~~~~ date
>> {
"date": "2017-10-03T19:42:30.358Z",
"apikey": "516a6939-be2e-4494-8ad9-94d836df2a64",
"deviceid": "100002e69a",
"error": 0
}
2017-10-03 19:42:30,367 (DEBUG) << WEBSOCKET INPUT
2017-10-03 19:42:30,369 (DEBUG) << {
"userAgent": "device",
"action": "update",
"params": {
"switch": "off",
"power": "0",
"startup": "off",
"staMac": "5C:CF:7F:20:DA:5B",
"fwVersion": "2.0.4",
"rssi": -65
},
"apikey": "516a6939-be2e-4494-8ad9-94d836df2a64",
"deviceid": "100002e69a"
}
~~~ device sent action request, acknowledging / answering...
~~~~ update
>> {
"apikey": "516a6939-be2e-4494-8ad9-94d836df2a64",
"deviceid": "100002e69a",
"error": 0
}
>> {
"params": {
"switch": "off"
},
"apikey": "516a6939-be2e-4494-8ad9-94d836df2a64",
"from": "hackepeter",
"ts": 0,
"userAgent": "app",
"action": "update",
"sequence": "1507034550370",
"deviceid": "100002e69a"
}
>> {
"params": {
"switch": "on"
},
"apikey": "516a6939-be2e-4494-8ad9-94d836df2a64",
"from": "hackepeter",
"ts": 0,
"userAgent": "app",
"action": "update",
"sequence": "1507034550370",
"deviceid": "100002e69a"
}
>> {
"params": {
"switch": "off"
},
"apikey": "516a6939-be2e-4494-8ad9-94d836df2a64",
"from": "hackepeter",
"ts": 0,
"userAgent": "app",
"action": "update",
"sequence": "1507034550370",
"deviceid": "100002e69a"
}
>> {
"params": {
"switch": "on"
},
"apikey": "516a6939-be2e-4494-8ad9-94d836df2a64",
"from": "hackepeter",
"ts": 0,
"userAgent": "app",
"action": "update",
"sequence": "1507034550371",
"deviceid": "100002e69a"
}
>> {
"params": {
"switch": "off"
},
"apikey": "516a6939-be2e-4494-8ad9-94d836df2a64",
"from": "hackepeter",
"ts": 0,
"userAgent": "app",
"action": "update",
"sequence": "1507034550371",
"deviceid": "100002e69a"
}
>> {
"params": {
"model": "PSC-B01-GL",
"binList": [
{
"downloadUrl": "http://10.10.0.4:8080/ota/image_user1-0x01000.bin",
"name": "user1.bin",
"digest": "97fe70d737390bbde7b8d208c79d590e29fc76962623c7bd198ee210210ea616"
},
{
"downloadUrl": "http://10.10.0.4:8080/ota/image_user2-0x81000.bin",
"name": "user2.bin",
"digest": "e6d0cbb641542bd0a27e6c4628fc9331f1f5d3ac3afa42c9307569cf4d70fcdc"
}
],
"version": "23.42.5"
},
"apikey": "516a6939-be2e-4494-8ad9-94d836df2a64",
"ts": 0,
"userAgent": "app",
"action": "upgrade",
"sequence": "1507034550378",
"deviceid": "100002e69a"
}
2017-10-03 19:42:30,953 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1270216262&sign=fd10a78457d4291cff343d52f3098bb04f029a2572867add32d45276f09f1d29 (10.10.0.5) 61.97ms
2017-10-03 19:42:31,047 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1191391529&sign=311c4ccf9977775ff83dcece17b60fc258e40d5d96ee7540f0e0421da230891f (10.10.0.5) 2.32ms
2017-10-03 19:42:31,158 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=812669700&sign=578e7b03bdace2d81335e15552590eeb13e77983a119eda4d8a11618319e4162 (10.10.0.5) 2.31ms
2017-10-03 19:42:31,264 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=553475508&sign=18e911f94392e98f04af16df743bfa0668aa590da176dc3ef0aa89632002875a (10.10.0.5) 2.63ms
2017-10-03 19:42:31,357 (DEBUG) ~~ websocket close
2017-10-03 19:42:31,361 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=445349752&sign=013ff6ac7ced459e8028788b8ef302ec105e94bfc8e2de17166b01931742232e (10.10.0.5) 2.77ms
2017-10-03 19:42:31,452 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1344887256&sign=308c88598f4ad10eaa89d241620555e02395a83ce28780d80cdac4814d3d1660 (10.10.0.5) 2.35ms
2017-10-03 19:42:31,543 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=730417256&sign=dd877ce498dfc1980c606e98b71680ad8ab361e3d47b2e4b01ebbe5659f62c28 (10.10.0.5) 2.23ms
.2017-10-03 19:42:31,640 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1812158119&sign=d09e14bc168e2aca11903f6a0681b26fb091d938b80675dba2e5cb2f5e66d098 (10.10.0.5) 2.28ms
2017-10-03 19:42:31,735 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=147699711&sign=e066d2ae4bf68722a33790bdcbc061c82f35935810a30f11292b6229aeb216e9 (10.10.0.5) 2.52ms
2017-10-03 19:42:31,832 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=880268351&sign=f36fc681e71e091efeadaa41806ec817bb7bd01023a255650508f3000fc31d77 (10.10.0.5) 2.26ms
2017-10-03 19:42:31,926 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1889772843&sign=07572f87914c114fb9db13fad29df1efeefb60ba8942862b265e7d37f1b8a101 (10.10.0.5) 2.60ms
2017-10-03 19:42:32,022 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=686078705&sign=8c11145f2d51fc1547c61270a9497b56c7ffe1d833a2cd95f7430a701d99f68b (10.10.0.5) 2.20ms
2017-10-03 19:42:32,116 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=2105754108&sign=88742a243b1a654c7eabaff54f2aaa59dd91f6c60d742c7d23e57dcd817f96b2 (10.10.0.5) 2.54ms
2017-10-03 19:42:32,207 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=182546393&sign=12d09040c83d9c44ab9657506ca04cdccd444824343adc354b0e2414b06cd051 (10.10.0.5) 2.90ms
2017-10-03 19:42:32,303 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1949118330&sign=f69eafb34d3aa14b16271542be62cb4aec14b8e0f5fe0405ecb5260cf94521ae (10.10.0.5) 2.52ms
2017-10-03 19:42:32,396 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=220137366&sign=bda83212d9cfe5cfaf06a3aced36d660897e64c106d2acfa49ce4784a4e29d35 (10.10.0.5) 2.58ms
2017-10-03 19:42:32,487 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1979932169&sign=8d755de4b206ec57b0327e8311e39e545d9fda29ddb72da97ce39876e02dc24c (10.10.0.5) 2.45ms
2017-10-03 19:42:32,575 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1089957932&sign=f2a0ef1e42420b726e0b43c11807c9336962d7b36d80d01ed95ebad73ae8b37b (10.10.0.5) 2.71ms
2017-10-03 19:42:32,669 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1873226917&sign=f14a027a43c9c883639cb646daeac70bda54fbf56be71f693e7ca42f76659ef7 (10.10.0.5) 2.70ms
2017-10-03 19:42:32,758 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=715669847&sign=0a008860196ebe960d7b2f716764aa37575a637958cf144f9638cee0de93351f (10.10.0.5) 2.39ms
2017-10-03 19:42:32,851 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1486937972&sign=60bf9980ff26178994a32c4f33592a63bd374cf891b7562d88bd6642f4fc3cb4 (10.10.0.5) 2.57ms
2017-10-03 19:42:32,945 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1196032868&sign=c6903c40d5748803f80ee2766166572740a6e3c59ea93b3ed9bdd97968905408 (10.10.0.5) 2.75ms
2017-10-03 19:42:33,039 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=777206980&sign=1af0646cd2ed8a6ca2c3cf9333b88f82cbcc5e47578f285c56e34a279d5a38a9 (10.10.0.5) 2.16ms
2017-10-03 19:42:33,128 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=68706223&sign=164ba73dc79e33154a58c98946852e5658ebff5b5ac437444d5ceb12f0f2523a (10.10.0.5) 2.27ms
2017-10-03 19:42:33,227 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1843638549&sign=1b8ec3ae3aec180efe751f3d33701b5a0635c698a9817aa03654e73910d16e32 (10.10.0.5) 2.25ms
2017-10-03 19:42:33,318 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=212567592&sign=78e1db477c421d42bce44ac9b0b6693891c8333c9545f17df05fd21aef8aac05 (10.10.0.5) 2.20ms
2017-10-03 19:42:33,412 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1883488164&sign=a81127ce132efbc36b18f1089f063930fe6d7114686d2e9e33532a241a432795 (10.10.0.5) 2.32ms
2017-10-03 19:42:33,502 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=964776169&sign=199b22e0fafbb45325d858cb850a7b853e98d28c02d01f6edb1c8818d893b2e4 (10.10.0.5) 2.20ms
2017-10-03 19:42:33,592 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=928126551&sign=525ce5b6c498be10a81e03bc2186d6517be1a05cb0c701213c1384ff45e47312 (10.10.0.5) 2.28ms
.2017-10-03 19:42:33,699 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1301950427&sign=5419687f4dda79ce7657a59c2fc06e3e63bff509be34fe86a26e02adb38d48b4 (10.10.0.5) 2.38ms
2017-10-03 19:42:33,791 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1992516190&sign=48b22a2ee09e002ec218b8942a95ec5b07c906abf6bf120e0e65e07ddbfd7bd4 (10.10.0.5) 2.31ms
2017-10-03 19:42:33,887 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1426542624&sign=1354ed17f7fc03bf13f02715c5fd96ac90594de7fbcf831a6a4cb1fdca759910 (10.10.0.5) 2.80ms
2017-10-03 19:42:33,980 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=849040635&sign=0a7c403918b963e8bf55a899276e4df6fee7a8a27f550db6fda51bb9d2530506 (10.10.0.5) 2.52ms
2017-10-03 19:42:34,073 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=941604920&sign=e18cc14bfa95072333622786adcbcc99ceb0f646c0897c52bcba0ad69eb47b0c (10.10.0.5) 2.92ms
2017-10-03 19:42:34,161 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1400427944&sign=bae86156e1d5ba790e45b6e2062eb9f2f5af68e9b8489e282ac9e45bf7d730b1 (10.10.0.5) 2.36ms
2017-10-03 19:42:34,254 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1994719310&sign=a481dd46c0f67febaa3e946c5e217a575434f80aec3c69e009c54d3952fdf06d (10.10.0.5) 2.63ms
2017-10-03 19:42:34,343 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=2038269862&sign=94cdcbefba7cddeb788c9a1c024b5f31db3f952c928f569d1ed4d1f1da25c91c (10.10.0.5) 2.66ms
2017-10-03 19:42:34,436 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=659998484&sign=a8545965acffd89b9c3f69370f8d7e87236b903b02cfe0b706b600ad686bac6c (10.10.0.5) 2.76ms
2017-10-03 19:42:34,525 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1280937363&sign=21606617cb026ce8c27bfacb5e2b53a6c469c74c6b56b0e08edc9980a4c85654 (10.10.0.5) 2.49ms
2017-10-03 19:42:34,617 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1681643301&sign=bd3d994d818b33608cbd0d3e0c2d508c5fb2b71db9bf50825a8d35aeb24cd0f3 (10.10.0.5) 2.73ms
2017-10-03 19:42:34,705 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=725914710&sign=578b30170d6ae20f72711f5b13d833c47f2279291f1b3a024ccb2af12eca3ff3 (10.10.0.5) 2.59ms
2017-10-03 19:42:34,796 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1729267236&sign=088233ab0ea18893351fe9a8b14f2bb64a0d02c673a729cebd48c97d6ef02848 (10.10.0.5) 2.24ms
2017-10-03 19:42:34,888 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=2023351876&sign=b960e05fa79a44a64ebac14c7adb57a99d61f2779a8817a07d92063dd31b0884 (10.10.0.5) 2.86ms
2017-10-03 19:42:34,978 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=142750431&sign=51cbb8f929dec3f309ddae1781faea7fc7bf3536f856eff33bd9502875e7fd33 (10.10.0.5) 2.23ms
2017-10-03 19:42:35,066 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1840579929&sign=fe073216817dbb2e8fc236aee730920c96ac12acdf3c642b4fd5ea7735436355 (10.10.0.5) 2.45ms
2017-10-03 19:42:35,156 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=2098560397&sign=112e857648f0138b8ef706020f8e5d9b58890b01cbd6e95eeb996e00ca935c96 (10.10.0.5) 2.60ms
2017-10-03 19:42:35,247 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1910500675&sign=c5e9096dfef0258b09faeb2d8c27fab95b2c8dde6420dc13bbd435f36706df82 (10.10.0.5) 2.17ms
2017-10-03 19:42:35,340 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1170970491&sign=b5da238a364456a64091ef971ac58177fb7973678306e28fb507381487d1f5b2 (10.10.0.5) 2.14ms
2017-10-03 19:42:35,433 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1856224190&sign=8350eb9bd126db03bf588a80012c924d0b79dc2a38110e868101e97b54311ccd (10.10.0.5) 2.95ms
2017-10-03 19:42:35,519 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=983059344&sign=da6be0445944a1ca02f06b21292915e0398458a65d5b4adabf9da2b41b1b7c86 (10.10.0.5) 2.22ms
2017-10-03 19:42:35,610 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1718458134&sign=3426190f48bd7618191c2e17ca2ae8d5cc635cce19f46b905d9c6bd7d82402f3 (10.10.0.5) 2.31ms
.
*** IMPORTANT! ***
** AFTER the first download is COMPLETE, with in a minute or so you should connect to the new SSID "FinalStage" to finish the process.
** ONLY disconnect when the new "FinalStage" SSID is visible as an available WiFi network.
This server should automatically be allocated the IP address: 192.168.4.2.
If you have successfully connected to "FinalStage" and this is not the IP Address you were allocated, please ensure no other device has connected, and reboot your Sonoff.
2017-10-03 19:42:35,701 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1876268425&sign=a6fc5367e9521377a21cb52ed1b2286e8f500e007ac9b02be9657a988b6eb170 (10.10.0.5) 2.63ms
2017-10-03 19:42:35,793 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1764841629&sign=0a8a4f9fb04191b5bc12891a6f328cebe108e8da1c954b26fe2e08c0e46223c3 (10.10.0.5) 2.30ms
2017-10-03 19:42:35,882 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=398844030&sign=3937f8347368d122cdd14d62739c17ef82885df5c690f20c143531cccafb1d92 (10.10.0.5) 2.22ms
2017-10-03 19:42:35,972 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=185252727&sign=926c8244244b6254391b3b5305f6848b1db80621ec7f33e5296c1408bb076fa2 (10.10.0.5) 2.18ms
2017-10-03 19:42:36,063 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=1370429126&sign=7a97d84de3d6dba62e92e3d974abc39be286789772fb22c23d52f9bd86b47302 (10.10.0.5) 2.92ms
2017-10-03 19:42:36,156 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=502141743&sign=30837581215c075b85fb86ad6dbf69f3757597874f454460ce63d69c976a6bf1 (10.10.0.5) 2.34ms
2017-10-03 19:42:36,242 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=993687334&sign=ecdfca3b109d906c75b8204df48d5b9d61bffb62e9e570eafb047b497dc39e8c (10.10.0.5) 2.37ms
2017-10-03 19:42:36,331 (INFO) 206 GET /ota/image_user1-0x01000.bin?deviceid=100002e69a&ts=15934104&sign=29b916c6e9f45e9e1e35c22862732de0202682f88197ff76309916ef57e1ef88 (10.10.0.5) 2.07ms
2017-10-03 19:42:36,670 (DEBUG) << WEBSOCKET INPUT
2017-10-03 19:42:36,670 (DEBUG) << {
"userAgent": "device",
"sequence": "1507034550378",
"apikey": "516a6939-be2e-4494-8ad9-94d836df2a64",
"deviceid": "100002e69a",
"error": 0
}
2017-10-03 19:42:36,670 (DEBUG) ~~~ device acknowledged our action request (seq 1507034550378) with error code 0
..........
*** IMPORTANT! ***
** AFTER the first download is COMPLETE, with in a minute or so you should connect to the new SSID "FinalStage" to finish the process.
** ONLY disconnect when the new "FinalStage" SSID is visible as an available WiFi network.
This server should automatically be allocated the IP address: 192.168.4.2.
If you have successfully connected to "FinalStage" and this is not the IP Address you were allocated, please ensure no other device has connected, and reboot your Sonoff.
..........
Now you should be able to use your smartphone or the laptop to connect to FinalStage access point, start a browser to access http://192.168.4.2. You should see the interface below, click on scan for Wifi network, and select the one you want to replace indebuurt1 SSID, in order to connect to your “home router”.

Нажмите Save внизу страницы, после чего веб-интерфейс Sonoff станет доступен в домашней сети.
Лог скрипта SonOTA.py:
*** IMPORTANT! ***
** AFTER the first download is COMPLETE, with in a minute or so you should connect to the new SSID "FinalStage" to finish the process.
** ONLY disconnect when the new "FinalStage" SSID is visible as an available WiFi network.
This server should automatically be allocated the IP address: 192.168.4.2.
If you have successfully connected to "FinalStage" and this is not the IP Address you were allocated, please ensure no other device has connected, and reboot your Sonoff.
......
The "FinalStage" SSID will disappear when the device has been fully flashed and image_arduino.bin has been installed
Once "FinalStage" has gone away, you can stop this program
2017-10-03 19:45:33,896 (INFO) 200 GET /ota/image_user2-0x81000.bin (192.168.4.1) 7982.32ms
2017-10-03 19:45:54,344 (INFO) 200 GET /ota/image_arduino.bin (192.168.4.1) 9377.57ms
The "FinalStage" SSID will disappear when the device has been fully flashed and image_arduino.bin has been installed
Once "FinalStage" has gone away, you can stop this program
No longer on "FinalStage" SSID, all done!
2017-10-03 19:46:27,920 (INFO) Quitting.
Успех! Теперь можно настроить Sonoff-Tasmota под конкретное устройство (в данном случае Sonoff POW вместо Sonoff Basic). Детали тестирования Sonoff B1 будут освещены в следующей публикации. Выбор между последовательным и OTA-методом зависит от количества устройств и предпочтений: пайка или сетевая настройка. Для массового обновления ламп Sonoff B1 оптимально контактное приспособление с пружинными иглами.
Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.