Browse Source

Merge branch 'dev' into 'master'

Dev

See merge request !2
master
Julien Cabillot 3 years ago
parent
commit
e0f99c548f
12 changed files with 100 additions and 85 deletions
  1. 6
      .gitignore
  2. 11
      .gitlab-ci.yml
  3. 6
      README.md
  4. 100
      arduino/mqttfastledmenu/mqttfastledmenu.cpp
  5. 12
      arduino/mqttfastledmenu/mqttfastledmenu.example.h
  6. 0
      arduino/mqttfastledmenu/mqttfastledmenu.ino
  7. 18
      arduino/platformio.ini
  8. 32
      home-assistant/ha_configuration.yml
  9. 0
      medias/irl1.jpg
  10. 0
      medias/logo.jpg
  11. 0
      medias/mqttfastledmenu.fzz
  12. 0
      medias/mqttfastledmenu_bb.png

6
.gitignore

@ -1,2 +1,6 @@
.vscode/* .vscode/*
mqttfastledmenu.h
arduino/mqttfastledmenu/mqttfastledmenu.h
arduino/.pioenvs
arduino/.piolibdeps
arduino/.clang_complete
arduino/.gcc-flags.json

11
.gitlab-ci.yml

@ -6,23 +6,22 @@ inocode:
INSTBOARD: "esp8266:esp8266" INSTBOARD: "esp8266:esp8266"
BOARD: "${INSTBOARD}:nodemcuv2" BOARD: "${INSTBOARD}:nodemcuv2"
before_script: before_script:
- apt update >/dev/null
- cd / - cd /
- wget --quiet "https://www.arduino.cc/download.php?f=/arduino-nightly-linux64.tar.xz" -O "arduino-nightly-linux64.tar.xz" - 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" - tar axf "arduino-nightly-linux64.tar.xz"
- /arduino-nightly/arduino --pref "boardsmanager.additional.urls=${ESPURL}" - /arduino-nightly/arduino --pref "boardsmanager.additional.urls=${ESPURL}"
- /arduino-nightly/arduino --install-boards "${INSTBOARD}" - /arduino-nightly/arduino --install-boards "${INSTBOARD}"
script: script:
- cd "${CI_PROJECT_DIR}"
- cp "mqttfastledmenu.example.h" "mqttfastledmenu.h"
- cd "${CI_PROJECT_DIR}/arduino/${CI_PROJECT_NAME}"
- cp "${CI_PROJECT_NAME}.example.h" "${CI_PROJECT_NAME}.h"
- /arduino-nightly/arduino --install-library "FastLED" - /arduino-nightly/arduino --install-library "FastLED"
- /arduino-nightly/arduino --install-library "PubSubClient" - /arduino-nightly/arduino --install-library "PubSubClient"
- /arduino-nightly/arduino --pref "${MEMORY}" --board "${BOARD}" --verify "mqttfastledmenu.ino"
- /arduino-nightly/arduino --pref "${MEMORY}" --board "${BOARD}" --verify "${CI_PROJECT_NAME}.ino"
yaml: yaml:
image: "python:alpine" image: "python:alpine"
before_script: before_script:
- pip install "PyYAML" - pip install "PyYAML"
script: script:
- cd "${CI_PROJECT_DIR}"
- python -c "from yaml import load, Loader; load(open('ha_configuration.yml'), Loader=Loader)"
- cd "${CI_PROJECT_DIR}/home-assistant"
- python -c "from yaml import load, Loader; load(open('ha_configuration.yml'), Loader=Loader)"

6
README.md

@ -2,7 +2,7 @@ Introduction
============ ============
Le but est d'avoir un selecteur d'effet, choix de la vitesse et de la couleur. Le but est d'avoir un selecteur d'effet, choix de la vitesse et de la couleur.
Un exemple de configuration pour home-assistant se trouve dans [ha_configuration.yml](ha\_configuration.yml).
Un exemple de configuration pour home-assistant se trouve dans [ha_configuration.yml](home-assistant/ha\_configuration.yml).
Matériel Matériel
======== ========
@ -17,5 +17,5 @@ Matériel
Médias Médias
====== ======
![Fritzing BreadBoard](mqttfastledmenu_bb.png)
![IRL](irl1.jpg)
![Fritzing BreadBoard](medias/mqttfastledmenu_bb.png)
![IRL](medias/irl1.jpg)

mqttfastledmenu.ino → arduino/mqttfastledmenu/mqttfastledmenu.cpp

@ -1,3 +1,5 @@
#include <Arduino.h>
#include "mqttfastledmenu.h" #include "mqttfastledmenu.h"
#include <FastLED.h> #include <FastLED.h>
@ -20,27 +22,25 @@ char message_buff[100];
PubSubClient client(espClient); PubSubClient client(espClient);
void setup() void setup()
{
{
Serial.begin(SERIAL_SPEED); Serial.begin(SERIAL_SPEED);
Serial.println("\nresetting"); Serial.println("\nresetting");
// WIFI // WIFI
setupWifi(); setupWifi();
// MQTT // MQTT
client.setServer(MQTT_SERVER, MQTT_PORT); client.setServer(MQTT_SERVER, MQTT_PORT);
client.setCallback(callbackMQTT); client.setCallback(callbackMQTT);
testConnectMQTT(); testConnectMQTT();
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);
// TODO : ne marche pas comme je le désire :
// au boot il prends les params par défaut, j'aimerais ceux de home assistant
// LED // LED
LEDS.addLeds<LED_CHIPSET,LED_PIN, LED_COLOR_ORDER>(leds, LED_NUM).setCorrection(TypicalSMD5050); LEDS.addLeds<LED_CHIPSET,LED_PIN, LED_COLOR_ORDER>(leds, LED_NUM).setCorrection(TypicalSMD5050);
ledBlackAll(); ledBlackAll();
FastLED.setBrightness(brightness); FastLED.setBrightness(brightness);
Serial.println("Ready");
} }
// WIFI // WIFI
@ -50,13 +50,12 @@ void setupWifi()
Serial.print(WIFI_SSID); Serial.print(WIFI_SSID);
WiFi.mode(WIFI_STA); WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) { while (WiFi.status() != WL_CONNECTED) {
delay(500); delay(500);
Serial.print("."); Serial.print(".");
} }
Serial.println();
Serial.println(" OK");
Serial.print("IP : "); Serial.print("IP : ");
Serial.println(WiFi.localIP()); Serial.println(WiFi.localIP());
} }
@ -67,12 +66,13 @@ void testConnectMQTT()
while (!client.connected()) { while (!client.connected()) {
Serial.print("Connexion au serveur MQTT... "); Serial.print("Connexion au serveur MQTT... ");
if (client.connect("ESP8266Client", MQTT_USER, MQTT_PASS)) { if (client.connect("ESP8266Client", MQTT_USER, MQTT_PASS)) {
Serial.println("OK");
Serial.print("OK\nSubscribe");
client.subscribe(MQTT_LED_COMMAND); client.subscribe(MQTT_LED_COMMAND);
client.subscribe(MQTT_LED_EFFECT_COMMAND); client.subscribe(MQTT_LED_EFFECT_COMMAND);
client.subscribe(MQTT_LED_BRIGHTNESS_COMMAND); client.subscribe(MQTT_LED_BRIGHTNESS_COMMAND);
client.subscribe(MQTT_LED_SPEED_COMMAND); client.subscribe(MQTT_LED_SPEED_COMMAND);
client.subscribe(MQTT_LED_COLOR_COMMAND); client.subscribe(MQTT_LED_COLOR_COMMAND);
Serial.println(" OK");
} else { } else {
Serial.print("KO, erreur : "); Serial.print("KO, erreur : ");
Serial.print(client.state()); Serial.print(client.state());
@ -93,7 +93,7 @@ void callbackMQTT(char* topic, byte* payload, unsigned int length)
} }
message_buff[i] = '\0'; message_buff[i] = '\0';
String msgString = String(message_buff); String msgString = String(message_buff);
Serial.print("Received [" + stopic + "] : "); Serial.print("Received [" + stopic + "] : ");
Serial.println(msgString); Serial.println(msgString);
@ -103,7 +103,8 @@ void callbackMQTT(char* topic, byte* payload, unsigned int length)
client.publish(MQTT_LED_STATE, message_buff, true); client.publish(MQTT_LED_STATE, message_buff, true);
} else { } else {
ledState = false; ledState = false;
client.publish(MQTT_LED_STATE, message_buff, true);
ledBlackAll();
client.publish(MQTT_LED_STATE, message_buff, false);
} }
} else if (stopic == MQTT_LED_EFFECT_COMMAND) { } else if (stopic == MQTT_LED_EFFECT_COMMAND) {
// Si on ne repasse pas tout à noir, cela peut faire des effets surprenants // Si on ne repasse pas tout à noir, cela peut faire des effets surprenants
@ -116,7 +117,12 @@ void callbackMQTT(char* topic, byte* payload, unsigned int length)
FastLED.setBrightness(brightness); FastLED.setBrightness(brightness);
client.publish(MQTT_LED_BRIGHTNESS_STATE, message_buff, true); client.publish(MQTT_LED_BRIGHTNESS_STATE, message_buff, true);
} else if (stopic == MQTT_LED_COLOR_COMMAND) { } else if (stopic == MQTT_LED_COLOR_COMMAND) {
color = msgString.toInt();
// Sample : 134,168,255
int red = msgString.substring(0, msgString.indexOf(',')).toInt();
int green = msgString.substring(msgString.indexOf(',') + 1, msgString.lastIndexOf(',')).toInt();
int blue = msgString.substring(msgString.lastIndexOf(',') + 1).toInt();
color=((red <<16)|(green <<8)|blue);
client.publish(MQTT_LED_COLOR_STATE, message_buff, true); client.publish(MQTT_LED_COLOR_STATE, message_buff, true);
} else if (stopic == MQTT_LED_SPEED_COMMAND) { } else if (stopic == MQTT_LED_SPEED_COMMAND) {
speed = msgString.toInt(); speed = msgString.toInt();
@ -129,39 +135,35 @@ void ledBlackAll()
{ {
FastLED.clear(); FastLED.clear();
FastLED.show(); FastLED.show();
FastLED.delay(1000 / speed);
} }
void ledCylon() void ledCylon()
{ {
// Effet cylon : on allume une led, on attends, on eteinds, on passe à la suivante // Effet cylon : on allume une led, on attends, on eteinds, on passe à la suivante
// TODO : trop d'attente entre les clients.loop !!!!
for(int i = 0; i < LED_NUM; i++) { for(int i = 0; i < LED_NUM; i++) {
if ((i % 10) == 0) {
client.loop();
if (ledEffect != LED_EFFECT_CYLON) {
return;
}
EVERY_N_SECONDS(1) {
client.loop();
if (ledEffect != LED_EFFECT_CYLON) {
return;
}
} }
leds[i] = color; leds[i] = color;
FastLED.show();
FastLED.delay(1000 / speed);
FastLED.delay(1000 / speed);
leds[i] = CRGB::Black; leds[i] = CRGB::Black;
FastLED.show();
FastLED.delay(1000 / speed); FastLED.delay(1000 / speed);
} }
for(int i = LED_NUM - 1; i > 0; i--) { for(int i = LED_NUM - 1; i > 0; i--) {
if ((i % 10) == 0) {
client.loop();
if (ledEffect != LED_EFFECT_CYLON) {
return;
}
EVERY_N_SECONDS(1) {
client.loop();
if (ledEffect != LED_EFFECT_CYLON) {
return;
}
} }
leds[i] = color; leds[i] = color;
FastLED.show();
FastLED.delay(1000 / speed);
FastLED.delay(1000 / speed);
leds[i] = CRGB::Black; leds[i] = CRGB::Black;
FastLED.show(); FastLED.show();
} }
@ -178,46 +180,30 @@ void ledError()
} }
} }
FastLED.show();
FastLED.delay(1000 / speed);
FastLED.delay(1000 / speed);
} }
// TODO : ne doit pas rester à terme, ça ne sert à rien de garder une fonction comme ça
void ledFullRed()
void ledFullColor()
{ {
fill_solid(leds, LED_NUM, color); fill_solid(leds, LED_NUM, color);
FastLED.show();
FastLED.delay(1000 / speed);
FastLED.delay(1000 / speed);
} }
void loop() { void loop() {
// MQTT // MQTT
testConnectMQTT(); testConnectMQTT();
client.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");
//}
// LED // LED
if (!ledState) { if (!ledState) {
ledBlackAll();
FastLED.delay(1000);
FastLED.delay(1000);
} else { } else {
if (ledEffect == LED_EFFECT_CYLON) { if (ledEffect == LED_EFFECT_CYLON) {
ledCylon(); ledCylon();
} else if (ledEffect == LED_EFFECT_FULLRED) { } else if (ledEffect == LED_EFFECT_FULLRED) {
ledFullRed();
ledFullColor();
} else { } else {
ledError(); ledError();
} }
} }
} }
// TODO : regrouper input et select en un seul group, l'input enverrait directement Off et les effets ne seraient que effets

mqttfastledmenu.example.h → arduino/mqttfastledmenu/mqttfastledmenu.example.h

@ -23,8 +23,8 @@
#define MQTT_USER "XXX" #define MQTT_USER "XXX"
#define MQTT_PASS "XXX" #define MQTT_PASS "XXX"
#define MQTT_LED_STATE "strip1/switch"
#define MQTT_LED_COMMAND "strip1/status"
#define MQTT_LED_COMMAND "strip1/switch"
#define MQTT_LED_STATE "strip1/status"
#define MQTT_LED_EFFECT_COMMAND "strip1/effect/switch" #define MQTT_LED_EFFECT_COMMAND "strip1/effect/switch"
#define MQTT_LED_EFFECT_STATE "strip1/effect/status" #define MQTT_LED_EFFECT_STATE "strip1/effect/status"
#define MQTT_LED_BRIGHTNESS_COMMAND "strip1/brightness/switch" #define MQTT_LED_BRIGHTNESS_COMMAND "strip1/brightness/switch"
@ -38,3 +38,11 @@
// TODO : essayer, devrait limiter le flikering // TODO : essayer, devrait limiter le flikering
//#define FASTLED_ALLOW_INTERRUPTS 0 //#define FASTLED_ALLOW_INTERRUPTS 0
#define FASTLED_ESP8266_NODEMCU_PIN_ORDER #define FASTLED_ESP8266_NODEMCU_PIN_ORDER
void setupWifi();
void testConnectMQTT();
void callbackMQTT(char* topic, byte* payload, unsigned int length);
void ledBlackAll();
void ledCylon();
void ledError();
void ledFullColor();

0
arduino/mqttfastledmenu/mqttfastledmenu.ino

18
arduino/platformio.ini

@ -0,0 +1,18 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; http://docs.platformio.org/page/projectconf.html
[env:nodemcuv2]
platform=espressif8266
board=nodemcuv2
framework=arduino
[platformio]
src_dir=mqttfastledmenu
lib_dir=/home/jcabillot/Arduino/libraries

ha_configuration.yml → home-assistant/ha_configuration.yml

@ -17,40 +17,40 @@ input_slider:
strip1_animation_speed: strip1_animation_speed:
name: "Strip1 Animation Speed" name: "Strip1 Animation Speed"
initial: 120 initial: 120
min: 10
max: 150
step: 10
min: 0
max: 150
step: 10
light: light:
platform: "mqtt" platform: "mqtt"
name: "Test ESP"
name: "Test ESP"
command_topic: "strip1/switch" command_topic: "strip1/switch"
state_topic: "strip1/status" 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"
rgb_command_topic: "strip1/color/switch"
rgb_state_topic: "strip1/color/status"
brightness_command_topic: "strip1/brightness/switch"
brightness_state_topic: "strip1/brightness/status"
automation: automation:
- alias: "Strip1 Effect" - alias: "Strip1 Effect"
hide_entity: False
hide_entity: True
trigger: trigger:
- platform: "state"
- platform: "state"
entity_id: "input_select.strip1_effect" entity_id: "input_select.strip1_effect"
action: action:
- service: "mqtt.publish" - service: "mqtt.publish"
data_template: data_template:
topic: "strip1/effect/switch"
topic: "strip1/effect/switch"
payload: '{{ trigger.to_state.state | string }}' payload: '{{ trigger.to_state.state | string }}'
retain: True
retain: True
- alias: "Strip1 Animation Speed" - alias: "Strip1 Animation Speed"
hide_entity: False
hide_entity: True
trigger: trigger:
- platform: "state"
- platform: "state"
entity_id: "input_slider.strip1_animation_speed" entity_id: "input_slider.strip1_animation_speed"
action: action:
- service: "mqtt.publish" - service: "mqtt.publish"
data_template: data_template:
topic: "strip1/speed/switch"
topic: "strip1/speed/switch"
payload: '{{ trigger.to_state.state | int }}' payload: '{{ trigger.to_state.state | int }}'
retain: True
retain: True

irl1.jpg → medias/irl1.jpg

logo.jpg → medias/logo.jpg

mqttfastledmenu.fzz → medias/mqttfastledmenu.fzz

mqttfastledmenu_bb.png → medias/mqttfastledmenu_bb.png

Loading…
Cancel
Save