#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "Your SSID Here";
const char* password = "Your SSID Password Here";
//const char* mqtt_server = "test.mosquitto.org";
//const char* mqtt_server = "iot.eclipse.org";
const char* mqtt_server = "Your broker IP Address Here";
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
pinMode(12,OUTPUT), pinMode(13,OUTPUT),pinMode(14,OUTPUT),pinMode(16,OUTPUT);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
reconnect();
}
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.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
if((char)payload[0] == 'R' && (char)payload[1] == '1' && (char)payload[2] == '1') //R1 on with R11
digitalWrite(12,HIGH),client.publish("emon/ESP8266/Relay1/", "1");
else if((char)payload[0] == 'R' && (char)payload[1] == '1' && (char)payload[2] == '0') //R1 off with R10
digitalWrite(12,LOW),client.publish("emon/ESP8266/Relay1/", "0");
else if((char)payload[0] == 'R' && (char)payload[1] == '2' && (char)payload[2] == '1') //R2 on with R21
digitalWrite(13,HIGH),client.publish("emon/ESP8266/Relay2/", "1");
else if((char)payload[0] == 'R' && (char)payload[1] == '2' && (char)payload[2] == '0') //R2 off with R20
digitalWrite(13,LOW),client.publish("emon/ESP8266/Relay2/", "0");
else if((char)payload[0] == 'R' && (char)payload[1] == '3' && (char)payload[2] == '1') //R3 on with R31
digitalWrite(14,HIGH),client.publish("emon/ESP8266/Relay3/", "1");
else if((char)payload[0] == 'R' && (char)payload[1] == '3' && (char)payload[2] == '0') //R3 off with R30
digitalWrite(14,LOW),client.publish("emon/ESP8266/Relay3/", "0");
else if((char)payload[0] == 'R' && (char)payload[1] == '4' && (char)payload[2] == '1') //R4 on with R41
digitalWrite(16,HIGH),client.publish("emon/ESP8266/Relay4/", "1");
else if((char)payload[0] == 'R' && (char)payload[1] == '4' && (char)payload[2] == '0') //R4 off with R40
digitalWrite(16,LOW),client.publish("emon/ESP8266/Relay4/", "0");
Serial.println();
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("ESP8266Client","emonpi","emonpimqtt2016")) {
Serial.println("connected");
// Once connected, publish an announcement...
client.publish("emon/ESP8266/Status", "1");
// ... and resubscribe
client.subscribe("ESP8266/Status");
client.subscribe("ESP8266/Relay1");
client.subscribe("ESP8266/Relay2");
client.subscribe("ESP8266/Relay3");
client.subscribe("ESP8266/Relay4");
}
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();
}
client.loop();
}
Very basic but works and happy to take any feedback with better options.
No GUI just add your SSID details, broker IP address and user details (I use Emonpi) and off you go…