1
0

Implement MQTT connection and message publishing based on CO levels; refactor air quality status handling

This commit is contained in:
Jose
2025-05-16 13:05:34 +02:00
parent a50716c483
commit 51862cf0a8
5 changed files with 47 additions and 34 deletions

View File

@@ -8,9 +8,11 @@ import java.util.Set;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import io.netty.handler.codec.mqtt.MqttQoS;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;
import io.vertx.core.Vertx;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.http.HttpMethod;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router;
@@ -19,6 +21,8 @@ import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.client.WebClientOptions;
import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.ext.web.handler.CorsHandler;
import io.vertx.mqtt.MqttClient;
import io.vertx.mqtt.MqttClientOptions;
import net.miarma.contaminus.common.ConfigManager;
import net.miarma.contaminus.common.Constants;
import net.miarma.contaminus.entities.COValue;
@@ -34,12 +38,14 @@ public class LogicLayerAPIVerticle extends AbstractVerticle {
private ConfigManager configManager;
private final Gson gson = new GsonBuilder().serializeNulls().create();
private RestClientUtil restClient;
private MqttClient mqttClient;
public LogicLayerAPIVerticle() {
this.configManager = ConfigManager.getInstance();
WebClientOptions options = new WebClientOptions()
.setUserAgent("ContaminUS");
this.restClient = new RestClientUtil(WebClient.create(Vertx.vertx(), options));
this.mqttClient = MqttClient.create(Vertx.vertx(), new MqttClientOptions().setAutoKeepAlive(true));
}
@Override
@@ -146,6 +152,28 @@ public class LogicLayerAPIVerticle extends AbstractVerticle {
WeatherValue weatherValue = gson.fromJson(weather.toString(), WeatherValue.class);
COValue coValue = gson.fromJson(co.toString(), COValue.class);
float coAmount = coValue.getValue();
String topic = buildTopic(Integer.parseInt(groupId), deviceId, "matrix");
if (coAmount >= 80.0f) {
mqttClient.connect(1883, "miarma.net", ar -> {
if(ar.succeeded()) {
Constants.LOGGER.info("Connected to MQTT broker");
mqttClient.publish(topic, Buffer.buffer("ECO"), MqttQoS.AT_LEAST_ONCE, false, false);
} else {
Constants.LOGGER.error("Error connecting to MQTT broker: " + ar.cause().getMessage());
}
});
} else {
mqttClient.connect(1883, "miarma.net", ar -> {
if(ar.succeeded()) {
Constants.LOGGER.info("Connected to MQTT broker");
mqttClient.publish(topic, Buffer.buffer("GAS"), MqttQoS.AT_LEAST_ONCE, false, false);
} else {
Constants.LOGGER.error("Error connecting to MQTT broker: " + ar.cause().getMessage());
}
});
}
gpsValue.setDeviceId(deviceId);
weatherValue.setDeviceId(deviceId);
coValue.setDeviceId(deviceId);
@@ -168,4 +196,10 @@ public class LogicLayerAPIVerticle extends AbstractVerticle {
})
.onFailure(err -> context.fail(500, err));
}
private String buildTopic(int groupId, String deviceId, String topic)
{
String topicString = "group/" + groupId + "/device/" + deviceId + "/" + topic;
return topicString;
}
}