Files

5.5 KiB

Интеграция с весовым контроллером — шпаргалка для разработчиков

Архитектура

Весы → ESP32 контроллер → MQTT брокер → Ваш сервер
                       ←  MQTT брокер ← Ваш сервер (команда GO)

Настройка локального MQTT брокера

Установить Mosquitto (или любой другой MQTT брокер):

# Ubuntu/Debian
sudo apt install mosquitto mosquitto-clients

# Конфиг /etc/mosquitto/mosquitto.conf
listener 1883 0.0.0.0
allow_anonymous true   # или настроить авторизацию

sudo systemctl restart mosquitto

IP вашего брокера, порт, логин и пароль сообщит администратор — он настроит их в устройстве со своей стороны.


Топики MQTT

Получение данных с весов

Топик: scales/weighing/event

Контроллер публикует JSON когда вес стабилизировался:

{
  "weight_kg": 12500.0,
  "timestamp": "2026-05-29T11:05:06",
  "device_id": "scales_01"
}

Подписаться через консоль:

mosquitto_sub -h localhost -t "scales/weighing/event"

Python пример:

import paho.mqtt.client as mqtt
import json

def on_message(client, userdata, msg):
    data = json.loads(msg.payload)
    weight = data['weight_kg']
    timestamp = data['timestamp']
    device = data['device_id']
    print(f"Взвешивание: {weight} кг в {timestamp}")
    
    # Здесь ваша логика:
    # - Сделать снимок с камеры
    # - Распознать номер авто
    # - Сохранить в БД
    # - Отправить команду GO

client = mqtt.Client()
client.on_message = on_message
client.connect("localhost", 1883)
client.subscribe("scales/weighing/event")
client.loop_forever()

Отправка команды GO

После того как ваша система обработала взвешивание (сделала фото, распознала номер, сохранила в БД) — нужно отправить команду GO.

Контроллер получит команду и переключит светофор на зелёный.

Топик: scales/weighing/go

Формат команды GO

{
  "device_id": "scales_01",
  "timestamp": "2026-05-29T11:05:11"
}

Отправка через консоль:

mosquitto_pub -h localhost -t "scales/weighing/go" \
  -m '{"device_id":"scales_01","timestamp":"2026-05-29T11:05:11"}'

Отправка через Python:

import paho.mqtt.client as mqtt
import json
from datetime import datetime

def send_go(client, device_id="scales_01"):
    payload = json.dumps({
        "device_id": device_id,
        "timestamp": datetime.now().isoformat()
    })
    client.publish("scales/weighing/go", payload)
    print(f"GO отправлен для {device_id}")

# Полный пример — принять вес и отправить GO
def on_message(client, userdata, msg):
    data = json.loads(msg.payload)
    weight = data['weight_kg']
    print(f"Получен вес: {weight} кг")
    
    # Ваша логика здесь...
    # make_photo()
    # recognize_plate()
    # save_to_db(weight)
    
    # Отправляем GO
    send_go(client, data['device_id'])

client = mqtt.Client()
client.on_message = on_message
client.connect("localhost", 1883)
client.subscribe("scales/weighing/event")
client.loop_forever()

Полная схема взаимодействия

1. Машина заезжает на платформу
2. Контроллер видит вес → включает КРАСНЫЙ светофор
3. Вес стабилизируется
4. Контроллер публикует в scales/weighing/event:
   {"weight_kg": 12500.0, "timestamp": "...", "device_id": "scales_01"}
5. Ваш сервер получает сообщение
6. Ваш сервер делает снимки с камер, распознаёт номер, сохраняет в БД
7. Ваш сервер публикует в scales/weighing/go:
   {"device_id": "scales_01", "timestamp": "..."}
8. Контроллер получает GO → включает ЗЕЛЁНЫЙ светофор
9. Машина съезжает

Параметры устройства

Параметр Значение
Device ID scales_01
Топик данных scales/weighing/event
Топик GO scales/weighing/go

IP брокера, порт и авторизацию сообщит администратор.


Установка paho-mqtt

pip install paho-mqtt

Важные моменты

  1. GO нужно отправлять на тот же брокер где вы получили событие.

  2. Таймаут ожидания GO не ограничен — контроллер будет ждать команду сколько угодно. Если машина уедет сама — контроллер автоматически сбросит состояние и включит зелёный.

  3. device_id в команде GO должен совпадать с device_id из события.