Bonjour,
J’ai un plafonnier à LED, contrôlable par une télécommande 2.4Ghz, utilisant un protocole non reconnu.
Pour le contrôler, j’ai utilisé un arduino pour gérer la télécommande, via des transistors qui simulent l’appui sur un bouton.
L’arduino est connecté au réseau via un module ethernet.
Le code que j’ai créé agit de la façon suivante :
- Au démarrage, il déclenche l’allumage de la lampe et une mise à 100% du niveau de luminosité.
- Ensuite, il écoute en réseau pour récupérer via l’url des paramètres d’allumage, luminosité, et chaleur
http://192.168.XX.YY/?Status=on&Level=100&Hue=250
#include <SPI.h>
#include <Ethernet.h>
#include <ArduinoJson.h>
// MAC address for shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0x5E, 0xED};
IPAddress ip(192,168,XX,YY);
EthernetServer server(80); // Using port 80
int led[] = {2,3,4,5,6,7}; // LED attached to pin 7
float chaud = 50;
bool Status = true;
int Level = 100;
int Hue = 255;
bool nStatus = true;
int nLevel = 100;
int nHue = 255;
int pStatus;
int pLevel;
int pHue;
String sBuffer;
void setup() {
for (int i=2; i<=7; i++) {
pinMode(led[i], OUTPUT); // Led set as an output
}
Ethernet.begin(mac,ip); // Start the Ethernet shield
server.begin();
Serial.begin(9600); // Start serial communication
Serial.println("Server address:"); // Print server address
// (Arduino shield)
Serial.println(Ethernet.localIP());
//Allume la lampe
digitalWrite(2, HIGH);
delay(300);
digitalWrite(2, LOW);
//Lumière à fond
digitalWrite(5, HIGH);
delay(3000);
digitalWrite(5, LOW);
//Couleur chaude
digitalWrite(7, HIGH);
delay(3000);
digitalWrite(7, LOW);
nStatus = 1;
nLevel = 100;
nHue = 255;
Status = 1;
Level = 100;
Hue = 255;
}
void loop() {
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
String buffer = "";
while (client.connected()) {
if (client.available()) {
char c = client.read(); // Read from the Ethernet shield
buffer += c; // Add character to string buffer
// Client sent request, now waiting for response
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK"); // HTTP response
client.println("Content-Type: application/json");
client.println(); // HTML code
client.print('{"State": "' + Status);
client.print('", "Level": "' + Level);
client.print('", "Hue": "' + Hue);
client.print('"}');
break;
}
if (c == '\n') {
currentLineIsBlank = true;
buffer = "";
}
else if (c == '\r') { // Command from webpage
//Serial.println(buffer);
//Serial.println(buffer.indexOf("?on"));
//Serial.println(buffer.indexOf("?hue"));
//Position des informations
pStatus = buffer.indexOf("Status=");
pLevel = buffer.indexOf("Level=");
pHue = buffer.indexOf("Hue=");
sBuffer = buffer;
//Nouvelles infos transmises
if (pStatus >= 0)
{
if (buffer.length() >= pStatus + 8 ) {
//Serial.println(buffer[pStatus + 8]);
if (buffer[pStatus + 8] == 'n') {
nStatus = 1;
}
else {
nStatus = 0;
}
}
}
if (pLevel >= 0)
{
if (buffer.length() >= pLevel + 9 ) {
nLevel = sBuffer.substring(pLevel+6,pLevel+9).toInt();
//Serial.println(nLevel);
}
}
if (pHue >= 0)
{
if (buffer.length() >= pHue + 7 ) {
nHue = sBuffer.substring(pHue+4,pHue+7).toInt();
//Serial.println(nHue);
}
}
//Vérification que les données sont nouvelles :
//Serial.println(nStatus);
//Serial.println(nLevel);
if (nStatus != Status) {
//Extinction de la lampe
if (nStatus == 0) {
digitalWrite(3, HIGH);
delay(300);
digitalWrite(3, LOW);
}
//Allumage de la lampe
else {
digitalWrite(2, HIGH);
delay(300);
digitalWrite(2, LOW);
}
//MàJ des valeurs
Status = nStatus;
}
if (nStatus == 1 && nLevel != Level) {
Serial.println(nLevel);
Serial.println(Level);
if (nLevel >= Level) {
digitalWrite(5, HIGH);
delay((nLevel-Level)*32);
//Serial.println((nLevel-Level)*35);
digitalWrite(5, LOW);
}
else {
digitalWrite(6, HIGH);
delay((Level-nLevel)*32);
//Serial.println((Level-nLevel)*35);
digitalWrite(6, LOW);
}
//MàJ des valeurs
Level = nLevel;
}
if (nStatus == 1 && nHue != Hue) {
if (nHue >= Hue) {
digitalWrite(7, HIGH);
delay((nHue-Hue)*12);
digitalWrite(7, LOW);
}
else {
digitalWrite(4, HIGH);
delay((Hue-nHue)*12);
digitalWrite(4, LOW);
}
//MàJ des valeurs
Hue = nHue;
}
}
else {
currentLineIsBlank = false;
}
}
}
client.stop(); // End server
}
}
A présent, je souhaiterais le connecter à HASS, pour le contrôler et l’utiliser dans des automatismes, et récupérer les paramètres au démarrage.
J’ai essayé de créer un light template dans mon fichier yaml, qui agit sur un switch command_line.
Je me suis inspiré de ce tuto : https://www.jamesridgway.co.uk/using-a-template-light-to-control-a-custom-light-in-home-assistant/
Dans cet article, l’auteur utilise un switch rest. Mais ça ne me semble pas compatible avec l’architecture programmée dans mon arduino (nécessite une modification complète du code), pour qu’il digère un json qui lui serait envoyé.
Autre problème, le template light n’intègre que la luminosité mais pas la couleur.
J’ai donc créé des entités correspondant au niveau de luminosité et couleur, ainsi qu’un interrupteur, et je souhaite que lorsque l’interrupteur est activé, une url soit formatée et lancée, en intégrant les différents paramètres.
Je bloque sur cette dernière étape, je ne vois pas graphiquement des outils permettant de le faire, et je ne trouve pas dans le manuel comment ajouter des paramètres à une url.
Je vous remercie par avance pour votre aide, et vos commentaires sur la démarche.