tretyakovsa / Sonoff_WiFi_switch

Прошивка для ESP8266 (Умный дом)-Firmware for ESP8266 (Smart Home)
GNU General Public License v3.0
178 stars 40 forks source link

Сценарий с температурой работает некорректно. #143

Open multysea opened 5 years ago

multysea commented 5 years ago

Создал простенький сценарий, если температура меньше 23 - включить реле, если больше 25 - выключить. Но, после снижения температуры до 23 реле включилось, а после повышения до более , чем 25 так и не выключилось. Причем если отключить реле вручную, то при снижении до нижнего порога оно включается. Почему так?

renat2985 commented 5 years ago

После добавления сценария связанного с Тимпературой, Влажностью или Аналоговым выходом нужно перезагружать ESP. Это баг, скоро исправим.

multysea commented 5 years ago

Естественно, что я перезагружал, и не только софт-ресетом, но и хард. И все равно, при понижении включается, при повышении не выключается. Может ли это быть связано с тем, что на это реле у меня есть еще и кнопка?

Egor2101 commented 5 years ago

У меня стабильная прошивка. На реле кнопка + сценарий. Все работает штатно.

Egor2101 commented 5 years ago

На графике температуры у вас отображаются три линии?

multysea commented 5 years ago

Да, три, средняя - движется, в соответствии с изменением температуры..

multysea commented 5 years ago

У меня на этом модуле также стабильная прошивка и на реле кнопка и сценарий. Сценарий переклбчает кнопку в положение "включено" при понижении температуры, но не переключает в "выключено" при повышении.

multysea commented 5 years ago

А может все же кто-то что-то посоветовать:-)? Кроме перезагрузки модуля, ее я изначально делал..

renat2985 commented 5 years ago

@multysea скорее всего вы что-то не так подключили. Если у других все работает.

multiminik commented 5 years ago

А может все же кто-то что-то посоветовать:-)? Кроме перезагрузки модуля, ее я изначально делал..

У вас пин подключенный к кнопке шунтирован через резистор к земле, либо питанию?

multysea commented 5 years ago

Физической кнопки нет, только виртуальная, в интерфейсе

multiminik commented 5 years ago

Виртуальная кнопка настроена через TACH? И я так понимаю, по умолчанию там прописан, в качестве пина, "gpio0" (то есть значение по умолчанию в конфигурации)? Если этот пин не привязан к плюсу питания через резистор в 10кОм, то на нём висит положительный потенциал - равный половине питания (1.65В). Т.е. пин не сконфигурирован должным образом. Отсюда и может появлятся проблема с вашей кнопкой. Также модуль при включении может не входить в рабочий режим, а уходить в режим прошивки при определенных условиях.

Egor2101 commented 5 years ago

Сценарий по влажности и температуре на am2301 работал штатно. Подключил ds18b20 . На главной странице есть график и три линии. Но сценарий молчит... При нажатии кнопки управление график не отображается, а шкала температуры от 0 до 1.

multysea commented 5 years ago

Большая просьба, все же, кому-то из разработчиков ответить в этой теме? Сценарии не работают! Датчик 18b20, и даже резистор между gpio0 и плюсом, как тут советовали, повесил. Все включено правильно, в трех проводах сложно напетлять. Сценарий не работает, виртуальные кнопки работают, реле переключаются. В сценарии - если температура меньше 25 - включить реле, если больше 29 - выключить. Прошивка стабильная. Модуль сам по себе не перегружается и в режим flash не входит, температуры с DHT11 и 18b20 и влажность с DHT11 показывает, линий на графике температуры c 18b20 - три.

Дополню. После выключения на длительное время и последующего включения начинает работать только первая задача сценария, если температура при включении модуля ниже порога, то реле включается, и его нельзя выключить даже кнопкой. А при повышении температуры до верхнего порога реле не выключается, но кнопкой его становится возможным выключить. И последнее, если включить модуль в то время как температура выше верхнего порога реле не включается. После охлаждения датчика - включается, но при нагреве до верхнего порога - не выключается. Много букв, но может быть это поможет лучше понять, что происходит и дать какие-то рекомендации?

mikemdr commented 5 years ago

Решил проверить (чуть изменив исходник Scenary.ino) сценарий по-температуре (исходник - последний стабильный, 8266Core 2.3.0, т.к. на >2.3.0 в данном коде некорректно работает обновление по NTP)

` void orCommand() { String Name = readArgsString(); // Какой параметр проверяем String Condition = readArgsString(); // Операция String Volume = readArgsString(); // Значение параметра String test = getStatus(Name); // получить текущее значение параметра

    Serial.print(Name);//
    Serial.print("(= ");//
    Serial.print(test);//
    Serial.print(" ) ");//
    Serial.print(Condition);//
    Serial.print(" ");//
    Serial.println(Volume);//

  testCommand(Volume, Condition, test);
}

void testCommand(String Volume, String Condition, String test) {
  // последовательно проверяем параметр на соответствие операции сравнения
  // и поднимаем признак исполнения then
...
  if (Condition == ">") {
    Serial.print("Volume ");//
    Serial.println(Volume);//
    Serial.print("Volume.toFloat() ");//
    Serial.println(Volume.toFloat());//
    Serial.print("test.toFloat() ");//
    Serial.println(test.toFloat());//
    if (Volume.toFloat() < test.toFloat()) thenOk = true;
  }
  if (Condition == "<") {
    if (Volume.toFloat() > test.toFloat()) thenOk = true;
  }
...

` и вот что на выходе (у меня задано два сценария: ">27.00" "<27.00" )

При повышении температуры; ... t 26.94 t 26.94 t 27.12 // текущая температура с DS1820 f 1 // Признак, что температура превысила заданную

Tach0(= 0) = 1 // Сценарий по кнопке thenOk = 0

temperature1(= 27 ) > 27 // 1-ый Сценарий Volume 27 // заданная температура Volume.toFloat() 27.00 test 27 // текущая температура из orCommand()[(test = getStatus(Name))]. А не 27.12!!!! test.toFloat() 27.00 thenOk = 0 // т.к. сравнивается 27.00>27.00, а не 27.12>27.00 , то команды на выполнение НЕ будет

temperature1(= 27 ) < 27 // 2-ой Сценарий thenOk = 0
t 27.50 t 27.81 ...

При понижении температуры; ... t 27.25 t 27.25 t 26.62 f 1 Tach0(= 0) = 1
thenOk = 0

temperature1(= 26 ) > 27
Volume 27 Volume.toFloat() 27.00 test 26 test.toFloat() 26.00 thenOk = 0

temperature1(= 26 ) < 27 thenOk = 1 comm= pinout not 1 t 25.19 t 24.44 ...

Вывод: попробуйте вместо ">" использовать ">=" !!!

mikemdr commented 5 years ago

если температура при включении модуля ниже порога, то реле включается, и его нельзя выключить даже кнопкой.

И, т.к. проверка кнопки идёт первой, то сначала подаётся команда на выключение, а через несколько микросекунд сценарий по температуре подаёт команду на включение. Попробуйте поставить Сценарий-По-Кнопке последним. P.S. Я несколько раз перешивал модуль (с предыдущей версией), думая что модуль глючит, т.к. он при нажатии кнопки выключался и тут-же включался, пока не понял, что если модуль включился по таймеру, то его можно выключить только отключив таймер !!!

mikemdr commented 5 years ago

Ошибка возникала из-за того, что есть 3 функции: boolean sendStatus(String Name, String volume) {} boolean sendStatus(String Name, int volume) {} boolean sendStatusF(String Name, float volume) {}. У авторов: flag = sendStatus(value, getStatusFloat(value)); а должно быть : flag = sendStatusF(value, getStatusFloat(value)); иначе float getStatusFloat(value) интерпретировалась как int и записывалась только целая часть.