• Система автоматизации с открытым исходным кодом на базе 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": []

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