Hardware components | ||||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
Software apps and online services | ||||||
| ||||||
| ||||||
|
This project will be focusing on automating water tank systems to reduce human interference. The concept of supervisory control and data acquisition(SCADA) is used to create a real-time system that gathers data from edge level sensors and display it on remote dashboard in forms of graphs and other dashboard nodes. Supervisory control will be from the dashboard itself with the switch between automatic and manual controls.
The dashboard is created using NodeRed with data transfer using MQTT protocol.
Examining the process flow diagram carefully, it is easily comprehensible the tank levels being represented by circular level gauges and the flow levels being represented by semicircular gauges. Both the Valves have the switches with the pump switch in between them.
The data from the level sensors(Ultrasonic sensors) and the flow sensors are being plotted in the graphs below, respectively.
The soil moisture data is being fed by the soil sensors at the edge level. The doughnut gauge replicates the real time data along with the graph the plots the data over a period of time.
Automated/Manual Controls
The new feature is added in the dashboard, the process override controls. It helps the supervisor switch in between the manual and automatic controls.
Automatic Control
During the automatic controls, both the valves and the pump comes under the direct controls of the predefined set points. The values of the set point is being checked with the supply tank level and soilmoisturedata.
When the supply tank level goes low, valve 1 and pump is activated to bring back the normal water level of the supply tank. Water is being supplied by the supply tank.
Upon abnormally low value from the soil sensor, the valve 2 is opened so as to bring back the soil moisture to normalcy by supplying water from the supply tank.
Manual Control
In this mode the supervisor has ultimate control over all the switches. The system is left on the discretion of the controller irrespective of the values from the edge level sensors. The supervisor(controller) can monitor the data being published on the gauges and graphs to take decisions with the controls.
Node RED flow
All the real-time data is being updated in the MySQL database every second for future references.
4 channel Relay module is used to control the 12v DC pump and 24V solenoid valves from the Node MCUs.
Node Red server and MQTT mosquitto server is being hosted by the raspberry-pi to decrease the latency in real time data.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "ssid";
const char* password = "pwd";
const char* mqtt_server = "192.168.x.xxx";
WiFiClient espClient;
PubSubClient client(espClient);
const int valve1=14;//D5
const int pump=12;//D6
const int valve2=13;//D7
long now = millis();
long lastMeasure = 0;
void setup() {
pinMode(valve1,OUTPUT);
pinMode(valve2,OUTPUT);
pinMode(pump,OUTPUT);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("WiFi connected - ESP IP address: ");
Serial.println(WiFi.localIP());
}
void callback(String topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
// Feel free to add more if statements to control more GPIOs with MQTT
// If a message is received on the topic valves/pump, you check if the message is either on or off. Turns the valves/pump GPIO according to the message
if(topic=="valve1"){
Serial.print("Switching valve1 to ");
if(messageTemp == "1"){
digitalWrite(valve1, HIGH);
Serial.print("On");
}
else if(messageTemp == "0"){
digitalWrite(valve1, LOW);
Serial.print("Off");
}
}
if(topic=="valve2"){
Serial.print("Switching valve2 to ");
if(messageTemp == "1"){
digitalWrite(valve2, HIGH);
Serial.print("On");
}
else if(messageTemp == "0"){
digitalWrite(valve2, LOW);
Serial.print("Off");
}
}
if(topic=="pump"){
Serial.print("Switching pump to ");
if(messageTemp == "1"){
digitalWrite(pump, HIGH);
Serial.print("On");
}
else if(messageTemp == "0"){
digitalWrite(pump, LOW);
Serial.print("Off");
}
}
Serial.println();
}
// This functions reconnects your ESP8266 to your MQTT broker
// Change the function below if you want to subscribe to more topics with your ESP8266
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("ESP8266Client")) {
Serial.println("connected");
// Subscribe or resubscribe to a topic
// You can subscribe to more topics
//Serial.println("msg valve1");
client.subscribe("valve1");
//Serial.println("msg pump");
client.subscribe("pump");
//Serial.println("msg valve2");
client.subscribe("valve2");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(3000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
if(!client.loop())
client.connect("ESP8266Client");
}
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "ssid";
const char* password = "pwd";
const char* mqtt_server = "192.168.x.xxx";
WiFiClient espClient;
PubSubClient client(espClient);
const int trig_pin_u1 = 16;//D0
const int echo_pin_u1 = 5;//D1
const int trig_pin_u2 = 4;//D2
const int echo_pin_u2 = 0;//D3
long duration_u1, duration_u2;
int distance_u1, distance_u2;
void setup() {
pinMode(trig_pin_u1, OUTPUT);
pinMode(echo_pin_u1, INPUT);
pinMode(trig_pin_u2, OUTPUT);
pinMode(echo_pin_u2, INPUT);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("WiFi connected - ESP IP address: ");
Serial.println(WiFi.localIP());
}
void level()
{
digitalWrite(trig_pin_u1, LOW);
delayMicroseconds(2);
digitalWrite(trig_pin_u1, HIGH);
delayMicroseconds(10);
digitalWrite(trig_pin_u1, LOW);
duration_u1 = pulseIn(echo_pin_u1, HIGH);
distance_u1 = (duration_u1 / 2) / 29.41;
distance_u1=9-distance_u1;
delay(500);
digitalWrite(trig_pin_u2, LOW);
delayMicroseconds(2);
digitalWrite(trig_pin_u2, HIGH);
delayMicroseconds(10);
digitalWrite(trig_pin_u2, LOW);
duration_u2 = pulseIn(echo_pin_u2, HIGH);
distance_u2 = (duration_u2 / 2) / 29.41;
distance_u2=9-distance_u2;
Serial.println(distance_u2);
}
void loop() {
if (!client.loop())
client.connect("ESP8266Client");
level();
static char d_u1[7];
static char d_u2[7];
dtostrf(distance_u1, 3, 0, d_u1);
dtostrf(distance_u2, 3, 0, d_u2);
Serial.println(d_u1);
Serial.println(d_u2);
client.publish("u1", d_u1);
client.publish("u2", d_u2);
delay(1000);
}
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "ssid";
const char* password = "pwd";
const char* mqtt_server = "192.168.x.xxx";
WiFiClient espClient;
PubSubClient client(espClient);
const long soil=A0;//A0
void setup()
{
pinMode(soil,INPUT);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("WiFi connected - ESP IP address: ");
Serial.println(WiFi.localIP());
}
// This functions reconnects your ESP8266 to your MQTT broker
// Change the function below if you want to subscribe to more topics with your ESP8266
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
/*
YOU MIGHT NEED TO CHANGE THIS LINE, IF YOU'RE HAVING PROBLEMS WITH MQTT MULTIPLE CONNECTIONS
To change the ESP device ID, you will have to give a new name to the ESP8266.
Here's how it looks:
if (client.connect("ESP8266Client")) {
You can do it like this:
if (client.connect("ESP1_Office")) {
Then, for the other ESP:
if (client.connect("ESP2_Garage")) {
That should solve your MQTT multiple connections problem
*/
if (client.connect("ESP8266Client")) {
Serial.println("connected");
// Subscribe or resubscribe to a topic
// You can subscribe to more topics
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
if(!client.loop())
client.connect("ESP8266Client");
double soil_value=analogRead(soil);
static char soil_v[7];
dtostrf(soil_value, 6, 2, soil_v);
client.publish("soil", soil_v);
Serial.println(soil_value);
delay(10000);
}
#include <SoftwareSerial.h>
SoftwareSerial s(5,6);
unsigned long currentTime;
unsigned long cloopTime;
volatile int flow_frequency1;
unsigned int l_hour1;
const int flowsensor1 = 2;
volatile int flow_frequency2;
unsigned int l_hour2;
const int flowsensor2 = 2;
void flow1()
{
flow_frequency1++;
}
void flow2()
{
flow_frequency2++;
}
void setup()
{
pinMode(flowsensor1, INPUT);
digitalWrite(flowsensor1, HIGH);
pinMode(flowsensor2, INPUT);
digitalWrite(flowsensor2, HIGH);
Serial.begin(9600);
s.begin(9600);
attachInterrupt(0, flow1, RISING);
attachInterrupt(1, flow2, RISING);
sei(); // Enable interrupts
currentTime = millis();
cloopTime = currentTime;
}
void loop ()
{
currentTime = millis();
// Every second, calculate and print litres/hour
if(currentTime >= (cloopTime + 1000))
{
cloopTime = currentTime; // Updates cloopTime
// Pulse frequency (Hz) = 7.5Q, Q is flow rate in L/min.
l_hour1 = (flow_frequency1 * 60 / 7.5); // (Pulse frequency x 60 min) / 7.5Q = flowrate in L/hour
flow_frequency1 = 0; // Reset Counter
Serial.print(l_hour1, DEC); // Print litres/hour
Serial.println(" 1 L/hour ");
// s.write(" 1 L/hour ");
s.write(l_hour1);
cloopTime = currentTime; // Updates cloopTime
// Pulse frequency (Hz) = 7.5Q, Q is flow rate in L/min.
l_hour1 = (flow_frequency2 * 60 / 7.5); // (Pulse frequency x 60 min) / 7.5Q = flowrate in L/hour
flow_frequency2 = 0; // Reset Counter
Serial.print(l_hour2, DEC); // Print litres/hour
Serial.println(" 2 L/hour ");
//s.write(" 2 L/hour ");
s.write(l_hour2);
}
}
Flow sensor data
C/C++#include <SoftwareSerial.h>
SoftwareSerial s(D6,D5);
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "ssid";
const char* password = "pwd";
const char* mqtt_server = "192.168.x.xxx";
WiFiClient espClient;
PubSubClient client(espClient);
int flowdata1;
int flowdata2;
void setup() {
s.begin(9600);
Serial.begin(9600);
setup_wifi();
client.setServer(mqtt_server, 1883);
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("WiFi connected - ESP IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
//s.write("s");
if (s.available()>0)
{
flowdata1=s.read();
flowdata2=s.read();
Serial.println(flowdata1);
Serial.println(flowdata2);
}
if (!client.loop())
client.connect("ESP8266Client");
static char d_f1[7];
static char d_f2[7];
dtostrf(flowdata1, 3, 0, d_f1);
dtostrf(flowdata2, 3, 0, d_f2);
Serial.println(d_f1);
Serial.println(d_f2);
client.publish("f1", d_f1);
client.publish("f2", d_f2);
delay(500);
}
[
{
"id": "c855e9c5.011388",
"type": "tab",
"label": "Water scada",
"disabled": false,
"info": ""
},
{
"id": "478bd80d.d86d98",
"type": "ui_switch",
"z": "c855e9c5.011388",
"name": "valve1",
"label": "Valve 1",
"tooltip": "",
"group": "3220d566.3df42a",
"order": 26,
"width": 3,
"height": 2,
"passthru": true,
"decouple": "false",
"topic": "",
"style": "",
"onvalue": "1",
"onvalueType": "num",
"onicon": "",
"oncolor": "",
"offvalue": "0",
"offvalueType": "num",
"officon": "",
"offcolor": "",
"x": 630,
"y": 520,
"wires": [
[
"66a7b37f.1dbe3c",
"e8c3b069.5d3e8"
]
]
},
{
"id": "dfb491d5.b4d48",
"type": "ui_switch",
"z": "c855e9c5.011388",
"name": "",
"label": "Pump",
"tooltip": "",
"group": "3220d566.3df42a",
"order": 28,
"width": 3,
"height": 2,
"passthru": true,
"decouple": "false",
"topic": "",
"style": "",
"onvalue": "1",
"onvalueType": "num",
"onicon": "",
"oncolor": "",
"offvalue": "0",
"offvalueType": "num",
"officon": "",
"offcolor": "",
"x": 630,
"y": 600,
"wires": [
[
"6f556440.9993ac",
"89af0749.ee26f8"
]
]
},
{
"id": "7e4780f6.043cf",
"type": "ui_switch",
"z": "c855e9c5.011388",
"name": "",
"label": "Valve 2",
"tooltip": "",
"group": "3220d566.3df42a",
"order": 30,
"width": 3,
"height": 2,
"passthru": true,
"decouple": "false",
"topic": "",
"style": "",
"onvalue": "1",
"onvalueType": "num",
"onicon": "",
"oncolor": "",
"offvalue": "0",
"offvalueType": "num",
"officon": "",
"offcolor": "",
"x": 640,
"y": 700,
"wires": [
[
"53308e00.f4e86",
"530efc4c.279294"
]
]
},
{
"id": "dabdca45.254408",
"type": "ui_gauge",
"z": "c855e9c5.011388",
"name": "f1",
"group": "3220d566.3df42a",
"order": 11,
"width": 4,
"height": 4,
"gtype": "gage",
"title": "",
"label": "L/min",
"format": "{{value}}",
"min": 0,
"max": "1000",
"colors": [
"#00b500",
"#e6e600",
"#ca3838"
],
"seg1": "",
"seg2": "",
"x": 930,
"y": 200,
"wires": []
},
{
"id": "8ff1e461.64ee78",
"type": "ui_chart",
"z": "c855e9c5.011388",
"name": "f1",
"group": "3220d566.3df42a",
"order": 38,
"width": 4,
"height": 4,
"label": "Supply Tank Inlet Flow",
"chartType": "line",
"legend": "false",
"xformat": "HH:mm:ss",
"interpolate": "linear",
"nodata": "",
"dot": false,
"ymin": "",
"ymax": "",
"removeOlder": 1,
"removeOlderPoints": "",
"removeOlderUnit": "3600",
"cutout": 0,
"useOneColor": false,
"colors": [
"#1f77b4",
"#aec7e8",
"#ff7f0e",
"#2ca02c",
"#98df8a",
"#d62728",
"#ff9896",
"#9467bd",
"#c5b0d5"
],
"useOldStyle": false,
"outputs": 1,
"x": 930,
"y": 280,
"wires": [
[]
]
},
{
"id": "4234eb21.e8d9a4",
"type": "mqtt in",
"z": "c855e9c5.011388",
"name": "F1",
"topic": "f1",
"qos": "2",
"datatype": "auto",
"broker": "7cb01c98.abb984",
"x": 800,
"y": 240,
"wires": [
[
"dabdca45.254408",
"8ff1e461.64ee78",
"5aa82413.e6a61c"
]
]
},
{
"id": "27afcc60.e307c4",
"type": "ui_gauge",
"z": "c855e9c5.011388",
"name": "u2",
"group": "3220d566.3df42a",
"order": 13,
"width": 4,
"height": 4,
"gtype": "wave",
"title": "",
"label": "cm",
"format": "{{value}}",
"min": 0,
"max": "10",
"colors": [
"#00b500",
"#e6e600",
"#ca3838"
],
"seg1": "",
"seg2": "",
"x": 1270,
"y": 140,
"wires": []
},
{
"id": "f369e81e.4a7d28",
"type": "ui_chart",
"z": "c855e9c5.011388",
"name": "u2",
"group": "3220d566.3df42a",
"order": 40,
"width": 4,
"height": 4,
"label": "Supply Tank Level",
"chartType": "line",
"legend": "false",
"xformat": "HH:mm:ss",
"interpolate": "linear",
"nodata": "",
"dot": false,
"ymin": "",
"ymax": "",
"removeOlder": 1,
"removeOlderPoints": "",
"removeOlderUnit": "3600",
"cutout": 0,
"useOneColor": false,
"colors": [
"#1f77b4",
"#aec7e8",
"#ff7f0e",
"#2ca02c",
"#98df8a",
"#d62728",
"#ff9896",
"#9467bd",
"#c5b0d5"
],
"useOldStyle": false,
"outputs": 1,
"x": 1270,
"y": 240,
"wires": [
[]
]
},
{
"id": "391458e0.2db318",
"type": "mqtt in",
"z": "c855e9c5.011388",
"name": "U2",
"topic": "u2",
"qos": "2",
"datatype": "auto",
"broker": "2be9a8c0.b410d8",
"x": 1140,
"y": 200,
"wires": [
[
"27afcc60.e307c4",
"f369e81e.4a7d28",
"876a0ee9.4524e"
]
]
},
{
"id": "f1da0f51.9d594",
"type": "ui_gauge",
"z": "c855e9c5.011388",
"name": "f2",
"group": "3220d566.3df42a",
"order": 15,
"width": 4,
"height": 4,
"gtype": "gage",
"title": "",
"label": "L/min",
"format": "{{value}}",
"min": 0,
"max": "1000",
"colors": [
"#00b500",
"#e6e600",
"#ca3838"
],
"seg1": "",
"seg2": "",
"x": 1800,
"y": 260,
"wires": []
},
{
"id": "edf62057.5ad1b",
"type": "ui_chart",
"z": "c855e9c5.011388",
"name": "f2",
"group": "3220d566.3df42a",
"order": 42,
"width": 4,
"height": 4,
"label": "Outlet Flow",
"chartType": "line",
"legend": "false",
"xformat": "HH:mm:ss",
"interpolate": "linear",
"nodata": "",
"dot": false,
"ymin": "",
"ymax": "",
"removeOlder": 1,
"removeOlderPoints": "",
"removeOlderUnit": "3600",
"cutout": 0,
"useOneColor": false,
"colors": [
"#1f77b4",
"#aec7e8",
"#ff7f0e",
"#2ca02c",
"#98df8a",
"#d62728",
"#ff9896",
"#9467bd",
"#c5b0d5"
],
"useOldStyle": false,
"outputs": 1,
"x": 1800,
"y": 360,
"wires": [
[]
]
},
{
"id": "d6780b91.d5c718",
"type": "mqtt in",
"z": "c855e9c5.011388",
"name": "F2",
"topic": "f2",
"qos": "0",
"datatype": "auto",
"broker": "7cb01c98.abb984",
"x": 1670,
"y": 300,
"wires": [
[
"f1da0f51.9d594",
"edf62057.5ad1b",
"96ec9075.82fdf"
]
]
},
{
"id": "ec92c37b.00f0b",
"type": "ui_chart",
"z": "c855e9c5.011388",
"name": "u1",
"group": "3220d566.3df42a",
"order": 36,
"width": 4,
"height": 4,
"label": "Reserve Tank Level",
"chartType": "line",
"legend": "false",
"xformat": "HH:mm:ss",
"interpolate": "linear",
"nodata": "",
"dot": false,
"ymin": "",
"ymax": "",
"removeOlder": 1,
"removeOlderPoints": "",
"removeOlderUnit": "3600",
"cutout": 0,
"useOneColor": false,
"colors": [
"#1f77b4",
"#aec7e8",
"#ff7f0e",
"#2ca02c",
"#98df8a",
"#d62728",
"#ff9896",
"#9467bd",
"#c5b0d5"
],
"useOldStyle": false,
"outputs": 1,
"x": 290,
"y": 200,
"wires": [
[]
]
},
{
"id": "17b8d16f.6cec6f",
"type": "ui_gauge",
"z": "c855e9c5.011388",
"name": "u1",
"group": "3220d566.3df42a",
"order": 9,
"width": 4,
"height": 4,
"gtype": "wave",
"title": "",
"label": "cm",
"format": "{{value}}",
"min": 0,
"max": "10",
"colors": [
"#00b500",
"#e6e600",
"#ca3838"
],
"seg1": "",
"seg2": "",
"x": 290,
"y": 80,
"wires": []
},
{
"id": "99f522db.3849f",
"type": "mqtt in",
"z": "c855e9c5.011388",
"name": "U1",
"topic": "u1",
"qos": "2",
"datatype": "auto",
"broker": "2be9a8c0.b410d8",
"x": 140,
"y": 140,
"wires": [
[
"17b8d16f.6cec6f",
"ec92c37b.00f0b",
"fa621d17.e7174"
]
]
},
{
"id": "19290f7d.3ef741",
"type": "ui_text",
"z": "c855e9c5.011388",
"group": "3220d566.3df42a",
"order": 2,
"width": 4,
"height": 1,
"name": "u1",
"label": "",
"format": "Reserve Tank Level",
"layout": "row-left",
"x": 300,
"y": 140,
"wires": []
},
{
"id": "3c6653ed.128c3c",
"type": "ui_text",
"z": "c855e9c5.011388",
"group": "3220d566.3df42a",
"order": 4,
"width": 4,
"height": 1,
"name": "f1",
"label": "",
"format": "Supply Tank Inlet Flow",
"layout": "row-left",
"x": 960,
"y": 240,
"wires": []
},
{
"id": "4d9f620e.8a1f0c",
"type": "ui_text",
"z": "c855e9c5.011388",
"group": "3220d566.3df42a",
"order": 6,
"width": 4,
"height": 1,
"name": "u2",
"label": "",
"format": "Supply Tank Level",
"layout": "row-left",
"x": 1300,
"y": 200,
"wires": []
},
{
"id": "1964483a.9f7538",
"type": "ui_text",
"z": "c855e9c5.011388",
"group": "3220d566.3df42a",
"order": 8,
"width": 4,
"height": 1,
"name": "f2",
"label": "",
"format": "Outlet Flow",
"layout": "row-left",
"x": 1820,
"y": 320,
"wires": []
},
{
"id": "365f0927.ca4716",
"type": "ui_gauge",
"z": "c855e9c5.011388",
"name": "soil",
"group": "b935fee8.94039",
"order": 6,
"width": 4,
"height": 4,
"gtype": "donut",
"title": "",
"label": "MU",
"format": "{{value}}",
"min": 0,
"max": "1000",
"colors": [
"#00b500",
"#e6e600",
"#ca3838"
],
"seg1": "",
"seg2": "",
"x": 1190,
"y": 800,
"wires": []
},
{
"id": "f726206d.21911",
"type": "ui_chart",
"z": "c855e9c5.011388",
"name": "soil",
"group": "b935fee8.94039",
"order": 14,
"width": 30,
"height": 5,
"label": "Soil moisture",
"chartType": "line",
"legend": "false",
"xformat": "HH:mm:ss",
"interpolate": "linear",
"nodata": "",
"dot": false,
"ymin": "",
"ymax": "",
"removeOlder": 1,
"removeOlderPoints": "",
"removeOlderUnit": "86400",
"cutout": 0,
"useOneColor": false,
"colors": [
"#1f77b4",
"#aec7e8",
"#ff7f0e",
"#2ca02c",
"#98df8a",
"#d62728",
"#ff9896",
"#9467bd",
"#c5b0d5"
],
"useOldStyle": false,
"outputs": 1,
"x": 1190,
"y": 880,
"wires": [
[]
]
},
{
"id": "4d9aef11.e81fc",
"type": "mqtt in",
"z": "c855e9c5.011388",
"name": "soil",
"topic": "soil",
"qos": "0",
"datatype": "auto",
"broker": "2be9a8c0.b410d8",
"x": 1010,
"y": 840,
"wires": [
[
"365f0927.ca4716",
"f726206d.21911",
"1ac88e8a.700581"
]
]
},
{
"id": "8910f631.89f088",
"type": "ui_text",
"z": "c855e9c5.011388",
"group": "b935fee8.94039",
"order": 3,
"width": 4,
"height": 1,
"name": "soil",
"label": "",
"format": "Soil Moisture",
"layout": "row-left",
"x": 1220,
"y": 840,
"wires": []
},
{
"id": "d5622bb9.f0c828",
"type": "moment",
"z": "c855e9c5.011388",
"name": "",
"topic": "",
"input": "payload",
"inputType": "msg",
"inTz": "Asia/Calcutta",
"adjAmount": "",
"format": "DD/MM/YYYY HH:mm:ss",
"locale": "en_IN",
"output": "payload",
"outputType": "msg",
"outTz": "Asia/Calcutta",
"x": 380,
"y": 860,
"wires": [
[
"d1e1e651.de1458",
"b1947baf.8e27f8"
]
]
},
{
"id": "c03d22c3.5548a",
"type": "inject",
"z": "c855e9c5.011388",
"name": "",
"topic": "",
"payload": "",
"payloadType": "date",
"repeat": "1",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 170,
"y": 860,
"wires": [
[
"d5622bb9.f0c828"
]
]
},
{
"id": "9cb38005.a4c36",
"type": "moment",
"z": "c855e9c5.011388",
"name": "",
"topic": "",
"input": "payload",
"inputType": "msg",
"inTz": "Asia/Calcutta",
"adjAmount": "",
"format": "DD/MM/YYYY HH:mm:ss",
"locale": "en_IN",
"output": "payload",
"outputType": "msg",
"outTz": "Asia/Calcutta",
"x": 360,
"y": 820,
"wires": [
[
"72b2ba1f.09a4a4",
"f85ed5b2.5063b8"
]
]
},
{
"id": "3bff87fc.ef1478",
"type": "inject",
"z": "c855e9c5.011388",
"name": "",
"topic": "",
"payload": "",
"payloadType": "date",
"repeat": "1",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 170,
"y": 820,
"wires": [
[
"9cb38005.a4c36"
]
]
},
{
"id": "72b2ba1f.09a4a4",
"type": "ui_text",
"z": "c855e9c5.011388",
"group": "3220d566.3df42a",
"order": 1,
"width": 0,
"height": 0,
"name": "SCADA d/m",
"label": "Date/Time",
"format": "{{msg.payload}}",
"layout": "row-right",
"x": 620,
"y": 800,
"wires": []
},
{
"id": "d1e1e651.de1458",
"type": "ui_text",
"z": "c855e9c5.011388",
"group": "b935fee8.94039",
"order": 1,
"width": 0,
"height": 0,
"name": "soil d/m",
"label": "Date/Time",
"format": "{{msg.payload}}",
"layout": "row-left",
"x": 610,
"y": 840,
"wires": []
},
{
"id": "6e3f2fee.53562",
"type": "mysql",
"z": "c855e9c5.011388",
"mydb": "2e1d0fc3.f11a9",
"name": "",
"x": 570,
"y": 980,
"wires": [
[]
]
},
{
"id": "cc7909ca.6941f8",
"type": "ui_switch",
"z": "c855e9c5.011388",
"name": "override",
"label": "Override",
"tooltip": "",
"group": "82ffe014.05f45",
"order": 3,
"width": 7,
"height": 4,
"passthru": false,
"decouple": "false",
"topic": "override",
"style": "",
"onvalue": "1",
"onvalueType": "num",
"onicon": "",
"oncolor": "",
"offvalue": "0",
"offvalueType": "num",
"officon": "",
"offcolor": "",
"x": 100,
"y": 420,
"wires": [
[
"d321a497.1a8d88",
"bab5ef72.33a34"
]
]
},
{
"id": "249010e9.b2078",
"type": "ui_text",
"z": "c855e9c5.011388",
"group": "82ffe014.05f45",
"order": 6,
"width": 7,
"height": 4,
"name": "Status",
"label": "Status",
"format": "{{msg.payload}}",
"layout": "col-center",
"x": 390,
"y": 420,
"wires": []
},
{
"id": "96ec9075.82fdf",
"type": "change",
"z": "c855e9c5.011388",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "$number(payload)",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1780,
"y": 420,
"wires": [
[
"aa82cc44.de1bc"
]
]
},
{
"id": "aa82cc44.de1bc",
"type": "function",
"z": "c855e9c5.011388",
"name": "",
"func": "global.set(\"flow2\",msg.payload);",
"outputs": 1,
"noerr": 0,
"x": 1870,
"y": 480,
"wires": [
[]
]
},
{
"id": "66a7b37f.1dbe3c",
"type": "mqtt out",
"z": "c855e9c5.011388",
"name": "",
"topic": "valve1",
"qos": "2",
"retain": "true",
"broker": "5e8739b4.e25bd8",
"x": 800,
"y": 520,
"wires": []
},
{
"id": "6f556440.9993ac",
"type": "mqtt out",
"z": "c855e9c5.011388",
"name": "",
"topic": "pump",
"qos": "2",
"retain": "true",
"broker": "5e8739b4.e25bd8",
"x": 810,
"y": 600,
"wires": []
},
{
"id": "53308e00.f4e86",
"type": "mqtt out",
"z": "c855e9c5.011388",
"name": "",
"topic": "valve2",
"qos": "2",
"retain": "true",
"broker": "5e8739b4.e25bd8",
"x": 810,
"y": 700,
"wires": []
},
{
"id": "d321a497.1a8d88",
"type": "function",
"z": "c855e9c5.011388",
"name": "",
"func": "if (msg.payload==1) {\n msg.payload=\"Override\";\n} if(msg.payload===0) {\n msg.payload=\"Automatic\";\n}\n\n return(msg);",
"outputs": 1,
"noerr": 0,
"x": 250,
"y": 420,
"wires": [
[
"249010e9.b2078"
]
]
},
{
"id": "b7b6d358.f3295",
"type": "function",
"z": "c855e9c5.011388",
"name": "pump auto",
"func": "var f1=global.get(\"level2\");\nvar ov=global.get(\"override\");\nif(ov==1)\n{\n}\nelse\n{\n if(f1<3)\n {\n msg.payload=1;\n }\n else\n {\n msg.payload=0;\n }\n\n return(msg);\n}\n",
"outputs": 1,
"noerr": 0,
"x": 350,
"y": 560,
"wires": [
[
"478bd80d.d86d98",
"dfb491d5.b4d48"
]
]
},
{
"id": "876a0ee9.4524e",
"type": "change",
"z": "c855e9c5.011388",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "$number(payload)",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1260,
"y": 300,
"wires": [
[
"cda63c53.03412"
]
]
},
{
"id": "cda63c53.03412",
"type": "function",
"z": "c855e9c5.011388",
"name": "",
"func": "global.set(\"level2\",msg.payload);",
"outputs": 1,
"noerr": 0,
"x": 1350,
"y": 360,
"wires": [
[]
]
},
{
"id": "5aa82413.e6a61c",
"type": "change",
"z": "c855e9c5.011388",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "$number(payload)",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 860,
"y": 320,
"wires": [
[
"e1439452.e3d798"
]
]
},
{
"id": "e1439452.e3d798",
"type": "function",
"z": "c855e9c5.011388",
"name": "",
"func": "global.set(\"flow1\",msg.payload);",
"outputs": 1,
"noerr": 0,
"x": 950,
"y": 380,
"wires": [
[]
]
},
{
"id": "fa621d17.e7174",
"type": "change",
"z": "c855e9c5.011388",
"name": "",
"rules": [
...
This file has been truncated, please download it to see its full contents.
Comments