diff --git a/Arduino/McLighting/McLighting.ino b/Arduino/McLighting/McLighting.ino index 1aa2223..b240938 100644 --- a/Arduino/McLighting/McLighting.ino +++ b/Arduino/McLighting/McLighting.ino @@ -70,8 +70,8 @@ ESP8266WebServer server(80); WebSocketsServer webSocket = WebSocketsServer(81); #ifdef HTTP_OTA - #include - ESP8266HTTPUpdateServer httpUpdater; +#include +ESP8266HTTPUpdateServer httpUpdater; #endif #ifdef USE_NEOANIMATIONFX @@ -100,11 +100,11 @@ NeoAnimationFX strip(neoStrip); #endif #ifdef USE_WS2812FX - // *************************************************************************** - // Load libraries / Instanciate WS2812FX library - // *************************************************************************** - // https://github.com/kitesurfer1404/WS2812FX - #include "WS2812FX.h" +// *************************************************************************** +// Load libraries / Instanciate WS2812FX library +// *************************************************************************** +// https://github.com/kitesurfer1404/WS2812FX +#include "WS2812FX.h" #ifdef RGBW WS2812FX strip = WS2812FX(NUMLEDS, PIN, NEO_GRBW + NEO_KHZ800); @@ -112,13 +112,13 @@ NeoAnimationFX strip(neoStrip); WS2812FX strip = WS2812FX(NUMLEDS, PIN, NEO_GRB + NEO_KHZ800); #endif - // Parameter 1 = number of pixels in strip - // Parameter 2 = Arduino pin number (most are valid) - // Parameter 3 = pixel type flags, add together as needed: - // NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) - // NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) - // NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products) - // NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2) +// Parameter 1 = number of pixels in strip +// Parameter 2 = Arduino pin number (most are valid) +// Parameter 3 = pixel type flags, add together as needed: +// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) +// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) +// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products) +// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2) // IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across // pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input @@ -348,6 +348,10 @@ DBG_OUTPUT_PORT.println("Starting...."); WiFi.setSleepMode(WIFI_NONE_SLEEP); + // Uncomment if you want to set static IP + // Order is: IP, Gateway and Subnet + //wifiManager.setSTAStaticIPConfig(IPAddress(192,168,0,128), IPAddress(192,168,0,1), IPAddress(255,255,255,0)); + //fetches ssid and pass and tries to connect //if it does not connect it starts an access point with the specified name //here "AutoConnectAP" @@ -516,18 +520,21 @@ DBG_OUTPUT_PORT.println("Starting...."); }, handleFileUpload); //get heap status, analog input value and all GPIO statuses in one json call server.on("/esp_status", HTTP_GET, []() { - //String json = "{"; - //json += "\"heap\":" + String(ESP.getFreeHeap()); - //// json += ", \"analog\":" + String(analogRead(A0)); - //// json += ", \"gpio\":" + String((uint32_t)(((GPI | GPO) & 0xFFFF) | ((GP16I & 0x01) << 16))); - //json += "}"; - - DynamicJsonBuffer jsonBuffer(JSON_OBJECT_SIZE(9)); - JsonObject& json = jsonBuffer.createObject(); + DynamicJsonDocument jsonBuffer; + JsonObject& json = jsonBuffer.to(); json["HOSTNAME"] = HOSTNAME; json["version"] = SKETCH_VERSION; json["heap"] = ESP.getFreeHeap(); + json["sketch_size"] = ESP.getSketchSize(); + json["free_sketch_space"] = ESP.getFreeSketchSpace(); + json["flash_chip_size"] = ESP.getFlashChipSize(); + json["flash_chip_real_size"] = ESP.getFlashChipRealSize(); + json["flash_chip_speed"] = ESP.getFlashChipSpeed(); + json["sdk_version"] = ESP.getSdkVersion(); + json["core_version"] = ESP.getCoreVersion(); + json["cpu_freq"] = ESP.getCpuFreqMHz(); + json["chip_id"] = ESP.getFlashChipId(); #ifndef USE_NEOANIMATIONFX json["animation_lib"] = "WS2812FX"; json["pin"] = PIN; @@ -542,22 +549,38 @@ DBG_OUTPUT_PORT.println("Starting...."); json["button_mode"] = "OFF"; #endif #ifdef ENABLE_AMQTT + json["amqtt"] = "ON"; + #endif + #ifdef ENABLE_MQTT json["mqtt"] = "ON"; - #else - json["mqtt"] = "OFF"; #endif #ifdef ENABLE_HOMEASSISTANT json["home_assistant"] = "ON"; #else json["home_assistant"] = "OFF"; #endif - //char buffer[json.measureLength() + 1]; - //json.printTo(buffer, sizeof(buffer)); + #ifdef ENABLE_LEGACY_ANIMATIONS + json["legacy_animations"] = "ON"; + #else + json["legacy_animations"] = "OFF"; + #endif + #ifdef HTTP_OTA + json["esp8266_http_updateserver"] = "ON"; + #endif + #ifdef ENABLE_OTA + json["arduino_ota"] = "ON"; + #endif + #ifdef ENABLE_STATE_SAVE_SPIFFS + json["state_save"] = "SPIFFS"; + #endif + #ifdef ENABLE_STATE_SAVE_EEPROM + json["state_save"] = "EEPROM"; + #endif + String json_str; - json.printTo(json_str); + serializeJson(json, json_str); server.sendHeader("Access-Control-Allow-Origin", "*"); server.send(200, "application/json", json_str); - //json_str = String(); }); diff --git a/Arduino/McLighting/request_handlers.h b/Arduino/McLighting/request_handlers.h index 76c8bcf..74f0962 100644 --- a/Arduino/McLighting/request_handlers.h +++ b/Arduino/McLighting/request_handlers.h @@ -97,10 +97,6 @@ void handleSetAllMode(uint8_t * mypayload) { main_color.green = ((rgb >> 8) & 0xFF); main_color.blue = ((rgb ) & 0xFF); -// for (int i = 0; i < strip.numPixels(); i++) { -// strip.setPixelColor(i, main_color.red, main_color.green, main_color.blue, main_color.white); -// } -// strip.show(); DBG_OUTPUT_PORT.printf("WS: Set all leds to main color: W: [%u] R: [%u] G: [%u] B: [%u]\n", main_color.white, main_color.red, main_color.green, main_color.blue); #ifdef ENABLE_LEGACY_ANIMATIONS exit_func = true; @@ -296,18 +292,11 @@ void handleSetWS2812FXMode(uint8_t * mypayload) { } String listStatusJSON(void) { - //char json[255]; - //char modeName[30]; uint8_t tmp_mode = (mode == SET_MODE) ? (uint8_t) ws2812fx_mode : strip.getMode(); - //strncpy_P(modeName, (PGM_P)strip.getModeName(tmp_mode), sizeof(modeName)); // copy from progmem - - //snprintf(json, sizeof(json), "{\"mode\":%d, \"ws2812fx_mode\":%d, \"ws2812fx_mode_name\":\"%s\", \"speed\":%d, \"brightness\":%d, \"color\":[%d, %d, %d]}", - // mode, tmp_mode, modeName, ws2812fx_speed, brightness, main_color.red, main_color.green, main_color.blue); - const size_t bufferSize = JSON_ARRAY_SIZE(3) + JSON_OBJECT_SIZE(6); - DynamicJsonBuffer jsonBuffer(bufferSize); - JsonObject& root = jsonBuffer.createObject(); + DynamicJsonDocument jsonBuffer(bufferSize); + JsonObject& root = jsonBuffer.to(); root["mode"] = (uint8_t) mode; root["ws2812fx_mode"] = tmp_mode; root["ws2812fx_mode_name"] = strip.getModeName(tmp_mode); @@ -319,11 +308,8 @@ String listStatusJSON(void) { color.add(main_color.green); color.add(main_color.blue); -// char* json = (char*) malloc(root.measureLength() + 1); -// root.printTo(json, sizeof(json)); - String json; - root.printTo(json); + serializeJson(root, json); return json; } @@ -334,20 +320,9 @@ void getStatusJSON() { } String listModesJSON(void) { -// String modes = "["; -// for (uint8_t i = 0; i < strip.getModeCount(); i++) { -// modes += "{\"mode\":"; -// modes += i; -// modes += ", \"name\":\""; -// modes += strip.getModeName(i); -// modes += "\"},"; -// } -// modes += "{}]"; -// return modes; - const size_t bufferSize = JSON_ARRAY_SIZE(strip.getModeCount()+1) + strip.getModeCount()*JSON_OBJECT_SIZE(2); - DynamicJsonBuffer jsonBuffer(bufferSize); - JsonArray& json = jsonBuffer.createArray(); + DynamicJsonDocument jsonBuffer(bufferSize); + JsonArray& json = jsonBuffer.to(); for (uint8_t i = 0; i < strip.getModeCount(); i++) { JsonObject& object = json.createNestedObject(); object["mode"] = i; @@ -356,7 +331,7 @@ String listModesJSON(void) { JsonObject& object = json.createNestedObject(); String json_str; - json.printTo(json_str); + serializeJson(json, json_str); return json_str; } @@ -372,7 +347,7 @@ void handleMinimalUpload() { char temp[1500]; snprintf ( temp, 1500, - "\ + "\ \ \ ESP8266 Upload\ @@ -470,7 +445,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) { if (payload[0] == '?') { uint8_t d = (uint8_t) strtol((const char *) &payload[1], NULL, 10); ws2812fx_speed = constrain(d, 0, 255); - strip.setSpeed(convertSpeed(ws2812fx_speed)); + mode = SETSPEED; Dbg_Prefix(mqtt, num); DBG_OUTPUT_PORT.printf("Set speed to: [%u]\n", ws2812fx_speed); #ifdef ENABLE_HOMEASSISTANT @@ -488,7 +463,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) { if (payload[0] == '%') { uint8_t b = (uint8_t) strtol((const char *) &payload[1], NULL, 10); brightness = constrain(b, 0, 255); - strip.setBrightness(brightness); + mode = BRIGHTNESS; Dbg_Prefix(mqtt, num); DBG_OUTPUT_PORT.printf("Set brightness to: [%u]\n", brightness); #ifdef ENABLE_MQTT @@ -593,41 +568,51 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) { // $ ==> Get status Info. if (payload[0] == '$') { String json = listStatusJSON(); - Dbg_Prefix(mqtt, num); + if (mqtt == true) { + DBG_OUTPUT_PORT.print("MQTT: "); + #ifdef ENABLE_MQTT + mqtt_client.publish(mqtt_outtopic, json.c_str()); + #endif + #ifdef ENABLE_AMQTT + amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, json.c_str()); + #endif + } else { + DBG_OUTPUT_PORT.print("WS: "); + webSocket.sendTXT(num, "OK"); + webSocket.sendTXT(num, json); + } DBG_OUTPUT_PORT.println("Get status info: " + json); - webSocket.sendTXT(num, json); - #ifdef ENABLE_MQTT - mqtt_client.publish(mqtt_outtopic, listStatusJSON()); - #endif - #ifdef ENABLE_AMQTT - String liststat = (String) listStatusJSON(); - amqttClient.publish(mqtt_outtopic.c_str(), qospub, false, liststat.c_str()); - #endif } // ~ ==> Get WS2812 modes. if (payload[0] == '~') { String json = listModesJSON(); - Dbg_Prefix(mqtt, num); + if (mqtt == true) { + DBG_OUTPUT_PORT.print("MQTT: "); + #ifdef ENABLE_MQTT + // TODO: Fix this, doesn't return anything. Too long? + // Hint: https://github.com/knolleary/pubsubclient/issues/110 + DBG_OUTPUT_PORT.printf("Error: Not implemented. Message too large for pubsubclient."); + mqtt_client.publish(mqtt_outtopic, "ERROR: Not implemented. Message too large for pubsubclient."); + //String json_modes = listModesJSON(); + //DBG_OUTPUT_PORT.printf(json_modes.c_str()); + + //int res = mqtt_client.publish(mqtt_outtopic, json_modes.c_str(), json_modes.length()); + //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()); + #endif + } else { + DBG_OUTPUT_PORT.print("WS: "); + webSocket.sendTXT(num, "OK"); + webSocket.sendTXT(num, json); + } DBG_OUTPUT_PORT.println("Get WS2812 modes."); DBG_OUTPUT_PORT.println(json); - #ifdef ENABLE_MQTT - DBG_OUTPUT_PORT.printf("Error: Not implemented. Message too large for pubsubclient."); - mqtt_client.publish(mqtt_outtopic, "ERROR: Not implemented. Message too large for pubsubclient."); - //String json_modes = listModesJSON(); - //DBG_OUTPUT_PORT.printf(json_modes.c_str()); - - //int res = mqtt_client.publish(mqtt_outtopic, json_modes.c_str(), json_modes.length()); - //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()); - #endif } // / ==> Set WS2812 mode. - // TODO: Fix this, doesn't return anything. Too long? - // Hint: https://github.com/knolleary/pubsubclient/issues/110 if (payload[0] == '/') { handleSetWS2812FXMode(payload); Dbg_Prefix(mqtt, num); @@ -648,7 +633,6 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) { } } - // *************************************************************************** // WS request handlers // *************************************************************************** @@ -764,9 +748,8 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght void sendState() { const size_t bufferSize = JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6); - //StaticJsonBuffer jsonBuffer; - DynamicJsonBuffer jsonBuffer(bufferSize); - JsonObject& root = jsonBuffer.createObject(); + DynamicJsonDocument jsonBuffer(bufferSize); + JsonObject& root = jsonBuffer.to(); root["state"] = (stateOn) ? on_cmd : off_cmd; JsonObject& color = root.createNestedObject("color"); @@ -784,8 +767,8 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght strncpy_P(modeName, (PGM_P)strip.getModeName(strip.getMode()), sizeof(modeName)); // copy from progmem root["effect"] = modeName; - char buffer[root.measureLength() + 1]; - root.printTo(buffer, sizeof(buffer)); + char buffer[measureJson(root) + 1]; + serializeJson(root, buffer, sizeof(buffer)); #ifdef ENABLE_MQTT mqtt_client.publish(mqtt_ha_state_out.c_str(), buffer, true); @@ -802,16 +785,16 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght bool processJson(char* message) { const size_t bufferSize = JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(5) + 150; - //StaticJsonBuffer jsonBuffer; - DynamicJsonBuffer jsonBuffer(bufferSize); - JsonObject& root = jsonBuffer.parseObject(message); - - if (!root.success()) { - DBG_OUTPUT_PORT.println("parseObject() failed"); + DynamicJsonDocument jsonBuffer(bufferSize); + DeserializationError error = deserializeJson(jsonBuffer, message); + if (error) { + DBG_OUTPUT_PORT.print("parseObject() failed: "); + DBG_OUTPUT_PORT.println(error.c_str()); return false; } //DBG_OUTPUT_PORT.println("JSON ParseObject() done!"); - + JsonObject& root = jsonBuffer.as(); + if (root.containsKey("state")) { const char* state_in = root["state"]; if (strcmp(state_in, on_cmd) == 0 and !(animation_on)) { @@ -860,7 +843,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght if (root.containsKey("effect")) { animation_on = true; - String effectString = root["effect"].asString(); + String effectString = root["effect"].as(); for (uint8_t i = 0; i < strip.getModeCount(); i++) { if(String(strip.getModeName(i)) == effectString) { @@ -937,8 +920,8 @@ 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.c_str(), qossub); #ifdef MQTT_HOME_ASSISTANT_SUPPORT - DynamicJsonBuffer jsonBuffer(JSON_ARRAY_SIZE(strip.getModeCount()) + JSON_OBJECT_SIZE(11)); - JsonObject& json = jsonBuffer.createObject(); + DynamicJsonDocument jsonBuffer(JSON_ARRAY_SIZE(strip.getModeCount()) + JSON_OBJECT_SIZE(11)); + JsonObject& json = jsonBuffer.to(); json["name"] = HOSTNAME; json["platform"] = "mqtt_json"; json["state_topic"] = mqtt_ha_state_out; @@ -953,8 +936,8 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght for (uint8_t i = 0; i < strip.getModeCount(); i++) { effect_list.add(strip.getModeName(i)); } - char buffer[json.measureLength() + 1]; - json.printTo(buffer, sizeof(buffer)); + char buffer[json.measureJson() + 1]; + serializeJson(json, buffer, sizeof(buffer)); mqtt_client.publish(String("homeassistant/light/" + String(HOSTNAME) + "/config").c_str(), buffer, true); #endif #endif @@ -1017,8 +1000,8 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght uint16_t packetIdSub2 = amqttClient.subscribe((char *)mqtt_ha_state_in.c_str(), qossub); DBG_OUTPUT_PORT.printf("Subscribing at QoS %d, packetId: ", qossub); DBG_OUTPUT_PORT.println(packetIdSub2); #ifdef MQTT_HOME_ASSISTANT_SUPPORT - DynamicJsonBuffer jsonBuffer(JSON_ARRAY_SIZE(strip.getModeCount()) + JSON_OBJECT_SIZE(11)); - JsonObject& json = jsonBuffer.createObject(); + DynamicJsonDocument jsonBuffer(JSON_ARRAY_SIZE(strip.getModeCount()) + JSON_OBJECT_SIZE(11)); + JsonObject& json = jsonBuffer.to(); json["name"] = HOSTNAME; json["platform"] = "mqtt_json"; json["state_topic"] = mqtt_ha_state_out; @@ -1033,8 +1016,8 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght for (uint8_t i = 0; i < strip.getModeCount(); i++) { effect_list.add(strip.getModeName(i)); } - char buffer[json.measureLength() + 1]; - json.printTo(buffer, sizeof(buffer)); + char buffer[json.measureJson() + 1]; + serializeJson(json, buffer, sizeof(buffer)); DBG_OUTPUT_PORT.println(buffer); amqttClient.publish(String("homeassistant/light/" + String(HOSTNAME) + "/config").c_str(), qospub, true, buffer); #endif @@ -1258,9 +1241,8 @@ bool writeConfigFS(bool saveConfig){ //FS save updateFS = true; DBG_OUTPUT_PORT.print("Saving config: "); - DynamicJsonBuffer jsonBuffer(JSON_OBJECT_SIZE(4)); -// StaticJsonBuffer jsonBuffer; - JsonObject& json = jsonBuffer.createObject(); + DynamicJsonDocument jsonBuffer(JSON_OBJECT_SIZE(4)); + JsonObject& json = jsonBuffer.to(); json["mqtt_host"] = mqtt_host; json["mqtt_port"] = mqtt_port; json["mqtt_user"] = mqtt_user; @@ -1270,8 +1252,8 @@ bool writeConfigFS(bool saveConfig){ File configFile = SPIFFS.open("/config.json", "w"); if (!configFile) DBG_OUTPUT_PORT.println("failed to open config file for writing"); - json.printTo(DBG_OUTPUT_PORT); - json.printTo(configFile); + serializeJson(json, DBG_OUTPUT_PORT); + serializeJson(json, configFile); configFile.close(); updateFS = false; return true; @@ -1295,13 +1277,13 @@ bool readConfigFS() { size_t size = configFile.size(); std::unique_ptr buf(new char[size]); configFile.readBytes(buf.get(), size); - DynamicJsonBuffer jsonBuffer(JSON_OBJECT_SIZE(4)+300); -// StaticJsonBuffer jsonBuffer; - JsonObject& json = jsonBuffer.parseObject(buf.get()); + DynamicJsonDocument jsonBuffer(JSON_OBJECT_SIZE(4)+300); + DeserializationError error = deserializeJson(jsonBuffer, buf.get()); DBG_OUTPUT_PORT.print("Config: "); - json.printTo(DBG_OUTPUT_PORT); - if (json.success()) { + if (!error) { DBG_OUTPUT_PORT.println(" Parsed!"); + JsonObject& json = jsonBuffer.as(); + serializeJson(json, DBG_OUTPUT_PORT); strcpy(mqtt_host, json["mqtt_host"]); strcpy(mqtt_port, json["mqtt_port"]); strcpy(mqtt_user, json["mqtt_user"]); @@ -1309,7 +1291,8 @@ bool readConfigFS() { updateFS = false; return true; } else { - DBG_OUTPUT_PORT.println("Failed to load json config"); + DBG_OUTPUT_PORT.print("Failed to load json config: "); + DBG_OUTPUT_PORT.println(error.c_str()); } } else { DBG_OUTPUT_PORT.println("Failed to open /config.json"); @@ -1327,9 +1310,8 @@ bool writeStateFS(){ updateFS = true; //save the strip state to FS JSON DBG_OUTPUT_PORT.print("Saving cfg: "); - DynamicJsonBuffer jsonBuffer(JSON_OBJECT_SIZE(7)); -// StaticJsonBuffer jsonBuffer; - JsonObject& json = jsonBuffer.createObject(); + DynamicJsonDocument jsonBuffer(JSON_OBJECT_SIZE(7)); + JsonObject& json = jsonBuffer.to(); json["mode"] = static_cast(mode); json["strip_mode"] = (int) strip.getMode(); json["brightness"] = brightness; @@ -1348,8 +1330,8 @@ bool writeStateFS(){ updateStateFS = false; return false; } - json.printTo(DBG_OUTPUT_PORT); - json.printTo(configFile); + serializeJson(json, DBG_OUTPUT_PORT); + serializeJson(json, configFile); configFile.close(); updateFS = false; spiffs_save_state.detach(); @@ -1371,11 +1353,11 @@ bool readStateFS() { // Allocate a buffer to store contents of the file. std::unique_ptr buf(new char[size]); configFile.readBytes(buf.get(), size); - DynamicJsonBuffer jsonBuffer(JSON_OBJECT_SIZE(7)+200); -// StaticJsonBuffer jsonBuffer; - JsonObject& json = jsonBuffer.parseObject(buf.get()); - json.printTo(DBG_OUTPUT_PORT); - if (json.success()) { + DynamicJsonDocument jsonBuffer(JSON_OBJECT_SIZE(7)+200); + DeserializationError error = deserializeJson(jsonBuffer, buf.get()); + if (!error) { + JsonObject& json = jsonBuffer.as(); + serializeJson(json, DBG_OUTPUT_PORT); mode = static_cast((int) json["mode"]); ws2812fx_mode = json["strip_mode"]; brightness = json["brightness"]; @@ -1399,7 +1381,7 @@ bool readStateFS() { DBG_OUTPUT_PORT.println("Failed to open \"/stripstate.json\""); } } else { - DBG_OUTPUT_PORT.println("Coudnt find \"/stripstate.json\""); + DBG_OUTPUT_PORT.println("Couldn't find \"/stripstate.json\""); } //end read updateFS = false; diff --git a/Arduino/McLighting/version.h b/Arduino/McLighting/version.h index db35e16..78f074b 100644 --- a/Arduino/McLighting/version.h +++ b/Arduino/McLighting/version.h @@ -1 +1 @@ -#define SKETCH_VERSION "2.1.1" +#define SKETCH_VERSION "2.1.2" diff --git a/Arduino/McLighting/version_info.ino b/Arduino/McLighting/version_info.ino index f381e99..bafde4f 100644 --- a/Arduino/McLighting/version_info.ino +++ b/Arduino/McLighting/version_info.ino @@ -6,4 +6,9 @@ * 11 May 2018 v 2.1.1 * - Use ArduinoJSON to send JSON replies * - Add strip.trigger() - */ + * + * 17 Jun 2018 v 2.1.2 + * - Upgrade to ArduinoJSON 6.xx from ArduinoJSON 5.xx + * - Added example for static IP + * - Added more internal variables to /esp_status + */ diff --git a/README.md b/README.md index 7ac6a4a..7851c69 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,9 @@ [![Demo video Apple Homekit integration](https://j.gifs.com/gJP2o6.gif)](https://youtu.be/4JnGXZaPnrw) ___ +Update 13.05.2018: +I've worked on a new web UI for the last weeks. It's now available as an early preview. There is a [video](https://youtu.be/lryDPMA2qpY) that shows the new features. [Try it out](https://github.com/toblum/McLightingUI) if you want and leave some feedback. + Update 07.04.2018: And even more changes to McLighting! Most of them were contributed by user @debsahu. Thank you! - Update arduino-esp8266 to latest, at least version 2.4.1 @@ -130,7 +133,7 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so ## Todos - [x] MQTT support - [ ] Support multiple strips and control them separately or together [Issue](https://github.com/toblum/McLighting/issues/118) -- [ ] Save favourite effects? [Issue](https://github.com/toblum/McLighting/issues/35) +- [x] Save favourite effects? [Issue](https://github.com/toblum/McLighting/issues/35) - [ ] Make number of pixels, MQTT and PIN configurable via front end [Issue](https://github.com/toblum/McLighting/issues/93) and [Issue](https://github.com/toblum/McLighting/issues/101) - [x] OTA update [Issue](https://github.com/toblum/McLighting/issues/93) - [ ] Bundle webpages instead of SPIFFS [Issue](https://github.com/toblum/McLighting/issues/93) @@ -149,6 +152,7 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so - [ ] If no wifi, at least enable button mode. - [ ] Also enable McLighting in Wifi AP mode. - [x] Make a set of NodeRed nodes. +- [ ] IR remote support [issue](https://github.com/toblum/McLightingUI/issues/3) - [ ] Multiple buttons/GPIO Inputs. [Issue](https://github.com/toblum/McLighting/issues/119) - [ ] Music visualizer / Bring back ArtNet [Issue](https://github.com/toblum/McLighting/issues/111) - [ ] Display version and parameters (Number of LEDs, definition settings, ..) in the web UI [Issue](https://github.com/toblum/McLighting/issues/150) diff --git a/documentation/pcb/Gerber.zip b/documentation/pcb/Gerber.zip new file mode 100644 index 0000000..4521134 Binary files /dev/null and b/documentation/pcb/Gerber.zip differ diff --git a/documentation/pcb/PCB_Schematic.pdf b/documentation/pcb/PCB_Schematic.pdf new file mode 100644 index 0000000..6bc6a48 Binary files /dev/null and b/documentation/pcb/PCB_Schematic.pdf differ diff --git a/documentation/pcb/Photo View.svg b/documentation/pcb/Photo View.svg new file mode 100644 index 0000000..a1ebda3 --- /dev/null +++ b/documentation/pcb/Photo View.svg @@ -0,0 +1,10 @@ +Photo View + \ No newline at end of file