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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to