gjr80 / weewx-saratoga

A WeeWX extension to support the Saratoga Weather Website Templates
GNU Affero General Public License v3.0
3 stars 2 forks source link

Upgrade from 4.10.2-1 weewx to 5.0.0 - install weewx-saratoga 0.1.8 fails #24

Closed ktrue closed 10 months ago

ktrue commented 10 months ago

weewx.UnsupportedFeature: WeeWX-Saratoga0.1.8 requires WeeWX 4.5.0 or greater, found 5.0.0

was the error message on

 weectl extension install ws-0.1.8.tar.gz
Using configuration file /etc/weewx/weewx.conf
Install extension 'ws-0.1.8.tar.gz' (y/n)? y
Extracting from tar archive ws-0.1.8.tar.gz
Traceback (most recent call last):
  File "/usr/share/weewx/weectl.py", line 74, in <module>
    main()
  File "/usr/share/weewx/weectl.py", line 66, in main
    namespace.func(namespace)
  File "/usr/share/weewx/weectllib/__init__.py", line 121, in dispatch
    namespace.action_func(config_dict, namespace)
  File "/usr/share/weewx/weectllib/extension_cmd.py", line 116, in install_extension
    ext.install_extension(namespace.source, no_confirm=namespace.yes)
  File "/usr/share/weewx/weecfg/extension.py", line 138, in install_extension
    extension_name = self._install_from_file(extension_path, filetype)
  File "/usr/share/weewx/weecfg/extension.py", line 168, in _install_from_file
    extension_name = self.install_from_dir(extension_dir)
  File "/usr/share/weewx/weecfg/extension.py", line 179, in install_from_dir
    installer_path, installer = weecfg.get_extension_installer(extension_dir)
  File "/usr/share/weewx/weecfg/__init__.py", line 715, in get_extension_installer
    installer = loader()
  File "/tmp/tmpngftx07v/ws/install.py", line 185, in loader
  File "/tmp/tmpngftx07v/ws/install.py", line 194, in __init__
weewx.UnsupportedFeature: WeeWX-Saratoga0.1.8 requires WeeWX 4.5.0 or greater, found 5.0.0

I did note in the apt-get upgrade the weewx installation reported

Unpacking weewx (5.0.0-1) over (4.10.2-1) ...
dpkg: warning: unable to delete old directory '/usr/share/weewx/user': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/udev/rules.d': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Standard/smartphone/icons': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Standard/smartphone': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Standard/lang': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Standard/backgrounds': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Standard/RSS': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Standard/NOAA': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Standard': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Smartphone/lang': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Smartphone/icons': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Smartphone': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Seasons/lang': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Seasons/font': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Seasons/NOAA': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Seasons': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Rsync': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Mobile/lang': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Mobile': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins/Ftp': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/skins': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/scripts': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/apache/conf.d': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/apache/conf-available': Directory not empty
dpkg: warning: unable to delete old directory '/etc/weewx/apache': Directory not empty

Help??

gjr80 commented 10 months ago

Thanks Ken. Darn, I had that version check fixed yesterday but it looks like I may have uploaded the wrong installer version. I can' fix it just now, but will be onto it later this morning.

Not sure but the 'unable to delete errors' are unrelated and should not cause a problem.

ktrue commented 10 months ago

To make sure that V5.0.0 was installed, I did

sudo apt-get remove weewx
sudo apt-get install weewx

and it installed cleanly (no error messages) and started running (with the 0.7.0 weewx-saratoga plugin) The basic files are being generated (except for the WEEWXtags.php which is having an issue:

Jan 16 13:20:28 TRP3WX weewxd[15405]: ERROR weewx.reportengine: Caught unrecoverable exception in generator 'weewx.cheetahgenerator.CheetahGenerator'
Jan 16 13:20:28 TRP3WX weewxd[15405]: ERROR weewx.reportengine:         ****  module 'weewx.units' has no attribute 'UnknownType'

The realtime seems to be working ok.

gjr80 commented 10 months ago

There were two v5 related fixes in 0.1.8. The first was the need to change the version checking algorithm due to deprecation of an old library. The second is to fix the weewx.units.UnknownType you are seeing now. Unfortunately we can't fix the latter until we get v0.1.8 installed which needs me to fix the misbehaving installer. If that makes sense?

By the looks of it WeeWX v5 is running with the old v0.1.7 weewx-saratoga extension.

ktrue commented 10 months ago

Yes, my bad.. the v0.1.7 weewx-saratoga extension is the one running with weewx 5.0.0

gjr80 commented 10 months ago

Should be fixed now. Try re-downloading and installing the 0.1.8 package.

ktrue commented 10 months ago

Yep.. that worked!

pi@TRP3WX:~ $ sudo weectl extension install ws-0.1.8.tar.gz
Using configuration file /etc/weewx/weewx.conf
Install extension 'ws-0.1.8.tar.gz' (y/n)? y
Extracting from tar archive ws-0.1.8.tar.gz
Saving installer file to /etc/weewx/bin/user/installer/WeeWX-Saratoga.
Saved configuration dictionary. Backup copy at /etc/weewx/weewx.conf.20240116141124.
Finished installing extension WeeWX-Saratoga from ws-0.1.8.tar.gz.
pi@TRP3WX:~ $ sudo systemctl restart weewx

I'm doing a tail -f /var/log/syslog to watch the progress.

ktrue commented 10 months ago

Sigh.. still an error somewhere

Jan 16 14:12:18 TRP3WX weewxd[15551]: INFO weewx.engine: Starting main packet loop.
Jan 16 14:15:28 TRP3WX weewxd[15551]: INFO weewx.cheetahgenerator: Generated 13 files for report StandardReport in 4.59 seconds
Jan 16 14:15:29 TRP3WX weewxd[15551]: INFO weewx.imagegenerator: Generated 12 images for report StandardReport in 0.89 seconds
Jan 16 14:15:29 TRP3WX weewxd[15551]: INFO weewx.reportengine: Copied 13 files to /var/www/html/weewx
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine: Caught unrecoverable exception in generator 'weewx.cheetahgenerator.CheetahGenerator'
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****  module 'weewx.units' has no attribute 'UnknownType'
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****  Traceback (most recent call last):
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****    File "/usr/share/weewx/weewx/reportengine.py", line 207, in run
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****      obj.start()
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****    File "/usr/share/weewx/weewx/reportengine.py", line 399, in start
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****      self.run()
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****    File "/usr/share/weewx/weewx/cheetahgenerator.py", line 166, in run
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****      ngen = self.generate(gen_dict[section_name], section_name, self.gen_ts)
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****    File "/usr/share/weewx/weewx/cheetahgenerator.py", line 226, in generate
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****      ngen += self.generate(section[subsection], subsection, gen_ts)
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****    File "/usr/share/weewx/weewx/cheetahgenerator.py", line 226, in generate
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****      ngen += self.generate(section[subsection], subsection, gen_ts)
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****    File "/usr/share/weewx/weewx/cheetahgenerator.py", line 309, in generate
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****      searchList = self._getSearchList(encoding, timespan,
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****    File "/usr/share/weewx/weewx/cheetahgenerator.py", line 401, in _getSearchList
Jan 16 14:15:29 TRP3WX weewxd[15551]: Traceback (most recent call last):
Jan 16 14:15:29 TRP3WX weewxd[15551]:   File "/usr/share/weewx/weewx/reportengine.py", line 207, in run
Jan 16 14:15:29 TRP3WX weewxd[15551]:     obj.start()
Jan 16 14:15:29 TRP3WX weewxd[15551]:   File "/usr/share/weewx/weewx/reportengine.py", line 399, in start
Jan 16 14:15:29 TRP3WX weewxd[15551]:     self.run()
Jan 16 14:15:29 TRP3WX weewxd[15551]:   File "/usr/share/weewx/weewx/cheetahgenerator.py", line 166, in run
Jan 16 14:15:29 TRP3WX weewxd[15551]:     ngen = self.generate(gen_dict[section_name], section_name, self.gen_ts)
Jan 16 14:15:29 TRP3WX weewxd[15551]:   File "/usr/share/weewx/weewx/cheetahgenerator.py", line 226, in generate
Jan 16 14:15:29 TRP3WX weewxd[15551]:     ngen += self.generate(section[subsection], subsection, gen_ts)
Jan 16 14:15:29 TRP3WX weewxd[15551]:   File "/usr/share/weewx/weewx/cheetahgenerator.py", line 226, in generate
Jan 16 14:15:29 TRP3WX weewxd[15551]:     ngen += self.generate(section[subsection], subsection, gen_ts)
Jan 16 14:15:29 TRP3WX weewxd[15551]:   File "/usr/share/weewx/weewx/cheetahgenerator.py", line 309, in generate
Jan 16 14:15:29 TRP3WX weewxd[15551]:     searchList = self._getSearchList(encoding, timespan,
Jan 16 14:15:29 TRP3WX weewxd[15551]:   File "/usr/share/weewx/weewx/cheetahgenerator.py", line 401, in _getSearchList
Jan 16 14:15:29 TRP3WX weewxd[15551]:     search_list += obj.get_extension_list(timespan, db_lookup)
Jan 16 14:15:29 TRP3WX weewxd[15551]:   File "/etc/weewx/bin/user/wssearchlist.py", line 1569, in get_extension_list
Jan 16 14:15:29 TRP3WX weewxd[15551]:     if not isinstance(temp_vt, weewx.units.UnknownType):
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****      search_list += obj.get_extension_list(timespan, db_lookup)
Jan 16 14:15:29 TRP3WX weewxd[15551]: AttributeError: module 'weewx.units' has no attribute 'UnknownType'
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****    File "/etc/weewx/bin/user/wssearchlist.py", line 1569, in get_extension_list
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****      if not isinstance(temp_vt, weewx.units.UnknownType):
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****  AttributeError: module 'weewx.units' has no attribute 'UnknownType'
Jan 16 14:15:29 TRP3WX weewxd[15551]: ERROR weewx.reportengine:         ****  Generator terminated
Jan 16 14:15:37 TRP3WX weewxd[15551]: INFO weewx.imagegenerator: Generated 36 images for report WEEWXtagsReport in 7.46 seconds
Jan 16 14:15:37 TRP3WX weewxd[15551]: INFO user.stackedwindrose: Generated 1 images for WEEWXtagsReport in 0.15 seconds
Jan 16 14:15:43 TRP3WX weewxd[15551]: INFO weewx.cheetahgenerator: Generated 3 files for report ClientrawReport in 6.14 seconds
Jan 16 14:16:01 TRP3WX weewxd[15551]: INFO weewx.reportengine: ftpgenerator: Ftp'd 61 files in 18.22 seconds
gjr80 commented 10 months ago

Home now. Can you check /etc/weewx/bin/user/wssearchlist.py, around line 94 you should find the file version number, something like WS_SLE_VERSION = '0.1.8'. I'm guessing it's still 0.1.7, line 1569 in the error trace above does not exist in v0.1.8, that code is old (now fixed) v0.1.7 code.

If you do still have 0.1.7 could you try re-installing the extension using weectl extension install and then check the /etc/weewx/bin/user/wssearchlist.py version again. If 0.1.8 it should be fine, but if not could you post the output of the weectl extension install session.

ktrue commented 10 months ago

ok.. did it

pi@TRP3WX:~ $ sudo weectl extension install ws-0.1.8.tar.gz
Using configuration file /etc/weewx/weewx.conf
Install extension 'ws-0.1.8.tar.gz' (y/n)? y
Extracting from tar archive ws-0.1.8.tar.gz
Saving installer file to /etc/weewx/bin/user/installer/WeeWX-Saratoga.
Saved configuration dictionary. Backup copy at /etc/weewx/weewx.conf.20240116174421.
Finished installing extension WeeWX-Saratoga from ws-0.1.8.tar.gz.
pi@TRP3WX:~ $ sudo nano /etc/weewx/bin/user/wssearchlist.py

The wssearchlist.py still shows 0.1.7

    def logdbg(msg):
        logmsg(syslog.LOG_DEBUG, msg)

WS_SLE_VERSION = '0.1.7'
gjr80 commented 10 months ago

That is bizarre. I am doing the same on a VM with no issues. I'm wondering if something is not being copied to where it should be. Can you try the install one more time, this time with --verbosity=3, e.g.

weectl extension install /var/tmp/ws-0.1.8.tar.gz --verbosity=3

That should give us a pile of detail on what is being copied where.

ktrue commented 10 months ago

Here's the result

pi@TRP3WX:~ $ sudo systemctl stop weewx
pi@TRP3WX:~ $ sudo weectl extension install ws-0.1.8.tar.gz --verbosity=3
Using configuration file /etc/weewx/weewx.conf
Install extension 'ws-0.1.8.tar.gz' (y/n)? y
Extracting from tar archive ws-0.1.8.tar.gz
  Request to install extension found in directory /tmp/tmpbj6wqwuf/ws.
  Found extension with name 'WeeWX-Saratoga'.
  Copying new files...
    Copying from '/tmp/tmpbj6wqwuf/ws/bin/user/rtcr.py' to '/bin/user/rtcr.py'
    Copying from '/tmp/tmpbj6wqwuf/ws/bin/user/stackedwindrose.py' to '/bin/user/stackedwindrose.py'
    Copying from '/tmp/tmpbj6wqwuf/ws/bin/user/ws.py' to '/bin/user/ws.py'
    Copying from '/tmp/tmpbj6wqwuf/ws/bin/user/wsastro.py' to '/bin/user/wsastro.py'
    Copying from '/tmp/tmpbj6wqwuf/ws/bin/user/wsschema.py' to '/bin/user/wsschema.py'
    Copying from '/tmp/tmpbj6wqwuf/ws/bin/user/wssearchlist.py' to '/bin/user/wssearchlist.py'
    Copying from '/tmp/tmpbj6wqwuf/ws/bin/user/wstaggedstats.py' to '/bin/user/wstaggedstats.py'
    Copying from '/tmp/tmpbj6wqwuf/ws/bin/user/wsxtypes.py' to '/bin/user/wsxtypes.py'
    Copying from '/tmp/tmpbj6wqwuf/ws/skins/Clientraw/clientrawdaily.txt.tmpl' to '/skins/Clientraw/clientrawdaily.txt.tmpl'
    Copying from '/tmp/tmpbj6wqwuf/ws/skins/Clientraw/clientrawextra.txt.tmpl' to '/skins/Clientraw/clientrawextra.txt.tmpl'
    Copying from '/tmp/tmpbj6wqwuf/ws/skins/Clientraw/clientrawhour.txt.tmpl' to '/skins/Clientraw/clientrawhour.txt.tmpl'
    Copying from '/tmp/tmpbj6wqwuf/ws/skins/Clientraw/skin.conf' to '/skins/Clientraw/skin.conf'
    Copying from '/tmp/tmpbj6wqwuf/ws/skins/WEEWXtags/skin.conf' to '/skins/WEEWXtags/skin.conf'
    Copying from '/tmp/tmpbj6wqwuf/ws/skins/WEEWXtags/WEEWXtags.php.tmpl' to '/skins/WEEWXtags/WEEWXtags.php.tmpl'
    Copying from '/tmp/tmpbj6wqwuf/ws/skins/WEEWXtags/font/LICENSE.txt' to '/skins/WEEWXtags/font/LICENSE.txt'
    Copying from '/tmp/tmpbj6wqwuf/ws/skins/WEEWXtags/font/OpenSans-Bold.ttf' to '/skins/WEEWXtags/font/OpenSans-Bold.ttf'
    Copying from '/tmp/tmpbj6wqwuf/ws/skins/WEEWXtags/font/OpenSans-Regular.ttf' to '/skins/WEEWXtags/font/OpenSans-Regular.ttf'
  Copied 17 files.
  Adding services to service lists.
  Adding sections to configuration file
    Merged extension settings into configuration file
Saving installer file to /etc/weewx/bin/user/installer/WeeWX-Saratoga.
Saved configuration dictionary. Backup copy at /etc/weewx/weewx.conf.20240116180321.
Finished installing extension WeeWX-Saratoga from ws-0.1.8.tar.gz.
gjr80 commented 10 months ago

Well that explains it: '/bin/user/wssearchlist.py' != '/etc/weewx/bin/user/wssearchlist.py'. Now to work out why and how to fix. I have done all of my development on a WeeWX v5 pip install whereas you are using a package install. That should make no difference, it certainly has not with previous releases, the WeeWX extension installer handles all that.

I'll create another VM with a 4.10.2 package install, upgrade to a v5 package install then install the extension and see what I can find.

gjr80 commented 10 months ago

Well I've been able to reproduce the problem, let's see what we can work out.

gjr80 commented 10 months ago

Well Ken, it's a WeeWX bug and a good one!

https://groups.google.com/g/weewx-user/c/fa2y3wTr-AE

My suggestion is do not un-unstall any extensions until WeeWX is updated (which should not be far away)

ktrue commented 10 months ago

I've not seen any progress from Tom after the 'READ ME!' post .. any action on resolving the issue?

gjr80 commented 10 months ago

The bug you discovered has been fixed, this commit refers, the problem is there are a couple of other issues with package installs that they are trying to fix and include in the same 5.0.1 release.

If you want I can give you some instructions for manually updating to 0.1.8 (it's a pretty basic job, just untag and copy), a manual update will be immune to any of the potentially bad consequences mentioned the 'READ ME!' post.

ktrue commented 10 months ago

Yes, please, I'd appreciate the manual instructions for updating to 0.1.8 with V5.0.0 apt install. Thanks!

gjr80 commented 10 months ago

The manual install instructions are essentially the same as the manual install instructions in the readme, the trick is finding the correct destination directories under WeeWX v5. As it turns out you are using a package install which makes things a bit easier (package installs use known fixed locations, pip and git installs are somewhat more complicated using locations based on where and how you install WeeWX).

To manually install 0.1.8:

  1. download and unpack the 0.1.8 .tar.gz file as per the readme
  2. from the resulting ws directory copy the ws/bin/user/*.py files to /etc/weewx/bin/user (if you look in /etc/weewx/bin/user you should find the 0.1.7 files are already there, you are just replacing them with 0.1.8)
  3. from the resulting ws directory copy the ws/skins/Clientraw and ws/skins/WEEWXtags directories to /etc/weewx/skins (again if you look at /etc/weewx/skins you should find the 0.1.7 Clientraw and WEEWXtags directories are already there)
  4. restart WeeWX and fingers crossed it should be good
gjr80 commented 10 months ago

Rather ironic, they are packing up 5.0.1 now.

ktrue commented 10 months ago

I did the manual install as per above. Results in log show

Jan 25 07:50:23 TRP3WX weewxd[5910]: INFO weewx.manager: Added record 2024-01-25 07:50:00 PST (1706197800) to database 'weewxwd.sdb'
Jan 25 07:50:23 TRP3WX weewxd[5910]: INFO weewx.manager: Added record 2024-01-25 07:50:00 PST (1706197800) to daily summary in 'weewxwd.sdb'
Jan 25 07:50:28 TRP3WX weewxd[5910]: INFO weewx.cheetahgenerator: Generated 13 files for report StandardReport in 4.75 seconds
Jan 25 07:50:29 TRP3WX weewxd[5910]: INFO weewx.imagegenerator: Generated 12 images for report StandardReport in 0.94 seconds
Jan 25 07:50:29 TRP3WX weewxd[5910]: INFO weewx.reportengine: Copied 13 files to /var/www/html/weewx
Jan 25 07:50:36 TRP3WX weewxd[5910]: INFO weewx.cheetahgenerator: Generated 1 files for report WEEWXtagsReport in 7.10 seconds
Jan 25 07:50:37 TRP3WX weewxd[5910]: INFO weewx.imagegenerator: Generated 9 images for report WEEWXtagsReport in 0.72 seconds
Jan 25 07:50:37 TRP3WX weewxd[5910]: INFO user.stackedwindrose: Generated 1 images for WEEWXtagsReport in 0.18 seconds
Jan 25 07:50:43 TRP3WX weewxd[5910]: INFO weewx.cheetahgenerator: Generated 3 files for report ClientrawReport in 6.25 seconds
Jan 25 07:50:53 TRP3WX weewxd[5910]: INFO weewx.reportengine: ftpgenerator: Ftp'd 35 files in 9.47 seconds

doing a ls -l /var/www/html/weewx shows the standard files are all updated, but the weewx-saratoga files are not :(

-rw-r--r-- 1 root root  2056 Jan 16 14:05  clientrawdaily.txt
-rw-r--r-- 1 root root  3128 Jan 16 14:05  clientrawextra.txt
-rw-r--r-- 1 root root  2339 Jan 16 14:05  clientrawhour.txt
-rw-r--r-- 1 root root   818 Jan 25 07:55  clientraw.txt
...
-rw-r--r-- 1 root root 32179 Jan 16 12:30  WEEWXtags.php
-rw-r--r-- 1 root root  6843 Jan 25 00:55  yearbarometer.png

the 0.1.8 files are in the /etc/weewx/skins in the proper ./Clientraw and ./WEEWXtags directories.

Where to look next?

ktrue commented 10 months ago

Eureka! I found in /etc/weewx/weewx.conf

    [[WEEWXtagsReport]]
        skin = WEEWXtags
        enable = True
        HTML_ROOT = /var/www/html/weewx/public_html/saratoga
        [[[Units]]]
            [[[[StringFormats]]]]
                NONE = --
            [[[[TimeFormats]]]]
                date_f = %m/%d/%Y
                date_time_f = %m/%d/%Y %-I:%M_%p
    [[ClientrawReport]]
        skin = Clientraw
        enable = True
        HTML_ROOT = /var/www/html/weewx/public_html/saratoga

which I corrected to be

    [[WEEWXtagsReport]]
        skin = WEEWXtags
        enable = True
        HTML_ROOT = /var/www/html/weewx
        [[[Units]]]
            [[[[StringFormats]]]]
                NONE = --
            [[[[TimeFormats]]]]
                date_f = %m/%d/%Y
                date_time_f = %m/%d/%Y %-I:%M_%p
    [[ClientrawReport]]
        skin = Clientraw
        enable = True
        HTML_ROOT = /var/www/html/weewx

and restarted weewx and it now works just fine!