@@ -273,6 +273,12 @@ def onConnected(interface):
273
273
try :
274
274
args = mt_config .args
275
275
276
+ # convenient place to store any keyword args we pass to getNode
277
+ getNode_kwargs = {
278
+ "requestChannelAttempts" : args .channel_fetch_attempts ,
279
+ "timeout" : args .timeout
280
+ }
281
+
276
282
# do not print this line if we are exporting the config
277
283
if not args .export_config :
278
284
print ("Connected to radio" )
@@ -324,14 +330,14 @@ def onConnected(interface):
324
330
print (f"Setting device owner to { args .set_owner } " )
325
331
else : # short name only
326
332
print (f"Setting device owner short to { args .set_owner_short } " )
327
- interface .getNode (args .dest , False ).setOwner (long_name = args .set_owner , short_name = args .set_owner_short )
333
+ interface .getNode (args .dest , False , ** getNode_kwargs ).setOwner (long_name = args .set_owner , short_name = args .set_owner_short )
328
334
329
335
# TODO: add to export-config and configure
330
336
if args .set_canned_message :
331
337
closeNow = True
332
338
waitForAckNak = True
333
339
print (f"Setting canned plugin message to { args .set_canned_message } " )
334
- interface .getNode (args .dest , False ).set_canned_message (
340
+ interface .getNode (args .dest , False , ** getNode_kwargs ).set_canned_message (
335
341
args .set_canned_message
336
342
)
337
343
@@ -340,12 +346,12 @@ def onConnected(interface):
340
346
closeNow = True
341
347
waitForAckNak = True
342
348
print (f"Setting ringtone to { args .set_ringtone } " )
343
- interface .getNode (args .dest , False ).set_ringtone (args .set_ringtone )
349
+ interface .getNode (args .dest , False , ** getNode_kwargs ).set_ringtone (args .set_ringtone )
344
350
345
351
if args .pos_fields :
346
352
# If --pos-fields invoked with args, set position fields
347
353
closeNow = True
348
- positionConfig = interface .getNode (args .dest ).localConfig .position
354
+ positionConfig = interface .getNode (args .dest , ** getNode_kwargs ).localConfig .position
349
355
allFields = 0
350
356
351
357
try :
@@ -364,12 +370,12 @@ def onConnected(interface):
364
370
print (f"Setting position fields to { allFields } " )
365
371
setPref (positionConfig , "position_flags" , f"{ allFields :d} " )
366
372
print ("Writing modified preferences to device" )
367
- interface .getNode (args .dest ).writeConfig ("position" )
373
+ interface .getNode (args .dest , ** getNode_kwargs ).writeConfig ("position" )
368
374
369
375
elif args .pos_fields is not None :
370
376
# If --pos-fields invoked without args, read and display current value
371
377
closeNow = True
372
- positionConfig = interface .getNode (args .dest ).localConfig .position
378
+ positionConfig = interface .getNode (args .dest , ** getNode_kwargs ).localConfig .position
373
379
374
380
fieldNames = []
375
381
for bit in positionConfig .PositionFlags .values ():
@@ -380,57 +386,58 @@ def onConnected(interface):
380
386
if args .set_ham :
381
387
closeNow = True
382
388
print (f"Setting Ham ID to { args .set_ham } and turning off encryption" )
383
- interface .getNode (args .dest ).setOwner (args .set_ham , is_licensed = True )
389
+ interface .getNode (args .dest , ** getNode_kwargs ).setOwner (args .set_ham , is_licensed = True )
384
390
# Must turn off encryption on primary channel
385
- interface .getNode (args .dest ).turnOffEncryptionOnPrimaryChannel ()
391
+ interface .getNode (args .dest , ** getNode_kwargs ).turnOffEncryptionOnPrimaryChannel ()
386
392
387
393
if args .reboot :
388
394
closeNow = True
389
395
waitForAckNak = True
390
- interface .getNode (args .dest , False ).reboot ()
396
+ interface .getNode (args .dest , False , ** getNode_kwargs ).reboot ()
391
397
392
398
if args .reboot_ota :
393
399
closeNow = True
394
400
waitForAckNak = True
395
- interface .getNode (args .dest , False ).rebootOTA ()
401
+ interface .getNode (args .dest , False , ** getNode_kwargs ).rebootOTA ()
396
402
397
403
if args .enter_dfu :
398
404
closeNow = True
399
405
waitForAckNak = True
400
- interface .getNode (args .dest , False ).enterDFUMode ()
406
+ interface .getNode (args .dest , False , ** getNode_kwargs ).enterDFUMode ()
401
407
402
408
if args .shutdown :
403
409
closeNow = True
404
410
waitForAckNak = True
405
- interface .getNode (args .dest , False ).shutdown ()
411
+ interface .getNode (args .dest , False , ** getNode_kwargs ).shutdown ()
406
412
407
413
if args .device_metadata :
408
414
closeNow = True
409
- interface .getNode (args .dest , False ).getMetadata ()
415
+ interface .getNode (args .dest , False , ** getNode_kwargs ).getMetadata ()
410
416
411
417
if args .begin_edit :
412
418
closeNow = True
413
- interface .getNode (args .dest , False ).beginSettingsTransaction ()
419
+ interface .getNode (args .dest , False , ** getNode_kwargs ).beginSettingsTransaction ()
414
420
415
421
if args .commit_edit :
416
422
closeNow = True
417
- interface .getNode (args .dest , False ).commitSettingsTransaction ()
423
+ interface .getNode (args .dest , False , ** getNode_kwargs ).commitSettingsTransaction ()
418
424
419
425
if args .factory_reset or args .factory_reset_device :
420
426
closeNow = True
421
427
waitForAckNak = True
428
+
422
429
full = bool (args .factory_reset_device )
423
- interface .getNode (args .dest , False ).factoryReset (full = full )
430
+ interface .getNode (args .dest , False , ** getNode_kwargs ).factoryReset (full = full )
424
431
425
432
if args .remove_node :
426
433
closeNow = True
427
434
waitForAckNak = True
428
- interface .getNode (args .dest , False ).removeNode (args .remove_node )
435
+ interface .getNode (args .dest , False , ** getNode_kwargs ).removeNode (args .remove_node )
429
436
430
437
if args .reset_nodedb :
431
438
closeNow = True
432
439
waitForAckNak = True
433
- interface .getNode (args .dest , False ).resetNodeDb ()
440
+ interface .getNode (args .dest , False , ** getNode_kwargs ).resetNodeDb ()
434
441
435
442
if args .sendtext :
436
443
closeNow = True
@@ -444,7 +451,7 @@ def onConnected(interface):
444
451
args .dest ,
445
452
wantAck = True ,
446
453
channelIndex = channelIndex ,
447
- onResponse = interface .getNode (args .dest , False ).onAckNak ,
454
+ onResponse = interface .getNode (args .dest , False , ** getNode_kwargs ).onAckNak ,
448
455
)
449
456
else :
450
457
meshtastic .util .our_exit (
@@ -535,7 +542,7 @@ def onConnected(interface):
535
542
if args .set :
536
543
closeNow = True
537
544
waitForAckNak = True
538
- node = interface .getNode (args .dest , False )
545
+ node = interface .getNode (args .dest , False , ** getNode_kwargs )
539
546
540
547
# Handle the int/float/bool arguments
541
548
pref = None
@@ -574,19 +581,19 @@ def onConnected(interface):
574
581
configuration = yaml .safe_load (file )
575
582
closeNow = True
576
583
577
- interface .getNode (args .dest , False ).beginSettingsTransaction ()
584
+ interface .getNode (args .dest , False , ** getNode_kwargs ).beginSettingsTransaction ()
578
585
579
586
if "owner" in configuration :
580
587
print (f"Setting device owner to { configuration ['owner' ]} " )
581
588
waitForAckNak = True
582
- interface .getNode (args .dest , False ).setOwner (configuration ["owner" ])
589
+ interface .getNode (args .dest , False , ** getNode_kwargs ).setOwner (configuration ["owner" ])
583
590
584
591
if "owner_short" in configuration :
585
592
print (
586
593
f"Setting device owner short to { configuration ['owner_short' ]} "
587
594
)
588
595
waitForAckNak = True
589
- interface .getNode (args .dest , False ).setOwner (
596
+ interface .getNode (args .dest , False , ** getNode_kwargs ).setOwner (
590
597
long_name = None , short_name = configuration ["owner_short" ]
591
598
)
592
599
@@ -595,17 +602,17 @@ def onConnected(interface):
595
602
f"Setting device owner short to { configuration ['ownerShort' ]} "
596
603
)
597
604
waitForAckNak = True
598
- interface .getNode (args .dest , False ).setOwner (
605
+ interface .getNode (args .dest , False , ** getNode_kwargs ).setOwner (
599
606
long_name = None , short_name = configuration ["ownerShort" ]
600
607
)
601
608
602
609
if "channel_url" in configuration :
603
610
print ("Setting channel url to" , configuration ["channel_url" ])
604
- interface .getNode (args .dest ).setURL (configuration ["channel_url" ])
611
+ interface .getNode (args .dest , ** getNode_kwargs ).setURL (configuration ["channel_url" ])
605
612
606
613
if "channelUrl" in configuration :
607
614
print ("Setting channel url to" , configuration ["channelUrl" ])
608
- interface .getNode (args .dest ).setURL (configuration ["channelUrl" ])
615
+ interface .getNode (args .dest , ** getNode_kwargs ).setURL (configuration ["channelUrl" ])
609
616
610
617
if "location" in configuration :
611
618
alt = 0
@@ -630,28 +637,28 @@ def onConnected(interface):
630
637
interface .localNode .writeConfig ("position" )
631
638
632
639
if "config" in configuration :
633
- localConfig = interface .getNode (args .dest ).localConfig
640
+ localConfig = interface .getNode (args .dest , ** getNode_kwargs ).localConfig
634
641
for section in configuration ["config" ]:
635
642
traverseConfig (
636
643
section , configuration ["config" ][section ], localConfig
637
644
)
638
- interface .getNode (args .dest ).writeConfig (
645
+ interface .getNode (args .dest , ** getNode_kwargs ).writeConfig (
639
646
meshtastic .util .camel_to_snake (section )
640
647
)
641
648
642
649
if "module_config" in configuration :
643
- moduleConfig = interface .getNode (args .dest ).moduleConfig
650
+ moduleConfig = interface .getNode (args .dest , ** getNode_kwargs ).moduleConfig
644
651
for section in configuration ["module_config" ]:
645
652
traverseConfig (
646
653
section ,
647
654
configuration ["module_config" ][section ],
648
655
moduleConfig ,
649
656
)
650
- interface .getNode (args .dest ).writeConfig (
657
+ interface .getNode (args .dest , ** getNode_kwargs ).writeConfig (
651
658
meshtastic .util .camel_to_snake (section )
652
659
)
653
660
654
- interface .getNode (args .dest , False ).commitSettingsTransaction ()
661
+ interface .getNode (args .dest , False , ** getNode_kwargs ).commitSettingsTransaction ()
655
662
print ("Writing modified configuration to device" )
656
663
657
664
if args .export_config :
@@ -664,7 +671,7 @@ def onConnected(interface):
664
671
665
672
if args .seturl :
666
673
closeNow = True
667
- interface .getNode (args .dest ).setURL (args .seturl )
674
+ interface .getNode (args .dest , ** getNode_kwargs ).setURL (args .seturl )
668
675
669
676
# handle changing channels
670
677
@@ -680,7 +687,7 @@ def onConnected(interface):
680
687
meshtastic .util .our_exit (
681
688
"Warning: Channel name must be shorter. Channel not added."
682
689
)
683
- n = interface .getNode (args .dest )
690
+ n = interface .getNode (args .dest , ** getNode_kwargs )
684
691
ch = n .getChannelByName (args .ch_add )
685
692
if ch :
686
693
meshtastic .util .our_exit (
@@ -719,7 +726,7 @@ def onConnected(interface):
719
726
)
720
727
else :
721
728
print (f"Deleting channel { channelIndex } " )
722
- ch = interface .getNode (args .dest ).deleteChannel (channelIndex )
729
+ ch = interface .getNode (args .dest , ** getNode_kwargs ).deleteChannel (channelIndex )
723
730
724
731
def setSimpleConfig (modem_preset ):
725
732
"""Set one of the simple modem_config"""
@@ -729,7 +736,7 @@ def setSimpleConfig(modem_preset):
729
736
"Warning: Cannot set modem preset for non-primary channel" , 1
730
737
)
731
738
# Overwrite modem_preset
732
- node = interface .getNode (args .dest , False )
739
+ node = interface .getNode (args .dest , False , ** getNode_kwargs )
733
740
if len (node .localConfig .ListFields ()) == 0 :
734
741
node .requestConfig (node .localConfig .DESCRIPTOR .fields_by_name .get ("lora" ))
735
742
node .localConfig .lora .modem_preset = modem_preset
@@ -763,7 +770,7 @@ def setSimpleConfig(modem_preset):
763
770
channelIndex = mt_config .channel_index
764
771
if channelIndex is None :
765
772
meshtastic .util .our_exit ("Warning: Need to specify '--ch-index'." , 1 )
766
- node = interface .getNode (args .dest )
773
+ node = interface .getNode (args .dest , ** getNode_kwargs )
767
774
ch = node .channels [channelIndex ]
768
775
769
776
if args .ch_enable or args .ch_disable :
@@ -827,20 +834,20 @@ def setSimpleConfig(modem_preset):
827
834
if args .get_canned_message :
828
835
closeNow = True
829
836
print ("" )
830
- interface .getNode (args .dest ).get_canned_message ()
837
+ interface .getNode (args .dest , ** getNode_kwargs ).get_canned_message ()
831
838
832
839
if args .get_ringtone :
833
840
closeNow = True
834
841
print ("" )
835
- interface .getNode (args .dest ).get_ringtone ()
842
+ interface .getNode (args .dest , ** getNode_kwargs ).get_ringtone ()
836
843
837
844
if args .info :
838
845
print ("" )
839
846
# If we aren't trying to talk to our local node, don't show it
840
847
if args .dest == BROADCAST_ADDR :
841
848
interface .showInfo ()
842
849
print ("" )
843
- interface .getNode (args .dest ).showInfo ()
850
+ interface .getNode (args .dest , ** getNode_kwargs ).showInfo ()
844
851
closeNow = True
845
852
print ("" )
846
853
pypi_version = meshtastic .util .check_if_newer_version ()
@@ -857,7 +864,7 @@ def setSimpleConfig(modem_preset):
857
864
858
865
if args .get :
859
866
closeNow = True
860
- node = interface .getNode (args .dest , False )
867
+ node = interface .getNode (args .dest , False , ** getNode_kwargs )
861
868
for pref in args .get :
862
869
found = getPref (node , pref [0 ])
863
870
@@ -873,7 +880,7 @@ def setSimpleConfig(modem_preset):
873
880
874
881
if args .qr or args .qr_all :
875
882
closeNow = True
876
- url = interface .getNode (args .dest , True ).getURL (includeAll = args .qr_all )
883
+ url = interface .getNode (args .dest , True , ** getNode_kwargs ).getURL (includeAll = args .qr_all )
877
884
if args .qr_all :
878
885
urldesc = "Complete URL (includes all channels)"
879
886
else :
@@ -928,7 +935,7 @@ def setSimpleConfig(modem_preset):
928
935
print (
929
936
f"Waiting for an acknowledgment from remote node (this could take a while)"
930
937
)
931
- interface .getNode (args .dest , False ).iface .waitForAckNak ()
938
+ interface .getNode (args .dest , False , ** getNode_kwargs ).iface .waitForAckNak ()
932
939
933
940
if args .wait_to_disconnect :
934
941
print (f"Waiting { args .wait_to_disconnect } seconds before disconnecting" )
@@ -1408,6 +1415,20 @@ def initParser():
1408
1415
action = "append" ,
1409
1416
)
1410
1417
1418
+ group .add_argument (
1419
+ "--channel-fetch-attempts" ,
1420
+ help = ("Attempt to retrieve channel settings for --ch-set this many times before giving up." ),
1421
+ default = 3 ,
1422
+ type = int ,
1423
+ )
1424
+
1425
+ group .add_argument (
1426
+ "--timeout" ,
1427
+ help = "How long to wait for replies" ,
1428
+ default = 300 ,
1429
+ type = int ,
1430
+ )
1431
+
1411
1432
group .add_argument (
1412
1433
"--ch-vlongslow" ,
1413
1434
help = "Change to the very long-range and slow channel" ,
0 commit comments