From 8ff869ce7fb5d1688694b6c6944986fb65fcadc0 Mon Sep 17 00:00:00 2001
From: Debashish Sahu <debashish.sahu@gmail.com>
Date: Tue, 5 Mar 2019 00:38:40 -0500
Subject: [PATCH] bug_fix

- fixed bugs
- Added file for custom WS2812FX animations in custom slots
- Rename varaibles to be char instead of String
- Added LED pixel count and PIN settings to WiFiManager
---
 Arduino/McLighting/McLighting.ino             | 109 ++++++++++++------
 .../McLighting/custom_ws2812fx_animations.h   |  97 ++++++++++++++++
 Arduino/McLighting/definitions.h              |  26 ++---
 Arduino/McLighting/request_handlers.h         |  60 +++++-----
 Arduino/McLighting/version_info.ino           |   3 +
 platformio.ini                                |  10 +-
 6 files changed, 226 insertions(+), 79 deletions(-)
 create mode 100644 Arduino/McLighting/custom_ws2812fx_animations.h

diff --git a/Arduino/McLighting/McLighting.ino b/Arduino/McLighting/McLighting.ino
index c3bc235..5ff2599 100644
--- a/Arduino/McLighting/McLighting.ino
+++ b/Arduino/McLighting/McLighting.ino
@@ -84,7 +84,7 @@ ESP8266HTTPUpdateServer httpUpdater;
 // ***************************************************************************
 // https://github.com/kitesurfer1404/WS2812FX
 #include <WS2812FX.h>
-// WS2812FX strip = WS2812FX(NUMLEDS, PIN, NEO_GRB + NEO_KHZ800);
+// WS2812FX strip = WS2812FX(NUMLEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
 WS2812FX* strip;
 
 #if defined(USE_WS2812FX_DMA) or defined(USE_WS2812FX_UART1) or defined(USE_WS2812FX_UART2)
@@ -229,10 +229,13 @@ void saveConfigCallback () {
 // ***************************************************************************
 #include "request_handlers.h"
 
+#ifdef CUSTOM_WS2812FX_ANIMATIONS
+  #include "custom_ws2812fx_animations.h" // Add animations in this file
+#endif
+
 // function to Initialize the strip
 void initStrip(uint16_t stripSize = WS2812FXStripSettings.stripSize, neoPixelType RGBOrder = WS2812FXStripSettings.RGBOrder, uint8_t pin = WS2812FXStripSettings.pin){
   if (strip) {
-    if (strip->getLength() == stripSize && WS2812FXStripSettings.RGBOrder == RGBOrder && WS2812FXStripSettings.pin == pin) return;
     delete strip;
     WS2812FXStripSettings.stripSize = stripSize;
     WS2812FXStripSettings.RGBOrder = RGBOrder;
@@ -259,9 +262,13 @@ void initStrip(uint16_t stripSize = WS2812FXStripSettings.stripSize, neoPixelTyp
   #endif
   strip->setBrightness(brightness);
   strip->setSpeed(convertSpeed(ws2812fx_speed));
-  //strip->setMode(FX_MODE_RAINBOW_CYCLE);
+  //strip->setMode(ws2812fx_mode);
   strip->setColor(main_color.red, main_color.green, main_color.blue);
+#ifdef CUSTOM_WS2812FX_ANIMATIONS
+  strip->setCustomMode(myCustomEffect);
+#endif
   strip->start();
+  if(mode != HOLD) mode = SET_MODE;
   saveWS2812FXStripSettings.once(3, writeStripConfigFS);
 }
 
@@ -339,10 +346,16 @@ void setup() {
     #endif
     WiFiManagerParameter custom_mqtt_host("host", "MQTT hostname", mqtt_host, 64);
     WiFiManagerParameter custom_mqtt_port("port", "MQTT port", mqtt_port, 6);
-    WiFiManagerParameter custom_mqtt_user("user", "MQTT user", mqtt_user, 32);
-    WiFiManagerParameter custom_mqtt_pass("pass", "MQTT pass", mqtt_pass, 32);
+    WiFiManagerParameter custom_mqtt_user("user", "MQTT user", mqtt_user, 32, " maxlength=31");
+    WiFiManagerParameter custom_mqtt_pass("pass", "MQTT pass", mqtt_pass, 32, " maxlength=31 type='password'");
   #endif
 
+  sprintf(strip_size, "%d", WS2812FXStripSettings.stripSize);
+  sprintf(led_pin, "%d", WS2812FXStripSettings.pin);
+
+  WiFiManagerParameter custom_strip_size("strip_size", "Number of LEDs", strip_size, 3);
+  WiFiManagerParameter custom_led_pin("led_pin", "LED GPIO", led_pin, 2);
+
   //Local intialization. Once its business is done, there is no need to keep it around
   WiFiManager wifiManager;
   //reset settings - for testing
@@ -362,6 +375,9 @@ void setup() {
     wifiManager.addParameter(&custom_mqtt_pass);
   #endif
 
+  wifiManager.addParameter(&custom_strip_size);
+  wifiManager.addParameter(&custom_led_pin);
+
   WiFi.setSleepMode(WIFI_NONE_SLEEP);
   
   // Uncomment if you want to restart ESP8266 if it cannot connect to WiFi.
@@ -394,6 +410,16 @@ void setup() {
     strcpy(mqtt_user, custom_mqtt_user.getValue());
     strcpy(mqtt_pass, custom_mqtt_pass.getValue());
 
+    strcpy(strip_size, custom_strip_size.getValue());
+    strcpy(led_pin, custom_led_pin.getValue());
+
+    if(atoi(strip_size) != WS2812FXStripSettings.stripSize)
+      WS2812FXStripSettings.stripSize = atoi(strip_size); 
+    uint8_t pin = atoi(led_pin);
+    if ((pin == 16 or pin == 5 or pin == 4 or pin == 0 or pin == 2 or pin == 14 or pin == 12 or pin == 13 or pin == 15 or pin == 3 or pin == 1) and (pin != WS2812FXStripSettings.pin) )
+      WS2812FXStripSettings.pin = pin;    
+    initStrip();
+
     //save the custom parameters to FS
     #if defined(ENABLE_STATE_SAVE_SPIFFS) and (defined(ENABLE_MQTT) or defined(ENABLE_AMQTT))
       (writeConfigFS(shouldSaveConfig)) ? DBG_OUTPUT_PORT.println("WiFiManager config FS Save success!"): DBG_OUTPUT_PORT.println("WiFiManager config FS Save failure!");
@@ -474,9 +500,6 @@ void setup() {
 
   #ifdef ENABLE_MQTT
     if (mqtt_host != "" && atoi(mqtt_port) > 0) {
-      snprintf(mqtt_intopic, sizeof mqtt_intopic, "%s/in", HOSTNAME);
-      snprintf(mqtt_outtopic, sizeof mqtt_outtopic, "%s/out", HOSTNAME);
-
       DBG_OUTPUT_PORT.printf("MQTT active: %s:%d\n", mqtt_host, String(mqtt_port).toInt());
 
       mqtt_client.setServer(mqtt_host, atoi(mqtt_port));
@@ -492,7 +515,7 @@ void setup() {
       amqttClient.setServer(mqtt_host, atoi(mqtt_port));
       if (mqtt_user != "" or mqtt_pass != "") amqttClient.setCredentials(mqtt_user, mqtt_pass);
       amqttClient.setClientId(mqtt_clientid);
-      amqttClient.setWill(mqtt_will_topic.c_str(), 2, true, mqtt_will_payload, 0);
+      amqttClient.setWill(mqtt_will_topic, 2, true, mqtt_will_payload, 0);
 
       connectToMqtt();
     }
@@ -575,7 +598,7 @@ void setup() {
       json["pin"] = 2;
     #else
       json["animation_lib"] = "WS2812FX";
-      json["pin"] = PIN;
+      json["pin"] = LED_PIN;
     #endif
     json["number_leds"] = NUMLEDS;
     #ifdef ENABLE_BUTTON
@@ -682,7 +705,7 @@ void setup() {
     mqtt_client.publish(mqtt_outtopic, String(String("OK %") + String(brightness)).c_str());
     #endif
     #ifdef ENABLE_AMQTT
-    amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String(String("OK %") + String(brightness)).c_str());
+    amqttClient.publish(mqtt_outtopic, qospub, false, String(String("OK %") + String(brightness)).c_str());
     #endif
     #ifdef ENABLE_HOMEASSISTANT
       stateOn = true;
@@ -711,7 +734,7 @@ void setup() {
       mqtt_client.publish(mqtt_outtopic, String(String("OK ?") + String(ws2812fx_speed)).c_str());
       #endif
       #ifdef ENABLE_AMQTT
-      amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String(String("OK ?") + String(ws2812fx_speed)).c_str());
+      amqttClient.publish(mqtt_outtopic, qospub, false, String(String("OK ?") + String(ws2812fx_speed)).c_str());
       #endif
       #ifdef ENABLE_HOMEASSISTANT
         if(!ha_send_data.active())  ha_send_data.once(5, tickerSendState);
@@ -749,12 +772,13 @@ void setup() {
   });
 
   server.on("/pixels", []() {
+
+    bool updateStrip = false;
     if(server.hasArg("ct")){
       uint16_t pixelCt = server.arg("ct").toInt();
       if (pixelCt > 0) {
-        if(strip->isRunning()) strip->stop();
-        initStrip(pixelCt);
-        if(mode != HOLD) mode = SET_MODE;
+        WS2812FXStripSettings.stripSize = pixelCt;
+        updateStrip = true;
         DBG_OUTPUT_PORT.printf("/pixels: Count# %d\n", pixelCt);
       }
     }
@@ -762,22 +786,28 @@ void setup() {
       String RGBOrder = server.arg("rgbo");
       DBG_OUTPUT_PORT.print("/pixels: RGB Order# ");
       if (RGBOrder == "grb") {
-        initStrip(strip->getLength(), NEO_GRB);
+        WS2812FXStripSettings.RGBOrder = NEO_GRB;
+        updateStrip = true;
         DBG_OUTPUT_PORT.println(RGBOrder);
       } else if (RGBOrder == "gbr") {
-        initStrip(strip->getLength(), NEO_GBR);
+        WS2812FXStripSettings.RGBOrder = NEO_GBR;
+        updateStrip = true;
         DBG_OUTPUT_PORT.println(RGBOrder);
       } else if (RGBOrder == "rgb") {
-        initStrip(strip->getLength(), NEO_RGB);
+        WS2812FXStripSettings.RGBOrder = NEO_RGB;
+        updateStrip = true;
         DBG_OUTPUT_PORT.println(RGBOrder);
       } else if (RGBOrder == "rbg") {
-        initStrip(strip->getLength(), NEO_RBG);
+        WS2812FXStripSettings.RGBOrder = NEO_RBG;
+        updateStrip = true;
         DBG_OUTPUT_PORT.println(RGBOrder);
       } else if (RGBOrder == "brg") {
-        initStrip(strip->getLength(), NEO_BRG);
+        WS2812FXStripSettings.RGBOrder = NEO_BRG;
+        updateStrip = true;
         DBG_OUTPUT_PORT.println(RGBOrder);
       } else if (RGBOrder == "bgr") {
-        initStrip(strip->getLength(), NEO_BGR);
+        WS2812FXStripSettings.RGBOrder = NEO_BGR;
+        updateStrip = true;
         DBG_OUTPUT_PORT.println(RGBOrder);
       } else {
         DBG_OUTPUT_PORT.println("invalid input!");
@@ -798,7 +828,8 @@ void setup() {
         #endif
       #else
       if (pin == 16 or pin == 5 or pin == 4 or pin == 0 or pin == 2 or pin == 14 or pin == 12 or pin == 13 or pin == 15 or pin == 3 or pin == 1) {
-        initStrip(NULL, NULL, pin);
+        WS2812FXStripSettings.pin = pin;
+        updateStrip = true;
         DBG_OUTPUT_PORT.println(pin);
       } else {
         DBG_OUTPUT_PORT.println("invalid input!");
@@ -806,6 +837,16 @@ void setup() {
       #endif
     }
 
+    if(updateStrip)
+    {
+      ws2812fx_mode = strip->getMode();
+      if(strip->isRunning()) strip->stop();
+      initStrip();
+      writeStripConfigFS();
+      strip->setMode(ws2812fx_mode);
+      strip->trigger();
+    }
+    
     DynamicJsonDocument jsonBuffer(200);
     JsonObject json = jsonBuffer.to<JsonObject>();
     json["pixel_pount"] = WS2812FXStripSettings.stripSize;
@@ -828,7 +869,7 @@ void setup() {
     mqtt_client.publish(mqtt_outtopic, String("OK =off").c_str());
     #endif
     #ifdef ENABLE_AMQTT
-    amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String("OK =off").c_str());
+    amqttClient.publish(mqtt_outtopic, qospub, false, String("OK =off").c_str());
     #endif
     #ifdef ENABLE_HOMEASSISTANT
       stateOn = false;
@@ -851,7 +892,7 @@ void setup() {
     mqtt_client.publish(mqtt_outtopic, String("OK =all").c_str());
     #endif
     #ifdef ENABLE_AMQTT
-    amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String("OK =all").c_str());
+    amqttClient.publish(mqtt_outtopic, qospub, false, String("OK =all").c_str());
     #endif
     #ifdef ENABLE_HOMEASSISTANT
       stateOn = true;
@@ -871,7 +912,7 @@ void setup() {
       mqtt_client.publish(mqtt_outtopic, String("OK =wipe").c_str());
       #endif
       #ifdef ENABLE_AMQTT
-      amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String("OK =wipe").c_str());
+      amqttClient.publish(mqtt_outtopic, qospub, false, String("OK =wipe").c_str());
       #endif
       #ifdef ENABLE_HOMEASSISTANT
         stateOn = true;
@@ -890,7 +931,7 @@ void setup() {
       mqtt_client.publish(mqtt_outtopic, String("OK =rainbow").c_str());
       #endif
       #ifdef ENABLE_AMQTT
-      amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String("OK =rainbow").c_str());
+      amqttClient.publish(mqtt_outtopic, qospub, false, String("OK =rainbow").c_str());
       #endif
       #ifdef ENABLE_HOMEASSISTANT
         stateOn = true;
@@ -909,7 +950,7 @@ void setup() {
       mqtt_client.publish(mqtt_outtopic, String("OK =rainbowCycle").c_str());
       #endif
       #ifdef ENABLE_AMQTT
-      amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String("OK =rainbowCycle").c_str());
+      amqttClient.publish(mqtt_outtopic, qospub, false, String("OK =rainbowCycle").c_str());
       #endif
       #ifdef ENABLE_HOMEASSISTANT
         stateOn = true;
@@ -928,7 +969,7 @@ void setup() {
       mqtt_client.publish(mqtt_outtopic, String("OK =theaterchase").c_str());
       #endif
       #ifdef ENABLE_AMQTT
-      amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String("OK =theaterchase").c_str());
+      amqttClient.publish(mqtt_outtopic, qospub, false, String("OK =theaterchase").c_str());
       #endif
       #ifdef ENABLE_HOMEASSISTANT
         stateOn = true;
@@ -947,7 +988,7 @@ void setup() {
       mqtt_client.publish(mqtt_outtopic, String("OK =twinkleRandom").c_str());
       #endif
       #ifdef ENABLE_AMQTT
-      amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String("OK =twinkleRandom").c_str());
+      amqttClient.publish(mqtt_outtopic, qospub, false, String("OK =twinkleRandom").c_str());
       #endif
       #ifdef ENABLE_HOMEASSISTANT
         stateOn = true;
@@ -966,7 +1007,7 @@ void setup() {
       mqtt_client.publish(mqtt_outtopic, String("OK =theaterchaseRainbow").c_str());
       #endif
       #ifdef ENABLE_AMQTT
-      amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String("OK =theaterchaseRainbow").c_str());
+      amqttClient.publish(mqtt_outtopic, qospub, false, String("OK =theaterchaseRainbow").c_str());
       #endif
       #ifdef ENABLE_HOMEASSISTANT
         stateOn = true;
@@ -985,7 +1026,7 @@ void setup() {
       mqtt_client.publish(mqtt_outtopic, String("OK =e131").c_str());
       #endif
       #ifdef ENABLE_AMQTT
-      amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String("OK =131").c_str());
+      amqttClient.publish(mqtt_outtopic, qospub, false, String("OK =131").c_str());
       #endif
       #ifdef ENABLE_HOMEASSISTANT
         stateOn = true;
@@ -1005,7 +1046,7 @@ void setup() {
       mqtt_client.publish(mqtt_outtopic, String("OK =tv").c_str());
       #endif
       #ifdef ENABLE_AMQTT
-      amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String("OK =tv").c_str());
+      amqttClient.publish(mqtt_outtopic, qospub, false, String("OK =tv").c_str());
       #endif
       #ifdef ENABLE_HOMEASSISTANT
         stateOn = true;
@@ -1029,7 +1070,7 @@ void setup() {
     mqtt_client.publish(mqtt_outtopic, String(String("OK /") + String(ws2812fx_mode)).c_str());
     #endif
     #ifdef ENABLE_AMQTT
-    amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String(String("OK /") + String(ws2812fx_mode)).c_str());
+    amqttClient.publish(mqtt_outtopic, qospub, false, String(String("OK /") + String(ws2812fx_mode)).c_str());
     #endif
     #ifdef ENABLE_HOMEASSISTANT
       stateOn = true;
@@ -1055,7 +1096,7 @@ void setup() {
   // Choose one to begin listening for E1.31 data
   // if (e131.begin(E131_UNICAST))                             // Listen via Unicast
   if (e131.begin(E131_MULTICAST, START_UNIVERSE, END_UNIVERSE)) // Listen via Multicast
-      Serial.println(F("Listening for data..."));
+      Serial.println(F("E1.31 mode setup complete."));
   else
       Serial.println(F("*** e131.begin failed ***"));
   #endif
diff --git a/Arduino/McLighting/custom_ws2812fx_animations.h b/Arduino/McLighting/custom_ws2812fx_animations.h
new file mode 100644
index 0000000..90bc385
--- /dev/null
+++ b/Arduino/McLighting/custom_ws2812fx_animations.h
@@ -0,0 +1,97 @@
+/*
+
+Example of adding the example: https://github.com/kitesurfer1404/WS2812FX/blob/master/examples/ws2812fx_custom_FastLED/ws2812fx_custom_FastLED.ino
+as a custom effect
+
+More info on how to create custom aniamtions for WS2812FX: https://github.com/kitesurfer1404/WS2812FX/blob/master/extras/WS2812FX%20Users%20Guide.md#custom-effects
+
+*/
+
+#include <FastLED.h>  //https://github.com/FastLED/FastLED
+
+
+/*
+ * paste in the Fire2012 code with a small edit at the end which uses the
+ * setPixelColor() function to copy the color data to the ws2812fx instance. 
+*/
+
+ // Fire2012 by Mark Kriegsman, July 2012
+// as part of "Five Elements" shown here: http://youtu.be/knWiGsmgycY
+//// 
+// This basic one-dimensional 'fire' simulation works roughly as follows:
+// There's a underlying array of 'heat' cells, that model the temperature
+// at each point along the line.  Every cycle through the simulation, 
+// four steps are performed:
+//  1) All cells cool down a little bit, losing heat to the air
+//  2) The heat from each cell drifts 'up' and diffuses a little
+//  3) Sometimes randomly new 'sparks' of heat are added at the bottom
+//  4) The heat from each cell is rendered as a color into the leds array
+//     The heat-to-color mapping uses a black-body radiation approximation.
+//
+// Temperature is in arbitrary units from 0 (cold black) to 255 (white hot).
+//
+// This simulation scales it self a bit depending on NUM_LEDS; it should look
+// "OK" on anywhere from 20 to 100 LEDs without too much tweaking. 
+//
+// I recommend running this simulation at anywhere from 30-100 frames per second,
+// meaning an interframe delay of about 10-35 milliseconds.
+//
+// Looks best on a high-density LED setup (60+ pixels/meter).
+//
+//
+// There are two main parameters you can play with to control the look and
+// feel of your fire: COOLING (used in step 1 above), and SPARKING (used
+// in step 3 above).
+//
+// COOLING: How much does the air cool as it rises?
+// Less cooling = taller flames.  More cooling = shorter flames.
+// Default 50, suggested range 20-100 
+#define COOLING  55
+
+ // SPARKING: What chance (out of 255) is there that a new spark will be lit?
+// Higher chance = more roaring fire.  Lower chance = more flickery fire.
+// Default 120, suggested range 50-200.
+#define SPARKING 120
+
+ bool gReverseDirection = false;
+
+ void Fire2012()
+{
+// Array of temperature readings at each simulation cell
+  byte heat[WS2812FXStripSettings.stripSize];
+
+   // Step 1.  Cool down every cell a little
+    for( int i = 0; i < WS2812FXStripSettings.stripSize; i++) {
+      heat[i] = qsub8( heat[i],  random8(0, ((COOLING * 10) / WS2812FXStripSettings.stripSize) + 2));
+    }
+
+     // Step 2.  Heat from each cell drifts 'up' and diffuses a little
+    for( int k= WS2812FXStripSettings.stripSize- 1; k >= 2; k--) {
+      heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2] ) / 3;
+    }
+
+     // Step 3.  Randomly ignite new 'sparks' of heat near the bottom
+    if( random8() < SPARKING ) {
+      int y = random8(7);
+      heat[y] = qadd8( heat[y], random8(160,255) );
+    }
+
+     // Step 4.  Map from heat cells to LED colors
+    for( int j = 0; j < WS2812FXStripSettings.stripSize; j++) {
+      CRGB color = HeatColor( heat[j]);
+      int pixelnumber;
+      if( gReverseDirection ) {
+        pixelnumber = (WS2812FXStripSettings.stripSize-1) - j;
+      } else {
+        pixelnumber = j;
+      }
+
+      strip->setPixelColor(pixelnumber, color.red, color.green, color.blue);
+
+     }
+}
+
+uint16_t myCustomEffect() {
+  Fire2012();
+  return (strip->getSpeed() / WS2812FXStripSettings.stripSize);
+}
\ No newline at end of file
diff --git a/Arduino/McLighting/definitions.h b/Arduino/McLighting/definitions.h
index 2ebb77f..cc46797 100644
--- a/Arduino/McLighting/definitions.h
+++ b/Arduino/McLighting/definitions.h
@@ -1,14 +1,14 @@
-//#define USE_WS2812FX_DMA       // PIN is ignored & set to RX/GPIO3  Uses WS2812FX, see: https://github.com/kitesurfer1404/WS2812FX
-//#define USE_WS2812FX_UART1     // PIN is ignored & set to D4/GPIO2  Uses WS2812FX, see: https://github.com/kitesurfer1404/WS2812FX
-//#define USE_WS2812FX_UART2     // PIN is ignored & set to TX/GPIO1  Uses WS2812FX, see: https://github.com/kitesurfer1404/WS2812FX
+//#define USE_WS2812FX_DMA       // LED_PIN is ignored & set to RX/GPIO3  Uses WS2812FX, see: https://github.com/kitesurfer1404/WS2812FX
+//#define USE_WS2812FX_UART1     // LED_PIN is ignored & set to D4/GPIO2  Uses WS2812FX, see: https://github.com/kitesurfer1404/WS2812FX
+//#define USE_WS2812FX_UART2     // LED_PIN is ignored & set to TX/GPIO1  Uses WS2812FX, see: https://github.com/kitesurfer1404/WS2812FX
 
 // Neopixel
-#define PIN 14           // PIN (14 / D5) where neopixel / WS2811 strip is attached
+#define LED_PIN 14       // LED_PIN (14 / D5) where neopixel / WS2811 strip is attached
 #define NUMLEDS 24       // Number of leds in the strip
 #define BUILTIN_LED 2    // ESP-12F has the built in LED on GPIO2, see https://github.com/esp8266/Arduino/issues/2192
 #define BUTTON 4         // Input pin (4 / D2) for switching the LED strip on / off, connect this PIN to ground to trigger button.
 
-const char HOSTNAME[] = "McLighting01";   // Friedly hostname
+#define HOSTNAME "McLighting01"   // Friedly hostname
 
 #define HTTP_OTA             // If defined, enable ESP8266HTTPUpdateServer OTA code.
 //#define ENABLE_OTA         // If defined, enable Arduino OTA code.
@@ -62,30 +62,28 @@ uint32_t autoParams[][4] = {  // color, speed, mode, duration (milliseconds)
 };
 
 #if defined(ENABLE_MQTT) or defined(ENABLE_AMQTT)
-  const String mqtt_will_topic = String(HOSTNAME) + "/status";
+
+  const char mqtt_will_topic[] = HOSTNAME "/status";
   const char mqtt_will_payload[] = "ONLINE";
+  const char mqtt_intopic[] = HOSTNAME "/in";
+  const char mqtt_outtopic[] = HOSTNAME "/out";
 
   #ifdef ENABLE_MQTT
     #define MQTT_MAX_PACKET_SIZE 512
     #define MQTT_MAX_RECONNECT_TRIES 4
 
     int mqtt_reconnect_retries = 0;
-    char mqtt_intopic[strlen(HOSTNAME) + 4 + 5];      // Topic in will be: <HOSTNAME>/in
-    char mqtt_outtopic[strlen(HOSTNAME) + 5 + 5];     // Topic out will be: <HOSTNAME>/out
     uint8_t qossub = 0; // PubSubClient can sub qos 0 or 1
   #endif
 
   #ifdef ENABLE_AMQTT
-    String mqtt_intopic = String(HOSTNAME) + "/in";
-    String mqtt_outtopic = String(HOSTNAME) + "/out";
     uint8_t qossub = 0; // AMQTT can sub qos 0 or 1 or 2
     uint8_t qospub = 0; // AMQTT can pub qos 0 or 1 or 2
   #endif
 
   #ifdef ENABLE_HOMEASSISTANT
-    String mqtt_ha = "home/" + String(HOSTNAME) + "_ha/";
-    String mqtt_ha_state_in = mqtt_ha + "state/in";
-    String mqtt_ha_state_out = mqtt_ha + "state/out";
+    const char mqtt_ha_state_in[] = "home/" HOSTNAME "_ha/state/in";
+    const char mqtt_ha_state_out[] = "home/" HOSTNAME "_ha/state/out";
 
     const char* on_cmd = "ON";
     const char* off_cmd = "OFF";
@@ -99,7 +97,7 @@ uint32_t autoParams[][4] = {  // color, speed, mode, duration (milliseconds)
   #ifdef ENABLE_MQTT_HOSTNAME_CHIPID
     char mqtt_clientid[64];
   #else
-    const char* mqtt_clientid = HOSTNAME;
+    const char mqtt_clientid[] = HOSTNAME;
   #endif
 
   char mqtt_host[64] = "";
diff --git a/Arduino/McLighting/request_handlers.h b/Arduino/McLighting/request_handlers.h
index d105d6e..4ba7210 100644
--- a/Arduino/McLighting/request_handlers.h
+++ b/Arduino/McLighting/request_handlers.h
@@ -461,7 +461,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) {
       mqtt_client.publish(mqtt_outtopic, String(String("OK ") + String((char *)payload)).c_str());
     #endif
     #ifdef ENABLE_AMQTT
-      amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String(String("OK ") + String((char *)payload)).c_str());
+      amqttClient.publish(mqtt_outtopic, qospub, false, String(String("OK ") + String((char *)payload)).c_str());
     #endif
     #ifdef ENABLE_HOMEASSISTANT
       stateOn = true;
@@ -492,7 +492,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) {
     mqtt_client.publish(mqtt_outtopic, String(String("OK ") + String((char *)payload)).c_str());
     #endif
     #ifdef ENABLE_AMQTT
-    amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String(String("OK ") + String((char *)payload)).c_str());
+    amqttClient.publish(mqtt_outtopic, qospub, false, String(String("OK ") + String((char *)payload)).c_str());
     #endif
   }
 
@@ -512,7 +512,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) {
     mqtt_client.publish(mqtt_outtopic, String(String("OK ") + String((char *)payload)).c_str());
     #endif
     #ifdef ENABLE_AMQTT
-    amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String(String("OK ") + String((char *)payload)).c_str());
+    amqttClient.publish(mqtt_outtopic, qospub, false, String(String("OK ") + String((char *)payload)).c_str());
     #endif
     #ifdef ENABLE_HOMEASSISTANT
       stateOn = true;
@@ -537,7 +537,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) {
     mqtt_client.publish(mqtt_outtopic, String(String("OK ") + String((char *)payload)).c_str());
     #endif
     #ifdef ENABLE_AMQTT
-    amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String(String("OK ") + String((char *)payload)).c_str());
+    amqttClient.publish(mqtt_outtopic, qospub, false, String(String("OK ") + String((char *)payload)).c_str());
     #endif
     #ifdef ENABLE_HOMEASSISTANT
       stateOn = true;
@@ -562,7 +562,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) {
     mqtt_client.publish(mqtt_outtopic, String(String("OK ") + String((char *)payload)).c_str());
     #endif
     #ifdef ENABLE_AMQTT
-    amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String(String("OK ") + String((char *)payload)).c_str());
+    amqttClient.publish(mqtt_outtopic, qospub, false, String(String("OK ") + String((char *)payload)).c_str());
     #endif
   }
 
@@ -580,7 +580,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) {
     mqtt_client.publish(mqtt_outtopic, String(String("OK ") + String((char *)payload)).c_str());
     #endif
     #ifdef ENABLE_AMQTT
-    amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String(String("OK ") + String((char *)payload)).c_str());
+    amqttClient.publish(mqtt_outtopic, qospub, false, String(String("OK ") + String((char *)payload)).c_str());
     #endif
   }
 
@@ -599,7 +599,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) {
     mqtt_client.publish(mqtt_outtopic, String(String("OK ") + String((char *)payload)).c_str());
     #endif
     #ifdef ENABLE_AMQTT
-    amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String(String("OK ") + String((char *)payload)).c_str());
+    amqttClient.publish(mqtt_outtopic, qospub, false, String(String("OK ") + String((char *)payload)).c_str());
     #endif
   }
 
@@ -624,7 +624,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) {
       mqtt_client.publish(mqtt_outtopic, String(String("OK ") + String((char *)payload)).c_str());
       #endif
       #ifdef ENABLE_AMQTT
-      amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String(String("OK ") + String((char *)payload)).c_str());
+      amqttClient.publish(mqtt_outtopic, qospub, false, String(String("OK ") + String((char *)payload)).c_str());
       #endif
       #ifdef ENABLE_HOMEASSISTANT
         if(!ha_send_data.active())  ha_send_data.once(5, tickerSendState);
@@ -644,7 +644,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) {
         mqtt_client.publish(mqtt_outtopic, json.c_str());
       #endif
       #ifdef ENABLE_AMQTT
-        amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, json.c_str());
+        amqttClient.publish(mqtt_outtopic, qospub, false, json.c_str());
       #endif
     } else {
       DBG_OUTPUT_PORT.print("WS: ");
@@ -671,7 +671,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) {
         //DBG_OUTPUT_PORT.printf("Result: %d / %d", res, json_modes.length());
       #endif
       #ifdef ENABLE_AMQTT
-        amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, json.c_str());
+        amqttClient.publish(mqtt_outtopic, qospub, false, json.c_str());
       #endif
     } else {
       DBG_OUTPUT_PORT.print("WS: ");
@@ -700,7 +700,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) {
     mqtt_client.publish(mqtt_outtopic, String(String("OK ") + String((char *)payload)).c_str());
     #endif
     #ifdef ENABLE_AMQTT
-    amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String(String("OK ") + String((char *)payload)).c_str());
+    amqttClient.publish(mqtt_outtopic, qospub, false, String(String("OK ") + String((char *)payload)).c_str());
     #endif
     #ifdef ENABLE_HOMEASSISTANT
       stateOn = true;
@@ -855,12 +855,12 @@ void checkForRequests() {
       serializeJson(root, buffer, sizeof(buffer));
 
       #ifdef ENABLE_MQTT
-      mqtt_client.publish(mqtt_ha_state_out.c_str(), buffer, true);
-      DBG_OUTPUT_PORT.printf("MQTT: Send [%s]: %s\n", mqtt_ha_state_out.c_str(), buffer);
+      mqtt_client.publish(mqtt_ha_state_out, buffer, true);
+      DBG_OUTPUT_PORT.printf("MQTT: Send [%s]: %s\n", mqtt_ha_state_out, buffer);
       #endif
       #ifdef ENABLE_AMQTT
-      amqttClient.publish(mqtt_ha_state_out.c_str(), 1, true, buffer);
-      DBG_OUTPUT_PORT.printf("MQTT: Send [%s]: %s\n", mqtt_ha_state_out.c_str(), buffer);
+      amqttClient.publish(mqtt_ha_state_out, 1, true, buffer);
+      DBG_OUTPUT_PORT.printf("MQTT: Send [%s]: %s\n", mqtt_ha_state_out, buffer);
       #endif
       new_ha_mqtt_msg = false;
       ha_send_data.detach();
@@ -965,7 +965,7 @@ void checkForRequests() {
     DBG_OUTPUT_PORT.printf("MQTT: Message arrived [%s]\n", payload);
   #endif
     #ifdef ENABLE_HOMEASSISTANT
-      if (strcmp(topic, mqtt_ha_state_in.c_str()) == 0) {
+      if (strcmp(topic, mqtt_ha_state_in) == 0) {
         if (!processJson((char*)payload)) {
           return;
         }
@@ -977,7 +977,7 @@ void checkForRequests() {
         } else if (strcmp(topic, (char *)mqtt_intopic) == 0) {
         #endif
         #ifdef ENABLE_AMQTT
-        } else if (strcmp(topic, mqtt_intopic.c_str()) == 0) {
+        } else if (strcmp(topic, mqtt_intopic) == 0) {
       #endif
     #endif
 
@@ -1007,7 +1007,7 @@ void checkForRequests() {
         mqtt_client.subscribe(mqtt_intopic, qossub);
         #ifdef ENABLE_HOMEASSISTANT
           ha_send_data.detach();
-          mqtt_client.subscribe(mqtt_ha_state_in.c_str(), qossub);
+          mqtt_client.subscribe(mqtt_ha_state_in, qossub);
           ha_send_data.once(5, tickerSendState);
           #ifdef MQTT_HOME_ASSISTANT_SUPPORT
             DynamicJsonDocument jsonBuffer(JSON_ARRAY_SIZE(strip->getModeCount()) + JSON_OBJECT_SIZE(12) + 1500);
@@ -1099,13 +1099,13 @@ void checkForRequests() {
       char * message = new char[18 + strlen(HOSTNAME) + 1];
       strcpy(message, "McLighting ready: ");
       strcat(message, HOSTNAME);
-      amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, message);
+      amqttClient.publish(mqtt_outtopic, qospub, false, message);
       //Subscribe
-      uint16_t packetIdSub1 = amqttClient.subscribe((char *)mqtt_intopic.c_str(), qossub);
+      uint16_t packetIdSub1 = amqttClient.subscribe((char *)mqtt_intopic, qossub);
       DBG_OUTPUT_PORT.printf("Subscribing at QoS %d, packetId: ", qossub); DBG_OUTPUT_PORT.println(packetIdSub1);
       #ifdef ENABLE_HOMEASSISTANT
         ha_send_data.detach();
-        uint16_t packetIdSub2 = amqttClient.subscribe((char *)mqtt_ha_state_in.c_str(), qossub);
+        uint16_t packetIdSub2 = amqttClient.subscribe((char *)mqtt_ha_state_in, qossub);
         DBG_OUTPUT_PORT.printf("Subscribing at QoS %d, packetId: ", qossub); DBG_OUTPUT_PORT.println(packetIdSub2);
         ha_send_data.once(5, tickerSendState);
         #ifdef MQTT_HOME_ASSISTANT_SUPPORT
@@ -1182,7 +1182,7 @@ void checkForRequests() {
         mqtt_client.publish(mqtt_outtopic, String("OK =static white").c_str());
       #endif
       #ifdef ENABLE_AMQTT
-        amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String("OK =static white").c_str());
+        amqttClient.publish(mqtt_outtopic, qospub, false, String("OK =static white").c_str());
       #endif
       #ifdef ENABLE_HOMEASSISTANT
         stateOn = true;
@@ -1198,7 +1198,7 @@ void checkForRequests() {
         mqtt_client.publish(mqtt_outtopic, String("OK =off").c_str());
       #endif
       #ifdef ENABLE_AMQTT
-        amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String("OK =off").c_str());
+        amqttClient.publish(mqtt_outtopic, qospub, false, String("OK =off").c_str());
       #endif
       #ifdef ENABLE_HOMEASSISTANT
         stateOn = false;
@@ -1218,7 +1218,7 @@ void checkForRequests() {
       mqtt_client.publish(mqtt_outtopic, String("OK =fire flicker").c_str());
     #endif
     #ifdef ENABLE_AMQTT
-      amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String("OK =fire flicker").c_str());
+      amqttClient.publish(mqtt_outtopic, qospub, false, String("OK =fire flicker").c_str());
     #endif
     #ifdef ENABLE_HOMEASSISTANT
       stateOn = true;
@@ -1237,7 +1237,7 @@ void checkForRequests() {
       mqtt_client.publish(mqtt_outtopic, String("OK =fireworks random").c_str());
     #endif
     #ifdef ENABLE_AMQTT
-      amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, String("OK =fireworks random").c_str());
+      amqttClient.publish(mqtt_outtopic, qospub, false, String("OK =fireworks random").c_str());
     #endif
     #ifdef ENABLE_HOMEASSISTANT
      stateOn = true;
@@ -1412,6 +1412,7 @@ bool readStateFS() {
         main_color.green = json["green"];
         main_color.blue = json["blue"];
 
+        if(mode != OFF) stateOn = true; 
         strip->setMode(ws2812fx_mode);
         strip->setSpeed(convertSpeed(ws2812fx_speed));
         strip->setBrightness(brightness);
@@ -1441,10 +1442,12 @@ bool readStateFS() {
 #endif
 
 //Strip Config
+char strip_size[3], led_pin[2]; //needed for WiFiManager Settings
+
 struct
 {
   uint16_t stripSize = NUMLEDS;
-  uint16_t RGBOrder = NEO_GRB;
+  uint8_t RGBOrder = NEO_GRB;
   #if defined(USE_WS2812FX_DMA) or defined(USE_WS2812FX_UART1) or defined(USE_WS2812FX_UART2)
     #ifdef USE_WS2812FX_DMA
       uint8_t pin = 3;
@@ -1456,7 +1459,7 @@ struct
       uint8_t pin = 1;
     #endif
   #else
-    uint8_t pin = PIN;
+    uint8_t pin = LED_PIN;
   #endif
 } WS2812FXStripSettings;
 
@@ -1504,7 +1507,7 @@ bool readStripConfigFS(void) {
 void writeStripConfigFS(void){
   updateFS = true;
   //save the strip config to FS JSON
-  DBG_OUTPUT_PORT.print("Saving cfg: ");
+  DBG_OUTPUT_PORT.print("Saving Strip cfg: ");
   DynamicJsonDocument jsonBuffer(JSON_OBJECT_SIZE(4)+300);
   JsonObject json = jsonBuffer.to<JsonObject>();
   json["pixel_pount"] = WS2812FXStripSettings.stripSize;
@@ -1519,6 +1522,7 @@ void writeStripConfigFS(void){
   }
   serializeJson(json, DBG_OUTPUT_PORT);
   serializeJson(json, configFile);
+  DBG_OUTPUT_PORT.println();
   configFile.close();
   updateFS = false;
   //end save
diff --git a/Arduino/McLighting/version_info.ino b/Arduino/McLighting/version_info.ino
index 61fbb9b..83917f4 100644
--- a/Arduino/McLighting/version_info.ino
+++ b/Arduino/McLighting/version_info.ino
@@ -74,4 +74,7 @@
  * - Bump PIO core to 2.0.1
  * - Send HA state on MQTT connect, address https://github.com/toblum/McLighting/issues/349
  * - Add LWT for MQTT and AMQTT, address https://github.com/toblum/McLighting/issues/340
+ * - Added file for custom WS2812FX animations in custom slots
+ * - Rename varaibles to be char instead of String
+ * - Added LED pixel count and PIN settings to WiFiManager
  */
diff --git a/platformio.ini b/platformio.ini
index cd6307f..b997fdb 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -8,7 +8,7 @@ description = The ESP8266 based multi-client lighting gadget
 # ------------------------------------------------------------------------------
 # PLATFORM:
 #   !! DO NOT confuse platformio's ESP8266 development platform with Arduino core for ESP8266
-#   We use Arduino Core 2.4.2 (platformIO 1.8.0) as default
+#   We use Arduino Core 2.5.0 (platformIO 2.0.1) as default
 #
 #   arduino core 2.3.0 = platformIO 1.5.0
 #   arduino core 2.4.0 = platformIO 1.6.0
@@ -45,7 +45,10 @@ lib_deps =
   WebSockets
   ESPAsyncE131
   ESPAsyncUDP
-  PubSubClient
+  ;PubSubClient ;neede for #define ENABLE_MQTT
+  ;FastLED      ;needed for #define CUSTOM_WS2812FX_ANIMATIONS
+targets_eum = erase, upload, monitor
+targets_um = upload, monitor
 
 [env:esp01_1m]
 board = esp01_1m
@@ -68,4 +71,5 @@ build_flags =
 monitor_speed = ${common.monitor_speed}
 upload_speed = ${common.upload_speed}
 upload_resetmethod = ${common.upload_resetmethod}
-lib_deps = ${common.lib_deps}
\ No newline at end of file
+lib_deps = ${common.lib_deps}
+; targets = ${common.targets_um}
\ No newline at end of file