К удобствам умного дома привыкаешь довольно быстро.
Но так уж вышло, что сейчас живем на съемной квартире, естественно с совковой проводкой.
Для того, чтоб сделать квартиру умнее были установлены лампы от Sonoff B1, которые отлично управлялись с помощью телефона и разумеется, что для их работы выключатель всегда должен быть включен. А для того, чтоб включить лампу выключателем, приходилось выключать и включать заново. Поднадоело...
Для начала поставил малинку возле роутера с mosquitto и пришлось перешить лампы на прошивку tasmota. Настроил homebridge, подключил лампы через плагин homebridge-sonoff-tasmota-http.
"accessories": [ { "accessory": "SonoffTasmotaHTTP", "name": "Первая лампочка", "hostname": "192.168.80.115" }, { "accessory": "SonoffTasmotaHTTP", "name": "Вторая лампочка", "hostname": "192.168.80.252" }, { "accessory": "SonoffTasmotaHTTP", "name": "Третья лампочка", "hostname": "192.168.80.253" } ]
Заработало! Теперь лампы управляются не только локально, но и через интернет, но выключатель по прежнему постоянно включен.Имея в наличии ESP8266-01 было принято решение сделать умный выключатель по mqtt (так как прокладывать заново проводку в съемной квартире не вариант). Сняв старый выключатель для люстры в зале обнаружил три провода (выключатель был двухклавишный). Фаза, которая идет со щитка и два провода от ламп. Было принято решение, управлять люстрой с помощью выключателя с одной клавишей (обычный выключатель-кнопка без фиксации за 2$). А оставшийся провод использовать для питания самого выключателя (правда пришлось на потолке над люстрой один провод подключить на ноль, чтоб в подрозетник выключателя приходили и фаза, и ноль для питания выключателя).
В результате для ESP8266-01 был написан скетч в Arduino IDE, который при нажатии на кнопку (GPIO2 на землю) отправлял в топик cmnd/livingroom/POWER команду TOGGLE.
#include <GyverButton.h> #include <ESP8266WiFi.h> #include <PubSubClient.h> GButton myButton (2); const char* ssid = "YOUR WI-FI SSID";//put your wifi ssid here const char* password = "YOUR PASS";//put your wifi password here. const char* mqtt_server = "YOUR MOSQUITTO IP"; WiFiClient espClient; PubSubClient client(espClient); long lastMsg = 0; char msg[50]; void setup_wifi() { delay(100); // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } randomSeed(micros()); Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void callback(char* topic, byte* payload, unsigned int length) { } //end callback void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Create a random client ID String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); // Attempt to connect //if you MQTT broker has clientID,username and password //please change following line to if (client.connect(clientId,userName,passWord)) if (client.connect(clientId.c_str())) { Serial.println("connected"); //once connected to MQTT broker, subscribe command if any client.subscribe("stat/livingroom/POWER"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } //end reconnect() void setup() { Serial.begin(115200); myButton.setDebounce(100); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); long now = millis(); int status; myButton.tick(); if(myButton.isPress()) { Serial.println("Pressed!"); //publish sensor data to MQTT broker client.publish("cmnd/livingroom/POWER", "TOGGLE"); } }
Все заработало идеально после того, как добавил библиотеку обработки нажатия кнопок от AlexGyver.
Пока что все навесным монтажом, но БП 3.3 вольта и ESP отлично прилипнут на двусторонний скотч к задней стенке выключателя =)
Из дополнительных плюшек - очень минимальная задержка и при отсутствии интернета локально все работает.
P.S.: Возможно кому-то пригодиться как дублирующий выключатель...
Оригинально! Для тех, кто захочет повторить, можно не писать свой скетч, а залить на esp-01 так же тасмоту. Настроив одинаковые топики на люстре и выключателе можно управлять люстрой через выключатель.
Нужно просто в консоле ESP-01 прописать следующее правило:
Rule1 on button1#state do publish cmnd/sonoff/POWER TOGGLE endon
В настройках для ESP-01 можно выбрать конфигурацию Sonoff Basic либо самому прописать на каких пинах что находится. И все, теперь при нажатии на кнопку ESP-01 будет переключаться все, что содержит общий топик на тасмоте cmnd/sonoff, тоесть люстра в данном случае.
16:00:37 CMD: Rule1 on button1#state do publish cmnd/sonoff/POWER TOGGLE endon
16:00:37 MQT: stat/livingroom/RESULT = {"Rule1":"OFF","Once":"OFF","StopOnError":"OFF","Free":453,"Rules":"on button1#state do publish cmnd/sonoff/POWER TOGGLE endon"}
Подправь еще топик, у тебя он не sonoff, а livingroom. И еще, включи созданное правило.
Ты это на ESP-01 делаешь? На сонофф на люстре полный топик соответствует? Кнопка на esp-01 правильно сконфигурирована с правильным именем? В общем, поразбирайся, если не получится - лучше в чатике все обсудить.
Выставляем в настройках модуля Sonoff Basic, правим топик для MQTT и пишем 2 строчки в консоль по очереди:
Кнопка получается у нас должна замыкать GPIO0 и землю)