#include "DeviceLed.h" void DeviceLed::setLed(int red, int green, int blue) { analogWrite(pinRed, red); analogWrite(pinGreen, green); analogWrite(pinBlue, blue); } void DeviceLed::publishStatus() { DynamicJsonBuffer json_outBuffer; JsonObject& json_out = json_outBuffer.createObject(); json_out["red"] = led_red; json_out["green"] = led_green; json_out["blue"] = led_blue; String response; json_out.printTo(response); Serial.print("led state: "); Serial.println(response); Homie.setNodeProperty(ledNode, "color", response); } void DeviceLed::deviceSetup() { pinMode(pinRed, OUTPUT); pinMode(pinGreen, OUTPUT); pinMode(pinBlue, OUTPUT); setLed(led_red, led_green, led_blue); } bool DeviceLed::ledOnHandler(String value) { if (value == "true") { setLed(led_red, led_green, led_blue); Homie.setNodeProperty(ledNode, "on", "true"); Serial.println("led is on"); } else if (value == "false") { setLed(0, 0, 0); Homie.setNodeProperty(ledNode, "on", "false"); Serial.println("led is off"); } else { return false; } return true; } bool DeviceLed::ledColorHandler(String message) { DynamicJsonBuffer json_inBuffer; JsonObject& json_in = json_inBuffer.parseObject(message); if (json_in.success()) { if (json_in.containsKey("red")) { led_red = json_in["red"]; } if (json_in.containsKey("green")) { led_green = json_in["green"]; } if (json_in.containsKey("blue")) { led_blue = json_in["blue"]; } setLed(led_red, led_green, led_blue); } else { Serial.println("parsing of JSON failed"); } publishStatus(); return true; } bool DeviceLed::ledFadeHandler(String message) { DynamicJsonBuffer json_inBuffer; JsonObject& json_in = json_inBuffer.parseObject(message); if (json_in.success()) { fade_from_red = led_red; if (json_in.containsKey("red")) { fade_to_red = json_in["red"]; } else { fade_to_red = led_red; } fade_from_green = led_green; if (json_in.containsKey("green")) { fade_to_green = json_in["green"]; } else { fade_to_green = led_green; } fade_from_blue = led_blue; if (json_in.containsKey("blue")) { fade_to_blue = json_in["blue"]; } else { fade_to_blue = led_blue; } fade_start = millis(); if (json_in.containsKey("seconds")) { fade_end = fade_start + 1000 * (int)json_in["seconds"]; } else { fade_end = 0; } fading = true; } else { Serial.println("parsing of JSON failed"); } return true; } void DeviceLed::deviceRegister() { ledNode.subscribe("on", [this](String value) { return ledOnHandler(value); }); ledNode.subscribe("color", [this](String value) { return ledColorHandler(value); }); ledNode.subscribe("fade", [this](String value) { return ledFadeHandler(value); }); Homie.registerNode(ledNode); } void DeviceLed::deviceLoop() { if (fading) { if (fade_end > millis()) { float progress = 1.0 * (millis() - fade_start) / (fade_end - fade_start); if ((int)(progress * 100) != (int)(progress_last * 100)) { led_red = fade_from_red + (fade_to_red - fade_from_red) * progress; led_green = fade_from_green + (fade_to_green - fade_from_green) * progress; led_blue = fade_from_blue + (fade_to_blue - fade_from_blue) * progress; setLed(led_red, led_green, led_blue); progress_last = progress; } } else { led_red = fade_to_red; led_green = fade_to_green; led_blue = fade_to_blue; setLed(led_red, led_green, led_blue); publishStatus(); fading = false; } } return; }