11local log = require " log"
2- local discovery = {}
32local fields = require " fields"
43local discovery_mdns = require " discovery_mdns"
54local socket = require " cosock.socket"
65
7- local processing_devices = {}
6+ local discovery = {
7+ last_try_time = {}
8+ }
89
910function discovery .set_device_field (driver , device )
1011 local device_cache_value = driver .datastore .discovery_cache [device .device_network_id ]
@@ -22,8 +23,7 @@ function discovery.set_device_field(driver, device)
2223 driver .datastore .discovery_cache [device .device_network_id ] = nil
2324end
2425
25- local function update_device_discovery_cache (driver , dni , ip )
26- local device_info = driver .discovery_helper .get_device_info (driver , dni , ip )
26+ local function update_device_discovery_cache (driver , dni , ip , device_info )
2727 if driver .datastore .discovery_cache [dni ] == nil then
2828 driver .datastore .discovery_cache [dni ] = {}
2929 end
3333
3434local function try_add_device (driver , device_dni , device_ip )
3535 log .trace (string.format (" try_add_device : dni= %s, ip= %s" , device_dni , device_ip ))
36+ local device_info = driver .discovery_helper .get_device_info (driver , device_dni , device_ip )
3637
37- update_device_discovery_cache (driver , device_dni , device_ip )
38- local create_device_msg = driver .discovery_helper .get_device_create_msg (driver , device_dni , device_ip )
38+ update_device_discovery_cache (driver , device_dni , device_ip , device_info )
39+ local create_device_msg = driver .discovery_helper .get_device_create_msg (driver , device_dni , device_ip , device_info )
40+ if not create_device_msg then
41+ log .error_with ({ hub_logs = true }, string.format (" Failed to get device info. dni= %s, ip= %s" , device_dni , device_ip ))
42+ return " device info not found"
43+ end
3944
4045 local credential = driver .discovery_helper .get_credential (driver , device_dni , device_ip )
4146
@@ -52,15 +57,20 @@ local function try_add_device(driver, device_dni, device_ip)
5257 end
5358
5459 log .info_with ({ hub_logs = true }, string.format (" try_create_device. dni= %s, ip= %s" , device_dni , device_ip ))
55- processing_devices [device_dni ] = true
56- driver :try_create_device (create_device_msg )
60+
61+ local success , ret = pcall (driver .try_create_device , driver , create_device_msg )
62+ if success then
63+ discovery .last_try_time [device_dni ] = os.time ()
64+ else
65+ log .error_with ({ hub_logs = true }, string.format (" Failed to try_create_device. dni= %s, %s" , device_dni , ret ))
66+ end
5767 return nil
5868end
5969
6070function discovery .device_added (driver , device )
6171 log .info_with ({ hub_logs = true }, string.format (" device_added. dni= %s" , device .device_network_id ))
6272 discovery .set_device_field (driver , device )
63- processing_devices [device .device_network_id ] = nil
73+ discovery . last_try_time [device .device_network_id ] = nil
6474 driver .lifecycle_handlers .init (driver , device )
6575end
6676
@@ -93,14 +103,27 @@ local function discovery_device(driver)
93103
94104 for dni , ip in pairs (unknown_discovered_devices ) do
95105 log .trace (string.format (" unknown dni= %s, ip= %s" , dni , ip ))
96- if not processing_devices [dni ] then
97- try_add_device (driver , dni , ip )
106+ local is_already_added = false
107+ for _ , device in pairs (driver :get_devices ()) do
108+ if device .device_network_id == dni then
109+ is_already_added = true
110+ break
111+ end
112+ end
113+ if not is_already_added then
114+ local time_since_last_try = os.time () - (discovery .last_try_time [dni ] or 0 )
115+ if (not discovery .last_try_time [dni ]) or (time_since_last_try > 10 ) then
116+ try_add_device (driver , dni , ip )
117+ else
118+ log .trace (string.format (" skip adding device because it was tried recently. dni= %s, ip= %s, since %s sec" , dni , ip , time_since_last_try ))
119+ end
98120 end
99121 end
100122end
101123
102124function discovery .do_network_discovery (driver , _ , should_continue )
103125 log .info_with ({ hub_logs = true }, string.format (" discovery start for Aqara FP2" ))
126+ discovery .last_try_time = {}
104127 while should_continue () do
105128 discovery_device (driver )
106129 socket .sleep (1 )
0 commit comments