device-settings
Настройки устройства в settings.json, пути и конфигурация бэкенда. Использовать при добавлении настройки, правке settings_store.py, .env, путей к базе и данным.
SKILL.md.claude/skills/device-settings/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/.