Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Нужна помощь запросы c WEB сервера

Тема в разделе "Раздел для начинающих", создана пользователем DRC, 6 фев 2019.

Метки:
  1. DRC

    DRC Новичок

    Сообщения:
    2
    Симпатии:
    0
    Добрый день!

    Помогите, пожалуйста разобраться в проблеме:

    есть Web server на esp8266 который управляет реле в режиме on/off

    Код (C):
    1. #include <ESP8266WiFi.h>
    2. const char* ssid     = "xxx";
    3. const char* password = "xxx";
    4. WiFiServer server(80);
    5. String header;
    6. String output5State = "off";
    7. const int output5 = 5;
    8.  
    9. // устанавливаем mac адрес устройства
    10. void initVariant() {
    11.   uint8_t mac[6] = {0x00, 0xA3, 0xA0, 0x1C, 0x8C, 0x45};
    12.   wifi_set_macaddr(STATION_IF, &mac[0]);
    13. }
    14.  
    15. void setup() {
    16. Serial.begin(115200);
    17.  
    18. pinMode(output5, OUTPUT);
    19. digitalWrite(output5, LOW);
    20.  
    21.   // Connect to Wi-Fi network with SSID and password
    22.   Serial.print("Connecting to ");
    23.   Serial.println(ssid);
    24.   WiFi.begin(ssid, password);
    25.   while (WiFi.status() != WL_CONNECTED) {
    26.     delay(500);
    27.     Serial.print(".");
    28.   }
    29.   // Print local IP address and start web server
    30.   Serial.println("");
    31.   Serial.println("WiFi connected.");
    32.   Serial.println("IP address: ");
    33.   Serial.println(WiFi.localIP());
    34.   server.begin();
    35. }
    36.  
    37. void loop(){
    38.   WiFiClient client = server.available();  
    39.  
    40.   if (client) {                            ,
    41.     Serial.println("New Client.");        
    42.     String currentLine = "";            
    43.     while (client.connected()) {          
    44.       if (client.available()) {          
    45.         char c = client.read();          
    46.         Serial.write(c);                
    47.         header += c;
    48.         if (c == '\n') {                  
    49.          
    50.           if (currentLine.length() == 0) {
    51.             // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
    52.             // and a content-type so the client knows what's coming, then a blank line:
    53.             client.println("HTTP/1.1 200 OK");
    54.             client.println("Content-type:text/html");
    55.             client.println("Connection: close");
    56.             client.println();
    57.          
    58.             // включаем-выключаем реле
    59.             if (header.indexOf("GET /5/on") >= 0) {
    60.               Serial.println("GPIO 5 on");
    61.               digitalWrite(output5, HIGH);
    62.               output5State = "on";
    63.             } else if (header.indexOf("GET /5/off") >= 0) {
    64.               Serial.println("GPIO 5 off");
    65.               output5State = "off";
    66.               digitalWrite(output5, LOW);
    67.          
    68.             }
    69.          
    70.             //HTML web page
    71.             client.println("<!DOCTYPE html><html>");
    72.             client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
    73.             client.println("<link rel=\"icon\" href=\"data:,\">");
    74.             // CSS to style the on/off buttons
    75.             // Feel free to change the background-color and font-size attributes to fit your preferences
    76.             client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
    77.             client.println(".button { background-color: #195B6A; border: none; color: white; padding: 16px 40px;");
    78.             client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
    79.             client.println(".button2 {background-color: #77878A;}</style></head>");
    80.          
    81.             // Web Page Heading
    82.             client.println("<body><h1>ESP8266 Web Server</h1>");
    83.          
    84.             // Display current state, and ON/OFF buttons for GPIO 5
    85.             client.println("<p>GPIO 5 - State " + output5State + "</p>");
    86.             // If the output5State is off, it displays the ON button    
    87.             if (output5State=="off") {
    88.               client.println("<p><a href=\"/5/on\"><button class=\"button\">ON</button></a></p>");
    89.             } else {
    90.               client.println("<p><a href=\"/5/off\"><button class=\"button button2\">OFF</button></a></p>");
    91.             }
    92.                              
    93.               client.println();
    94.             // Break out of the while loop
    95.             break;
    96.           } else { // if you got a newline, then clear currentLine
    97.             currentLine = "";
    98.           }
    99.         } else if (c != '\r') {  // if you got anything else but a carriage return character,
    100.           currentLine += c;    
    101.         }
    102.       }
    103.     }
    104.     header = "";
    105.     client.stop();
    106.     Serial.println("Client disconnected.");
    107.     Serial.println("");
    108.   }
    109. }
    при просто работе с WEB все работает как надо.

    При попытке соединить это с HomeBridge возникает проблема, решение которой не нашел в силу отсутствия глубоких знаний.

    Использую плагин:
    Powerful http switch for Homebridge (Supereg/homebridge-http-switch)

    Код (Text):
    1.         {
    2.             "accessory": "HTTP-SWITCH",
    3.             "name": "Switch",
    4.             "switchType": "stateful",
    5.             "debug": true,
    6.             "onUrl": {
    7.                 "url": "http://10.0.1.21/5/on",
    8.                 "method": "GET"
    9.             },
    10.             "offUrl": {
    11.                 "url": "http://10.0.1.21/5/off",
    12.                 "method": "GET"
    13.             },
    14.             "statusUrl": {
    15.                 "url": "http://10.0.1.21/output5State",
    16.                 "method": "GET"
    17.             }

    для определения состояния выключателя был использован параметр output5State. Но состояние не изменятся не важно какой метод был выбран или какие значения "on" или 1 были присвоены в коде esp
    Сам выключатель работает как из WEB так и из HomeKit но в HomeKit не запоминает состояния которое на устройстве если преложение закрыть и открыть снова

    Отсюда вопрос, что не так или где можно на примерах посмотреть как надо делать и как это должно работать?
     
  2. remrum

    remrum Читатель

    Сообщения:
    34
    Симпатии:
    5
    Сделайте отдельный обработчик запроса статуса http://10.0.1.21/output5State
    Пример как сделать есть здесь.
    Плагину homebridge отдавайте статус в виде 0 или 1.
    Для обновления статуса в homekit попробуйте для начала метод периодического опроса указав в настройке pullInterval.
    Все описано на странице плагина.
    Но даже не используя дополнительный опрос, homekit делает запрос статуса при открытии приложения.
     
  3. DRC

    DRC Новичок

    Сообщения:
    2
    Симпатии:
    0
    получается я создаю запрос вида:
    Код (Text):
    1. server.on("/stat", sendServer);
    и делаю модуль ответа с условиями:
    Код (Text):
    1. // Отправляем серверу события ручного вкл./выкл.
    2. void sendServer(){
    3. if(lamp_on == true) {
    4.     server.send(200, "text/plain", "1");
    5.       } else {
    6.     server.send(200, "text/plain", "0");
    7.       }
    8. }
    если через браузер провеляю команду localhost/stat то получаю ответ 1 или 0, но homedridge по прежнему не видит состояние
     
  4. remrum

    remrum Читатель

    Сообщения:
    34
    Симпатии:
    5
    homebridge-http-switch передает состояние каждый раз когда открывается интерфейс "Дом".
    В чем можно легко убедится поменяв состояние и закрыв/открыв "Дом".
    Для того что-бы в реальном времени видеть статус переключателя добавьте в конфиг строчку: "pullInterval": 1000,
    И получите обновление каждую секунду.
    Но это не самый хороший способ. Есть и другие - сервер уведомлений, websocket.
    Ещё раз повторю, все описано на странице плагина.
     

Поделиться этой страницей