feat: manual Gitea build workflow, release publishing, README and docs update

- добавлен ручной workflow Gitea Actions (.gitea/workflows/build-mqtt-firmwares.yml):
  сборка MQTT-прошивок на сервере и публикация релиза
- добавлен posadmesh-tools/publish-gitea-release.sh для выгрузки собранных файлов
  в релиз Gitea (идемпотентно, фильтр по треку)
- README: происхождение проекта переписано (форк EastMesh, доработка энтузиастов
  из Сергиева Посада, ориентация на meshcoretel.ru), добавлены раздел
  «Отличия от upstream MeshCore» и журнал «Изменения в проекте»
- убраны упоминания Австралии, ссылки на eastmesh.au и региональные материалы;
  руководство по прошивке переведено на файлы релизов и esptool.py
- posadmesh-build.sh: вывод PlatformIO очищается от \r — на Windows групповые
  команды сборки не находили ни одной цели; companion-команды удалены,
  добавлены build-mqtt-firmwares и list-mqtt
- release-notes.yml: треки repeater-mqtt*, запись 2026.10.0 дополнена удалением
  companion и исправлением сборки, companion-wifi помечен как снятый с выпуска
- AGENTS.md: правило дописывать изменения в README
- .gitignore: .pio-home
This commit is contained in:
2026-10-11 17:20:05 +03:00
parent c86ae584ab
commit 26b724c0f0
19 changed files with 735 additions and 616 deletions
+17 -102
View File
@@ -16,7 +16,7 @@ set mqtt.iata <code>
get mqtt.status
```
Для обсерверов с локальной веб-панелью также полезны:
Для MQTT-репитеров с локальной веб-панелью также полезны:
```text
set web on
@@ -24,11 +24,11 @@ get web.status
set web off
```
Используйте `set web on` при настройке или диагностике, а затем `set web off`, когда стационарному обсерверу нужен максимальный запас памяти.
Используйте `set web on` при настройке или диагностике, а затем `set web off`, когда стационарному MQTT-репитеру нужен максимальный запас памяти.
## Команды обсервера
## Команды MQTT-репитера
Эти команды доступны в таргетах прошивки `*_repeater_observer`.
Эти команды доступны в таргетах прошивки `*_repeater_mqtt`.
Команды `get` без аргументов нужно вводить точно так, как показано.
@@ -80,7 +80,7 @@ set web off
Примечания:
- новые установки обсерверов по умолчанию задают для `mqtt.iata` значение `UNSET`
- новые установки MQTT-репитеров по умолчанию задают для `mqtt.iata` значение `UNSET`
- одновременно можно включить максимум два MQTT-брокера
- если `mqtt.iata` имеет значение `UNSET`, включённые MQTT-брокеры не подключатся
- пользовательский MQTT использует настроенные имя пользователя и пароль, а не аутентификацию JWT
@@ -94,7 +94,7 @@ set web off
- `mqtt.meshcoretel.ru`
### Настройки Wi-Fi для обсерверов
### Настройки Wi-Fi для MQTT-репитеров
- `get wifi.status`: показывает SSID, состояние подключения, необработанный код статуса Wi-Fi, IP, канал и уровень сигнала при подключении, а также состояние шлюза (`gw:ok|lost`) и счётчик переподключений сторожевым таймером (`wd:<n>`).
- `get wifi.ssid`: показывает настроенный SSID Wi-Fi.
@@ -104,9 +104,9 @@ set web off
- `set wifi.powersaving none|min|max`: задаёт режим энергосбережения Wi-Fi.
- `wifi reconnect`: разрывает текущее соединение и переподключается с полным сканированием каналов. Используйте, когда узел сообщает о подключении, но недоступен по сети.
Обсерверы также используют сторожевой таймер связи: пока Wi-Fi сообщает о подключении, узел каждые 30 секунд проверяет свой шлюз через ARP. Если шлюз молчит 3 минуты (например, точка доступа, которая продолжает рассылать beacon после потери проводного аплинка), узел сам принудительно выполняет полное переподключение, увеличивая интервал между попытками вплоть до 48 минут, пока сбой не прекратится. `wd:<n>` в `get wifi.status` считает такие принудительные переподключения с момента загрузки.
MQTT-репитеры также используют сторожевой таймер связи: пока Wi-Fi сообщает о подключении, узел каждые 30 секунд проверяет свой шлюз через ARP. Если шлюз молчит 3 минуты (например, точка доступа, которая продолжает рассылать beacon после потери проводного аплинка), узел сам принудительно выполняет полное переподключение, увеличивая интервал между попытками вплоть до 48 минут, пока сбой не прекратится. `wd:<n>` в `get wifi.status` считает такие принудительные переподключения с момента загрузки.
### Настройки NTP для обсерверов
### Настройки NTP для MQTT-репитеров
- `get ntp.server1`: показывает основной NTP-сервер.
- `get ntp.server2`: показывает дополнительный NTP-сервер.
@@ -117,20 +117,20 @@ set web off
Серверы по умолчанию: `au.pool.ntp.org`, `time.google.com` и `time.cloudflare.com`.
### Настройки моста ESP-NOW для сборок Observer ESP-NOW
### Настройки моста ESP-NOW для сборок MQTT ESP-NOW
Эти команды доступны в таргетах прошивки `*_repeater_observer_espnow`, использующих транспорт моста ESP-NOW.
Эти команды доступны в таргетах прошивки `*_repeater_mqtt_espnow`, использующих транспорт моста ESP-NOW.
Команды моста предназначены для локального использования моста ESP-NOW между близко расположенными репитерами, например для связи репитеров в `Australia (Narrow)` и `Australia (Mid)`. Это не элементы управления MQTT-over-WAN, VPN или интернет-мостом.
Команды моста предназначены для локального использования моста ESP-NOW между близко расположенными репитерами, работающими на разных радиоконфигурациях MeshCore — например, с разной полосой пропускания и SF. Это не элементы управления MQTT-over-WAN, VPN или интернет-мостом.
- `get bridge.channel`: показывает настроенный канал моста ESP-NOW.
- `set bridge.channel <channel>`: задаёт канал моста ESP-NOW и перезапускает мост. Используйте значение от `1` до `14`.
- `get bridge.secret`: показывает настроенный секрет моста ESP-NOW.
- `set bridge.secret <secret>`: задаёт общий секрет моста ESP-NOW и перезапускает мост.
После выполнения `set bridge.channel` ожидайте кратковременного разрыва соединения моста и веб-панели, пока радио перезапускается. В текущих сборках observer ESP-NOW это может выглядеть как перезагрузка платы.
После выполнения `set bridge.channel` ожидайте кратковременного разрыва соединения моста и веб-панели, пока радио перезапускается. В текущих сборках MQTT ESP-NOW это может выглядеть как перезагрузка платы.
В сборках `*_repeater_observer_espnow`, подключённых к Wi-Fi, канал моста ESP-NOW должен совпадать с активным каналом Wi-Fi 2,4 ГГц:
В сборках `*_repeater_mqtt_espnow`, подключённых к Wi-Fi, канал моста ESP-NOW должен совпадать с активным каналом Wi-Fi 2,4 ГГц:
1. Выполните `get wifi.status`.
2. Считайте значение `channel:<n>` из статуса подключённого Wi-Fi.
@@ -177,11 +177,11 @@ OK
- `get flood.max.advert`: показывает лимит хопов для flood-пакетов advert.
- `set flood.max.advert <0-64>`: задаёт лимит хопов для flood-пакетов advert.
В сборках обсерверов `flood.max.unscoped` по умолчанию равен `64`. Меньшие значения могут ограничить, как далеко повторяется неограниченный flood-трафик, тогда как пересылка scoped/region flood остаётся под управлением `flood.max`.
В сборках MQTT-репитеров `flood.max.unscoped` по умолчанию равен `64`. Меньшие значения могут ограничить, как далеко повторяется неограниченный flood-трафик, тогда как пересылка scoped/region flood остаётся под управлением `flood.max`.
### Отчётность о батарее платы
- В сборках обсерверов фоновый опрос батареи, используемый для истории MQTT/статуса, ограничен примерно одним разом в минуту. Явные запросы статуса и телеметрии по-прежнему обновляют показание сразу.
- В сборках MQTT-репитеров фоновый опрос батареи, используемый для истории MQTT/статуса, ограничен примерно одним разом в минуту. Явные запросы статуса и телеметрии по-прежнему обновляют показание сразу.
### Управление вентилятором T-Beam 1W
@@ -217,96 +217,11 @@ OK
- панель по-прежнему использует для доступа пароль администратора репитера
- команды выполняются с той же осторожностью, как если бы вы вводили их напрямую в CLI репитера
- это предназначено для локального административного использования в доверенной сети
- `start ota` освобождает локальный слушатель HTTP-редиректа на порту `80`, чтобы слушатель OTA HTTP мог занять его, не останавливая остальные службы репитера, независимо от того, выполнена ли команда из веб-панели, последовательного CLI или удалённого сеанса CLI companion/приложения
- `start ota` освобождает локальный слушатель HTTP-редиректа на порту `80`, чтобы слушатель OTA HTTP мог занять его, не останавливая остальные службы репитера, независимо от того, выполнена ли команда из веб-панели, последовательного CLI или удалённого сеанса CLI
- если старый слушатель редиректа не освободил порт `80` полностью, слушатель OTA повторяет попытки примерно до 30 секунд, после чего сдаётся
- кнопка `Purge SD` в веб-интерфейсе выполняет `purge sd` после подтверждения в браузере
- `start ota` использует существующий Wi-Fi-адрес репитера, если он уже подключён, или запускает точку доступа `MeshCore-OTA`, если Wi-Fi не подключён
- ярлык Regions в `/app` последовательно выполняет существующие команды регионов MeshCore: `region put au`, `region put au-STATE`, `region allowf au`, `region allowf au-STATE`, затем `region save`
## Команды восстановления Wi-Fi для companion
Эти команды доступны в последовательном CLI восстановления для сборок `*_companion_radio_wifi`.
Чтобы войти в `CLI Rescue`:
- откройте последовательный монитор на скорости `115200` бод
- перезагрузите устройство
- удерживайте кнопку пользователя в течение первых 8 секунд после загрузки
- дождитесь `========= CLI Rescue =========`
- `get wifi.status`: показывает настроенный SSID, состояние подключения, необработанный код статуса Wi-Fi, IP, канал и уровень сигнала при подключении.
- `get wifi.ssid`: показывает настроенный SSID Wi-Fi.
- `get wifi.powersaving`: показывает текущий режим энергосбережения Wi-Fi.
- `set wifi.ssid <ssid>`: сохраняет SSID Wi-Fi и сразу повторяет подключение.
- `set wifi.pwd <password>`: сохраняет пароль Wi-Fi и сразу повторяет подключение.
- `set wifi.powersaving none|min|max`: изменяет режим энергосбережения Wi-Fi.
Сборки Companion Wi-Fi также по-прежнему поддерживают существующие команды восстановления, такие как:
- `set pin <6-digit-pin>`
- `rebuild`
- `erase`
- `ls ...`
- `cat ...`
- `rm ...`
- `reboot`
### Точка доступа для восстановления
Когда у устройства companion Wi-Fi не настроены учётные данные Wi-Fi или оно не может подключиться
к своей настроенной сети в течение 60 секунд, оно поднимает собственную
точку доступа `EastMesh-WiFi`, чтобы его можно было восстановить без последовательного кабеля.
**Пароль точки доступа — это pin устройства, дополненный нулями до 8 цифр** (WPA2 требует
не менее 8 символов). Pin подчиняется тем же правилам, что и pin сопряжения Bluetooth в
сборках BLE:
| Устройство | Активный pin | Пароль `EastMesh-WiFi` |
| --------------------------- | ---------------------------------------------------------------------- | -------------------------------------------------------------- |
| Есть экран, pin не задан | случайный 6-значный pin при каждой загрузке, отображается как `Pin:NNNNNN` на главном экране | `00NNNNNN` — считайте его с экрана |
| Нет экрана, pin не задан | `123456` (по умолчанию) | `00123456` |
| Pin задан через `set pin <pin>` | ваш настроенный pin (любое устройство) | ваш pin, дополненный нулями до 8 цифр, например pin `4242` → `00004242` |
Примечания по pin:
- на устройствах с экраном pin случаен только до тех пор, пока pin не сохранён; выполните
`set pin <pin>` для фиксированного пароля (вступает в силу при следующей загрузке)
- устройствам без экрана в общедоступных местах всегда следует задавать собственный pin — `00123456` —
это документированное значение по умолчанию, поэтому относитесь к нему как к паролю роутера по умолчанию
Шаги восстановления:
1. подключитесь к сети `EastMesh-WiFi` с паролем из таблицы выше
2. откройте CLI восстановления командой `telnet 192.168.4.1` (или `nc 192.168.4.1 23`) — все
команды восстановления, перечисленные выше, доступны
3. `set wifi.ssid <ssid>`, затем `set wifi.pwd <password>` — устройство сразу
повторяет подключение к сети с новыми учётными данными
4. `reboot` (или просто подождите — см. ниже)
Пока точка доступа поднята, устройство продолжает повторять попытки подключения к настроенной сети примерно раз в
минуту (ожидайте короткий сбой точки доступа при каждой попытке); как только подключение станции
успешно, точка доступа восстановления автоматически отключается (это также разрывает
ваш сеанс восстановления — это признак того, что всё сработало).
### Использование приложения companion через AP (роуминг)
Точка доступа восстановления нужна не только для исправления учётных данных — через неё
доступен полный протокол companion, что делает её режимом роумингового доступа, когда устройство
находится вне своей настроенной сети:
1. подключитесь к `EastMesh-WiFi` с паролем, производным от pin (см. таблицу выше)
2. в приложении companion MeshCore добавьте/подключите Wi-Fi-устройство с хостом
`192.168.4.1` и портом `5000`
3. пользуйтесь приложением как обычно — сообщения, контакты и каналы работают через AP
Примечания по использованию в роуминге:
- один раз выполните `set pin <pin>`, чтобы пароль точки доступа оставался неизменным между перезагрузками;
иначе устройства с экраном выбирают новый случайный pin при каждой загрузке
- точка доступа появляется примерно через 60 секунд после загрузки (сначала устройство пытается
подключиться к своей настроенной сети) и работает до тех пор, пока эта сеть недоступна
- оказавшись снова в зоне действия своей настроенной сети, устройство подключается к ней и
автоматически отключает точку доступа — вместо этого переподключите приложение по адресу в локальной сети
- ярлык Regions в `/app` последовательно выполняет команды регионов MeshCore: `region put` и `region allowf` для базового региона и вложенного, затем `region save`
## Скрипт проверки состояния heap