ソースを参照

Publish some device metadata along with HomeAssistant discovery configs. This will enable better removal behavior in the future.

Christopher Mullins 6 年 前
コミット
b27cc8ca1c
共有4 個のファイルを変更した48 個の追加0 個の削除を含む
  1. 8 0
      lib/MQTT/HomeAssistantDiscoveryClient.cpp
  2. 6 0
      lib/Types/BulbId.cpp
  3. 1 0
      lib/Types/BulbId.h
  4. 33 0
      test/remote/spec/discovery_spec.rb

+ 8 - 0
lib/MQTT/HomeAssistantDiscoveryClient.cpp

@@ -40,6 +40,14 @@ void HomeAssistantDiscoveryClient::addConfig(const char* alias, const BulbId& bu
   config[F("name")] = alias;
   config[F("command_topic")] = mqttClient->bindTopicString(settings.mqttTopicPattern, bulbId);
   config[F("state_topic")] = mqttClient->bindTopicString(settings.mqttStateTopicPattern, bulbId);
+  JsonObject deviceMetadata = config.createNestedObject(F("device"));
+
+  deviceMetadata[F("manufacturer")] = F("esp8266_milight_hub");
+  deviceMetadata[F("sw_version")] = QUOTE(MILIGHT_HUB_VERSION);
+
+  JsonArray identifiers = deviceMetadata.createNestedArray(F("identifiers"));
+  identifiers.add(ESP.getChipId());
+  bulbId.serialize(identifiers);
 
   // HomeAssistant only supports simple client availability
   if (settings.mqttClientStatusTopic.length() > 0 && settings.simpleMqttClientStatus) {

+ 6 - 0
lib/Types/BulbId.cpp

@@ -51,4 +51,10 @@ void BulbId::serialize(JsonObject json) const {
   json[GroupStateFieldNames::DEVICE_ID] = deviceId;
   json[GroupStateFieldNames::GROUP_ID] = groupId;
   json[GroupStateFieldNames::DEVICE_TYPE] = MiLightRemoteTypeHelpers::remoteTypeToString(deviceType);
+}
+
+void BulbId::serialize(JsonArray json) const {
+  json.add(deviceId);
+  json.add(MiLightRemoteTypeHelpers::remoteTypeToString(deviceType));
+  json.add(groupId);
 }

+ 1 - 0
lib/Types/BulbId.h

@@ -18,4 +18,5 @@ struct BulbId {
   uint32_t getCompactId() const;
   String getHexDeviceId() const;
   void serialize(JsonObject json) const;
+  void serialize(JsonArray json) const;
 };

+ 33 - 0
test/remote/spec/discovery_spec.rb

@@ -101,10 +101,43 @@ RSpec.describe 'MQTT Discovery' do
         color_temp
         effect
         effect_list
+        device
       )
       expect(config.keys).to include(*expected_keys)
     end
 
+    it 'should list identifiers for ESP and bulb' do
+      saw_message = false
+      config = nil
+
+      @mqtt_client.on_message("#{@test_discovery_prefix}light/+/#{@discovery_suffix}") do |topic, message|
+        config = JSON.parse(message)
+        saw_message = config['device']['identifiers'][1] == @id_params[:id]
+      end
+
+      @client.patch_settings(
+        home_assistant_discovery_prefix: @test_discovery_prefix,
+        group_id_aliases: {
+          'test_group' => [@id_params[:type], @id_params[:id], @id_params[:group_id]]
+        }
+      )
+
+      @mqtt_client.wait_for_listeners
+
+      expect(config.keys).to include('device')
+
+      device_data = config['device']
+
+      expect(device_data.keys).to include(*%w(manufacturer sw_version identifiers))
+      expect(device_data['manufacturer']).to eq('esp8266_milight_hub')
+
+      ids = device_data['identifiers']
+      expect(ids.length).to eq(4)
+      expect(ids[1]).to eq(@id_params[:id])
+      expect(ids[2]).to eq(@id_params[:type])
+      expect(ids[3]).to eq(@id_params[:group_id])
+    end
+
     it 'should remove discoverable devices when alias is removed' do
       seen_config = false
       seen_blank_message = false