@@ -125,25 +125,46 @@ def getPref(node, comp_name):
125125
126126def splitCompoundName (comp_name ):
127127 """Split compound (dot separated) preference name into parts"""
128- name = comp_name .split ("." , 1 )
129- if len (name ) != 2 :
128+ name = comp_name .split ("." )
129+ if len (name ) < 2 :
130130 name [0 ] = comp_name
131131 name .append (comp_name )
132132 return name
133133
134+ def traverseConfig (config_root , config , interface_config ):
135+ """Iterate through current config level preferences and either traverse deeper if preference is a dict or set preference"""
136+ snake_name = meshtastic .util .camel_to_snake (config_root )
137+ for pref in config :
138+ pref_name = f"{ snake_name } .{ pref } "
139+ if isinstance (config [pref ], dict ):
140+ traverseConfig (pref_name , config [pref ], interface_config )
141+ else :
142+ setPref (
143+ interface_config ,
144+ pref_name ,
145+ str (config [pref ])
146+ )
147+
148+ return True
134149
135150def setPref (config , comp_name , valStr ) -> bool :
136151 """Set a channel or preferences value"""
137152
138153 name = splitCompoundName (comp_name )
139154
140- snake_name = meshtastic .util .camel_to_snake (name [1 ])
141- camel_name = meshtastic .util .snake_to_camel (name [1 ])
155+ snake_name = meshtastic .util .camel_to_snake (name [- 1 ])
156+ camel_name = meshtastic .util .snake_to_camel (name [- 1 ])
142157 logging .debug (f"snake_name:{ snake_name } " )
143158 logging .debug (f"camel_name:{ camel_name } " )
144159
145160 objDesc = config .DESCRIPTOR
161+ config_part = config
146162 config_type = objDesc .fields_by_name .get (name [0 ])
163+ if config_type and config_type .message_type is not None :
164+ for name_part in name [1 :- 1 ]:
165+ part_snake_name = meshtastic .util .camel_to_snake ((name_part ))
166+ config_part = getattr (config , config_type .name )
167+ config_type = config_type .message_type .fields_by_name .get (part_snake_name )
147168 pref = None
148169 if config_type and config_type .message_type is not None :
149170 pref = config_type .message_type .fields_by_name .get (snake_name )
@@ -190,13 +211,13 @@ def setPref(config, comp_name, valStr) -> bool:
190211 if snake_name != "ignore_incoming" :
191212 try :
192213 if config_type .message_type is not None :
193- config_values = getattr (config , config_type .name )
214+ config_values = getattr (config_part , config_type .name )
194215 setattr (config_values , pref .name , val )
195216 else :
196- setattr (config , snake_name , val )
217+ setattr (config_part , snake_name , val )
197218 except TypeError :
198219 # The setter didn't like our arg type guess try again as a string
199- config_values = getattr (config , config_type .name )
220+ config_values = getattr (config_part , config_type .name )
200221 setattr (config_values , pref .name , valStr )
201222 else :
202223 if val == 0 :
@@ -207,7 +228,7 @@ def setPref(config, comp_name, valStr) -> bool:
207228 print (f"Adding '{ val } ' to the ignore_incoming list" )
208229 config_type .message_type .ignore_incoming .extend ([val ])
209230
210- prefix = f"{ name [0 ] } ." if config_type .message_type is not None else ""
231+ prefix = f"{ "." . join ( name [0 : - 1 ]) } ." if config_type .message_type is not None else ""
211232 if mt_config .camel_case :
212233 print (f"Set { prefix } { camel_name } to { valStr } " )
213234 else :
@@ -549,25 +570,15 @@ def onConnected(interface):
549570 if "config" in configuration :
550571 localConfig = interface .getNode (args .dest ).localConfig
551572 for section in configuration ["config" ]:
552- for pref in configuration ["config" ][section ]:
553- setPref (
554- localConfig ,
555- f"{ meshtastic .util .camel_to_snake (section )} .{ pref } " ,
556- str (configuration ["config" ][section ][pref ]),
557- )
573+ traverseConfig (section , configuration ["config" ][section ], localConfig )
558574 interface .getNode (args .dest ).writeConfig (
559575 meshtastic .util .camel_to_snake (section )
560576 )
561577
562578 if "module_config" in configuration :
563579 moduleConfig = interface .getNode (args .dest ).moduleConfig
564580 for section in configuration ["module_config" ]:
565- for pref in configuration ["module_config" ][section ]:
566- setPref (
567- moduleConfig ,
568- f"{ meshtastic .util .camel_to_snake (section )} .{ pref } " ,
569- str (configuration ["module_config" ][section ][pref ]),
570- )
581+ traverseConfig (section , configuration ["module_config" ][section ], moduleConfig )
571582 interface .getNode (args .dest ).writeConfig (
572583 meshtastic .util .camel_to_snake (section )
573584 )
0 commit comments