====== Philips HUE et OSRAM Lightify ======
===== Comparatif =====
=== Philips Hue ===
^ Avantages ^ Inconvénients ^
| Fiable | Coût |
| API | forme de l'ampoule |
| Les équipements associés (1) | |
(1) Philips propose un super petit capteur de présence qui intégré plusieurs capteurs (Présence, lumière et température) et dont les valeurs peuvent être récupéré directement via l'API. Il est donc possible de se faire un système d'alarme (Détection de présence) ou mesurer la température de chaque pièce.
=== OSRAM Lightify ===
^ Avantages ^ Inconvénients ^
| Coût | Installation laborieuse / Bug d'association avec l'application Android ou IOS |
| API | Fiabilité / Une ampoule HS après 1 an d'utilisation |
| Possibilité de mémoriser un réglage par défaut (1)| |
(1) Il est possible de programmer un réglage par défaut de chaque ampoule. Les ampoules sont souvent branchées sur des interrupteurs classiques. Donc dès qu'on appuie sur l'interrupteur, l'ampoule redémarre à 0 et l'ancien état n'est pas mémoriser. L’intérêt de ce paramétrage c'est qu'on peut définir un réglage par défaut et définir une luminosité faible pour une chambre et ainsi éviter l'éblouissement quand on se lève la nuit.
===== OSRAM Lightify =====
==== Installation ====
==== FAQ ====
**Connexion au routeur WIFI impossible sous Android ?**
J'ai rencontré des problèmes lors de la connexion de la passerelle et ma freebox. Un message m'indiqué toujours que le mot de passe WIFI était erroné.
J'ai finalement dû utiliser mon Iphone pour pouvoir configurer la connexion WIFI
**Mise à jour impossible de la passerelle ?**
Lors de la première connexion à la passerelle, une mise à jour obligatoire est demandée. Cette mise à jour ne se faisait pas chez moi. La mise à jour a finalement fonctionné après avoir déconnecte la passerelle du WIFI de ma freebox et l'avoir reconnecté à mon téléphone utilisé en passerelle internet.
La freebox bloque peut être des ports necessaires à la mise à jour.
**Mise à jour impossible des ampoules ?**
J'ai également rencontré des problèmes pour la mise à jour des ampoules.
J'ai finalement utiliser l'application Iphone qui relance la mise à jour automatiquement en cas d’échec et laissé tourner.
Au bout de 10ème tentative, l'ampoule a été mise à jour.
** Peut-on configurer une luminosité et un couleur par défaut au démarrage de l'ampoule ?**
Oui, il faut pour cela utiliser la passerelle OSRAM et le logiciel OSRAM lightify, aller dans l'écran de réglage de la luminosité et de la couleur et cliquer sur l'interrupteur en haut à droite. L'application proposera d'enregistrer la paramétrage par défaut.
Si vous souhaitez par la suite utiliser une passerelle Philips Hue, un reset de l'ampoule sera nécessaire et vous perdrez le paramétrage par défaut. Il n'est pas possible de reparamétrer par la suite avec la passerelle Philips HUE.
==== Exemple application C# ====
La documentation de l'API : https://eu.lightify-api.org/
Inspiré du code : https://github.com/patrick-dmxc/OsramLightify/blob/master/OsramLightify/Osram/Lightify/OsramController.cs
Class pour le decodage JSON : http://www.newtonsoft.com/json
=== Récupération d'un ticket ===
//Le Token n'est valable que 15mn
//user : le nom d'utilisateur de votre compte Osram
//pass : votre mot de pass ....
//serialnum : Le numéro de série qui apparait sur la passerelle OSR0xxxxxxx (Ne pas indiquer ce qui trouve apres le "-"
OsramToken token = OsramController.GetOsramToken("user", "pass", "serialnum");
textBoxToken.Text = token.securityToken;
textBoxUserID.Text = token.userId;
public class OsramToken
{
public string userId { get; set; }
public string securityToken { get; set; }
}
public class OsramController
{
public static OsramToken GetOsramToken(string username, string password, string serialNumber)
{
string payload = "{\"username\" : \"" + username + "\",\"password\" : \"" + password + "\",\"serialNumber\" : \"" + serialNumber + "\"}";
string url = "https://eu.lightify-api.org/lightify/services/session";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.UserAgent = "Lightify/1.0.5 CFNetwork/711.1.16 Darwin/14.0.0";
httpWebRequest.Method = "POST";
httpWebRequest.ContentType = "application/json";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
streamWriter.Write(payload);
streamWriter.Flush();
streamWriter.Close();
}
OsramToken os = new OsramToken();
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
os = JsonConvert.DeserializeObject(result);
}
return os;
}
public static List GetDevicesList(string token)
{
List Devices = new List();
string url = "https://eu.lightify-api.org/lightify/services/devices";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.UserAgent = "Lightify/1.0.5 CFNetwork/711.1.16 Darwin/14.0.0";
httpWebRequest.Method = "GET";
httpWebRequest.ContentType = "application/json";
httpWebRequest.Headers.Add("authorization",token);
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
Devices = JsonConvert.DeserializeObject>(result);
}
return Devices;
}
public static string SenCommand(string token, string cmd)
{
string result = "";
string url = "https://eu.lightify-api.org/lightify/services/"+cmd;
var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.UserAgent = "Lightify/1.0.5 CFNetwork/711.1.16 Darwin/14.0.0";
httpWebRequest.Method = "GET";
httpWebRequest.ContentType = "application/json";
httpWebRequest.Headers.Add("authorization", token);
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
result = streamReader.ReadToEnd();
}
return result;
}
}
=== Récupération de la liste des équipements ===
List Devices = OsramController.GetDevicesList(textBoxToken.Text);
public class OsramDevice
{
public int deviceId { get; set; }
public string deviceType { get; set; }
public string manufacturer { get; set; }
public string modelName { get; set; }
public string name { get; set; }
public List groupList { get; set; }
public List bmpClusters { get; set; }
public bool online { get; set; }
public bool on { get; set; }
public float brightnessLevel { get; set; }
public float hue { get; set; }
public float saturation { get; set; }
public int temperature { get; set; }
public string firmwareVersion { get; set; }
public string color { get; set; }
}
=== Envoi de commandes à un équipement ===
Toutes les commandes doivent faire référence à un ID d'équipement récupéré avec la liste des devices
private void buttonTurnOff_Click(object sender, EventArgs e)
{
string result = OsramController.SenCommand(textBoxToken.Text, "device/set?idx=" + textBoxDeviceID.Text + "&time=" + numericUpDownTime.Value.ToString() + "&onoff=0");
}
private void buttonTurnOn_Click(object sender, EventArgs e)
{
string result = OsramController.SenCommand(textBoxToken.Text, "device/set?idx=" + textBoxDeviceID.Text + "&level=" + (numericUpDownLevel.Value / 100).ToString().Replace(",", ".") + "&time=" + numericUpDownTime.Value.ToString() + "&onoff=1");
}
private void buttonChangeColor_Click(object sender, EventArgs e)
{
string color = labelColor.Text.Replace("#", "");
string result = OsramController.SenCommand(textBoxToken.Text, "device/set?idx=" + textBoxDeviceID.Text + "&time=" + numericUpDownTime.Value.ToString() + "&color="+labelColor.Text.Replace("#",""));
}
private void buttonChangeLevel_Click(object sender, EventArgs e)
{
string result = OsramController.SenCommand(textBoxToken.Text, "device/set?idx=" + textBoxDeviceID.Text + "&level=" + (numericUpDownLevel.Value / 100).ToString().Replace(",", ".") + "&time=" + numericUpDownTime.Value.ToString());
}
private void buttonChangeTemperature_Click(object sender, EventArgs e)
{
string result = OsramController.SenCommand(textBoxToken.Text, "device/set?idx=" + textBoxDeviceID.Text + "&time=" + numericUpDownTime.Value.ToString() + "&ctemp="+numericUpDownTemperature.Value.ToString());
}
{{::osram_lightify_csharp.jpg?700|}}
===== Philips HUE =====
==== FAQ ====
**Est-il possible de connecter des ampoules OSRAM Lightify sur une passerelle Philips Hue ?**
Oui. Il vous faudra néanmoins un Hub OSRAM Lightify pour effectuer la mise à jour de vos ampoules.
**Est-il possible de regler la couleur et la luminosité par défaut sur les ampoules Philips Hue ?**
Non. D'après ce que j'ai pu lire, Philipps ne souhaite pas mettre en place cette fonctionnalité pour des questions de sécurité. En cas d'intervention d'un service d'urgence, l'allumage par défaut de l'ampoule doit être au maximum.
OSRAM a intégré cette possibilité sur sa gamme ligthify avec un simple message d'avertissement indiquant qu'il n'est pas conseillé d'avoir une luminosité inférieure à 20%
=== Exemple application C# ===
== Récupération de la liste des ampoules ==
public class HueDevice
{
public int deviceId { get; set; }
public string deviceType { get; set; }
public string name { get; set; }
public bool online { get; set; }
public int bri { get; set; }
public string alert { get; set; }
public bool reachable { get; set; }
public string type { get; set; }
public string modelid { get; set; }
public string manufacturername { get; set; }
public string uniqueid { get; set; }
public string swversion { get; set; }
}
public List GetDevicesList()
{
Devices = new List();
string url = @"http://" + ip + "/api/" + username + "/lights";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.Method = "GET";
httpWebRequest.ContentType = "application/json";
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
dynamic response = JsonConvert.DeserializeObject(result);
foreach (var item in response)
{
string id = item.Name;
bool on = false;
int bri = 0;
string alert = "";
bool reachable = false;
string type = "";
string name = "";
string modelid = "";
string manufacturername = "";
string uniqueid= "";
string swversion= "";
foreach (var parameters in item)
{
if (parameters.state != null)
{
if (parameters.state.on != null)
on = (bool)parameters.state.on;
if (parameters.state.bri != null)
bri = (int)parameters.state.bri;
if (parameters.state.none != null)
alert = (string)parameters.state.alert;
if (parameters.state.reachable != null)
reachable = (bool)parameters.state.reachable;
}
if (parameters.type != null)
type = (string)parameters.type;
if (parameters.name != null)
name = (string)parameters.name;
if (parameters.modelid != null)
modelid = (string)parameters.modelid;
if (parameters.manufacturername != null)
manufacturername = (string)parameters.manufacturername;
if (parameters.uniqueid != null)
uniqueid = (string)parameters.uniqueid;
if (parameters.swversion != null)
swversion = (string)parameters.swversion;
}
Hue.HueDevice Lumiere = new HueDevice();
Lumiere.deviceId = Convert.ToInt32(id);
Lumiere.name = name;
Lumiere.online = reachable;
Lumiere.bri = bri;
Lumiere.alert = alert;
Lumiere.reachable = reachable;
Lumiere.type = type;
Lumiere.modelid = modelid;
Lumiere.manufacturername = manufacturername;
Lumiere.uniqueid = uniqueid;
Lumiere.swversion = swversion;
Devices.Add(Lumiere);
}
return Devices;
}
}
==Allume ou éteint une ampoule ==
///
/// Allume ou éteint l'ampoule avec l'id spécifié
///
///
///
internal bool SetState(string id, int state)
{
try
{
string data;
if (state == 1)
data = "{ \"on\":true}";
else
data = "{ \"on\":false}";
byte[] bytes;
bytes = System.Text.Encoding.UTF8.GetBytes(data);
string url = @"http://" + ip + "/api/" + username + "/lights/" + id + "/state";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.Method = "PUT";
httpWebRequest.ContentType = "application/json";
httpWebRequest.ContentLength = bytes.Length;
Stream requestStream = httpWebRequest.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
dynamic response = JsonConvert.DeserializeObject(result);
}
}
catch (Exception ex)
{
return false;
}
return true;
}