Merge branch 'develop' into sherzog_dev

This commit is contained in:
Sebastian 2020-07-22 16:52:35 +02:00
commit c68e136985
4 changed files with 88 additions and 21 deletions

View File

@ -25,4 +25,4 @@ lib_deps =
; MQTT@^2.4.7
PubSubClient@^2.8
ArduinoNvs@^2.5
; ESPRandom@^1.3.3
ESPRandom@^1.3.3

View File

@ -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();

View File

@ -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();

View File

@ -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();
}