Esp+реле+mqtt+mdm

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

Модератор: immortal

yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am
Благодарил (а): 28 раз
Поблагодарили: 5 раз

Esp+реле+mqtt+mdm

Сообщение yden » Чт апр 05, 2018 8:34 am

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

благодарю
ZyaK
Сообщения: 407
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 45 раз
Поблагодарили: 69 раз

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

Сообщение 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
Вложения
Light.jpg
Light.jpg (79.19 КБ) 6371 просмотр
MQTT.jpg
MQTT.jpg (146.42 КБ) 6371 просмотр
Последний раз редактировалось ZyaK Пт апр 06, 2018 11:33 am, всего редактировалось 1 раз.
PI2 + MQTT + 5 ESP8266 + Atmega16
Jilber
Сообщения: 682
Зарегистрирован: Ср май 03, 2017 7:41 pm
Благодарил (а): 111 раз
Поблагодарили: 107 раз

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

Сообщение Jilber » Пт апр 06, 2018 9:01 am

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

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

Сообщение ZyaK » Пт апр 06, 2018 11:12 am

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

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

Сообщение yden » Пт апр 06, 2018 12:03 pm

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
Сообщения: 407
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 45 раз
Поблагодарили: 69 раз

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

Сообщение ZyaK » Пт апр 06, 2018 12:12 pm

нет, сделано именно с обратной связью, при изменении состояния летит пакет 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
Благодарил (а): 28 раз
Поблагодарили: 5 раз

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

Сообщение yden » Пт апр 06, 2018 12:30 pm

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

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

Сообщение ZyaK » Пт апр 06, 2018 12:44 pm

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

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

Сообщение yden » Пт апр 06, 2018 12:48 pm

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

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

Сообщение ZyaK » Пт апр 06, 2018 12:54 pm

Если была команда на включение /отключение реле со стороны 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
Ответить