Correct, the red wire when touching ground turns on the machine and vice versa.
if (!strncmp((char*)payload, "ON", length) || (!strncmp((char*)payload, "OFF", length))) {
digitalWrite(button, LOW);
delay(200);
digitalWrite(button, HIGH);
}
Their code can be found on that url,
but here's the whole thing if needed
Note: I have modified their If statement and removed the state variable to ease troubleshooting and debugging. The state var was populated properly either way, but just FYI.
/*
SmartHomeGeeks.io Smart Ice Maker
https://smarthomegeeks.io/smart-icemaker
*/
#ifdef ESP32
#include <WiFi.h> // WIFI for ESP32
#else
#include <ESP8266WiFi.h> // WIFI for ESP8266
#include <ESP8266mDNS.h>
#endif
#include <PubSubClient.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <ArduinoJson.h>
#include <arduino_secrets.h>
// Device configuration
const String deviceName = "Ice Maker";
const int sensor1 = 15; // blue wire (empty / small)
const int sensor2 = 12; // yellow wire (full)
const int sensor3 = 14; // orange wire (large / small)
const int sensor4 = 2; // green wire (power)
const int button = 13; // red wire
// WiFi configuration
const char* ssid = SECRET_SSID;
const char* password = SECRET_PASS;
// MQTT configuration
const String mqttClient = "ice_maker"; // MQTT client name
const String mqttPowerTopic = mqttClient + "/power"; // MQTT power state topic
const String mqttStateTopic = mqttClient + "/state"; // MQTT state topic
const String mqttCmdTopic = mqttClient + "/command"; // MQTT command topic
const String mqttAvlTopic = mqttClient + "/availability"; // MQTT availability topic
const char* mqttServer = SECRET_MQTT_BROKER; // MQTT broker IP
const char* mqttUser = SECRET_MQTT_USERNAME; // MQTT username
const char* mqttPassword = SECRET_MQTT_PASSWORD; // MQTT password
const int mqttPort = 1883; // MQTT port (default: 1883)
char sensorState[5];
char sensorPrevState[5];
char charPayload[50];
unsigned long lastMQTTconnect = 0;
String state;
WiFiClient espClient;
PubSubClient client(espClient); //lib required for mqtt
void setup_wifi() {
delay(1000);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.print(ssid);
WiFi.mode(WIFI_STA);
WiFi.hostname(mqttClient);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void autoDiscovery() {
Serial.println("Publishing Home Assistant Autodiscovery...");
char buffer[512];
DynamicJsonDocument deviceData(512);
deviceData["name"] = deviceName;
deviceData["mdl"] = "Icemaker 400475";
deviceData["ids"] = mqttClient;
deviceData["mf"] = "SmartHomeGeeks.io for Tectake";
deviceData["sw"] = "2023.08";
// Switch
DynamicJsonDocument root(512);
root["name"] = nullptr;
root["obj_id"] = mqttClient + "_power";
root["ic"] = "mdi:snowflake";
root["uniq_id"] = "switch." + mqttClient;
root["stat_t"] = mqttPowerTopic;
root["cmd_t"] = mqttClient + "/command";
root["avty_t"] = mqttAvlTopic;
for (JsonPair kv : deviceData.as<JsonObject>()) root["dev"][kv.key()] = kv.value();
serializeJson(root, buffer);
client.publish(("homeassistant/switch/" + mqttClient + "/config").c_str(), buffer, true);
root.clear();
// sensors
root["name"] = nullptr;
root["obj_id"] = mqttClient + "_state";
root["ic"] = "mdi:snowflake";
root["stat_t"] = mqttClient + "/state";
root["uniq_id"] = "sensor." + mqttClient;
root["avty_t"] = mqttAvlTopic;
for (JsonPair kv : deviceData.as<JsonObject>()) root["dev"][kv.key()] = kv.value();
serializeJson(root, buffer);
client.publish(("homeassistant/sensor/" + mqttClient + "/config").c_str(), buffer, true);
root.clear();
root["name"] = "RSSI";
root["obj_id"] = mqttClient + "_rssi";
root["stat_t"] = mqttClient + "/rssi";
root["unit_of_meas"] = "dBm";
root["ic"] = "mdi:access-point";
root["uniq_id"] = "sensor." + mqttClient + "_rssi";
root["avty_t"] = mqttAvlTopic;
root["ent_cat"] = "diagnostic";
for (JsonPair kv : deviceData.as<JsonObject>()) root["dev"][kv.key()] = kv.value();
serializeJson(root, buffer);
client.publish(("homeassistant/sensor/" + mqttClient + "/rssi/config").c_str(), buffer, true);
root.clear();
// IP
root["name"] = "IP";
root["obj_id"] = mqttClient + "_ip";
root["stat_t"] = mqttClient + "/ip";
root["ic"] = "mdi:ip-network";
root["uniq_id"] = "sensor." + mqttClient + "_ip";
root["avty_t"] = mqttClient + "/availability";
root["ent_cat"] = "diagnostic";
for (JsonPair kv : deviceData.as<JsonObject>()) root["dev"][kv.key()] = kv.value();
serializeJson(root, buffer);
client.publish(("homeassistant/sensor/" + mqttClient + "/ip/config").c_str(), buffer, true);
root.clear();
}
void connectmqtt() {
// prevent constant reconnect
if (millis() - lastMQTTconnect < 5000) return;
lastMQTTconnect = millis();
if (client.connect(mqttClient.c_str(), mqttUser, mqttPassword, mqttAvlTopic.c_str(), 1, true, "offline")) {
Serial.println("connected to MQTT");
client.setBufferSize(512);
autoDiscovery();
client.subscribe(mqttCmdTopic.c_str());
client.publish(mqttAvlTopic.c_str(), "online", true);
client.publish((mqttClient + "/ip").c_str(), WiFi.localIP().toString().c_str(), true);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
}
}
void setup() {
Serial.begin(115200);
digitalWrite(button, HIGH);
pinMode(button, OUTPUT);
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);
pinMode(sensor3, INPUT);
pinMode(sensor4, INPUT);
// Setup WiFi
setup_wifi();
// Configure OTA
ArduinoOTA.setHostname(mqttClient.c_str());
ArduinoOTA.setPassword(SECRET_OTA_PASSWORD);
ArduinoOTA.begin();
//Connect MQTT
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
connectmqtt();
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived: ");
for (int i=0;i<length;i++) {
Serial.print((char)payload[i]);
}
Serial.println();
if ((!strncmp((char*)payload, "ON", length) && state == "Off") || (!strncmp((char*)payload, "OFF", length) && state != "Off")) {
digitalWrite(button, LOW);
delay(200);
digitalWrite(button, HIGH);
}
}
void loop() {
if (!client.connected()) {
connectmqtt();
}
sprintf(sensorState, "%d%d%d%d", digitalRead(sensor1), digitalRead(sensor2), digitalRead(sensor3), digitalRead(sensor4));
// if sensorState is differen than sensorPrevState and power is not blinking
if (strcmp(sensorState, sensorPrevState) != 0 && atoi(sensorState) != 1) {
client.publish((mqttClient + "/sensors").c_str(), sensorState, true);
Serial.println(sensorState);
switch (atoi(sensorState)) {
case 1111:
state = "Empty";
break;
case 101:
state = "Full";
break;
case 11:
state = "On";
break;
case 0:
state = "Off";
break;
}
Serial.println("Publish " + state);
client.publish(mqttStateTopic.c_str(), state.c_str(), true);
client.publish(mqttPowerTopic.c_str(), (state == "Off" ? "OFF" : "ON") , true);
client.publish((mqttClient + "/rssi").c_str(), String(WiFi.RSSI()).c_str(), true);
strcpy(sensorPrevState, sensorState);
}
// Delay is necessary for accurate readout
delay(200);
ArduinoOTA.handle();
client.loop();
}