Переписан механизм определения offline: last_contact-based вместо TCP ping + retry для сканера
CronController::status_update_scanning():
- Устройства помечаются lost по таймауту last_contact (device_offline_threshold, default 300s)
- TCP ping fallback удалён — больше не даёт ложных active
- Сканер теперь нужен только для восстановления lost и обновления IP при роуминге
- Добавлен createDeviceScanner() для тестируемости

DeviceScanner:
- BATCH_SIZE 32 -> 8 (меньше коллизий на WiFi)
- Таймаут 1s -> 2s
- Пауза 200мс между батчами
- Retry с 500мс backoff для failed IPs

EventsController::new_event():
- Восстанавливает connection_status = active при входящем событии

DevicesRESTAPIController::device_status():
- Больше не помечает lost при временном сетевом сбое

Config:
- Добавлен device_offline_threshold (env DEVICE_OFFLINE_THRESHOLD)

Тесты: 6 новых тестов CronController, 145 tests/345 assertions — все green
1 parent 9e215eb commit 578de98edd1c5f4a0ad9605a001efe4db5932c29
@Eugene Sukhodolskiy Eugene Sukhodolskiy authored 2 days ago
Showing 7 changed files
View
server/SHServ/Controllers/CronController.php
View
server/SHServ/Controllers/DevicesRESTAPIController.php
View
server/SHServ/Controllers/EventsController.php
View
server/SHServ/Tools/DeviceScanner.php
View
server/SHServ/config.php
View
server/tests/CronControllerTest.php
View
server/tests/bootstrap.php