Merge branch 'develop' into sherzog_dev
This commit is contained in:
commit
c68e136985
@ -25,4 +25,4 @@ lib_deps =
|
||||
; MQTT@^2.4.7
|
||||
PubSubClient@^2.8
|
||||
ArduinoNvs@^2.5
|
||||
; ESPRandom@^1.3.3
|
||||
ESPRandom@^1.3.3
|
||||
@ -8,10 +8,14 @@ extern "C" {
|
||||
#include "freertos/timers.h"
|
||||
}
|
||||
|
||||
#define MQTT_VALVE_COMMAND MQTT_TOPIC_BASE_SUB "/" MQTT_DEVICE_ID "/valve"
|
||||
#define MQTT_SOIL_PROPERTIES MQTT_TOPIC_BASE_SUB "/" MQTT_DEVICE_ID "/soil"
|
||||
#define MQTT_LIGHT_PROPERTIES MQTT_TOPIC_BASE_SUB "/" MQTT_DEVICE_ID "/light"
|
||||
#define MQTT_AUTO_PROPERTIES MQTT_TOPIC_BASE_SUB "/" MQTT_DEVICE_ID "/automatic"
|
||||
// #define MQTT_VALVE_COMMAND(device_id) (MQTT_TOPIC_BASE_SUB "/" device_id "/valve")
|
||||
// #define MQTT_SOIL_PROPERTIES(device_id) (MQTT_TOPIC_BASE_SUB "/" device_id "/soil")
|
||||
// #define MQTT_LIGHT_PROPERTIES(device_id) (MQTT_TOPIC_BASE_SUB "/" device_id "/light")
|
||||
// #define MQTT_AUTO_PROPERTIES(device_id) (MQTT_TOPIC_BASE_SUB "/" device_id "/automatic")
|
||||
char MQTT_VALVE_COMMAND[72];
|
||||
char MQTT_SOIL_PROPERTIES[72];
|
||||
char MQTT_LIGHT_PROPERTIES[72];
|
||||
char MQTT_AUTO_PROPERTIES[72];
|
||||
|
||||
TimerHandle_t mqttReconnectTimer;
|
||||
TimerHandle_t wifiReconnectTimer;
|
||||
@ -56,7 +60,7 @@ void connectMQTT() {
|
||||
// mqttClient.begin(MQTT_HOST, MQTT_PORT, client);
|
||||
mqttClient.setServer(MQTT_HOST, MQTT_PORT);
|
||||
mqttClient.disconnect();
|
||||
mqttClient.connect(MQTT_DEVICE_ID);
|
||||
mqttClient.connect(getDeviceIDcharArr());
|
||||
if (mqttClient.connected()) {
|
||||
Serial.println("Connected!");
|
||||
} else {
|
||||
@ -161,7 +165,32 @@ void onMqttMessage(char *topic, byte *payload, unsigned int payload_length) {
|
||||
}
|
||||
}
|
||||
|
||||
void constructMQTTpaths() {
|
||||
strcpy(MQTT_VALVE_COMMAND, MQTT_TOPIC_BASE_SUB "/");
|
||||
strcat(MQTT_VALVE_COMMAND, getDeviceIDcharArr());
|
||||
strcat(MQTT_VALVE_COMMAND, "/valve");
|
||||
|
||||
strcpy(MQTT_SOIL_PROPERTIES, MQTT_TOPIC_BASE_SUB "/");
|
||||
strcat(MQTT_SOIL_PROPERTIES, getDeviceIDcharArr());
|
||||
strcat(MQTT_SOIL_PROPERTIES, "/soil");
|
||||
|
||||
strcpy(MQTT_LIGHT_PROPERTIES, MQTT_TOPIC_BASE_SUB "/");
|
||||
strcat(MQTT_LIGHT_PROPERTIES, getDeviceIDcharArr());
|
||||
strcat(MQTT_LIGHT_PROPERTIES, "/light");
|
||||
|
||||
strcpy(MQTT_AUTO_PROPERTIES, MQTT_TOPIC_BASE_SUB "/");
|
||||
strcat(MQTT_AUTO_PROPERTIES, getDeviceIDcharArr());
|
||||
strcat(MQTT_AUTO_PROPERTIES, "/automatic");
|
||||
|
||||
Serial.println("MQTT_COMMANDS:");
|
||||
Serial.println(MQTT_VALVE_COMMAND);
|
||||
Serial.println(MQTT_SOIL_PROPERTIES);
|
||||
Serial.println(MQTT_LIGHT_PROPERTIES);
|
||||
Serial.println(MQTT_AUTO_PROPERTIES);
|
||||
}
|
||||
|
||||
void setupConnections() {
|
||||
constructMQTTpaths();
|
||||
Serial.println();
|
||||
Serial.println();
|
||||
disableCore0WDT();
|
||||
|
||||
@ -55,10 +55,8 @@
|
||||
// MQTT
|
||||
#define MQTT_HOST "mqtt.timovolkmann.de"
|
||||
#define MQTT_PORT 1883
|
||||
#define MQTT_DEVICE_ID "esp-timo"
|
||||
#define MQTT_TOPIC_BASE_SUB "smartgarden/commands"
|
||||
#define MQTT_TOPIC_BASE_PUB "smartgarden/updates"
|
||||
#define MQTT_PATH_PUB MQTT_TOPIC_BASE_PUB "/" MQTT_DEVICE_ID "/"
|
||||
#define MQTT_PATH_SUB MQTT_TOPIC_BASE_SUB "/#"
|
||||
// MQTT_DEVICE_ID "/#"
|
||||
|
||||
@ -106,5 +104,9 @@ void restoreAutoProps();
|
||||
void persistAutoProps(bool light, bool irrigation);
|
||||
void setAutoProperties(bool light, bool irrigation);
|
||||
|
||||
void initDeviceID();
|
||||
String getDeviceID();
|
||||
const char *getDeviceIDcharArr();
|
||||
|
||||
void takeSemaphore();
|
||||
void releaseSemaphore();
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
#include <ArduinoJson.h>
|
||||
#include <ArduinoNvs.h>
|
||||
#include <ESPRandom.h>
|
||||
#include <header.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <string>
|
||||
//using namespace std;
|
||||
@ -9,7 +11,7 @@ extern "C" {
|
||||
#include "freertos/task.h"
|
||||
}
|
||||
|
||||
#define MQTT_SENSOR_DATA MQTT_PATH_PUB "data"
|
||||
char MQTT_SENSOR_DATA_TOPIC[64];
|
||||
|
||||
char buffer[128];
|
||||
|
||||
@ -24,6 +26,8 @@ int minimumLightValueLX = 50;
|
||||
// switches for automatic light and irrigation control
|
||||
bool automaticLight = true;
|
||||
bool automaticIrrigation = true;
|
||||
// make sure device irrigates until fieldcapacity is reached
|
||||
bool irrigateUntilFC = false;
|
||||
|
||||
void readSensors() {
|
||||
Serial.println();
|
||||
@ -40,12 +44,7 @@ void readSensors() {
|
||||
int mstValue = readCapacitiveSoilMoistureSensor();
|
||||
Serial.print("Soil moisture: ");
|
||||
Serial.println(mstValue);
|
||||
// if (mstValue > fieldCapacity) {
|
||||
// Serial.println("Field capacity reached. No irrigation needed. ");
|
||||
// }
|
||||
// if (mstValue < permanentWiltingPoint) {
|
||||
// Serial.println("Permanent wilting point reached. Plant needs irrigation. ");
|
||||
// }
|
||||
|
||||
if (automaticIrrigation) {
|
||||
toggleValve(true);
|
||||
}
|
||||
@ -64,7 +63,7 @@ void readSensors() {
|
||||
|
||||
doc["temperature"] = temperatureValue;
|
||||
serializeJson(doc, buffer);
|
||||
publishMessage(MQTT_SENSOR_DATA, buffer);
|
||||
publishMessage(MQTT_SENSOR_DATA_TOPIC, buffer);
|
||||
}
|
||||
|
||||
bool openValve() {
|
||||
@ -83,16 +82,18 @@ bool closeValve() {
|
||||
|
||||
void valveTask(void *parameter) {
|
||||
takeSemaphore();
|
||||
bool isAutomatic = (bool)parameter;
|
||||
Serial.println("Valve task triggered.");
|
||||
bool isAutomatic = (bool) parameter;
|
||||
Serial.print(isAutomatic);
|
||||
Serial.println(" Valve task triggered.");
|
||||
unsigned long valveTimeoutTimer = millis();
|
||||
bool valveOpen = false;
|
||||
int initialSoilMoisture = readCapacitiveSoilMoistureSensor();
|
||||
|
||||
if (initialSoilMoisture > permanentWiltingPoint) {
|
||||
Serial.println("Soil contains enough water. No irrigation needed. ");
|
||||
} else {
|
||||
if (initialSoilMoisture <= permanentWiltingPoint || irrigateUntilFC) {
|
||||
valveOpen = openValve();
|
||||
irrigateUntilFC = true;
|
||||
} else {
|
||||
Serial.println("Soil contains enough water. No irrigation needed. ");
|
||||
}
|
||||
|
||||
while (valveOpen) {
|
||||
@ -102,6 +103,7 @@ void valveTask(void *parameter) {
|
||||
if (mstValue > fieldCapacity) { // && isAutomatic
|
||||
Serial.println("Field capacity reached. No irrigation needed. ");
|
||||
valveOpen = closeValve();
|
||||
irrigateUntilFC = false;
|
||||
}
|
||||
if (millis() - valveTimeoutTimer >= MAX_VALVE_TIMEOUT) {
|
||||
Serial.println("Irrigation timeout reached. close valve. ");
|
||||
@ -161,10 +163,18 @@ void restoreSoilProps() {
|
||||
}
|
||||
|
||||
void setupStore() {
|
||||
|
||||
NVS.begin("store");
|
||||
initDeviceID();
|
||||
restoreSoilProps();
|
||||
restoreLightProps();
|
||||
restoreAutoProps();
|
||||
|
||||
strcpy(MQTT_SENSOR_DATA_TOPIC, MQTT_TOPIC_BASE_PUB "/");
|
||||
strcat(MQTT_SENSOR_DATA_TOPIC, getDeviceIDcharArr());
|
||||
strcat(MQTT_SENSOR_DATA_TOPIC, "/data");
|
||||
Serial.println("MQTT_SENSOR_DATA_TOPIC:");
|
||||
Serial.println(MQTT_SENSOR_DATA_TOPIC);
|
||||
}
|
||||
|
||||
void setSoilProperties(int FC, int PWP, int SAT) {
|
||||
@ -247,4 +257,30 @@ void setAutoProperties(bool light, bool irrigation) {
|
||||
Serial.print("new auto settings: ");
|
||||
Serial.println(automaticLight);
|
||||
Serial.println(automaticIrrigation);
|
||||
}
|
||||
|
||||
String DEVICE_ID = "";
|
||||
|
||||
void initDeviceID() {
|
||||
DEVICE_ID = NVS.getString("UUID");
|
||||
if (!DEVICE_ID.isEmpty()) {
|
||||
Serial.print("Fetched Device ID from NVS: ");
|
||||
Serial.println(DEVICE_ID);
|
||||
} else {
|
||||
uint8_t uuid[16];
|
||||
ESPRandom::uuid(uuid);
|
||||
DEVICE_ID = ESPRandom::uuidToString(uuid);
|
||||
NVS.setString("UUID", DEVICE_ID);
|
||||
NVS.commit();
|
||||
Serial.print("New Device ID: ");
|
||||
Serial.println(DEVICE_ID);
|
||||
}
|
||||
}
|
||||
|
||||
String getDeviceID() {
|
||||
return DEVICE_ID;
|
||||
}
|
||||
|
||||
const char* getDeviceIDcharArr() {
|
||||
return DEVICE_ID.c_str();
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user