OpenHAB and MiLight – Smart LED bulbs at a price even you can afford!

Recently I discovered that OpenHAB comes with a Binding to support cheap chinese Milight Smart LED bulbs:

milight1

You need:

Bulbs + Wifi Bridge:  AliExpress.com 4pcs/lot LED RGBW bulb 6W E27 base Milight AC85-265V & Four Zone Remote & WiFi Controller

or

4x 2.4G Wireless MiLight RGBW Warm White E27 9W LED Bulb Smart Light + Milight WiFi Controller iOS/Android

and the MiLight Binding from https://github.com/openhab/openhab/wiki/Milight-Binding

Here’s some Youtube videos I found of other people playing with MiLight:

Can’t wait for get some!  If you want to support the work I do consider donating me a set?

Have a good one!

OpenHAB and HTTP Toggle Buttons

Yesterday, one of my readers contacted me to ask:

do you have en example of a switch calling a url? failing quite badly at getting it to work

So, herewith I oblige:   Here’s how I would set it up:

 sudo vi /opt/openhab/configurations/items/dolphin.items

In my Items file, I add an item:

Switch Toggle "Toggle" (all) { autoupdate="true" }

Next, I add this item to my Sitemap:

sudo vi /opt/openhab/configurations/sitemaps/dolphin.sitemap

and add it like:

 Switch item=Toggle label="Toggle"

Next, we need to create a rule to manage this toggling action into HTTP requests:

sudo vi /opt/openhab/configurations/rules/httpreq.rules

and inside this file I add two rules, one to catch the ON and one to catch the OFF:

rule updateToggleOn
when
 Item Toggle received command ON
then
 sendHttpGetRequest("http://192.168.1.5/?pin=ON")
end
rule updateToggleOff
when
 Item Toggle received command OFF
then
 sendHttpGetRequest("http://192.168.1.5/?pin=OFF")
end

Now, in this case the device I am controlling is a simple ESP8266 WebApp from https://github.com/nodemcu/nodemcuirmware/blob/master/lua_examples/webap_toggle_pin.lua to demonstrate the idea to Michael.  Since its this simple sketch, you can expect a cosmetic error to popup in openhab.log:

05:37:12.169 ERROR o.openhab.io.net.http.HttpUtil[:230]- Fatal protocol violation: org.apache.commons.httpclient.ProtocolException: The server 192.168.1.5 failed to respond with a valid HTTP response

05:37:12.169 ERROR o.openhab.io.net.http.HttpUtil[:230]- Fatal protocol violation: org.apache.commons.httpclient.ProtocolException: The server 192.168.1.5 failed to respond with a valid HTTP response

The ESP8266 sketch doesnt return a valid HTTP header. No worries though, ignore the error – it still works!

So, the above example takes care of a device needing an “on” and “off” …

But what about a a “toggle” or “momentary” button (Garage door opener for example?)

Easy:  One simple change in the Items file and one less rule:

Switch Toggle "Toggle" (all) { autoupdate="false" }

Setting Autoupdate to False it will automatically revert to the OFF position after clicking the switch…

and in the rules:

rule updateToggleOn
when
 Item Toggle received command ON
then
 sendHttpGetRequest("http://192.168.1.5/?toggle=TRUE")
end

We only need the first rule, the On state – handle the on as your toggle command…

Easy!

OPENHAB, MQTT, ARDUINO AND ESP8266: PART 9: CUSTOM CIRCUIT BOARDS

Finally arrived, soldered up and tested!

2015 - 1 (1)

Schematics, Board and Gerbers are released as open source hardware under a CC-BY-SA licence and you can find it on my GitHub repo at https://github.com/openhardwarecoza/esp8266-PROJECTS/tree/master/ESP8266-%204%20channel%20mosfet%20switch

2015 - 1

OPENHAB, MQTT, ARDUINO AND ESP8266: PART 8: RGB+W LED Strips

Lets kickoff with a demo video!

And the code as always

(ESP8266 with Arduino)

#include <ESP8266WiFi.h>
#include <PubSubClient.h>


// #define PWMRANGE 255
// #define PWM_VALUE 31
//int gamma_table[PWM_VALUE+1] = {
// 0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11, 13, 16, 19, 23,
// 27, 32, 38, 45, 54, 64, 76, 91, 108, 128, 152, 181, 215, 255
//};
 
 #define PWM_VALUE 63
//int gamma_table[PWM_VALUE+1] = {
// 0, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 9, 10,
// 11, 12, 13, 15, 17, 19, 21, 23, 26, 29, 32, 36, 40, 44, 49, 55,
// 61, 68, 76, 85, 94, 105, 117, 131, 146, 162, 181, 202, 225, 250,
// 279, 311, 346, 386, 430, 479, 534, 595, 663, 739, 824, 918, 1023
//};

int gamma_table[PWM_VALUE+1] = {
 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8, 9, 10,
 11, 12, 13, 15, 17, 19, 21, 23, 26, 29, 32, 36, 40, 44, 49, 55,
 61, 68, 76, 85, 94, 105, 117, 131, 146, 162, 181, 202, 225, 250,
 279, 311, 346, 386, 430, 479, 534, 595, 663, 739, 824, 918, 1023
};



// RGB FET
#define redPIN 12
#define greenPIN 14
#define bluePIN 16


// W FET
#define w1PIN 13

// note 
// TX GPIO2 @Serial (Serial ONE)
// RX GPIO3 @Serial 

const char *ssid = "openhardwarecoza"; // your network SSID (name)
const char *pass = "novell1234"; // your network password


// Update these with values suitable for your network.
IPAddress server(192, 168, 1, 200);

void callback(const MQTT::Publish& pub) {
 Serial.print(pub.topic());
 Serial.print(" => ");
 Serial.println(pub.payload_string());
 
 String payload = pub.payload_string();

if(String(pub.topic()) == "/openHAB/RGB_2/Color"){
 int c1 = payload.indexOf(';');
 int c2 = payload.indexOf(';',c1+1);
 
 int red = map(payload.toInt(),0,100,0,PWM_VALUE);
 red = constrain(red,0,PWM_VALUE);
 int green = map(payload.substring(c1+1,c2).toInt(),0,100,0,PWM_VALUE);
 green = constrain(green, 0, PWM_VALUE);
 int blue = map(payload.substring(c2+1).toInt(),0,100,0,PWM_VALUE);
 blue = constrain(blue,0,PWM_VALUE);
 
 red = gamma_table[red];
 green = gamma_table[green];
 blue = gamma_table[blue];
 
 
 analogWrite(redPIN, red);
 analogWrite(greenPIN, green);
 analogWrite(bluePIN, blue);

// Serial.println(red);
// Serial.println(green);
// Serial.println(blue);
 }
 else if(String(pub.topic()) == "/openHAB/RGB_2/SW1"){
 int value = map(payload.toInt(),0,100,0,PWM_VALUE);
 value = constrain(value,0,PWM_VALUE);
 value = gamma_table[value];
 analogWrite(w1PIN, value);
 //Serial.println(value);
 }
 
}

PubSubClient client(server);

void setup()
{
 
 pinMode(redPIN, OUTPUT);
 pinMode(greenPIN, OUTPUT);
 pinMode(bluePIN, OUTPUT);
 pinMode(w1PIN, OUTPUT);
 
 // Setup console
 Serial.begin(115200);
 delay(10);
 Serial.println();
 Serial.println();

 client.set_callback(callback);

 WiFi.begin(ssid, pass);


 
 while (WiFi.status() != WL_CONNECTED) {

 
 delay(500);
 Serial.print(".");
 
 }
 
 Serial.println("");
 
 Serial.println("WiFi connected");
 Serial.println("IP address: ");
 Serial.println(WiFi.localIP());
 
 
 if (client.connect("WiFi_RGB_2")) {
 client.subscribe("/openHAB/RGB_2/Color");
 client.subscribe("/openHAB/RGB_2/SW1");
 Serial.println("MQTT connected"); 
 }

 Serial.println("");
}


void loop()
{
 client.loop();
}

 

In your Items configuration, add the following

// WiFi RGB 2
Group WIFI_RGB_2 "WiFi RGB 2" (All)
Color fWIFI_RGB_2 "RGB" <slider> (WIFI_RGB_2)
String WIFI_RGB_2_RGB (WIFI_RGB_2) {mqtt=">[broker:/openHAB/RGB_2/Color:command:*:default]"}
Switch WIFI_RGB_2_Switch1 "W1" (WIFI_RGB_2) {mqtt=">[broker:/openHAB/RGB_2/SW1:command:ON:100],>[broker:/openHAB/RGB_2/SW1:command:OFF:0]"}

New to what we’ve done so far, we need to add a Rule as well into a new file under /opt/openhab/configuration/rules/dolphin.rules for example.

This rule takes the inputs from the Item above and transforms it into RGB values to send over MQTT

import org.openhab.core.library.types.*

var HSBType hsbValue
var int redValue
var int greenValue
var int blueValue
var String RGBvalues

rule "Set RGB 2 value"
 when
 Item fWIFI_RGB_2 changed
 then
 hsbValue = fWIFI_RGB_2.state as HSBType

 redValue = hsbValue.red.intValue
 greenValue = hsbValue.green.intValue
 blueValue = hsbValue.blue.intValue


 RGBvalues= redValue.toString + ";" + greenValue.toString + ";" + blueValue.toString
 sendCommand( WIFI_RGB_2_RGB, RGBvalues )

 logInfo( "fWIFI_RGB_2", RGBvalues )
end

Finally, add the new item to your sitemap:

Frame label="RGB" {
Colorpicker item=fWIFI_RGB_2 icon="slider"
Switch item=WIFI_RGB_2_Switch1 label="Ch4"
}

rgb

Note: Based off code written by Andreas Holldorfer (http://chaozlabs.blogspot.co.za/2015/08/esp8266-in-wild-wifi-led-controller-hack.html) but adapted to my own PCBs