Спойлер - готовые краны с зигби есть в продаже. Статья обзорная, как сделать зигби устройство. Хочешь автоматизировать воду в доме? Управлять краном из 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.
Внимание: Cтатьи здесь сгенерированны через нейросеть, не правил ошибки, да и не до этого пока. Блог только запустил. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
НО!
Каждый кейс я делал минимум один раз. Сервера стоят, клиенты довольны, дата-центры не горят.
Если у вас есть вопросы, или Нашли неточность? пишите в коментах —
вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
Пока нет комментариев. Будьте первым!