diff --git a/esp32/include/HomieConfiguration.h b/esp32/include/HomieConfiguration.h index af3070d..1d8f377 100644 --- a/esp32/include/HomieConfiguration.h +++ b/esp32/include/HomieConfiguration.h @@ -36,6 +36,7 @@ HomieNode sensorLipo("lipo", "Battery Status", "Lipo"); HomieNode sensorSolar("solar", "Solar Status", "Solarpanel"); HomieNode sensorWater("water", "WaterSensor", "Water"); HomieNode sensorTemp("temperature", "Temperature", "temperature"); +HomieNode startupReason("startupReason", "startupReason", "startupReason"); HomieNode stayAlive("stay", "alive", "alive"); /**< Necessary for Mqtt Active Command */ /* @} */ diff --git a/esp32/include/WakeReason.h b/esp32/include/WakeReason.h new file mode 100644 index 0000000..5cf382a --- /dev/null +++ b/esp32/include/WakeReason.h @@ -0,0 +1,18 @@ +#ifndef WAKEUP_REASON_H +#define WAKEUP_REASON_H + +#define WAKEUP_REASON_UNDEFINED 0 +#define WAKEUP_REASON_TEMP1_CHANGE 2 +#define WAKEUP_REASON_TEMP2_CHANGE 3 +#define WAKEUP_REASON_BATTERY_CHANGE 4 +#define WAKEUP_REASON_SOLAR_CHANGE 5 +#define WAKEUP_REASON_RTC_MISSING 6 +#define WAKEUP_REASON_TIME_UNSET 7 +#define WAKEUP_REASON_MODE2_WAKEUP_TIMER 8 + + +#define WAKEUP_REASON_MOIST_CHANGE 20 //20-26 +#define WAKEUP_REASON_PLANT_DRY 30 //30-36 + + +#endif \ No newline at end of file diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index 666887e..d386447 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -17,6 +17,7 @@ #include "time.h" #include "esp_sleep.h" #include "RunningMedian.h" +#include "WakeReason.h" #include #include @@ -45,13 +46,16 @@ RTC_DATA_ATTR int lastPumpRunning = 0; RTC_DATA_ATTR long lastWaterValue = 0; RTC_DATA_ATTR float rtcLastTemp1 = 0.0f; RTC_DATA_ATTR float rtcLastTemp2 = 0.0f; +RTC_DATA_ATTR float rtcLastBatteryVoltage = 0.0f; +RTC_DATA_ATTR float rtcLastSolarVoltage = 0.0f; RTC_DATA_ATTR int gBootCount = 0; RTC_DATA_ATTR int gCurrentPlant = 0; /**< Value Range: 1 ... 7 (0: no plant needs water) */ -bool warmBoot = true; +int wakeUpReason = WAKEUP_REASON_UNDEFINED; bool volatile mode3Active = false; /**< Controller must not sleep */ bool volatile mDeepsleep = false; + int plantSensor1 = 0; int mWaterGone = -1; /**< Amount of centimeter, where no water is seen */ @@ -232,6 +236,7 @@ void mode2MQTT() sensorLipo.setProperty("volt").send(String(getBatteryVoltage())); sensorSolar.setProperty("percent").send(String((100 * solarRawSensor.getAverage()) / 4095)); sensorSolar.setProperty("volt").send(String(getSolarVoltage())); + startupReason.setProperty("startupReason").send(String(wakeUpReason)); float t1 = temp1.getMedian(); if (t1 != NAN) @@ -372,6 +377,7 @@ bool readSensors() setLastMoisture(i, current); if (tmp) { + wakeUpReason = WAKEUP_REASON_MOIST_CHANGE + i; leaveMode1 = true; Serial.printf("Mode2 start due to moist delta in plant %d with %ld \r\n", i, delta); } @@ -399,17 +405,28 @@ bool readSensors() delay(50); } - if ((temp1.getAverage() - rtcLastTemp1 > TEMPERATURE_DELTA_TRIGGER_IN_C) || - (rtcLastTemp1 - temp1.getAverage() > TEMPERATURE_DELTA_TRIGGER_IN_C)) { + if (abs(temp1.getAverage() - rtcLastTemp1 > TEMPERATURE_DELTA_TRIGGER_IN_C)) { + leaveMode1 = true; + wakeUpReason = WAKEUP_REASON_TEMP1_CHANGE; + } + if (abs(temp2.getAverage() - rtcLastTemp2 > TEMPERATURE_DELTA_TRIGGER_IN_C)) { + wakeUpReason = WAKEUP_REASON_TEMP2_CHANGE; leaveMode1 = true; } - if ((temp2.getAverage() - rtcLastTemp2 > TEMPERATURE_DELTA_TRIGGER_IN_C) || - (rtcLastTemp2 - temp2.getAverage() > TEMPERATURE_DELTA_TRIGGER_IN_C)) { + + if (abs(getBatteryVoltage() - rtcLastBatteryVoltage > LIPO_DELTA_VOLT_ADC)) { + wakeUpReason = WAKEUP_REASON_BATTERY_CHANGE; + leaveMode1 = true; + } + if (abs(getSolarVoltage() - rtcLastSolarVoltage > SOLAR_DELTA_VOLT_ADC)) { + wakeUpReason = WAKEUP_REASON_SOLAR_CHANGE; leaveMode1 = true; } rtcLastTemp1 = temp1.getAverage(); rtcLastTemp2 = temp2.getAverage(); + rtcLastBatteryVoltage = getBatteryVoltage(); + rtcLastSolarVoltage = getSolarVoltage(); /* Use the Ultrasonic sensor to measure waterLevel */ digitalWrite(SENSOR_SR04_TRIG, LOW); @@ -608,6 +625,7 @@ void systemInit() .setDatatype("number") .setUnit("V"); sensorWater.advertise("remaining").setDatatype("number").setUnit("%"); + startupReason.advertise("startupReason").setDatatype("number").setUnit("Enum"); } stayAlive.advertise("alive").setName("Alive").setDatatype("number").settable(aliveHandler); } @@ -627,6 +645,7 @@ bool mode1() } if (rtcDeepSleepTime == 0) { + wakeUpReason = WAKEUP_REASON_RTC_MISSING; Serial.println("1 missing rtc value, going to mode2"); return true; } @@ -635,6 +654,7 @@ bool mode1() long trigger = getMoistureTrigger(i); if (trigger == 0) { + wakeUpReason = WAKEUP_REASON_RTC_MISSING; Serial << "Missing rtc trigger " << i << endl; return true; } @@ -650,6 +670,7 @@ bool mode1() if (raw > trigger) { Serial << "plant " << i << " dry " << raw << " / " << trigger << " starting mode 2" << endl; + wakeUpReason = WAKEUP_REASON_PLANT_DRY + i; return true; } } @@ -661,10 +682,12 @@ bool mode1() { Serial.println("Starting mode 2 due to missing ntp"); //missing ntp time boot to mode3 + wakeUpReason = WAKEUP_REASON_TIME_UNSET; return true; } if (gotoMode2AfterThisTimestamp < cTime) { + wakeUpReason = WAKEUP_REASON_MODE2_WAKEUP_TIMER; Serial.println("Starting mode 2 after specified mode1 time"); return true; }