Love the tutorial! It's what I've been looking for for ages!
I've got everything set up but I've run into a few issues. The first of which was fairly easy to solve. I believe you forgot to include
in the config.json as without it, HomeKit says it does not support that type of accessory.
However, the problem which I am still experiencing is with the brightness. I.e. whilst I can set the colour absolutely fine, when I try to change the brightness, it sets the colour to blue, and then I have to manually change the colour to another one. This also means that there are a number of issues when trying to set up Automations within Homekit. I would really appreciate it if you could look further into this as it is an otherwise awesome project, thank you!
Kind regards, Tom
P.S. Whilst it isn't really too much of an issue; after restarting the strip circuit it appears in HomeKit as "On" even though it admits that the brightness is 0%. Is this something you could see if you could fix? No worries if not as it's not a major issue.
Here is my code (I made I few modifications with the WiFi and Serial setup):
Code: Select all#include <ESP8266WiFi.h>
#define redPin 13 //D7 - Red channel
#define grnPin 12 //D6 - Green channel
#define bluPin 14 //D5 - Blue channel
WiFiServer server(80); //Set server port
String readString; //String to hold incoming request
String hexString = "000000"; //Define inititial color here (hex value), 080100 would be a calm warmtone i.e.
int state;
int r, g, b, V;
float R, G, B, x;
///// WiFi SETTINGS - Replace with your values /////////////////
const char* ssid = "SSID";
const char* password = "PASSWORD";
////////////////////////////////////////////////////////////////////
void WiFiStart() {
Serial.begin(115200);
delay(10);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.softAPdisconnect(true);
WiFi.begin(ssid, password);
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(9600);
delay(1);
pinMode(redPin, OUTPUT); //declaration added
pinMode(grnPin, OUTPUT); //declaration added
pinMode(bluPin, OUTPUT); //declaration added
setHex(); //Set initial color after booting. Value defined above
WiFi.mode(WIFI_STA);
WiFiStart();
//showValues(); //Uncomment for serial output
int state = 0;
}
void loop() {
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);
while (client.read() >= 0); //added: clear remaining buffer to prevent ECONNRESET
client.stop();
readString.remove(0);
}
}
}
}
}