Hi Thomas, Done :) and it's been stable overnight, thanks again for the advice.
Colin On Wed, May 8, 2019 at 1:59 AM Thomas Keffer <tkef...@gmail.com> wrote: > You should terminate your lines with '\n', not '\r' when you write your > file. > > while True: > data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes > print "Received message:", data > with open(fname, 'w') as f: > for ds in data.split(','): > f.write(ds + "\n") > > -tk > > > On Tue, May 7, 2019 at 3:35 AM Colin Larsen <colin.lar...@gmail.com> > wrote: > >> Thanks Gary appreciate the thoughts, I'll try those out tomorrow >> >> Colin >> >> On Tue, 7 May 2019, 20:23 gjr80, <gjroder...@gmail.com> wrote: >> >>> A few thoughts. If it works sometimes and not others there must be a >>> problem with either the consistency of the format of the data or the >>> algorithm being used to parse the data. Can't say I am a big fan of slicing >>> in a situation like this, I think it can be a bit rigid at times. Maybe >>> consider using split. To to obtain your name, value pair maybe something >>> like: >>> >>> ... >>> for line in fd: >>> data = line.split("=") >>> if len(data) != 2: >>> continue >>> name,value = data >>> new_record_data[self.label_map.get(name, name)] = >>> to_float(value) >>> ... >>> >>> or cut out the middle man if you like: >>> >>> ... >>> for line in fd: >>> data = line.split("=") >>> if len(data) != 2: >>> continue >>> new_record_data[self.label_map.get(data[0], data[0])] = >>> to_float(data[1]) >>> ... >>> >>> Gary >>> >>> On Tuesday, 7 May 2019 17:05:27 UTC+10, Colin Larsen wrote: >>>> >>>> And this is the code the writes the txt file - capturing a string via >>>> UDP >>>> >>>> *#!/usr/bin/env python* >>>> >>>> *import* socket >>>> >>>> *from* shutil *import* copyfile >>>> >>>> >>>> UDP_IP = *"0.0.0.0"* >>>> >>>> UDP_PORT = 9886 >>>> >>>> fname = *"/home/pi/AQIData.txt"* >>>> >>>> >>>> sock = socket.socket(socket.AF_INET,* # Internet* >>>> >>>> socket.SOCK_DGRAM)* # UDP* >>>> >>>> sock.bind((UDP_IP, UDP_PORT)) >>>> >>>> >>>> >>>> *while* True: >>>> >>>> >>>> data, addr = sock.recvfrom(1024)* # buffer size is 1024 bytes* >>>> >>>> *print* *"Received message:"*, data >>>> >>>> dataSplit = data.split(*','*) >>>> >>>> f = open(fname,*'w'*) >>>> >>>> *for* ds *in* dataSplit: >>>> >>>> f.write(ds + *"\r"*) >>>> >>>> f.write(*'\n'*) >>>> >>>> f.close() >>>> >>>> On Tue, May 7, 2019 at 7:01 PM Colin Larsen <colin...@gmail.com> wrote: >>>> >>>>> Apparently #015 is a numeric representation of \r or 'return' to we >>>>> can rule that out? >>>>> >>>>> On Tue, May 7, 2019 at 6:56 PM Colin Larsen <colin...@gmail.com> >>>>> wrote: >>>>> >>>>>> Well this is a little strange. This went fine for a while then >>>>>> stopped again with pretty much the same error. It appears to be missing >>>>>> the >>>>>> beginning of the first line in the file which is AQI25 = then gets the >>>>>> reading which is 4.55 >>>>>> >>>>>> invalid literal for float(): 4.55#015AQI100 = 9.09#015AQIIndex = >>>>>> 18#015AQICO2 = 863 >>>>>> >>>>>> Is the #015 a clue of any sorts? >>>>>> >>>>>> The file looks ok >>>>>> >>>>>> AQI25 = 4.55 >>>>>> >>>>>> AQI100 = 9.09 >>>>>> >>>>>> AQIIndex = 18 >>>>>> >>>>>> AQICO2 = 863 >>>>>> >>>>>> >>>>>> Error; >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: engine: Main loop exiting. >>>>>> Shutting engine down. >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: engine: Caught >>>>>> unrecoverable exception in engine: >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** invalid literal >>>>>> for float(): 4.55#015AQI100 = 9.09#015AQIIndex = 18#015AQICO2 = 863 >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** Traceback (most >>>>>> recent call last): >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** File >>>>>> "/usr/share/weewx/weewx/engine.py", line 890, in main >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** engine.run() >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** File >>>>>> "/usr/share/weewx/weewx/engine.py", line 202, in run >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** >>>>>> self.dispatchEvent(weewx.Event(weewx.POST_LOOP)) >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** File >>>>>> "/usr/share/weewx/weewx/engine.py", line 224, in dispatchEvent >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** >>>>>> callback(event) >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** File >>>>>> "/usr/share/weewx/weewx/engine.py", line 574, in post_loop >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** >>>>>> self._software_catchup() >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** File >>>>>> "/usr/share/weewx/weewx/engine.py", line 646, in _software_catchup >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** >>>>>> self.engine.dispatchEvent(weewx.Event(weewx.NEW_ARCHIVE_RECORD, >>>>>> record=record, origin='software')) >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** File >>>>>> "/usr/share/weewx/weewx/engine.py", line 224, in dispatchEvent >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** >>>>>> callback(event) >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** File >>>>>> "/usr/share/weewx/user/filepile.py", line 91, in new_archive_record >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** >>>>>> new_record_data[self.label_map.get(name, >>>>>> name)] = to_float(value) >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** File >>>>>> "/usr/share/weewx/weeutil/weeutil.py", line 1280, in to_float >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** return >>>>>> float(x) if x is not None else None >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** ValueError: >>>>>> invalid literal for float(): 4.55#015AQI100 = 9.09#015AQIIndex = >>>>>> 18#015AQICO2 = 863 >>>>>> >>>>>> May 7 18:50:16 raspberrypi weewx[11960]: **** Exiting. >>>>>> >>>>>> On Tue, May 7, 2019 at 3:23 PM Colin Larsen <colin...@gmail.com> >>>>>> wrote: >>>>>> >>>>>>> Hi Thomas >>>>>>> >>>>>>> Thanks for the quick reply. It was just the format, it needs the >>>>>>> spaces so each line in the text file is >>>>>>> >>>>>>> >>>>>>> AQI25 = 1.60 >>>>>>> >>>>>>> AQI100 = 3.30 >>>>>>> >>>>>>> AQIIndex = 6 >>>>>>> >>>>>>> AQICO2 = 683 >>>>>>> >>>>>>> >>>>>>> Once I did that and checked the database after an archive period the >>>>>>> fields were populated >>>>>>> >>>>>>> Does my section with the units look valid? I've borrowed that from a >>>>>>> similar service but I can't wrap my head around how the relationship >>>>>>> between those and the data in the txt file get joined together >>>>>>> >>>>>>> >>>>>>> Thanks again >>>>>>> >>>>>>> Colin >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Tue, May 7, 2019 at 3:13 PM Thomas Keffer <tke...@gmail.com> >>>>>>> wrote: >>>>>>> >>>>>>>> Hi, Colin >>>>>>>> >>>>>>>> Does your text file use newlines ('\n') as line delineators? >>>>>>>> Perhaps it is using the MS-DOS standard of '\n\r'? Examine the file >>>>>>>> carefully and make sure it contains what you think it contains. >>>>>>>> >>>>>>>> -tk >>>>>>>> >>>>>>>> On Mon, May 6, 2019 at 8:05 PM Colin Larsen <colin...@gmail.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> Hi all >>>>>>>>> >>>>>>>>> I'm trying to get Filepile working but have come across an error >>>>>>>>> that I don't understand. Any help appreciated. The database has been >>>>>>>>> extended with fields to match those below in the data file - am I just >>>>>>>>> missing spaces in the layout? Should it be AQI25 = 1.60 etc etc >>>>>>>>> >>>>>>>>> Many thanks >>>>>>>>> >>>>>>>>> This is my data file; >>>>>>>>> >>>>>>>>> AQI25=1.60 >>>>>>>>> >>>>>>>>> AQI100=3.30 >>>>>>>>> >>>>>>>>> AQIIndex=6 >>>>>>>>> >>>>>>>>> AQICO2=683 >>>>>>>>> >>>>>>>>> >>>>>>>>> This is my stanza in weewx.conf >>>>>>>>> >>>>>>>>> >>>>>>>>> ############################################################################## >>>>>>>>> >>>>>>>>> >>>>>>>>> # This section is for FilePile >>>>>>>>> >>>>>>>>> >>>>>>>>> [FilePile] >>>>>>>>> >>>>>>>>> >>>>>>>>> filename = /home/pi/AQIData.txt >>>>>>>>> >>>>>>>>> unit_system = METRIC >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> ############################################################################## >>>>>>>>> >>>>>>>>> >>>>>>>>> This is my filepile.py (modified from original to suit) >>>>>>>>> >>>>>>>>> >>>>>>>>> *import* syslog >>>>>>>>> >>>>>>>>> *import* weewx >>>>>>>>> >>>>>>>>> *import* weewx.units >>>>>>>>> >>>>>>>>> *from* weewx.wxengine *import* StdService >>>>>>>>> >>>>>>>>> *from* weeutil.weeutil *import* to_float >>>>>>>>> >>>>>>>>> >>>>>>>>> weewx.units.USUnits[*'group_gas_concentration'*] = *'ppm'* >>>>>>>>> >>>>>>>>> weewx.units.MetricUnits[*'group_gas_concentration'*] = *'ppm'* >>>>>>>>> >>>>>>>>> weewx.units.MetricWXUnits[*'group_gas_concentration'*] = *'ppm'* >>>>>>>>> >>>>>>>>> weewx.units.default_unit_format_dict[*'ppm'*] = *'%.0f'* >>>>>>>>> >>>>>>>>> weewx.units.default_unit_label_dict[*'ppm'*] = *' ppm'* >>>>>>>>> >>>>>>>>> >>>>>>>>> weewx.units.USUnits[*'group_dust'*] = >>>>>>>>> *'microgramm_per_meter_cubic'* >>>>>>>>> >>>>>>>>> weewx.units.MetricUnits[*'group_dust'*] = >>>>>>>>> *'microgramm_per_meter_cubic'* >>>>>>>>> >>>>>>>>> weewx.units.MetricWXUnits[*'group_dust'*] = >>>>>>>>> *'microgramm_per_meter_cubic'* >>>>>>>>> >>>>>>>>> weewx.units.default_unit_format_dict[ >>>>>>>>> *'microgramm_per_meter_cubic'*] = *'%.1f'* >>>>>>>>> >>>>>>>>> weewx.units.default_unit_label_dict[*'microgramm_per_meter_cubic'* >>>>>>>>> ] = *' \xce\xbcg/m\xc2\xb3'* >>>>>>>>> >>>>>>>>> >>>>>>>>> *class* FilePile(StdService): >>>>>>>>> >>>>>>>>> *"""WeeWX service for augmenting a record with data parsed >>>>>>>>> from a file."""* >>>>>>>>> >>>>>>>>> >>>>>>>>> *def** __init__*(self, engine, config_dict): >>>>>>>>> >>>>>>>>> * # Initialize my superclass:* >>>>>>>>> >>>>>>>>> super(FilePile, self).__init__(engine, config_dict) >>>>>>>>> >>>>>>>>> * # Extract our stanza from the configuration dicdtionary* >>>>>>>>> >>>>>>>>> filepile_dict = config_dict.get(*'FilePile'*, {}) >>>>>>>>> >>>>>>>>> * # Get the location of the file ...* >>>>>>>>> >>>>>>>>> self.filename = filepile_dict.get(*'filename'*, >>>>>>>>> *'/var/tmp/filepile.txt'*) >>>>>>>>> >>>>>>>>> * # ... and the unit system it will use* >>>>>>>>> >>>>>>>>> unit_system_name = filepile_dict.get(*'unit_system'*, >>>>>>>>> *'METRICWX'*).strip().upper() >>>>>>>>> >>>>>>>>> * # Make sure we know about the unit system. If not, raise >>>>>>>>> an exception.* >>>>>>>>> >>>>>>>>> *if* unit_system_name *not* *in* >>>>>>>>> weewx.units.unit_constants: >>>>>>>>> >>>>>>>>> *raise* ValueError(*"FilePile: Unknown unit system: >>>>>>>>> %s"* % unit_system_name) >>>>>>>>> >>>>>>>>> * # Use the numeric code for the unit system* >>>>>>>>> >>>>>>>>> self.unit_system = >>>>>>>>> weewx.units.unit_constants[unit_system_name] >>>>>>>>> >>>>>>>>> >>>>>>>>> * # Mapping from variable names to weewx names* >>>>>>>>> >>>>>>>>> self.label_map = filepile_dict.get(*'label_map'*, {}) >>>>>>>>> >>>>>>>>> syslog.syslog(syslog.LOG_INFO, *"filepile: Using %s with >>>>>>>>> the '%s' unit system"* >>>>>>>>> >>>>>>>>> % (self.filename, unit_system_name)) >>>>>>>>> >>>>>>>>> syslog.syslog(syslog.LOG_INFO, *"filepile: Label map is >>>>>>>>> %s"* % self.label_map) >>>>>>>>> >>>>>>>>> >>>>>>>>> * # Bind to the NEW_ARCHIVE_RECORD event* >>>>>>>>> >>>>>>>>> self.bind(weewx.NEW_ARCHIVE_RECORD, >>>>>>>>> self.new_archive_record) >>>>>>>>> >>>>>>>>> >>>>>>>>> *def** new_archive_record*(self, event): >>>>>>>>> >>>>>>>>> new_record_data = {} >>>>>>>>> >>>>>>>>> *try*: >>>>>>>>> >>>>>>>>> *with* open(self.filename, *'r'*) *as* fd: >>>>>>>>> >>>>>>>>> *for* line *in* fd: >>>>>>>>> >>>>>>>>> eq_index = line.find(*'='*) >>>>>>>>> >>>>>>>>> * # Ignore all lines that do not have an equal sign* >>>>>>>>> >>>>>>>>> *if* eq_index == -1: >>>>>>>>> >>>>>>>>> *continue* >>>>>>>>> >>>>>>>>> name = line[:eq_index].strip() >>>>>>>>> >>>>>>>>> value = line[eq_index + 1:].strip() >>>>>>>>> >>>>>>>>> new_record_data[self.label_map.get(name, >>>>>>>>> name)] = to_float(value) >>>>>>>>> >>>>>>>>> * # Supply a unit system if one wasn't included in >>>>>>>>> the file* >>>>>>>>> >>>>>>>>> *if* *'usUnits'* *not* *in* new_record_data: >>>>>>>>> >>>>>>>>> new_record_data[*'usUnits'*] = >>>>>>>>> self.unit_system >>>>>>>>> >>>>>>>>> * # Convert the new values to the same unit system >>>>>>>>> as the record* >>>>>>>>> >>>>>>>>> target_data = >>>>>>>>> weewx.units.to_std_system(new_record_data, event.record[ >>>>>>>>> *'usUnits'*]) >>>>>>>>> >>>>>>>>> * # Add the converted values to the record:* >>>>>>>>> >>>>>>>>> event.record.update(target_data) >>>>>>>>> >>>>>>>>> *except* IOError *as* e: >>>>>>>>> >>>>>>>>> syslog.syslog(syslog.LOG_ERR, *"FilePile: Cannot open >>>>>>>>> file. Reason: %s"* % e) >>>>>>>>> >>>>>>>>> This is the syslog error; >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: engine: Caught >>>>>>>>> unrecoverable exception in engine: >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** invalid >>>>>>>>> literal for float(): 1.60#015AQI100=3.30#015AQIIndex=6#015AQICO2=683 >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** Traceback >>>>>>>>> (most recent call last): >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** File >>>>>>>>> "/usr/share/weewx/weewx/engine.py", line 890, in main >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** >>>>>>>>> engine.run() >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** File >>>>>>>>> "/usr/share/weewx/weewx/engine.py", line 202, in run >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** >>>>>>>>> self.dispatchEvent(weewx.Event(weewx.POST_LOOP)) >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** File >>>>>>>>> "/usr/share/weewx/weewx/engine.py", line 224, in dispatchEvent >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** >>>>>>>>> callback(event) >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** File >>>>>>>>> "/usr/share/weewx/weewx/engine.py", line 574, in post_loop >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** >>>>>>>>> self._software_catchup() >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** File >>>>>>>>> "/usr/share/weewx/weewx/engine.py", line 646, in _software_catchup >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** >>>>>>>>> self.engine.dispatchEvent(weewx.Event(weewx.NEW_ARCHIVE_RECORD, >>>>>>>>> record=record, origin='software')) >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** File >>>>>>>>> "/usr/share/weewx/weewx/engine.py", line 224, in dispatchEvent >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** >>>>>>>>> callback(event) >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** File >>>>>>>>> "/usr/share/weewx/user/filepile.py", line 91, in new_archive_record >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** >>>>>>>>> new_record_data[self.label_map.get(name, >>>>>>>>> name)] = to_float(value) >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** File >>>>>>>>> "/usr/share/weewx/weeutil/weeutil.py", line 1280, in to_float >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** return >>>>>>>>> float(x) if x is not None else None >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** ValueError: >>>>>>>>> invalid literal for float(): >>>>>>>>> 1.60#015AQI100=3.30#015AQIIndex=6#015AQICO2=683 >>>>>>>>> >>>>>>>>> May 7 14:50:16 raspberrypi weewx[6605]: **** Exiting. >>>>>>>>> >>>>>>>>> -- >>>>>>>>> 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...@googlegroups.com. >>>>>>>>> To view this discussion on the web visit >>>>>>>>> https://groups.google.com/d/msgid/weewx-user/CACjxfUvKW4goXJ9TZYUWkDm4YdxLqpeP_Ez1EzRheJyJ5_h4ew%40mail.gmail.com >>>>>>>>> <https://groups.google.com/d/msgid/weewx-user/CACjxfUvKW4goXJ9TZYUWkDm4YdxLqpeP_Ez1EzRheJyJ5_h4ew%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>>>>>> . >>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>> >>>>>>>> -- >>>>>>>> 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...@googlegroups.com. >>>>>>>> To view this discussion on the web visit >>>>>>>> https://groups.google.com/d/msgid/weewx-user/CAPq0zEB0Tn%2B2q2sei37n%2BrTGO4pqq8cGL-5zF_E4dpMMEJzyiQ%40mail.gmail.com >>>>>>>> <https://groups.google.com/d/msgid/weewx-user/CAPq0zEB0Tn%2B2q2sei37n%2BrTGO4pqq8cGL-5zF_E4dpMMEJzyiQ%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>>>>> . >>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>> >>>>>>> -- >>> 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/0f6edb07-8759-4ca4-8b91-d0745db22848%40googlegroups.com >>> <https://groups.google.com/d/msgid/weewx-user/0f6edb07-8759-4ca4-8b91-d0745db22848%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- >> 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/CACjxfUtAX4SeZxkJWPZdtOSKFAOVaZY6-xJhUPmaAmTth5ATDA%40mail.gmail.com >> <https://groups.google.com/d/msgid/weewx-user/CACjxfUtAX4SeZxkJWPZdtOSKFAOVaZY6-xJhUPmaAmTth5ATDA%40mail.gmail.com?utm_medium=email&utm_source=footer> >> . >> For more options, visit https://groups.google.com/d/optout. >> > -- > 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/CAPq0zEA%3DdCv_XjMyW_9%2BmhX-gTmfH6FPwU7w5SpRMCZTLNQJMQ%40mail.gmail.com > <https://groups.google.com/d/msgid/weewx-user/CAPq0zEA%3DdCv_XjMyW_9%2BmhX-gTmfH6FPwU7w5SpRMCZTLNQJMQ%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- 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/CACjxfUtyof81GJyyWgLmp7Pbz0q9KtpX%3DqSyveSNk3%3DFKqJ1KQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.