# Web GUI для датчиков температуры и клапанов Веб-интерфейс для: - мониторинга температур, - установки уставок, - ручного и автоматического управления клапанами, - управления позицией клапана в `%`. ## Быстрый старт 1. Запустите демо backend: ```bash python mock_server.py ``` 2. Откройте страницу: - `http://127.0.0.1:8080/index.html` 3. В поле `API endpoint` оставьте пустым для демо или укажите `http://127.0.0.1:8080`. Если API не указан, интерфейс переходит в офлайн-режим (демо) и хранит состояние в `localStorage`. ## Привязка к вашему проекту GUI читает и пишет данные через `API_PATHS` в `app.js`: 1. Датчики: `/api/sensors`, `/sensors`, `/api/data`, `/state` 2. Клапаны: `/api/valves`, `/valves`, `/api/data`, `/state` 3. Запись: сначала `PUT /api/*/:id`, затем `PUT /api/*` (без `:id`) Если ваш контракт другой, правьте: - массив `API_PATHS` в `app.js` - функции `normalizeSensor`, `normalizeValve` в `app.js` ## Работа с COM-портом (MCU) Для чтения с порта COM запущен `serial_bridge.py`: ```bash python serial_bridge.py --serial-port COM3 --baudrate 115200 ``` По умолчанию сервис доступен на `http://127.0.0.1:8080`. Поддерживаемые входящие форматы с порта: 1) JSON-пакет: ```json {"sensors":[{"id":"zone_1","value":24.5,"setpoint":28.0}], "valves":[{"id":"valve_1","mode":"auto","position":32,"targetTemp":28}]} ``` 2) Текстовый формат: ```text T1=24.5;T1_SETPOINT=28.0;V1_MODE=auto;V1_POS=32;V1_TGT=28 ``` Исходящие команды от GUI (`PUT`) также отправляются в порт как JSON: ```json {"type":"sensor","id":"zone_1","setpoint":28.0} {"type":"valve","id":"valve_1","mode":"manual","position":50} ``` Если нужен другой протокол от/к MCU (Modbus/байт-структура), пришлите пример кадров — подгоню парсер в `serial_bridge.py`. В GUI: - поле `COM порт` показывает список `/api/serial/ports`; - кнопка `Обновить порты` — принудительно перечитывает список COM; - кнопка `Подключить` / `Отключить` — вызывает `/api/serial/connect` и `/api/serial/disconnect` в `serial_bridge.py`. ## Форматы API ### GET - `GET /api/sensors` → массив: ```json [ { "id": "zone_1", "name": "Термопара 1", "value": 24.6, "setpoint": 28, "unit": "°C", "zone": "1" } ] ``` - `GET /api/valves` → массив: ```json [ { "id": "valve_1", "name": "Клапан 1", "zone": "1", "mode": "auto", "position": 40, "targetTemp": 28, "isOpen": true } ] ``` ### PUT - `PUT /api/sensors/{id}`: ```json { "setpoint": 29.5 } ``` - `PUT /api/valves/{id}`: - ручной: ```json { "mode": "manual", "position": 50 } ``` - авто: ```json { "mode": "auto", "targetTemp": 28.0 } ``` - или отдельные поля (`mode`, `position`, `targetTemp`). ## Файлы - `index.html` — разметка страницы - `styles.css` — стили - `app.js` — логика интерфейса - `mock_server.py` — демонстрационный backend - `serial_bridge.py` — backend для COM-порта