diff --git a/.github/workflows/platformio.yml b/.github/workflows/platformio.yml index 1237e37..0b60766 100644 --- a/.github/workflows/platformio.yml +++ b/.github/workflows/platformio.yml @@ -27,8 +27,9 @@ jobs: bash ./.github/post-build.sh - name: Release - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 if: startsWith(github.ref, 'refs/tags/') with: files: | ./artifacts/*.zip + generate_release_notes: true diff --git a/.gitignore b/.gitignore index 04fb403..96fb9ec 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,12 @@ cmake-build-debug CMakeFiles .idea artifacts +managed_components +.dummy +CMakeLists.txt +sdkconfig.* +!sdkconfig.esp32 +dependencies.lock # Clion diff --git a/examples/color-light/color-fx.h b/examples/color-light/color-fx.h index 3a600ab..40e75f3 100644 --- a/examples/color-light/color-fx.h +++ b/examples/color-light/color-fx.h @@ -1,5 +1,5 @@ /* - * HomeGenie-Mini (c) 2018-2024 G-Labs + * HomeGenie-Mini (c) 2018-2025 G-Labs * * * This file is part of HomeGenie-Mini (HGM). @@ -63,7 +63,7 @@ float currentSaturation; float cursorDirection = 1; unsigned long rainbow_refresh_ts = 0; void fx_rainbow(Adafruit_NeoPixel* pixels, LightColor& color, float iterations = 1) { - if (pixels == nullptr) return; + if (pixels == nullptr || millis() - rainbow_refresh_ts <= 100) return; uint numPixels = pixels->numPixels(); currentSaturation = color.getSaturation(); @@ -71,29 +71,24 @@ void fx_rainbow(Adafruit_NeoPixel* pixels, LightColor& color, float iterations = float hueStep = 1.0f / (float) length * iterations; - // animate - if (millis() - rainbow_refresh_ts > 100) { - rainbow_refresh_ts = millis(); - - float v = color.getValue(); - for (int i = 0; i < numPixels; i++) { - float inc = (i < numPixels / iterations ? (float)i : (float)(numPixels - i)) * hueStep; - float h = FX_DEG_NORM((color.getHue() + hueOffset) + inc); - animatedColors[i]->setColor(h, currentSaturation, v, currentSaturation * 100); - } + float v = color.getValue(); + for (int i = 0; i < numPixels; i++) { + float inc = (i < numPixels / iterations ? (float)i : (float)(numPixels - i)) * hueStep; + float h = FX_DEG_NORM((color.getHue() + hueOffset) + inc); + animatedColors[i]->setColor(h, currentSaturation, v, currentSaturation * 100); + } - // animate - hueOffset += hueStep; - if (hueOffset > 1) FX_DEG_NORM(hueOffset); - hueZoom += (0.05f * (float)cursorDirection); - if (hueZoom > 3) { - cursorDirection = -1; - } else if (hueZoom < 1) { - cursorDirection = 1; - hueZoom = 1; - } + hueOffset += hueStep; + if (hueOffset > 1) FX_DEG_NORM(hueOffset); + hueZoom += (0.05f * (float)cursorDirection); + if (hueZoom > 3) { + cursorDirection = -1; + } else if (hueZoom < 1) { + cursorDirection = 1; + hueZoom = 1; } + rainbow_refresh_ts = millis(); } @@ -105,42 +100,37 @@ float stripe_cycle = 0; float stripe_previous_hue; void fx_white_stripes(Adafruit_NeoPixel* pixels, LightColor& color, bool brightWhite = false) { - if (pixels == nullptr) return; + if (pixels == nullptr || millis() - stripe_refresh_ts <= stripe_delay) return; uint numPixels = pixels->numPixels(); int stripe_length = (int)round((float)numPixels / 5.0f); float shift; - // animate - if (millis() - stripe_refresh_ts > stripe_delay) { + if (stripe_length <= stripe_step) stripe_length = stripe_step * 2; - //shift = shift % stripe_length; + stripe_cycle += /*color.getValue() * */ ((float)stripe_length / (float)50); + if (stripe_cycle >= stripe_length) stripe_cycle = 0; - stripe_cycle += /*color.getValue() * */ ((float)stripe_length / (float)50); - if (stripe_cycle >= stripe_length) stripe_cycle = 0; + shift = ((float)stripe_length) + (stripe_cycle * cursorDirection); - shift = ((float)stripe_length) + (stripe_cycle * cursorDirection); + cursorDirection = (color.getHue() - stripe_previous_hue > 0) ? 1 : -1; + stripe_previous_hue = color.getHue(); - cursorDirection = (color.getHue() - stripe_previous_hue > 0) ? 1 : -1; - stripe_previous_hue = color.getHue(); - - for (int i = 0; i < numPixels; i++) { - float v = color.getValue(); - float s = color.getSaturation(); - if ((int)round(i + shift) % stripe_length < stripe_step) { - // draw stripe - animatedColors[i]->setColor(0, 0, brightWhite && v > 0 ? 1 : v, - (float)stripe_transition / numPixels); - } else { - // draw solid color - animatedColors[i]->setColor(color.getHue(), s, v, - (float)stripe_transition * v); - } + for (int i = 0; i < numPixels; i++) { + float v = color.getValue(); + float s = color.getSaturation(); + if ((int)round(i + shift) % stripe_length < stripe_step) { + // draw stripe + animatedColors[i]->setColor(0, 0, brightWhite && v > 0 ? 1 : v, + (float)stripe_transition / numPixels); + } else { + // draw solid color + animatedColors[i]->setColor(color.getHue(), s, v, + (float)stripe_transition * v); } - - stripe_refresh_ts = millis(); } + stripe_refresh_ts = millis(); } @@ -148,21 +138,17 @@ unsigned long kaleidoscope_refresh_ts = 0; int kaleidoscope_delay = 500; void fx_kaleidoscope(Adafruit_NeoPixel* pixels, LightColor& color) { - if (pixels == nullptr) return; + if (pixels == nullptr || millis() - kaleidoscope_refresh_ts <= kaleidoscope_delay) return; - // animate - if (millis() - kaleidoscope_refresh_ts > kaleidoscope_delay) { - for (int i = 0; i < pixels->numPixels(); i++) { - float rnd1 = random(1000); - float rnd2 = random(1000); - if ((int)rnd1 % 2 == 0) { - animatedColors[i]->setColor(color.getHue(), color.getSaturation(), color.getValue(), 300); - } else { - animatedColors[i]->setColor(rnd1 / 1000, rnd2 / 1000, color.getValue(), 500); - } + for (int i = 0; i < pixels->numPixels(); i++) { + float rnd1 = random(1000); + float rnd2 = random(1000); + if ((int)rnd1 % 2 == 0) { + animatedColors[i]->setColor(color.getHue(), color.getSaturation(), color.getValue(), 300); + } else { + animatedColors[i]->setColor(rnd1 / 1000, rnd2 / 1000, color.getValue(), 500); } - - kaleidoscope_refresh_ts = millis(); } + kaleidoscope_refresh_ts = millis(); } diff --git a/examples/color-light/color-light.cpp b/examples/color-light/color-light.cpp index ad5a9bc..76a19c7 100644 --- a/examples/color-light/color-light.cpp +++ b/examples/color-light/color-light.cpp @@ -1,5 +1,5 @@ /* - * HomeGenie-Mini (c) 2018-2024 G-Labs + * HomeGenie-Mini (c) 2018-2025 G-Labs * * * This file is part of HomeGenie-Mini (HGM). @@ -57,16 +57,7 @@ void setup() { mpMaxPower = new ModuleParameter("LED.power", "25"); miniModule->properties.add(mpMaxPower); - // Get status LED config - auto pin = Config::getSetting("stld-pin"); - int statusLedPin = pin.isEmpty() ? -1 : pin.toInt(); - if (statusLedPin >= 0) { - int statusLedType = Config::getSetting("stld-typ", "82").toInt(); - int statusLedSpeed = Config::getSetting("stld-spd", "0").toInt(); - statusLED = new Adafruit_NeoPixel(1, statusLedPin, statusLedType + statusLedSpeed); - statusLED->setPixelColor(0, 0, 0, 0); - statusLED->begin(); - } + colorLight = statusLedSetup(); isConfigured = Config::isDeviceConfigured(); if (!isConfigured) { @@ -94,10 +85,6 @@ void setup() { mpMaxPower->value = String(maxPower); // Setup main LEDs control module - colorLight = new ColorLight(IO::IOEventDomains::HomeAutomation_HomeGenie, COLOR_LIGHT_ADDRESS, "Color Light"); - colorLight->module->setProperty("Widget.Implements.Scheduling", "1"); - colorLight->module->setProperty("Widget.Implements.Scheduling.ModuleEvents", "1"); - colorLight->module->setProperty("Widget.Preference.AudioLight", "true"); colorLight->onSetColor([](LightColor color) { currentColor = color; fx_reset(pixels, color); @@ -148,9 +135,6 @@ void loop() { homeGenie->loop(); - // Custom status led (builtin NeoPixel RGB LED) - statusLedLoop(); - if (isConfigured) { if (millis() - lastRefreshTs > refreshMs) @@ -246,4 +230,9 @@ void loop() } } + +#ifdef BOARD_HAS_RGB_LED + // Custom status led (builtin NeoPixel RGB LED) + statusLedLoop(); +#endif } diff --git a/examples/color-light/status-led.h b/examples/color-light/status-led.h index 4784616..791e54d 100644 --- a/examples/color-light/status-led.h +++ b/examples/color-light/status-led.h @@ -1,5 +1,5 @@ /* - * HomeGenie-Mini (c) 2018-2024 G-Labs + * HomeGenie-Mini (c) 2018-2025 G-Labs * * * This file is part of HomeGenie-Mini (HGM). @@ -23,16 +23,29 @@ * */ +#ifndef HOMEGENIE_MINI_STATUS_LED_H_ +#define HOMEGENIE_MINI_STATUS_LED_H_ + +#include +#include + #include #define COLOR_LIGHT_ADDRESS "C1" +using namespace Service::API::devices; + // Optional RGB Status LED Adafruit_NeoPixel* statusLED = nullptr; bool _statusLedWifiConnected = true; +// Blinks only first 20 seconds right after boot +unsigned long helloWorldDuration = 20000; +bool helloWorldActive = true; + // Status LED Blink callback used if statusLED is enabled void statusLedCallback(bool isLedOn) { + if (statusLED == nullptr) return; if (isLedOn) { statusLED->setPixelColor(0, Adafruit_NeoPixel::Color(1, 1, 0)); } else { @@ -41,13 +54,47 @@ void statusLedCallback(bool isLedOn) { statusLED->show(); } +ColorLight* statusLedSetup() { + +#ifdef BOARD_HAS_RGB_LED + // Get status LED config + auto pin = Config::getSetting("stld-pin"); + int statusLedPin = pin.isEmpty() ? -1 : pin.toInt(); + if (statusLedPin >= 0) { + int statusLedType = Config::getSetting("stld-typ", "82").toInt(); + int statusLedSpeed = Config::getSetting("stld-spd", "0").toInt(); + statusLED = new Adafruit_NeoPixel(1, statusLedPin, statusLedType + statusLedSpeed); + statusLED->setPixelColor(0, 0, 0, 0); + statusLED->begin(); + Config::statusLedCallback(&statusLedCallback); + } +#endif + // Setup master LED control module + auto colorLight = new ColorLight(IO::IOEventDomains::HomeAutomation_HomeGenie, COLOR_LIGHT_ADDRESS, "Color Light"); + colorLight->module->setProperty("Widget.Implements.Scheduling", "1"); + colorLight->module->setProperty("Widget.Implements.Scheduling.ModuleEvents", "1"); + colorLight->module->setProperty("Widget.Preference.AudioLight", "true"); + + return colorLight; +} + void statusLedLoop() { - if (statusLED != nullptr && WiFi.isConnected() != _statusLedWifiConnected) { - _statusLedWifiConnected = WiFi.isConnected(); - if (_statusLedWifiConnected) { + if (statusLED != nullptr) { + if (helloWorldActive && millis() > helloWorldDuration && Config::isDeviceConfigured()) { + // stops blinking if "helloWorldDuration" is elapsed + helloWorldActive = false; Config::statusLedCallback(nullptr); - } else { - Config::statusLedCallback(&statusLedCallback); + } else if (WiFi.isConnected() != _statusLedWifiConnected) { + _statusLedWifiConnected = WiFi.isConnected(); + if (_statusLedWifiConnected) { + // turn off status LED blinking if connected + Config::statusLedCallback(nullptr); + } else { + // blinks status LED rapidly if not connected + Config::statusLedCallback(&statusLedCallback); + } } } } + +#endif \ No newline at end of file diff --git a/examples/ir-rf-transceiver/README.md b/examples/ir-rf-transceiver/README.md new file mode 100644 index 0000000..3708dbc --- /dev/null +++ b/examples/ir-rf-transceiver/README.md @@ -0,0 +1,43 @@ +# ir-rf-transceiver + +A smart IR and RF (433/315MHz) gateway device. + +- [Documentation and firmware install page](https://homegenie.it/mini/1.2/examples/ir-rf-gateway/) + + +## Firmware configuration + +In addition to default system options the following configuration options are available: + +| Key | Description | Default | +|------------|----------------------|-----------------------------------------| +| `stld-pin` | Status LED (RGB) pin | -1 (-1=not used) | +| `stld-typ` | Status LED type | RGB/RGBW order mask (see code for ref.) | +| `stld-spd` | Status LED speed | 0 (0=800kHz, 256=400kHz) | +| `irrc-pin` | IR Receiver GPIO # | 7 | +| `irtr-pin` | IR Transmitter GPIO# | 5 | +| `rfrc-pin` | RF Receiver GPIO # | 6 | +| `rftr-pin` | RF Transmitter GPIO# | 4 | + + +### Manual build and install + +You can also manually build and install the firmware from source code +as explained in the [Getting started](../../getting-started#custom-firmware) page +and using the following commands for flashing the firmware: + +```bash +pio run -e ir-transceiver[] -t upload +``` + +where the optional `` suffix can be one of the following: +- ESP8266 + `-d1-mini` +- ESP32 (generic) + *none* +- ESP32-C3 + `-c3` +- ESP32-S3 + `-s3` +- ESP32 D1 Mini + `-d1-mini-esp32` diff --git a/examples/ir-rf-transceiver/configuration.h b/examples/ir-rf-transceiver/configuration.h new file mode 100644 index 0000000..0b02166 --- /dev/null +++ b/examples/ir-rf-transceiver/configuration.h @@ -0,0 +1,6 @@ +// Default config + +#include "../ir-transceiver/configuration.h" +// TODO: verify if X10 and RCSwitch can share same module address +#include "../rf-transceiver/configuration.h" +#include "../x10-transceiver/configuration.h" diff --git a/examples/ir-rf-transceiver/ir-rf-transceiver.cpp b/examples/ir-rf-transceiver/ir-rf-transceiver.cpp new file mode 100644 index 0000000..d6adb89 --- /dev/null +++ b/examples/ir-rf-transceiver/ir-rf-transceiver.cpp @@ -0,0 +1,118 @@ +/* + * HomeGenie-Mini (c) 2018-2025 G-Labs + * + * + * This file is part of HomeGenie-Mini (HGM). + * + * HomeGenie-Mini is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * HomeGenie-Mini is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HomeGenie-Mini. If not, see . + * + * + * Authors: + * - Generoso Martello + * + * + */ + +#include + +#include "configuration.h" + +#include "../ir-transceiver/io/IRReceiver.h" +#include "../ir-transceiver/io/IRTransmitter.h" +#include "../ir-transceiver/api/IRTransceiverHandler.h" + +#include "../x10-transceiver/io/RFReceiver.h" +#include "../x10-transceiver/io/RFTransmitter.h" +#include "../x10-transceiver/api/X10Handler.h" + +#ifdef BOARD_HAS_RGB_LED +#include "../color-light/status-led.h" +#endif + +using namespace Service; + +HomeGenie* homeGenie; + +void setup() { + // Default name shown in SNMP/UPnP advertising + Config::system.friendlyName = "Firefly IR-RF"; + + homeGenie = HomeGenie::getInstance(); + auto miniModule = homeGenie->getDefaultModule(); + miniModule->setProperty("Widget.Implements.Scheduling", "1"); + +#ifdef BOARD_HAS_RGB_LED + // Custom status led (builtin NeoPixel RGB LED) + auto colorLight = statusLedSetup(); + colorLight->onSetColor([](LightColor c) { + statusLED->setPixelColor(0, c.getRed(), c.getGreen(), c.getBlue()); + statusLED->show(); + }); + homeGenie->addAPIHandler(colorLight); +#endif + + + auto irApiHandler = new IRTransceiverHandler(); + // IR receiver pin + uint8_t irReceiverPin = Config::getSetting("irrc-pin", String(CONFIG_IRReceiverPin).c_str()).toInt(); + if (irReceiverPin > 0) { + auto receiverConfiguration = new IR::IRReceiverConfig(irReceiverPin); + auto receiver = new IR::IRReceiver(receiverConfiguration); + irApiHandler->setReceiver(receiver); + homeGenie->addIOHandler(receiver); + } + // IR transmitter pin + uint8_t irTransmitterPin = Config::getSetting("irtr-pin", String(CONFIG_IRTransmitterPin).c_str()).toInt(); + if (irTransmitterPin > 0) { + auto transmitterConfig = new IR::IRTransmitterConfig(irTransmitterPin); + auto transmitter = new IR::IRTransmitter(transmitterConfig); + irApiHandler->setTransmitter(transmitter); + } + homeGenie->addAPIHandler(irApiHandler); + + + auto x10ApiHandler = new X10Handler(); + auto rfModule = x10ApiHandler->getModule(IOEventDomains::HomeAutomation_X10, CONFIG_X10RF_MODULE_ADDRESS); + // X10 RF RFReceiver + uint8_t rfReceiverPin = Config::getSetting("rfrc-pin", String(CONFIG_X10RFReceiverPin).c_str()).toInt(); + if (rfReceiverPin > 0) { + auto x10ReceiverConfig = new X10::RFReceiverConfig(rfReceiverPin); + auto x10Receiver = new X10::RFReceiver(x10ReceiverConfig); + x10Receiver->setModule(rfModule); + x10ApiHandler->setReceiver(x10Receiver); + homeGenie->addIOHandler(x10Receiver); + } + // X10 RF RFTransmitter + uint8_t rfTransmitterPin = Config::getSetting("rftr-pin", String(CONFIG_X10RFTransmitterPin).c_str()).toInt(); + if (rfTransmitterPin > 0) { + auto x10TransmitterConfig = new X10::RFTransmitterConfig(rfTransmitterPin); + auto x10Transmitter = new X10::RFTransmitter(x10TransmitterConfig); + x10ApiHandler->setTransmitter(x10Transmitter); + } + homeGenie->addAPIHandler(x10ApiHandler); + + + homeGenie->begin(); +} + + +void loop() +{ + + homeGenie->loop(); + +#ifdef BOARD_HAS_RGB_LED + statusLedLoop(); +#endif +} diff --git a/examples/ir-transceiver/configuration.h b/examples/ir-transceiver/configuration.h index d067c05..dfd34a2 100644 --- a/examples/ir-transceiver/configuration.h +++ b/examples/ir-transceiver/configuration.h @@ -1,4 +1,10 @@ +// Default config + +#ifdef ESP32_S3 +#define CONFIG_IRReceiverPin 8 +#define CONFIG_IRTransmitterPin 6 +#else #define CONFIG_IRReceiverPin 7 #define CONFIG_IRTransmitterPin 5 - +#endif #define CONFIG_IR_MODULE_ADDRESS "IR" diff --git a/examples/ir-transceiver/ir-transceiver.cpp b/examples/ir-transceiver/ir-transceiver.cpp index c4e679f..d7aff4b 100644 --- a/examples/ir-transceiver/ir-transceiver.cpp +++ b/examples/ir-transceiver/ir-transceiver.cpp @@ -1,5 +1,5 @@ /* - * HomeGenie-Mini (c) 2018-2024 G-Labs + * HomeGenie-Mini (c) 2018-2025 G-Labs * * * This file is part of HomeGenie-Mini (HGM). @@ -33,11 +33,7 @@ #include "api/IRTransceiverHandler.h" #ifdef BOARD_HAS_RGB_LED -#include #include "../color-light/status-led.h" -using namespace Service::API::devices; -unsigned long helloWorldDuration = 10000; -bool helloWorldActive = true; #endif using namespace Service; @@ -53,33 +49,16 @@ void setup() { miniModule->setProperty("Widget.Implements.Scheduling", "1"); #ifdef BOARD_HAS_RGB_LED - // Get status LED config - auto pin = Config::getSetting("stld-pin"); - int statusLedPin = pin.isEmpty() ? -1 : pin.toInt(); - if (statusLedPin >= 0) { - int statusLedType = Config::getSetting("stld-typ", "82").toInt(); - int statusLedSpeed = Config::getSetting("stld-spd", "0").toInt(); - statusLED = new Adafruit_NeoPixel(1, statusLedPin, statusLedType + statusLedSpeed); - statusLED->setPixelColor(0, 0, 0, 0); - statusLED->begin(); - } // Custom status led (builtin NeoPixel RGB LED) - if (statusLED != nullptr) { - // Setup main LEDs control module - auto colorLight = new ColorLight(IO::IOEventDomains::HomeAutomation_HomeGenie, COLOR_LIGHT_ADDRESS, "Status LED"); - colorLight->module->setProperty("Widget.Implements.Scheduling", "1"); - colorLight->module->setProperty("Widget.Implements.Scheduling.ModuleEvents", "1"); - colorLight->module->setProperty("Widget.Preference.AudioLight", "true"); - colorLight->onSetColor([](LightColor c) { - statusLED->setPixelColor(0, c.getRed(), c.getGreen(), c.getBlue()); - statusLED->show(); - }); - homeGenie->addAPIHandler(colorLight); - } + auto colorLight = statusLedSetup(); + colorLight->onSetColor([](LightColor c) { + statusLED->setPixelColor(0, c.getRed(), c.getGreen(), c.getBlue()); + statusLED->show(); + }); + homeGenie->addAPIHandler(colorLight); #endif auto apiHandler = new IRTransceiverHandler(); - homeGenie->addAPIHandler(apiHandler); // IR receiver pin uint8_t irReceiverPin = Config::getSetting("irrc-pin", String(CONFIG_IRReceiverPin).c_str()).toInt(); if (irReceiverPin > 0) { @@ -95,6 +74,7 @@ void setup() { auto transmitter = new IR::IRTransmitter(transmitterConfig); apiHandler->setTransmitter(transmitter); } + homeGenie->addAPIHandler(apiHandler); homeGenie->begin(); } @@ -103,12 +83,8 @@ void setup() { void loop() { homeGenie->loop(); + #ifdef BOARD_HAS_RGB_LED - if (statusLED != nullptr) { - if (helloWorldActive && millis() > helloWorldDuration && Config::isDeviceConfigured()) { - helloWorldActive = false; - Config::statusLedCallback(nullptr); - } - } + statusLedLoop(); #endif } diff --git a/examples/rf-transceiver/configuration.h b/examples/rf-transceiver/configuration.h index 097d870..8224075 100644 --- a/examples/rf-transceiver/configuration.h +++ b/examples/rf-transceiver/configuration.h @@ -1,3 +1,10 @@ +// Default config + +#ifdef ESP32_S3 #define CONFIG_RCSwitchReceiverPin 7 #define CONFIG_RCSwitchTransmitterPin 5 +#else +#define CONFIG_RCSwitchReceiverPin 6 +#define CONFIG_RCSwitchTransmitterPin 4 +#endif #define CONFIG_RCSwitchRF_MODULE_ADDRESS "RF" diff --git a/examples/x10-transceiver/api/X10Handler.cpp b/examples/x10-transceiver/api/X10Handler.cpp index 81adc1f..3dbaa3c 100644 --- a/examples/x10-transceiver/api/X10Handler.cpp +++ b/examples/x10-transceiver/api/X10Handler.cpp @@ -1,5 +1,5 @@ /* - * HomeGenie-Mini (c) 2018-2024 G-Labs + * HomeGenie-Mini (c) 2018-2025 G-Labs * * * This file is part of HomeGenie-Mini (HGM). @@ -54,8 +54,11 @@ namespace Service { namespace API { rfModule->address = CONFIG_X10RF_MODULE_ADDRESS; rfModule->type = "Sensor"; rfModule->name = "RF"; //TODO: CONFIG_X10RF_MODULE_NAME; + // explicitly enable "scheduling" features for this module rfModule->setProperty("Widget.Implements.Scheduling", "1"); + rfModule->setProperty("Widget.Implements.Scheduling.ModuleEvents", "1"); + // set properties receiverRawData = new ModuleParameter(IOEventPaths::Receiver_RawData); rfModule->properties.add(receiverRawData); @@ -64,22 +67,22 @@ namespace Service { namespace API { moduleList.add(rfModule); -#ifndef ESP8266 - // TODO: this won't work on ESP8266 due to free RAM limit - // Add 16 X10 modules for house codes from 'A' to 'P' + auto defaultHouseCode = Config::getSetting("x10-hcode", "a").charAt(0); + + // Add 16 X10 modules for default house code // module address: "" - for (int h = HOUSE_MIN; h <= HOUSE_MAX; h++) { - for (int m = 0; m < UNIT_MAX; m++) { - auto address = String((char)h)+String(m+UNIT_MIN); - address.toUpperCase(); - auto module = new Module(); - module->domain = IOEventDomains::HomeAutomation_X10; - module->address = address; - module->setProperty(IOEventPaths::Status_Level, "0", 0, Number); - moduleList.add(module); - } + // controlling these modules via API or app UI will result + // in sending the X10 RF code mathing the command (e.g. A1 ON) + for (int m = 0; m < UNIT_MAX; m++) { + auto address = String((char)defaultHouseCode) + String(m+UNIT_MIN); + address.toUpperCase(); + auto module = new Module(); + module->domain = IOEventDomains::HomeAutomation_X10; + module->address = address; + module->setProperty(IOEventPaths::Status_Level, "0", 0, Number); + moduleList.add(module); } -#endif + } void X10Handler::init() { @@ -272,20 +275,7 @@ namespace Service { namespace API { } break; } -/* - QueuedMessage m = QueuedMessage(domain, houseCode + unitCode, (IOEventPaths::Status_Level), ""); - switch (decodedMessage->command) { - case Command::CMD_ON: - m.value = "1"; - homeGenie->getEventRouter().signalEvent(m); - break; - case Command::CMD_OFF: - m.value = "0"; - homeGenie->getEventRouter().signalEvent(m); - break; -// TODO: Implement all X10 events + Camera and Security - } -*/ + delete decodedMessage; return true; diff --git a/examples/x10-transceiver/configuration.h b/examples/x10-transceiver/configuration.h index 99ed716..8a2fb6d 100644 --- a/examples/x10-transceiver/configuration.h +++ b/examples/x10-transceiver/configuration.h @@ -1,3 +1,10 @@ +// Default config + +#ifdef ESP32_S3 #define CONFIG_X10RFReceiverPin 7 #define CONFIG_X10RFTransmitterPin 5 +#else +#define CONFIG_X10RFReceiverPin 6 +#define CONFIG_X10RFTransmitterPin 4 +#endif #define CONFIG_X10RF_MODULE_ADDRESS "RF" diff --git a/examples/x10-transceiver/x10-transceiver.cpp b/examples/x10-transceiver/x10-transceiver.cpp index fba687e..51431a1 100644 --- a/examples/x10-transceiver/x10-transceiver.cpp +++ b/examples/x10-transceiver/x10-transceiver.cpp @@ -1,5 +1,5 @@ /* - * HomeGenie-Mini (c) 2018-2024 G-Labs + * HomeGenie-Mini (c) 2018-2025 G-Labs * * * This file is part of HomeGenie-Mini (HGM). @@ -34,11 +34,7 @@ #include "io/RFTransmitter.h" #ifdef BOARD_HAS_RGB_LED -#include #include "../color-light/status-led.h" -using namespace Service::API::devices; -unsigned long helloWorldDuration = 10000; -bool helloWorldActive = true; #endif using namespace IO; @@ -54,34 +50,17 @@ void setup() { auto miniModule = homeGenie->getDefaultModule(); #ifdef BOARD_HAS_RGB_LED - // Get status LED config - auto pin = Config::getSetting("stld-pin"); - int statusLedPin = pin.isEmpty() ? -1 : pin.toInt(); - if (statusLedPin >= 0) { - int statusLedType = Config::getSetting("stld-typ", "82").toInt(); - int statusLedSpeed = Config::getSetting("stld-spd", "0").toInt(); - statusLED = new Adafruit_NeoPixel(1, statusLedPin, statusLedType + statusLedSpeed); - statusLED->setPixelColor(0, 0, 0, 0); - statusLED->begin(); - } // Custom status led (builtin NeoPixel RGB LED) - if (statusLED != nullptr) { - // Setup main LEDs control module - auto colorLight = new ColorLight(IOEventDomains::HomeAutomation_HomeGenie, COLOR_LIGHT_ADDRESS, "Status LED"); - colorLight->module->setProperty("Widget.Implements.Scheduling", "1"); - colorLight->module->setProperty("Widget.Implements.Scheduling.ModuleEvents", "1"); - colorLight->module->setProperty("Widget.Preference.AudioLight", "true"); - colorLight->onSetColor([](LightColor c) { - statusLED->setPixelColor(0, c.getRed(), c.getGreen(), c.getBlue()); - statusLED->show(); - }); - homeGenie->addAPIHandler(colorLight); - } + auto colorLight = statusLedSetup(); + colorLight->onSetColor([](LightColor c) { + statusLED->setPixelColor(0, c.getRed(), c.getGreen(), c.getBlue()); + statusLED->show(); + }); + homeGenie->addAPIHandler(colorLight); #endif auto apiHandler = new X10Handler(); auto rfModule = apiHandler->getModule(IOEventDomains::HomeAutomation_X10, CONFIG_X10RF_MODULE_ADDRESS); - // X10 RF RFReceiver uint8_t rfReceiverPin = Config::getSetting("rfrc-pin", String(CONFIG_X10RFReceiverPin).c_str()).toInt(); if (rfReceiverPin > 0) { @@ -91,7 +70,6 @@ void setup() { apiHandler->setReceiver(x10Receiver); homeGenie->addIOHandler(x10Receiver); } - // X10 RF RFTransmitter uint8_t rfTransmitterPin = Config::getSetting("rftr-pin", String(CONFIG_X10RFTransmitterPin).c_str()).toInt(); if (rfTransmitterPin > 0) { @@ -99,7 +77,6 @@ void setup() { auto x10Transmitter = new X10::RFTransmitter(x10TransmitterConfig); apiHandler->setTransmitter(x10Transmitter); } - homeGenie->addAPIHandler(apiHandler); homeGenie->begin(); @@ -109,12 +86,8 @@ void loop() { homeGenie->loop(); + #ifdef BOARD_HAS_RGB_LED - if (statusLED != nullptr) { - if (helloWorldActive && millis() > helloWorldDuration && Config::isDeviceConfigured()) { - helloWorldActive = false; - Config::statusLedCallback(nullptr); - } - } + statusLedLoop(); #endif } diff --git a/platformio.ini b/platformio.ini index abe84f0..9bd23ab 100644 --- a/platformio.ini +++ b/platformio.ini @@ -23,8 +23,10 @@ platform = espressif32@6.9.0 # framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.5 # framework-arduinoespressif32-libs @ https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.1/esp32-arduino-libs-idf-release_v5.1-33fbade6.zip # -# UNOFFICIAL Espressif32 and Arduino 3.x -# should support also latest ESP32 boards (not verified) +# PIOARDUINO - unofficial Espressif32 and Arduino 3.x +# should support also latest ESP32 boards (not yet verified) +# from early testing it seems that it requires 42K of additional +# heap memory probably due different IDF version (newer) #platform = https://github.com/pioarduino/platform-espressif32/releases/download/53.03.11/platform-espressif32.zip # build_src_filter = -<*> + @@ -49,9 +51,30 @@ lib_deps = dvarrel/ESPping@1.0.4 jpb10/SolarCalculator@2.0.1 RobTillaart/UUID@0.1.6 -lib_deps_8266 = +custom_lib_deps_8266 = vshymanskyy/Preferences@2.1.0 - +# The 'custom_sdkconfig' and 'custom_component_remove' +# are experimental options that only works with *pioarduino* (Hybrid compilation) +custom_sdkconfig = + file://./sdkconfig.esp32 +custom_component_remove = + espressif/esp_hosted + espressif/esp_wifi_remote + espressif/esp-dsp + espressif/network_provisioning + espressif/esp-zboss-lib + espressif/esp-zigbee-lib + espressif/esp_rainmaker + espressif/rmaker_common + espressif/esp_insights + espressif/esp_diag_data_store + espressif/esp_diagnostics + espressif/cbor + espressif/qrcode + espressif/esp-sr + espressif/libsodium + espressif/esp-modbus + espressif/esp32-camera [env:default] build_flags = ${env.build_flags} @@ -75,7 +98,7 @@ platform = espressif8266@2.6.3 board = d1_mini build_flags = ${env.build_flags} -D DISABLE_UI -D DISABLE_AUTOMATION -D DEFAULT_CONFIG='{"sys-rb-n":"0","sys-sl-n":"16","io-typ01":"Switch","io-pin01":"14","io-typ02":"Switch","io-pin02":"27","io-typ03":"Switch","io-pin03":"27","io-typ04":"Switch","io-pin04":"27"}' -lib_deps = ${env.lib_deps_8266} +lib_deps = ${env.custom_lib_deps_8266} ${env.lib_deps} lib_ignore = ESP32Time @@ -107,8 +130,9 @@ lib_ignore = board = esp32-c3-devkitc-02 #board = esp32-c3-devkitm-1 build_flags = ${env.build_flags} -I examples -I src -D ESP32_C3 -D DISABLE_UI -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=1 + -D BOARD_HAS_RGB_LED -D DEFAULT_CONFIG='{"sys-rb-n":"9","sys-sl-n":"-1","stld-typ":"82","stld-spd":"0","stld-pin":"10","io-typ01":"Dimmer","io-pin01":"4","io-typ02":"Dimmer","io-pin02":"5","sdht-typ":"22","sdht-pin":"7","motn-typ":"switch","motn-pin":"8"}' -build_src_filter = + - + +build_src_filter = ${env:smart-sensor.build_src_filter} lib_deps = ${env:smart-sensor.lib_deps} lib_ignore = LovyanGFX @@ -120,8 +144,9 @@ board = esp32-s3-fh4r2 #board = lolin_s3_mini build_flags = ${env.build_flags} -I examples -I src -D ESP32_S3 -D DISABLE_UI -D BOARD_HAS_PSRAM -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=1 + -D BOARD_HAS_RGB_LED -D DEFAULT_CONFIG='{"sys-rb-n":"0","sys-sl-n":"-1","stld-typ":"82","stld-spd":"0","stld-pin":"21","io-typ01":"Dimmer","io-pin01":"5","io-typ02":"Dimmer","io-pin02":"6","sdht-typ":"22","sdht-pin":"8","motn-typ":"switch","motn-pin":"9"}' -build_src_filter = + - + +build_src_filter = ${env:smart-sensor.build_src_filter} lib_deps = ${env:smart-sensor.lib_deps} lib_ignore = LovyanGFX @@ -131,7 +156,7 @@ board = lolin_s2_mini build_flags = ${env.build_flags} -I examples -I src -D ESP32_S2 -D DISABLE_UI -D BOARD_HAS_PSRAM -D DEFAULT_CONFIG='{"sys-rb-n":"0","sys-sl-n":"15","io-typ01":"Dimmer","io-pin01":"4","io-typ02":"Dimmer","io-pin02":"5","sdht-typ":"22","sdht-pin":"7","motn-typ":"switch","motn-pin":"8"}' -build_src_filter = + - + +build_src_filter = ${env:smart-sensor.build_src_filter} lib_deps = ${env:smart-sensor.lib_deps} lib_ignore = ESP32_BleSerial @@ -142,8 +167,8 @@ platform = espressif8266@2.6.3 board = d1_mini build_flags = ${env.build_flags} -I examples -I src -D DISABLE_UI -D DISABLE_AUTOMATION -D DEFAULT_CONFIG='{"sys-rb-n":"0","sys-sl-n":"16","sys_bt_pin":"2","sys_sl_pin":"16","soth-typ":"ds18b20","soth-pin":"0","ligh-typ":"ldr","ligh-pin":"17"}' -build_src_filter = + - + -lib_deps = ${env.lib_deps_8266} +build_src_filter = ${env:smart-sensor.build_src_filter} +lib_deps = ${env.custom_lib_deps_8266} ${env:smart-sensor.lib_deps} lib_ignore = ESP32Time @@ -162,7 +187,7 @@ board = esp32-s3-devkitc-1 build_flags = ${env.build_flags} -I examples -I src -D ESP32_S3 -D CONFIG_AUTOMATION_SPAWN_FREERTOS_TASK -D ESP32S3_DEV -D BOARD_HAS_PSRAM -D DEFAULT_CONFIG='{"sys-rb-n":"0","sys-sl-n":"-1","io-typ01":"Dimmer","io-pin01":"15","io-typ02":"Dimmer","io-pin02":"17","sdht-typ":"22","sdht-pin":"21","motn-typ":"switch","motn-pin":"16"}' -build_src_filter = + - + - + +build_src_filter = ${env:smart-sensor-display.build_src_filter} board_build.mcu = esp32s3 board_build.f_cpu = 240000000L board_build.arduino.memory_type = qio_qspi @@ -183,6 +208,7 @@ board = esp32-c3-devkitc-02 build_flags = ${env.build_flags} -I examples -I src -D ESP32_C3 -D DISABLE_UI -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=1 -D BOARD_HAS_RGB_LED + -D DEFAULT_CONFIG='{"sys-rb-n":"9","sys-sl-n":"-1","stld-typ":"82","stld-spd":"0","stld-pin":"10"}' build_src_filter = + - + lib_deps = ${env:x10-transceiver.lib_deps} https://github.com/adafruit/Adafruit_NeoPixel#1.12.0 @@ -194,6 +220,7 @@ board = esp32-s3-fh4r2 build_flags = ${env.build_flags} -I examples -I src -D ESP32_S3 -D DISABLE_UI -D BOARD_HAS_PSRAM -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=1 -D BOARD_HAS_RGB_LED + -D DEFAULT_CONFIG='{"sys-rb-n":"0","sys-sl-n":"-1","stld-typ":"82","stld-spd":"0","stld-pin":"21"}' build_src_filter = + - + lib_deps = ${env:x10-transceiver.lib_deps} https://github.com/adafruit/Adafruit_NeoPixel#1.12.0 @@ -205,7 +232,7 @@ platform = espressif8266@2.6.3 board = d1_mini build_flags = ${env.build_flags} -D DISABLE_UI build_src_filter = + - + -lib_deps = ${env.lib_deps_8266} +lib_deps = ${env.custom_lib_deps_8266} ${env.lib_deps} lib_ignore = ESP32Time @@ -223,8 +250,8 @@ lib_deps = ${env.lib_deps} platform = espressif8266@2.6.3 board = d1_mini build_flags = ${env.build_flags} -D DISABLE_UI -build_src_filter = + - + -lib_deps = ${env.lib_deps_8266} +build_src_filter = ${env:rf-transceiver.build_src_filter} +lib_deps = ${env.custom_lib_deps_8266} ${env:rf-transceiver.lib_deps} lib_ignore = ESP32Time @@ -236,7 +263,9 @@ board = esp32-c3-devkitc-02 #board = esp32-c3-devkitm-1 build_flags = ${env.build_flags} -I examples -I src -D ESP32_C3 -D DISABLE_UI -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=1 -build_src_filter = + - + + -D BOARD_HAS_RGB_LED + -D DEFAULT_CONFIG='{"sys-rb-n":"9","sys-sl-n":"-1","stld-typ":"82","stld-spd":"0","stld-pin":"10"}' +build_src_filter = ${env:rf-transceiver.build_src_filter} lib_deps = ${env:rf-transceiver.lib_deps} lib_ignore = LovyanGFX @@ -246,7 +275,8 @@ board = esp32-s3-fh4r2 build_flags = ${env.build_flags} -I examples -I src -D ESP32_S3 -D DISABLE_UI -D BOARD_HAS_PSRAM -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=1 -D BOARD_HAS_RGB_LED -build_src_filter = + - + + -D DEFAULT_CONFIG='{"sys-rb-n":"0","sys-sl-n":"-1","stld-typ":"82","stld-spd":"0","stld-pin":"21"}' +build_src_filter = ${env:rf-transceiver.build_src_filter} lib_deps = ${env:rf-transceiver.lib_deps} lib_ignore = LovyanGFX @@ -264,8 +294,8 @@ lib_ignore = platform = espressif8266@2.6.3 board = d1_mini build_flags = ${env.build_flags} -D DISABLE_UI -build_src_filter = + - + -lib_deps = ${env.lib_deps_8266} +build_src_filter = ${env:ir-transceiver.build_src_filter} +lib_deps = ${env.custom_lib_deps_8266} ${env:ir-transceiver.lib_deps} lib_ignore = ESP32Time @@ -278,7 +308,8 @@ board = esp32-c3-devkitc-02 build_flags = ${env.build_flags} -I examples -I src -D ESP32_C3 -D DISABLE_UI -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=1 -D BOARD_HAS_RGB_LED -build_src_filter = + - + + -D DEFAULT_CONFIG='{"sys-rb-n":"9","sys-sl-n":"-1","stld-typ":"82","stld-spd":"0","stld-pin":"10"}' +build_src_filter = ${env:ir-transceiver.build_src_filter} lib_deps = ${env:ir-transceiver.lib_deps} https://github.com/adafruit/Adafruit_NeoPixel#1.12.0 lib_ignore = @@ -289,13 +320,62 @@ board = esp32-s3-fh4r2 build_flags = ${env.build_flags} -I examples -I src -D ESP32_S3 -D DISABLE_UI -D BOARD_HAS_PSRAM -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=1 -D BOARD_HAS_RGB_LED -build_src_filter = + - + + -D DEFAULT_CONFIG='{"sys-rb-n":"0","sys-sl-n":"-1","stld-typ":"82","stld-spd":"0","stld-pin":"21"}' +build_src_filter = ${env:ir-transceiver.build_src_filter} lib_deps = ${env:ir-transceiver.lib_deps} https://github.com/adafruit/Adafruit_NeoPixel#1.12.0 lib_ignore = LovyanGFX +[env:ir-rf-transceiver] +build_flags = ${env.build_flags} -I examples -I src -D DISABLE_UI +build_src_filter = + - + + + + + + + +lib_deps = ${env.lib_deps} + crankyoldgit/IRremoteESP8266@2.8.6 +lib_ignore = + LovyanGFX + +[env:ir-rf-transceiver-d1-mini] +platform = espressif8266@2.6.3 +board = d1_mini +build_flags = ${env.build_flags} -D DISABLE_UI +build_src_filter = ${env:ir-rf-transceiver.build_src_filter} +lib_deps = ${env.custom_lib_deps_8266} + ${env:ir-rf-transceiver.lib_deps} +lib_ignore = + ESP32Time + ESP32_BleSerial + LovyanGFX + +[env:ir-rf-transceiver-c3] +board = esp32-c3-devkitc-02 +#board = esp32-c3-devkitm-1 +build_flags = ${env.build_flags} -I examples -I src -D ESP32_C3 -D DISABLE_UI + -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=1 + -D BOARD_HAS_RGB_LED + -D DEFAULT_CONFIG='{"sys-rb-n":"9","sys-sl-n":"-1","stld-typ":"82","stld-spd":"0","stld-pin":"10"}' +build_src_filter = ${env:ir-rf-transceiver.build_src_filter} +lib_deps = ${env:ir-rf-transceiver.lib_deps} + https://github.com/adafruit/Adafruit_NeoPixel#1.12.0 +lib_ignore = + LovyanGFX + +[env:ir-rf-transceiver-s3] +board = esp32-s3-fh4r2 +build_flags = ${env.build_flags} -I examples -I src -D ESP32_S3 -D DISABLE_UI + -D BOARD_HAS_PSRAM -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=1 + -D BOARD_HAS_RGB_LED + -D DEFAULT_CONFIG='{"sys-rb-n":"0","sys-sl-n":"-1","stld-typ":"82","stld-spd":"0","stld-pin":"21"}' +build_src_filter = ${env:ir-rf-transceiver.build_src_filter} +lib_deps = ${env:ir-rf-transceiver.lib_deps} + https://github.com/adafruit/Adafruit_NeoPixel#1.12.0 +lib_ignore = + LovyanGFX + + [env:color-light] build_flags = ${env.build_flags} -I examples -I src -D DISABLE_UI build_src_filter = + - + @@ -307,8 +387,8 @@ platform = espressif8266@2.6.3 board = d1_mini build_flags = ${env.build_flags} -I examples -I src -D DISABLE_UI -D DISABLE_AUTOMATION -D DEFAULT_CONFIG='{"sys-rb-n":"0","sys-sl-n":"16","leds-typ":"6","leds-cnt":"64","leds-spd":"0","leds-pin":"8"}' -build_src_filter = + - + -lib_deps = ${env.lib_deps_8266} +build_src_filter = ${env:color-light.build_src_filter} +lib_deps = ${env.custom_lib_deps_8266} ${env:color-light.lib_deps} lib_ignore = ESP32Time @@ -320,8 +400,9 @@ board = esp32-c3-devkitc-02 #board = esp32-c3-devkitm-1 build_flags = ${env.build_flags} -I examples -I src -D ESP32_C3 -D DISABLE_UI -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=1 + -D BOARD_HAS_RGB_LED -D DEFAULT_CONFIG='{"sys-rb-n":"9","sys-sl-n":"-1","stld-typ":"82","stld-spd":"0","stld-pin":"10","leds-typ":"82","leds-spd":"0","leds-pin":"5","leds-cnt":"1"}' -build_src_filter = + - + +build_src_filter = ${env:color-light.build_src_filter} lib_deps = ${env:color-light.lib_deps} [env:color-light-s3] @@ -331,8 +412,9 @@ board = esp32-s3-fh4r2 #board = lolin_s3_mini build_flags = ${env.build_flags} -I examples -I src -D ESP32_S3 -D DISABLE_UI -D BOARD_HAS_PSRAM -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=1 + -D BOARD_HAS_RGB_LED -D DEFAULT_CONFIG='{"sys-rb-n":"0","sys-sl-n":"-1","stld-typ":"82","stld-spd":"0","stld-pin":"21","leds-typ":"82","leds-spd":"0","leds-pin":"6","leds-cnt":"1"}' -build_src_filter = + - + +build_src_filter = ${env:color-light.build_src_filter} lib_deps = ${env:color-light.lib_deps} [env:color-light-s2-mini] @@ -340,7 +422,7 @@ board = lolin_s2_mini build_flags = ${env.build_flags} -I examples -I src -D ESP32_S2 -D BOARD_HAS_PSRAM -D DEFAULT_CONFIG='{"sys-rb-n":"0","sys-sl-n":"15","leds-typ":"82","leds-spd":"0","leds-pin":"8","leds-cnt":"0"}' -build_src_filter = + - + +build_src_filter = ${env:color-light.build_src_filter} lib_deps = ${env:color-light.lib_deps} lib_ignore = ESP32_BleSerial @@ -357,7 +439,7 @@ lib_deps = ${env.lib_deps} board = esp32-c3-devkitc-02 #board = esp32-c3-devkitm-1 build_flags = ${env.build_flags} -I examples -I src -D ESP32_C3 -D DISABLE_UI -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=1 -build_src_filter = + - + +build_src_filter = ${env:shutter.build_src_filter} lib_deps = ${env:shutter.lib_deps} https://github.com/adafruit/Adafruit_NeoPixel#1.12.0 @@ -370,4 +452,4 @@ build_src_filter = + - + board = esp32-c3-devkitc-02 #board = esp32-c3-devkitm-1 build_flags = ${env.build_flags} -I examples -I src -D ESP32_C3 -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=1 -build_src_filter = + - + +build_src_filter = ${env:playground.build_src_filter} diff --git a/sdkconfig.esp32 b/sdkconfig.esp32 new file mode 100644 index 0000000..4383231 --- /dev/null +++ b/sdkconfig.esp32 @@ -0,0 +1,5 @@ +# Override default sdkconfig settings here (works with PIOARDUINO only) + +CONFIG_ENABLE_ARDUINO_DEPENDS=y +CONFIG_AUTOSTART_ARDUINO=y +CONFIG_ARDUHAL_ESP_LOG=n diff --git a/src/service/api/devices/ColorLight.h b/src/service/api/devices/ColorLight.h index fcf2102..2f9f6b8 100644 --- a/src/service/api/devices/ColorLight.h +++ b/src/service/api/devices/ColorLight.h @@ -1,5 +1,5 @@ /* - * HomeGenie-Mini (c) 2018-2024 G-Labs + * HomeGenie-Mini (c) 2018-2025 G-Labs * * * This file is part of HomeGenie-Mini (HGM). @@ -77,20 +77,20 @@ namespace Service { namespace API { namespace devices { v = val; } float getRed() const { - auto orgb = Utility::hsv2rgb(oh, os, ov); - auto crgb = Utility::hsv2rgb(h, s, v); + auto orgb = ::Utility::hsv2rgb(oh, os, ov); + auto crgb = ::Utility::hsv2rgb(h, s, v); float r = (float)orgb.r + ((float)(crgb.r - orgb.r) * getProgress()); return r; } float getGreen() const { - auto orgb = Utility::hsv2rgb(oh, os, ov); - auto crgb = Utility::hsv2rgb(h, s, v); + auto orgb = ::Utility::hsv2rgb(oh, os, ov); + auto crgb = ::Utility::hsv2rgb(h, s, v); float g = (float)orgb.g + ((float)(crgb.g - orgb.g) * getProgress()); return g; } float getBlue() const { - auto orgb = Utility::hsv2rgb(oh, os, ov); - auto crgb = Utility::hsv2rgb(h, s, v); + auto orgb = ::Utility::hsv2rgb(oh, os, ov); + auto crgb = ::Utility::hsv2rgb(h, s, v); float b = (float)orgb.b + ((float)(crgb.b - orgb.b) * getProgress()); return b; } diff --git a/src/version.h b/src/version.h index 8fc6378..299f4bd 100644 --- a/src/version.h +++ b/src/version.h @@ -1,5 +1,5 @@ /* - * HomeGenie-Mini (c) 2018-2024 G-Labs + * HomeGenie-Mini (c) 2018-2025 G-Labs * * * This file is part of HomeGenie-Mini (HGM). @@ -29,7 +29,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 2 -#define VERSION_PATCH 46 +#define VERSION_PATCH 47 #define STRING_VALUE(...) STRING_VALUE__(__VA_ARGS__) #define STRING_VALUE__(...) #__VA_ARGS__