2 Commits

Author SHA1 Message Date
bpohvoodoo 7940e504e4 Update README.md 2020-06-05 18:30:54 +02:00
bpohvoodoo a07a30c483 Merge pull request #81 from FabLab-Luenen/development
Development
2020-04-18 09:14:23 +02:00
8 changed files with 54 additions and 137 deletions
+27 -7
View File
@@ -271,11 +271,9 @@ void initMqtt() {
mqtt_intopic[sizeof(mqtt_intopic) - 1] = 0x00;
snprintf(mqtt_outtopic, sizeof(mqtt_outtopic), "%s/out", mqtt_clientid);
mqtt_outtopic[sizeof(mqtt_outtopic) - 1] = 0x00;
#if defined(ENABLE_HOMEASSISTANT)
#if defined(MQTT_HOMEASSISTANT_SUPPORT)
snprintf(mqtt_ha_config, sizeof(mqtt_ha_config), "homeassistant/light/%s/config", mqtt_clientid);
mqtt_ha_config[sizeof(mqtt_ha_config) - 1] = 0x00;
#endif
#if defined(MQTT_HOME_ASSISTANT_SUPPORT)
snprintf(mqtt_ha_config, sizeof(mqtt_ha_config), "homeassistant/light/%s/config", mqtt_clientid);
mqtt_ha_config[sizeof(mqtt_ha_config) - 1] = 0x00;
snprintf(mqtt_ha_state_in, sizeof(mqtt_ha_state_in), "home/%s_ha/state/in", mqtt_clientid);
mqtt_ha_state_in[sizeof(mqtt_ha_state_in) - 1] = 0x00;
snprintf(mqtt_ha_state_out, sizeof(mqtt_ha_state_out), "home/%s_ha/state/out", mqtt_clientid);
@@ -657,6 +655,9 @@ void loop() {
if (State.mode == OFF) {
if (prevmode != State.mode) {
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK =off", "");
#endif
#if defined(POWER_SUPPLY)
digitalWrite(POWER_SUPPLY, !POWER_ON); // power off -> external power supply
#endif
@@ -673,9 +674,19 @@ void loop() {
if (State.mode == SET) {
State.mode = HOLD;
// Segment
if (prevsegment != State.segment) {
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK Ss%i", State.segment);
#endif
//prevsegment = State.segment;
}
// Mode
if ((segState.mode[State.segment] != fx_mode) || prevmode == OFF) {
if (segState.mode[State.segment] != fx_mode) {
segState.mode[State.segment] = fx_mode;
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", segState.mode[State.segment]);
#endif
strip->strip_off();
autoCount[State.segment] = 0;
autoDelay[State.segment] = 0;
@@ -690,10 +701,13 @@ void loop() {
}*/
// Brightness
if (strip->getBrightness() != State.brightness) {
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %%%i", State.brightness);
#endif
brightness_trans = State.brightness;
}
// Speed
if (fx_speed != segState.speed[prevsegment]) {
if (fx_speed != segState.speed[State.segment]) {
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK ?%i", segState.speed[prevsegment]);
#endif
@@ -725,6 +739,12 @@ void loop() {
}
//strip->setBrightness(brightness_actual);
#if defined(ENABLE_MQTT)
#if ENABLE_MQTT == 0
mqtt_client->publish(mqtt_outtopic, mqtt_buf);
#endif
#if ENABLE_MQTT == 1
mqtt_client->publish(mqtt_outtopic, qospub, false, mqtt_buf);
#endif
#if defined(ENABLE_HOMEASSISTANT)
if(ha_send_data.active()) ha_send_data.detach();
ha_send_data.once(DELAY_MQTT_HA_MESSAGE, tickerSendState);
+4 -4
View File
@@ -19,7 +19,7 @@ char HOSTNAME[65] = "McLightingRGBW"; // Friedly hostname is configurable just
//#define ENABLE_MQTT_HOSTNAME_CHIPID // Uncomment/comment to add ESPChipID to end of MQTT hostname
//#define ENABLE_MQTT_INCLUDE_IP // uncomment/comment to add the IP-adress to the MQTT message
#define ENABLE_HOMEASSISTANT // If defined, enable Homeassistant integration, ENABLE_MQTT must be active
#define MQTT_HOMEASSISTANT_SUPPORT // If defined, use AMQTT and select Tools -> IwIP Variant -> Higher Bandwidth
#define MQTT_HOME_ASSISTANT_SUPPORT // If defined, use AMQTT and select Tools -> IwIP Variant -> Higher Bandwidth
#define DELAY_MQTT_HA_MESSAGE 5 // HA Status is send after DELAY_MQTT_HA_MESSAGE seconds, to save bandwith
//#define ENABLE_BUTTON 14 // If defined, enable button handling code, see: https://github.com/toblum/McLighting/wiki/Button-control, the value defines the input pin (14 / D5) for switching the LED strip on / off, connect this PIN to ground to trigger button.
@@ -28,7 +28,7 @@ char HOSTNAME[65] = "McLightingRGBW"; // Friedly hostname is configurable just
#if defined(POWER_SUPPLY)
#define POWER_ON HIGH // Define the output state to turn on the power supply, either HIGH or LOW. Opposite will be uses for power off.
#endif
//#define ENABLE_REMOTE 13 // If defined, enable Remote Control via TSOP31238. The value defines the input pin (13 / D7) for TSOP31238 Out
#define ENABLE_REMOTE 13 // If defined, enable Remote Control via TSOP31238. The value defines the input pin (13 / D7) for TSOP31238 Out
#if defined(ENABLE_BUTTON_GY33)
#define GAMMA 2.5 // Gamma correction for GY-33 sensor
@@ -74,7 +74,7 @@ uint8_t prevsegment = 0;
uint8_t _sn[4] = {255,255,255,0};
#endif
#if defined(MQTT_HOMEASSISTANT_SUPPORT)
#if defined(MQTT_HOME_ASSISTANT_SUPPORT)
#define MQTT_HOME_ASSISTANT_0_87_SUPPORT // Comment if using HA version < 0.87
#endif
@@ -93,7 +93,7 @@ uint8_t prevsegment = 0;
#if defined(ENABLE_HOMEASSISTANT) and !defined(ENABLE_MQTT)
#error "To use HA, you have to either enable PubCubClient or AsyncMQTT"
#endif
#if !defined(ENABLE_HOMEASSISTANT) and defined(MQTT_HOMEASSISTANT_SUPPORT)
#if !defined(ENABLE_HOMEASSISTANT) and defined(MQTT_HOME_ASSISTANT_SUPPORT)
#error "To use HA support, you have to either enable Homeassistant component"
#endif
-12
View File
@@ -321,15 +321,3 @@ uint32_t trans(uint32_t _newcolor, uint32_t _oldcolor, uint8_t _level, uint8_t _
_oldcolor = scale_wrgb(_oldcolor, 255-_level);
return _newcolor + _oldcolor;
}
#if defined(ENABLE_MQTT)
void sendmqtt() {
#if ENABLE_MQTT == 0
mqtt_client->publish(mqtt_outtopic, mqtt_buf);
#endif
#if ENABLE_MQTT == 1
mqtt_client->publish(mqtt_outtopic, qospub, false, mqtt_buf);
#endif
memset(mqtt_buf,0,sizeof(mqtt_buf));
}
#endif
+14 -54
View File
@@ -199,25 +199,9 @@ void handleSetWS2812FXMode(uint8_t * mypayload) {
fx_mode = (uint8_t) strtol((const char *) &mypayload[1], NULL, 10);
fx_mode = constrain(fx_mode, 0, strip->getModeCount() - 1);
State.mode = SET;
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", fx_mode);
sendmqtt();
#endif
} else {
if (strcmp((char *) &mypayload[1], "off") == 0) {
if (State.mode == OFF) {
State.mode = SET;
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", segState.mode[State.segment]);
sendmqtt();
#endif
} else {
State.mode = OFF;
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /off", "");
sendmqtt();
#endif
}
if (State.mode == OFF) { State.mode = SET; } else { State.mode = OFF; };
}
if (strcmp((char *) &mypayload[1], "on") == 0) {
State.mode = SET;
@@ -292,11 +276,7 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) {
//memcpy(hexcolors_trans, segState.colors[State.segment], sizeof(hexcolors_trans));
_updateState = true;
Dbg_Prefix(mqtt, num);
DBG_OUTPUT_PORT.printf("Set segment to: [%u]\r\n", _seg);
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK Ss%i", _seg);
sendmqtt();
#endif
DBG_OUTPUT_PORT.printf("Set segment to: [%u]\r\n", State.segment);
}
}
// / ==> Set segment first LED
@@ -309,10 +289,6 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) {
setSegmentSize();
Dbg_Prefix(mqtt, num);
DBG_OUTPUT_PORT.printf("Set segment start to: [%u]\r\n", _seg_start);
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK S[%i", _seg_start);
sendmqtt();
#endif
}
}
// / ==> Set segment last LED
@@ -325,25 +301,18 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) {
setSegmentSize();
Dbg_Prefix(mqtt, num);
DBG_OUTPUT_PORT.printf("Set segment stop to: [%u]\r\n", _seg_stop);
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK S]%i", _seg_stop);
sendmqtt();
#endif
}
}
if (_payload[1] == 'o') {
uint8_t _fx_options = (uint8_t) strtol((const char *) &_payload[2], NULL, 10);
_fx_options = ((constrain(server.arg("fxopt").toInt(), 0, 255)>>1)<<1);
if (_fx_options != segState.options) {
segState.options= _fx_options;
char _fx_options[4];
snprintf(_fx_options, sizeof(_fx_options), "%s", &_payload[2]);
_fx_options[3] = 0x00;
if (((constrain(atoi(_fx_options), 0, 255)>>1)<<1) != segState.options) {
segState.options= ((constrain(atoi(_fx_options), 0, 255)>>1)<<1);
_updateSegState = true;
strip->setOptions(State.segment, segState.options);
Dbg_Prefix(mqtt, num);
DBG_OUTPUT_PORT.printf("Set segment options to: [%u]\r\n", _fx_options);
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK So%i", _fx_options);
sendmqtt();
#endif
DBG_OUTPUT_PORT.printf("Set segment options to: [%u]\r\n", segState.options);
}
}
char * buffer = listSegmentStateJSON(State.segment);
@@ -404,16 +373,11 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) {
// ? ==> Set speed
if (_payload[0] == '?') {
uint16_t _fx_speed = (uint16_t) strtol((const char *) &_payload[1], NULL, 10);
_fx_speed = constrain(_fx_speed, SPEED_MIN, SPEED_MAX );
//if (segState.speed[State.segment] != _fx_speed) {}
segState.speed[State.segment] = _fx_speed;
segState.speed[State.segment] = constrain(_fx_speed, SPEED_MIN, SPEED_MAX );
State.mode = SET;
_updateSegState = true;
Dbg_Prefix(mqtt, num);
DBG_OUTPUT_PORT.printf("Set speed to: [%u]\r\n", _fx_speed);
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK ?%i", _fx_speed);
sendmqtt();
#endif
DBG_OUTPUT_PORT.printf("Set speed to: [%u]\r\n", segState.speed[State.segment]);
}
// % ==> Set brightness
@@ -421,13 +385,10 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) {
uint8_t b = (uint8_t) strtol((const char *) &_payload[1], NULL, 10);
State.brightness = constrain(b, 0, 255);
if (strip->getBrightness() != State.brightness) {
State.mode = SET;
Dbg_Prefix(mqtt, num);
DBG_OUTPUT_PORT.printf("Set brightness to: [%u]\r\n", State.brightness);
_updateState = true;
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %%%i", State.brightness);
sendmqtt();
#endif
}
}
@@ -471,7 +432,6 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) {
}
#if defined(ENABLE_STATE_SAVE)
if (_updateState) {
State.mode = SET;
if(save_state.active()) save_state.detach();
save_state.once(3, tickerSaveState);
}
@@ -981,7 +941,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght
ha_send_data.detach();
mqtt_client->subscribe(mqtt_ha_state_in, qossub);
ha_send_data.once(DELAY_MQTT_HA_MESSAGE, tickerSendState);
#if defined(MQTT_HOMEASSISTANT_SUPPORT)
#if defined(MQTT_HOME_ASSISTANT_SUPPORT)
const size_t bufferSize = JSON_ARRAY_SIZE(strip->getModeCount()+ 4) + JSON_OBJECT_SIZE(11) + 1500;
DynamicJsonDocument jsonBuffer(bufferSize);
JsonObject root = jsonBuffer.to<JsonObject>();
@@ -1087,7 +1047,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght
ha_send_data.detach();
uint16_t packetIdSub2 = mqtt_client->subscribe((char *)mqtt_ha_state_in, qossub);
DBG_OUTPUT_PORT.printf("Subscribing at QoS %d, packetId: ", qossub); DBG_OUTPUT_PORT.println(packetIdSub2);
#if defined(MQTT_HOMEASSISTANT_SUPPORT)
#if defined(MQTT_HOME_ASSISTANT_SUPPORT)
const size_t bufferSize = JSON_ARRAY_SIZE(strip->getModeCount()+ 4) + JSON_OBJECT_SIZE(11) + 1500;
DynamicJsonDocument jsonBuffer(bufferSize);
JsonObject root = jsonBuffer.to<JsonObject>();
+2 -48
View File
@@ -319,19 +319,7 @@ server.on("/config", []() {
});
server.on("/off", []() {
if (State.mode == OFF) {
State.mode = SET;
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", segState.mode[State.segment]);
sendmqtt();
#endif
} else {
State.mode = OFF;
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /off", "");
sendmqtt();
#endif
}
if (State.mode == OFF) { State.mode = SET; } else { State.mode = OFF; };
getACK("OK");
#if defined(ENABLE_STATE_SAVE)
if(save_state.active()) save_state.detach();
@@ -342,10 +330,6 @@ server.on("/off", []() {
server.on("/on", []() {
if (prevmode == OFF) {
State.mode = SET;
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", segState.mode[State.segment]);
sendmqtt();
#endif
getACK("OK");
#if defined(ENABLE_STATE_SAVE)
if(save_state.active()) save_state.detach();
@@ -370,10 +354,6 @@ server.on("/set", []() {
//memcpy(hexcolors_trans, segState.colors[State.segment], sizeof(hexcolors_trans));
State.mode = SET;
_updateState = true;
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK Ss%i", _seg);
sendmqtt();
#endif
}
}
if ((server.arg("start") != "") && (server.arg("start").toInt() >= 0) && (server.arg("start").toInt() <= segState.stop)) {
@@ -383,10 +363,6 @@ server.on("/set", []() {
segState.start = _seg_start;
setSegmentSize();
_updateSegState = true;
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK S[%i", _seg_start);
sendmqtt();
#endif
}
}
if ((server.arg("stop") != "") && (server.arg("stop").toInt() >= segState.start) && (server.arg("stop").toInt() <= Config.stripSize)) {
@@ -396,10 +372,6 @@ server.on("/set", []() {
segState.stop = _seg_stop;
setSegmentSize();
_updateSegState = true;
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK S]%i", _seg_stop);
sendmqtt();
#endif
}
}
@@ -409,10 +381,6 @@ server.on("/set", []() {
segState.options = _fx_options;
strip->setOptions(State.segment, segState.options);
_updateSegState = true;
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK So%i", _fx_options);
sendmqtt();
#endif
}
}
//color wrgb
@@ -507,24 +475,14 @@ server.on("/set", []() {
// Speed
if ((server.arg("s") != "") && (server.arg("s").toInt() >= 0) && (server.arg("s").toInt() <= 255)) {
uint8_t _fx_speed = constrain(server.arg("s").toInt(), 0, 255);
segState.speed[State.segment] = _fx_speed;
segState.speed[State.segment] = constrain(server.arg("s").toInt(), 0, 255);
_updateSegState = true;
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK ?%i", _fx_speed);
sendmqtt();
#endif
}
//Mode
if ((server.arg("m") != "") && (server.arg("m").toInt() >= 0) && (server.arg("m").toInt() <= strip->getModeCount())) {
fx_mode = constrain(server.arg("m").toInt(), 0, strip->getModeCount() - 1);
if (fx_mode != segState.mode[State.segment]) {
_updateSegState = true;
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", fx_mode);
sendmqtt();
#endif
}
}
@@ -537,10 +495,6 @@ server.on("/set", []() {
if (strip->getBrightness() != State.brightness) {
State.mode = SET;
_updateState = true;
#if defined(ENABLE_MQTT)
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %%%i", State.brightness);
sendmqtt();
#endif
}
//DBG_OUTPUT_PORT.printf("Get Args: %s\r\n", listStateJSONfull()); //possibly causing heap problems
getACK("OK");
+1 -1
View File
@@ -1 +1 @@
#define SKETCH_VERSION "3.1.2"
#define SKETCH_VERSION "3.1.1"
+1 -6
View File
@@ -261,9 +261,4 @@
* 18 April 2020
* Version Bump to 3.1.1
* bugfixes regarding issue #80
*
* 19 April 2020
* Version Bump to 3.1.2
* Almost finished: bugfixes regarding issue #80
* ToDo: bugfixes regarding issue #70
*/
*/
+5 -5
View File
@@ -37,17 +37,17 @@ This project uses libraries and code by different authors:
- [WS2812FX](https://github.com/kitesurfer1404/WS2812FX) by kitesurfer1404 (tested with version 1.2.1)
- [WebSockets](https://github.com/Links2004/arduinoWebSockets) by Links2004 (tested with version 2.1.4)
- [WebSockets](https://github.com/Links2004/arduinoWebSockets) by Links2004 (tested with version 2.2.0)
- [Adafruit NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel) by adafruit (tested with 1.2.5)
- [Adafruit NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel) by adafruit (tested with 1.4.0)
- Optional: [PubSubClient](https://github.com/knolleary/pubsubclient/) by knolleary (tested with 2.7.0)
- Optional: [PubSubClient](https://github.com/knolleary/pubsubclient/) by knolleary (tested with 2.8.0)
_Only when you have activated MQTT in definitions.h._
- Optional: [Brzo I2C](https://github.com/pasko-zh/brzo_i2c/) by pazko-zh (tested with 1.3.3)
_Only when you have activated GY33 in definitions.h._
- Optional: [FastLed](https://github.com/FastLED/FastLED/) by FastLED (tested with 1.3.3)
- Optional: [FastLed](https://github.com/FastLED/FastLED/) by FastLED (tested with 3.3.3)
_Only when you have activated custom animations (Fire2012) in definitions.h._
The sketch also uses the following built-in library:
@@ -66,7 +66,7 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so
## Todos
- [ ] Redesign of Code and bump to V3
- [x] Redesign of Code and bump to V3
- [ ] Customer profile to define segments of (in)active areas on the strip [Issue](https://github.com/toblum/McLighting/issues/37)
- [ ] Additional clients
- [x] If no wifi, at least enable button mode.