Hi,
I believe I have found a recoverability bug in the Ecowitt Local HTTP
service.
*Environment*
WeeWX: 5.4.0
Python: 3.12.3
Operating system: Ubuntu 24.04.4 LTS
Architecture: x86_64
Virtualisation: KVM
Installation: Python virtual environment under /opt/weewx
Ecowitt extension: ecowitt_http.py 0.1.0a28
Gateway: Ecowitt GW1200
Connection: Local HTTP
Poll interval: 20 seconds
*Relevant configuration*
[Engine]
[[Services]]
data_services = user.ecowitt_http.EcowittHttpService
[EcowittHttp]
ip_address = 192.168.10.24
poll_interval = 20
driver = user.ecowitt_http
*Problem*
At 02:52:33 on 23 July 2026, the GW1200 reset an HTTP connection while
ecowitt_http was reading get_livedata_info.
The relevant portion of the system log is:
Jul 23 02:52:33 weather weewxd[37665]: CRITICAL user.ecowitt_http: ****
Traceback (most recent call last):
Jul 23 02:52:33 weather weewxd[37665]: CRITICAL user.ecowitt_http: ****
File "/opt/weewx/weewx-data/bin/user/ecowitt_http.py", line 5231, in run
Jul 23 02:52:33 weather weewxd[37665]: CRITICAL user.ecowitt_http: ****
self.client.collect()
Jul 23 02:52:33 weather weewxd[37665]: CRITICAL user.ecowitt_http: ****
File "/opt/weewx/weewx-data/bin/user/ecowitt_http.py", line 5106, in collect
Jul 23 02:52:33 weather weewxd[37665]: CRITICAL user.ecowitt_http: ****
queue_data = self.get_current_data()
Jul 23 02:52:33 weather weewxd[37665]: CRITICAL user.ecowitt_http: ****
File "/opt/weewx/weewx-data/bin/user/ecowitt_http.py", line 5169, in
get_current_data
Jul 23 02:52:33 weather weewxd[37665]: CRITICAL user.ecowitt_http: ****
curr_data = self.device.get_live_data()
Jul 23 02:52:33 weather weewxd[37665]: CRITICAL user.ecowitt_http: ****
File "/opt/weewx/weewx-data/bin/user/ecowitt_http.py", line 10341, in
get_live_data
Jul 23 02:52:33 weather weewxd[37665]: CRITICAL user.ecowitt_http: ****
live_data = self.api.get_livedata_info()
Jul 23 02:52:33 weather weewxd[37665]: CRITICAL user.ecowitt_http: ****
File "/opt/weewx/weewx-data/bin/user/ecowitt_http.py", line 5387, in
get_livedata_info
Jul 23 02:52:33 weather weewxd[37665]: CRITICAL user.ecowitt_http: ****
return self.request('get_livedata_info')
Jul 23 02:52:33 weather weewxd[37665]: CRITICAL user.ecowitt_http: ****
File "/opt/weewx/weewx-data/bin/user/ecowitt_http.py", line 5320, in request
Jul 23 02:52:33 weather weewxd[37665]: CRITICAL user.ecowitt_http: ****
with urllib.request.urlopen(req, timeout=self.timeout) as w:
Jul 23 02:52:33 weather weewxd[37665]: CRITICAL user.ecowitt_http: ****
ConnectionResetError: [Errno 104] Connection reset by peer
The main WeeWX process continued running, but the EcowittHttpCollector
thread terminated and did not restart.
Fields supplied by the service then stopped being added to archive records.
In my case, lightning_strike_count was stored as 0.0 until 02:55, then
became NULL in every subsequent archive record.
Restarting WeeWX immediately restored collection.
Debug was not enabled when the connection reset occurred, but the complete
exception traceback was captured in the system journal.
*Apparent cause*
The retry loop in EcowittHttpApi.request() catches socket.timeout, but it
does not catch ConnectionResetError.
The exception therefore escapes the retry loop and reaches the collector
thread’s outer exception handler. The traceback is logged, but the
collector thread then terminates permanently.
The HTTP request and retry block in my installed file matched the current
upstream version before this change.
My local file also contains a separate modification for missing
lightning-distance values such as "--.-", but that is unrelated to this
connection failure.
*Tested local patch*
I added the following handler immediately after the existing socket.timeout
handler:
*except ConnectionResetError as e: # Treat a device TCP reset as a
temporary failure and allow # the existing retry loop to make another
attempt. log.warning( 'Device connection reset on attempt %d
of %d: %s' % (attempt + 1, self.max_tries, e) ) *
I also changed the exhausted-retry block to return cleanly:
*else: log.debug( 'Failed to get device data after %d
attempts' % self.max_tries ) return None *
*Results after applying the patch*
Python syntax validation passed.
WeeWX restarted normally.
ecowitt_http resumed polling the GW1200.
New archive records again contained lightning_strike_count = 0.0.
No further ecowitt_http errors were logged.
WeeWX report generation completed successfully.
The affected lightning chart began working normally again.
*Question*
Would catching the broader ConnectionError class be preferable to catching
only ConnectionResetError, so related temporary TCP failures are also
retried?
--
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 [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/weewx-user/eb0878e4-2f97-475c-acfc-630d38411abfn%40googlegroups.com.