Selaa lähdekoodia

DRY: expose helper method in MqttClient to bind variables to topic string, use that instead of repeated logic

Christopher Mullins 6 vuotta sitten
vanhempi
commit
220508012b
3 muutettua tiedostoa jossa 19 lisäystä ja 28 poistoa
  1. 2 2
      lib/MQTT/HomeAssistantDiscoveryClient.cpp
  2. 15 19
      lib/MQTT/MqttClient.cpp
  3. 2 7
      lib/MQTT/MqttClient.h

+ 2 - 2
lib/MQTT/HomeAssistantDiscoveryClient.cpp

@@ -37,8 +37,8 @@ void HomeAssistantDiscoveryClient::addConfig(const char* alias, const BulbId& bu
 
   config[F("schema")] = F("json");
   config[F("name")] = alias;
-  config[F("command_topic")] = bindTopicVariables(settings.mqttTopicPattern, alias, bulbId);
-  config[F("state_topic")] = bindTopicVariables(settings.mqttStateTopicPattern, alias, bulbId);
+  config[F("command_topic")] = mqttClient->bindTopicString(settings.mqttTopicPattern, bulbId);
+  config[F("state_topic")] = mqttClient->bindTopicString(settings.mqttStateTopicPattern, bulbId);
 
   // HomeAssistant only supports simple client availability
   if (settings.mqttClientStatusTopic.length() > 0 && settings.simpleMqttClientStatus) {

+ 15 - 19
lib/MQTT/MqttClient.cpp

@@ -194,8 +194,8 @@ void MqttClient::publish(
     return;
   }
 
-  String topic = _topic;
-  MqttClient::bindTopicString(topic, remoteConfig, deviceId, groupId);
+  BulbId bulbId(deviceId, groupId, remoteConfig.type);
+  String topic = bindTopicString(_topic, bulbId);
 
 #ifdef MQTT_DEBUG
   printf("MqttClient - publishing update to %s\n", topic.c_str());
@@ -274,28 +274,24 @@ void MqttClient::publishCallback(char* topic, byte* payload, int length) {
   milightClient->update(obj);
 }
 
-inline void MqttClient::bindTopicString(
-  String& topicPattern,
-  const MiLightRemoteConfig& remoteConfig,
-  const uint16_t deviceId,
-  const uint16_t groupId
-) {
-  String deviceIdHex = String(deviceId, 16);
-  deviceIdHex.toUpperCase();
-  deviceIdHex = String("0x") + deviceIdHex;
+String MqttClient::bindTopicString(const String& topicPattern, const BulbId& bulbId) {
+  String boundTopic = topicPattern;
+  String deviceIdHex = bulbId.getHexDeviceId();
 
-  topicPattern.replace(":device_id", deviceIdHex);
-  topicPattern.replace(":hex_device_id", deviceIdHex);
-  topicPattern.replace(":dec_device_id", String(deviceId));
-  topicPattern.replace(":group_id", String(groupId));
-  topicPattern.replace(":device_type", remoteConfig.name);
+  boundTopic.replace(":device_id", deviceIdHex);
+  boundTopic.replace(":hex_device_id", deviceIdHex);
+  boundTopic.replace(":dec_device_id", String(bulbId.deviceId));
+  boundTopic.replace(":group_id", String(bulbId.groupId));
+  boundTopic.replace(":device_type", MiLightRemoteTypeHelpers::remoteTypeToString(bulbId.deviceType));
 
-  auto it = settings.findAlias(remoteConfig.type, deviceId, groupId);
+  auto it = settings.findAlias(bulbId.deviceType, bulbId.deviceId, bulbId.groupId);
   if (it != settings.groupIdAliases.end()) {
-    topicPattern.replace(":device_alias", it->first);
+    boundTopic.replace(":device_alias", it->first);
   } else {
-    topicPattern.replace(":device_alias", "__unnamed_group");
+    boundTopic.replace(":device_alias", "__unnamed_group");
   }
+
+  return boundTopic;
 }
 
 String MqttClient::generateConnectionStatusMessage(const char* connectionStatus) {

+ 2 - 7
lib/MQTT/MqttClient.h

@@ -30,6 +30,8 @@ public:
   void send(const char* topic, const char* message, const bool retain = false);
   void onConnect(OnConnectFn fn);
 
+  String bindTopicString(const String& topicPattern, const BulbId& bulbId);
+
 private:
   WiFiClient tcpClient;
   PubSubClient mqttClient;
@@ -53,13 +55,6 @@ private:
     const bool retain = false
   );
 
-  inline void bindTopicString(
-    String& topicPattern,
-    const MiLightRemoteConfig& remoteConfig,
-    const uint16_t deviceId,
-    const uint16_t groupId
-  );
-
   String generateConnectionStatusMessage(const char* status);
 };