• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Homebridge + esp8266 + rgb led

lNavil

New member
Всем доброго времени суток. В этой теме поделюсь опытом, который требует поправок:rolleyes:

Хотел сделать, что то на подобии управление светодиодной лентой голосом и это получилось сделать с помощью Homebridge и айфона, сири распознает голос и отправляет запрос на сервер, а тот же отправляет его на esp. Все хорошо работает, но ответ от esp сервер не получает, по непонятной мне причине.

Код для esp
Код:
#include <ESP8266WiFi.h>
#define max(a,b) ((a)>(b)?(a):(b))

#define redPin 0 //GPIO_0 - Red channel
#define grnPin 2 //GPIO_2 - Green channel
#define bluPin 3 //GPIO_3/RXD - Blue channel

WiFiServer server(80); //Set server port

String readString;           //String to hold incoming request
String hexString = "000000"; //Define inititial color here (hex value)

int state;

int r;
int g;
int b;

float R;
float G;
float B;

int x;
int V;

///// WiFi SETTINGS - Replace with your values /////////////////
const char* ssid = "admin";
const char* password = "1010101010";
IPAddress ip(10,1,1,198);      // set a fixed IP
IPAddress gateway(10,1,1,1);  // Your router IP
IPAddress subnet(255,255,255,0); // Subnet mask
////////////////////////////////////////////////////////////////////

void WiFiStart() {
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet);
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    Serial.print("_");
  }
  Serial.println();
  Serial.println("Done");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.println("");

  server.begin();                   
}

void allOff() {
  state = 0;
  analogWrite(redPin, 0);
  analogWrite(grnPin, 0);
  analogWrite(bluPin, 0);
}

//Write requested hex-color to the pins (10bit pwm)
void setHex() {
  state = 1;
  long number = (long) strtol( &hexString[0], NULL, 16);
  r = number >> 16;
  g = number >> 8 & 0xFF;
  b = number & 0xFF;
  r = map(r, 0, 255, 0, 1023);  //added for 10bit pwm
  g = map(g, 0, 255, 0, 1023);  //added for 10bit pwm
  b = map(b, 0, 255, 0, 1023);  //added for 10bit pwm
  analogWrite(redPin, (r));
  analogWrite(grnPin, (g));
  analogWrite(bluPin, (b));
}

//Compute current brightness value
void getV() {
  R = roundf(r/10.23);  //for 10bit pwm, was (r/2.55);
  G = roundf(g/10.23);  //for 10bit pwm, was (g/2.55);
  B = roundf(b/10.23);  //for 10bit pwm, was (b/2.55);
  x = max(R,G);
  V = max(x, B);
}

//For serial debugging only
void showValues() {
  Serial.print("Status on/off: ");
  Serial.println(state);
  Serial.print("RGB color: ");
  Serial.print(r);
  Serial.print(".");
  Serial.print(g);
  Serial.print(".");
  Serial.println(b);
  Serial.print("Hex color: ");
  Serial.println(hexString);
  getV();
  Serial.print("Brightness: ");
  Serial.println(V);
  Serial.println("");
}

void setup(){
  Serial.begin(115200);
  setHex(); //Set initial color after booting. Value defined above
  WiFi.mode(WIFI_STA);
  WiFiStart();
  //showValues(); //Uncomment for serial output
}

void loop() {
  //Reconnect on lost WiFi connection
  if (WiFi.status() != WL_CONNECTED) {
    WiFiStart();
  }

  WiFiClient client = server.available();

  if (!client) {
    return;
  }

  while(client.connected() && !client.available()) {
    delay(1);
  }

  //Respond on certain Homebridge HTTP requests
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (readString.length() < 100) {
          readString += c;
        }
        if (c == '\n') {
          Serial.print("Request: "); //Uncomment for serial output
          Serial.println(readString); //Uncomment for serial output

          //Send reponse
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          //On
          if(readString.indexOf("on") >0) {
            setHex();
            showValues();
          }

          //Off
          if(readString.indexOf("off") >0) {
            allOff();
            showValues();
          }

          //Set color
          if(readString.indexOf("set") >0) {
            hexString = "";
            hexString = (readString.substring(9,15));
            setHex();
            showValues();
          }

          //Status on/off
          if(readString.indexOf("status") >0) {
          client.println(state);
          }

          //Status color (hex)
          if(readString.indexOf("color") >0) {
          client.println(hexString);
          }

          //Status brightness (%)
          if(readString.indexOf("bright") >0) {
          getV();
          client.println(V);
          }

          delay(1);
          client.stop();
          readString="";
        }
      }
    }
  }
}
конфиг для homebridge
Код:
{
   "bridge": {
      "name": "NavigatoR",
      "username": "CC:22:3D:E3:CE:30",
      "port": 51826,
      "pin": "031-45-154"
   },

   "description": "Example configuration file for NodeMCU-RGB-Controller and better-http-rgb plugin",

   "accessories": [{
      "accessory": "HTTP-RGB",
      "name": "RGB Strip",

      "switch": {
         "status": "http://192.168.1.10:80/status",
         "powerOn": "http://192.168.1.10:80/on",
         "powerOff": "http://192.168.1.10:80/off"
      },

      "color": {
         "status": "http://192.168.1.10:80/color",
         "url": "http://192.168.1.10:80/set/%s"
      },

      "brightness": {
         "status": "http://192.168.1.10:80/bright",
         "url": "http://192.168.1.10:80/set/%s"
      }
   }],

   "platforms": []

}

Как я уже и говорил ранее, запросы уходят, лента регулируется, но нет ответа от esp. Кто знает как это можно решить? o_O
 

Алексей.

Active member
lNavil, У Вас в ответе, в заголовках ответа, указан заголовок Content-Type со значением text/html и отсутствует заголовок Content-Length, этот заголовок должен присутствовать. Смотрите правила, раздел 4.4 Message Length и 14.11 Content-Encoding
 

Алексей.

Active member
@Алексей. добавил заголовок, но ошибка осталась
Единственный заголовок который обычно присутствует во всех ответах это Connection, если приложения не поддерживает постоянные подключения, должны включать устанавливать close в этом заголовке.
1. А Вы уверены что сервер ожидает в ответ плайнтекст а не джейсон?
2. После серии client.println Вы выполняете delay(1) и client.stop(), Вы бы с начала хоть client.flush() вызвали вместо delay(1), Ваш сервер ответа просто не дожидается о чем и говорит в логах :)
setPowerState() failed: read ECONNRESET
ECONNRESET - Connection reset by peer
 
Последнее редактирование:

lNavil

New member
@Алексей. спасибо большое, это решило проблему с получением ответа, но вот теперь сервер выдаёт ошибку при парсинге ответа
 

Алексей.

Active member
Не меняя содержимого ответа Вы в заголовках меняете тип???
Если передаете джейсон объект, то указываете в заголовках джейсон, если передаете текст то - плайнтекст.
Вы сами то представляете что нужно отдать серверу? А то получается так: нужно отправить что-то, что не знаю, но так чтоб заработало.
Броузером пробовали выполнит такие-же запросы какие отправляет сервер "http://192.168.1.10:80/status"? В отладчике на броузере посмотрите нет ли ошибок.
 

sonic-win

New member
Привет народ. Можете внести ясность, как этот конфиг залить на esp? Скетч понятно, шьётся ардуиной. А вот конфиг куда? Как с ним поступить?

конфиг для homebridge
Код:
{
   "bridge": {
      "name": "NavigatoR",
      "username": "CC:22:3D:E3:CE:30",
      "port": 51826,
      "pin": "031-45-154"
   },

   "description": "Example configuration file for NodeMCU-RGB-Controller and better-http-rgb plugin",

   "accessories": [{
      "accessory": "HTTP-RGB",
      "name": "RGB Strip",

      "switch": {
         "status": "http://192.168.1.10:80/status",
         "powerOn": "http://192.168.1.10:80/on",
         "powerOff": "http://192.168.1.10:80/off"
      },

      "color": {
         "status": "http://192.168.1.10:80/color",
         "url": "http://192.168.1.10:80/set/%s"
      },

      "brightness": {
         "status": "http://192.168.1.10:80/bright",
         "url": "http://192.168.1.10:80/set/%s"
      }
   }],

   "platforms": []

}
 
Сверху Снизу