• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 встроен в код прошивки, было нормально. В какую сторону хоть копать то?
 
Сверху Снизу