Closer to a working model. 2-way communication is working and devices can report temperature readings. Need to get the actual control logic done and clean this garbage up.
137 lines
3.1 KiB
C++
137 lines
3.1 KiB
C++
#include "Communicator.h"
|
|
|
|
Communicator::Communicator(WiFiClient& network, CALLBACK_SIGNATURE) {
|
|
this->_net = network;
|
|
this->mqttCallback = mqttCallback;
|
|
this->_mqtt_client.setBufferSize(1536);
|
|
}
|
|
|
|
Communicator::Communicator(WiFiClient& network) {
|
|
this->_net = network;
|
|
this->_mqtt_client.setBufferSize(1536);
|
|
}
|
|
|
|
void Communicator::connectCallback(CALLBACK_SIGNATURE) {
|
|
this->mqttCallback = mqttCallback;
|
|
}
|
|
|
|
void Communicator::loop() {
|
|
_mqtt_client.loop();
|
|
}
|
|
|
|
bool Communicator::ConnectMQTT(const String &server, const String &name, const String &user, const String &password) {
|
|
_mqtt_client.setClient(_net);
|
|
_mqtt_client.setServer(server.c_str(), 1883);
|
|
_mqtt_client.setCallback(mqttCallback);
|
|
|
|
byte i = 0;
|
|
|
|
if (_mqtt_client.connected()) return true;
|
|
|
|
while (!_mqtt_client.connected() && (i < 3)) {
|
|
Serial.println("Attempt MQTT Connection.");
|
|
boolean ret;
|
|
ret = _mqtt_client.connect(name.c_str(), user.c_str(), password.c_str());
|
|
if (ret) {
|
|
Serial.println("Connected to MQTT");
|
|
return true;
|
|
|
|
} else {
|
|
int Status = _mqtt_client.state();
|
|
|
|
switch (Status)
|
|
{
|
|
case -4:
|
|
Serial.println(F("Connection timeout"));
|
|
break;
|
|
|
|
case -3:
|
|
Serial.println(F("Connection lost"));
|
|
break;
|
|
|
|
case -2:
|
|
Serial.println(F("Connect failed"));
|
|
break;
|
|
|
|
case -1:
|
|
Serial.println(F("Disconnected"));
|
|
break;
|
|
|
|
case 1:
|
|
Serial.println(F("Bad protocol"));
|
|
break;
|
|
|
|
case 2:
|
|
Serial.println(F("Bad client ID"));
|
|
break;
|
|
|
|
case 3:
|
|
Serial.println(F("Unavailable"));
|
|
break;
|
|
|
|
case 4:
|
|
Serial.println(F("Bad credentials"));
|
|
break;
|
|
|
|
case 5:
|
|
Serial.println(F("Unauthorized"));
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
Serial.print(".");
|
|
i++;
|
|
delay(5000);
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
void Communicator::Subscribe(const char* topic) {
|
|
Serial.println("Subscribe to: " + String(topic));
|
|
_mqtt_client.subscribe(topic);
|
|
}
|
|
|
|
void Communicator::mqtt_discovery(const String topic, StaticJsonDocument<1536> &entity) {
|
|
String payload;
|
|
serializeJson(entity, payload);
|
|
|
|
bool response = ConnectMQTT(MQTT_BROKER.toString(), MQTT_NAME, MQTT_USER, MQTT_PASSWORD);
|
|
if (response)
|
|
{
|
|
Serial.print("Sending discovery payload to ");
|
|
Serial.println(topic);
|
|
Serial.println(payload);
|
|
|
|
_mqtt_client.publish(topic.c_str(), payload.c_str(), false);
|
|
|
|
const char* mode = entity["mode_cmd_t"];
|
|
if (mode) {
|
|
Subscribe(mode);
|
|
}
|
|
const char* temp = entity["temp_cmd_t"];
|
|
if (temp) {
|
|
Subscribe(temp);
|
|
}
|
|
const char* temp_hi = entity["temp_hi_cmd_t"];
|
|
if (temp_hi) {
|
|
Subscribe(temp_hi);
|
|
}
|
|
const char* temp_lo = entity["temp_lo_cmd_t"];
|
|
if (temp_lo) {
|
|
Subscribe(temp_lo);
|
|
}
|
|
|
|
_mqtt_client.loop();
|
|
}
|
|
}
|
|
|
|
void Communicator::publish_data(String topic, String value) {
|
|
Serial.print(topic);
|
|
Serial.print(" --> ");
|
|
Serial.println(value);
|
|
_mqtt_client.publish(topic.c_str(), value.c_str(), true);
|
|
}
|