From a487bd132d217866e21a8881f31ea05f657d6301 Mon Sep 17 00:00:00 2001 From: TD-er Date: Tue, 5 Jun 2018 19:56:23 +0200 Subject: [PATCH] [I2C] Disable calls to wire.begin() from libraries --- lib/AS_BH1750/AS_BH1750.cpp | 74 +++++++++---------- lib/Adafruit_MPR121/Adafruit_MPR121.cpp | 2 +- .../Adafruit_MotorShield.cpp | 2 +- .../utility/Adafruit_MS_PWMServoDriver.cpp | 18 ++--- lib/Adafruit_TCS34725/Adafruit_TCS34725.cpp | 14 ++-- lib/Adafruit_TSL2591/Adafruit_TSL2591.cpp | 2 +- lib/LiquidCrystal_I2C/LiquidCrystal_I2C.cpp | 67 +++++++++-------- .../src/SparkFun_APDS9960.cpp | 2 +- src/_P015_TSL2561.ino | 2 +- 9 files changed, 91 insertions(+), 92 deletions(-) diff --git a/lib/AS_BH1750/AS_BH1750.cpp b/lib/AS_BH1750/AS_BH1750.cpp index c27969c12..fa98776be 100644 --- a/lib/AS_BH1750/AS_BH1750.cpp +++ b/lib/AS_BH1750/AS_BH1750.cpp @@ -1,24 +1,24 @@ /* This is a (Arduino) library for the BH1750FVI Digital Light Sensor. - + Description: http://www.rohm.com/web/global/products/-/product/BH1750FVI - + Datasheet: http://rohmfs.rohm.com/en/products/databook/datasheet/ic/sensor/light/bh1750fvi-e.pdf - + Copyright (c) 2013 Alexander Schulz. All right reserved. - + This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. - + This library 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 Lesser General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA @@ -31,10 +31,10 @@ /** * Constructor. - * Erlaubt die I2C-Adresse des Sensors zu ändern. - * Standardadresse: 0x23, Alternativadresse: 0x5C. + * Erlaubt die I2C-Adresse des Sensors zu ändern. + * Standardadresse: 0x23, Alternativadresse: 0x5C. * Es sind entsprechende Konstanten definiert: BH1750_DEFAULT_I2CADDR und BH1750_SECOND_I2CADDR. - * Bei Nichtangabe wird die Standardadresse verwendet. + * Bei Nichtangabe wird die Standardadresse verwendet. * Um die Alternativadresse zu nutzen, muss der Sensorpin 'ADR' des Chips auf VCC gelegt werden. */ AS_BH1750::AS_BH1750(uint8_t address) { @@ -44,23 +44,23 @@ AS_BH1750::AS_BH1750(uint8_t address) { /** * Führt die anfängliche Initialisierung des Sensors. - * Mögliche Parameter: + * Mögliche Parameter: * - Modus für die Sensorauflösung: * -- RESOLUTION_LOW: Physische Sensormodus mit 4 lx Auflösung. Messzeit ca. 16ms. Bereich 0-54612. * -- RESOLUTION_NORMAL: Physische Sensormodus mit 1 lx Auflösung. Messzeit ca. 120ms. Bereich 0-54612. * -- RESOLUTION_HIGH: Physische Sensormodus mit 0,5 lx Auflösung. Messzeit ca. 120ms. Bereich 0-54612. * (Die Messbereiche können durch Änderung des MTreg verschoben werden.) - * -- RESOLUTION_AUTO_HIGH: Die Werte im MTreg werden je nach Helligkeit automatisch so angepasst, + * -- RESOLUTION_AUTO_HIGH: Die Werte im MTreg werden je nach Helligkeit automatisch so angepasst, * dass eine maximalmögliche Auflösung und Messbereich erziehlt werden. * Die messbaren Werte fangen von 0,11 lx und gehen bis über 100000 lx. - * (ich weis nicht, wie genau die Werte in Grenzbereichen sind, + * (ich weis nicht, wie genau die Werte in Grenzbereichen sind, * besonders bei hohen Werte habe ich da meine Zweifel. * Die Werte scheinen jedoch weitgehend linear mit der steigenden Helligkeit zu wachsen.) * Auflösung im Unteren Bereich ca. 0,13 lx, im mittleren 0,5 lx, im oberen etwa 1-2 lx. - * Die Messzeiten verlängern sich durch mehrfache Messungen und + * Die Messzeiten verlängern sich durch mehrfache Messungen und * die Änderungen von Measurement Time (MTreg) bis max. ca. 500 ms. - * - * - AutoPowerDown: true = Der Sensor wird nach der Messung in den Stromsparmodus versetzt. + * + * - AutoPowerDown: true = Der Sensor wird nach der Messung in den Stromsparmodus versetzt. * Das spätere Aufwecken wird ggf. automatisch vorgenommen, braucht jedoch geringfügig mehr Zeit. * * Defaultwerte: RESOLUTION_AUTO_HIGH, true @@ -73,8 +73,8 @@ bool AS_BH1750::begin(sensors_resolution_t mode, bool autoPowerDown) { #endif _virtualMode = mode; _autoPowerDown = autoPowerDown; - - Wire.begin(); + + //Wire.begin(); called in ESPEasy framework defineMTReg(BH1750_MTREG_DEFAULT); // eigentlich normalerweise unnötig, da standard @@ -132,7 +132,7 @@ bool AS_BH1750::isPresent() { // Check I2C Adresse Wire.beginTransmission(_address); if(Wire.endTransmission()!=0) { - return false; + return false; } // Check device: ist es ein BH1750 @@ -141,10 +141,10 @@ bool AS_BH1750::isPresent() { //write8(BH1750_POWER_ON); selectResolutionMode(BH1750_ONE_TIME_LOW_RES_MODE); _hardwareMode=255; - } + } else { // falls einmal-modus aktiv war, muss der Sensor geweckt werden - powerOn(); + powerOn(); } // Prüfen, ob Werte auch wirklich geliefert werden (letztes Modus, ggf. wird auto-PowerDown ausgeführt) @@ -189,9 +189,9 @@ void AS_BH1750::powerDown() { * Sendet zum Sensor ein Befehl zum Auswahl von HardwareMode. * * Parameter: - * - mode: s.o. + * - mode: s.o. * - DelayFuncPtr: delay(n) Möglichkeit, eigene Delay-Funktion mitzugeben (z.B. um sleep-Modus zu verwenden). - * + * * Defaultwerte: delay() * */ @@ -256,17 +256,17 @@ float AS_BH1750::readLightLevel(DelayFuncPtr fDelayPtr) { return -1; } - // ggf. PowerOn + // ggf. PowerOn if(_autoPowerDown && _valueReaded){ powerOn(); } // Das Automatische Modus benötigt eine Sonderbehandlung. - // Zuerst wird die Helligkeit im LowRes-Modus gelesen, + // Zuerst wird die Helligkeit im LowRes-Modus gelesen, // je nach Bereich (dunkel, normal, sehr hell) werden die Werte von MTreg gesetzt und // danach wird die eigentliche Messung vorgenommen. /* - Die feste Grenzwerte verursachen möglicherweise einen 'Sprung' in der Messkurve. + Die feste Grenzwerte verursachen möglicherweise einen 'Sprung' in der Messkurve. In diesem Fall wäre eine laufende Anpassung von MTreg in Grenzbereichen vermutlich besser. Für meine Zwecke ist das jedoch ohne Bedeutung. */ @@ -282,8 +282,8 @@ float AS_BH1750::readLightLevel(DelayFuncPtr fDelayPtr) { if(level<10) { #if BH1750_DEBUG == 1 Serial.println("level 0: dark"); -#endif - // Dunkel, Empfindlichkeit auf Maximum. +#endif + // Dunkel, Empfindlichkeit auf Maximum. // Der Wert ist zufällig. Ab ca. 16000 wäre diese Vorgehnsweise möglich. // Ich brauche diese Genauigkeit aber nur in den ganz dunklen Bereichen (zu erkennen, wann wirklich 'dunkel' ist). defineMTReg(BH1750_MTREG_MAX); @@ -294,16 +294,16 @@ float AS_BH1750::readLightLevel(DelayFuncPtr fDelayPtr) { else if(level<32767) { #if BH1750_DEBUG == 1 Serial.println("level 1: normal"); -#endif +#endif // Bis hierher reicht die 0,5 lx Modus. Normale Empfindlichkeit. defineMTReg(BH1750_MTREG_DEFAULT); selectResolutionMode(_autoPowerDown?BH1750_ONE_TIME_HIGH_RES_MODE_2:BH1750_CONTINUOUS_HIGH_RES_MODE_2, fDelayPtr); fDelayPtr(120); // TODO: Wert prüfen - } + } else if(level<60000) { #if BH1750_DEBUG == 1 Serial.println("level 2: bright"); -#endif +#endif // hoher Bereich, 1 lx Modus, normale Empfindlichkeit. Der Wert von 60000 ist mehr oder weniger zufällig, es mus einfach ein hoher Wert, nah an der Grenze sein. defineMTReg(BH1750_MTREG_DEFAULT); selectResolutionMode(_autoPowerDown?BH1750_ONE_TIME_HIGH_RES_MODE:BH1750_CONTINUOUS_HIGH_RES_MODE, fDelayPtr); @@ -312,29 +312,29 @@ float AS_BH1750::readLightLevel(DelayFuncPtr fDelayPtr) { else { #if BH1750_DEBUG == 1 Serial.println("level 3: very bright"); -#endif +#endif // sehr hoher Bereich, Empfindlichkeit verringern defineMTReg(32); // Min+1, bei dem Minimum aus Doku spielt der Sensor (zumindest meiner) verrückt: Die Werte sind ca. 1/10 von den Erwarteten. selectResolutionMode(_autoPowerDown?BH1750_ONE_TIME_HIGH_RES_MODE:BH1750_CONTINUOUS_HIGH_RES_MODE, fDelayPtr); fDelayPtr(120); // TODO: Wert prüfen } - } + } // Hardware Wert lesen und in Lux umrechnen. uint16_t raw = readRawLevel(); if(raw==65535) { - // Wert verdächtig hoch. Sensor prüfen. + // Wert verdächtig hoch. Sensor prüfen. // Check I2C Adresse Wire.beginTransmission(_address); if(Wire.endTransmission()!=0) { - return -1; + return -1; } } - return convertRawValue(raw); + return convertRawValue(raw); } /** - * Roh-Wert der Helligkeit auslesen. + * Roh-Wert der Helligkeit auslesen. * Wertebereich 0-65535. */ uint16_t AS_BH1750::readRawLevel(void) { @@ -457,7 +457,7 @@ void AS_BH1750::defineMTReg(uint8_t val) { * Gibt an, ob der Sensor initialisiert ist. */ bool AS_BH1750::isInitialized() { - return _hardwareMode!=255; + return _hardwareMode!=255; } /** diff --git a/lib/Adafruit_MPR121/Adafruit_MPR121.cpp b/lib/Adafruit_MPR121/Adafruit_MPR121.cpp index 6c1b6f22d..061b0de37 100644 --- a/lib/Adafruit_MPR121/Adafruit_MPR121.cpp +++ b/lib/Adafruit_MPR121/Adafruit_MPR121.cpp @@ -20,7 +20,7 @@ Adafruit_MPR121::Adafruit_MPR121() { } boolean Adafruit_MPR121::begin(uint8_t i2caddr) { - Wire.begin(); + //Wire.begin(); called in ESPEasy framework _i2caddr = i2caddr; diff --git a/lib/Adafruit_Motor_Shield_V2/Adafruit_MotorShield.cpp b/lib/Adafruit_Motor_Shield_V2/Adafruit_MotorShield.cpp index b43228f59..ebbcf83df 100644 --- a/lib/Adafruit_Motor_Shield_V2/Adafruit_MotorShield.cpp +++ b/lib/Adafruit_Motor_Shield_V2/Adafruit_MotorShield.cpp @@ -44,7 +44,7 @@ Adafruit_MotorShield::Adafruit_MotorShield(uint8_t addr) { void Adafruit_MotorShield::begin(uint16_t freq) { // init PWM w/_freq - WIRE.begin(); + //Wire.begin(); called in ESPEasy framework _pwm.begin(); _freq = freq; _pwm.setPWMFreq(_freq); // This is the maximum PWM frequency diff --git a/lib/Adafruit_Motor_Shield_V2/utility/Adafruit_MS_PWMServoDriver.cpp b/lib/Adafruit_Motor_Shield_V2/utility/Adafruit_MS_PWMServoDriver.cpp index 17632091e..c9a3989af 100644 --- a/lib/Adafruit_Motor_Shield_V2/utility/Adafruit_MS_PWMServoDriver.cpp +++ b/lib/Adafruit_Motor_Shield_V2/utility/Adafruit_MS_PWMServoDriver.cpp @@ -1,17 +1,17 @@ -/*************************************************** +/*************************************************** This is a library for our Adafruit 16-channel PWM & Servo driver Pick one up today in the adafruit shop! ------> http://www.adafruit.com/products/815 - These displays use I2C to communicate, 2 pins are required to + These displays use I2C to communicate, 2 pins are required to interface. For Arduino UNOs, thats SCL -> Analog 5, SDA -> Analog 4 - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing products from Adafruit! - Written by Limor Fried/Ladyada for Adafruit Industries. + Written by Limor Fried/Ladyada for Adafruit Industries. BSD license, all text above must be included in any redistribution ****************************************************/ @@ -29,7 +29,7 @@ Adafruit_MS_PWMServoDriver::Adafruit_MS_PWMServoDriver(uint8_t addr) { } void Adafruit_MS_PWMServoDriver::begin(void) { - WIRE.begin(); + //Wire.begin(); called in ESPEasy framework reset(); } @@ -41,7 +41,7 @@ void Adafruit_MS_PWMServoDriver::reset(void) { void Adafruit_MS_PWMServoDriver::setPWMFreq(float freq) { //Serial.print("Attempting to set freq "); //Serial.println(freq); - + freq *= 0.9; // Correct for overshoot in the frequency setting (see issue #11). float prescaleval = 25000000; @@ -50,8 +50,8 @@ void Adafruit_MS_PWMServoDriver::setPWMFreq(float freq) { prescaleval -= 1; //Serial.print("Estimated pre-scale: "); Serial.println(prescaleval); uint8_t prescale = floor(prescaleval + 0.5); - //Serial.print("Final pre-scale: "); Serial.println(prescale); - + //Serial.print("Final pre-scale: "); Serial.println(prescale); + uint8_t oldmode = read8(PCA9685_MODE1); uint8_t newmode = (oldmode&0x7F) | 0x10; // sleep write8(PCA9685_MODE1, newmode); // go to sleep diff --git a/lib/Adafruit_TCS34725/Adafruit_TCS34725.cpp b/lib/Adafruit_TCS34725/Adafruit_TCS34725.cpp index a18816ffb..186c77515 100644 --- a/lib/Adafruit_TCS34725/Adafruit_TCS34725.cpp +++ b/lib/Adafruit_TCS34725/Adafruit_TCS34725.cpp @@ -119,7 +119,7 @@ void Adafruit_TCS34725::enable(void) { write8(TCS34725_ENABLE, TCS34725_ENABLE_PON); delay(3); - write8(TCS34725_ENABLE, TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN); + write8(TCS34725_ENABLE, TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN); } /**************************************************************************/ @@ -144,7 +144,7 @@ void Adafruit_TCS34725::disable(void) Constructor */ /**************************************************************************/ -Adafruit_TCS34725::Adafruit_TCS34725(tcs34725IntegrationTime_t it, tcs34725Gain_t gain) +Adafruit_TCS34725::Adafruit_TCS34725(tcs34725IntegrationTime_t it, tcs34725Gain_t gain) { _tcs34725Initialised = false; _tcs34725IntegrationTime = it; @@ -161,10 +161,10 @@ Adafruit_TCS34725::Adafruit_TCS34725(tcs34725IntegrationTime_t it, tcs34725Gain_ doing anything else) */ /**************************************************************************/ -boolean Adafruit_TCS34725::begin(void) +boolean Adafruit_TCS34725::begin(void) { - Wire.begin(); - + //Wire.begin(); called in ESPEasy framework + /* Make sure we're actually connected */ uint8_t x = read8(TCS34725_ID); if ((x != 0x44) && (x != 0x10)) @@ -182,7 +182,7 @@ boolean Adafruit_TCS34725::begin(void) return true; } - + /**************************************************************************/ /*! Sets the integration time for the TC34725 @@ -228,7 +228,7 @@ void Adafruit_TCS34725::getRawData (uint16_t *r, uint16_t *g, uint16_t *b, uint1 *r = read16(TCS34725_RDATAL); *g = read16(TCS34725_GDATAL); *b = read16(TCS34725_BDATAL); - + /* Set a delay for the integration time */ switch (_tcs34725IntegrationTime) { diff --git a/lib/Adafruit_TSL2591/Adafruit_TSL2591.cpp b/lib/Adafruit_TSL2591/Adafruit_TSL2591.cpp index 839dadbb5..d6d7118f5 100644 --- a/lib/Adafruit_TSL2591/Adafruit_TSL2591.cpp +++ b/lib/Adafruit_TSL2591/Adafruit_TSL2591.cpp @@ -68,7 +68,7 @@ Adafruit_TSL2591::Adafruit_TSL2591(int32_t sensorID) boolean Adafruit_TSL2591::begin(void) { - Wire.begin(); + //Wire.begin(); called in ESPEasy framework /* for (uint8_t i=0; i<0x20; i++) diff --git a/lib/LiquidCrystal_I2C/LiquidCrystal_I2C.cpp b/lib/LiquidCrystal_I2C/LiquidCrystal_I2C.cpp index 9dea08c59..37143d30a 100755 --- a/lib/LiquidCrystal_I2C/LiquidCrystal_I2C.cpp +++ b/lib/LiquidCrystal_I2C/LiquidCrystal_I2C.cpp @@ -28,17 +28,17 @@ inline void LiquidCrystal_I2C::write(uint8_t value) { // When the display powers up, it is configured as follows: // // 1. Display clear -// 2. Function set: -// DL = 1; 8-bit interface data -// N = 0; 1-line display -// F = 0; 5x8 dot character font -// 3. Display on/off control: -// D = 0; Display off -// C = 0; Cursor off -// B = 0; Blinking off -// 4. Entry mode set: +// 2. Function set: +// DL = 1; 8-bit interface data +// N = 0; 1-line display +// F = 0; 5x8 dot character font +// 3. Display on/off control: +// D = 0; Display off +// C = 0; Cursor off +// B = 0; Blinking off +// 4. Entry mode set: // I/D = 1; Increment by 1 -// S = 0; No shift +// S = 0; No shift // // Note, however, that resetting the Arduino doesn't reset the LCD, so we // can't assume that its in that state when a sketch starts (and the @@ -63,9 +63,9 @@ void LiquidCrystal_I2C::init(){ void LiquidCrystal_I2C::init_priv() { - Wire.begin(); + //Wire.begin(); called in ESPEasy framework _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS; - begin(_cols, _rows); + begin(_cols, _rows); } void LiquidCrystal_I2C::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) { @@ -82,8 +82,8 @@ void LiquidCrystal_I2C::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) { // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION! // according to datasheet, we need at least 40ms after power rises above 2.7V // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50 - delay(50); - + delay(50); + // Now we pull both RS and R/W low to begin commands expanderWrite(_backlightval); // reset expanderand turn backlight off (Bit 8 =1) delay(1000); @@ -91,41 +91,41 @@ void LiquidCrystal_I2C::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) { //put the LCD into 4 bit mode // this is according to the hitachi HD44780 datasheet // figure 24, pg 46 - + // we start in 8bit mode, try to set 4 bit mode write4bits(0x03 << 4); delayMicroseconds(4500); // wait min 4.1ms - + // second try write4bits(0x03 << 4); delayMicroseconds(4500); // wait min 4.1ms - + // third go! - write4bits(0x03 << 4); + write4bits(0x03 << 4); delayMicroseconds(150); - + // finally, set to 4-bit interface - write4bits(0x02 << 4); + write4bits(0x02 << 4); // set # lines, font size, etc. - command(LCD_FUNCTIONSET | _displayfunction); - + command(LCD_FUNCTIONSET | _displayfunction); + // turn the display on with no cursor or blinking default _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF; display(); - + // clear it off clear(); - + // Initialize to default text direction (for roman languages) _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT; - + // set the entry mode command(LCD_ENTRYMODESET | _displaymode); - + home(); - + } /********** high level commands, for the user! */ @@ -256,7 +256,7 @@ void LiquidCrystal_I2C::send(uint8_t value, uint8_t mode) { uint8_t highnib=value&0xf0; uint8_t lownib=(value<<4)&0xf0; write4bits((highnib)|mode); - write4bits((lownib)|mode); + write4bits((lownib)|mode); } void LiquidCrystal_I2C::write4bits(uint8_t value) { @@ -264,19 +264,19 @@ void LiquidCrystal_I2C::write4bits(uint8_t value) { pulseEnable(value); } -void LiquidCrystal_I2C::expanderWrite(uint8_t _data){ +void LiquidCrystal_I2C::expanderWrite(uint8_t _data){ Wire.beginTransmission(_Addr); printIIC((int)(_data) | _backlightval); - Wire.endTransmission(); + Wire.endTransmission(); } void LiquidCrystal_I2C::pulseEnable(uint8_t _data){ expanderWrite(_data | En); // En high delayMicroseconds(1); // enable pulse must be >450ns - + expanderWrite(_data & ~En); // En low delayMicroseconds(50); // commands need > 37us to settle -} +} // Alias functions @@ -311,7 +311,7 @@ void LiquidCrystal_I2C::setBacklight(uint8_t new_val){ void LiquidCrystal_I2C::printstr(const char c[]){ //This function is not identical to the function used for "real" I2C displays - //it's here so the user sketch doesn't have to be changed + //it's here so the user sketch doesn't have to be changed print(c); } @@ -329,4 +329,3 @@ void LiquidCrystal_I2C::draw_horizontal_graph(uint8_t row, uint8_t column, uint8 void LiquidCrystal_I2C::draw_vertical_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_row_end){} void LiquidCrystal_I2C::setContrast(uint8_t new_val){} #pragma GCC diagnostic pop - diff --git a/lib/SparkFun_APDS-9960_Sensor_Arduino_Library/src/SparkFun_APDS9960.cpp b/lib/SparkFun_APDS-9960_Sensor_Arduino_Library/src/SparkFun_APDS9960.cpp index 0da196ca9..f11ec50ec 100644 --- a/lib/SparkFun_APDS-9960_Sensor_Arduino_Library/src/SparkFun_APDS9960.cpp +++ b/lib/SparkFun_APDS-9960_Sensor_Arduino_Library/src/SparkFun_APDS9960.cpp @@ -57,7 +57,7 @@ bool SparkFun_APDS9960::init() uint8_t id; /* Initialize I2C */ - Wire.begin(); + //Wire.begin(); called in ESPEasy framework /* Read ID register and check against known values for APDS-9960 */ if( !wireReadDataByte(APDS9960_ID, id) ) { diff --git a/src/_P015_TSL2561.ino b/src/_P015_TSL2561.ino index 1d5911e16..5b8ef5430 100644 --- a/src/_P015_TSL2561.ino +++ b/src/_P015_TSL2561.ino @@ -34,7 +34,7 @@ byte _error; boolean plugin_015_begin() { - Wire.begin(); + //Wire.begin(); called in ESPEasy framework return(true); }