From e25cc037b2d408b38247b3f85d6c011c1f7425a2 Mon Sep 17 00:00:00 2001 From: Will Tatam Date: Mon, 22 Apr 2024 20:36:55 +0100 Subject: [PATCH 1/7] Allow runtime config of MQTT server hostname --- platformio.ini | 5 ++--- src/User/UserModHA.h | 22 ++++++++++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/platformio.ini b/platformio.ini index e3b98f0b..52ae60ad 100644 --- a/platformio.ini +++ b/platformio.ini @@ -57,10 +57,9 @@ lib_deps = [STARMOD_USERMOD_HA] build_flags = -D STARMOD_USERMOD_HA + -D ARDUINOHA_DEBUG lib_deps = - https://github.com/dawidchyrzynski/arduino-home-assistant.git#2.0.0 - https://github.com/knolleary/pubsubclient.git#v2.8 - + https://github.com/dawidchyrzynski/arduino-home-assistant.git#2.1.0 [STARMOD_USERMOD_WLEDAUDIO] diff --git a/src/User/UserModHA.h b/src/User/UserModHA.h index 60d94394..897ce1dd 100644 --- a/src/User/UserModHA.h +++ b/src/User/UserModHA.h @@ -11,8 +11,6 @@ #include -#define BROKER_ADDR IPAddress(192,168,178,42) //ewowi: could we scan that instead of hard coded? - class UserModHA:public SysModule { public: @@ -21,25 +19,34 @@ class UserModHA:public SysModule { isEnabled = false; }; - void onStateCommand(bool state, HALight* sender) { + void setup() { + SysModule::setup(); + + parentVar = ui->initUserMod(parentVar, name, 6300); + + ui->initText(parentVar, "mqttAddr"); + } + + static void onStateCommand(bool state, HALight* sender) { ppf("State: %s\n", state?"true":"false"); sender->setState(state); // report state back to the Home Assistant } - void onBrightnessCommand(unsigned8 brightness, HALight* sender) { + static void onBrightnessCommand(unsigned8 brightness, HALight* sender) { ppf("Brightness: %s\n", brightness); sender->setBrightness(brightness); // report brightness back to the Home Assistant } - void onRGBColorCommand(HALight::RGBColor color, HALight* sender) { + static void onRGBColorCommand(HALight::RGBColor color, HALight* sender) { ppf("Red: %d Green: %d blue: %d\n", color.red, color.green, color.blue); sender->setRGBColor(color); // report color back to the Home Assistant } void connectedChanged() { + ppf("connectedChanged"); if (mdls->isConnected) { // set device's details (optional) device.setName(_INIT(TOSTRING(APP))); @@ -64,7 +71,10 @@ class UserModHA:public SysModule { light->onBrightnessCommand(onBrightnessCommand); // optional light->onRGBColorCommand(onRGBColorCommand); // optional - mqtt->begin(BROKER_ADDR); + String mqttAddr = mdl->getValue("mqttAddr"); + + ppf("mqtt->begin(%s)", mqttAddr.c_str()); + mqtt->begin(mqttAddr.c_str(), "", ""); } void loop() { From dddc7ab85eb7b858cc23a5a03dbb1f24b02e6877 Mon Sep 17 00:00:00 2001 From: Will Tatam Date: Mon, 22 Apr 2024 21:36:32 +0100 Subject: [PATCH 2/7] Connect to HA-MQTT using supplied ip --- src/User/UserModHA.h | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/User/UserModHA.h b/src/User/UserModHA.h index 897ce1dd..c8c4fad5 100644 --- a/src/User/UserModHA.h +++ b/src/User/UserModHA.h @@ -36,12 +36,18 @@ class UserModHA:public SysModule { static void onBrightnessCommand(unsigned8 brightness, HALight* sender) { ppf("Brightness: %s\n", brightness); + mdl->setValue("bri", brightness); + sender->setBrightness(brightness); // report brightness back to the Home Assistant } static void onRGBColorCommand(HALight::RGBColor color, HALight* sender) { ppf("Red: %d Green: %d blue: %d\n", color.red, color.green, color.blue); + mdl->setValue("Red", color.red); + mdl->setValue("Green", color.green); + mdl->setValue("Blue", color.blue); + sender->setRGBColor(color); // report color back to the Home Assistant } @@ -53,6 +59,9 @@ class UserModHA:public SysModule { device.setSoftwareVersion(_INIT(TOSTRING(VERSION))); } + byte mac[] = {0xF1, 0x10, 0xFA, 0x6E, 0x38, 0x4A}; // TODO + device.setUniqueId(mac, sizeof(mac)); + // configure light (optional) light->setName("LEDs"); @@ -68,18 +77,26 @@ class UserModHA:public SysModule { // handle light states light->onStateCommand(onStateCommand); - light->onBrightnessCommand(onBrightnessCommand); // optional - light->onRGBColorCommand(onRGBColorCommand); // optional + light->onBrightnessCommand(onBrightnessCommand); + light->onRGBColorCommand(onRGBColorCommand); String mqttAddr = mdl->getValue("mqttAddr"); - ppf("mqtt->begin(%s)", mqttAddr.c_str()); - mqtt->begin(mqttAddr.c_str(), "", ""); + ppf("mqtt->begin(%s)\n", mqttAddr.c_str()); + IPAddress ip; + if(ip.fromString(mqttAddr)) { + mqtt->begin(ip, "", ""); + } + else { + spf("Failed to parse %s to IP\n", mqtt.c_str()); + } + } void loop() { // SysModule::loop(); mqtt->loop(); + light->setCurrentBrightness(mdl->getValue("bri")); } private: From 04d647d292c287f760235ee29be79bae5c8392f7 Mon Sep 17 00:00:00 2001 From: Will Tatam Date: Mon, 22 Apr 2024 22:03:52 +0100 Subject: [PATCH 3/7] Connect to HA-MQTT using supplied ip --- src/User/UserModHA.h | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/User/UserModHA.h b/src/User/UserModHA.h index c8c4fad5..566563c5 100644 --- a/src/User/UserModHA.h +++ b/src/User/UserModHA.h @@ -30,11 +30,18 @@ class UserModHA:public SysModule { static void onStateCommand(bool state, HALight* sender) { ppf("State: %s\n", state?"true":"false"); + if(state) { + mdl->setValue("bri", 255); + } + else { + mdl->setValue("bri", 0); + } + sender->setState(state); // report state back to the Home Assistant } static void onBrightnessCommand(unsigned8 brightness, HALight* sender) { - ppf("Brightness: %s\n", brightness); + ppf("Brightness: %d\n", brightness); mdl->setValue("bri", brightness); @@ -48,6 +55,8 @@ class UserModHA:public SysModule { mdl->setValue("Green", color.green); mdl->setValue("Blue", color.blue); + mdl->setValue("fx", 0); // Solid + sender->setRGBColor(color); // report color back to the Home Assistant } @@ -88,7 +97,7 @@ class UserModHA:public SysModule { mqtt->begin(ip, "", ""); } else { - spf("Failed to parse %s to IP\n", mqtt.c_str()); + ppf("Failed to parse %s to IP\n", mqttAddr.c_str()); } } From db0dbd8c465e6b3e608c7f58ce25e89d6a1a2163 Mon Sep 17 00:00:00 2001 From: Will Tatam Date: Mon, 22 Apr 2024 23:35:08 +0100 Subject: [PATCH 4/7] on/off --- src/User/UserModHA.h | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/User/UserModHA.h b/src/User/UserModHA.h index 566563c5..d7d4f9ed 100644 --- a/src/User/UserModHA.h +++ b/src/User/UserModHA.h @@ -30,12 +30,7 @@ class UserModHA:public SysModule { static void onStateCommand(bool state, HALight* sender) { ppf("State: %s\n", state?"true":"false"); - if(state) { - mdl->setValue("bri", 255); - } - else { - mdl->setValue("bri", 0); - } + mdl->setValue("on", state); sender->setState(state); // report state back to the Home Assistant } @@ -61,7 +56,7 @@ class UserModHA:public SysModule { } void connectedChanged() { - ppf("connectedChanged"); + ppf("connectedChanged\n"); if (mdls->isConnected) { // set device's details (optional) device.setName(_INIT(TOSTRING(APP))); From 2c94bda009b5145a9a32f47d8e48c6cf77ea28a1 Mon Sep 17 00:00:00 2001 From: Will Tatam Date: Mon, 22 Apr 2024 23:36:52 +0100 Subject: [PATCH 5/7] on/off --- src/User/UserModHA.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/User/UserModHA.h b/src/User/UserModHA.h index d7d4f9ed..f97481e6 100644 --- a/src/User/UserModHA.h +++ b/src/User/UserModHA.h @@ -101,6 +101,7 @@ class UserModHA:public SysModule { // SysModule::loop(); mqtt->loop(); light->setCurrentBrightness(mdl->getValue("bri")); + light->setCurrentState(mdl->getValue("on")); } private: From 29d86ff5349dfa0674c286e7ea77e6e875ba3854 Mon Sep 17 00:00:00 2001 From: Will Tatam Date: Tue, 23 Apr 2024 20:07:19 +0100 Subject: [PATCH 6/7] Swap to UserModHA to basic template, suitable for StartMod(core) --- src/User/UserModHA.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/User/UserModHA.h b/src/User/UserModHA.h index f97481e6..64339822 100644 --- a/src/User/UserModHA.h +++ b/src/User/UserModHA.h @@ -69,6 +69,15 @@ class UserModHA:public SysModule { // configure light (optional) light->setName("LEDs"); + String options = "Solid"; + // for(int i = 0; i < eff->effects.effects.size(); i++) { + // options += ";"; + // options += eff->effects.effects.at(i)->name(); + // } + fxSelect->setOptions(options.c_str()); + + ppf("Options: %s\n", options.c_str()); + // Optionally you can set retain flag for the HA commands // light.setRetain(true); @@ -102,6 +111,8 @@ class UserModHA:public SysModule { mqtt->loop(); light->setCurrentBrightness(mdl->getValue("bri")); light->setCurrentState(mdl->getValue("on")); + int8_t fx = mdl->getValue("fx"); + fxSelect->setState(fx + 1); } private: @@ -109,6 +120,7 @@ class UserModHA:public SysModule { HADevice device; HAMqtt* mqtt = new HAMqtt(client, device); HALight* light = new HALight(_INIT(TOSTRING(APP)), HALight::BrightnessFeature | HALight::RGBFeature); + HASelect* fxSelect = new HASelect("fx"); }; extern UserModHA *hamod; \ No newline at end of file From e8962cf40b98c8dba86505a25034dec947ee3405 Mon Sep 17 00:00:00 2001 From: Will Tatam Date: Tue, 23 Apr 2024 21:45:10 +0100 Subject: [PATCH 7/7] Add sample sensor --- platformio.ini | 1 - src/User/UserModHA.h | 35 ++++++++++++++++++++++++++++------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/platformio.ini b/platformio.ini index 52ae60ad..471761de 100644 --- a/platformio.ini +++ b/platformio.ini @@ -61,7 +61,6 @@ build_flags = lib_deps = https://github.com/dawidchyrzynski/arduino-home-assistant.git#2.1.0 - [STARMOD_USERMOD_WLEDAUDIO] build_flags = -D STARMOD_USERMOD_WLEDAUDIO diff --git a/src/User/UserModHA.h b/src/User/UserModHA.h index 64339822..58ec6f4a 100644 --- a/src/User/UserModHA.h +++ b/src/User/UserModHA.h @@ -19,12 +19,14 @@ class UserModHA:public SysModule { isEnabled = false; }; - void setup() { + void setup() override { SysModule::setup(); parentVar = ui->initUserMod(parentVar, name, 6300); ui->initText(parentVar, "mqttAddr"); + ui->initText(parentVar, "mqttUser"); + ui->initText(parentVar, "mqttPass"); } static void onStateCommand(bool state, HALight* sender) { @@ -59,11 +61,12 @@ class UserModHA:public SysModule { ppf("connectedChanged\n"); if (mdls->isConnected) { // set device's details (optional) - device.setName(_INIT(TOSTRING(APP))); + device.setName(mdl->getValue("instance")); device.setSoftwareVersion(_INIT(TOSTRING(VERSION))); - } + } - byte mac[] = {0xF1, 0x10, 0xFA, 0x6E, 0x38, 0x4A}; // TODO + byte mac[6]; + WiFi.macAddress(mac); device.setUniqueId(mac, sizeof(mac)); // configure light (optional) @@ -94,11 +97,22 @@ class UserModHA:public SysModule { light->onRGBColorCommand(onRGBColorCommand); String mqttAddr = mdl->getValue("mqttAddr"); + String mqttUser = mdl->getValue("mqttUser"); + if(mqttUser == "null" || mqttUser == nullptr) mqttUser = ""; + String mqttPass = mdl->getValue("mqttPass"); + if(mqttPass == "null" || mqttPass == nullptr) mqttPass = ""; - ppf("mqtt->begin(%s)\n", mqttAddr.c_str()); IPAddress ip; if(ip.fromString(mqttAddr)) { - mqtt->begin(ip, "", ""); + if(mqttUser == "") { + ppf("mqtt->begin('%s')\n", mqttAddr.c_str()); + mqtt->begin(ip); + } + else { + ppf("WARNING - untested mqtt->begin('%s', '%s', pass)\n", mqttAddr.c_str(), mqttUser.c_str()); + mqtt->begin(ip, mqttUser.c_str(), mqttPass.c_str()); + } + started = true; } else { ppf("Failed to parse %s to IP\n", mqttAddr.c_str()); @@ -106,7 +120,7 @@ class UserModHA:public SysModule { } - void loop() { + void loop() override { // SysModule::loop(); mqtt->loop(); light->setCurrentBrightness(mdl->getValue("bri")); @@ -115,12 +129,19 @@ class UserModHA:public SysModule { fxSelect->setState(fx + 1); } + void loop10s() override { + if(!started) return; + testSensor->setValue((uint32_t) (millis() / 1000)); + } + private: WiFiClient client; HADevice device; HAMqtt* mqtt = new HAMqtt(client, device); HALight* light = new HALight(_INIT(TOSTRING(APP)), HALight::BrightnessFeature | HALight::RGBFeature); HASelect* fxSelect = new HASelect("fx"); + HASensorNumber* testSensor = new HASensorNumber("uptime"); + bool started = false; }; extern UserModHA *hamod; \ No newline at end of file