Esp+реле+mqtt+mdm

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am

Esp+реле+mqtt+mdm

Сообщение yden »

Здравствуйте.
Подскажите, плиз, правильно ли я делаю. Есть esp, реле и mqtt. Эта релюшка управляется по mqtt - 1 и 0. Так же есп шлет в топик статус этого реле - в случае если релюшка включена кодом самой esp. В mdm заведены объекты в классе relays, например ReleSvet1. В mqtt заведены записи - по 2 на каждое реле: svet1/in (входящее управление реле), svet1/out - статус реле по информации от esp. Обе эти записи связаны со свойством статус ReleSvet1. На mdm крутятся сценарии, изменяющие свойства объектов. Так же есть выключатель, он связан со свойством status методом refresh объекта ReleSvet1.
У меня есть ошибки?

благодарю
ZyaK
Сообщения: 419
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск

Re: Esp+реле+mqtt+mdm

Сообщение ZyaK »

у меня как то так, еспишки рулят релюхами от кнопок(2 есп от 8 железных кнопок - 8 релюхами, 3-я 6 железных кнопок, 8 релюх +IR протоколы)
могут работать и без сервера(на всякий случай если упадёт расбери или флешка кончится)
Объекты класса Light привязаны к MQTT
методы
refresh
turn on/off
switch
свойства
status или 1 или 0 собственно что и шлётся по MQTT

viewtopic.php?f=8&t=1937

viewtopic.php?f=8&t=2830
Вложения
Light.jpg
Light.jpg (79.19 КБ) 7028 просмотров
MQTT.jpg
MQTT.jpg (146.42 КБ) 7028 просмотров
Последний раз редактировалось ZyaK Пт апр 06, 2018 11:33 am, всего редактировалось 1 раз.
PI2 + MQTT + 5 ESP8266 + Atmega16
Jilber
Сообщения: 719
Зарегистрирован: Ср май 03, 2017 7:41 pm

Re: Esp+реле+mqtt+mdm

Сообщение Jilber »

Здесь CheBuraw выкладывал свои схемы подключения кнопок (у него через оптопары и от 12V). А у вас как подключено ?
ZyaK
Сообщения: 419
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск

Re: Esp+реле+mqtt+mdm

Сообщение ZyaK »

у меня сенсорные кнопки на базе TTP223
прям на ЕСПишке подтягивающие резисторы в 1 килоом на 3.3 и конденсаторы 0.1 на землю, прока это всё лежит на столе, но ради интереса разматывал витую пару на 50 метров и по ней пускал 3.3 вольта на запитку кнопок, работает без проблем.
самое что интересное их пробовал штуки 4 одновременно на 1 вход цеплять! работают как проходные выключатели!
Вложения
776089.jpg
776089.jpg (161.01 КБ) 6991 просмотр
PI2 + MQTT + 5 ESP8266 + Atmega16
yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am

Re: Esp+реле+mqtt+mdm

Сообщение yden »

ZyaK писал(а): Пт апр 06, 2018 8:45 am у меня как то так, еспишки рулят релюхами от кнопок(2 есп от 8 железных кнопок - 8 релюхами, 3-я 6 железных кнопок, 8 релюх +IR протоколы)
могут работать и без сервера(на всякий случай если упадёт расбери или флешка кончится)
Объекты класса Light привязаны к MQTT
методы
refresh
turn on/off
switch
свойства
status или 1 или 0 собственно что и шлётся по MQTT

viewtopic.php?f=8&t=1937

viewtopic.php?f=8&t=2830
У вас реле без обратной связи я вижу. Т.е если кодом esp включилось реле, mdm об этом не знает?
ZyaK
Сообщения: 419
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск

Re: Esp+реле+mqtt+mdm

Сообщение ZyaK »

нет, сделано именно с обратной связью, при изменении состояния летит пакет status того или иного выхода.
самое интересное с командами по ИК

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

  
  if (strTopic == "ESP03/usulitel_next_station") {
    if ((char)payload[0] == '0') {
      u_next_station=0;
    }
    else if ((char)payload[0] == '1') {
      u_next_station=1;
      irsend.sendRC5(0x20, 12);
      delay(150);
      u_next_station=0; 
      delay(150);  
      client.publish(usulitel_next_station, String(u_next_station).c_str());
      client.loop();
     }
      
  }
после выполнения команды возвращает статус в 0 и отправляет в мажордом

а вот опрос кнопок

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

void button1() 
{
  btnPress1 = digitalRead(BUTTON_1);
  if (btnPress1 == LOW && lastbtnStat1 == false) 
  {
    delay(100); // защита от дребезга
    btnPress1 = digitalRead(BUTTON_1);
    if (btnPress1 == LOW && lastbtnStat1 == false) 
  {
    regim1++;
    lastbtnStat1 = true;
    if (regim1 > 1) 
    {
      regim1 = 0;
    }
    client.publish(relays_topic1, String(regim1).c_str()); //публикуем изменение состояния выхода 1 на брокер
    
  }
  }
  if (btnPress1 == HIGH && lastbtnStat1 == true) 
  {
    lastbtnStat1 = false;
  }

  if (regim1 == 0) 
  {
    Status1 = false;
    
  }
  if (regim1 == 1) 
  {
    Status1 = true;
    
  }
  client.loop();
}
Долго очень боролся с подпиской на топики, если ЕСПишку подписать более чем на 5 топиков, она тупит жестко, решилось вот так

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

client.setServer(mqtt_server, 1883);       //подключаемся к MQTT
  client.setCallback(callback);              //функция получения топиков с брокера
  delay(100);
  
  client.connect("ESP03Client");
  delay (100);//конектимся с брокером как клиент
  
  client.subscribe(relays_topic1);
  client.loop();
  client.subscribe(relays_topic2);
  client.loop();
  client.subscribe(relays_topic3);
  client.loop();
  client.subscribe(relays_topic4);
  client.loop();
  client.subscribe(relays_topic5);
  client.loop();
  client.subscribe(relays_topic6);
  client.loop();
  client.subscribe(usulitel_power);
  client.loop();
  client.subscribe(usulitel_vol_up);
  client.loop();
  client.subscribe(usulitel_vol_down);
  client.loop();
  client.subscribe(usulitel_av);
  client.loop();
  client.subscribe(usulitel_radio);
  client.loop();
  client.subscribe(usulitel_projector);
  client.loop();
  client.subscribe(usulitel_next_station);
  client.loop();
  client.subscribe(usulitel_prev_station);
  client.loop();
  client.subscribe(projector_power);
  client.loop();
  client.subscribe(led_power_on);
  client.loop();
  client.subscribe(led_power_off);
  client.loop();
  client.subscribe(led_lum_up);
  client.loop();
  client.subscribe(led_lum_down);
  client.loop();
  client.publish(usulitel_power, String(u_power).c_str());
  client.loop();
  client.publish(usulitel_vol_up, String(u_vol_up).c_str()); 
  client.loop();
  client.publish(usulitel_vol_down, String(u_vol_down).c_str());
  client.loop();
  client.publish(usulitel_av, String(u_av).c_str());
  client.loop();
  client.publish(usulitel_radio, String(u_radio).c_str()); 
  client.loop();
  client.publish(usulitel_projector, String(u_projector).c_str());
  client.loop();
  client.publish(usulitel_next_station, String(u_next_station).c_str());
  client.loop();
  client.publish(usulitel_prev_station, String(u_prev_station).c_str()); 
  client.loop();
  client.publish(projector_power, String(p_power).c_str());
  client.loop();
  client.publish(led_power_on, String(l_power_on).c_str());
  client.loop();
  client.publish(led_power_off, String(l_power_off).c_str());
  client.loop();
  client.publish(led_lum_up, String(l_lum_up).c_str());
  client.loop();
  client.publish(led_lum_down, String(l_lum_down).c_str());
  client.loop();
  irsend.begin();
PI2 + MQTT + 5 ESP8266 + Atmega16
yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am

Re: Esp+реле+mqtt+mdm

Сообщение yden »

Покажите пожалуйста в mdm топики одной реле с обратной связью.
ZyaK
Сообщения: 419
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск

Re: Esp+реле+mqtt+mdm

Сообщение ZyaK »

yden писал(а): Пт апр 06, 2018 12:30 pm Покажите пожалуйста в mdm топики одной реле с обратной связью.
Там выше я скрины приложил, там есть топики всех 3-х ЕСП, привязанных к свойству status
вот в панели MQTT
Безымянный.jpg
Безымянный.jpg (135.37 КБ) 6960 просмотров
а это управление со сцен
1.jpg
1.jpg (121.66 КБ) 6955 просмотров
2.jpg
2.jpg (91.22 КБ) 6955 просмотров
Последний раз редактировалось ZyaK Пт апр 06, 2018 12:50 pm, всего редактировалось 1 раз.
PI2 + MQTT + 5 ESP8266 + Atmega16
yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am

Re: Esp+реле+mqtt+mdm

Сообщение yden »

ZyaK писал(а): Пт апр 06, 2018 12:44 pm
yden писал(а): Пт апр 06, 2018 12:30 pm Покажите пожалуйста в mdm топики одной реле с обратной связью.
Там выше я скрины приложил, там есть топики всех 3-х ЕСП, привязанных к свойству status
Это обратная связь или управляющий сигнал от mdm?
Если не трудно, скрин этого же реле, но противоположной команды (если было управление, то реакция, если реакция-управление)
И что означает опция Retain?
ZyaK
Сообщения: 419
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск

Re: Esp+реле+mqtt+mdm

Сообщение ZyaK »

Если была команда на включение /отключение реле со стороны MJD за это отвечает функция КолБэк

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

void callback(char* topic, uint8_t* payload, unsigned int length){
  //Serial.print("Message arrived [");
  //Serial.print(topic);
  //Serial.print("  ");
  String strTopic = String(topic);
  String strPayload = String((char*)payload);
  for (unsigned int i = 0; i < length; i++) {
  //Serial.print((char)payload[i]);
  }
  //Serial.println();
  if (strTopic == "ESP02/r_1") {
    if ((char)payload[0] == '0') {
      Status1 = false;
      regim1 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status1 = true;
      regim1 = 1;
    }
  }
  
которая меняет состояние переменной "режим1"
дальше после ЕСП у меня стоит сдвиговый регистр с защелкой чтоб расширить количество выходов, данные в него засылаются вот так

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

Dannie = (regim1<<7)|(regim2<<6)|(regim3<<5)|(regim4<<4)|(regim5<<3)|(regim6<<2)|(regim7<<1)|(regim8);
  Dannie = ~Dannie;
  digitalWrite(latch, LOW);
  shiftOut(data, clk, LSBFIRST, Dannie);
  digitalWrite(latch, HIGH);
переменная "РежимХ" может меняться как при получении команды с Мажордома также и при нажатии кнопки, далее отправляется обратная команда в мажордом об изменении состояния и все ражимы 8 релюх засылаются в сдвиговый регистр, после чего защелкиваются и релюхи включаются.
PI2 + MQTT + 5 ESP8266 + Atmega16
Ответить