From d6a0afae79deadfc91a5d1914b0c316be9d8727c Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Sat, 4 Mar 2017 01:14:26 +0100 Subject: [PATCH 01/12] debut d'utilisation d'un topic de retour --- mqttfastledmenu.ino | 135 ++++++++++++++++++++++---------------------- 1 file changed, 66 insertions(+), 69 deletions(-) diff --git a/mqttfastledmenu.ino b/mqttfastledmenu.ino index c581557..7823c08 100644 --- a/mqttfastledmenu.ino +++ b/mqttfastledmenu.ino @@ -10,6 +10,7 @@ int color = LED_COLOR_DEFAULT; int speed = LED_SPEED_DEFAULT; CRGB leds[LED_NUM]; int ledEffect = LED_EFFECT_OFF; +boolean ledState = false; // WIFI WiFiClient espClient; @@ -18,7 +19,8 @@ WiFiClient espClient; char message_buff[100]; PubSubClient client(espClient); -void setup() { +void setup() +{ Serial.begin(SERIAL_SPEED); Serial.println("\nresetting"); @@ -29,19 +31,20 @@ void setup() { client.setServer(MQTT_SERVER, MQTT_PORT); client.setCallback(callbackMQTT); testConnectMQTT(); - client.subscribe(MQTT_LED_EFFECT); - client.subscribe(MQTT_LED_BRIGHTNESS); - client.subscribe(MQTT_LED_COLOR); - client.subscribe(MQTT_LED_SPEED); + client.subscribe(MQTT_LED_EFFECT_COMMAND); + client.subscribe(MQTT_LED_BRIGHTNESS_COMMAND); + client.subscribe(MQTT_LED_COLOR_COMMAND); + client.subscribe(MQTT_LED_SPEED_COMMAND); // LED LEDS.addLeds(leds, LED_NUM).setCorrection(TypicalSMD5050); - FastLED.setBrightness(brightness); ledBlackAll(); + FastLED.setBrightness(brightness); } // WIFI -void setupWifi() { +void setupWifi() +{ Serial.print("Connexion a "); Serial.print(WIFI_SSID); WiFi.mode(WIFI_STA); @@ -58,7 +61,8 @@ void setupWifi() { } // MQTT -void testConnectMQTT() { +void testConnectMQTT() +{ while (!client.connected()) { Serial.print("Connexion au serveur MQTT... "); if (client.connect("ESP8266Client", MQTT_USER, MQTT_PASS)) { @@ -74,54 +78,44 @@ void testConnectMQTT() { } // Déclenche les actions à la réception d'un message -void callbackMQTT(char* topic, byte* payload, unsigned int length) { - if (String(topic) == MQTT_LED_EFFECT) { - Serial.print("Received [" + String(topic) + "] : "); - - Serial.print(payload[0]); - Serial.print(" ~ "); - Serial.print(payload[0] - '0'); - - ledEffect = payload[0] - '0'; - Serial.print("["); - Serial.print(ledEffect); - Serial.println("]"); - +void callbackMQTT(char* topic, byte* payload, unsigned int length) +{ + String stopic = String(topic); + + unsigned int i = 0; + for(i = 0; i < length; i++) { + message_buff[i] = payload[i]; + } + message_buff[i] = '\0'; + String msgString = String(message_buff); + + Serial.print("Received [" + stopic + "] : "); + Serial.println(msgString); + + if (stopic == MQTT_LED_COMMAND) { + if (msgString == "ON") { + ledState = true; + client.publish(MQTT_LED_STATE, message_buff, true); + } else { + ledState = false; + client.publish(MQTT_LED_STATE, message_buff, true); + } + } else if (stopic == MQTT_LED_EFFECT_COMMAND) { // Si on ne repasse pas tout à noir, cela peut faire des effets surprenants ledBlackAll(); - } else if (String(topic) == MQTT_LED_BRIGHTNESS) { - unsigned int i = 0; - for(i = 0; i < length; i++) { - message_buff[i] = payload[i]; - } - message_buff[i] = '\0'; - // TODO : il est surement possible de faire plus propre - String msgString = String(message_buff); + ledEffect = msgString.toInt(); + // TODO : a vraiment tester + client.publish(MQTT_LED_EFFECT_STATE, message_buff, true); + } else if (stopic == MQTT_LED_BRIGHTNESS_COMMAND) { brightness = msgString.toInt(); FastLED.setBrightness(brightness); - - Serial.print("Received [" + String(topic) + "] : "); - Serial.println(msgString); - } else if (String(topic) == MQTT_LED_COLOR) { - unsigned int i = 0; - for(i = 0; i < length; i++) { - message_buff[i] = payload[i]; - } - message_buff[i] = '\0'; - String msgString = String(message_buff); + client.publish(MQTT_LED_BRIGHTNESS_STATE, message_buff, true); + } else if (stopic == MQTT_LED_COLOR_COMMAND) { color = msgString.toInt(); - Serial.print("Received [" + String(topic) + "] : "); - Serial.println(msgString); - } else if (String(topic) == MQTT_LED_SPEED) { - unsigned int i = 0; - for(i = 0; i < length; i++) { - message_buff[i] = payload[i]; - } - message_buff[i] = '\0'; - String msgString = String(message_buff); + client.publish(MQTT_LED_COLOR_STATE, message_buff, true); + } else if (stopic == MQTT_LED_SPEED_COMMAND) { speed = msgString.toInt(); - Serial.print("Received [" + String(topic) + "] : "); - Serial.println(msgString); + client.publish(MQTT_LED_SPEED_STATE, message_buff, true); } } @@ -196,31 +190,34 @@ void loop() { testConnectMQTT(); client.loop(); + // TODO : à retirer je pense EVERY_N_SECONDS(180) { Serial.print("MQTT Subscribe refresh"); - client.subscribe(MQTT_LED_EFFECT); - client.subscribe(MQTT_LED_BRIGHTNESS); - client.subscribe(MQTT_LED_COLOR); - client.subscribe(MQTT_LED_SPEED); + client.subscribe(MQTT_LED_EFFECT_COMMAND); + client.subscribe(MQTT_LED_BRIGHTNESS_COMMAND); + client.subscribe(MQTT_LED_COLOR_COMMAND); + client.subscribe(MQTT_LED_SPEED_COMMAND); Serial.println(" done"); } // LED - switch(ledEffect) - { - case LED_EFFECT_OFF: - ledBlackAll(); - break; - case LED_EFFECT_CYLON: - ledCylon(); - break; - case LED_EFFECT_FULLRED: - ledFullRed(); - break; - default: - ledError(); - break; + if (!ledState) { + ledBlackAll(); + FastLED.delay(1000); + } else { + switch(ledEffect) + { + case LED_EFFECT_CYLON: + ledCylon(); + break; + case LED_EFFECT_FULLRED: + ledFullRed(); + break; + default: + ledError(); + break; + } } } -// TODO : regrouper input et select en un seul group, l'input enverrait directement Off et les effets ne seraient que effets +// TODO : regrouper input et select en un seul group, l'input enverrait directement Off et les effets ne seraient que effets \ No newline at end of file From be053b362af9bfb5a6ce11921d114493feae20cc Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Sat, 4 Mar 2017 01:40:17 +0100 Subject: [PATCH 02/12] ajout de light pour tester, ajout des topics de status --- ha_configuration.yml | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/ha_configuration.yml b/ha_configuration.yml index 35783c1..65e50de 100644 --- a/ha_configuration.yml +++ b/ha_configuration.yml @@ -1,20 +1,10 @@ -# TODO : Il serait bien de pouvoir donner un nom joli sans envoyer de string -mqtt: - broker: "mqtt" - port: 1883 - client_id: "homeassistant1" - username: "***REMOVED***" - password: "***REMOVED***" - input_select: strip1_effect: name: "Choix de l'effet" options: - - 1 - 2 - 3 - 4 - initial: 1 input_slider: strip1_animation_speed: @@ -24,27 +14,38 @@ input_slider: max: 150 step: 10 +light: + platform: "mqtt" + name: "Test ESP" + command_topic: "strip1/switch" + state_topic: "strip1/status" + rgb_state_topic: "strip1/color/switch" + rgb_command_topic: "strip1/color/status" + brightness_state_topic: "strip1/brightness/switch" + brightness_command_topic: "strip1/brightness/status" + automation: - alias: "Strip1 Effect" - initial_state: True hide_entity: False trigger: - - platform: state - entity_id: input_select.strip1_effect + - platform: "state" + entity_id: "input_select.strip1_effect" action: - - service: mqtt.publish + - service: "mqtt.publish" data_template: - topic: "strip1/seteffect" + command_topic: "strip1/effect/switch" + state_topic: "strip1/effect/status" payload: '{{ trigger.to_state.state | string }}' retain: True - alias: "Strip1 Animation Speed" - initial_state: True hide_entity: False trigger: - - platform: state - entity_id: input_slider.strip1_animation_speed + - platform: "state" + entity_id: "input_slider.strip1_animation_speed" action: - - service: mqtt.publish + - service: "mqtt.publish" data_template: - topic: "strip1/setspeed" + command_topic: "strip1/speed/switch" + status_topic: "strip1/speed/switch" payload: '{{ trigger.to_state.state | int }}' + retain: True From 39aa9be57461989bb8f10762a96f774d33d2c408 Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Sat, 4 Mar 2017 01:42:22 +0100 Subject: [PATCH 03/12] LED_EFFECT_OFF n'existe plus --- mqttfastledmenu.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mqttfastledmenu.ino b/mqttfastledmenu.ino index 7823c08..8df162d 100644 --- a/mqttfastledmenu.ino +++ b/mqttfastledmenu.ino @@ -9,7 +9,7 @@ int brightness = LED_BRIGHTNESS_DEFAULT; int color = LED_COLOR_DEFAULT; int speed = LED_SPEED_DEFAULT; CRGB leds[LED_NUM]; -int ledEffect = LED_EFFECT_OFF; +int ledEffect = LED_EFFECT_CYLON; boolean ledState = false; // WIFI From b4f1bd5b9ccf490a285e21b4ffb8b950d16dc838 Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Sat, 4 Mar 2017 01:45:23 +0100 Subject: [PATCH 04/12] ledEffect devient un string --- mqttfastledmenu.ino | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/mqttfastledmenu.ino b/mqttfastledmenu.ino index 8df162d..c2bf08a 100644 --- a/mqttfastledmenu.ino +++ b/mqttfastledmenu.ino @@ -9,7 +9,7 @@ int brightness = LED_BRIGHTNESS_DEFAULT; int color = LED_COLOR_DEFAULT; int speed = LED_SPEED_DEFAULT; CRGB leds[LED_NUM]; -int ledEffect = LED_EFFECT_CYLON; +String ledEffect = LED_EFFECT_CYLON; boolean ledState = false; // WIFI @@ -103,7 +103,7 @@ void callbackMQTT(char* topic, byte* payload, unsigned int length) } else if (stopic == MQTT_LED_EFFECT_COMMAND) { // Si on ne repasse pas tout à noir, cela peut faire des effets surprenants ledBlackAll(); - ledEffect = msgString.toInt(); + ledEffect = msgString; // TODO : a vraiment tester client.publish(MQTT_LED_EFFECT_STATE, message_buff, true); } else if (stopic == MQTT_LED_BRIGHTNESS_COMMAND) { @@ -205,17 +205,12 @@ void loop() { ledBlackAll(); FastLED.delay(1000); } else { - switch(ledEffect) - { - case LED_EFFECT_CYLON: - ledCylon(); - break; - case LED_EFFECT_FULLRED: - ledFullRed(); - break; - default: - ledError(); - break; + if (ledEffect == LED_EFFECT_CYLON) { + ledCylon(); + } else if (ledEffect == LED_EFFECT_FULLRED) { + ledFullRed(); + } else { + ledError(); } } } From 63654dba286b0e252587f019a213c868574607c9 Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Sat, 4 Mar 2017 01:53:01 +0100 Subject: [PATCH 05/12] test yaml lint --- .gitlab-ci.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b0357f6..fc88a55 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -production: +inocode: image: "java:8" variables: ESPURL: "http://arduino.esp8266.com/stable/package_esp8266com_index.json" @@ -18,3 +18,11 @@ production: - /arduino-nightly/arduino --install-library "FastLED" - /arduino-nightly/arduino --install-library "PubSubClient" - /arduino-nightly/arduino --pref "${MEMORY}" --board "${BOARD}" --verify "mqttfastledmenu.ino" + +yaml: + image: "python:alpine" + before_script: + - pip install "PyYAML" + script: + - cd "${CI_PROJECT_DIR}" + - python -c "from yaml import load, Loader; load(open('ha_configuration.yml'), Loader=Loader) \ No newline at end of file From b9773a419d7da0e69767fa8185649c956d2c1bdf Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Sat, 4 Mar 2017 01:56:31 +0100 Subject: [PATCH 06/12] oublie d'un " --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fc88a55..4678010 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -25,4 +25,4 @@ yaml: - pip install "PyYAML" script: - cd "${CI_PROJECT_DIR}" - - python -c "from yaml import load, Loader; load(open('ha_configuration.yml'), Loader=Loader) \ No newline at end of file + - python -c "from yaml import load, Loader; load(open('ha_configuration.yml'), Loader=Loader)" \ No newline at end of file From 1b920d7cd1b0bee90a4358f16be571fa008a5400 Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Sat, 4 Mar 2017 01:59:11 +0100 Subject: [PATCH 07/12] on redirige stdout pas stderr de apt --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4678010..9201265 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,7 +6,7 @@ inocode: INSTBOARD: "esp8266:esp8266" BOARD: "${INSTBOARD}:nodemcuv2" before_script: - - apt update 2>/dev/null + - apt update >/dev/null - cd / - wget --quiet "https://www.arduino.cc/download.php?f=/arduino-nightly-linux64.tar.xz" -O "arduino-nightly-linux64.tar.xz" - tar axf "arduino-nightly-linux64.tar.xz" From 82104f19a6383eca20a3fa55c48674d4e3b806ea Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Sat, 4 Mar 2017 02:00:58 +0100 Subject: [PATCH 08/12] =?UTF-8?q?on=20remets=20=C3=A0=20jour=20l'exemple?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mqttfastledmenu.example.h | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/mqttfastledmenu.example.h b/mqttfastledmenu.example.h index 9ac68af..c11aca0 100644 --- a/mqttfastledmenu.example.h +++ b/mqttfastledmenu.example.h @@ -9,10 +9,9 @@ #define LED_SPEED_DEFAULT 120 #define LED_COLOR_DEFAULT CRGB::Red -#define LED_EFFECT_OFF 1 -#define LED_EFFECT_CYLON 2 -#define LED_EFFECT_FULLRED 3 -#define LED_EFFECT_ERROR 4 +#define LED_EFFECT_CYLON "cylon" +#define LED_EFFECT_FULLRED "full" +#define LED_EFFECT_ERROR "error" // WIFI #define WIFI_SSID "XXX" @@ -24,10 +23,16 @@ #define MQTT_USER "XXX" #define MQTT_PASS "XXX" -#define MQTT_LED_EFFECT "strip1/seteffect" -#define MQTT_LED_BRIGHTNESS "strip1/setbrightness" -#define MQTT_LED_SPEED "strip1/setspeed" -#define MQTT_LED_COLOR "strip1/setcolor" +#define MQTT_LED_STATE "strip1/switch" +#define MQTT_LED_COMMAND "strip1/status" +#define MQTT_LED_EFFECT_COMMAND "strip1/effect/switch" +#define MQTT_LED_EFFECT_STATE "strip1/effect/status" +#define MQTT_LED_BRIGHTNESS_COMMAND "strip1/brightness/switch" +#define MQTT_LED_BRIGHTNESS_STATE "strip1/brightness/status" +#define MQTT_LED_SPEED_COMMAND "strip1/speed/switch" +#define MQTT_LED_SPEED_STATE "strip1/speed/status" +#define MQTT_LED_COLOR_COMMAND "strip1/color/switch" +#define MQTT_LED_COLOR_STATE "strip1/color/status" // FastLED // TODO : essayer, devrait limiter le flikering From 0a12eede53dcf20ea338146a6347717108ecb167 Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Sat, 4 Mar 2017 03:32:37 +0100 Subject: [PATCH 09/12] correctiom effet -> char,--etat pour les topic marche pas --- ha_configuration.yml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/ha_configuration.yml b/ha_configuration.yml index 65e50de..5f2e487 100644 --- a/ha_configuration.yml +++ b/ha_configuration.yml @@ -2,9 +2,9 @@ input_select: strip1_effect: name: "Choix de l'effet" options: - - 2 - - 3 - - 4 + - "cylon" + - "full" + - "error" input_slider: strip1_animation_speed: @@ -33,8 +33,7 @@ automation: action: - service: "mqtt.publish" data_template: - command_topic: "strip1/effect/switch" - state_topic: "strip1/effect/status" + topic: "strip1/effect/switch" payload: '{{ trigger.to_state.state | string }}' retain: True - alias: "Strip1 Animation Speed" @@ -45,7 +44,6 @@ automation: action: - service: "mqtt.publish" data_template: - command_topic: "strip1/speed/switch" - status_topic: "strip1/speed/switch" + topic: "strip1/speed/switch" payload: '{{ trigger.to_state.state | int }}' retain: True From e1c5a3cc492713fcd53c91eb040dbe08b5928db0 Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Sat, 4 Mar 2017 03:33:19 +0100 Subject: [PATCH 10/12] ajout de MQTT_LED_COMMAND subscribe --- mqttfastledmenu.ino | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mqttfastledmenu.ino b/mqttfastledmenu.ino index c2bf08a..ef32f32 100644 --- a/mqttfastledmenu.ino +++ b/mqttfastledmenu.ino @@ -31,10 +31,11 @@ void setup() client.setServer(MQTT_SERVER, MQTT_PORT); client.setCallback(callbackMQTT); testConnectMQTT(); + client.subscribe(MQTT_LED_COMMAND); client.subscribe(MQTT_LED_EFFECT_COMMAND); client.subscribe(MQTT_LED_BRIGHTNESS_COMMAND); - client.subscribe(MQTT_LED_COLOR_COMMAND); client.subscribe(MQTT_LED_SPEED_COMMAND); + client.subscribe(MQTT_LED_COLOR_COMMAND); // LED LEDS.addLeds(leds, LED_NUM).setCorrection(TypicalSMD5050); From 36627c56525798b58b24d02f43637a36d3e3453b Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Sat, 4 Mar 2017 03:36:57 +0100 Subject: [PATCH 11/12] plus de subscribe inutile --- mqttfastledmenu.ino | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/mqttfastledmenu.ino b/mqttfastledmenu.ino index ef32f32..e8e657c 100644 --- a/mqttfastledmenu.ino +++ b/mqttfastledmenu.ino @@ -67,8 +67,12 @@ void testConnectMQTT() while (!client.connected()) { Serial.print("Connexion au serveur MQTT... "); if (client.connect("ESP8266Client", MQTT_USER, MQTT_PASS)) { - // TODO : doit-on se reconnecter aux topics ? Serial.println("OK"); + client.subscribe(MQTT_LED_COMMAND); + client.subscribe(MQTT_LED_EFFECT_COMMAND); + client.subscribe(MQTT_LED_BRIGHTNESS_COMMAND); + client.subscribe(MQTT_LED_SPEED_COMMAND); + client.subscribe(MQTT_LED_COLOR_COMMAND); } else { Serial.print("KO, erreur : "); Serial.print(client.state()); @@ -192,14 +196,14 @@ void loop() { client.loop(); // TODO : à retirer je pense - EVERY_N_SECONDS(180) { - Serial.print("MQTT Subscribe refresh"); - client.subscribe(MQTT_LED_EFFECT_COMMAND); - client.subscribe(MQTT_LED_BRIGHTNESS_COMMAND); - client.subscribe(MQTT_LED_COLOR_COMMAND); - client.subscribe(MQTT_LED_SPEED_COMMAND); - Serial.println(" done"); - } + //EVERY_N_SECONDS(180) { + // Serial.print("MQTT Subscribe refresh"); + // client.subscribe(MQTT_LED_EFFECT_COMMAND); + // client.subscribe(MQTT_LED_BRIGHTNESS_COMMAND); + // client.subscribe(MQTT_LED_COLOR_COMMAND); + // client.subscribe(MQTT_LED_SPEED_COMMAND); + // Serial.println(" done"); + //} // LED if (!ledState) { @@ -216,4 +220,4 @@ void loop() { } } -// TODO : regrouper input et select en un seul group, l'input enverrait directement Off et les effets ne seraient que effets \ No newline at end of file +// TODO : regrouper input et select en un seul group, l'input enverrait directement Off et les effets ne seraient que effets From f7d9125033c23f8b96dbda6a4f1c28df2f42f526 Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Mon, 6 Mar 2017 10:43:05 +0100 Subject: [PATCH 12/12] ajout du serveur mqtt --- ha_configuration.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ha_configuration.yml b/ha_configuration.yml index 5f2e487..9bcbd43 100644 --- a/ha_configuration.yml +++ b/ha_configuration.yml @@ -1,3 +1,10 @@ +mqtt: + broker: "XXX" + port: 1883 + client_id: "homeassistant1" + username: "XXX" + password: "XXX" + input_select: strip1_effect: name: "Choix de l'effet"