diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b0357f6..9201265 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" @@ -6,7 +6,7 @@ production: 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" @@ -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 diff --git a/ha_configuration.yml b/ha_configuration.yml index 35783c1..9bcbd43 100644 --- a/ha_configuration.yml +++ b/ha_configuration.yml @@ -1,20 +1,17 @@ -# TODO : Il serait bien de pouvoir donner un nom joli sans envoyer de string mqtt: - broker: "mqtt" - port: 1883 + broker: "XXX" + port: 1883 client_id: "homeassistant1" - username: "***REMOVED***" - password: "***REMOVED***" + username: "XXX" + password: "XXX" input_select: strip1_effect: name: "Choix de l'effet" options: - - 1 - - 2 - - 3 - - 4 - initial: 1 + - "cylon" + - "full" + - "error" input_slider: strip1_animation_speed: @@ -24,27 +21,36 @@ 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" + topic: "strip1/effect/switch" 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" + topic: "strip1/speed/switch" payload: '{{ trigger.to_state.state | int }}' + retain: True 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 diff --git a/mqttfastledmenu.ino b/mqttfastledmenu.ino index c581557..e8e657c 100644 --- a/mqttfastledmenu.ino +++ b/mqttfastledmenu.ino @@ -9,7 +9,8 @@ int brightness = LED_BRIGHTNESS_DEFAULT; int color = LED_COLOR_DEFAULT; int speed = LED_SPEED_DEFAULT; CRGB leds[LED_NUM]; -int ledEffect = LED_EFFECT_OFF; +String ledEffect = LED_EFFECT_CYLON; +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,21 @@ 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_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); // 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,12 +62,17 @@ void setupWifi() { } // MQTT -void testConnectMQTT() { +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()); @@ -74,54 +83,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; + // 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,30 +195,28 @@ void loop() { testConnectMQTT(); client.loop(); - 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); - Serial.println(" done"); - } + // 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"); + //} // 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 { + if (ledEffect == LED_EFFECT_CYLON) { + ledCylon(); + } else if (ledEffect == LED_EFFECT_FULLRED) { + ledFullRed(); + } else { + ledError(); + } } }