Brewery-Controller/boil_kettle/mqtt.ino

73 lines
1.8 KiB
C++

void ConnectMQTT() {
ConfigData config;
EEPROM.get(ConfAddress, config);
static const char *user = config.mqtt.user;
static const char *password = config.mqtt.password;
//config.mqtt.topic.root
//config.mqtt.broker
Serial.println("connecting MQTT...");
while (!mqtt_client.connect("brewhouse", user, password)) {
Serial.print(".");
delay(1000);
}
Serial.println("\nconnected!");
mqtt_client.subscribe(config.mqtt.topic.root + config.mqtt.topic.boil.setpoint);
mqtt_client.subscribe(config.mqtt.topic.root + config.mqtt.topic.mash.setpoint);
}
void MessageReceived(String &topic, String &payload) {
ConfigData config;
EEPROM.get(ConfAddress, config);
/** JSON Parser Setup */
StaticJsonDocument<200> doc;
// Deserialize the JSON document
DeserializationError error = deserializeJson(doc, payload);
// Test if parsing succeeds.
if (error) {
Serial.println(error.f_str());
return;
}
if (topic == config.mqtt.topic.root + config.mqtt.topic.boil.setpoint) {
// Update PWM setpoint.
String setting = doc["setpoint"];
KettleDuty = setting.toInt();
}
}
void SetupMQTT(const char *broker) {
// Note: Local domain names (e.g. "Computer.local" on OSX) are not supported
// by Arduino. You need to set the IP address directly.
mqtt_client.begin(broker, net);
mqtt_client.onMessage(MessageReceived);
ConnectMQTT();
}
static void SendSensorData() {
ConfigData config;
EEPROM.get(ConfAddress, config);
// NOTE: max message length is 250 bytes.
StaticJsonDocument<200> doc;
doc["entity"] = config.mqtt.topic.boil.name;
doc["setpoint"] = KettleDuty;
doc["units"] = "%";
String jstr;
serializeJson(doc, jstr);
String topic = config.mqtt.topic.root;
topic += config.mqtt.topic.boil.sensor;
mqtt_client.publish(topic, jstr);
}