Спойлер - готовые краны с зигби есть в продаже. Статья обзорная, как сделать зигби устройство. Хочешь автоматизировать воду в доме? Управлять краном из Home Assistant? Не покупать дорогие Zigbee-устройства, а сделать своё? Тогда эта статья — для тебя.
Я собрал Zigbee-совместимый шаровый кран на базе ESP32, управляю им через MQTT, а в будущем легко перейду на настоящий Zigbee. Всё — своими руками, с Arduino IDE, с экраном для отладки и питанием от батареек.
Итого: ~$50 — дешевле любого готового Zigbee-крана.
M5Stack GPIO 26 → IN1 драйвера (открыть)
M5Stack GPIO 27 → IN2 драйвера (закрыть)
Драйвер → мотор
Питание драйвера и мотора → отдельный 12V аккумулятор
Zigbee Module (пока не используется) → Grove-порт B
Установи в Arduino IDE:
M5Stack, PubSubClient#include#include #include // === НАСТРОЙКИ === const char* ssid = "ТВОЯ_WIFI"; const char* password = "ТВОЙ_ПАРОЛЬ"; const char* mqtt_server = "192.168.1.100"; // IP твоего MQTT-брокера #define MOTOR_OPEN_PIN 26 #define MOTOR_CLOSE_PIN 27 #define CMD_TOPIC "zigbee/valve/command" #define STATE_TOPIC "zigbee/valve/state" #define MOTOR_RUN_TIME 10000 // 10 сек WiFiClient espClient; PubSubClient client(espClient); bool valveState = false; // false = закрыт, true = открыт unsigned long lastCheck = 0; const long checkInterval = 3600000; // 1 час void runMotor(int direction) { digitalWrite(MOTOR_OPEN_PIN, direction == 1 ? HIGH : LOW); digitalWrite(MOTOR_CLOSE_PIN, direction == -1 ? HIGH : LOW); if (direction != 0) delay(MOTOR_RUN_TIME); digitalWrite(MOTOR_OPEN_PIN, LOW); digitalWrite(MOTOR_CLOSE_PIN, LOW); } void callback(char* topic, byte* payload, unsigned int length) { String msg = ""; for (int i = 0; i < length; i++) msg += (char)payload[i]; if (String(topic) == CMD_TOPIC) { if (msg == "OPEN") { M5.Lcd.println("→ OPEN"); runMotor(1); valveState = true; client.publish(STATE_TOPIC, "OPENED"); } else if (msg == "CLOSE") { M5.Lcd.println("→ CLOSE"); runMotor(-1); valveState = false; client.publish(STATE_TOPIC, "CLOSED"); } } } void reconnect() { while (!client.connected()) { if (client.connect("ZigbeeValve")) { client.subscribe(CMD_TOPIC); } else delay(5000); } } void setup() { M5.begin(); M5.Lcd.println("Zigbee Valve v1.0"); pinMode(MOTOR_OPEN_PIN, OUTPUT); pinMode(MOTOR_CLOSE_PIN, OUTPUT); digitalWrite(MOTOR_OPEN_PIN, LOW); digitalWrite(MOTOR_CLOSE_PIN, LOW); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) delay(500); client.setServer(mqtt_server, 1883); client.setCallback(callback); } void loop() { M5.update(); if (!client.connected()) reconnect(); client.loop(); unsigned long now = millis(); if (now - lastCheck > checkInterval) { lastCheck = now; client.publish(STATE_TOPIC, valveState ? "OPENED" : "CLOSED"); } delay(100); }
Добавь в configuration.yaml:
switch:
- platform: mqtt
name: "Zigbee Valve"
command_topic: "zigbee/valve/command"
state_topic: "zigbee/valve/state"
payload_on: "OPEN"
payload_off: "CLOSE"
state_on: "OPENED"
state_off: "CLOSED"
Перезагрузи HA — получишь красивый переключатель в интерфейсе.
Ты не просто купил «умную» игрушку — ты сделал устройство, которое реально решает задачу. Ты понимаешь, как оно работает. Ты можешь его улучшать. Это — настоящий DIY.
Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
Пока нет комментариев. Будьте первым!