Выключатели Света в МД альтернативный вариант

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Serega66
Сообщения: 114
Зарегистрирован: Ср фев 22, 2017 12:08 pm
Благодарил (а): 57 раз
Поблагодарили: 13 раз

Выключатели Света в МД альтернативный вариант

Сообщение Serega66 » Вс апр 28, 2019 3:51 pm

Уважаемые форумчане хочу поделиться с вами своим вариантом управления освещением.
Я электрик, не программист, но как и многие здесь увлеченно внедряю у себя МД.
Первая проблема для меня это мое неумение быстро настраивать или восстанавливать МД
несколько раз я переустанавливал сервер по разным на то причинам и это занимало у меня
около 2х дней. Соответственно сидеть два дня без освещения не интересно. В моем варианте
используются проходные переключатели (которые позволят включить свет если полетит сервер
или плата ардуино), роль второго переключателя выполняет ардуиновское механическое реле
которое как и переключатель имеет нормально замкнутый и нормально разомкнутый контакт.
за состоянием освещения следит датчик холла ACS712 он измеряет ток в цепи освещения
и отправляет брокеру MQTT информацию о состоянии освещения (ВКЛ=1, ВЫКЛ=0).
В моем проекте я использовал Ардуино NANO, езернет шилд W5100, датчик холла ACS712
и модуль реле для ардуино можно все сделать и на ESP8266 но надо немного переписать скетч.
Единственная проблема при переделке освещения это необходимость прокладки трех жильных
проводов к выключателям, ну и к реле соответственно. Если у вас дома провода уложены в гофре,
то думаю это возможно.
Настройка которую надо будет сделать в МД после запуска ардуинки: зайти
в панель управления МД во вкладке Устройства модуль MQTT найти строчки типа
(home/data/status/relay(X)) где (X) номер реле, и привязать их к простым устройствам
Switch(X) где (X) номер выключателя.
извиняюсь за плохое оформление, не умею пользоваться программами для рисования схем.

слева на рисунке обычная типовая схема, справа мой вариант с возможностью управления из МД
Изображение
скетч для краткости обрезал на три выключателя которые есть в МД сразу после установки,
у меня дома работают пять точек, в длинном коридоре стоит три переключателя + реле

Код: Выделить всё

#include <Ethernet.h>
#include <SPI.h>
#include <PubSubClient.h>
byte mac[] = { 0x00, 0x2A, 0xF6, 0x13, 0x69, 0x55 }; // MAC-адрес устройства
// ххх, ххх, ххх, ххх, поменять на адреса в вашей сети
byte ip[] = { ххх, ххх, ххх, ххх }; // ip-адрес устройства
byte server[] = { ххх, ххх, ххх, ххх }; // IP компьютера на котором установлен MQTT сервер
// здесь надо дописать логин и пароль к серверу MQTT если он установлен
byte gateway[] = { xxx, xxx, xxx, xxx };  // шлюз
byte subnet[] = { 255, 255, 255, 0 }; // маска сети
char buf[120];
#define RELAY_1 9 // пин реле 1
#define RELAY_2 8 // пин реле 2
#define RELAY_3 7 // пин реле 3

void callback(char* topic, byte* payload, unsigned int length); // Шапка Функции Callback (обратный вызов)
EthernetClient ethClient;  //Инициализируем Ethernet клиент
PubSubClient client(server, 1883, callback, ethClient);   //Инициализируем MQTT клиент дописать строку если установлен логин пароль 

//===========================================================
int d = 150;   // время задержки delay для того чтобы сервер успеел получить команду по сети
float AmpRMS1;
float AmpRMS2;
float AmpRMS3;

long last_mls = millis();  // время проверки перезагрузки
//------------
boolean rState1 = true;  // сост реле1 true на моем модуле выключено если включается false 
boolean lastBroker1 = false;  // бывшее сост MQTT
boolean broker1 = false;  // сост MQTT
boolean lamp1 = false; // сост лампы
boolean lastLamp1 = false; // бывшее сост лампы была
//------------
boolean rState2 = true; 
boolean lastBroker2 = false; 
boolean broker2 = false;
boolean lamp2 = false; 
boolean lastLamp2 = false;
//------------
boolean rState3 = true; 
boolean lastBroker3 = false; 
boolean broker3 = false; 
boolean lamp3 = false;
boolean lastLamp3 = false;
//==============================================
void setup() {
  pinMode(RELAY_1, OUTPUT);    
  pinMode(RELAY_2, OUTPUT);   
  pinMode(RELAY_3, OUTPUT);   
 
  Serial.begin(9600); 
  digitalWrite(RELAY_1, rState1);
  digitalWrite(RELAY_2, rState2);
  digitalWrite(RELAY_3, rState3);

 Ethernet.begin(mac, ip, gateway, subnet); // Инициализируем Ethernet
  delay(5000); // задержка для подключения к езернет
  client.connect("RELAYClient"); // Соединяемся и подписываемся на топики в MQTT
  client.subscribe("home/data/status/relay1");
  client.subscribe("home/data/status/relay2");
  client.subscribe("home/data/status/relay3");
}
//=====функция reset для реконнект================
void(* resetFunc) (void) = 0; // функция для перезагрузки контроллера
//===реконект LAN и MQTT=================================
void reconnect_server() {  
  if (ethClient.connected()) {Serial.println("============LAN OK");} //Если есть езернет
 else if (!ethClient.connected()) {Serial.println("============LAN NO"); //Если нет езернета
 resetFunc(); } 
 if (client.connected()) {Serial.println("============MQTT OK");} //Если есть связь с MQTT
  else if (!client.connected()) {Serial.println("============MQTT NO"); //Если нет связи с MQTT
  resetFunc(); } 
}
//=======CALLBACK-3========= Получаем информацию от брокера
void callback(char* topic, byte* payload, unsigned int length) {
 
  //преобразуем тему(topic) и значение (payload) в строку
  payload[length] = '\0';
  String strTopic = String(topic);
  String strPayload = String((char*)payload);
  
   if (strTopic == "home/data/status/relay1") {
    broker1 = strPayload.toInt(); 
   Serial.print(" ----------BROKER-1 - ");  Serial.println(broker1);
   }  
 else if (strTopic == "home/data/status/relay2") {
    broker2 = strPayload.toInt(); 
   Serial.print(" ----------BROKER-2 - ");  Serial.println(broker2);
   } 
 else if (strTopic == "home/data/status/relay3") {
    broker3 = strPayload.toInt(); 
   Serial.print(" ----------BROKER-3 - ");  Serial.println(broker3);
   } 
}
//=================================================================
void loop() {
  client.loop();  //запуск функции проверки инфы от брокера 
//================ЛАМПА-1===
if (lampa(A1))  { 
   AmpRMS1 = lampa(A1);
  Serial.print(AmpRMS1); Serial.println(" Amp RMS-1");
   if (AmpRMS1 > 0.12) lamp1 = 1; // Если показания датчика (Amp RMS) больше 0,12 А свет горит
   else lamp1 = 0;                // 0.12 можно менять по своим факт показаниям

  if ((lastBroker1 == 0)&&(broker1 == 1)&&(lastLamp1 == 0)&&(lamp1 == 0)) { //если из брокера (1)
     rState1 = !rState1;
     digitalWrite(RELAY_1, rState1);
     lastBroker1 = broker1;
     lastLamp1 = true;
     lamp1 = lastLamp1;  
     client.publish("home/data/status/relay1", String(lamp1).c_str(), false);
     delay(d); }
else if ((lastBroker1 == 1)&&(broker1 == 0)&&(lastLamp1 == 1)&&(lamp1 == 1)) { //если из брокера (0)
     rState1 = !rState1;
     digitalWrite(RELAY_1, rState1); 
     lastBroker1 = broker1;
     lastLamp1 = false;
     lamp1 = lastLamp1; 
     client.publish("home/data/status/relay1", String(lamp1).c_str(), false);
     delay(d);}
else if ((lastBroker1 == 0)&&(broker1 == 0)&&(lastLamp1 == 0)&&(lamp1 == 1)) { //если ВКЛ лампу
        client.publish("home/data/status/relay1", String(lamp1).c_str(), false); delay(d);}
else if ((lastBroker1 == 0)&&(broker1 == 1)&&(lastLamp1 == 0)&&(lamp1 == 1)) { //промежуточный вар ВКЛ лампа и из брокера(1)
     lastBroker1 = broker1;
     lastLamp1 = lamp1;   delay(d);   }
else if ((lastBroker1 == 1)&&(broker1 == 1)&&(lastLamp1 == 1)&&(lamp1 == 0)) { //если ВЫКЛ лампу
        client.publish("home/data/status/relay1", String(lamp1).c_str(), false); delay(d);}
else if ((lastBroker1 == 1)&&(broker1 == 0)&&(lastLamp1 == 1)&&(lamp1 == 0)) { //промежуточный вар ВЫКЛ лампа и из брокера(0)
     lastBroker1 = broker1;
     lastLamp1 = lamp1;   delay(d);   }
     }
/*  //======================ДЛЯ ОТЛАДКИ - 1===
   Serial.print(" lamp-1 = "); Serial.println(lamp1);
   Serial.print(" LASTlamp-1= "); Serial.println(lastLamp1);
   Serial.println ("-------1---------");
   Serial.print(" broker-1  = "); Serial.println(broker1);
   Serial.print(" LASTbrok-1= "); Serial.println(lastBroker1);
   Serial.print(" RStat-1   = "); Serial.println(rState1);
   Serial.println ("=======================");
*/  
  client.loop(); 
//=================ЛАМПА-2===
 if (lampa(A2))  { 
   AmpRMS2 = lampa(A2);
  Serial.print(AmpRMS2); Serial.println(" Amp RMS-2");
   if (AmpRMS2 > 0.12) lamp2 = 1;
   else lamp2 = 0;

  if ((lastBroker2 == 0)&&(broker2 == 1)&&(lastLamp2 == 0)&&(lamp2 == 0)) {
     rState2 = !rState2;
     digitalWrite(RELAY_2, rState2);
     lastBroker2 = broker2;
     lastLamp2 = true;
     lamp2 = lastLamp2;  
     client.publish("home/data/status/relay2", String(lamp2).c_str(), false);
     delay(d); }
else if ((lastBroker2 == 1)&&(broker2 == 0)&&(lastLamp2 == 1)&&(lamp2 == 1)) {
     rState2 = !rState2;
     digitalWrite(RELAY_2, rState2); 
     lastBroker2 = broker2;
     lastLamp2 = false;
     lamp2 = lastLamp2; 
     client.publish("home/data/status/relay2", String(lamp2).c_str(), false);
     delay(d);}
else if ((lastBroker2 == 0)&&(broker2 == 0)&&(lastLamp2 == 0)&&(lamp2 == 1)) {
        client.publish("home/data/status/relay2", String(lamp2).c_str(), false); delay(d);}
else if ((lastBroker2 == 0)&&(broker2 == 1)&&(lastLamp2 == 0)&&(lamp2 == 1)) {
     lastBroker2 = broker2;
     lastLamp2 = lamp2;   delay(d);   }
else if ((lastBroker2 == 1)&&(broker2 == 1)&&(lastLamp2 == 1)&&(lamp2 == 0)) {
        client.publish("home/data/status/relay2", String(lamp2).c_str(), false); delay(d);}
else if ((lastBroker2 == 1)&&(broker2 == 0)&&(lastLamp2 == 1)&&(lamp2 == 0)) {
     lastBroker2 = broker2;
     lastLamp2 = lamp2;   delay(d);   }
     }
/*  //======================ДЛЯ ОТЛАДКИ - 2===
   Serial.print(" lamp-2 = "); Serial.println(lamp2);
   Serial.print(" LASTlamp-2= "); Serial.println(lastLamp2);
   Serial.println ("------2----------");
   Serial.print(" broker-2  = "); Serial.println(broker2);
   Serial.print(" LASTbrok-2= "); Serial.println(lastBroker2);
   Serial.print(" RStat-2   = "); Serial.println(rState2);
   Serial.println ("=======================");
*/   
  client.loop();
//=================ЛАМПА-3===
 if (lampa(A3))  { 
   AmpRMS3 = lampa(A3);
  Serial.print(AmpRMS3); Serial.println(" Amp RMS-3");
   if (AmpRMS3 > 0.12) lamp3 = 1;
   else lamp3 = 0;

  if ((lastBroker3 == 0)&&(broker3 == 1)&&(lastLamp3 == 0)&&(lamp3 == 0)) {
     rState3 = !rState3;
     digitalWrite(RELAY_3, rState3);
     lastBroker3 = broker3;
     lastLamp3 = true;
     lamp3 = lastLamp3;  
     client.publish("home/data/status/relay3", String(lamp3).c_str(), false);
     delay(d); }
else if ((lastBroker3 == 1)&&(broker3 == 0)&&(lastLamp3 == 1)&&(lamp3 == 1)) {
     rState3 = !rState3;
     digitalWrite(RELAY_3, rState3); 
     lastBroker3 = broker3;
     lastLamp3 = false;
     lamp3 = lastLamp3; 
     client.publish("home/data/status/relay3", String(lamp3).c_str(), false);
     delay(d);}
else if ((lastBroker3 == 0)&&(broker3 == 0)&&(lastLamp3 == 0)&&(lamp3 == 1)) {
        client.publish("home/data/status/relay3", String(lamp3).c_str(), false); delay(d);}
else if ((lastBroker3 == 0)&&(broker3 == 1)&&(lastLamp3 == 0)&&(lamp3 == 1)) {
     lastBroker3 = broker3;
     lastLamp3 = lamp3;   delay(d);   }
else if ((lastBroker3 == 1)&&(broker3 == 1)&&(lastLamp3 == 1)&&(lamp3 == 0)) {
        client.publish("home/data/status/relay3", String(lamp3).c_str(), false); delay(d);}
else if ((lastBroker3 == 1)&&(broker3 == 0)&&(lastLamp3 == 1)&&(lamp3 == 0)) {
     lastBroker3 = broker3;
     lastLamp3 = lamp3;   delay(d);   }
     }
/*  //======================ДЛЯ ОТЛАДКИ - 3===
   Serial.print(" lamp-3 = "); Serial.println(lamp3);
   Serial.print(" LASTlamp-3= "); Serial.println(lastLamp3);
   Serial.println ("------3----------");
   Serial.print(" broker-3  = "); Serial.println(broker3);
   Serial.print(" LASTbrok-3= "); Serial.println(lastBroker3);
   Serial.print(" RStat-3   = "); Serial.println(rState3);
   Serial.println ("=======================");
*/  
 //===== 120 секунд периодичность проверки и переподключения===
  if (millis() - last_mls > 120000) {
    last_mls = millis();
    reconnect_server();
  }
}
//====2 функции для чтения датчика холла ACS712======
float lampa(byte Pin)
{ 
  float AmpRMS;
  int readValue;             //value read from the sensor
  int maxValue = 0;          // store max value here
  int minValue = 1024;          // store min value here
  
   uint32_t start_time = millis();
   while((millis()-start_time) < 200) //sample for 0,2 Sec
   {
       readValue = analogRead(Pin);
       if (readValue > maxValue) 
       {  maxValue = readValue;  }
       if (readValue < minValue) 
       {  minValue = readValue;  }
   }
AmpRMS=((maxValue - minValue)/115.5); 
   return AmpRMS;
 }
PS. первый раз делаю публикацию извините если неправильно оформил.
Вложения
MQTT_3_RELAY_MD.rar
Скетч ардуино и W5100
(2.76 КБ) 184 скачивания
IMG_SHEMA.jpg
Схема
IMG_SHEMA.jpg (1.27 МБ) 4856 просмотров
За это сообщение автора Serega66 поблагодарили (всего 5):
Step40 (Пн апр 29, 2019 7:51 am) • serghei (Вт апр 30, 2019 7:57 am) • olegvolk75 (Пт авг 09, 2019 1:18 pm) • fynto (Вт окт 08, 2019 4:09 pm) • alexmjdm (Пт сен 11, 2020 2:44 pm)
Рейтинг: 5.81%
ZyaK
Сообщения: 417
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 45 раз
Поблагодарили: 71 раз

Re: Выключатели Света в МД альтернативный вариант

Сообщение ZyaK » Пн апр 29, 2019 7:09 am

не понимаю за чем оставлять мех выключатели, у меня везде висят сенсорные(самопал) подключенные к ЕСПи8266, на некоторых линиях на 1 проводе висит по 4 штуки, чтоб с разных мест удобно было включать/выключать, дальше ЕСПи рулит релюхами. прекрасно работает без сервера. Слаботочка по дому раскидана витой парой.
Такой вариант мне кажется более удобным, если сравнивать по цене, то витая пара в разы дешевле нормального 3-х жильного кабеля.
PI2 + MQTT + 5 ESP8266 + Atmega16
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 816 раз

Re: Выключатели Света в МД альтернативный вариант

Сообщение tarasfrompir » Пн апр 29, 2019 7:23 am

Правильно человек все сделал - подобное решение лежит в голове и у меня.
Такое решенение в случае поломки Дуйки или любого контролера даст возможность пользоватся выключателем сколько угодно ..
ТС КРАСАВЧИК...
За это сообщение автора tarasfrompir поблагодарил:
Serega66 (Пн апр 29, 2019 1:03 pm)
Рейтинг: 1.16%
Спасибо нам ПОМОЖЕТ..!
Step40
Сообщения: 112
Зарегистрирован: Сб июл 14, 2018 11:31 am
Откуда: Волгоград
Благодарил (а): 90 раз
Поблагодарили: 7 раз

Re: Выключатели Света в МД альтернативный вариант

Сообщение Step40 » Пн апр 29, 2019 7:51 am

Не понимаю за чем оставлять сенсорные выключатели у меня весь свет голосовой.
Странное решение комп за много денег может полететь а андурино почти за даром защита от поломки компа.
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 816 раз

Re: Выключатели Света в МД альтернативный вариант

Сообщение tarasfrompir » Пн апр 29, 2019 8:11 am

Step40 писал(а):
Пн апр 29, 2019 7:51 am
Не понимаю за чем оставлять сенсорные выключатели у меня весь свет голосовой.
Странное решение комп за много денег может полететь а андурино почти за даром защита от поломки компа.
Дело в том что останется выключатель который уж если сломается = то это тогда катастрофа...
А так все классно.. выключателем хоть там все сгори , можна включать и выключать свет - по старинке...
За это сообщение автора tarasfrompir поблагодарил:
Serega66 (Пн апр 29, 2019 1:04 pm)
Рейтинг: 1.16%
Спасибо нам ПОМОЖЕТ..!
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 632 раза

Re: Выключатели Света в МД альтернативный вариант

Сообщение xor » Пн апр 29, 2019 8:23 am

tarasfrompir писал(а):
Step40 писал(а):
Пн апр 29, 2019 7:51 am
Не понимаю за чем оставлять сенсорные выключатели у меня весь свет голосовой.
Странное решение комп за много денег может полететь а андурино почти за даром защита от поломки компа.
Дело в том что останется выключатель который уж если сломается = то это тогда катастрофа...
А так все классно.. выключателем хоть там все сгори , можна включать и выключать свет - по старинке...
Я делал свет на ноолайте, всё работает и без сервера + управление/передача состояния к МДМ.

Отправлено с моего Redmi 4X через Tapatalk

Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 816 раз

Re: Выключатели Света в МД альтернативный вариант

Сообщение tarasfrompir » Пн апр 29, 2019 10:00 am

xor писал(а):
Пн апр 29, 2019 8:23 am
Дело в том что останется выключатель который уж если сломается = то это тогда катастрофа...
А так все классно.. выключателем хоть там все сгори , можна включать и выключать свет - по старинке...
Я делал свет на ноолайте, всё работает и без сервера + управление/передача состояния к МДМ.

Отправлено с моего Redmi 4X через Tapatalk
[/quote]

я исхожу из таких соображений - понаставлял я всяких умных выключателей и уехал на год в командировку...
за это время наступил гарантийный случай..., но жена то об этом не знает....
она наоборот сказала что за хрень ты поставил, заменили выключатель а толку от этого никакого....
ибо приехал электрик и сказал - что я умею ставить выключвтели только простые....
но и это не сработало - ведь у меня фазв, ноль, и еше несколько непонятных проводов...
ну и т.д.
а этот вариант самый простой и надежный... :shock: :shock: :shock:
Спасибо нам ПОМОЖЕТ..!
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 632 раза

Re: Выключатели Света в МД альтернативный вариант

Сообщение xor » Пн апр 29, 2019 11:06 am

tarasfrompir писал(а):
xor писал(а):
Пн апр 29, 2019 8:23 am
Дело в том что останется выключатель который уж если сломается = то это тогда катастрофа...
А так все классно.. выключателем хоть там все сгори , можна включать и выключать свет - по старинке...
Я делал свет на ноолайте, всё работает и без сервера + управление/передача состояния к МДМ.

Отправлено с моего Redmi 4X через Tapatalk
я исхожу из таких соображений - понаставлял я всяких умных выключателей и уехал на год в командировку...
за это время наступил гарантийный случай..., но жена то об этом не знает....
она наоборот сказала что за хрень ты поставил, заменили выключатель а толку от этого никакого....
ибо приехал электрик и сказал - что я умею ставить выключвтели только простые....
но и это не сработало - ведь у меня фазв, ноль, и еше несколько непонятных проводов...
ну и т.д.
а этот вариант самый простой и надежный... :shock: :shock: :shock:[/quote]А в предложенном автором решении жэковский электрик разберётся?
Если да, тогда отлично.
Отправлено с моего Redmi 4X через Tapatalk


Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 816 раз

Re: Выключатели Света в МД альтернативный вариант

Сообщение tarasfrompir » Пн апр 29, 2019 11:26 am

xor писал(а):
Пн апр 29, 2019 11:06 am
А в предложенном автором решении жэковский электрик разберётся?
Если да, тогда отлично.
Отправлено с моего Redmi 4X через Tapatalk
в таком варианте вполне... - замена выключателя всего навсего...
Спасибо нам ПОМОЖЕТ..!
Serega66
Сообщения: 114
Зарегистрирован: Ср фев 22, 2017 12:08 pm
Благодарил (а): 57 раз
Поблагодарили: 13 раз

Re: Выключатели Света в МД альтернативный вариант

Сообщение Serega66 » Пн апр 29, 2019 12:56 pm

Мне нужно дешево и надежно а электроника из китая год назад сделала пшик по питанию, пошло по VCC и по I2C. Пока приехали новые железки из китая сидел без МД благо в то время у меня в умном доме были только температура влажность и счетчики. Про сенсорные выключатели знаю но там цена кусается. Переключатели есть в любом магазине электрики причем они уже есть в бюджетных сериях типа снайдер глосса цена от 200 руб. даже есть переключатели для наружной установки.
Потом я не навязываю никому менять ноолайт на мой вариант, вполне вероятно он надежен и крут. А вот командовать светом слаботочкой и внедрять в выключатель пружинки чтобы убрать фиксацию, моё мнение это ненадежно.Если мой вариант начнет глючить, питание вырубил и пользуй обычный выключатель. Электрик из жека такой выключатель заменить сможет, или поставит простой чтоб свет горел, а третий провод изолентой замотает, по третьему проводу тоже ноль идет.
Ответить