Procházet zdrojové kódy

Add setting for group labels

Christopher Mullins před 6 roky
rodič
revize
a3a3bb8563

+ 33 - 0
lib/Settings/Settings.cpp

@@ -144,6 +144,37 @@ void Settings::patch(JsonObject parsedSettings) {
     JsonArray arr = parsedSettings["group_state_fields"];
     groupStateFields = JsonHelpers::jsonArrToVector<GroupStateField, const char*>(arr, GroupStateFieldHelpers::getFieldByName);
   }
+
+  if (parsedSettings.containsKey("group_id_aliases")) {
+    parseGroupIdAliases(parsedSettings);
+  }
+}
+
+void Settings::parseGroupIdAliases(JsonObject json) {
+  JsonObject aliases = json["group_id_aliases"];
+  groupIdAliases.clear();
+
+  for (JsonPair kv : aliases) {
+    JsonArray bulbIdProps = kv.value();
+    BulbId bulbId = {
+      bulbIdProps[1].as<uint16_t>(),
+      bulbIdProps[2].as<uint8_t>(),
+      MiLightRemoteTypeHelpers::remoteTypeFromString(bulbIdProps[0].as<String>())
+    };
+    groupIdAliases[kv.key().c_str()] = bulbId;
+  }
+}
+
+void Settings::dumpGroupIdAliases(JsonObject json) {
+  JsonObject aliases = json.createNestedObject("group_id_aliases");
+
+  for (std::map<String, BulbId>::iterator itr = groupIdAliases.begin(); itr != groupIdAliases.end(); ++itr) {
+    JsonArray bulbProps = aliases.createNestedArray(itr->first);
+    BulbId bulbId = itr->second;
+    bulbProps.add(MiLightRemoteTypeHelpers::remoteTypeToString(bulbId.deviceType));
+    bulbProps.add(bulbId.deviceId);
+    bulbProps.add(bulbId.groupId);
+  }
 }
 
 void Settings::load(Settings& settings) {
@@ -246,6 +277,8 @@ void Settings::serialize(Print& stream, const bool prettyPrint) {
   JsonArray groupStateFieldArr = root.createNestedArray("group_state_fields");
   JsonHelpers::vectorToJsonArr<GroupStateField, const char*>(groupStateFieldArr, groupStateFields, GroupStateFieldHelpers::getFieldName);
 
+  dumpGroupIdAliases(root.as<JsonObject>());
+
   if (prettyPrint) {
     serializeJsonPretty(root, stream);
   } else {

+ 4 - 0
lib/Settings/Settings.h

@@ -181,10 +181,14 @@ public:
   String wifiStaticIPNetmask;
   String wifiStaticIPGateway;
   size_t packetRepeatsPerLoop;
+  std::map<String, BulbId> groupIdAliases;
 
 protected:
   size_t _autoRestartPeriod;
 
+  void parseGroupIdAliases(JsonObject json);
+  void dumpGroupIdAliases(JsonObject json);
+
   template <typename T>
   void setIfPresent(JsonObject obj, const char* key, T& var) {
     if (obj.containsKey(key)) {

+ 17 - 0
test/remote/spec/settings_spec.rb

@@ -128,6 +128,23 @@ RSpec.describe 'Settings' do
     end
   end
 
+  context 'group id labels' do
+    it 'should store ID labels' do
+      id = 1
+
+      aliases = Hash[
+        StateHelpers::ALL_REMOTE_TYPES.map do |remote_type|
+          ["test_#{id += 1}", [remote_type, id, 1]]
+        end
+      ]
+
+      @client.patch_settings(group_id_aliases: aliases)
+      settings = @client.get('/settings')
+
+      expect(settings['group_id_aliases']).to eq(aliases)
+    end
+  end
+
   context 'static ip' do
     it 'should boot with static IP when applied' do
       static_ip = ENV.fetch('ESPMH_STATIC_IP')