device-settings

Настройки устройства в settings.json, пути и конфигурация бэкенда. Использовать при добавлении настройки, правке settings_store.py, .env, путей к базе и данным.

SKILL.md

GitHub

Настройки устройства

Живут в backend/data/settings.json, а не в БД: их переносят на новый прибор, кладут в резервную копию и правят руками, когда админка недоступна — запирать их в SQLite вместе с товарами незачем. Запись атомарна (временный файл + замена): обесточивание в момент сохранения иначе оставило бы обрезанный JSON, и прибор поднялся бы на значениях по умолчанию.

В гите файла нет: он у каждого прибора свой, правится из админки, и, лежа в репозитории, давал конфликт при каждом пуле — настройки с двух машин расходятся всегда. Вместо него backend/data/settings.example.json — образец с подобранными сеткой, кеглями и цветами; при первом запуске load_settings заводит рабочий файл с него (_from_example), а не с голых умолчаний модели, чтобы прибор из коробки выглядел как надо. Меняете умолчания для всех приборов — обновите образец.

Размеры подписей, доля высоты под фото, высота и цвет плашки — оттуда же, в вёрстку приезжают CSS-переменными --ui-* на корне киоска.

Правка в админке доходит до экрана сразу

Бэкенд говорит киоску, что тронули: services/live.py держит по очереди на каждого слушателя, сокет /api/ws/updates их раздаёт, а PUT /api/settings и правки товаров зовут live.notify(). Киоск на событие перечитывает настройки или каталог — shared/live.ts плюс onDeviceChanged в kiosk/App.vue.

Так это устроено, потому что раньше настройки перечитывались только на возврате к начальному экрану, а потом их стал опрашивать таймер раз в пять секунд. Опрос не замечал правок каталога вовсе и слал запрос весь день ради события, которое случается раз в сутки. Сокет к тому же уже есть — прибор держит его ради веса.

После обрыва связи киоск перечитывает всё: что успели поменять, пока его не было, узнать уже нельзя. Номер страницы при этом удерживается в пределах каталога — оператор мог погасить товар, и страница оказалась бы за последней.

Замер: правка сетки 6 -> 4 колонки меняет экран за доли секунды без перезагрузки (12 карточек на странице стало 8, пейджер с 22 страниц на 32); переименование товара доезжает до карточки так же.

Метрологические параметры (НПВ, цена деления, наименьшая навеска) в настройках не живут — это свойства прибора, их место в .env.

Пути и конфигурация

Расположение данных не должно зависеть от того, откуда запущен процесс. Уже дважды ловили одно и то же (issues #1 и #2): относительный путь резолвится от рабочего каталога, а uvicorn запускают то из backend/, то из корня репозитория, то из systemd. Поэтому env_file абсолютный, а относительный путь в S2L_DB_URL привязывается к каталогу backend/. Каталог под базу создаём сами: SQLite этого не делает и падает с невнятным «unable to open database file».

Любой новый путь в конфиге проверяйте запуском из корня репозитория, а не только из backend/.