Just to complete this:  I have now verified that whenever my gw1000 
disappears for while (technically the error is ""ERROR user.*gw1000*: 
Failed to obtain response to command 'CMD_*GW1000*_LIVEDATA' after 3 
attempts"), the driver now correctly recovers. This has happened a couple 
of times, most recently yesterday, and my weewx instance has been up for 
114 days.

So Gary, thanks!!!!

Bob 

On Saturday, March 19, 2022 at 11:15:03 PM UTC-7 gjr80 wrote:

> Just to tidy this up I have released the GW1000 driver v0.4.2 
> <https://github.com/gjr80/weewx-gw1000/releases/tag/v0.4.2> that fixes 
> this issue.
>
> Gary
>
> On Thursday, 17 March 2022 at 13:39:29 UTC+10 gjr80 wrote:
>
>> Bob,
>>
>> The GW100 driver uses discovery only if an IP address for your device is 
>> not specified in weewx.conf and then only in two general areas. First is 
>> during startup; the driver will broadcast to the network and the first 
>> device that responds will be used. The driver identifies and keeps track of 
>> the device being used by MAC address. If no device provides a valid 
>> response WeeWX will either exit or retry in 60 seconds (the default value) 
>> depending on how WeeWX is configured. The second time discovery is used is 
>> if the driver loses contact with the device (this usually occurs if the 
>> device does not respond to a command after three (the default value) 
>> attempts). In this case the driver broadcasts again looking for a device 
>> with the same MAC address as previously noted. If found the driver updates, 
>> if required, the IP address and port used to contact the device. If the 
>> same MAC cannot be found WeeWX will either exit or retry in 60 seconds 
>> depending on how WeeWX is configured. If an IP address is specified 
>> discovery is never used.
>>
>> Other than discovery there is no difference between how the driver 
>> handles a device whether an IP address is specified or not. Experience has 
>> shown that sometimes discovery has been unreliable and hence the preference 
>> for specifying an IP address.
>>
>> Gary
>> On Thursday, 17 March 2022 at 03:56:34 UTC+10 Dr__Bob wrote:
>>
>>> Hi Gary,
>>>
>>> Thanks for looking into this!  Yeah, my "fix" was just me typing away in 
>>> the message, so I indeed did miss the extra ":%d". My coding may be bad, 
>>> but it ain't *that* bad! :-)  
>>> I had, up to now, the ip address for the GW1000 set to auto.  I have an 
>>> atrociously difficult to manage Spectrum router (which I should replace 
>>> with a better one) that doesn't have a web interface to manage it, but 
>>> rather an app.  IP allocation on that app is difficult to find, but I did 
>>> find it, and now I have changed weewx.conf to have a fixed ip address for 
>>> the GW1000.  Will that change anything if weewx again loses contact with 
>>> the GW1000?
>>>
>>> Thanks,
>>>
>>> Bob
>>>
>>> On Tuesday, March 15, 2022 at 11:27:27 PM UTC-7 gjr80 wrote:
>>>
>>>> Thanks for spotting that, device_list is a list of dicts so line 3928 
>>>> was never going to work. I am surprised it has not shown up previously, 
>>>> though it is buried in some code that is seldom used. You almost have the 
>>>> fix correct, but '%s' should be '%s:%d' to give the *IP address:port 
>>>> number* format. There are also a couple of other changes further down 
>>>> from line 3298 that will also need to be made. I should have an update in 
>>>> the next few days; the rediscovery code is complex and I want to make sure 
>>>> sure it is functioning properly (now) - testing of the rediscovery code is 
>>>> time consuming.
>>>>
>>>> In the meantime, are you operating your device with a fixed IP 
>>>> allocation? If possible that is the recommended way to use the GW1x00 
>>>> devices with the GW1000 driver.
>>>>
>>>> Gary
>>>>
>>>> On Wednesday, 16 March 2022 at 04:42:02 UTC+10 Dr__Bob wrote:
>>>>
>>>>> Hi.  From time to time, it seems like my GW1000 disappears.  It looks 
>>>>> like the code is trying to rediscover it, but in the process hits a bug 
>>>>> in 
>>>>> the code and crashes.  This is with weewx 4.5.1 with python 3.7.3 and 
>>>>> GW1000 0.41.  The syslog looks like:
>>>>>
>>>>> Mar 15 04:14:45 raspberrypi weewx[1374] ERROR user.gw1000: Failed to 
>>>>> obtain response to command 'CMD_READ_SENSOR_ID_NEW' after 3 attempts
>>>>>
>>>>> Mar 15 04:14:45 raspberrypi weewx[1374] INFO user.gw1000: Attempting 
>>>>> to re-discover GW1000...
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****  Traceback (most recent call last):
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****    File "/usr/share/weewx/user/gw1000.py", line 3587, in 
>>>>> get_sensor_id
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****      return self.send_cmd_with_retries('CMD_READ_SENSOR_ID_NEW')
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****    File "/usr/share/weewx/user/gw1000.py", line 3740, in 
>>>>> send_cmd_with_retries
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****      raise GW1000IOError(_msg)
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****  user.gw1000.GW1000IOError: Failed to obtain response to command 
>>>>> 'CMD_READ_SENSOR_ID_NEW' after 3 attempts
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     **** 
>>>>>  
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****  During handling of the above exception, another exception occurred:
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     **** 
>>>>>  
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****  Traceback (most recent call last):
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****    File "/usr/share/weewx/user/gw1000.py", line 3024, in run
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****      self.client.collect_sensor_data()
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****    File "/usr/share/weewx/user/gw1000.py", line 2476, in 
>>>>> collect_sensor_data
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****      queue_data = self.get_live_sensor_data()
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****    File "/usr/share/weewx/user/gw1000.py", line 2525, in 
>>>>> get_live_sensor_data
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****      self.update_sensor_id_data()
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****    File "/usr/share/weewx/user/gw1000.py", line 2538, in 
>>>>> update_sensor_id_data
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****      sensor_id_data = self.station.get_sensor_id()
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****    File "/usr/share/weewx/user/gw1000.py", line 3591, in 
>>>>> get_sensor_id
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****      if not self.rediscover():
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****    File "/usr/share/weewx/user/gw1000.py", line 3928, in rediscover
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****      gw1000_str = ', '.join([':'.join(['%s:%d' % b]) for b in 
>>>>> device_list])
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****    File "/usr/share/weewx/user/gw1000.py", line 3928, in <listcomp>
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****      gw1000_str = ', '.join([':'.join(['%s:%d' % b]) for b in 
>>>>> device_list])
>>>>>
>>>>> Mar 15 04:15:05 raspberrypi weewx[1374] CRITICAL user.gw1000:     
>>>>> ****  TypeError: not enough arguments for format string
>>>>>
>>>>> I *think* the bug is on line 3928 in rediscover(self):
>>>>>
>>>>> gw1000_str = ', '.join([':'.join(['%s:%d' % b]) for b in device_list])
>>>>>
>>>>> This looks like a copy of the similar line further up in the code 
>>>>> where the GW1000 is first discovered.  I'm a complete python newbie, but 
>>>>> it 
>>>>> looks like the second join in the above line wants two fields but is only 
>>>>> getting one.  Shouldn't it be ".join(['%s' % 
>>>>> (b['ip_address'],b['port'])])"?  That's the way the first version of 
>>>>> gw1000_str is formed.
>>>>>
>>>>> Cheers,
>>>>>
>>>>> Bob Clare 
>>>>>
>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"weewx-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to weewx-user+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/weewx-user/3f598ee8-5ef0-450b-beb1-15ede84848efn%40googlegroups.com.

Reply via email to