• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

WebSocket Server: Управление выходами

humaxoid

New member
Приветсвую!
Исходник тут https://randomnerdtutorials.com/esp8266-nodemcu-websocket-server-arduino/
Хочу добавить туда пару кнопок. Собственно вот что сделано https://github.com/humaxoid/Websocket_buttons
Включение светодиодов отрабатывает корректно! Но вот отображение статуса кривое. Если включена одна из кнопок то всё ОК. Статус "ON" как и положено показывает каждый для своей кнопки. Но если одна из кнопок включена и включаю другую, то статус первой сбрасывается в "OFF". То есть либо первая кнопка либо вторая. Обе никак. Правки кода с комментариями приветсвуются :)
 

CodeNameHawk

Moderator
Команда форума
Перположу, что посылаете команду одному, а проверку делаете для двух.
Посылаете команду для второго, а первый не находит команды для себя и выключает.
 

EvgeniyS

Member
Предположу, что проблема в функции:
JavaScript:
  function onMessage(event) {
    var state1; if (event.data == "1"){ state1 = "ON";
    // document.getElementById('button1').style.backgroundColor = "#04b50a";
    } else { state1 = "OFF"; // document.getElementById('button1').style.backgroundColor = "#c90411";
    }
      document.getElementById('state1').innerHTML = state1;
//====
   var state2; if (event.data == "3"){ state2 = "ON";} else {state2 = "OFF";}
     document.getElementById('state2').innerHTML = state2;
  }
 

humaxoid

New member
Перположу, что посылаете команду одному, а проверку делаете для двух.
Посылаете команду для второго, а первый не находит команды для себя и выключает.
Предположжение верное!
смотрим джава скрипт. Для каждого статуса в event.data прилетает своё.
Код:
  function onMessage(event) { 
  var state1; if (event.data == "1"){state1 = "ON";} else {state1 = "OFF";}
    document.getElementById("state1").innerHTML = state1;

  var state2; if (event.data == "3"){state2 = "ON";} else {state2 = "OFF";}
    document.getElementById("state2").innerHTML = state2;
  }
А отправлет туда уведомление, вот эта часть кода
Код:
void notifyClients1() {ws.textAll(String(ledState1));}
void notifyClients2() {ws.textAll(String(ledState2+2));}
Всеже мне кажется здесь собака зарыта
Код:
void handleWebSocketMessage(void *arg, uint8_t *data, size_t len) {
  AwsFrameInfo *info = (AwsFrameInfo*)arg;
  if (info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT) {
    data[len] = 0;
    if (strcmp((char*)data, "toggle1") == 0) {
      ledState1 = !ledState1;
      notifyClients1();
     } 
   }
   
    if (strcmp((char*)data, "toggle2") == 0) {
      ledState2 = !ledState2;
      notifyClients2();
  }
}
Уже голову сломал.
 

CodeNameHawk

Moderator
Команда форума
function onMessage(event) { var state1; if (event.data == "1"){state1 = "ON";} else {state1 = "OFF";}
У вас state1 будет принимать "OFF" когда event.data != "1".
Допустим event.data пустой - "OFF", event.data содержит команду для другого контрола state1 - "OFF", так задумано?
 

EvgeniyS

Member
Допустим event.data прилетело 1 - значит state1 будет ON а state2 будет OFF т.к. event.data не равно 3, затем мы включаем state2, прилетает 3 - state1 = OFF, т.к. event.data не равно 1, state2 = ON. Отсюда вывод: обе кнопки на веб морде не могут быть одновременно включены.
 

EvgeniyS

Member
Думаю так должно работать:
JavaScript:
function onMessage(event) {
    switch(event.data) {
        case '0':
            document.getElementById("state1").innerHTML = "OFF";
        break
        case '1':
            document.getElementById("state1").innerHTML = "ON";
        break
        case '3':
            document.getElementById("state2").innerHTML = "OFF";
        break
        case '4':
            document.getElementById("state2").innerHTML = "ON";
        break
    }
    }
 

humaxoid

New member
Спасибо большое за подсказку. Только у вас печатка- case '2': а не 3 и.т.д.
 

humaxoid

New member
Другая байда нарисовалась. При обновлении страницы, статус сбрасывается. Т.е не "ON" и не "OFF", а тупо в окнах статуса показывает переменную из html %STATE1% , %STATE2% и.т.д. Если нажать на кнопку, то статус показывает корректно. Началось это после того как всё разложил по файлам index.html, style.css, scrypt.js и файл с кодом прошивки всё отдельно. SPIFFS однако. Когда стили и скрипт лежали в теле htlm, а сам html встроен в код прошивки, было нормально. В какую сторону хоть копать то?
 
Сверху Снизу