Страница 3 из 3

Re: Умный фуд‑вендинг: от железа до оплаты

Добавлено: 12 май 2026, 01:33
MarkT
Фактически сейчас используется одна базовая команда "open" и в ответ получаем "openok"
Завтра будет допиливаться резервный канал (СМС команды) из за возможного ограничения интернета.
Так же будет допиливаться фронт самих холодильников с внедрением необходимого функционала.
Будет необходима телеметрия со своей логикой алармов. Например дверь открыта более 1 минуты (данные берутся от концевика двери)
Ну или пропало питание 220 Вт на розетке (БП не выдает напряжение и устройство начало работать от АКБ в течении 2 минут)
Ну, или температура в холодильнике выше +15 градусов в течении 10 минут.
И еще много всякого интересного.

И самое главное, завтра начнется тестирование канала связи. Для этого будут в шлюз обмена внедрен код дебага с выводом в отдельный файл.

Re: Умный фуд‑вендинг: от железа до оплаты

Добавлено: 12 май 2026, 23:42
MarkT
Сегодня настраивал работу «умного холодильника» на WooCommerce (stolovka.pro): от REST-эндпоинта сканера до добавления товара в корзину и обновления мини-корзины/шильдика с темой Woodmart.

Сначала REST-маршрут /wp-json/sfg/v1/scan начал отдавать 404 и HTML вместо JSON. Выяснилось, что OPTIONS на /sfg/v1/scan отдаёт 200 и корректный JSON, то есть маршрут зарегистрирован. А POST ловил 404 на уровне веб-сервера с HTML-ответом, WordPress вообще не получал запрос. Решение: пересобрал постоянные ссылки в WordPress, проверил стандартный .htaccess/nginx и влияние защиты/кеша. После этого POST снова стал возвращать JSON со статусом error и сообщением «Неверный штрих-код».

Дальше диагностировал обработчик handle_scan в классе SFG_Session (плагин холодильника). Внутрь handle_scan добавил подробный error_log: логировал fridge_id, barcode, task_id, product_id и состояние WC()->cart. Логи показали, что fridge_id=sh52001 корректно читается из кук, штрих-код X5231909 успешно мапится на product_id=39776, но появляется «SFG handle_scan: WC()->cart not available» — корзина в REST-контексте не была инициализирована.

Исправил добавление товара в корзину из REST. В handle_scan заменён блок вида «если есть WC() и WC()->cart, то WC()->cart->add_to_cart» на вариант с принудительной инициализацией корзины: если WC()->cart == null и есть функция wc_load_cart(), вызывается wc_load_cart(), после чего повторно проверяется WC()->cart и вызывается WC()->cart->add_to_cart(product_id, 1) с логированием ключа add_to_cart. Если корзина так и не появилась, пишется отдельный лог. После этой правки по логам стало видно product_id=39776 и add_to_cart key=..., то есть товар реально стал появляться в Woo-корзине у того же пользователя, который сканирует.

Проверка на фронте: на странице холодильника /sh52001/ из консоли отправлялся fetch на /wp-json/sfg/v1/scan с методом POST и barcode=X5231909. Товар стал появляться в корзине и мини-корзине после обновления страницы, значит серверная цепочка «скан → корзина» работает, но фронт не обновлял шильдик в момент сканирования.

Дальше занялся JS-частью сканера в плагине fridge-float-button. В файле wp-content/plugins/fridge-float-button/assets/js/fridge-float-button.js есть обёртка (function($){ $(function(){ ... }); })(jQuery). Внутри реализованы openScannerOverlay (оверлей с видео и инициализацией BarcodeDetector или Quagga2) и scanAndAddToCart(code, $result), которая отправляет штрих-код на /sfg/v1/scan и показывает результат. Раньше там была попытка на фронте самодельно добавлять в корзину, всё перевёл на серверную логику: теперь фронт просто дергает /scan, а добавление в корзину происходит целиком в handle_scan на сервере.

Функцию scanAndAddToCart привёл к простому, устойчивому виду. Она делает fetch на /wp-json/sfg/v1/scan методом POST с JSON { barcode: code } и credentials: same-origin. В первом then проверяется res.ok, при неуспехе кидается ошибка HTTP N, затем пытается распарсить JSON и при ошибке парсинга возвращает пустой объект. Во втором then при успехе просто показывает «ПИК» (или alert) и вызывает playBeep(). В catch показывает «Неверный штрих-код.» и логирует ошибку. Таким образом, фронт считает успехом любой HTTP 200 и не зависит от структуры JSON, а сервер гарантированно кладёт товар в корзину.

Дальше настроил обновление мини-корзины и шильдика Woodmart после скана. Поиск через SSH показал, что wc_fragment_refresh используется в стандартном скрипте WooCommerce cart-fragments.js, тема Woodmart для .wd-header-cart использует именно стандартные фрагменты, а не кастомный механизм. В scanAndAddToCart после ПИКа добавил лог и вызов jQuery(document.body).trigger('wc_fragment_refresh'). В результате WooCommerce Cart Fragments сам отправляет запрос ?wc-ajax=get_refreshed_fragments, получает новые HTML-фрагменты и обновляет мини-корзину и шильдик, как при стандартном Ajax-добавлении товара.

После этого проверено, что после скана: в PHP-логах видно add_to_cart key=..., на фронте без перезагрузки обновляется шильдик .wd-header-cart и содержимое мини-корзины, а товар корректно лежит в Woo-корзине текущей сессии.

Отдельно исправил доступность функции звука «ПИК». Изначально playBeep() была объявлена как локальная function внутри IIFE и недоступна в глобальной области, поэтому из консоли выдавало ReferenceError. Функцию переписал как window.playBeep = function(){...}, чтобы она жила в window. Внутри использован Web Audio API: создаётся AudioContext, OscillatorNode и GainNode, ставится квадратная волна с частотой около 1000 Гц и громкостью около 0.2, звук проигрывается примерно 180 мс, после чего контекст закрывается. После этого playBeep() доступна из консоли и вызывается из scanAndAddToCart, давая короткий слышимый звук ПИК при успешном скане.

Дополнительно убедился, что логика с холодильником использует куки sfg_fridge_id и редирект по ?fridge_id=... на /shXXXXX/, чтобы REST-обработчик понимал, из какого холодильника идёт скан. В handle_scan логируются и проверяются наличие класса SFG_DB, поиск холодильника по fridge_id и его task_id, поиск товара по штрих-коду и task_id через find_product_by_barcode_and_task, а также корректное разруливание ошибок (400 для отсутствия данных и 404 при реально ненайденном товаре).

Итог на сейчас: сканер (BarcodeDetector на новых браузерах и Quagga2 как резерв) распознаёт штрих-код, фронт вызывает /wp-json/sfg/v1/scan, обработчик на сервере находит холодильник, task_id и product_id, через wc_load_cart и WC()->cart->add_to_cart кладёт товар в корзину, фронт показывает «ПИК», проигрывает звук и через wc_fragment_refresh заставляет WooCommerce обновить мини-корзину и шильдик Woodmart без перезагрузки страницы.