#include #include #include #include #define RELAY_PIN1 2 #define RELAY_PIN2 15 #define MQTT_SERVER "192.168.100.77" #define MQTT_PORT 1883 #define MQTT_TOPIC_BIAYA "home/biaya" #define MQTT_TOPIC_PZEMOUT1 "pzemout1/voltage" #define MQTT_TOPIC_PZEMOUT2 "pzemout2/current" #define MQTT_TOPIC_PZEMOUT3 "pzemout3/power" #define MQTT_TOPIC_PZEMOUT4 "pzemout4/energy" #define WIFI_SSID "KOSAN KAMAR DEPAN" #define WIFI_PASSWORD "ngoooook" #define MQTT_TOPIC_RELAY1 "home/relay1" #define MQTT_TOPIC_RELAY2 "home/relay2" bool relayState1 = false; bool relayState2 = false; WiFiClient espClient; PubSubClient client(espClient); #if !defined(PZEM_RX_PIN) && !defined(PZEM_TX_PIN) #define PZEM_RX_PIN 14 #define PZEM_TX_PIN 12 #endif #if !defined(PZEM_SERIAL) #define PZEM_SERIAL Serial2 #endif #if defined(ESP32) PZEM004Tv30 pzem(PZEM_SERIAL, PZEM_RX_PIN, PZEM_TX_PIN); #elif defined(ESP8266) #else PZEM004Tv30 pzem(PZEM_SERIAL); #endif long time_1 = 0; int interval = 500; void callback(char* topic, byte* payload, unsigned int length) { String message = ""; for (int i = 0; i < length; i++) { message += (char)payload[i]; } Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); Serial.println(message); if (strcmp(topic, MQTT_TOPIC_RELAY1) == 0) { if (message == "ON") { digitalWrite(RELAY_PIN1, LOW); relayState1 = true; } else if (message == "OFF") { digitalWrite(RELAY_PIN1, HIGH); relayState1 = false; } } else if (strcmp(topic, MQTT_TOPIC_RELAY2) == 0) { if (message == "ON") { digitalWrite(RELAY_PIN2, LOW); relayState2 = true; } else if (message == "OFF") { digitalWrite(RELAY_PIN2, HIGH); relayState2 = false; } } } void setup() { Serial.begin(115200); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.print("Connecting"); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println("\nConnected to WiFi"); pinMode(RELAY_PIN1, OUTPUT); digitalWrite(RELAY_PIN1, HIGH); pinMode(RELAY_PIN2, OUTPUT); digitalWrite(RELAY_PIN2, HIGH); client.setServer(MQTT_SERVER, MQTT_PORT); client.setCallback(callback); reconnect(); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); kirimData(); } void kirimData() { if (millis() >= time_1 + interval) { time_1 = millis(); Serial.print("Kamar :"); Serial.println(pzem.readAddress(), HEX); float voltage = pzem.voltage(); float current = pzem.current(); float power = pzem.power(); float energy = pzem.energy(); float tarifPerKWh = 1444; float biaya = (energy * tarifPerKWh); client.publish(MQTT_TOPIC_PZEMOUT1, String(voltage).c_str()); client.publish(MQTT_TOPIC_PZEMOUT2, String(current).c_str()); client.publish(MQTT_TOPIC_PZEMOUT3, String(power).c_str()); client.publish(MQTT_TOPIC_PZEMOUT4, String(energy, 3).c_str()); client.publish(MQTT_TOPIC_BIAYA, String(biaya).c_str()); Serial.print("Voltage: "); Serial.print(voltage); Serial.println("V"); Serial.print("Current: "); Serial.print(current); Serial.println("A"); Serial.print("Power: "); Serial.print(power); Serial.println("W"); Serial.print("Energy: "); Serial.print(energy, 3); Serial.println("kWh"); Serial.print("Biaya: Rp. "); Serial.println(biaya); } } void reconnect() { while (!client.connected()) { Serial.print("Connecting to MQTT broker..."); if (client.connect("ESP321_Client")) { Serial.println("connected"); client.subscribe(MQTT_TOPIC_RELAY1); client.subscribe(MQTT_TOPIC_RELAY2); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" retrying in 5 seconds"); delay(5000); } } }