I had to insert
"service": "Light",
"name": "Single Color Light",
Also for a correct RGBW Output I had to insert
"brightness": true
Otherwise I couldnt set any White color in homekit.
I love this tutorial and I almost have it up and running. There is only one problem, when i change the Brightness in the home app the color of the LEDstrip turns blue. when i select a color of my choice and i turn up the Brightness to 100% the color wil turn into green (verry low brightness)
I have no clue what this could be,
Greetings,
Willem
My Script:
//NodeMCU RGB-Controller for Homebridge & HomeKit (Siri)
#include <ESP8266WiFi.h>
#include <math.h>
#define redPin 13 //D7 - Red channel
#define grnPin 12 //D6 - Green channel
#define bluPin 14 //D5 - Blue channel
#define max(a,b) ((a)>(b)?(a):(b))
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;
int g;
int b;
float R;
float G;
float B;
int x;
int V;
///// WiFi SETTINGS - Replace with your values /////////////////
const char* ssid = "XX";
const char* password = "XXX";
IPAddress ip(XX, XXX, X, XX); // set a fixed IP for the NodeMCU
IPAddress gateway(XXX, XXX, X, XX); // 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); //Set a fixed IP. You can comment this out and set it in your router instead.
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;
for (float fade = 1.0; fade >= 0.0; fade -= 0.01) {
analogWrite(redPin, map((r * fade), 0, 255, 0, 1023));
analogWrite(grnPin, map((g * fade), 0, 255, 0, 1023));
analogWrite(bluPin, map((b * fade), 0, 255, 0, 1023));
delay(2);
}
// Set r/g/b to 0 so fade in is possible
r = 0;
b = 0;
g = 0;
}
//Write requested hex-color to the pins
void setHex() {
const float STEPS = 100; // Change number of steps while fading (lower is faster)
// Save old values of r/g/b
byte oldR = r;
byte oldG = g;
byte oldB = b;
long number = (long) strtol( &hexString[0], NULL, 16);
r = number >> 16;
g = number >> 8 & 0xFF;
b = number & 0xFF;
float deltaR = (r - oldR) / STEPS;
float deltaG = (g - oldG) / STEPS;
float deltaB = (b - oldB) / STEPS;
// Fade to new colour
for (float f = 0; f < STEPS; f++) {
analogWrite(redPin, map((oldR + (deltaR * f)), 0, 255, 0, 1023));
analogWrite(grnPin, map((oldG + (deltaG * f)), 0, 255, 0, 1023));
analogWrite(bluPin, map((oldB + (deltaB * f)), 0, 255, 0, 1023));
delay(2);
}
state = 1;
}
//Compute current brightness value
void getV() {
R = roundf(r/2.55); //was (r/10.23);
G = roundf(g/2.55); //was (g/10.23);
B = roundf(b/2.55); //was (b/10.23);
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
WiFi.mode(WIFI_STA);
WiFiStart();
setHex(); //Set initial color after booting. Value defined above
}
void loop() {
//Reconnect on lost WiFi connection (superfluous - will reconnect anyway)
/*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: ");
//Serial.println(readString);
//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);
client.stop();
readString="";
}
}
}
}
}