Cydia pomonella

422 views
Skip to first unread message

crh...@lacusveris.com

unread,
Sep 24, 2017, 4:28:02 AM9/24/17
to weewx-user
That's codling moth, the worm in the apple.  I have a decade-old backyard orchard and have built up a sustaining population of these buggers.  Next year I'm going to get serious about hunting them down -- every one of them.

To this end, I put up a new Ambient WS2095 weather station and installed *weewx* on my Linux desktop, which does not run unattended.  So far, so good.  I see nominal, continuous temp stats being logged.

My goal this winter is to learn to graph cumulative degree days, which I will use next summer to predict with uncanny accuracy (so they say) the very day that most C. pomonella larva are hatching.  That is the day I will attack.

Now it occurs to me this is not an unreasonable or unusual goal.  I wonder if anyone else has done this and can show me how without my having to re-invent the wheel.

I see hints in the *weewx* User's Guide that degree-day, degree_day, degreeday, and heating-day calculations are possible, but these don't seem to be implemented.  I'm guessing they may be implemented in the *xstats* extension, but I'm not finding any such variable names there.  (I may not be searching correctly or even searching in the right place.)

Thanks for any suggestions.

Andrew Milner

unread,
Sep 24, 2017, 5:41:09 AM9/24/17
to weewx-user
I got intrigued by this, but also got nowhere!!  NOAA reports report heating and cooling days, which I think are probably using a base temperature of 65F.  I cannot find however where the base temperature is set up, or even how the NOAA template manages to evaluate tags such as day.heatdegree.sum (or something like that) which I see being used in the template.

Baffled and also now eager for an explanation/better description from Tom and the gang.  I suspect however that if the base temperature could be set/adjusted a modified NOAA report would provide the detail you require.  However, even then I do not see how one can graph a reading evaluated for the NOAA reports.  There must, surely, be a way - but like you, I remain baffled and awaiting someone else's input to this fascinating thread.

gjr80

unread,
Sep 24, 2017, 7:17:22 AM9/24/17
to weewx-user
Heating and cooling degree base temps are set in the respective skin.conf under [Units] [[DegreeDays]] using options heating_base and cooling_base (have a look in the Standard skin.conf). If omitted the default of 65F is used.

As for plotting the data, the number 1 rule for the weeWX plot engine is "it can only be plotted if it's stored in the archive". Heating and cooling degree days are not in the default weeWX schema nor are they calculated for each archive/loop period. Rather they are calculated as an aggregate over some period, eg $month.heatdeg.sum, for use in a cheetah generated report. I am sure heating and cooling degree days could be archived so that weeWX can plot them but there will be a bit of coding involved.

I know little of the life cycle of the cydia pomonella, but I suspect the NOAA format monthly report (with an adjusted base temp if required) may be the simplest approach to get the info you are after. A customised report could be produced that generates a running total, the report for the current month is updated each report cycle so it would be very close to being current (within an archive period) if that matters. If a more funky weeWX generated plot is required then I suspect there will be some significant work required.

Gary

Andrew Milner

unread,
Sep 24, 2017, 8:38:55 AM9/24/17
to weewx-user
Thanks for that info Gary - I had not noticed the [[DegreeeDays]] section of weewx.conf before.  I am sure that setting the appropriate base temperature would provide the necessary information for fighting his worms - and as the base is set in a skin could result in a customised "Worm destruction" report which is based on the NOAA reports!!  I modified the base template to provide an HTML prettier NOAA report, so combining the two could generate a pretty Worm report without needing to go to the trouble of storing data just to generate graphs.

CRh...@lacusveris.com

unread,
Sep 28, 2017, 1:17:30 PM9/28/17
to weewx-user
Ah, yes -- the NOAA text reports.  I has them.  They are in /var/www/html/weewx/NOAA/ and are generated automagically.

It seems that the weeWX Image Generator really needs recode functionality (in SPSS parlance [I'm probably dating myself here.]) so that basic re-scaling, axis offsets, and the like could be achieved ad hoc by specifying the calculations to be done without storing the calculated values.  Wouldn't it be neat if it were that simple?

What I'd like to see is a graph, not a table of figures.  I can deal with figures, but graphs are more compelling.  Cumulative heating-degree days rises more rapidly in late spring than in early spring.  Somewhere you come to "biofix," the first reliably detectable presence of adult male moths.  This is usually specified as a date although it may just as well be the cumulative heating-degree days on that date.  Consider a conventional timeline of degrees.  You would place a horizontal line where cumulative heating-degree days crosses biofix.  Then subsequent intersections of other degree lines with cumulative heating-degree days at various degree intervals above biofix indicate dates when repeated treatments for larva will be most effective.  This is not date-controlled; it's degree-based.  Of course, to appreciate how soon the days of treatment will come, you need to visualize how fast heating-degree days are accumulating.  Hence, the need for a graph.

I think this could be achieved by providing a background image for the chart (not the image) with the horizontal rules already in place and then scaling the plotted line to fit the static background.  That shouldn't be too much of a stretch, unlike charting calculated values instead of stored values.

Perhaps I'd be better off just to write a complete generator for this application.

gjr80

unread,
Sep 28, 2017, 1:21:30 PM9/28/17
to weewx-user
Quite right, and I think I can speak for Tom here and say that a pull request is always welcome.

Gary

Andrew Milner

unread,
Sep 28, 2017, 1:49:00 PM9/28/17
to weewx-user
A 'thinking outside the box' approach could be to:
a) change NOAA template (or add a new template based on a copy) to create a 'cidia pomonella' csv file using appropriate baseline temperature and some of the NOAA report fields eg temp
b) read csv using standalone software, (which could also access archive database if necessary of course)
c) create whatever charts etc u want within the standalone software using whatever graphing sw you desire eg matplotlib.  I do this with soil moisture plots for my plants - 

d) run the chart generator via cron at frequency you require eg every 4 hours

CRh...@lacusveris.com

unread,
May 16, 2018, 3:17:04 AM5/16/18
to weewx-user
I've whipped together a weeWX extension called cydia.  It graphically predicts developmental stages of the codling moth (Cydia pomonella), an apple tree pest, based on daily temperature measurements.  See the software extension installation instructions in that document for the location of the tar archive.  Thanks for your interest.  -ccr-

Glenn McKechnie

unread,
May 17, 2018, 4:36:06 AM5/17/18
to weewx-user, CRh...@lacusveris.com
CRh...@LacusVeris.com wrote:
> I've whipped together a weeWX extension called cydia
> <http://lacusveris.com/cydia/index.shtml>. It graphically predicts
> developmental stages of the codling moth (Cydia pomonella), an apple tree
> pest, based on daily temperature measurements. See the software extension
> installation instructions in that document for the location of the tar
> archive. Thanks for your interest. -ccr-


Certainly interesting, and you've put a bit of work into it.

A couple of hiccups that I can see...

There is no link to the actual file.
It can be inferred from reading your notes, and you do mention that it's
in the software extension installation instructions but a link to the actual
file would be better.

The existing installer is missing files. It only has dead symlinks for
the required files.

--

Cheers
Glenn

rorpi - read only raspberry pi & various weewx addons
https://github.com/glennmckechnie

CRh...@lacusveris.com

unread,
May 17, 2018, 3:45:16 PM5/17/18
to weewx-user
Certainly interesting, and you've put a bit of work into it.

Overboard, much?


There is no link to the actual file.

I've changed the "Software" page.  Thanks.


 The existing installer is missing files. It only has dead symlinks for
the required files.

Ack! Thppt! There's a newbie mistake!  Fixed ... I think.  Please let me know.

Thanks for the quick feedback.  It's nice to know at least one person is interested enough not only to investigate but also to offer constructive criticism.  ... so, if there's anything else, that's what I here for ... for the time being, at least.

We're not even at first pink (apple flower buds) here in Sheboygan, but soon ... very soon ... and then all h~~~ breaks loose.  -ccr-

hesf...@gmail.com

unread,
May 18, 2018, 2:10:25 PM5/18/18
to weewx-user
Hallo,

cydia not work.

I followed the instructions: on  http://lacusveris.com/cydia/software.shtml

only the NOAA-2018.csv files are created

the
"C_pomonella.png." and the "C_pomonella.html" --> no files

the "C_pomonella.png

http://hesba/weewx/Cydia/C_pomonella.png

what am I doing wrong
No errors in the log's

Hartmut

hesf...@gmail.com

unread,
May 18, 2018, 2:34:07 PM5/18/18
to weewx-user
Now Log-Errors

 if erase file "/Cydia/C_pomonella.png"

May 18 16:18:26 hesba weewx-weewx[518]: reportengine: Caught unrecoverable exception in generator weewx.cydiagenerator.CydiaGenerator
May 18 16:18:26 hesba weewx-weewx[518]:         ****  'dd_cumulative'
May 18 16:18:26 hesba weewx-weewx[518]:         ****  Traceback (most recent call last):
May 18 16:18:26 hesba weewx-weewx[518]:         ****    File "/home/weewx/bin/weewx/reportengine.py", line 239, in run
May 18 16:18:26 hesba weewx-weewx[518]:         ****      obj.start()
May 18 16:18:26 hesba weewx-weewx[518]:         ****    File "/home/weewx/bin/weewx/reportengine.py", line 273, in start
May 18 16:18:26 hesba weewx-weewx[518]:         ****      self.run()
May 18 16:18:26 hesba weewx-weewx[518]:         ****    File "/home/weewx/bin/weewx/cydiagenerator.py", line 90, in run
May 18 16:18:26 hesba weewx-weewx[518]:         ****      self.cydia_report_generator.recs = self.zip_vectors()
May 18 16:18:26 hesba weewx-weewx[518]:         ****    File "/home/weewx/bin/weewx/cydiagenerator.py", line 547, in zip_vectors
May 18 16:18:26 hesba weewx-weewx[518]:         ****      if rec['dd_cumulative'].raw > horizon_dd:
May 18 16:18:26 hesba weewx-weewx[518]:         ****  KeyError: 'dd_cumulative'
May 18 16:18:26 hesba weewx-weewx[518]:         ****  Generator terminated
May 18 16:18:26 hesba weewx-weewx[518]: copygenerator: copied 0 files to /home/weewx/public_html


but no C_pomonella.html - file

Hartmut

CRh...@lacusveris.com

unread,
May 18, 2018, 4:14:34 PM5/18/18
to weewx-user
Thanks for your interest in "cydia"  and thanks for the log.  

I'm guessing your /var/www/html/weewx/Cydia/NOAA-2018.csv file is empty or something.  The content should look something like this:

YR,MO,DAY,TMPAVG_F,TMPMAX_F,TMPMIN_F,DEWPT_F,HDD_F,CDD_F,RAIN_IN,WSPDAVG_MPH,WDIR_DEG
2018,01,01,-0.7,7.0,-7.4,-18.8,65.7,0.0,0.0,   7.0,   286
2018,01,02,7.9,16.8,-0.0,-13.2,57.1,0.0,0.0,   7.6,   259
2018,01,03,12.0,16.6,4.5,-3.1,53.0,0.0,0.0,   6.4,   289
.
.
.
2018,05,16,56.4,68.0,44.6,43.6,8.6,0.0,0.0,   2.6,   131
2018,05,17,51.7,64.6,46.9,42.2,13.3,0.0,0.0,   6.8,   342
2018,05,18,49.1,55.2,45.7,38.7,15.9,0.0,0.0,   3.2,     5


Please let me know.  -ccr-

hesf...@gmail.com

unread,
May 18, 2018, 4:27:26 PM5/18/18
to weewx-user

hallo,

now the
┌<─ ...e/weewx/public_html/Cydia ─.[^]>  ┐┌<─ ...weewx/skins/Seasons/Cydia ─.[^]>┐
│.n    Name      │ Größe │Modifikations     ││.n    Name      │ Größe │Modifikations│
│/..             │ÜBERVZ.│18. Mai 18:22       ││/..             │ÜBERVZ.│18. Mai 15:18│
│ C_pomonella.png│  13869│18. Mai 16:32││ C_pomon~ml.tmpl│   2382│28. Mär 06:23│
│ NOAA-2015.csv  │    216│18. Mai 14:03 ││ NOAA-YY~sv.tmpl│    705│18. Mai 16:32│
│ NOAA-2016.csv  │     87│18. Mai 14:03  ││                │       │             │
│ NOAA-2017.csv  │  10353│18. Mai 14:03││                │       │             │
│ NOAA-2018.csv  │   6186│18. Mai 18:22

in the NOAA-2018.csv

YR,MO,DAY,TMPAVG_F,TMPMAX_F,TMPMIN_F,DEWPT_F,HDD_F,CDD_F,RAIN_IN
2018,01,01,43.3,48.9,36.4,40.0,39.0,0.0,0.05
2018,01,02,38.6,43.0,34.2,36.7,47.5,0.0,0.01
2018,01,03,40.1,45.2,37.1,38.4,44.8,0.0,0.78
2018,01,04,41.2,42.6,39.0,39.7,42.9,0.0,0.24
2018,01,05,41.3,44.3,36.5,38.9,42.6,0.0,0.03
2018,01,06,38.3,42.1,33.9,36.5,48.1,0.0,0.03
2018,01,07,31.4,35.6,26.7,27.9,60.6,0.0,0.0
2018,01,08,28.3,33.6,23.0,22.8,66.0,0.0,0.0
2018,01,09,34.9,38.5,29.3,22.0,54.2,0.0,0.0
2018,01,10,36.1,42.3,33.7,32.7,52.1,0.0,0.0
2018,01,11,32.7,35.8,29.5,31.7,58.1,0.0,0.19
...
2018,05,15,61.8,75.8,48.0,49.9,5.7,0.0,0.01
2018,05,16,63.0,74.4,51.2,54.2,3.6,0.0,0.01
2018,05,17,59.0,71.5,48.4,51.3,10.8,0.0,0.0
2018,05,18,55.6,61.3,50.3,51.8,16.9,0.0,0.0
Time NOW 18:28 UHR

hesf...@gmail.com

unread,
May 18, 2018, 6:25:56 PM5/18/18
to weewx-user
following change

in line 548 #if rec['dd_cumulative'].raw > horizon_dd:  <<---  


        for rec in result:
            remarks = []
            while horizon_labels:
                (horizon_dd, horizon_event) = horizon_labels[ZERO]
                #if rec['dd_cumulative'].raw > horizon_dd:  <<---  
                cydiaA = rec['dd_cumulative'].raw
                if cydiaA > horizon_dd:

                    remarks.append(horizon_event)
                    horizon_labels.pop(ZERO)
                else:
                    break
            val_t = ValueTuple('; '.join(remarks), None, None)
            rec['remark'] = weewx.units.ValueHelper(val_t, 'day', self.formatter, self.converter)
        return result


only the "C_pomonella.html"   
is not generated                                                 


finally have a look at http://wetter.hes61.de/index1.html the y-scale is degree_C

Thanks!
Hartmut

CRh...@lacusveris.com

unread,
May 19, 2018, 2:03:43 PM5/19/18
to weewx-user
 finally have a look at http://wetter.hes61.de/index1.html the y-scale is degree_C

Vielen Dank!  I'm thrilled that the Centigrade conversion works.  Is your C_pomonella.html automatic?

I'm surprised you grow apples in Zurich because of the altitude.  Does your codling moth forecast match the university predictions there?  -ccr-

CRh...@lacusveris.com

unread,
May 19, 2018, 2:16:03 PM5/19/18
to weewx-user
I'm sorry.  I don't really speak German.  I mistook the word "zurück" for "Zürich."

hesf...@gmail.com

unread,
May 20, 2018, 3:15:34 PM5/20/18
to weewx-user
Hallo,

the page and the graphic are generated automatically

my changes "cydiagenerator.py" line ca. 548

                #if rec['dd_cumulative'].raw > horizon_dd:  <<---  
                cydiaA = rec['dd_cumulative'].raw
                if cydiaA > horizon_dd:

            in line 154
            image_root = os.path.join(self.config_dict['WEEWX_ROOT'], plot_options['HTML_ROOT'])
            #skin_root = os.path.join(self.config_dict['WEEWX_ROOT'], plot_options['SKIN_ROOT'])
            img_file = os.path.join(image_root, '%s.png' % species_name)
    --->   html_file = os.path.join(image_root, '%s.html' % species_name)
    --->   ai = 86400   #test  600 #  86400 = 24 h



only for testing "ai = 600"

and the
the y-scale is degree_C

Thanks!
Hartmut

Chuck Rhode

unread,
Mar 9, 2021, 3:14:44 AM3/9/21
to Glenn McKechnie, weewx...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Thu, 17 May 2018 14:35:58 +1000
Glenn McKechnie <glenn.m...@gmail.com> wrote:

> There is no link to the actual file. It can be inferred from
> reading your notes, and you do mention that it's in the software
> extension installation instructions but a link to the actual file
> would be better.

> The existing installer is missing files. It only has dead symlinks
> for the required files.

I have a new *Phenology* WeeWX extension that replaces *Cydia*.

The tarball is at:

o http://LacusVeris.com/Phenology/weewx-phenology-1.1.tar.gz.

The Web site is:

o http://LacusVeris.com/Phenology

- --
.. Be Seeing You,
.. Chuck Rhode, Sheboygan, WI, USA
.. Weather: http://LacusVeris.com/WX
.. 35° — Wind Calm

-----BEGIN PGP SIGNATURE-----

iF0EARECAB0WIQT+MY/5I/LMPSswTbVg2/xipKOWUgUCYEbm5AAKCRBg2/xipKOW
Up56AJ90PskyPR91t/Ih1lpJKag3dp4biACfZQsCIeAHiTCpeR1a8or5YTDIQIE=
=1TOf
-----END PGP SIGNATURE-----

hesf...@gmail.com

unread,
Mar 9, 2021, 9:32:40 AM3/9/21
to weewx-user
hallo.

Error in growing_degrees.py

Mar  9 10:31:18 hesba weewx[809] INFO user.cmon: cpuinfo: CPU architecture: 7
Mar  9 10:31:18 hesba weewx[809] INFO weewx.engine: StdConvert target unit is 0x10
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__: Caught unrecoverable exception:
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****  invalid syntax (growing_degrees.py, line 295)
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****  Traceback (most recent call last):
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****    File "/home/weewx/bin/weewxd", line 151, in main
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****      engine = weewx.engine.StdEngine(config_dict)
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 93, in __init__
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****      self.loadServices(config_dict)
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 161, in loadServices
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****      obj = weeutil.weeutil.get_object(svc)(self, config_dict)
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****    File "/home/weewx/bin/weeutil/weeutil.py", line 1093, in get_object
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****      mod = __import__(module)
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****    File "/home/weewx/bin/user/phenologyservice.py", line 35, in <module>
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****      import user.growing_degrees
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****    File "/home/weewx/bin/user/growing_degrees.py", line 295
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****      )
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****      ^
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****  SyntaxError: invalid syntax
Mar  9 10:31:18 hesba weewx[809] CRITICAL __main__:     ****  Exiting.

Message has been deleted

Chuck Rhode

unread,
Mar 9, 2021, 4:42:10 PM3/9/21
to hesf...@gmail.com, weewx...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Tue, 9 Mar 2021 04:33:50 -0800 (PST)
"hesf...@gmail.com" <hesf...@gmail.com> wrote:

> Then I deleted all "**dummies" in growing_degrees.py

> Reason: dd_conventional() got an unexpected keyword argument
> 'cutoff_temp' Mar 9 13:27:31 hesba weewx[15638] ERROR

Yes, all the formulas supported by the growing_degrees module are
invoked from the get_gdd_series method of the GrowingDegreeDays class
of the phenologyservice module.

> gdd = method(
> day_max_temp=temp_max,
> day_min_temp=temp_min,
> threshold_temp=threshold_temp,
> cutoff_temp=cutoff_temp,
> day_2_min_temp=temp_min_2,
> scale=scale,
> )

They are all called with the same sequence of parameters whether or
not the formula requires them all. The **dummies in the calling
sequences in the growing_degrees module is catch-all syntax to consume
the unused parameters, so it has to be in there.

You report a syntax error at line 295 in growing_degrees.py. Here is
the code near that line. Is this what you see?

> def gdd_single_sine_no_cutoff( # 2019 Jan 08
> day_max_temp,
> day_min_temp,
> threshold_temp,
> **dummies,
> ):
> (result, theta) = gdd_single_sine_with_theta( # 2019 Jan 08
> day_max_temp=day_max_temp,
> day_min_temp=day_min_temp,
> threshold_temp=threshold_temp,
> )
> return result

- --
.. Be Seeing You,
.. Chuck Rhode, Sheboygan, WI, USA
.. Weather: http://LacusVeris.com/WX
.. 48° — Wind SE 6 mph

-----BEGIN PGP SIGNATURE-----

iF0EARECAB0WIQT+MY/5I/LMPSswTbVg2/xipKOWUgUCYEekJQAKCRBg2/xipKOW
Uo79AJ4rldPFAPd+rUa2/n7yvGLj3acq9ACeLK4EcUl6qXGRuoGQ/vtxpAjbzcM=
=BepH
-----END PGP SIGNATURE-----

hesf...@gmail.com

unread,
Mar 9, 2021, 4:55:53 PM3/9/21
to weewx-user
Hallo!
I have completely reinstalled the calculation and get it

Mar  9 17:53:18 hesba weewx[5536] INFO weewx.engine: StdConvert target unit is 0x10
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__: Caught unrecoverable exception:
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****  invalid syntax (growing_degrees.py, line 294)
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****  Traceback (most recent call last):
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****    File "/home/weewx/bin/weewxd", line 151, in main
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****      engine = weewx.engine.StdEngine(config_dict)
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 93, in __init__
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****      self.loadServices(config_dict)
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 161, in loadServices
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****      obj = weeutil.weeutil.get_object(svc)(self, config_dict)
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****    File "/home/weewx/bin/weeutil/weeutil.py", line 1093, in get_object
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****      mod = __import__(module)
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****    File "/home/weewx/bin/user/phenologyservice.py", line 35, in <module>
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****      import user.growing_degrees
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****    File "/home/weewx/bin/user/growing_degrees.py", line 294
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****      **dummies,
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****               ^
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****  SyntaxError: invalid syntax
Mar  9 17:53:18 hesba weewx[5536] CRITICAL __main__:     ****  Exiting.

Hartmut

hesf...@gmail.com

unread,
Mar 9, 2021, 5:00:35 PM3/9/21
to weewx-user
i line 290
def gdd_single_sine_no_cutoff(  # 2019 Jan 08
        day_max_temp,
        day_min_temp,
        threshold_temp,
        **dummies,
        ):
    (result, theta) = gdd_single_sine_with_theta(  # 2019 Jan 08
            day_max_temp=day_max_temp,
            day_min_temp=day_min_temp,
            threshold_temp=threshold_temp,
            )
    return result

and in syslog ar SyntaxError: invalid syntax
Hartmut

Chuck Rhode

unread,
Mar 9, 2021, 5:20:12 PM3/9/21
to hesf...@gmail.com, weewx...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Tue, 9 Mar 2021 08:55:53 -0800 (PST)
"hesf...@gmail.com" <hesf...@gmail.com> wrote:

> I have completely reinstalled the calculation and get it

> Mar 9 17:53:18 CRITICAL __main__: File "/home/weewx/bin/user/growing_degrees.py", line 294
> Mar 9 17:53:18 CRITICAL __main__: **dummies,
> Mar 9 17:53:18 CRITICAL __main__: ^
> Mar 9 17:53:18 CRITICAL __main__: SyntaxError: invalid syntax

Sorry for the trouble you've been having. Please post the code from
line 287 to line 302. Thanks.


- --
.. Be Seeing You,
.. Chuck Rhode, Sheboygan, WI, USA
.. Weather: http://LacusVeris.com/WX
.. 48° — Wind SE 9 mph

-----BEGIN PGP SIGNATURE-----

iF0EARECAB0WIQT+MY/5I/LMPSswTbVg2/xipKOWUgUCYEeuQwAKCRBg2/xipKOW
UiqdAKCAEzLvFAHb3WmR5O0ySBlh1CnG5wCfa232Fc/oQ8nOrIBDn1UqweZ8gis=
=YJDt
-----END PGP SIGNATURE-----
Message has been deleted

hesf...@gmail.com

unread,
Mar 9, 2021, 5:43:22 PM3/9/21
to weewx-user
Hallo in line 287
    return (result, theta)



def gdd_single_sine_no_cutoff(  # 2019 Jan 08
        day_max_temp,
        day_min_temp,
        threshold_temp,
        **dummies,
        ):
    (result, theta) = gdd_single_sine_with_theta(  # 2019 Jan 08
            day_max_temp=day_max_temp,
            day_min_temp=day_min_temp,
            threshold_temp=threshold_temp,
            )
    return result

and in syslog
Mar  9 18:35:18 hesba weewx[9625] INFO weewx.engine: StdConvert target unit is 0x10
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__: Caught unrecoverable exception:
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****  invalid syntax (growing_degrees.py, line 294)
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****  Traceback (most recent call last):
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****    File "/home/weewx/bin/weewxd", line 151, in main
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****      engine = weewx.engine.StdEngine(config_dict)
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 93, in __init__
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****      self.loadServices(config_dict)
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 161, in loadServices
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****      obj = weeutil.weeutil.get_object(svc)(self, config_dict)
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****    File "/home/weewx/bin/weeutil/weeutil.py", line 1093, in get_object
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****      mod = __import__(module)
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****    File "/home/weewx/bin/user/phenologyservice.py", line 35, in <module>
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****      import user.growing_degrees
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****    File "/home/weewx/bin/user/growing_degrees.py", line 294
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****      **dummies,
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****               ^
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****  SyntaxError: invalid syntax
Mar  9 18:35:18 hesba weewx[9625] CRITICAL __main__:     ****  Exiting.

Chuck Rhode

unread,
Mar 9, 2021, 6:02:11 PM3/9/21
to hesf...@gmail.com, weewx...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Yes, that all looks good, and I am unable to guess what else could be
wrong. Maybe there is an unclosed string literal close to the top of
the module. It must be really late for you today. I'll attach a copy
of the module to a private message to you for comparison. Please let
me know if you see any differences. Thanks.

- --
.. Be Seeing You,
.. Chuck Rhode, Sheboygan, WI, USA
.. Weather: http://LacusVeris.com/WX
.. 48° — Wind SE 9 mph

-----BEGIN PGP SIGNATURE-----

iF0EARECAB0WIQT+MY/5I/LMPSswTbVg2/xipKOWUgUCYEe25gAKCRBg2/xipKOW
UlG7AJ9IqcrCYwrjh4+E7g7NmdE8TOqk9QCbBJ49ZaVaSTKK8/TeoIbRuYh4IZw=
=V9Zc
-----END PGP SIGNATURE-----

hesf...@gmail.com

unread,
Mar 9, 2021, 6:29:25 PM3/9/21
to weewx-user
Hallo Chuck Rhode,

I copied the file "growing_degrees.py" from the message  

in to weewx / bin / user

and restarted weewx

the result
Mar  9 19:25:59 hesba weewx[14366] INFO weewx.engine: StdConvert target unit is 0x10
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__: Caught unrecoverable exception:
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****  invalid syntax (growing_degrees.py, line 294)
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****  Traceback (most recent call last):
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****    File "/home/weewx/bin/weewxd", line 151, in main
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****      engine = weewx.engine.StdEngine(config_dict)
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 93, in __init__
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****      self.loadServices(config_dict)
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 161, in loadServices
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****      obj = weeutil.weeutil.get_object(svc)(self, config_dict)
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****    File "/home/weewx/bin/weeutil/weeutil.py", line 1093, in get_object
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****      mod = __import__(module)
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****    File "/home/weewx/bin/user/phenologyservice.py", line 35, in <module>
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****      import user.growing_degrees
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****    File "/home/weewx/bin/user/growing_degrees.py", line 294
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****      **dummies,
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****               ^
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****  SyntaxError: invalid syntax
Mar  9 19:26:00 hesba weewx[14366] CRITICAL __main__:     ****  Exiting.

Thanks
Hartmut

hesf...@gmail.com

unread,
Mar 9, 2021, 6:58:10 PM3/9/21
to weewx-user
Hallo
supplement

I have in weewx.conf under
        xtype_services = weewx.wxxtypes.StdWXXTypes, weewx.wxxtypes.StdPressureCooker, weewx.wxxtypes.StdRainRater, user.xaggs.XAggsService, weewx.wxxtypes.StdDelta, user.vaporpressure.VaporPressureService 
 set # , user.phenologyservice.PhenologyService

then in syslog

Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: Generate failed with exception '<class 'SyntaxError'>'
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: **** Ignoring template /home/weewx/skins/Phenology/index.html.tmpl
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: **** Reason: invalid syntax (growing_degrees.py, line 294)
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****  Traceback (most recent call last):
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/usr/local/lib/python3.5/dist-packages/Cheetah/Template.py", line 828, in compile
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      source, file, generatedModuleCode, exception=e)
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/usr/local/lib/python3.5/dist-packages/Cheetah/Template.py", line 2045, in genParserErrorFromPythonException
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      reader = SourceReader(source, filename=filename)
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/usr/local/lib/python3.5/dist-packages/Cheetah/SourceReader.py", line 19, in __init__
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      self._srcLen = len(src)
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****  TypeError: object of type 'NoneType' has no len()
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: **** 
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****  During handling of the above exception, another exception occurred:
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: **** 
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****  Traceback (most recent call last):
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/home/weewx/bin/weewx/cheetahgenerator.py", line 320, in generate
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      filtersLib=weewx.cheetahgenerator)
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/usr/local/lib/python3.5/dist-packages/Cheetah/Template.py", line 1337, in __init__
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      self._compile(source, file, compilerSettings=compilerSettings)
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/usr/local/lib/python3.5/dist-packages/Cheetah/Template.py", line 1638, in _compile
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      keepRefToGeneratedCode=True)
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/usr/local/lib/python3.5/dist-packages/Cheetah/Template.py", line 832, in compile
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      raise e
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/usr/local/lib/python3.5/dist-packages/Cheetah/Template.py", line 824, in compile
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      exec(co, mod.__dict__)
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "_home_weewx_skins_Phenology_index_html_tmpl.py", line 27, in <module>
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/home/weewx/bin/user/phenologyservice.py", line 35, in <module>
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      import user.growing_degrees
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/home/weewx/bin/user/growing_degrees.py", line 294
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      **dummies,
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****               ^
Mar  9 19:51:55 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****  SyntaxError: invalid syntax
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: Generate failed with exception '<class 'SyntaxError'>'
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: **** Ignoring template /home/weewx/skins/Phenology/cumulative_growing_degree_days.html.tmpl
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: **** Reason: invalid syntax (growing_degrees.py, line 294)
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****  Traceback (most recent call last):
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/usr/local/lib/python3.5/dist-packages/Cheetah/Template.py", line 828, in compile
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      source, file, generatedModuleCode, exception=e)
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/usr/local/lib/python3.5/dist-packages/Cheetah/Template.py", line 2045, in genParserErrorFromPythonException
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      reader = SourceReader(source, filename=filename)
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/usr/local/lib/python3.5/dist-packages/Cheetah/SourceReader.py", line 19, in __init__
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      self._srcLen = len(src)
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****  TypeError: object of type 'NoneType' has no len()
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: **** 
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****  During handling of the above exception, another exception occurred:
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: **** 
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****  Traceback (most recent call last):
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/home/weewx/bin/weewx/cheetahgenerator.py", line 320, in generate
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      filtersLib=weewx.cheetahgenerator)
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/usr/local/lib/python3.5/dist-packages/Cheetah/Template.py", line 1337, in __init__
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      self._compile(source, file, compilerSettings=compilerSettings)
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/usr/local/lib/python3.5/dist-packages/Cheetah/Template.py", line 1638, in _compile
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      keepRefToGeneratedCode=True)
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/usr/local/lib/python3.5/dist-packages/Cheetah/Template.py", line 832, in compile
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      raise e
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/usr/local/lib/python3.5/dist-packages/Cheetah/Template.py", line 824, in compile
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      exec(co, mod.__dict__)
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "_home_weewx_skins_Phenology_cumulative_growing_degree_days_html_tmpl.py", line 30, in <module>
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/home/weewx/bin/user/phenologyservice.py", line 35, in <module>
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      import user.growing_degrees
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****    File "/home/weewx/bin/user/growing_degrees.py", line 294
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****      **dummies,
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****               ^
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.cheetahgenerator: ****  SyntaxError: invalid syntax
Mar  9 19:52:00 hesba weewx[16315] INFO weewx.cheetahgenerator: Generated 4 files for report PhenologyReport in 5.02 seconds
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.reportengine: Unable to instantiate generator 'user.phenologygenerator.PhenologyImageGenerator'
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.reportengine:         ****  invalid syntax (growing_degrees.py, line 294)
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.reportengine:         ****  Traceback (most recent call last):
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.reportengine:         ****    File "/home/weewx/bin/weewx/reportengine.py", line 179, in run
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.reportengine:         ****      obj = weeutil.weeutil.get_object(generator)(
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.reportengine:         ****    File "/home/weewx/bin/weeutil/weeutil.py", line 1093, in get_object
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.reportengine:         ****      mod = __import__(module)
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.reportengine:         ****    File "/home/weewx/bin/user/phenologygenerator.py", line 37, in <module>
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.reportengine:         ****      import user.phenologyservice
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.reportengine:         ****    File "/home/weewx/bin/user/phenologyservice.py", line 35, in <module>
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.reportengine:         ****      import user.growing_degrees
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.reportengine:         ****    File "/home/weewx/bin/user/growing_degrees.py", line 294
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.reportengine:         ****      **dummies,
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.reportengine:         ****               ^
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.reportengine:         ****  SyntaxError: invalid syntax
Mar  9 19:52:00 hesba weewx[16315] ERROR weewx.reportengine:         ****  Generator ignored
Mar  9 19:52:04 hesba weewx[16315] INFO weewx.reportengine: ftpgenerator: Ftp'd 37 files in 3.84 seconds

sorry, my weewx is weewx4.4.0 and python 3.5

Hartmut

Chuck Rhode

unread,
Mar 9, 2021, 7:45:12 PM3/9/21
to hesf...@gmail.com, weewx...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Tue, 9 Mar 2021 10:58:10 -0800 (PST)
"hesf...@gmail.com" <hesf...@gmail.com> wrote:

> sorry, my weewx is weewx4.4.0 and python 3.5

Ah hah! Yes, I see what you mean! I have the same issue with Python
3.5. I'm using 3.7 at home. Deeper investigation is in progress....

I'll be back.

- --
.. Be Seeing You,
.. Chuck Rhode, Sheboygan, WI, USA
.. Weather: http://LacusVeris.com/WX
.. 50° — Wind SE 9 mph

-----BEGIN PGP SIGNATURE-----

iF0EARECAB0WIQT+MY/5I/LMPSswTbVg2/xipKOWUgUCYEfPCAAKCRBg2/xipKOW
UrR3AJ99XDjgwjBObdxKRpGUdjQz07RpXgCfbDHP7oAH6gsDvwPi0spx45WmWUg=
=YqhC
-----END PGP SIGNATURE-----

Chuck Rhode

unread,
Mar 9, 2021, 8:36:49 PM3/9/21
to hesf...@gmail.com, weewx...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

This appears to be a bug with Python 3.5.

o https://stackoverflow.com/questions/16950394/why-is-a-trailing-comma-a-syntaxerror-in-an-argument-list-that-uses-args-syntax

Apparently a trailing comma after "arbitrary" function arguments was
not a part of the language specification at the time or was
implemented incorrectly. Guido van Rossum, the creator Python and
Benevolent Dictator for Life, has spoken, and the trailing comma is
fixed in Python 3.6.

Let's see whether I can say this in a nice way.

My impulse has always been to include a trailing comma anywhere I
might be inclined to add a line later. Upon thinking back, I suppose
I was never able to get away with that in Python 2, but, after
switching to Python 3 at 3.7, I didn't get caught again.

I don't propose to change the "Phenology" WeeWX extension, though,
because I side with Guido: The trailing comma is good practice, and
all future Python interpreters should conform with it.

You may wish to upgrade to Python 3.6+.

If that doesn't work for you, eliminating the trailing commas after
"arbitrary" arguments should be do-able and fix the problem.

I apologize for the trouble.

- --
.. Be Seeing You,
.. Chuck Rhode, Sheboygan, WI, USA
.. Weather: http://LacusVeris.com/WX
.. 50° — Wind SE 9 mph

-----BEGIN PGP SIGNATURE-----

iF0EARECAB0WIQT+MY/5I/LMPSswTbVg2/xipKOWUgUCYEfbJQAKCRBg2/xipKOW
UktiAJ9JXdCDJsOVVG1iQFLVTEXJn2bRqQCfR18XqjmsK8VldOkgJ7FigYGKnr4=
=jJCN
-----END PGP SIGNATURE-----

Chuck Rhode

unread,
Mar 9, 2021, 9:04:30 PM3/9/21
to hesf...@gmail.com, weewx...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Tue, 9 Mar 2021 14:31:33 -0600
Chuck Rhode <CRh...@LacusVeris.com> wrote:

> This appears to be a bug with Python 3.5.

> You may wish to upgrade to Python 3.6+.

No, no, no! I take it all back. It's silly of me not to try to fix
it.

The only place where "trailing comma after arbitrary arguments" occurs
is in the growing_degrees.py module, and I can change that easily!
I'll make an updated tarball ready soon that will work under Python
3.5. You don't have to do anything except reinstall it. I'll let you
know when.

Thanks for bringing this to my attention.


- --
.. Be Seeing You,
.. Chuck Rhode, Sheboygan, WI, USA
.. Weather: http://LacusVeris.com/WX
.. 50° — Wind S 9 mph

-----BEGIN PGP SIGNATURE-----

iF0EARECAB0WIQT+MY/5I/LMPSswTbVg2/xipKOWUgUCYEfhoQAKCRBg2/xipKOW
UqtNAJsGYsNjB44qNj8NYVKbOQ58Nhc/TwCbBkPGFgKv2hRV2t2CoTuIG9i9idg=
=+Ihj
-----END PGP SIGNATURE-----
Message has been deleted

hesf...@gmail.com

unread,
Mar 10, 2021, 3:55:49 PM3/10/21
to weewx-user
Hallo
You are right, an update to python3.7 solved the problem

NO ERROR

but the calculations are made in a mixture of degrees C and degrees F.

Location:
D19073 Klein Rogahn
Run Date:
03/10/2021
Model:
M001
Threshold:
50,0°F
Cutoff:
88,0°F
Method:
gdd_single_sine_horizontal_cutoff
Model Ref:
http://msue.anr.msu.edu/news/first_generation_codling_moth_management


date       min  max      sum
10 Mär  25,6 45,9 0,0 28,0

Thanks for the work
Hartmut

Chuck Rhode

unread,
Mar 11, 2021, 3:14:14 AM3/11/21
to hesf...@gmail.com, weewx...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Wed, 10 Mar 2021 07:55:49 -0800 (PST)
"hesf...@gmail.com" <hesf...@gmail.com> wrote:

> but the calculations are made in a mixture of degrees C and degrees F.

Carsten Bitter reported the problem with the Cumulative Growing
Degree-Days report. This is fixed in weewx-phenology-1.2 available at:

o http://lacusveris.com/Phenology/weewx-phenology-1.2.tar.gz

Full documentation is at:

o http://lacusveris.com/Phenology/index.shtml

Thanks for your interest in the Phenology Extension to WeeWX and for
sticking with it.

- --
.. Be Seeing You,
.. Chuck Rhode, Sheboygan, WI, USA
.. Weather: http://LacusVeris.com/WX
..

-----BEGIN PGP SIGNATURE-----

iF0EARECAB0WIQT+MY/5I/LMPSswTbVg2/xipKOWUgUCYEmLAAAKCRBg2/xipKOW
Ul2EAJ90/L3cbALSb5oryMWmGz0sYOwbqQCfYwueokrJlBnbb5nhNPh5gMtnMbs=
=p9j4
-----END PGP SIGNATURE-----

hesf...@gmail.com

unread,
Mar 11, 2021, 6:09:34 AM3/11/21
to weewx-user
good morning from Germany

supplement
I had tested
Mar  9 10:18:14 hesba weewx[805] INFO __main__: Initializing weewx version 4.5.0
Mar  9 10:18:14 hesba weewx[805] INFO __main__: Using Python 3.5.3 (default, Nov 18 2020, 21:09:16) #012[GCC 6.3.0 20170516]
Mar  9 10:18:14 hesba weewx[805] INFO __main__: Platform Linux-3.4.111-bananian-armv7l-with-debian-9.13
Mar  9 10:18:14 hesba weewx[805] INFO __main__: Locale is 'de_DE.UTF-8'
Mar  9 10:18:14 hesba weewx[805] INFO __main__: PID file is /var/run/weewx.pid
Mar  9 10:18:14 hesba weewx[809] INFO __main__: Using configuration file /home/weewx/weewx.conf
Mar  9 10:18:14 hesba weewx[809] INFO __main__: Debug is 0
Mar  9 10:18:14 hesba weewx[809] INFO weewx.engine: Loading station type Meteostick (user.meteostick)
Mar  9 10:18:14 hesba weewx[809] INFO user.meteostick: driver version is 0.62
...
Mar  9 10:18:32 hesba weewx[31721] INFO weewx.engine: StdConvert target unit is 0x10
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__: Caught unrecoverable exception:
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****  invalid syntax (growing_degrees.py, line 290)
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****  Traceback (most recent call last):
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****    File "/home/weewx/bin/weewxd", line 151, in main
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****      engine = weewx.engine.StdEngine(config_dict)
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 93, in __init__
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****      self.loadServices(config_dict)
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 161, in loadServices
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****      obj = weeutil.weeutil.get_object(svc)(self, config_dict)
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****    File "/home/weewx/bin/weeutil/weeutil.py", line 1093, in get_object
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****      mod = __import__(module)
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****    File "/home/weewx/bin/user/phenologyservice.py", line 35, in <module>
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****      import user.growing_degrees
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****    File "/home/weewx/bin/user/growing_degrees.py", line 290
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****      def gdd_single_sine_no_cutoff(day_max_temp, day_min_temp, threshold_temp, **dummies)
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****                                                                                                                                                                        ^
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****  SyntaxError: invalid syntax
Mar  9 10:18:33 hesba weewx[31721] CRITICAL __main__:     ****  Exiting.

then def gdd_single_sine_no_cutoff(
             day_max_temp,
             day_min_temp,
             threshold_temp,
             **dummies
             )


Mar  9 10:28:38 hesba weewx[32747] INFO weewx.engine: StdConvert target unit is 0x10
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__: Caught unrecoverable exception:
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****  invalid syntax (growing_degrees.py, line 294)
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****  Traceback (most recent call last):
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****    File "/home/weewx/bin/weewxd", line 151, in main
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****      engine = weewx.engine.StdEngine(config_dict)
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 93, in __init__
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****      self.loadServices(config_dict)
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 161, in loadServices
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****      obj = weeutil.weeutil.get_object(svc)(self, config_dict)
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****    File "/home/weewx/bin/weeutil/weeutil.py", line 1093, in get_object
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****      mod = __import__(module)
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****    File "/home/weewx/bin/user/phenologyservice.py", line 35, in <module>
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****      import user.growing_degrees
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****    File "/home/weewx/bin/user/growing_degrees.py", line 294
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****      )
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****      ^
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****  SyntaxError: invalid syntax
Mar  9 10:28:38 hesba weewx[32747] CRITICAL __main__:     ****  Exiting.

and
def gdd_single_sine_no_cutoff(
       day_max_temp,
       day_min_temp,
       threshold_temp,
       **dummies)

Mar  9 10:30:32 hesba weewx[767] INFO weewx.engine: StdConvert target unit is 0x10
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__: Caught unrecoverable exception:
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****  invalid syntax (growing_degrees.py, line 294)
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****  Traceback (most recent call last):
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****    File "/home/weewx/bin/weewxd", line 151, in main
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****      engine = weewx.engine.StdEngine(config_dict)
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 93, in __init__
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****      self.loadServices(config_dict)
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 161, in loadServices
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****      obj = weeutil.weeutil.get_object(svc)(self, config_dict)
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****    File "/home/weewx/bin/weeutil/weeutil.py", line 1093, in get_object
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****      mod = __import__(module)
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****    File "/home/weewx/bin/user/phenologyservice.py", line 35, in <module>
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****      import user.growing_degrees
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****    File "/home/weewx/bin/user/growing_degrees.py", line 294
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****      **dummies)
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****                          ^
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****  SyntaxError: invalid syntax
Mar  9 10:30:32 hesba weewx[767] CRITICAL __main__:     ****  Exiting.

and than update python 3.5 to python 3.7 (buster)

Mar 10 16:35:51 hesba weewx[26246] INFO __main__: Initializing weewx version 4.4.1
Mar 10 16:35:51 hesba weewx[26246] INFO __main__: Using Python 3.7.3 (default, Jul 25 2020, 13:03:44) #012[GCC 8.3.0]
Mar 10 16:35:51 hesba weewx[26246] INFO __main__: Platform Linux-3.4.111-bananian-armv7l-with-debian-9.13
Mar 10 16:35:51 hesba weewx[26246] INFO __main__: Locale is 'de_DE.UTF-8'
Mar 10 16:35:51 hesba weewx[26246] INFO __main__: PID file is /var/run/weewx.pid
Mar 10 16:35:51 hesba weewx[26250] INFO __main__: Using configuration file /home/weewx/weewx.conf
Mar 10 16:35:51 hesba weewx[26250] INFO __main__: Debug is 0
Mar 10 16:35:52 hesba weewx[26250] INFO weewx.engine: Loading station type Meteostick (user.meteostick)
...
Mar 10 16:40:16 hesba weewx[26250] INFO weewx.manager: Added record 2021-03-10 16:40:00 CET (1615390800) to database 'weewxMESO'
Mar 10 16:40:17 hesba weewx[26250] INFO weewx.manager: Added record 2021-03-10 16:40:00 CET (1615390800) to daily summary in 'weewxMESO'
Mar 10 16:40:17 hesba weewx[26250] INFO weewx.manager: Added record 2021-03-10 16:40:00 CET (1615390800) to database 'weewxMESOWD'
Mar 10 16:40:17 hesba weewx[26250] INFO weewx.manager: Added record 2021-03-10 16:40:00 CET (1615390800) to daily summary in 'weewxMESOWD'
Mar 10 16:40:34 hesba weewx[26250] INFO weewx.cheetahgenerator: Generated 8 files for report SeasonsReport in 15.34 seconds
Mar 10 16:40:36 hesba weewx[26250] INFO weewx.imagegenerator: Generated 15 images for report SeasonsReport in 2.52 seconds
Mar 10 16:40:36 hesba weewx[26250] INFO weewx.reportengine: Copied 5 files to /home/weewx/public_html
Mar 10 16:40:37 hesba weewx[26250] INFO weewx.cheetahgenerator: Generated 1 files for report cmon in 0.21 seconds
Mar 10 16:41:46 hesba weewx[26250] INFO weewx.imagegenerator: Generated 32 images for report cmon in 69.67 seconds
Mar 10 16:42:06 hesba weewx[26250] INFO weewx.cheetahgenerator: Generated 6 files for report PhenologyReport in 19.79 seconds
Mar 10 16:43:24 hesba weewx[26250] INFO user.phenologygenerator: Generated 63 images for report PhenologyReport in 77.00 seconds
Mar 10 16:43:39 hesba weewx[26250] INFO weewx.reportengine: ftpgenerator: Ftp'd 130 files in 14.51 seconds

Thanks for the great job

please a note too "cumulative_growing_degree_days.html.tmpl"
        #if $model.name_scientific == $model.name_common
      <h1>$model.name_scientific</h1>
<------>#else
      <h1>$model.name_scientific ($model.name_common)</h1>
<------>#end if name_scientific == name_common....
      </div>

<------><tr><th align=right>Location:</th><th align=left>$station.location</th></tr>
<------><tr><th align=right>Run Date:</th><th align=left>$run_date_h.format($now_format, add_label=False)</th></tr>
<------><tr><th align=right>Model:</th><th align=left>$model.name_model</th></tr>
<------><tr><th align=right>Threshold:</th><th align=left>$threshold_h.format()</th></tr>
<------><tr><th align=right>Cutoff:</th><th align=left>$cutoff_h.format()</th></tr>
        <tr><th align=right>Method:</th><th align=left>$model.method</th></tr>
        <tr><th align=right>Model Ref:</th><th align=left><a href="$model.ref">$model.ref</a></th></tr>
      </table>
Thanks for your trouble

Hartmut

Chuck Rhode

unread,
Mar 12, 2021, 3:51:29 AM3/12/21
to hesf...@gmail.com, weewx...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Wed, 10 Mar 2021 22:09:33 -0800 (PST)
"hesf...@gmail.com" <hesf...@gmail.com> wrote:

> please a note too "cumulative_growing_degree_days.html.tmpl"
> #if $model.name_scientific == $model.name_common
> <h1>$model.name_scientific</h1>
> <------>#else
> <h1>$model.name_scientific ($model.name_common)</h1>
> <------>#end if name_scientific == name_common....
> </div>

Yes, I use *emacs* as a code editor, and it doesn't know what to make
of *.tmpl files. It chooses odd tab settings. Thanks for the
suggestion. This is fixed in the next release ... unless I make some
more changes, and then the tabs will go back to defaults on the lines
I change. It's stupid; I know.

- --
.. Be Seeing You,
.. Chuck Rhode, Sheboygan, WI, USA
.. Weather: http://LacusVeris.com/WX
.. 42° — Wind W 8 mph

-----BEGIN PGP SIGNATURE-----

iF0EARECAB0WIQT+MY/5I/LMPSswTbVg2/xipKOWUgUCYErkBAAKCRBg2/xipKOW
UsKrAJ9DPAH0j2GgofAhu2JjyxHAYn4W3ACfZhura6jdM82ZzUHXDNh50oKXwgI=
=mZsk
-----END PGP SIGNATURE-----

hesf...@gmail.com

unread,
Mar 13, 2021, 11:21:37 AM3/13/21
to weewx-user
Hallo
what do i have to do when i do that

in phenology.conf
    [[Acyrthosiphon pisum]]
        name_common = "Pea Aphid"

        [[[Model C0101]]]


want to calculate

1. in skins.conf
[Extras]
# generation_date = 2018, 6, 30, 0, 0
   phenologies = phenology.conf models = M001, C0004, C0023, C0101

[ImageGenerator]

  [[four-week_images]]
   [[[Codling Moth]]]
       [[[[M001_accum]]]]
  [[[Apple Maggot]]] 
      [[[[C0004_accum]]]]
 [[[Cabbage Maggot]]]
     [[[[C0023_accum]]]]
  [[[Pea Aphid]]]
     [[[[C0101_accum]]]]

then the error follows

Mar 13 12:16:49 hesba weewx[28409] ERROR weewx.cheetahgenerator: Generate failed with exception '<class 'weewx.UnknownType'>'
Mar 13 12:16:49 hesba weewx[28409] ERROR weewx.cheetahgenerator: **** Ignoring template /home/weewx/skins/Phenology/cumulative_growing_degree_days.html.tmpl
Mar 13 12:16:49 hesba weewx[28409] ERROR weewx.cheetahgenerator: **** Reason: C0101
Mar 13 12:16:49 hesba weewx[28409] ERROR weewx.cheetahgenerator: ****  Traceback (most recent call last):
Mar 13 12:16:49 hesba weewx[28409] ERROR weewx.cheetahgenerator: ****    File "/home/weewx/bin/weewx/cheetahgenerator.py", line 324, in generate
Mar 13 12:16:49 hesba weewx[28409] ERROR weewx.cheetahgenerator: ****      unicode_string = compiled_template.respond()
Mar 13 12:16:49 hesba weewx[28409] ERROR weewx.cheetahgenerator: ****    File "_home_weewx_skins_Phenology_cumulative_growing_degree_days_html_tmpl.py", line 390, in respond
Mar 13 12:16:49 hesba weewx[28409] ERROR weewx.cheetahgenerator: ****    File "/home/weewx/bin/weewx/xtypes.py", line 91, in get_series
Mar 13 12:16:49 hesba weewx[28409] ERROR weewx.cheetahgenerator: ****      raise weewx.UnknownType(obs_type)
Mar 13 12:16:49 hesba weewx[28409] ERROR weewx.cheetahgenerator: ****  weewx.UnknownType: C0101

I am a little at a loss
Hartmut

Chuck Rhode

unread,
Mar 14, 2021, 12:49:21 AM3/14/21
to hesf...@gmail.com, weewx...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Sat, 13 Mar 2021 03:21:37 -0800 (PST)
"hesf...@gmail.com" <hesf...@gmail.com> wrote:

> 1. in skins.conf

> [Extras]
> # generation_date = 2018, 6, 30, 0, 0
> phenologies = phenology.conf
> models = M001, C0004, C0023, C0101
>

> [ImageGenerator]
>
> [[four-week_images]]
> [[[Codling Moth]]]
> [[[[M001_accum]]]]
> [[[Apple Maggot]]]
> [[[[C0004_accum]]]]
> [[[Cabbage Maggot]]]
> [[[[C0023_accum]]]]
> [[[Pea Aphid]]]
> [[[[C0101_accum]]]]

> then the error follows

> Mar 13 12:16:49 hesba weewx[28409] ERROR weewx.cheetahgenerator:
> **** weewx.UnknownType: C0101

> I am a little at a loss

You have to restart PhenologyServices.py. Did you do this?

> sudo /etc/init.d/weewx stop
> sudo /etc/init.d/weewx start

- --
.. Be Seeing You,
.. Chuck Rhode, Sheboygan, WI, USA
.. Weather: http://LacusVeris.com/WX
.. 50° — Wind W 10 mph

-----BEGIN PGP SIGNATURE-----

iF0EARECAB0WIQT+MY/5I/LMPSswTbVg2/xipKOWUgUCYE1cVQAKCRBg2/xipKOW
UsXpAJ0Zg9+fk9TDf7njX7yvGK3HVzh6rACeMV2Y3FedEhS8CF1pIdF/v+EK1ok=
=YfMD
-----END PGP SIGNATURE-----

hesf...@gmail.com

unread,
Mar 14, 2021, 6:20:03 AM3/14/21
to weewx-user
Hallo,

"You have to restart PhenologyServices.py. Did you do this? "

NO, but now I have made it up and it works
just a call
Why is the calculation only shown for one month, although the calculation on 01.01. begins.

Thanks for the work
Hartmut

Chuck Rhode

unread,
Mar 15, 2021, 1:51:45 AM3/15/21
to hesf...@gmail.com, weewx...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Sat, 13 Mar 2021 22:20:03 -0800 (PST)
"hesf...@gmail.com" <hesf...@gmail.com> wrote:

> Why is the calculation only shown for one month, although the
> calculation on 01.01. begins.

I'm glad you asked. In terms of cumulative Growing Degree-Days,
detail is important. Decisions about when to spray chemicals, for
example, are made day-to-day. Five days spans the time between "too
early" and too late." If the chart is too wide, the time detail and
the difference between starting cumulative GDD and ending is not so
obvious, so the chart is only 28 days wide. For the sake of the model
the accumulation, however, must begin on the "start date," whenever that
is, even though it may be farther than 28 days in the past.

You can try making the "time_length" for the "four-week_images"
longer, but this probably will cause the x-axis limits to snap to
month boundaries. You will lose the daily granularity of the 28-day
charts. You can change the same time constant (2419200 seconds) in
the $SKIN_ROOT/Phenology/cumulative_growing_degree_days.html.tmpl to
print a longer history, too.

- --
.. Be Seeing You,
.. Chuck Rhode, Sheboygan, WI, USA
.. Weather: http://LacusVeris.com/WX
.. 31° — Wind NE 18 mph

-----BEGIN PGP SIGNATURE-----

iF0EARECAB0WIQT+MY/5I/LMPSswTbVg2/xipKOWUgUCYE69pQAKCRBg2/xipKOW
UljKAJ4/OSdcstp/ZcaT/uLlOUVwAIHqUgCfW72U4J5tlKSak79jmfiNhKE+wVc=
=qi4A
-----END PGP SIGNATURE-----
Reply all
Reply to author
Forward
0 new messages