Files
weewx/docs/usersguide.htm
2018-09-06 05:32:43 -07:00

3915 lines
183 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>weewx: User's Guide</title>
<meta http-equiv="Content-Language" content="en-us"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link rel="stylesheet" href="css/ui-lightness/jquery-ui-1.10.4.custom.min.css"/>
<link rel="stylesheet" href="css/jquery.tocify.css"/>
<link rel="stylesheet" href="css/weewx_docs.css"/>
<link rel="icon" href="images/favicon.png" type="image/png"/>
</head>
<body>
<div class="sidebar">
<div class="doclist">
<a href="usersguide.htm">User's Guide</a><br/>
<a href="customizing.htm">Customization Guide</a><br/>
<a href="hardware.htm">Hardware Guide</a><br/>
<a href="utilities.htm">Utilities Guide</a><br/>
<a href="upgrading.htm">Upgrade Guide</a><br/>
<a href="devnotes.htm">Notes for Developers</a>
</div>
<div id="toc_controls"></div>
<div id="toc_parent">
<div id="toc">
<!-- The table of contents will be injected here -->
</div>
</div>
</div>
<div class="main">
<div class="header">
<div class="logoref">
<a href='http://weewx.com'>
<img src='images/logo-weewx.png' class='logo' align='right' alt="weewx logo"/>
</a><br/>
<span class='version'>
Version: 3.9
</span>
</div>
<div class="title">
User's Guide to the weeWX Weather System
</div>
</div>
<div id="technical_content" class="content">
<p>
This is the complete guide to installing, configuring, and
troubleshooting weeWX.
</p>
<h1 id="about">About weeWX</h1>
<p><a href="http://www.weewx.com">WeeWX</a> is
software, written in <a href="http://www.python.org">Python</a>, that
interacts with a weather station to produce plots, reports, and HTML
pages. It can optionally upload the reports to a remote Web server as
well as publish to weather services such as
<a href="https://www.wunderground.com">WeatherUnderground</a>,
<a href="http://wxqa.com">CWOP</a>, or
<a href="https://www.pwsweather.com/">PWSweather.com</a>.</p>
<p>Initial development began in the winter of 2008-2009, with the first
release in 2009.</p>
<p>The source code is hosted on <a href="https://github.com/weewx/weewx">GitHub</a>, while
downloads are available at
<a href="http://weewx.com/downloads"><span class="code">weewx.com/downloads</span></a>.</p>
<p>WeeWX is about 13,000 lines of code, plus
another 13,000 for the drivers for all the types of supported hardware. </p>
<h1 id="prerequisites">System requirements</h1>
<h2 id="hardware">Station hardware</h2>
<p>WeeWX includes support for many types
of weather stations. In addition to hardware
support, weeWX comes with a software
simulator, useful for testing and evaluation.
</p>
<p>The
<a href="hardware.htm#driver_status">driver compatibility table</a>
in the hardware guide has a detailed list of the manufacturers and
models supported by the drivers that come with
weeWX. If you do
not see your hardware in this table, check the list of
<a href="http://weewx.com/hardware.html">supported hardware</a>;
the pictures may help you identify the manufacturer and/or model.
Compatibility for some hardware is provided by 3rd party drivers,
available at the
<a href="https://github.com/weewx/weewx/wiki">Wiki</a>.
Finally, check the
<a href="http://weewx.com/hwcmp.html">hardware comparison</a>
to see if your hardware is known but not yet supported.
</p>
<p>
If you still cannot find your hardware, post to the
<a href="https://groups.google.com/forum/#!forum/weewx-user">User's Group</a>
for help.
</p>
<h2>Computer hardware</h2>
<p>WeeWX is written in Python, so it has the overhead associated with that
language. Nevertheless, it is "fast enough" on just about any hardware. It
has been run on everything from an early MacBook to a router!</p>
<p>I run weeWX on a Fit-PC with a 500 MHz AMD
Geode processor and 512 MB of memory. Configured this way, it
consumes about 5% of the CPU, 100 MB of virtual memory,
and 20 MB of real memory. </p>
<p>WeeWX also runs great on a Raspberry Pi, although report generation will take
longer.
For example, the 12 "To Date" templates take about 5.1 seconds on the RPi,
compared to 3.0 seconds on my Fit-PC, and a mere 0.9 seconds on my vintage
Dell Optiplex 745.</p>
<h2>Time</h2>
<p> You should run a <a href="http://www.ntp.org/">NTP</a> daemon on your
server to ensure that it is synchronized with the correct time. Doing so
will greatly reduce errors, especially if you send data to services such
as the Weather Underground. </p>
<p>The time on some stations is automatically synchronized with the
weeWX server nominally every four hours.
The synchronization frequency can be adjusted in the
weeWX configuration.</p>
<h2>Python</h2>
<p>Python 2.5, 2.6, or 2.7 is required. Python 3 will not work. See special notes
below for <a href="#python2_5">Python 2.5</a> and <a href="#python2_6">Python 2.6</a>
</p>
<h2 id="permissions">Permissions</h2>
<p>There are a few places where permissions affect weeWX:
</p>
<ul>
<li>Installation/Configuration. The user who does the installation
must have write permission in order to do the install.
Similarly, the user who modifies configuration files and skins
must have write permission on those files and directories. The
specific folders depend on the installation method, and are
listed in the <a href="#Where_to_find_things">layout table</a>
below.
</li>
<li>Running. Most USB and serial devices require administrative
(root) access. Unless the device has been configured with a
udev rule or other mechanism that grants access to non-root
users, weeWX commands must be run as
root or must be prefaced with <span class="code">sudo</span>
for temporary administrative privileges.
</li>
</ul>
<p>Normally weeWX is installed and run with
administrative (root) permissions. However, it is not uncommon to
install and run weeWX as a generic
non-root user, or even as a user created specifically to run weeWX.
</p>
<h1 id="installing">Installing weeWX</h1>
<h2>Required skills</h2>
<p>
In the world of open-source hobbyist software,
weeWX is pretty easy to install and
configure. There are not many package dependencies, the
configuration is simple, and this guide includes extensive
instructions.
There are thousands of people who have successfully done an
install. However, there is no "point-and-click" interface, so
you will have to do some manual configuring.
</p>
<p>You should have the following skills:</p>
<ul>
<li>The patience to read and follow this guide;</li>
<li>Willingness and ability to edit a configuration file;</li>
<li>Some familiarity with Linux or other Unix derivatives;</li>
<li>Ability to do simple Unix tasks such as changing file
permissions and running commands;
</li>
<li>No programming experience is necessary unless you wish
to extend weeWX. In this case, you should be comfortable
programming in Python.
</li>
</ul>
<p>If you get stuck, there is a very active
<a href="https://groups.google.com/forum/#!forum/weewx-user">User's Group</a> to
help, but, please, try to solve the problem yourself before posting.
</p>
<h2>Overview</h2>
<p>This is an outline of the process to install, configure, and run
weeWX:</p>
<ol>
<li>Read the <a href="hardware.htm">hardware notes</a>
for your weather station. This will let you know of any features,
limitations, or quirks of your hardware.
</li>
<li>Install weeWX. Use the step-by-step
instructions in one of the
<a href="#installation_methods">installation methods</a> below.
</li>
<li>Configure the hardware. This involves setting things like the onboard archive
interval, rain bucket size, etc. You may have to follow directions given by your
hardware manufacturer, or you may be able to use the
utility <a href="utilities.htm#wee_device_utility"><span class="code">wee_device</span>.</a>
</li>
<li>Launch the <span class="code">weewxd</span> program. It can be
run either as a <a href="#Running_as_a_daemon">daemon</a>,
or <a href="#Running_directly">directly from the command line</a>.
</li>
<li>Tune the installation. Typically this is done by changing settings in the <a href="#weewxconf"><span class="code">weewx.conf</span></a>
configuration file.
</li>
<li><a href="customizing.htm">Customize</a> the installation. This is an advanced topic, which allows you to
shape weeWX exactly to your liking!
</li>
</ol>
<h2 id="installation_methods">Installation methods</h2>
<p>
Weewx can be installed from a DEB (Debian) or RPM
(Redhat, SUSE) package, or it can be installed using the standard Python utility
<span class='code'>setup.py</span>.
</p>
<p>
The DEB or RPM package approach is simpler and is the recommended method for
beginners. However, it requires root privileges, and will install the
bits and pieces of weeWX in standard
operating system locations across the file system instead of in a
single directory. The net effect is that configuration files,
templates, and code will all be installed in separate locations, most
of which will require root privileges to modify.
</p>
<p>
Installation using <span class="code">setup.py</span> is the
recommended method for those who plan to write custom services and
reports for weeWX. It will put everything
in a single directory, specified by the parameter <span class='code'>home</span>
in the <span class='code'>setup.cfg</span> file, making it
easier to modify weeWX. This file is not
used by the other installation methods. If the user installing
weeWX has permission to write to the directory, root privileges
will not be required to install, run, or modify weeWX.
</p>
<h2><a href='debian.htm'>Installing from DEB package</a></h2>
<p>For Debian, Ubuntu, Mint, and Raspbian operating systems, follow the
<a href='debian.htm'>instructions for Debian-based systems</a>.</p>
<h2><a href='redhat.htm'>Installing from Redhat RPM package</a></h2>
<p>For Redhat, CentOS, Fedora operating systems, follow the
the <a href='redhat.htm'>instructions for Redhat-based systems</a>.</p>
<h2><a href='suse.htm'>Installing from SuSE RPM package</a></h2>
<p>For SuSE and OpenSUSE, follow the
<a href='suse.htm'>instructions for SuSE-based systems</a>.</p>
<h2><a href='macos.htm'>Installing on MacOS</a></h2>
<p>For MacOS, follow the
<a href='macos.htm'>instructions for MacOS systems</a>.</p>
<h2><a href='setup.htm'>Installing using the Python tool setup.py</a></h2>
<p>For all other operating systems, follow the
<a href='setup.htm'><span class="code">setup.py</span> instructions</a>. This method
can also be used on Debian-, Redhat-, and SUSE-based operating systems as well,
and may be a better choice if you intend to heavily customize weeWX.
</p>
<h2 id="Where_to_find_things">Where to find things</h2>
<p>
Here is a summary of the layout for the different install methods, along
with the symbolic names used for each role. These names are used
throughout the documentation. </p>
<div id='dir-layout-table' class='tabs' style='padding-top:1em'>
<div id='layout-tab-deb' class='tab selected' onclick="showtab('layout','deb')">
Debian
<img src='images/logo-debian.png' class='thumbnail' alt="Debian logo"/>
<img src='images/logo-ubuntu.png' class='thumbnail' alt="Ubuntu logo"/>
<img src='images/logo-mint.png' class='thumbnail' alt="Mint logo"/>
</div>
<div id='layout-tab-rpm' class='tab' onclick="showtab('layout','rpm')">
Redhat/SUSE
<img src='images/logo-redhat.png' class='thumbnail' alt="Redhat logo"/>
<img src='images/logo-centos.png' class='thumbnail' alt="Centos logo"/>
<img src='images/logo-fedora.png' class='thumbnail' alt="Fedora logo"/>
<img src='images/logo-suse.png' class='thumbnail' alt="SUSE logo"/>
</div>
<div id='layout-tab-macos' class='tab' onclick="showtab('layout','macos')">macos
<img src='images/logo-apple.png' class='thumbnail' alt="Apple logo"/>
</div>
<div id='layout-tab-setup' class='tab' onclick="showtab('layout','setup')">setup.py</div>
</div>
<div id='layout' style='clear:both; width: 80%;'>
<div id='layout-deb'>
<table class='locations'>
<tr class='selected'>
<td colspan='3' class='locations_banner'>Application layout for install using DEB package</td>
</tr>
<tr class="first_row">
<td>Role</td>
<td>Symbolic Name</td>
<td>Nominal Location</td>
</tr>
<tr>
<td>weeWX root directory</td>
<td class="symcode">WEEWX_ROOT</td>
<td class="tty">/</td>
</tr>
<tr>
<td>Executables</td>
<td class="symcode">BIN_ROOT</td>
<td class='tty'>/usr/share/weewx/</td>
</tr>
<tr>
<td>Configuration directory</td>
<td class="symcode">CONFIG_ROOT</td>
<td class='tty'>/etc/weewx/</td>
</tr>
<tr>
<td>Skins and templates</td>
<td class="symcode">SKIN_ROOT</td>
<td class='tty'>/etc/weewx/skins/</td>
</tr>
<tr>
<td>SQLite databases</td>
<td class="symcode">SQLITE_ROOT</td>
<td class='tty'>/var/lib/weewx/</td>
</tr>
<tr>
<td>Web pages and images</td>
<td class="symcode">HTML_ROOT</td>
<td class='tty'>/var/www/html/weewx/</td>
</tr>
<tr>
<td>Documentation</td>
<td class="symcode">DOC_ROOT</td>
<td class='tty'>/usr/share/doc/weewx/</td>
</tr>
<tr>
<td>Examples</td>
<td class="symcode">EXAMPLE_ROOT</td>
<td class='tty'>/usr/share/doc/weewx/examples/</td>
</tr>
<tr>
<td>PID file</td>
<td class="symcode"></td>
<td class='tty'>/var/run/weewx.pid</td>
</tr>
<tr>
<td>Log file</td>
<td class="symcode"></td>
<td class='tty'>/var/log/syslog</td>
</tr>
</table>
</div>
<div id='layout-rpm' style='display:none'>
<table class='locations'>
<tr class='selected'>
<td colspan='3' class='locations_banner'>Application layout for install using RPM package</td>
</tr>
<tr class="first_row">
<td>Role</td>
<td>Symbolic Name</td>
<td>Nominal Location</td>
</tr>
<tr>
<td>weeWX root directory</td>
<td class="symcode">WEEWX_ROOT</td>
<td class="tty">/</td>
</tr>
<tr>
<td>Executables</td>
<td class="symcode">BIN_ROOT</td>
<td class='tty'>/usr/share/weewx/</td>
</tr>
<tr>
<td>Configuration directory</td>
<td class="symcode">CONFIG_ROOT</td>
<td class='tty'>/etc/weewx/</td>
</tr>
<tr>
<td>Skins and templates</td>
<td class="symcode">SKIN_ROOT</td>
<td class='tty'>/etc/weewx/skins/</td>
</tr>
<tr>
<td>SQLite databases</td>
<td class="symcode">SQLITE_ROOT</td>
<td class='tty'>/var/lib/weewx/</td>
</tr>
<tr>
<td>Web pages and images</td>
<td class="symcode">HTML_ROOT</td>
<td class='tty'>/var/www/html/weewx/</td>
</tr>
<tr>
<td>Documentation</td>
<td class="symcode">DOC_ROOT</td>
<td class='tty'>/usr/share/doc/weewx-x.y.z/</td>
</tr>
<tr>
<td>Examples</td>
<td class="symcode">EXAMPLE_ROOT</td>
<td class='tty'>/usr/share/doc/weewx-x.y.z/examples/</td>
</tr>
<tr>
<td>PID file</td>
<td class="symcode"></td>
<td class='tty'>/var/run/weewx.pid</td>
</tr>
<tr>
<td>Log file</td>
<td class="symcode"></td>
<td class='tty'>/var/log/messages</td>
</tr>
</table>
</div>
<div id='layout-macos' style='display:none'>
<table class='locations'>
<tr class='selected'>
<td colspan='3' class='locations_banner'>Application layout for install on MacOS
</td>
</tr>
<tr class="first_row">
<td>Role</td>
<td>Symbolic Name</td>
<td>Nominal Location</td>
</tr>
<tr>
<td>weeWX root directory</td>
<td class="symcode">WEEWX_ROOT</td>
<td class="tty">/Users/Shared/weewx/</td>
</tr>
<tr>
<td>Executables</td>
<td class="symcode">BIN_ROOT</td>
<td class='tty'>/Users/Shared/weewx/bin/</td>
</tr>
<tr>
<td>Configuration directory</td>
<td class="symcode">CONFIG_ROOT</td>
<td class='tty'>/Users/Shared/weewx/</td>
</tr>
<tr>
<td>Skins and templates</td>
<td class="symcode">SKIN_ROOT</td>
<td class='tty'>/Users/Shared/weewx/skins/</td>
</tr>
<tr>
<td>SQLite databases</td>
<td class="symcode">SQLITE_ROOT</td>
<td class='tty'>/Users/Shared/weewx/archive/</td>
</tr>
<tr>
<td>Web pages and images</td>
<td class="symcode">HTML_ROOT</td>
<td class='tty'>/Users/Shared/weewx/public_html/</td>
</tr>
<tr>
<td>Documentation</td>
<td class="symcode">DOC_ROOT</td>
<td class='tty'>/Users/Shared/weewx/docs/</td>
</tr>
<tr>
<td>Examples</td>
<td class="symcode">EXAMPLE_ROOT</td>
<td class='tty'>/Users/Shared/weewx/examples/</td>
</tr>
<tr>
<td>PID file</td>
<td class="symcode"></td>
<td class='tty'>/var/run/weewx.pid</td>
</tr>
<tr>
<td>Log file</td>
<td class="symcode"></td>
<td class='tty'>/var/log/system.log</td>
</tr>
</table>
</div>
<div id='layout-setup' style='display:none'>
<table class='locations'>
<tr class='selected'>
<td colspan='3' class='locations_banner'>Application layout for install using <span
class='code'>setup.py</span>
</td>
</tr>
<tr class="first_row">
<td>Role</td>
<td>Symbolic Name</td>
<td>Nominal Location</td>
</tr>
<tr>
<td>weeWX root directory</td>
<td class="symcode">WEEWX_ROOT</td>
<td class="tty">/home/weewx/</td>
</tr>
<tr>
<td>Executables</td>
<td class="symcode">BIN_ROOT</td>
<td class='tty'>/home/weewx/bin/</td>
</tr>
<tr>
<td>Configuration directory</td>
<td class="symcode">CONFIG_ROOT</td>
<td class='tty'>/home/weewx/</td>
</tr>
<tr>
<td>Skins and templates</td>
<td class="symcode">SKIN_ROOT</td>
<td class='tty'>/home/weewx/skins/</td>
</tr>
<tr>
<td>SQLite databases</td>
<td class="symcode">SQLITE_ROOT</td>
<td class='tty'>/home/weewx/archive/</td>
</tr>
<tr>
<td>Web pages and images</td>
<td class="symcode">HTML_ROOT</td>
<td class='tty'>/home/weewx/public_html/</td>
</tr>
<tr>
<td>Documentation</td>
<td class="symcode">DOC_ROOT</td>
<td class='tty'>/home/weewx/docs/</td>
</tr>
<tr>
<td>Examples</td>
<td class="symcode">EXAMPLE_ROOT</td>
<td class='tty'>/home/weewx/examples/</td>
</tr>
<tr>
<td>PID file</td>
<td class="symcode"></td>
<td class='tty'>/var/run/weewx.pid</td>
</tr>
<tr>
<td>Log file</td>
<td class="symcode"></td>
<td class='tty'>/var/log/syslog</td>
</tr>
</table>
</div>
</div>
<!-- Moved wee_config description to utilities.htm-->
<h1 id="running">Running weeWX</h1>
<p>WeeWX can be run either directly,
or as a daemon. When first trying
weeWX, it is best to run it directly
because you will be able to see sensor output and diagnostics, as well
as log messages. Once everything is working properly, run it as a
daemon.</p>
<h2 id="Running_directly">Running directly</h2>
<p>To run weeWX directly, invoke
the main program, <span class="code">weewxd</span>, giving
the configuration file as its only parameter: </p>
<pre class="tty cmd">sudo weewxd weewx.conf</pre>
<p>It should start by downloading any data stored in your weather station
(if the station has a data logger) into the archive database. For some
stations, such as the Davis Vantage with a couple thousand records, this
could take a minute or two. I have found this process particularly slow
on SuSE for some reason. </p>
<p>WeeWX will then start monitoring live sensor
data (also referrred to as 'LOOP' data),
printing a short version of the received data on standard output, about
once every two seconds for a Vantage station, or considerably longer
for some other stations. </p>
<p>You can tell a running instance of weeWX to
reread its configuration file by sending it the
<span class="code">HUP</span> signal.
First run <span class="code">ps</span> to find out the Process ID (PID)
number of the instance, then send it the <span class="code">HUP</span> signal: </p>
<pre class="tty"><span class="cmd">ps -a</span> # Note the PID of the weewxd process
<span class="cmd">kill -HUP <em>pid</em></span> # Send it a HUP signal</pre>
<p>Note that this <em>only</em> rereads the configuration file. It will
not reload any code.</p>
<h2 id="Running_as_a_daemon">Running as a daemon</h2>
<p>For unattended operations it is best to have weeWX
run as a daemon, started automatically when the server is rebooted. </p>
<p>If you use a packaged install from a DEB or RPM distribution, this is
done automatically. You can ignore this section.</p>
<p>Start by selecting the appropriate run script. They can be found in the
source or installation under
<span class="code">util/init.d/</span>. </p>
<table class="locations" style="width:90%">
<tr>
<td style='width:30%'>Debian/Ubuntu/Mint:</td>
<td class='tty'>util/init.d/weewx.debian</td>
</tr>
<tr>
<td>Redhat/CentOS/Mint:</td>
<td class='tty'>util/init.d/weewx.redhat</td>
</tr>
<tr>
<td>SuSE:</td>
<td class='tty'>util/init.d/weewx.suse</td>
</tr>
</table>
<p>Check the chosen script to make sure the variable <span class="code">WEEWX_ROOT</span>
has been set to the proper root directory for your
weeWX installation (it should have been set to the correct value automatically
by the install process, but it is worth checking). </p>
<p>Copy it to the proper location for your system: </p>
<table class="locations" style="width:90%">
<tr>
<td style="width: 30%">Debian/Ubuntu/Mint:</td>
<td class='tty'><span class="cmd">cp util/init.d/weewx.debian /etc/init.d/weewx</span></td>
</tr>
<tr>
<td>Redhat/CentOS/Fedora:</td>
<td class='tty'><span class="cmd">cp util/init.d/weewx.redhat /etc/rc.d/init.d/weewx</span></td>
</tr>
<tr>
<td>SuSE:</td>
<td class='tty'><span class="cmd">cp util/init.d/weewx.suse /etc/init.d/weewx</span></td>
</tr>
</table>
<p>Make sure the script is executable: </p>
<table class="locations" style="width:90%">
<tr>
<td style="width: 30%">Debian/Ubuntu/Mint:</td>
<td class='tty'><span class="cmd">chmod +x /etc/init.d/weewx</span></td>
</tr>
<tr>
<td>Redhat/CentOS/Fedora:</td>
<td class='tty'><span class="cmd">chmod +x /etc/init.d/rc.d/weewx</span></td>
</tr>
<tr>
<td>SuSE:</td>
<td class='tty'><span class="cmd">chmod +x /etc/init.d/weewx</span></td>
</tr>
</table>
<p>Create symbolic links in the run level directories: </p>
<table class="locations" style="width:90%">
<tr>
<td style="width: 30%">Debian/Ubuntu/Mint:</td>
<td class='tty'><span class="cmd">update-rc.d weewx defaults 98</span></td>
</tr>
<tr>
<td>Redhat/CentOS/Fedora:</td>
<td class='tty'><span class="cmd">chkconfig weewx on</span></td>
</tr>
<tr>
<td>SuSE:</td>
<td class='tty'><span class="cmd">/usr/lib/lsb/install_initd /etc/init.d/weewx</span></td>
</tr>
</table>
<p>WeeWX will now start automatically whenever your system is booted.
You can also manually start, stop, and restart the weeWX daemon:
</p>
<pre class="tty cmd">sudo /etc/init.d/weewx start
sudo /etc/init.d/weewx stop
sudo /etc/init.d/weewx restart</pre>
<p>By default, the scripts are designed to have weeWX
run at run levels 2, 3, 4 and 5. Incidentally, a nice tool for setting run levels
with Debian (Ubuntu, Mint) systems is
<a href="http://sysv-rc-conf.sourceforge.net/">sysv-rc-conf</a>. It uses a curses
interface to allow you to change easily which run level any of your daemons
runs at. There is a similar tool on SuSE. From the start menu run the YAST Control
Center, then look for Systems Services (Runlevel). Pick &quot;Expert&quot; mode
to see the run levels. </p>
<p>You can also tell weeWX to reread its configuration
file without stopping by using the &#39;reload&#39; option: </p>
<pre class="tty cmd">sudo /etc/init.d/weewx reload </pre>
<h1 id="monitoring">Monitoring weeWX</h1>
<p>WeeWX logs many events to the system log.
On Debian systems, this is <span class="code">/var/log/syslog</span>,
on SuSE, <span class="code">/var/log/messages</span>. Your system may
use yet another place. When troubleshooting the system, be sure to check
it! </p>
<p class='tty cmd'>tail -f /var/log/syslog</p>
<p>Set the debug option in <span class='code'>weewx.conf</span> to
generate many more checks and output more information. This can be
useful for diagnosing problems and debugging.</p>
<p class='tty'>debug = 1</p>
<h1 id="integrating_with_webserver">Integrating with a web server</h1>
<h2>If the server is on the same machine</h2>
<p>The reports generated by weeWX can be
served by a web server running on the same computer as
weeWX. These are instructions for making
weeWX reports available via the Apache
web server. The process is similar for other web servers such as
<span class='code'>nginx</span> or
<span class='code'>lighthttpd</span>.</p>
<ol>
<li>
<p>Install the Apache web server on the computer on which
weeWX is running. For example, on Debian systems:</p>
<p class='tty cmd'>sudo apt-get install apache2</p>
</li>
<li>
<p>Configure Apache to see the weeWX reports.</p>
<ul>
<li>
<p>If weeWX was installed from DEB or RPM package, no
configuration should be necessary since the reports
are placed in the directory
<span class='code'>/var/www/html/weewx</span>,
which is in the Apache DocumentRoot directory
<span class='code'>/var/www/html</span></p>
</li>
<li>
<p>If weeWX was installed using
<span class='code'>setup.py</span>, you must tell
Apache where to find the weeWX reports.
One method is to install an Apache
configuration snippet:</p>
<pre class='tty cmd'>sudo cp util/apache/conf.d/weewx.conf /etc/apache2/conf.d</pre>
<p>Be sure that the path in the Apache configuration
snippet matches the
<span class='code'>HTML_ROOT</span> defined in the
weeWX configuration file. For example,
the path for a default
<span class='code'>setup.py</span> installation
would look like this:</p>
<pre class='tty'>Alias /weewx <span class="highlight">/home/weewx/public_html</span>
&lt;Directory <span class="highlight">/home/weewx/public_html</span>&gt;
Options FollowSymlinks
AllowOverride None
&lt;/Directory&gt;</pre>
<p>Restart Apache to make the changes happen:</p>
<pre class='tty cmd'>sudo /etc/init.d/apache2 restart</pre>
</li>
</ul>
</li>
<li>
<p>Open the weeWX URL in a web browser:</p>
<p class='tty'>http://localhost/weewx</p>
</li>
</ol>
<h2>If the server is on a different machine</h2>
<p>Use FTP or RSYNC to transfer the files generated by weeWX to your
remote server. In weeWX, FTP and RSYNC
are implemented as reports. They are configured in the
<span class="code">[StdReport]</span> section of the
weeWX configuration file.</p>
<p>For example, the following configuration would use RSYNC to copy
the html and images files from the standard report to a folder
<span class="code">/var/www/html/weewx</span> on the server
<span class="code">wx.example.com</span>:
</p>
<pre class='tty'>[StdReport]
[[RSYNC]]
skin = Rsync
server = wx.example.com
path = /var/www/html/weewx
user = wxuser</pre>
<p>The following configuration would use FTP to copy the html and
images:</p>
<pre class='tty'>[StdReport]
[[FTP]]
skin = Ftp
server = wx.example.com
path = /var/www/html/weewx
user = wxuser
password = wxpass</pre>
<p>See the documentation for the
<a href="#config_FTP"><span class="code">[[FTP]]</span></a> and
<a href="#config_RSYNC"><span class="code">[[RSYNC]]</span></a>
sections of the configuration file
<span class="code">weewx.conf</span> for details and options.
</p>
<h1 id="backup">Making backups</h1>
<p>
To backup a weeWX installation, you will need to make a copy of
</p>
<ul>
<li>configuration information;</li>
<li>skins and templates;</li>
<li>any custom code or extensions you have installed;</li>
<li>the weeWX database.</li>
</ul>
<p>
It is not necessary to backup the generated images, HTML files, or
NOAA reports since weeWX will easily
create these again.
</p>
<p>Individual instructions follow.</p>
<h2>Configuration</h2>
<p>
Save the <span class='code'>weewx.conf</span> file.
</p>
<table class="locations" style="width:70%">
<tr>
<td style="width: 30%">setup.py:</td>
<td class='tty'>/home/weewx/weewx.conf</td>
</tr>
<tr>
<td>DEB/RPM:</td>
<td class='tty'>/etc/weewx/weewx.conf</td>
</tr>
</table>
<h2>Skins and templates</h2>
<p>
Save the contents of the skins directory if you have modified the default
skin or if you have added any new skins or template files.
</p>
<table class="locations" style="width:70%">
<tr>
<td style="width: 30%">setup.py:</td>
<td class='tty'>/home/weewx/skins</td>
</tr>
<tr>
<td>DEB/RPM:</td>
<td class='tty'>/etc/weewx/skins</td>
</tr>
</table>
<h2>Custom code or extensions</h2>
<p>
Save the contents of the
<span class='code'>user</span> directory if you have modified the
database schema or added any extensions. If the extensions save data
to a database you should backup those databases as well.
</p>
<table class="locations" style="width:70%">
<tr>
<td style="width: 30%">setup.py:</td>
<td class='tty'>/home/weewx/bin/user</td>
</tr>
<tr>
<td>DEB/RPM:</td>
<td class='tty'>/usr/share/weewx/user</td>
</tr>
</table>
<h2>Database</h2>
<p>
Finally, you will need to backup the database.
</p>
<p>
For a SQLite configuration, make a copy of the <span class='code'>weewx.sdb</span> file.
</p>
<table class="locations" style="width:70%">
<tr>
<td style="width: 30%">setup.py:</td>
<td class='tty'>/home/weewx/archive/weewx.sdb</td>
</tr>
<tr>
<td>DEB/RPM:</td>
<td class='tty'>/var/lib/weewx/weewx.sdb</td>
</tr>
</table>
<p class="note">
Do not make the copy of the SQLite database while in the middle of
a transaction! Schedule the backup for immediately after an
archive record is written, and then make sure the backup completes
before the next archive record arrives. Alternatively, stop weeWX,
perform the backup, then restart weeWX.
</p>
<p>
For a MySQL configuration, save a dump of the archive database.
</p>
<h2>Restoring from backup</h2>
<p>
To restore from backup, do a fresh install of
weeWX, replace the default files with
those from a backup, then start weeWX.
</p>
<h1 id="configuring_mysql">Configuring MySQL</h1>
<p>This section applies only to those who wish to use the MySQL
database, instead of the default SQLite database.</p>
<p>First, verify that the MySQLdb python package is installed:</p>
<pre class="tty">python -c "import MySQLdb"</pre>
<p>If this results in an import error</p>
<pre class="tty">ImportError: No module named MySQLdb</pre>
<p>then install the MySQLdb package. For example, on Debian systems:
</p>
<pre class="tty">sudo apt-get install python-mysqldb</pre>
<p>Next, change the weeWX configuration to use MySQL instead of
SQLite. In the weeWX configuration file, change the
<a href="#wx_binding"><span class="code">[[wx_binding]]</span></a>
section to point to the MySQL database,
<span class="code">archive_mysql</span>,
instead of the SQLite database
<span class="code">archive_sqlite</span>.
</p>
<p> After the change, it will look something like this (change
<span class="highlight">highlighted</span>):
</p>
<pre class="tty">
[[wx_binding]]
# The database should match one of the sections in [Databases]
<span class="highlight">database = archive_mysql</span>
# The name of the table within the database
table_name = archive
# The class to manage the database
manager = weewx.wxmanager.WXDaySummaryManager
# The schema defines to structure of the database contents
schema = schemas.wview.schema</pre>
<p>Assuming that you want to use the default database configuration, the
<span class="code"><a href="#Databases">[[MySQL]]</a></span> section
should look something like this:</p>
<pre class="tty"> [[MySQL]]
driver = weedb.mysql
host = localhost
user = weewx
password = weewx
</pre>
<p>This assumes user <span class="code">weewx</span> has the password
<span class="code">weewx</span>. Adjust as necessary.</p>
<p>You will need to give the necessary permissions for the database
<span class="code">weewx</span> to whatever MySQL user you choose,
by default, user <span class="code">weewx</span>. Here are the
necessary minimum permissions:</p>
<pre class="tty">mysql&gt; <span class="cmd">CREATE USER 'weewx'@'localhost' IDENTIFIED BY 'weewx';</span>
mysql&gt; <span class="cmd">GRANT select, update, create, delete, insert, drop ON weewx.* TO weewx@localhost;</span></pre>
<h1 id="wview_compatibility">Compatibility with <span class="code">wview</span></h1>
<h2>sqlite3</h2>
<p>The SQLite archive database used by weeWX
(nominally, <span class="code">weewx.sdb</span>) is completely
compatible with the database used by
<a href="http://www.wviewweather.com">wview</a> (usually called
<span class="code">wview-archive.sdb</span>), at least as of wview
Version 5.2.X. The schema, and its semantics, is identical.
</p>
<p>If you have data from <span class='code'>wview</span>, you can
'import' them into weeWX by simply copying the
SQLite database file. Assuming that the <span class='code'>wview</span>
data are in file
<span class='code'>/var/wview/archive/wview-archive.sdb</span>,</p>
<pre class='tty cmd'>sudo /etc/init.d/weewx stop
cd <span class="symcode">SQLITE_ROOT</span>
mv weewx.sdb weewx.sdb.bak
cp /var/wview/archive/wview-archive.sdb weewx.sdb
sudo /etc/init.d/weewx start</pre>
<p>
Internally, within the <span class="code">weewx.sdb</span> database,
weeWX also maintains a "daily summary" of all the statistics. This
is done for performance reasons. The daily summary will
automatically be built on the first startup. This could take
a few minutes if the <span class='code'>wview</span> archive contains
more than a month or two of data.
</p>
<p>
On my modest 500 MHz <a href="http://www.fit-pc.com/">fit-PC
Slim</a> with 512 MB of memory it took a little over 4 minutes for a
year and a half (25 MB) of data.
</p>
<h2>MySQL</h2>
<p>The MySQL archive database used by wview is "almost" compatible with
weeWX. The one difference is that in wview, the column <span
class="code">interval</span>
is named <span class="code">arcInt</span> (presumably because
<span class="code">interval</span> is a keyword in MySQL, although it can
still be used by surrounding the word with backquotes). </p>
<p>To change the column name to what weeWX uses, namely <span
class="code">interval</span>,
use the utility <span class="code">mysql</span> and issue the command:</p>
<pre class="tty">mysql> <span class="cmd">ALTER TABLE <em>your-wview-archive-name</em> CHANGE arcInt `interval` INTEGER NOT NULL;</span> </pre>
<p>where <span class="code"><em>your-wview-archive-name</em></span> is the
name of your wview archive database. Note that the word <span class="code">
interval</span> is surrounded by backquotes.</p>
<p>Then in the <span class="code">[Databases]</span> section of
<span class="code">weewx.conf</span>, replace the name of the database
with whatever your installation of wview used <span class="code"><em>your-wview-archive-name</em></span>:
</p>
<pre class="tty">[[archive_mysql]]
database_type = MySQL
database_name = <span class="highlight"><em>your-wview-archive-name</em></span></pre>
<h1 id="weewxconf">The configuration file <span class="code">weewx.conf</span></h1>
<p>The configuration file <span class="code">weewx.conf</span> is a big
text file that holds the configuration information about your
installation of weeWX. This includes things such as:</p>
<ul>
<li>The type of hardware you have;</li>
<li>The name of your station;</li>
<li>What kind of database to use and where is it located;</li>
<li>How to recognize out-of-range observations, <i>etc</i>.</li>
</ul>
<p class='note'>The location of <span class="code">weewx.conf</span>
will depend on your installation method and operating
system. For example, if you used the
<span class='code'>setup.py</span> method, then the nominal location is
<span class='code'>/home/weewx</span>, and so your
configuration file will be
<span class='code'>/home/weewx/weewx.conf</span>. For other
configurations, consult the
<a href="#dir-layout-table">application layout table</a> in the
'Installation methods' section.</p>
<p class='note'>There is another configuration file, <span class="code">skin.conf</span>,
for presentation-specific options. It is described in the
<a href="customizing.htm">Customization Guide</a>, under section <em>
<a href="customizing.htm#standard_skin">The Standard <span class="code">skin.conf</span></a></em>.</p>
<p>The following sections are the definitive guide to the many configuration options
available in <span class='code'>weewx.conf</span>. <em>They contain many
more options than you are likely to need!</em> &mdash;
you can safely ignore most of them. The truly important ones, the ones
you are likely to have to customize for your station, are
<span class="config_important">highlighted</span>.</p>
<p>Default values are provided for many options, meaning that if they are
not listed in the configuration file <em>at all</em>,
weeWX will pick sensible values. When the
documentation below gives a &quot;default value&quot; this is what it
means.</p>
<p>What follows is organized by the different sections of the
configuration file. </p>
<h2>General</h2>
<p>The options declared at the top are not actually part of any section.</p>
<p class="config_option">debug </p>
<p>Set to 1 to have the program perform extra debug checks, as well as
emit extra information in the log file. This is strongly recommended
if you are having trouble. Otherwise, set to 0. Default
is 0 (no debug).
</p>
<p class="config_option">WEEWX_ROOT </p>
<p>Set to the root directory of the weeWX file hierarchy for this
station. Normally, this is set automatically by the
installation process. Required. No default.
</p>
<p class="config_option">socket_timeout </p>
<p>Set to how long to wait before declaring a socket time out. This is
used when using FTP to send data to a web server or when sending data
to the Weather Underground. Twenty (20) seconds is reasonable. Default
is 20. </p>
<p class='config_option'>gc_interval</p>
<p>Set to how often garbage collection should be performed by the Python
runtime engine. Default is every 10,800 seconds (3 hours).</p>
<p class="config_option">loop_on_init</p>
<p>Normally, if the hardware driver fails to load, weewx will exit. The assumption
is that there is a configuration problem and so retries are useless.
However, in some cases, drivers can fail to load for intermittent reasons,
such as a network failure. In these cases, it may be useful to have
weewx do a retry. Setting this option to 1 will cause weewx to keep retrying indefinitely.
</p>
<h2 class="config_section">[Station]</h2>
<p>This section covers options relating to your weather station setup. </p>
<p class="config_important">location </p>
<p>The station location should be a UTF-8 string that describes the
geography of where your weather station is located. Required.
No default.</p>
<pre class="tty">location = "A small ranch in Kentucky"</pre>
<p class="config_important">latitude <br/>
longitude </p>
<p>The lat/lon should be set in decimal degrees, negative for southern and
western hemispheres, respectively. Required. No default. </p>
<pre class="tty">latitude = 38.8977
longitude = -77.0366</pre>
<p class="config_option"><span class="config_important">altitude</span></p>
<p>Normally the station altitude is downloaded from your hardware, but not
all stations support this. Set to the altitude of the station and the
unit used for the altitude. Example: </p>
<pre class="tty">altitude = 700, foot</pre>
<p>An example in meters:</p>
<pre class="tty">altitude = 220, meter</pre>
<p class="config_important">station_type </p>
<p>Set to the type of hardware you are using.</p>
<pre class="tty">station_type = Simulator</pre>
<p>Whatever option you choose, you <strong>must have a matching section</strong>
in your configuration file. For example, if you choose
<span class="code">station_type = Simulator</span>, then you
will need a <span class="code">[Simulator]</span> section.
While you can do this by hand, it is tedious and error-prone. The better way
to add the needed section is by using the utility
<a href="utilities.htm#wee_config_utility"><span class="code">wee_config</span></a> with
the <span class="code">--reconfigure</span> option. If the needed section is missing,
this utility will automatically inject it into the configuration file.
</p>
<p>Valid options include:</p>
<table class="indent">
<tr class="first_row">
<td>Option</td>
<td>Description</td>
</tr>
<tr>
<td class="code first_col">Simulator</td>
<td>A software weather station simulator. Useful for testing and
debugging.
</td>
</tr>
<tr>
<td class="code first_col">AcuRite</td>
<td>AcuRite 5-in-1 stations with USB interface</td>
</tr>
<tr>
<td class="code first_col">CC3000</td>
<td>RainWise CC3000 data logger</td>
</tr>
<tr>
<td class="code first_col">FineOffsetUSB</td>
<td>Fine Offset 10xx, 20xx, and 30xx stations</td>
</tr>
<tr>
<td class="code first_col">TE923</td>
<td>Hideki TE923 stations</td>
</tr>
<tr>
<td class="code first_col">Ultimeter</td>
<td>PeetBros Ultimeter stations</td>
</tr>
<tr>
<td class="code first_col">Vantage</td>
<td>Davis Vantage weather stations</td>
</tr>
<tr>
<td class="code first_col">WMR100</td>
<td>Oregon Scientific WMR100 series stations</td>
</tr>
<tr>
<td class="code first_col">WMR200</td>
<td>Oregon Scientific WMR200 series stations</td>
</tr>
<tr>
<td class="code first_col">WMR300</td>
<td>Oregon Scientific WMR300 series stations</td>
</tr>
<tr>
<td class="code first_col">WMR9x8</td>
<td>Oregon Scientific WMR-918/968 series stations</td>
</tr>
<tr>
<td class="code first_col">WS1</td>
<td>Argent Data Systems WS1 stations</td>
</tr>
<tr>
<td class="code first_col">WS23xx</td>
<td>La Crosse 23xx stations</td>
</tr>
<tr>
<td class="code first_col">WS28xx</td>
<td>La Crosse 28xx stations</td>
</tr>
</table>
<p id="station_url" class="config_option"><span class="config_important">station_url</span></p>
<p>If you have a website, you may optionally specify an URL for
its HTML server. It will be included in the RSS file generated
by weeWX and, if you choose to opt into the <a href="#station_registry">station
registry</a>, it will also be included in the
<a href="http://weewx.com/stations.html">map of weewx stations</a>.</p>
<p>Example:</p>
<pre class="tty">station_url = http://www.mywebsite.com</pre>
<p class="config_option" id="rain_year_start">rain_year_start
</p>
<p>Normally the start of the rain year is downloaded from your hardware,
but not all stations support this. Set to the start of your rain year,
for example, 10, if your rain year starts in October (as mine does).
Default is 1. </p>
<pre class="tty">rain_year_start = 1</pre>
<p class="config_option" id="week_start">week_start </p>
<p>Start of the week. 0=Monday, 1= Tuesday, ... , 6 = Sunday. Default is 6 (Sunday)
</p>
<pre class="tty">week_start = 0</pre>
<h3 class="config_section">[Simulator]</h3>
<p>This section is for options relating to the software weather
station simulator that comes with weeWX.</p>
<p class="config_option">loop_interval</p>
<p>The time (in seconds) between emitting loop packets. Default is 2.5</p>
<p class="config_option">mode</p>
<p>One of either <span class='code'>simulator</span> or <span class='code'>generator</span>. Default is <span
class='code'>simulator</span>.</p>
<table class="indent">
<tr>
<td class="code">simulator</td>
<td>Real-time simulator. It will sleep between emitting packets.</td>
</tr>
<tr>
<td class="code">generator</td>
<td>Emit packets as fast as it can. Useful for testing.</td>
</tr>
</table>
<p class="config_option">start</p>
<p>The local start time for the generator in the format <span class="code">YYYY-mm-ddTHH:MM</span>. An
example would be <span class="code">2012-03-30T18:30</span>. This would code 30-March-2012, at 6:30pm,
local time. Optional. Default is the present time.</p>
<h3 class="config_section">[AcuRite]</h3>
<p>This section is for options relating to the AcuRite 5-in-1 series of
weather stations with USB connectors.</p>
<p class="config_important">model</p>
<p>Set to the station model. For example, "AcuRite 01035", "AcuRite 01036",
or "02032C"</p>
<p class="config_option">use_constants</p>
<p>Some stations (01035, 01036) use the HP038 sensor, which contains
constants that define how the pressure and temperature should be
interpreted. Other stations (02032, 02064) use the MS5607 sensor,
which requires a different calculation to determine the pressure
and temperature from the sensor. When
<span class='code'>use_constants</span> is
<span class='code'>True</span>, the driver will use the constants to
determine which type of sensor is in the station and will adjust the
calculation accordingly. A value of False causes the driver to use
a linear approximation, regardless of the type of sensors.
The default is True.
</p>
<h3 class="config_section">[CC3000]</h3>
<p>This section is for options relating to the RainWise Mark III weather
stations and CC3000 data logger.</p>
<p class="config_important">port</p>
<p>The serial port, e.g., <span class='code'>/dev/ttyS0</span>. When using
a USB-Serial converter, the port will be something like
<span class='code'>/dev/ttyUSB0</span>. Default is
<span class='code'>/dev/ttyUSB0</span></p>
<p class='config_option'>polling_interval</p>
<p>The <span class="code">polling_interval</span> determines how often
weeWX will query the station for data. The default is 1 second.
</p>
<p class="config_option">sensor_map</p>
<p>This option defines the mapping between temperature values
in the database and the remote sensors. Two additional temperature
sensors are supported.
</p>
<p>For example, this would associate extraTemp1 with the second
optional temperature sensor:
</p>
<pre class='tty'>[[sensor_map]]
extraTemp1 = TEMP 2</pre>
<p>See the <a href="hardware.htm#cc3000_data">Hardware Guide</a> for
a complete listing of sensor names and the default database fields
for each sensor.
</p>
<h3 class="config_section">[FineOffsetUSB]</h3>
<p>This section is for options relating to the Fine Offset series of
weather stations with USB connectors.</p>
<p class="warning">The following settings are <strong>highly</strong>
recommended for Fine Offset stations. Using hardware record generation
or adaptive polling is more likely to cause USB communication failure.
Using hardware record generation will cause delays in report
generation.</p>
<pre class='tty'>
[FineOffsetUSB]
polling_mode = PERIODIC
polling_interval = 60
[StdArchive]
record_generation = software</pre>
<p class="config_important">model</p>
<p>Set to the station model. For example, WH1080, WS2080, WH3081, etc. </p>
<p class='config_option'>polling_mode</p>
<p>One of <span class='code'>PERIODIC</span> or
<span class='code'>ADAPTIVE</span>. In
<span class='code'>PERIODIC</span> mode,
weeWX queries the console at regular intervals
determined by the <span class='code'>polling_interval</span>.
In <span class='code'>ADAPTIVE</span> mode,
weeWX attempts to query the
console at times when it is not reading data from the sensors or writing
data to memory. See the section <a
href="hardware.htm#polling_mode_and_the_polling_interval">
Polling Mode and interval</a> in the Hardware Guide
for more details. The default is <span class='code'>PERIODIC</span>.</p>
<p class='config_option'>polling_interval</p>
<p>The frequency, in seconds, at which weeWX will
poll the console for data. Default is 60. This setting applies only
when the <span class='code'>polling_mode</span> is
<span class='code'>PERIODIC</span>.</p>
<p class='config_option'>data_format</p>
<p>There are two classes of hardware, the 10xx/20xx consoles and the
30xx consoles. Unlike the 10xx/20xx consoles, the 30xx consoles
record luminosity and UV, so they have a different data format.
Use the <span class='code'>data_format</span> to
indicate which type of hardware you have. Possible values are
<span class='code'>1080</span> (for the 10xx and 20xx consoles)
and <span class='code'>3080</span> (for the 30xx consoles).
Default is <span class='code'>1080</span>.
</p>
<h3 class="config_section">[TE923]</h3>
<p>This section is for options relating to the Hideki TE923 series of
weather stations.</p>
<p class="config_important">model</p>
<p>Set to the station model. For example, Meade TE923W or TFA Nexus.
Default is "TE923".</p>
<p class="config_option">sensor_map</p>
<p>This option defines the mapping between temperature/humidity values
in the database and the remote sensors. Up to 5 remote sensors are
supported. A switch on each sensor determines which of 5 channels
that sensor will use. For example, if the switch on the sensor is
set to 3, the temperature from that sensor will be t_3 and the
humidity from that sensor will be h_3.
</p>
<p>For example, this would associate outTemp and outHumidity with
sensor 4:
</p>
<pre class='tty'>[[sensor_map]]
outTemp = t_4
outHumidity = h_4</pre>
<p>See the <a href="hardware.htm#te923_data">Hardware Guide</a> for
a complete listing of sensor names and the default database fields
for each sensor.
</p>
<h3 class="config_section">[Ultimeter]</h3>
<p>This section is for options relating to the PeetBros Ultimeter weather
stations.</p>
<p class="config_important">port</p>
<p>The serial port, e.g., <span class='code'>/dev/ttyS0</span>. When using
a USB-Serial converter, the port will be something like
<span class='code'>/dev/ttyUSB0</span>. Default is
<span class='code'>/dev/ttyUSB0</span></p>
<p class="config_important">model</p>
<p>Set to the station model. For example, Ultimeter 2000 or Ultimeter 800.
Default is "Ultimeter".</p>
<h3 class="config_section">[Vantage]</h3>
<p>This section is for options relating to the Davis Vantage series of hardware
(<em>VantagePro, VantagePro2</em> or <em>VantageVue</em>).</p>
<p class="config_important">type </p>
<p>Set to either <span class="code">serial</span>, for a serial or USB
connection to the VantagePro (by far the most common), or to
<span class="code">ethernet</span> for the WeatherLinkIP. No default.</p>
<p class="config_important">port </p>
<p>If you chose <span class="code">serial</span>, for <span class='code'>type</span>,
then set to the serial port name used by the station. For example,
<span class="code">/dev/ttyUSB0</span> is a common location for USB
ports, <span class="code">/dev/ttyS0</span> for serial ports. Otherwise,
not required. No default. </p>
<p class="config_important">host </p>
<p>If you chose <span class="code">ethernet</span>, then specify either
the IP address (<em>e.g.</em>, <span class="code">192.168.0.1</span>)
or hostname (<em>e.g.</em>, <span class="code">console.mydomain.com</span>)
to the console. Otherwise, not required. No default. </p>
<p class="config_option">baudrate </p>
<p>Set to the baudrate of the station. The default is 19200. </p>
<p class="config_option">tcp_port </p>
<p>The port where WeatherLinkIP will be listening. Default is 22222.
</p>
<p class="config_option">tcp_send_delay </p>
<p>How long to block after sending a socket packet to the WeatherLinkIP.
Default is 1 second. </p>
<p class="config_option">iss_id </p>
<p>Set to the ID number of the Integrated Sensor Suite (ISS). This is used
in the formula to calculate reception quality for wireless stations.
Default is 1. </p>
<p class="config_option">timeout </p>
<p>How many seconds to wait for a response from the station before giving
up. Default is 5 seconds. </p>
<p class="config_option">wait_before_retry </p>
<p>How many seconds to wait before retrying. Unless you have a good reason
to change it, this value should be left at the default, as it is long
enough for the station to offer new data, but not so long as to go into
a new loop packet (which arrive every 2 seconds). Default is 1.2
seconds. </p>
<p class="config_option">max_tries </p>
<p>How many times to try again before giving up. Default is 4. </p>
<h3 class="config_section">[WMR100]</h3>
<p>This section is for options relating to the Oregon Scientific WMR100
series of weather stations with USB connectors.</p>
<p class="config_important">model</p>
<p>Set to the station model. For example, WMR100 or WMRS200.</p>
<p class="config_option">sensor_map</p>
<p>This option defines the mapping between observations from remote
sensors and the fields in the database.
</p>
<p>For example, this would associate extraTemp1 with the remote T/H
sensor on channel 5:
</p>
<pre class='tty'>[[sensor_map]]
extraTemp1 = temperature_5</pre>
<p>See the <a href="hardware.htm#wmr100_data">Hardware Guide</a> for
a complete listing of sensor names and the default database fields
for each sensor.
</p>
<h3 class="config_section">[WMR200]</h3>
<p>This section is for options relating to the Oregon Scientific WMR200
series of weather stations with USB connectors.</p>
<p class="config_important">model</p>
<p>Set to the station model. For example, WMR200 or WMR200A.</p>
<p class="config_option">use_pc_time</p>
<p>If True, use the computer time, otherwise use the station time.
Default is True.</p>
<p class="config_option">archive_interval</p>
<p>Set the wmr200 archive interval in seconds. Default is 60
seconds.</p>
<p>The wmr200 hardware records archive data at an immutable rate of 60
seconds. This field may be set to a higher value enabling the weeWX
engine to coalesce live data packets. However, when the wmr200 is not
connected to a system via USB or if the weeWX software is not running,
the wmr200 console will continue to store weather data in onboard
console memory at a fixed rate of 60 seconds.</p>
<p class="config_option">erase_archive</p>
<p>If True, erase onboard console memory archive on startup. Default is
False.</p>
<p class="config_option">archive_startup</p>
<p>When retrieving archive data packets from the wmr200 onboard console
memory, there is no explicit indication that all the data has been
drained. This field specifies when to transition from archive mode to
live mode. This transition occurs when no archive packets are detected
within this time interval. Default is 120 seconds.</p>
<p class="config_option">archive_threshold</p>
<p>Occasionally when retrieving archive packets from the wmr200 onboard
memory a stale data packet will be detected. The archive packets are
presented in sequential order typically timestamped 60 seconds apart.
However, there is no guarantee the archive packets are exactly 60
seconds apart. Should an incoming archive data packet timestamp exceed
the previous archive data packet one by the amount in this field it will
be dropped. Default is 1512000 seconds (1 week).</p>
<p class="config_option">sensor_status</p>
<p>If True, emit sensor faults and failures to log. Default is
True.</p>
<p class="config_option">sensor_map</p>
<p>This option defines the mapping between observations from remote
sensors and the fields in the database.
</p>
<p>For example, this would associate extraTemp1 with the remote T/H
sensor on channel 5:
</p>
<pre class='tty'>[[sensor_map]]
extraTemp1 = temperature_5</pre>
<p>See the <a href="hardware.htm#wmr200_data">Hardware Guide</a> for
a complete listing of sensor names and the default database fields
for each sensor.
</p>
<h3 class="config_section">[WMR300]</h3>
<p>This section is for options relating to the Oregon Scientific WMR300
series of weather stations with USB connectors.</p>
<p class="config_important">model</p>
<p>Set to the station model. For example, WMR300 or WMR300A.</p>
<p class="config_option">sensor_map</p>
<p>This option defines the mapping between temperature/humidity values
in the database and the remote sensors. Up to 8 remote sensors are
supported.
</p>
<p>For example, this would associate outTemp and outHumidity with
sensor 4:
</p>
<pre class='tty'>[[sensor_map]]
outTemp = temperature_4
outHumidity = humidity_4</pre>
<p>See the <a href="hardware.htm#wmr300_data">Hardware Guide</a> for
a complete listing of sensor names and the default database fields
for each sensor.
</p>
<h3 class="config_section">[WMR9x8]</h3>
<p>This section is for options relating to the Oregon Scientific
WMR-918/968 series of weather stations with serial connectors.</p>
<p class="config_important">type</p>
<p>For the moment, only <span class="code">serial</span> is
supported.</p>
<p class="config_important">port</p>
<p>Along with the <span class="code">serial</span> option above, you
must set the serial port name used by the station. For example,
<span class="code">/dev/ttyUSB0</span> is a common location for USB
ports, <span class="code">/dev/ttyS0</span> for serial ports.
No default. </p>
<p class="config_important">model</p>
<p>Set to the station model. For example, WMR968 or WMR918.</p>
<p class="config_option">sensor_map</p>
<p>This option defines the mapping between observations from remote
sensors and the fields in the database.
</p>
<p>For example, this would associate extraTemp1 with the remote T/H
sensor on channel 5:
</p>
<pre class='tty'>[[sensor_map]]
extraTemp1 = temperature_5
extraHumid1 = humidity_5</pre>
<p>See the <a href="hardware.htm#wmr9x8_data">Hardware Guide</a> for
a complete listing of sensor names and the default database fields
for each sensor.
</p>
<h3 class="config_section">[WS1]</h3>
<p>This section is for options relating to the Argent Data Systems WS1
weather stations.</p>
<p class="config_important">port</p>
<p>The serial port, e.g., <span class='code'>/dev/ttyS0</span>. When using
a USB-Serial converter, the port will be something like
<span class='code'>/dev/ttyUSB0</span>. Default is
<span class='code'>/dev/ttyUSB0</span></p>
<p class='config_option'>polling_interval</p>
<p>The <span class="code">polling_interval</span> determines how often
weeWX will query the station for data. The
default is 1 second.
</p>
<h3 class="config_section">[WS23xx]</h3>
<p>This section is for options relating to the La Crosse WS-23xx series of
weather stations.</p>
<p class="config_important">port</p>
<p>The serial port, e.g., <span class='code'>/dev/ttyS0</span>. When using
a USB-Serial converter, the port will be something like
<span class='code'>/dev/ttyUSB0</span>. Default is
<span class='code'>/dev/ttyUSB0</span></p>
<p class="config_important">model</p>
<p>Set to the station model. For example, WS-2315, LaCrosse WS2317,
etc. Default is "LaCrosse WS23xx".</p>
<p class='config_option'>polling_interval</p>
<p>The <span class="code">polling_interval</span> determines how often
weeWX will query the station for data. If no
<span class="code">polling_interval</span> is specified (the default),
weeWX will automatically use a polling interval
based on the type of connection between the station and the sensors
(wired or wireless). When connected with a wire, the console updates
sensor data every 8 seconds. When connected wirelessly, the console
updates from 16 to 128 seconds, depending on sensor activity.
</p>
<h3 class='config_section'>[WS28xx]</h3>
<p>This section is for options relating to the La Crosse WS-28xx series of
weather stations.</p>
<p class="config_important">transceiver_frequency</p>
<p>Radio frequency to use between USB transceiver and console. Specify
either US or EU. US uses 915 MHz, EU uses 868.3 MHz. Default is US.
</p>
<p class="config_important">model</p>
<p>Set to the station model. For example, LaCrosse WS2810, TFA Primus,
etc. Default is "LaCrosse WS28xx".</p>
<h2 class="config_section">[StdRESTful]</h2>
<p>This section is for configuring the <span class="code">StdRESTful</span>
services, which upload to simple
<a href="https://en.wikipedia.org/wiki/Representational_State_Transfer">RESTful</a>
servers such as the <a href="https://www.wunderground.com/">Weather Underground</a>,
<a href="https://www.pwsweather.com/">PWSweather.com</a>, or
<a href="http://www.wxqa.com/">CWOP</a>. </p>
<h3 class="config_section" id="station_registry">[[StationRegistry]]</h3>
<p> A registry of weeWX weather stations
is maintained at <span class="code">weewx.com</span>. Stations are
displayed on a map and a list at
<a href="http://weewx.com/stations.html">http://weewx.com/stations.html</a>
</p>
<p>How does the registry work? Individual weather stations
periodically contact the registry. Each station provides a URL to
identify itself, plus other information such as the station type
and weeWX version. No personal information, nor
any meteorological data, is sent.</p>
<p>To add your station to this list, you must do two things:</p>
<ol>
<li>Enable the StationRegistry in <span class="code">weewx.conf</span>
by setting the option <span class="code">register_this_station</span>
to <span class="code">True</span>. Your station will contact the
registry once per week. If your station does not contact the
registry for about a month, it will be removed from the list.
</li>
<li>Provide a <span class="code">station_url</span>, either in section
<a href="#station_url"><span class='code'>[Station]</span></a>, or
in the <span class='code'>[[StationRegistry]]</span> section.
</li>
</ol>
<p>The <span class='code'>station_url</span> is used to uniquely identify
each station, so choose it carefully before you set
<span class='code'>register_this_station</span> to
<span class='code'>True</span>.</p>
<pre class="tty">[StdRestful]
[[StationRegistry]]
register_this_station = True</pre>
<p class="config_important">register_this_station</p>
<p>Set this to <span class="code">True</span> to register the weather station.</p>
<p class="config_option">description</p>
<p>
A description of the station. If no description is specified, the
<span class="config_option">location</span> from the <span
class="code">[Station]</span> section will be used.
</p>
<p class="config_option">station_url</p>
<p>
The URL to the weather station. If no URL is specified, the <span
class="config_option">station_url</span> from the <span
class="code">[Station]</span> section will be used.
</p>
<p class='config_option'>log_success</p>
<p>In case of success, make a note in the system log. The default is <span class='code'>True</span>.</p>
<p class='config_option'>log_failure</p>
<p>In case of failure, make a note in the system log. The default is <span class='code'>True</span>.</p>
<h3 class="config_section">[[AWEKAS]]</h3>
<p class="config_section">WeeWX can send your
current data to the <a href="https://www.awekas.at/">Automatisches
Wetterkarten System</a> (AWEKAS). If you wish
to do this, set the option <span class='code'>enable</span> to
<span class="code">true</span>, then set options <span class='code'>username</span>
and <span class='code'>password</span> appropriately. When you are done, it will
look something like</p>
<pre class="tty">[StdRestful]
[[AWEKAS]]
enable = true
username = joeuser
password = XXX </pre>
<p class="config_important">enable</p>
<p>
Set to <span class="code">true</span> to enable posting to
AWEKAS. Optional. Default is <span class="code">false</span>.
</p>
<p class="config_important">username</p>
<p>Set to your AWEKAS username (<i>e.g.</i>, <span class="code">joeuser</span>). Required.</p>
<p class="config_important">password</p>
<p>Set to your AWEKAS password. Required.</p>
<p class="config_option">language</p>
<p>Set to your preferred language. Default is <span class='code'>en</span>.</p>
<p class='config_option'>log_success</p>
<p>In case of success, make a note in the system log. The default is <span class='code'>True</span>.</p>
<p class='config_option'>log_failure</p>
<p>In case of failure, make a note in the system log. The default is <span class='code'>True</span>.</p>
<p class='config_option'>retry_login</p>
<p>How long to wait in seconds before retrying a bad login. Default is 3600 seconds (one hour).</p>
<h3 class="config_section">[[CWOP]]</h3>
<p>WeeWX can send your current data to the
<a href="http://www.wxqa.com/">Citizen Weather Observer Program</a>. If you
wish to do this, set the option
<span class='code'>enable</span> to <span class='code'>true</span>,
then set the option <span class='code'>station</span> to your
CWOP station code. If your station is an amateur radio APRS station,
you will have to set <span class="code">passcode</span> as well.
When you are done, it will look something like</p>
<pre class="tty">[StdRestful]
[[CWOP]]
enable = true
station = CW1234
passcode = XXX # Replace with your passcode (APRS stations only)
post_interval = 600</pre>
<p class="config_important">enable</p>
<p>
Set to <span class="code">true</span> to enable posting to the
CWOP. Optional. Default is <span class="code">false</span>.
</p>
<p class="config_important">station</p>
<p>Set to your CWOP station ID (<em>e.g.</em>, <span class="code">CW1234</span>)
or amateur radio callsign (APRS). Required.
</p>
<p class="config_important">passcode</p>
<p>This is used for APRS (amateur radio) stations only. Set to the
passcode given to you by the CWOP operators. Required for APRS stations,
ignored for others.</p>
<p class="config_option">post_interval </p>
<p>The interval in seconds between posts. Because CWOP is heavily used, the
operators discourage very frequent posts. Every 5 minutes (300 seconds)
is fine, but they prefer every 10 minutes (600 s) or even longer. Setting
this value to zero will cause every archive record to be posted.
Optional. Default is 600 seconds.</p>
<p class="config_option">stale</p>
<p>How old a record can be before it will not be used for a catch up. CWOP
does not use the timestamp on a posted record. Instead, they use the wall
clock time that it came in. This means that if your station is off the
air for a long period of time, then when weeWX
attempts a catch up, old data could be interpreted as the current
conditions. Optional. Default is 600 seconds.</p>
<p class="config_option">server_list</p>
<p>A comma-delimited list of the servers that should be tried for
uploading data.
Optional. Default is: <span class="code">cwop.aprs.net:14580, cwop.aprs.net:23</span></p>
<p class='config_option'>log_success</p>
<p>In case of success, make a note in the system log. The default is <span class='code'>True</span>.</p>
<p class='config_option'>log_failure</p>
<p>In case of failure, make a note in the system log. The default is <span class='code'>True</span>.</p>
<h3 class="config_section">[[PWSweather]]</h3>
<p>WeeWX can send your current data to the
<a href="https://www.pwsweather.com/">PWSweather.com</a> service. If you
wish to do this, set the option
<span class='code'>enable</span> to <span class='code'>true</span>,
then set the options <span class='code'>station</span> and
<span class='code'>password</span> appropriately. When you are done,
it will look something like</p>
<pre class="tty">[StdRestful]
[[PWSweather]]
enable = true
station = BOISE
password = XXX</pre>
<p class="config_important">enable</p>
<p>
Set to <span class="code">true</span> to enable posting to the
PWSweather. Optional. Default is <span class="code">false</span>.
</p>
<p class="config_important">station </p>
<p>Set to your PWSweather station ID (<i>e.g.</i>, <span class='code'>BOISE</span>). Required. </p>
<p class="config_important">password </p>
<p>Set to your PWSweather password. Required. </p>
<p class='config_option'>log_success</p>
<p>In case of success, make a note in the system log. The default is <span class='code'>True</span>.</p>
<p class='config_option'>log_failure</p>
<p>In case of failure, make a note in the system log. The default is <span class='code'>True</span>.</p>
<p class='config_option'>retry_login</p>
<p>How long to wait in seconds before retrying a bad login. Default is 3600 seconds (one hour).</p>
<h3 class="config_section">[[WOW]]</h3>
<p class="config_section">WeeWX can send your
current data to the <a href="http://wow.metoffice.gov.uk/">British
Weather Observations Website (WOW)</a> service. If you wish
to do this, set the option <span class='code'>enable</span> to
<span class="code">true</span>, then set options <span class="code">station</span>
and <span class="code">password</span> appropriately. Read
<a href="http://wow.metoffice.gov.uk/support/dataformats#automatic">Importing Weather Data into WOW</a>
on how to find your site's username and how to set the password for your site.
When you are done, it will look something like</p>
<pre class="tty">[StdRestful]
[[WOW]]
enable = true
station = 12345678
password = XXX</pre>
<p class="config_important">enable</p>
<p>
Set to <span class="code">true</span> to enable posting to
WOW. Optional. Default is <span class="code">false</span>.
</p>
<p class="config_important">station</p>
<p>Set to your WOW station ID (<i>e.g.</i>, <span class="code">12345678</span> for Pre June 1996 sites, or <span class="code">6a571450-df53-e611-9401-0003ff5987fd</span> for later ones). Required.</p>
<p class="config_important">password</p>
<p>Set to your WOW Authentication Key. Required. This is not the same as your WOW password but a 6 digit numerical PIN.</p>
<p class='config_option'>log_success</p>
<p>In case of success, make a note in the system log. The default is <span class='code'>True</span>.</p>
<p class='config_option'>log_failure</p>
<p>In case of failure, make a note in the system log. The default is <span class='code'>True</span>.</p>
<p class='config_option'>retry_login</p>
<p>How long to wait in seconds before retrying a bad login. Default is 3600 seconds (one hour).</p>
<h3 class="config_section">[[Wunderground]]</h3>
<p>
WeeWX can send your current data to the
<a href="https://www.wunderground.com/">Weather Underground</a>. If
you wish to do this, set the option <span class="code">enable</span> to
<span class="code">true</span>, then set the options
<span class='code'>station</span> and <span class="code">password</span> appropriately.
When you are done, it will look something like
</p>
<pre class="tty">[StdRestful]
[[Wunderground]]
enable = true
station = KCASANFRA11
password = XXX
rapidfire = False</pre>
<p class="config_important">enable</p>
<p>
Set to <span class="code">true</span> to enable posting to the
Weather Underground. Optional. Default is <span class="code">false</span>.
</p>
<p class="config_important">station</p>
<p>
Set to your Weather Underground station ID (<em>e.g.</em>, <span
class="code">KCASANFRA11</span>). Required.
</p>
<p class="config_important">password</p>
<p>Set to your Weather Underground password. Required.</p>
<p class="config_option">rapidfire</p>
<p>
Set to <span class="code">True</span> to have weeWX
post using the <a href="https://www.wunderground.com/weatherstation/rapidfirehelp.asp">Weather Underground's
"Rapidfire" protocol</a>.
This will send a post to the
WU site with every LOOP packet, which can be as often as every 2.5
seconds in the case of the Vantage instruments. Not all instruments
support this. Optional. Default is <span class="code">False</span>.
</p>
<p class="config_option">rtfreq</p>
<p>When <span class="config_option">rapidfire</span> is set, the <span class="code">rtfreq</span> parameter is sent,
and should correspond to "the frequency of updates in seconds". Optional. Default is <span class="code">2.5</span></p>
<p class="config_option">archive_post</p>
<p>
This option tells weeWX to post on every
archive record, which is the normal "PWS" mode for the Weather
Underground. Because they prefer that you either use their
"Rapidfire" protocol, or their PWS mode, but not both, the default
for this option is the opposite for whatever you choose above for
option <span class="code">rapidfire</span>. However, if for some
reason you want to do both, then you may set both options to <span
class="code">True</span>.
</p>
<p class='config_option'>post_indoor_observations</p>
<p>In the interest of respecting your privacy, weeWX does not
post indoor temperature or humidity to the Weather Underground unless you
set this option to <span class="code">True</span>. Default is
<span class="code">False</span>.
</p>
<p class='config_option'>log_success</p>
<p>In case of success, make a note in the system log. The default is
<span class='code'>False</span> for Rapidfire mode,
<span class='code'>True</span> for PWS mode.</p>
<p class='config_option'>log_failure</p>
<p>In case of failure, make a note in the system log. The default is
<span class='code'>False</span> for Rapidfire mode,
<span class='code'>True</span> for PWS mode.</p>
<p class='config_option'>retry_login</p>
<p>How long to wait in seconds before retrying a bad login. Default is 3600 seconds (one hour).</p>
<p class='config_option'>[[[Essentials]]]</p>
<p>Occasionally (but not always!) when the Weather Underground is missing a data
point it will substitute the value zero (<span class='code'>0.0</span>),
thus messing up statistics and plots.
For all observation types listed in this section, the post will be skipped if that
type is missing. For example,</p>
<pre class='tty'>[[[Essentials]]]
outTemp = True</pre>
<p>would cause the post to be skipped if there is no outside temperature (observation
type <span class='code'>outTemp</span>).</p>
<h2 class="config_section" id="Reports">[StdReport]</h2>
<p>This section is for configuring the <span class="code">StdReport</span> service,
which controls which reports are to be generated. While it can be highly customized
for your individual situation, this documentation describes the section as shipped
in the standard distribution. </p>
<p>Each report is represented by a sub-section, marked with double brackets
(<em>e.g.</em>, <span class="code">[[MyReport]]</span>). Any options for the
report should be placed under it. The standard report service will go through
the sections, running each report in order. Hence, normally the report
<span class="code">[[StandardReport]]</span> will be run first, then report
<span class="code">[[FTP]]</span> (which actually optionally uploads the results
to a remote web server). Details for how to customize reports are in the section
<em><a href="customizing.htm#customizing_reports">Customizing reports</a></em>, in the
<a href="customizing.htm">Customization Guide</a>.
</p>
<p class="config_option">SKIN_ROOT </p>
<p>The directory where the skins live. A relative path is relative to
<span class="symcode">WEEWX_ROOT</span>.</p>
<p class="config_option">HTML_ROOT </p>
<p>The target directory for the generated files. A relative path is
relative to <span class="symcode">WEEWX_ROOT</span>. Generated
files and images will be put here. </p>
<p class="config_option">data_binding</p>
<p>
The data source to be used for the reports. It should match a
binding given in section <a href="#DataBindings"><span
class="code">[DataBindings]</span></a> below. The binding can be overridden in
individual reports. Optional. Default is <span class="code">wx_binding</span>.
</p>
<p class="config_option">report_timing</p>
<p>This parameter uses a cron-like syntax that determines when a report
will be run. The setting can be overridden in individual reports, so
it is possible to run each report with a different schedule. Refer to
the <em><a href="customizing.htm#customizing_gen_time">Customizing the
report generation time</a></em> section in the
<a href="customizing.htm">Customization Guide</a> for details.
Optional. The default value results in each report running on each
archive interval.
</p>
<h3 class="config_section">[[StandardReport]]</h3>
<p>This is the standard report that will be run on every archiving interval.
It uses the skin &quot;<span class="code">Standard</span>&quot;, which generates
four HTML pages (&quot;day&quot;, &quot;week&quot;, &quot;month&quot;, and &quot;year&quot;
observations), plot graphs for same, an RSS feed, and NOAA monthly and yearly
reports. The default configuration uses US Customary Units and puts the results
in <span class="code">public_html</span> and subdirectory <span class="code">
public_html/NOAA</span>. </p>
<h3 class="config_section" id="config_FTP">[[FTP]]</h3>
<p>While this &quot;report&quot; does not actually generate anything, it
uses the report machinery to upload files from directory <span class="symcode">
HTML_ROOT</span> to a remote webserver. It does an incremental update,
that is, it only FTPs any files that have changed, saving the outgoing bandwidth
of your Internet connection. </p>
<p>If you do not use such a server, comment out the first four options below.
</p>
<p class="config_important">user </p>
<p>Set to the username you use for your FTP connection to your web server. Required.
No default. </p>
<p class="config_important">password </p>
<p>Set to the password you use for your FTP connection to your web server. Required.
No default. </p>
<p class="config_important">server </p>
<p>Set to the name of your web server (<em>e.g.</em>, <span class="code">www.threefools.org</span>,
in my case). Required. No default </p>
<p class="config_important">path </p>
<p>Set to the path where the weather data will be stored on your webserver (<em>e.g.</em>, <span class="code">/weather</span>).
NB: some FTP servers require a leading slash (&#39;<span class="code">/</span>&#39;),
some do not. Required. No default. </p>
<p class="config_important">secure_ftp</p>
<p>Set to <span class="code">True</span> to use FTP (FTPS) over TLS. This is an extension to the FTP
protocol that uses a Secure Socket Layer (SSL) protocol, <em>not</em> to be confused with
SFTP, which uses a Secure Socket Shell protocol. Not
all FTP servers support this. In particular, the Microsoft FTP server seems to do a poor
job of it. Requires Python V2.7. Will not work with older versions of Python.
Optional. Default is <span class="code">False</span></p>
<p class="config_option">port</p>
<p>Set to the port ID of your FTP server. Default is <span class="code">21</span>.</p>
<p class="config_option">passive</p>
<p>Set to 1 if you wish to use the more modern, FTP passive mode, 0 if you wish
to use active mode. Passive mode generally works better through firewalls, but
not all FTP servers do a good job of supporting it. See
<a href="http://slacksite.com/other/ftp.html">Active FTP vs. Passive FTP, a
Definitive Explanation</a> for a good explanation of the difference. Default
is 1 (passive mode). </p>
<p class="config_option">max_tries </p>
<p>WeeWX will try up to this many times to FTP a file
up to your server before giving up. Default is 3. </p>
<h3 class="config_section" id="config_RSYNC">[[RSYNC]]</h3>
<p>While this &quot;report&quot; does not actually generate anything, it
uses the report machinery to upload files from directory <span class="symcode">
HTML_ROOT</span> to a remote webserver. It does an incremental update,
that is, it only synchronizes those files that have changed, saving the outgoing
bandwidth of your Internet connection. </p>
<p>If you do not use such a server, comment out the options below. </p>
<p class="config_important">server </p>
<p>Set to the name of your web server (<i>e.g.</i>,
<a href="http://www.threefools.org">www.threefools.org</a>, in my case). Required.
No default </p>
<p class="config_important">user </p>
<p>Set to the ssh username you use for your rsync connection to your web server.
The local user that weeWX runs as must have
<a href='https://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/'>
passwordless ssh</a> configured for <em>user@server</em>.
Required. No default.
</p>
<p class="config_important">path </p>
<p>Set to the path where the weather data will be stored on your webserver
(<i>e.g.</i>, <span class="code">/var/www/html/weather</span>). Make sure
<span class='code'>user</span> has write privileges in this directory.
Required. No default. </p>
<p class="config_important">delete </p>
<p>Files that don't exist in the local report are removed from the remote location.
<em>USE WITH CAUTION:</em> If you make a mistake in setting the
<span class="code">path</span>, this can cause unexpected files to be deleted
on the remote server. Valid values are 1 to enable and 0 to disable. Required.
Default is 0.</p>
<h2 class="config_section" id="StdConvert">[StdConvert]</h2>
<p>This section is for configuring
the <span class="code">StdConvert</span> service. This service
acts as a filter, converting the unit system coming off your
hardware to a target output unit system. All downstream
services, including the archiving service, will then see this
unit system. Hence, your data will be stored in the database
using whatever unit system you specify here. </p>
<p><em>Once chosen, it cannot be changed!</em> WeeWX does not allow you to
mix unit systems within the databases. You must chose a unit system
and then stick with it. This means that users coming from wview (which
uses US Customary) should not change the default setting. Having said
this, there is a way of reconfiguring the database to use another unit
system. See the section
<a href="customizing.htm#Changing_the_unit_system">Changing the unit system</a>
in the Customization Guide.</p>
<p class='note'><strong>Note!</strong><br/> This service only
affects the units used in the <em>databases</em>. In particular,
it has nothing to do with what units are displayed in plots or
files. Those units are specified in the skin configuration
file, <span class="code">skin.conf</span>, as described in
the <a href="customizing.htm">Customization Guide</a>, under
section
<em><!--suppress HtmlUnknownAnchorTarget -->
<a href="customizing.htm#Changing_options">Changing
options</a></em>. Because of this, unless you have a special
purpose application, there is really no good reason to change
from the default, which is <span class="code">US</span>.</p>
<p class="warning"><strong>Warning!</strong><br/>
If, despite these precautions, you do decide to change the units of data
stored in the database, be sure to read the sections
<span class="code"><a href="#StdCalibrate">[StdCalibrate]</a></span> and
<span class="code"><a href="#StdQC">[StdQC]</a></span>, and change the
units there as well!</p>
<p class="config_option" id="option_target_unit">target_unit</p>
<p>Set to either <span class="code">US</span>, <span class="code">METRICWX</span>,
or <span class="code">METRIC</span>. The difference between
<span class="code">METRICWX</span>, and <span class="code">METRIC</span> is that
the former uses <span class="code">mm</span> instead of <span class="code">cm</span>
for rain, and <span class="code">m/s</span> instead of
<span class="code">km/hr</span> for wind speed. See the Appendix <a href="customizing.htm#units">
Units</a> in the Customization Guide for the exact differences beween
these three choices.
Default is <span class="code">US</span>.</p>
<h2 class="config_section" id="StdCalibrate">[StdCalibrate]</h2>
<p>This section is for configuring the <span class="code">StdCalibrate</span>
service. This service offers an opportunity to correct for any calibration errors
in your instruments. It is very general and flexible. </p>
<p>Because this service is normally run after <span class="code">StdConvert</span>,
the units to be used should be the same as the target unit system chosen in
<a href="#StdConvert"><span class="code">StdConvert</span></a> above. It is
also important that this service be run before the archiving service
<span class="code">StdArchive</span>, so that it is the corrected data that
are stored. </p>
<p>In a default configuration, calibrations are applied to
observations from the hardware. They are not applied to derived
calculations since the <span class="code">StdWXCalculate</span>
service runs after <span class="code">StdCalibrate</span>.</p>
<h3 class="config_section">[[Corrections]]</h3>
<p>In this section you list all <em>correction expressions</em>. For example,
say that you know your outside thermometer reads high by 0.2&deg;F. You could add
the expression: </p>
<p class='tty'>outTemp = outTemp - 0.2</p>
<p>Perhaps you need a linear correction around a reference temperature of 68&deg;F:
</p>
<p class='tty'>outTemp = outTemp + (outTemp-68) * 0.02</p>
<p>It is even possible to do corrections involving more than one variable. Suppose
you have a temperature sensitive barometer: </p>
<p class='tty'>barometer = barometer + (outTemp-32) * 0.0091</p>
<p>All correction expressions are run in the order given. </p>
<p>Both LOOP data and archive data will be corrected. </p>
<p>If you are using a Davis Vantage instrument and all you require is a simple
correction offset, this can also be done in the hardware. See your manual for
instructions. </p>
<h2 class="config_section" id="StdQC">[StdQC]</h2>
<p>This section is for configuring the <span class="code">StdQC</span> service.
This service offers a very simple <em>Quality Control</em> that only checks
that values are within a minimum and maximum range.</p>
<p>Because this service is normally run after <span class="code">StdConvert</span>,
the units to be used should be the same as the target unit system chosen in
<a href="#StdConvert"><span class="code">StdConvert</span></a>. It is also
important that it be run after the calibration service, <span class="code">StdCalibrate
</span>and before the archiving service <span class="code">StdArchive</span>,
so that it is the calibrated and corrected data that are stored. </p>
<p>In a default configuration, quality control checks are applied to
observations from the hardware. They are not applied to derived
calculations since the <span class="code">StdWXCalculate</span>
service runs after the quality control.</p>
<h3 class="config_section">[[MinMax]]</h3>
<p>In this section you list the observation types you wish to have checked,
along with their minimum and maximum values. If not specified, the units
should are in <em>the same unit system as specified in section
<span class="code"><a href="#StdConvert">StdConvert</a></span></em>.
</p>
<p>For example, </p>
<pre class="tty">[[MinMax]]
outTemp = -40, 120
barometer = 28, 32.5
outHumidity = 0, 100 </pre>
<p>With <span class='code'>target_unit = US</span> (the default), if a
temperature should fall outside of the inclusive
range -40 &deg;F through 120 &deg;F, then it will be set to the null
value, <span class="code">None</span>, and ignored. In a similar manner,
the acceptable values for barometric pressure would be 28 through 32.5
inHg, for humidity 0 through 100%. </p>
<p>You can also specify units.</p>
<p>For example, </p>
<pre class="tty">[[MinMax]]
outTemp = -40, 60, degree_C
barometer = 28, 32.5, inHg</pre>
<p>In this example, if a temperature should fall outside of the inclusive
range -40 &deg;C through 60 &deg;C, then it will be set to the null
value, <span class="code">None</span>, and ignored. In a similar manner,
the acceptable values for barometric pressure would be 28 through 32.5
inHg. Since the units are specified, these values apply no matter what
the <span class='code'>target_unit</span>.</p>
<p>Both LOOP and archive data will be checked. </p>
<p>Knowing the details of how your hardware encodes data helps to minimize
the number of observations that need to be checked. For example, the VP2
devotes only one unsigned byte to storing wind speed, and even then
<span class="code">0xff</span> is devoted to a bad value, so the only
possible values that could appear are 0 through 126 mph, a reasonable
range. So, for the VP2, there is no real point in checking wind speed.
</p>
<h2 class="config_section" id="StdWXCalculate">[StdWXCalculate]</h2>
<p>The calculation service calculates derived quantities such as
<span class='code'>dewpoint</span>, <span class='code'>windchill</span>,
and <span class='code'>heatindex</span>.</p>
<p>Some hardware provides derived quantities, others provide only raw
observations. The calculation service provides derived quantities for
hardware that does not provide them, and known algorithms for hardware
that provides unreliable or antiquated calculations.</p>
<p>The section <span class="code">[StdWXCalculate]</span> consists of
a group of general options, followed by a
subsection <span class="code">[[Calculations]]</span> that specifies the calculation
strategy to be used for each derived quantity.</p>
<p class="config_option">ignore_zero_wind</p>
<p>
Indicates whether the wind direction should be undefined when the wind
speed is zero. The default value is <span class="code">True</span>: the wind
direction will be undefined when wind speed is zero.
</p>
<p>
To report the wind vane direction even when there is no wind speed,
change this to False:
</p>
<pre class="tty">[StdWXCalculate]
...
ignore_zero_wind = False</pre>
<h3 class="config_section">[[Calculations]]</h3>
<p>This subsection specifies which strategy is to be used to provide values
for derived variables. The service can calculate the following values:</p>
<ul>
<li>pressure</li>
<li>barometer</li>
<li>altimeter</li>
<li>windchill</li>
<li>heatindex</li>
<li>dewpoint</li>
<li>inDewpoint</li>
<li>rainRate</li>
<li>maxSolarRad</li>
<li>cloudbase</li>
<li>humidex</li>
<li>appTemp</li>
<li>ET</li>
<li>windrun</li>
</ul>
<p>In its default configuration, the service calculates values only if
they have not already been provided by the hardware or driver. This is
the default configuration:</p>
<pre class="tty">[StdWXCalculate]
[[Calculations]]
pressure = prefer_hardware
barometer = prefer_hardware
altimeter = prefer_hardware
windchill = prefer_hardware
heatindex = prefer_hardware
dewpoint = prefer_hardware
inDewpoint = prefer_hardware
rainRate = prefer_hardware</pre>
<p>The options for each quantity are <span class='code'>hardware</span>,
<span class='code'>software</span>, or
<span class='code'>prefer_hardware</span></p>
<table class="indent">
<tr>
<td class="code">hardware</td>
<td>Never calculate the value.</td>
</tr>
<tr>
<td class="code">software</td>
<td>Always calculate the value.</td>
</tr>
<tr>
<td class="code">prefer_hardware</td>
<td>Calculate the value only if it is not provided by hardware.</td>
</tr>
</table>
<p>For example, if your weather station calculates windchill using the
pre-2001 algorithm, and you prefer to have
weeWX calculate it using a current algorithm,
specify the following:</p>
<pre class="tty">[StdWXCalculate]
...
[[Calculations]]
...
windchill = software</pre>
<h2 class="config_section" id="StdArchive">[StdArchive]</h2>
<p>This section is for configuring <span class="code">StdArchive</span>, the
service that stores data in a database.</p>
<p class="config_option">archive_interval</p>
<p>If your station hardware supports data logging then the archive interval
will be downloaded from the station. Otherwise, you must specify it here in
seconds. Optional. Default is 300 seconds.</p>
<p class="config_option">archive_delay </p>
<p>How long to wait in seconds after the top of an archiving interval before
fetching new data off the station. For example, if your archive interval is
5 minutes and archive_delay is set to 15, then the data will be fetched at 00:00:15,
00:05:15, 00:10:15, etc. This delay is to give the station a few seconds to
archive the data internally, and in case your server has any other tasks to
do at the top of the minute. Default is 15 seconds. </p>
<p class="config_option" id="record_generation">record_generation</p>
<p>Set to whether records should be downloaded off the hardware (recommended),
or generated in software. If set to <span class="code">hardware</span>, then
weeWX tries to download archive records from your
station. However, not all types of stations support this, in which case
weeWX falls back to software generation. A setting
of <span class="code">hardware</span> will work for most users. A notable
exception is <a href="http://www.wxforum.net/index.php?topic=10315.0">users
who have cobbled together homebrew serial interfaces</a> for the Vantage stations
that do not include memory for a logger. These users should set this option
to <span class="code">software</span>, forcing software record generation.
Default is <span class="code">hardware</span>.</p>
<p class="config_option" id="record_augmentation">record_augmentation</p>
<p>When performing hardware record generation, this option will attempt to augment the
record with any additional observation types that it can extract out of the LOOP
packets. Default is <span class="code">True</span>.</p>
<p class="config_option">loop_hilo</p>
<p>Set to <span class="code">True</span> to have LOOP data and archive
data to be used for high / low statistics. Set to <span class="code">False</span>
to have only archive data used. If your sensor emits lots of spiky data,
setting to <span class="code">False</span> may help. Default is
<span class="code">True</span>.</p>
<p class="config_option">data_binding</p>
<p>The data binding to be used to store the data. This should match one
of the bindings in the <span class="code">[DataBindings]</span> section, below. Optional. Default
is <span class="code">wx_binding</span>.</p>
<h2 class="config_section">[StdTimeSynch]</h2>
<p>This section is for configuring <span class="code">StdTymeSynch</span>, a
service that can synchronize the onboard clock of station with your computer.
Not all weather station hardware supports this.</p>
<p class="config_option">clock_check</p>
<p>How often to check the clock on the weather station in seconds. Default is
14,400 seconds (every 4 hours)</p>
<p class="config_option">max_drift</p>
<p>The maximum amount of clock drift to tolerate, in seconds, before resetting
the clock. Default is 5.</p>
<h2 class="config_section" id="DataBindings">[DataBindings]</h2>
<p>
A "data binding" associates storage characteristics with a specific
database. Each binding contains a database from the
<a href="#Databases"><span class='code'>[Databases]</span></a>
section plus parameters such as schema, table name, and mechanism
for aggregating data.
</p>
<h3 class="config_section" id="wx_binding">[[wx_binding]]</h3>
<p>
This is the binding normally used for weather data. A typical <span
class="code">[[wx_binding]]</span> section looks something like
this:
</p>
<pre class="tty">
[[wx_binding]]
database = archive_sqlite
table_name = archive
manager = weewx.wxmanager.WXDaySummaryManager
schema = schemas.wview.schema</pre>
<p>What follows is more detailed information about each of the
binding options.</p>
<p class="config_important">database</p>
<p>
The actual database to be used &mdash; it should match one of the
sections in <a href="#Databases"><span class="code">[Databases]</span></a>.
Should you decide to use a MySQL database, instead of the default
SQLite database, this is the place to change it. See the
section <a href="#configuring_mysql"><em>Configuring MySQL</em></a>
for details. Required.
</p>
<p class="config_option">table_name</p>
<p>
Internally, the archive data is stored in one, long, flat table.
This is the name of that table. Normally this does not need to be
changed. Optional. Default is <span class="code">archive</span>
</p>
<p class="config_option">manager</p>
<p>
The name of the class to be used to manage the table. Optional.
Default is class <span class="code">weewx.wxmanager.WXDaySummaryManager</span>.
This class stores daily summaries in the database, and a
few types, such as heating- and cooling-degree days, appropriate
for weather. Normally, this does not need to be changed.
</p>
<p class="config_option">schema</p>
<p>
A Python list holding the structure of the schema to be used to
initialize the database. After initialization, it is not used.
Optional. Default is <span class="code">schemas.wview.schema</span>,
the schema used by the <a href="http://www.wviewweather.com">wview</a>
weather system.
</p>
<h2 class="config_section" id="Databases">[Databases]</h2>
<p>This section lists actual databases. The name of each database is
given in double brackets, for example,
<span class="code">[[archive_sqlite]]</span>. Each database section
contains the parameters necessary to create and manage the database.
The number of parameters varies depending on the type of database.</p>
<h3 class="config_section">[[archive_sqlite]]</h3>
<p>This definition uses the <a href="http://sqlite.org/">SQLite</a> database
engine to store data. SQLite is open-source, simple, lightweight, highly
portable, and memory efficient. For most purposes it serves nicely.</p>
<p class="config_option">database_type</p>
<p>Set to <span class="code">SQLite</span> to signal that this is a
SQLite database.</p>
<p class="config_option">database_name</p>
<p>The path to the SQLite file relative to the <span class="code">SQLITE_ROOT</span>
option. Default is <span class="code">weewx.sdb</span>.</p>
<h3 class="config_section">[[archive_mysql]]</h3>
<p>This definition uses the MySQL database engine to store data.
It is free, highly-scalable, but more complicated to administer. </p>
<p class="config_option">database_type</p>
<p>Set to <span class="code">MySQL</span> to signal that this is a
MySQL database.</p>
<p class="config_option">database_name</p>
<p>The name of the database. Default is <span class="weewx">weewx</span>.
Required.</p>
<h2 class="config_section">[DatabaseTypes]</h2>
<p>This section defines defaults for the various kinds of databases.</p>
<h3 class="config_section">[[SQLite]]</h3>
<p>This section defines default values for SQLite databases. They
can be overridden by individual databases.</p>
<p class="config_option">driver</p>
<p>The sqlite driver name. Required.</p>
<p class="config_option">SQLITE_ROOT</p>
<p>
The location of the directory holding the SQLite databases. For <span
class="code">setup.py</span> installations, the default is the <span
class="symcode">WEEWX_ROOT</span><span class="code">/archive</span>
directory. For DEB or RPM installations, it is <span class="code">/var/lib/weewx</span>.
</p>
<p class="config_option" id='archive_timeout'>timeout</p>
<p>
When the database is accessed by multiple threads and one of those
threads modifies the database, the SQLite database is locked until
that transaction is completed. The <span class='code'>timeout</span>
option specifies how long other threads should wait for the lock to
go away before raising an exception. The default is 5 seconds.
</p>
<p class='config_option'>isolation_level</p>
<p>
Set the current isolation level. See the pysqlite documentation on <a
href="http://docs.python.org/2.7/library/sqlite3.html#sqlite3.Connection.isolation_level">
isolation levels</a> for more information. There is no reason to change
this, but it is here for completeness. Default is <span class='code'>None</span>
(autocommit).
</p>
<h3 class="config_section">[[MySQL]]</h3>
<p>This section defines default values for MySQL databases. They
can be overridden by individual databases.</p>
<p>
Note that if you choose the <a href="http://www.mysql.com/">MySQL</a>
database, it is assumed that you know how to administer it. In
particular, you will have to set up a user with appropriate create
and modify privileges.
</p>
<p class="config_option">driver</p>
<p>The MySQL driver name. Required.</p>
<p class="config_important">host</p>
<p>
The name of the server on which the database is located. Default is <span
class="code">localhost</span>.
</p>
<p class="config_important">user</p>
<p>The user name to be used to log into the server. Required.</p>
<p class="config_important">password</p>
<p>The password. Required.</p>
<p class="config_option">port</p>
<p>The port number to be used. Optional. Default is 3306.</p>
<p class="config_option">engine</p>
<p>The type of MySQL database storage engine to be used. This should not
be changed without a good reason. Default is <span class="code">INNODB</span>.
</p>
<h2 class="config_section">[Engine]</h2>
<p>
This section is used to configure the internal service engine in
weeWX. It is for advanced customization. Details
on how to do this can be found in the section
<em> <a href="customizing.htm#service_engine">Customizing the weeWX
service engine</a></em> of the
<a href="customizing.htm">Customization Guide</a>.
</p>
<h3 class="config_section">[[Services]]</h3>
<p>
Internally, weeWX consists of many <em>services</em>,
each responsible for some aspect of the program's functionality.
After an event happens, such as
the arrival of a new LOOP packet, any interested service gets a
chance to do some useful work on the event. For example, a service
might manipulate the packet, print it out, store it in a database,
etc. This section controls which services are loaded and in what
order they get their opportunity to do that work. Before weeWX
v2.6, this section held one, looong
option called <span class="code">service_list</span>, which held
the names of all the services that should be run. Since then, this
list has been broken down into five, smaller, lists, given below.
They are run in the order given below.
</p>
<p class="config_option" id="prep_services">prep_services</p>
<p>
These services get called before any others. They are typically
used to prepare the console. For example, the service <span
class="code">weewx.wxengine.StdTimeSynch</span>, which is
responsible for making sure the console's clock is up to date, is
a member of this group.
</p>
<p class="config_option" id="process_services">process_services</p>
<p>Services in this group tend to process any incoming data.
They typically do things like quality control, or unit conversion,
or sensor calibration.</p>
<p class="config_option" id="archive_services">archive_services</p>
<p>Once data have been processed, services in this group archive
them.</p>
<p class="config_option" id="restful_services">restful_services</p>
<p>RESTful services, such as the Weather Underground, or CWOP,
are in this group. They need processed data that have been
archived, hence they are run after the preceeding groups.</p>
<p class="config_option" id="report_services">report_services</p>
<p>The various reporting services run in this group, including
the standard reporting engine.</p>
<p>For reference, here is the standard set of services that are
run with the default distribution.</p>
<pre class="tty">
prep_services = weewx.engine.StdTimeSynch
process_services = weewx.engine.StdConvert, weewx.engine.StdCalibrate,\
weewx.engine.StdQC, weewx.wxservices.StdWXCalculate
archive_services = weewx.engine.StdArchive
restful_services = weewx.restx.StdStationRegistry, weewx.restx.StdWunderground,\
weewx.restx.StdPWSweather, weewx.restx.StdCWOP, weewx.restx.StdWOW,\
weewx.restx.StdAWEKAS
report_services = weewx.engine.StdPrint, weewx.engine.StdReport
</pre>
<p>If you're the type who likes to clean out your car trunk after every
use it, then you may also be the type who wants to pare this down
to the bare minimum. However, this will only make a slight
difference in execution speed and memory use.</p>
<h1 id="troubleshooting">Troubleshooting</h1>
<p>This section lists some common problems installing and running
weeWX. If you are stuck, be sure to: </p>
<ul>
<li style="margin-bottom: 1em">Set the option <span
class="code">debug</span> to <span class="code">1</span> in <span
class='code'>weewx.conf</span>. This will put much more
information in the log file, which can be very useful for
troubleshooting and debugging!
<p class='tty'>debug = 1</p>
</li>
<li style="margin-bottom: 1em">Look at the <a href="#monitoring">log file</a>. We are
always happy to take questions, but the first thing someone will ask
is, &quot;Did you look at the log file?&quot;
<p class='tty cmd'>sudo tail -f /var/log/syslog</p>
</li>
<li style="margin-bottom: 1em">Run <span class="code">weewxd</span>
directly from the command line, rather than as a
daemon. Generally, weeWX will catch
and log any unrecoverable exceptions. But if you are getting
strange results, it is worth running directly and looking for
any clues.
<p class='tty cmd'>sudo weewxd weewx.conf</p>
</li>
</ul>
<p>If you are still stuck, post your problem to the
<a href="https://groups.google.com/forum/#!forum/weewx-user">weewx-user group</a>. The Wiki
has some guidelines on <a href="https://github.com/weewx/weewx/wiki/Help!-Posting-to-weewx-user">
how to do an effective post</a>.</p>
<h2>Hardware problems</h2>
<h3>Tips on making a system reliable</h3>
<p>If you are having problems keeping your weather station up for long
periods of time, here are some tips, in decreasing order of importance:
</p>
<div class='image image-right' style='width:205px'>
<a href="images/ferrites.jpg"><img src="images/ferrites.jpg" width='200' border='1' alt="Ferrite coils"
longdesc="Cable connection looped through a ferrite coil"/></a>
<div class='image_caption'>Ferrite coils on a Davis Envoy. There are two
coils, one on the USB connection (top wire) and one on the power
supply. Both have loops. Click for larger picture.
</div>
</div>
<ul>
<li>Run on dedicated hardware. If you are using the server for other
tasks, particularly as your desktop machine, you will have reliability
problems. If you are using it as a print or network server, you will
probably be OK.
</li>
<li>Run headless. Modern graphical systems are extremely complex. As new
features are added, test suites do not always catch up. Your system
will be much more reliable if you run it without a windowing system (X
Windows, in the case of Linux).
</li>
<li>Use an Uninterruptible Power Supply (UPS). The vast majority of power
glitches are very short lived &mdash; just a second or two &mdash; so
you do not need a big one. The 425VA unit I use to protect my fit-PC
cost $55 at Best Buy.
</li>
<li>If you buy a Davis VantagePro and your computer has an old-fashioned
serial port, get the VantagePro with a serial connection, not a USB
connection. See the section on <a href="#davis_cp2101_converter">Davis
cp2101 converter problems</a> for details.
</li>
<li>If you do use a USB connection, put a ferrite coil on each end of
the cable to your console. If you have enough length and the ferrite
coil is big enough, make a loop so it goes through the coil twice.
See the figure at right.
</li>
</ul>
<h3>Establishing connectivity</h3>
<p>If you are unable to get anything out of weeWX
first check that you have connectivity to your weather station. For the
Davis stations, you can use a terminal emulator to run a simple test.
Set it up to communicate using the appropriate port and baudrate. I
like <span class="code">minicom</span> because it can be run from
through a simple TTY connection. The utility
<span class="code">screen</span> also works well. For example:</p>
<pre class="tty cmd">minicom -b 19200 -D /dev/ttyUSB0</pre>
<p>or, using <span class='code'>screen</span>:</p>
<pre class="tty cmd">screen /dev/ttyUSB0 19200</pre>
<p>Then type in <span class="code">TEST</span>, all in capital letters. It
will not echo the characters. Then hit the
<span class="code">&lt;enter&gt;</span>
key. It should echo back <span class="code">TEST</span>.</p>
<p>If this works, then you have established connectivity with the Davis
and the problem must lie elsewhere.</p>
<h3 id="davis_cp2101_converter">Davis cp2101 converter problems</h3>
<p>The USB converter used in the Davis VantagePro is known to have some &quot;noise&quot;
problems. The symptom is that the Linux kernel will disconnect from your old
USB port claiming &quot;EMI noise&quot;, and reconnect to a new and different
port, where weeWX cannot find it. Here is a
typical log output: </p>
<pre class='tty'>Nov 29 10:40:21 hummingbird kernel: [6661624.786792] hub 2-0:1.0: port 3 disabled by hub (EMI?) re-enabling...
Nov 29 10:40:21 hummingbird kernel: [6661624.786871] usb 2-3: USB disconnect, address 2
Nov 29 10:40:21 hummingbird kernel: [6661624.795778] cp2101 2-3:1.0: device disconnected
Nov 29 10:40:21 hummingbird weewx[25808]: VantagePro: Max retries exceeded while getting LOOP packets
... (messages elided)
Nov 29 10:40:22 hummingbird kernel: [6661625.352340] cp2101 2-3:1.0: cp2101 converter detected
Nov 29 10:40:22 hummingbird kernel: [6661625.528107] usb 2-3: reset full speed USB device using ohci_hcd and address 3
Nov 29 10:40:22 hummingbird kernel: [6661625.735497] usb 2-3: cp2101 converter now attached to ttyUSB1</pre>
<p>In this example, the VantagePro was connected to <span class="code">/dev/ttyUSB0</span>,
but then reconnected to <span class="code">/dev/ttyUSB1</span>. </p>
<p>If you put ferrite coils on the USB connection, you will eliminate 90% of
this problem. I did this about 3 years ago, and have not had a problem since.
</p>
<p>However, there is one final step that you can take to really harden up
your system: install a <span class="code">udev</span> script that will create
a symbolic link to the VantagePro USB port, whatever it might be. With this
approach, if the port jumps from <span class="code">ttyUSB0</span> to
<span class="code">ttyUSB1</span>, the symbolic link will follow it. You just
specify port <span class="code">/dev/vpro</span> in the configuration file
<span class="code">weewx.conf</span> and be done with it. </p>
<h3 id='udev_script'>Installing a udev script</h3>
<p>Use a udev rule to ensure that a USB device always appears at the same
location such as <span class='code'>/dev/vpro</span> instead of
<span class='code'>/dev/ttyUSB2</span></p>
<p>For example, for my VantagePro2 weather station, I have installed a file
<span class="code">/etc/udev/rules.d/vpro.rules</span>
on my fit-PC that looks like this: </p>
<pre class='tty'># Automount the VantagePro2 to port /dev/vpro.
# Install in /etc/udev/rules.d/vpro.rules
#
ACTION==&quot;add&quot;, ATTRS{interface}==&quot;CP2102 USB to UART Bridge Controller&quot;, SYMLINK+=&quot;vpro&quot;</pre>
<p>This rule says that when the USB port is plugged in (action
<span class="code">add</span>), and it has an attribute with name
<span class="code">interface</span> that is equal to
<span class="code">CP2102 to UART Bridge Controller</span>,
then add a symbolic link for its physical port to
<span class="code">/dev/vpro</span>. </p>
<p>Here is a rule that works for my Serial-to-USB cable, made by "Y.C. Cable USA". It
not only adds a symbolic link <span class="code">vpro</span>, but also sets the
<span class="code">chmod</span>
permissions to <span class="code">666</span>, allowing any user to read or write to it.</p>
<pre class='tty'># Automount Serial-to-USB cable to port /dev/vpro
# Install in /etc/udev/rules.d/cable.rules
#
ACTION=="add",ATTRS{idVendor}=="05ad",ATTRS{idProduct}=="0fba",MODE="0666",SYMLINK+="vpro"</pre>
<p>Your devices may, and probably will, have different identifiers!! I can recommend
this article, &quot;<a href="http://www.reactivated.net/writing_udev_rules.html"><em>Writing
udev rules</em></a>,&quot; for how to find and write an appropriate
<span class="code">udev</span> rule for your controller. (Note, however, that
this article uses the old <span class="code">udevinfo</span> command, rather
than the newer <span class="code">udevadm</span> command.) In particular, run
the command </p>
<p class='tty cmd'>udevadm info --attribute-walk --path $(udevadm info --query=path --name=/dev/ttyUSB0) </p>
<p>where <span class="code">/dev/ttyUSB0</span> is the port (substitute
your real USB port) the weather station is attached to. It will print
out various identifiers that can be useful in identifying your weather
station to <span class="code">udev</span>.
While the first example script above used a rule that matched attribute
<span class="code">interface</span>, others are possible. For example,
the second example, for the serial-to-USB cable, chose to match the
attribute <span class="code">product</span>. </p>
<p>Once you have installed your <span class="code">udev</span> rule, you
can then set <span class="code">port=/dev/vpro</span> in
<span class="code">weewx.conf</span>, confident that it will always point
to your weather station, no matter which USB port it is actually
attached to! </p>
<p>I have tested this system many times. You can yank the USB port out of the
machine and then plug it back in while also pulling out the network connection
in the middle of an FTP upload: weeWX will recover.
</p>
<p>Or, at least, it should! </p>
<h3 id="html_generated_but_not_updated">WeeWX generates HTML pages, but it does not
update them</h3>
<p>If you are getting a symptom that everything appears normal, that is
image and HTML files are generated (<em>look in the log to be sure</em>)
and sent to your webserver (if you have configured FTP or rsync), but
the values in the web pages are not being updated, it could be due to
clock skew or corrupt station memory.</p>
<h4>Clock skew</h4>
<p>If the database contains a record with time stamp (the dateTime field)
in the future, then records from the station that are older than that
future date will be ignored. How can the database contain records from
the future? Sometimes the computer clock is not set correctly. For
example, the raspberry pi has no clock, so if weeWX saves data before
the pi has synchronized its clock with internet time servers, the
records will have incorrect time stamps, some of which might be in the
future.</p>
<p>The solution is to delete any records with time stamp in the future.
For a sqlite database, the procedure looks like this:</p>
<pre class="tty"><span class="cmd">cp /home/weewx/archive/weewx.sdb /home/weewx/archive/weewx.sdb.backup
sqlite3 /home/weewx/archive/weewx.sdb</span>
sqlite> <span class="cmd">delete from archive where dateTime > X;</span>
sqlite> <span class="cmd">.exit</span></pre>
<p>The timestamp X is the current time in unix epoch time (number of seconds
since 1 January 1970). <a href="https://www.epochconverter.com/">This website</a>
is useful for determining the current unix epoch time.</p>
<h4>Corrupt station memory</h4>
<p>If you have a Vantage station, the problem might be because the data on
board your console has become garbled. The way the Davis Vantage series
works is that the software (weeWX in this case)
asks the console for all archive data &quot;since&quot; some time. The
console then downloads the records one at a time. After it gets to the
very last one, the memory wraps around, and the timestamp will suddenly
jump backwards in time a couple weeks &mdash; this is how the software
knows it has downloaded the last record and so it stops.</p>
<p>However, if the internal memory gets garbled, the console will immediately
return archives in the past, and so it looks like the timestamps have decreased
in value and so weeWX figures that is it: there is
no more data. Here is what the log typically looks like (with <span class="code">debug=1</span>):</p>
<pre class="tty">Nov 26 14:20:15 raspberrypi weewx[3849]: vantage: Getting archive packets since 2016-11-25 19:55:00 CET (1480100100)
Nov 26 14:20:15 raspberrypi weewx[3849]: vantage: gentle wake up of console successful
Nov 26 14:20:15 raspberrypi weewx[3849]: vantage: Retrieving 45 page(s); starting index= 1
Nov 26 14:20:15 raspberrypi weewx[3849]: vantage: DMPAFT complete: page timestamp 2016-11-02 19:25:00 CET (1478111100) less than final timestamp 2016-11-25 19:55:00 CET (1480100100)
Nov 26 14:20:15 raspberrypi weewx[3849]: vantage: Catch up complete.
Nov 26 14:20:15 raspberrypi weewx[3849]: reportengine: Running reports for latest time in the database.
Nov 26 14:20:15 raspberrypi weewx[3849]: reportengine: Running report StandardReport
Nov 26 14:20:15 raspberrypi weewx[3849]: vantage: Requesting 200 LOOP packets.
Nov 26 14:20:15 raspberrypi weewx[3849]: reportengine: Found configuration file /etc/weewx/skins/Standard/skin.conf for report StandardReport
Nov 26 14:20:15 raspberrypi weewx[3849]: cheetahgenerator: using search list ['weewx.cheetahgenerator.Almanac', 'weewx.cheetahgenerator.Station', 'weewx.cheetahgenerator.Stats', 'weewx.cheetahgenerator.UnitInfo', 'weewx.cheetahgenerator.Extras']
Nov 26 14:20:15 raspberrypi weewx[3849]: vantage: gentle wake up of console successful
Nov 26 14:20:19 raspberrypi weewx[3849]: cheetahgenerator: Generated 14 files for report StandardReport in 4.16 seconds
Nov 26 14:20:20 raspberrypi weewx[3849]: genimages: Generated 12 images for StandardReport in 0.62 seconds
Nov 26 14:20:20 raspberrypi weewx[3849]: reportengine: copied 9 files to /var/www/html/weewx
Nov 26 14:20:20 raspberrypi weewx[3849]: reportengine: Running report FTP
Nov 26 14:20:20 raspberrypi weewx[3849]: reportengine: Found configuration file /etc/weewx/skins/Ftp/skin.conf for report FTP
</pre>
<p>Note how weeWX did a <span class="code">DMPAFT</span> command
("<span class="code">Getting archive packets since 2016-11-25 19:55:00</span>"). The console responded
that it has lots of records after that time ("<span class="code">Retrieving 45 page(s);
starting index= 1</span>"),
but when weeWX actually tries to retrieve them, they are all before the requested time.
</p>
<p>There seems to be two fixes:</p>
<ol>
<li>Unplug the console, take out the batteries, and wait a minute or two.
This will cause the console software to internally reboot. In one case this
has fixed the problem without data loss.
</li>
<li>If all else fails, clear the memory of the console
<a href="hardware.htm#vantage_clear_console_memory">using the utility
<span class="code">wee_device</span></a>. This may cause loss of data, but
usually works. Adjust paths as necessary:
</li>
</ol>
<pre class="tty cmd">wee_device --clear-memory</pre>
<p>See also the section <em><a href="hardware.htm#vantage_dumping_the_logger_memory">Dumping
the logger memory</a></em>, which may help you avoid data loss.</p>
<h3>3rd party Vantage connectors</h3>
<p>This section is for those who are using a homebrew or 3rd party connector
to a Davis Vantage console that does not contain a logger, such as the
<a href="http://www.wxforum.net/index.php?topic=14063.0">DSI-01 serial interface</a>.
That is, it is a pure serial connection to the console, with no onboard memory.
</p>
<p>For these interfaces, you must set record generation to <em>software</em>.
Without this information, weeWX is unable to detect
the absence of onboard memory. If you do not do this, you will get errors that
look like the following in your syslog:</p>
<pre class="tty">Nov 27 20:30:21 rpi weewx[5607]: reportengine: Caught unrecoverable exception in generator weewx.filegenerator.FileGenerator
Nov 27 20:30:21 rpi weewx[5607]: **** 'NoneType' object has no attribute '__getitem__'
Nov 27 20:30:21 rpi weewx[5607]: **** Traceback (most recent call last):
Nov 27 20:30:21 rpi weewx[5607]: **** File "/home/weewx/bin/weewx/reportengine.py", line 132, in run
Nov 27 20:30:21 rpi weewx[5607]: **** obj.start()
Nov 27 20:30:21 rpi weewx[5607]: **** File "/home/weewx/bin/weewx/reportengine.py", line 259, in start
Nov 27 20:30:21 rpi weewx[5607]: **** self.run()
Nov 27 20:30:21 rpi weewx[5607]: **** File "/home/weewx/bin/weewx/filegenerator.py", line 41, in run
Nov 27 20:30:21 rpi weewx[5607]: **** self.setup()
Nov 27 20:30:21 rpi weewx[5607]: **** File "/home/weewx/bin/weewx/filegenerator.py", line 52, in setup
Nov 27 20:30:21 rpi weewx[5607]: **** self.initAlmanac(self.gen_ts)
Nov 27 20:30:21 rpi weewx[5607]: **** File "/home/weewx/bin/weewx/filegenerator.py", line 87, in initAlmanac
Nov 27 20:30:21 rpi weewx[5607]: **** rec = self.getRecord(archivedb, celestial_ts)
Nov 27 20:30:21 rpi weewx[5607]: **** File "/home/weewx/bin/weewx/filegenerator.py", line 115, in getRecord
Nov 27 20:30:21 rpi weewx[5607]: **** record_dict_vt = weewx.units.dictFromStd(record_dict)
Nov 27 20:30:21 rpi weewx[5607]: **** File "/home/weewx/bin/weewx/units.py", line 892, in dictFromStd
Nov 27 20:30:21 rpi weewx[5607]: **** std_unit_system = d['usUnits']
Nov 27 20:30:21 rpi weewx[5607]: **** TypeError: 'NoneType' object has no attribute '__getitem__'
Nov 27 20:30:21 rpi weewx[5607]: **** Generator terminated...
Nov 27 20:30:23 rpi weewx[5607]: genimages: Generated 11 images in 2.53 seconds</pre>
<p>See the section on option <span class="code">
<a href="#record_generation">record_generation</a></span>.</p>
<h3>Raspberry Pi</h3>
<p>WeeWX runs very well on the Raspberry Pi,
from the original Model A and Model B, to the latest incarnations.
However, the Pi does have some quirks, including issues with USB
power and lack of a clock.</p>
<p>
See the <a href="https://github.com/weewx/weewx/wiki">Wiki</a>
for up-to-date information on
<a href="https://github.com/weewx/weewx/wiki/Raspberry%20Pi">
<em>Running weeWX on a Raspberry Pi</em></a>.
</p>
<h3>Fine Offset USB lockups</h3>
<p>The Fine Offset series
weather stations and their derivatives are a fine value and
can be made to work reasonably reliably, but they have one
problem that is difficult to work around: the USB can
unexpectantly lock up, making it impossible to communicate
with the console. The symptom in the log will look something
like this:</p>
<pre class="tty">Jun 7 21:50:33 localhost weewx[2460]: fousb: get archive interval failed attempt 1 of 3: could not detach kernel driver from interface 0: No data available</pre>
<p>The exact error may vary, but the thing to look for is the
"<span class='code'>could not detach kernel driver</span>"
message. Unfortunately, we have not found a software cure for
this. Instead, you must power cycle the unit. Remove the
batteries and unplug the USB, then put it back together. No
need to restart weeWX.</p>
<p>More details about <a href="https://github.com/weewx/weewx/wiki/FineOffset%20USB%20lockup"><em>Fine Offset lockups</em></a>
can be found in the
<a href="https://github.com/weewx/weewx/wiki">Wiki</a>.</p>
<h3 id='archive_interval'>Archive interval</h3>
<p>Most hardware with data-logging includes a parameter to specify
the archive interval used by the logger. If the hardware and driver
support it, weeWX will use this interval
as the <span class='code'><em>archive_interval</em></span>. If not,
weeWX will fall back to the
<span class='code'>archive_interval</span> specified in
<a href='#StdArchive'><span class='code'>[StdArchive]</span></a>.
The default fallback value is 300 seconds (5 minutes).
</p>
<p>If the hardware archive interval is large, it will take a
long time before anything shows up in the
weeWX reports. For example, WS23xx stations
ship with an archive interval of 60 minutes, and Fine Offset stations
ship with an archive interval of 30 minutes.
If you run weeWX with a WS23xx station in
its factory default configuration, it will take 60 minutes before the
first data point shows up, then another 60 minutes until the next one,
and so on.
</p>
<p>
Since reports are generated when a new archive record arrives,
a large archive interval means that reports will be generated
infrequently.
</p>
<p>If you want data and reports closer to real-time, use the
<a href="utilities.htm#wee_device_utility"><span class="code">wee_device</span></a>
utility to change the interval.
</p>
<h2>Software problems</h2>
<p>This section covers some common software configuration problems.</p>
<h3>Nothing in the log file</h3>
<p>As it is running, weeWX periodically sends
status information, failures, and other things to your system's logging
facility. They typically look something like this:</p>
<pre class='tty'>-DATE- --TIME-- HOST weewx[-PID-]: LOG_MESSAGE
Jan 1 09:46:32 saga weewx[15292]: wxengine: Initializing weewx version 2.5.1
Jan 1 09:46:32 saga weewx[15292]: wxengine: Using Python 2.6.6 (r266:84292, Dec 27 2010, 21:57:32) #012[GCC 4.4.5 20100902 (prerelease)]
Jan 1 09:46:32 saga weewx[15292]: wxengine: pid file is /var/run/weewx.pid</pre>
<p>The location of this logging file varies from system to system,
but it is typically
in <span class="code">/var/log/syslog</span>, or something
similar.</p>
<p>However, some systems default to saving only warning or
critical information, so the <span class="code">info</span>
messages from weeWX may not appear.
If this happens to you, check your system logging configuration.
On Debian systems, look
in <span class="code">/etc/rsyslog.conf</span>. On Redhat
systems, look in <span class="code">/etc/syslog.conf</span>.</p>
<h3><span class="code">configobj</span> errors</h3>
<p>These are errors in the configuration file. Two are very common.
Incidentally, these errors are far easier to diagnose when
weeWX is run directly than when it is run
as a daemon. </p>
<h4><span class="code">configobj.DuplicateError</span> exception</h4>
<p>This error is caused by using an identifier more than once in the
configuration file. For example, you may have inadvertently listed
your FTP server twice:
</p>
<pre class='tty'>[Reports]
[[FTP]]
... (details elided)
user = fred
server = ftp.myhost.com
password = mypassword
server = ftp.myhost.com # OOPS! Listed it twice!
path = /weather
... </pre>
<p>Generally, if you encounter this error, the log file will give you the
line number it happened in: </p>
<pre class='tty'>Apr 24 12:09:15 raven weewx[11480]: wxengine: Error while parsing configuration file /home/weewx/weewx.conf
Apr 24 12:09:15 raven weewx[11480]: wxengine: Unable to initialize main loop:
Apr 24 12:09:15 raven weewx[11480]: **** Duplicate keyword name at line 254.
Apr 24 12:09:15 raven weewx[11480]: **** Exiting. </pre>
<h4><span class="code">configobj.NestingError</span> exception</h4>
<p>This is a very similar error, and is caused by a misformed section nesting.
For example: </p>
<p class='tty'>[Reports]
[[FTP]]]
... (details elided)</p>
<p>Note the extra closing bracket on the subsection <span class="code">FTP</span>.
</p>
<h3>No barometer data</h3>
<p>If everything appears normal except that you have no barometer data, the
problem may be a mismatch between the unit system used for service
<span class="code">StdConvert</span> and the unit system used by service
<span class="code">StdQC</span>. For example:</p>
<pre class="tty">[StdConvert]
target_unit = METRIC
...
[StdQC]
[[MinMax]]
barometer = 28, 32.5</pre>
<p>The problem is that you are requiring the barometer data to be between
28 and 32.5, but with the unit system set to
<span class="code">METRIC</span>, the data will be in the range 990 to
1050 or so!</p>
<p>The solution is to change the values to match the units in StdConvert,
or specify the units in MinMax, regardless of the units in StdConvert.
For example:</p>
<pre class="tty">[StdConvert]
target_unit = US
...
[StdQC]
[[MinMax]]
barometer = 950, 1100, mbar</pre>
<h3><span class="code">Cheetah.NameMapper.NotFound</span> errors</h3>
<p>If you get errors of the sort: </p>
<pre class='tty'>Apr 12 05:12:32 raven reportengine[3074]: filegenerator: Caught exception &quot;&lt;class &#39;NameMapper.NotFound&#39;&gt;&quot;
Apr 12 05:12:32 raven reportengine[3074]: **** Message: &quot;cannot find &#39;fubar&#39; in template /home/weewx/skins/Standard/index.html.tmpl&quot;
Apr 12 05:12:32 raven reportengine[3074]: **** Ignoring template and continuing.</pre>
<p>you have a tag in your template that weeWX
does not recognize. In this example, it is the tag
<span class="code">$fubar</span> in the template
<span class="code">/home/weewx/skins/Standard/index.html.tmpl</span>.
</p>
<h3 id="many_loop_read_errors">Many LOOP read errors with Davis Vantage</h3>
<p>The symptom is many LOOP errors and unreliable downloading of archive records.
Your log may look like this:</p>
<pre class="tty">
Jan 18 20:38:52 rpi weewx[6024]: VantagePro: Opened up serial port /dev/ttyUSB0, baudrate 19200
Jan 18 20:38:53 rpi weewx[5977]: VantagePro: LOOP #12; read error. Try #1
Jan 18 20:38:53 rpi weewx[5977]: **** Expected to read 99 chars; got 0 instead
Jan 18 20:38:58 rpi weewx[7543]: VantagePro: LOOP #13; read error. Try #1
Jan 18 20:38:58 rpi weewx[7543]: **** Expected to read 99 chars; got 4 instead
Jan 18 20:39:03 rpi weewx[7543]: VantagePro: LOOP #14; read error. Try #2
Jan 18 20:39:03 rpi weewx[7543]: **** Expected to read 99 chars; got 0 instead
Jan 18 20:39:03 rpi weewx[5977]: VantagePro: LOOP #13; read error. Try #2
Jan 18 20:39:03 rpi weewx[5977]: **** Expected to read 99 chars; got 4 instead
Jan 18 20:39:08 rpi weewx[7543]: VantagePro: LOOP #15; read error. Try #3
Jan 18 20:39:08 rpi weewx[7543]: **** Expected to read 99 chars; got 4 instead
Jan 18 20:39:09 rpi weewx[5977]: VantagePro: LOOP #14; read error. Try #3
Jan 18 20:39:09 rpi weewx[5977]: **** Expected to read 99 chars; got 2 instead
Jan 18 20:39:14 rpi weewx[5977]: VantagePro: LOOP #15; read error. Try #4
Jan 18 20:39:14 rpi weewx[5977]: **** Expected to read 99 chars; got 2 instead</pre>
<p>If you look closely at the log above, you'll see that there are
multiple instances of weeWX running
simultaneously (process IDs 5977, 6024, and 7543). They are
contending with each other for control of the console, resulting
in missed packets and records.
</p>
<p>The cure is simple: kill all but one of them. Or, better yet,
kill them all, then start weeWX.</p>
<h3 id='dots_in_plots'>Dots in the plots</h3>
<p>If you see dots instead of lines in the daily plots, you might want to
change the graphing options or adjust the station's archive interval.</p>
<p>In a default configuration, a time period greater than 1% of the
displayed timespan is considered to be a gap in data. So when the
interval between data points is greater than about 10 minutes, the
daily plots show dots instead of connected points. </p>
<p>Change the <a href="customizing.htm#line_gap_fraction"><span class='code'>line_gap_fraction</span></a>
option in <span class="code">skin.conf</span>
to control how much time is considered a break in data.</p>
<p>As for the archive interval, check the log file for an entry like this
soon after weeWX starts up:</p>
<pre class='tty'>Dec 30 10:54:17 saga weewx[10035]: wxengine: The archive interval in the configuration file (300) does not match the station hardware interval (1800).
Dec 30 10:54:17 saga weewx[10035]: wxengine: Using archive interval of 1800</pre>
<p>In this example, interval in <span class="code">weewx.conf</span> is 5
minutes, but the station interval is 30 minutes. When the interval
in <span class="code">weewx.conf</span> does not match the station's
hardware interval, weeWX defers to the
station's interval.</p>
<p>Use the <a href="utilities.htm#wee_device_utility"><span class="code">wee_device</span></a> utility to change
the
station's interval.</p>
<h3 id='spikes'>Spikes in the graphs</h3>
<p>Occasionally you may see anomalous readings, typically manifested as
spikes in the graphs. The source could be a flaky serial/USB connection,
radio or other interference, a cheap USB-Serial adapter, low-quality
sensors, or simply an anomalous reading.</p>
<p>Sensor quality matters. It is not unusual for some low-end hardware
to report odd sensor readings occasionally (once every few days). Some
sensors, such as solar radiation/UV, have a limited lifespan of about
5 years. The (analog) humidity sensors on older Vantage stations are
known to deteriorate after a few years in wet environments.</p>
<p>If you frequently see anomalous data, first check the hardware.</p>
<p>To keep bad data from the database, add a quality control (QC) rule
such as Min/Max bounds. See the <a href="#StdQC">QC</a> section for
details.</p>
<p>To remove bad data from the database, you will have to do some basic
SQL commands. For example, let's say the station emitted some very
high temperatures and wind speeds for one or two readings. This is
how to remove them:</p>
<ol>
<li>stop weeWX</li>
<li>Make a copy of the archive database
<pre class='tty cmd'>cp weewx.sdb weewx-YYMMDD.sdb</pre>
</li>
<li>Verify the bad data exist where you think they exist
<pre class='tty'><span class="cmd">sqlite3 weewx.sdb</span>
sqlite&gt; <span class="cmd">select dateTime,outTemp from archive where outTemp &gt; 1000;</span></pre>
</li>
<li>See whether the bad temperature and wind data happened at the same time
<pre class='tty'>sqlite&gt; <span class="cmd">select dateTime,outTemp,windSpeed from archive where outTemp &gt; 1000;</span></pre>
</li>
<li>Remove the bad data by setting to NULL
<pre class='tty'>sqlite&gt; <span class="cmd">update archive set windSpeed=NULL where outTemp &gt; 1000;</span>
sqlite&gt; <span class="cmd">update archive set outTemp=NULL where outTemp &gt; 1000;</span></pre>
</li>
<li>Delete the aggregate statistics so that weeWX can regenerate them without the
anomalies
<pre class='tty cmd'>sudo wee_database --drop-daily</pre>
</li>
<li>start weeWX</li>
</ol>
<h3>'Database is locked' error</h3>
<p>This seems to be a problem with the Raspberry Pi, <strong>when using SQLite</strong>.
There is no analogous problem with MySQL databases. You will see errors in the system log that
looks like this:</p>
<pre class='tty'>
Feb 12 07:11:06 rpi weewx[20930]: **** File "/usr/share/weewx/weewx/archive.py", line 118, in lastGoodStamp
Feb 12 07:11:06 rpi weewx[20930]: **** _row = self.getSql("SELECT MAX(dateTime) FROM %s" % self.table)
Feb 12 07:11:06 rpi weewx[20930]: **** File "/usr/share/weewx/weewx/archive.py", line 250, in getSql
Feb 12 07:11:06 rpi weewx[20930]: **** File "/usr/share/weewx/weedb/sqlite.py", line 120, in execute
Feb 12 07:11:06 rpi weewx[20930]: **** raise weedb.OperationalError(e)
Feb 12 07:11:06 rpi weewx[20930]: **** OperationalError: database is locked
Feb 12 07:11:06 rpi weewx[20930]: **** _cursor.execute(sql, sqlargs)
Feb 12 07:11:06 rpi weewx[20930]: **** File "/usr/share/weewx/weedb/sqlite.py", line 120, in execute
Feb 12 07:11:06 rpi weewx[20930]: **** raise weedb.OperationalError(e)
<span class='highlight'>Feb 12 07:11:06 rpi weewx[20930]: **** OperationalError: database is locked</span></pre>
<p>We are still trying to decipher exactly what the problem is, but it seems that
(many? most? all?) implementations of the SQLite 'C' access libraries on the RPi
sleep for a full second if they find the database locked. This gives them only
five chances within the 5 second timeout period before an exception is raised.</p>
<p>Not all Raspberry Pis have this problem. It seems to be most acute when running big
templates with lots of queries, such as the forecast extension.</p>
<p>There are a few possible fixes:</p>
<ul>
<li>Increase the <a href='#archive_timeout'><span class='code'>timeout</span> option</a>.</li>
<li>Use a high quality SD card in your RPi. There seems to be some evidence that faster
SD cards are more immune to this problem.
</li>
<li>Trim the size of your templates to minimize the number of queries necessary.</li>
</ul>
<p>None of these 'fixes' are very satisfying and we're trying to come up with a more robust solution.</p>
<h3>Strings in the database</h3>
<p>If you modify the SQLite archive database using an editing tool,
occasionally strings will get embedded in it, causing
weeWX to raise
an exception. <strong>This is only a problem with SQLite</strong>.
There is no analogous problem with MySQL databases. You will see errors in the system log that
look something like this:</p>
<pre class='tty'>
Dec 31 17:01:06 arm weewx[18141]: **** File "/usr/share/weewx/weewx/wxengine.py", line 432, in __init__
Dec 31 17:01:06 arm weewx[18141]: **** self.setupStatsDatabase(config_dict)
Dec 31 17:01:06 arm weewx[18141]: **** File "/usr/share/weewx/weewx/wxengine.py", line 543, in setupStatsDatabase
Dec 31 17:01:06 arm weewx[18141]: **** self.statsDb.backfillFrom(self.archive)
Dec 31 17:01:06 arm weewx[18141]: **** File "/usr/share/weewx/weewx/stats.py", line 461, in backfillFrom
Dec 31 17:01:06 arm weewx[18141]: **** _statsDict.addRecord(_rec)
Dec 31 17:01:06 arm weewx[18141]: **** File "/usr/share/weewx/weewx/accum.py", line 305, in addRecord
Dec 31 17:01:06 arm weewx[18141]: **** self._add_value(record[obs_type], obs_type, record['dateTime'], add_hilo)
Dec 31 17:01:06 arm weewx[18141]: **** File "/usr/share/weewx/weewx/accum.py", line 264, in _add_value
Dec 31 17:01:06 arm weewx[18141]: **** self[obs_type].addSum(val)
Dec 31 17:01:06 arm weewx[18141]: **** File "/usr/share/weewx/weewx/accum.py", line 81, in addSum
Dec 31 17:01:06 arm weewx[18141]: **** self.sum += val
<span class='highlight'>Dec 31 17:01:06 arm weewx[18141]: **** TypeError: unsupported operand type(s) for +=: 'float' and 'unicode'</span>
Dec 31 17:01:06 arm weewx[18141]: **** Exiting.</pre>
<p>The problem is that a unicode null string <span class='code'>u''</span>
got entered where a <span class='code'>NULL</span> should be. The
utility <span class='code'>wee_database</span> can fix this.
Run it with the option <span class='code'>--check-strings</span> to
search for these embedded strings. Add the option
<span class='code'>--fix-strings</span> to have the utility fix them:</p>
<pre class="tty cmd">wee_database weewx.conf --check-strings --fix-strings</pre>
<h3 id="python2_5">Python 2.5</h3>
<p>WeeWX should work with Python version 2.5, but it will take some fiddling.</p>
<p>The version of pysqlite that comes with Python 2.5 does not support the "with"
statement, which is required by weeWX. Unfortunately, the most modern version
of pysqlite no longer supports Python 2.5, so you will have to install an
"intermediate" version. I found that <a href="https://pypi.python.org/pypi/pysqlite/2.5.6">version 2.5.6</a>,
which can be downloaded from PyPI, works well. Download it, unpack the tarball, then use the included
<span class="code">setup.py</span> file to install</p>
<p>You will probably have to install PIL, which can be done using <span class="code">apt-get</span>,
or <span class="code">easy_install</span></p>
<p>Various possible complications:</p>
<ul>
<li id="pyserial_requirements">If your hardware requires PySerial (check the <a href="hardware.htm"><em>Hardware Guide</em></a>),
you must have the right version. Unfortunately, the current versions
of PySerial, and the ones that will get installed by default, 3.x, do not support Python 2.5
(or 2.6 for that matter). You will have to install
PySerial V2.7, which you can
<a href="https://sourceforge.net/projects/pyserial/files/pyserial/2.7/">obtain from SourceForge</a>.</li>
<li>You may have to install the development environment of SQLite in
order to get <span class='code'>pysqlite</span> to install. This worked on my system:
<pre class="tty cmd">
apt-get install libsqlite3-dev</pre>
Then rerun the installation of <span class='code'>pysqlite</span>.
</li>
<li>When you run weeWX, you may get an error that looks like this
<pre class="tty">
File "/usr/lib/python2.5/site-packages/PIL-1.1.7-py2.5-linux-x86_64.egg/ImageFont.py", line 218, in truetype
return FreeTypeFont(filename, size, index, encoding)
File "/usr/lib/python2.5/site-packages/PIL-1.1.7-py2.5-linux-x86_64.egg/ImageFont.py", line 134, in __init__
self.font = core.getfont(file, size, index, encoding)
File "/usr/lib/python2.5/site-packages/PIL-1.1.7-py2.5-linux-x86_64.egg/ImageFont.py", line 34, in __getattr__
raise ImportError("The _imagingft C module is not installed")
ImportError: The _imagingft C module is not installed</pre>
This is because your installed version of PIL was compiled without
libfreetype, which is needed for the FreeType fonts used in the
generated images. You can either change the font type (look in
file <span class='code'>skin.conf</span>), or supply the missing library. Note: if you are missing
the freetype library, you may be missing others as well. This is what worked on my system. YMMV.
<pre class="tty">
# Install the Freetype library:
<span class="cmd">sudo apt-get install libfreetype6-dev</span>
# Make sure it, and the zlib library, are visible to easy_install
<span class="cmd">sudo ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so /usr/lib</span>
<span class="cmd">sudo ln -s /usr/lib/x86_64-linux-gnu/libz.so /usr/lib</span>
# Remove the PIL paths
<span class="cmd">sudo easy_install -m PIL</span>
# Remove PIL itself:
<span class="cmd">sudo rm -r /usr/lib/python2.5/site-packages/PIL*</span>
# Now rebuild PIL, this time with the right libraries
<span class="cmd">sudo easy_install PIL</span>
</pre>
You may have to fiddle with the exact path used in the symbolic link. A helpful tool
is the Unix tool <span class='code'>find</span>. For example, the following
uncovered where my freetype library was hiding:
<pre class="tty cmd">
find /usr/lib -name "libfreetype*" -print</pre>
</li>
</ul>
<h3 id="python2_6">Python 2.6</h3>
<p>See the <a href="#pyserial_requirements">note about PySerial</a>
that can be found under the secton on Python 2.5 above.</p>
<h3>FreeBSD</h3>
<p>User Fabian reports that the following had to be done to get the
VantagePro2 working under FreeBSD:</p>
<pre class="tty">I needed the uslcom Driver for the usb/rs232 Adapter used by my vantage. Also I had to reset the memory of the weatherstation.
Loading the Driver:
Put uslcom_load=&quot;YES&quot; in /boot/loader.conf (to load it as module).
Which gives here an output like:
uslcom0: &lt;CP2102 USB to UART Bridge Controller&gt; on usbus1
And put in <span class="code">weewx.conf</span>:
port = /dev/cuaU0</pre>
<h3 id="funky_symbols">Funky symbols in plots</h3>
<p>If your plots have strange looking symbols for units, such as
degrees Fahrenheit (&deg;F), that look something like this:</p>
<img src='images/funky_degree.png' alt='funky degree sign'/>
<p>Then the problem may be that you are missing the fonts
specified for the option
<span class="code">unit_label_font_path</span> in your
<span class="code">skin.conf</span> file and, instead,
weeWX is substituting a default font, which does not
support the Unicode character necessary to make a degree sign. Look in
section <span class="code">[ImageGenerator]</span> for a line
that looks like:</p>
<pre class="tty">unit_label_font_path = /usr/share/fonts/truetype/freefont/FreeMonoBold.ttf</pre>
<p>Make sure that the specified path
(<span class='code'>/usr/share/fonts/truetype/freefont/FreeMonoBold.ttf</span>
in this case) actually exists. If it does not, on Debian
operating systems (such as Ubuntu), you may be able to install
the necessary fonts:</p>
<pre class="tty cmd">sudo apt-get install fonts-freefont-ttf
sudo fc-cache -f -v</pre>
<p>(On older systems, the package <span class="code">fonts-freefont-ttf</span>
may be called <span class="code">ttf-freefont</span>).
The first command installs the "Truetype" fonts, the second rebuilds
the font cache. If your system does not have <span class="code">fc-cache</span>
command, then install it from the <span class="code">fontconfig</span> package:</p>
<pre class="tty cmd">sudo apt-get install fontconfig</pre>
<p>If none of this works, or if you are on a different operating
system, then you will have to change the option <span class="code">unit_label_font_path</span>
to point to something on your system which does support the Unicode characters you plan to use.</p>
<h3>UnicodeEncodeError</h3>
<p>This problem is closely related to the <a href="#funky_symbols">"Funky symbols"</a>
problem above. In this case, you may see errors in your log that look like:</p>
<pre class="tty">May 14 13:35:23 web weewx[5633]: cheetahgenerator: Generated 14 files for report StandardReport in 1.27 seconds
May 14 13:35:23 web weewx[5633]: reportengine: Caught unrecoverable exception in generator weewx.imagegenerator.ImageGenerator
May 14 13:35:23 web weewx[5633]: **** 'ascii' codec can't encode character u'\xe8' in position 5: ordinal not in range(128)
May 14 13:35:23 web weewx[5633]: **** Traceback (most recent call last):
May 14 13:35:23 web weewx[5633]: **** File "/usr/share/weewx/weewx/reportengine.py", line 139, in run
May 14 13:35:23 web weewx[5633]: **** obj.start()
May 14 13:35:23 web weewx[5633]: **** File "/usr/share/weewx/weewx/reportengine.py", line 170, in start
May 14 13:35:23 web weewx[5633]: **** self.run()
May 14 13:35:23 web weewx[5633]: **** File "/usr/share/weewx/weewx/imagegenerator.py", line 36, in run
May 14 13:35:23 web weewx[5633]: **** self.genImages(self.gen_ts)
May 14 13:35:23 web weewx[5633]: **** File "/usr/share/weewx/weewx/imagegenerator.py", line 220, in genImages
May 14 13:35:23 web weewx[5633]: **** image = plot.render()
May 14 13:35:23 web weewx[5633]: **** File "/usr/share/weewx/weeplot/genplot.py", line 175, in render
May 14 13:35:23 web weewx[5633]: **** self._renderTopBand(draw)
May 14 13:35:23 web weewx[5633]: **** File "/usr/share/weewx/weeplot/genplot.py", line 390, in _renderTopBand
May 14 13:35:23 web weewx[5633]: **** top_label_size = draw.textsize(top_label, font=top_label_font)
May 14 13:35:23 web weewx[5633]: **** File "/usr/lib/python2.7/dist-packages/PIL/ImageDraw.py", line 278, in textsize
May 14 13:35:23 web weewx[5633]: **** return font.getsize(text)
May 14 13:35:23 web weewx[5633]: <span class="highlight">**** UnicodeEncodeError: 'ascii' codec can't encode character u'\xe8' in position 5: ordinal not in range(128)</span>
May 14 13:35:23 web weewx[5633]: **** Generator terminated...</pre>
<p>This is frequently caused by the necessary Truetype fonts not being installed on
your computer and, instead, a default font is being substituted, which only knows
how to plot ASCII characters. The cure is as before: install the font.</p>
<h3>Data is archived but some/all reports do not run</h3>
<p>If weeWX appears to be running normally but
some or all reports are not being run, either all the time or
periodically, the problem could be the inadvertant use or incorrect
setting of the <span class="code">report_timing</span> option in
<span class='code'>weewx.conf</span>. The
<span class="code">report_timing</span> option allows the user to
specify when some or all reports are run (refer <a href="customizing.htm#customizing_gen_time">Customizing
the report
generation time</a>). By default the
<span class="code">report_timing</span> option is disabled and all
reports are run each archive period.</p>
<p>To see if the <span class="code">report_timing</span> option is causing
reports to be skipped inspect the <a href="#monitoring">log file</a>.
Any reports that are skipped due to the
<span class="code">report_timing</span> option will be logged as
follows:</p>
<pre class="tty">Apr 29 09:30:17 rosella weewx[3319]: reportengine: Report StandardReport skipped due to report_timing setting</pre>
<p>If reports are being incorrectly skipped due to
<span class="code">report_timing</span> then edit
<span class='code'>weewx.conf</span> and check for a
<span class="code">report_timing</span> option in
<span class="code">[StdReport]</span>. Either remove all occurrences of
<span class="code">report_timing</span> to run all reports each archive
period or confirm the correct use and setting of the
<span class="code">report_timing</span> option.</p>
<h3>The wrong reports are being skipped by <span class="code">report_timing</span></h3>
<p>If the <span class="code">report_timing</span> option is being used and
the results are not as expected, there may be an error in the
<span class="code">report_timing</span> option. If there are errors in
the <span class="code">report_timing</span> parameter, the report will
be run on each archive interval. First check the
<span class="code">report_timing</span> option parameters to ensure
they are valid and there are no additonal spaces or other unwanted
characters. Then check that the parameters are correctly set
for the desired report generation times. For example, is the correct
day of the week number being used if limiting the day of the week
parameter. Refer to <a href="customizing.htm#customizing_gen_time">Customizing
the report generation time</a>.</p>
<p>Check the <a href="#monitoring">log file</a> for any entries relating to
the reports concerned. Errors in the
<span class="code">report_timing</span> parameter and skipped reports
are logged only when <span class="code">debug=1</span> in
<span class="code">weewx.conf</span>.</p>
<h2>Meteorological problems</h2>
<h3 id='pressure_mismatch'>The pressure reported by weeWX does not match the pressure
on the console</h3>
<p>
Be sure that you are comparing the right values. There are three different types of pressure:
</p>
<dl>
<dt>Station Pressure</dt>
<dd>
The <em>Station Pressure</em> (SP), which is the raw, absolute
pressure measured by the station.
This is <span class='code'>pressure</span> in
weeWX packets and archive records.
</dd>
<dt>Sea Level Pressure</dt>
<dd>
The <em>Sea Level Pressure</em> (SLP) is obtained by correcting
the <em>Station Pressure</em> for altitude and local temperature.
This is <span class='code'>barometer</span> in
weeWX packets and archive records.
</dd>
<dt>Altimeter</dt>
<dd>
The <em>Altimeter Setting</em> (AS) is obtained by correcting the
<em>Station Pressure</em> for altitude.
This is <span class='code'>altimeter</span> in
weeWX packets and archive records.
</dd>
</dl>
<p>
Any station might require calibration. For some hardware, this can
be done at the weather station console. Alternatively, use the
<span class='code'>StdCalibrate</span> section to apply an offset.
</p>
<p>
If your station is significantly above (or below) sea level, be sure
that the station altitude is specified properly. Also, be sure that
any calibration results in a station pressure and/or barometric
pressure that matches those reported by other stations in your area.
</p>
<h3 id='pressure_calibration'>Calibrating <span class='code'>barometer</span> does not change the pressure
displayed by weeWX</h3>
<p>
Be sure that the calibration is applied to the correct quantity.
</p>
<p>
The corrections in the <span class='code'>StdCalibrate</span> section
apply only to raw values from the hardware; corrections are not applied
to derived quantities.
</p>
<p>
The station hardware matters. Some stations report gauge pressure
(<span class='code'>pressure</span>) while other stations report
sea-level pressure (<span class='code'>barometer</span>). For example,
if the hardware is a Vantage station, the correction must be applied
to <span class='code'>barometer</span> since the Vantage station
reports <span class='code'>barometer</span> and
weeWX calculates
<span class='code'>pressure</span>. However, if the hardware
is a FineOffset station, the correction must be applied to
<span class='code'>pressure</span> since the FineOffset stations
report <span class='code'>pressure</span> and
weeWX calculates
<span class='code'>barometer</span>.
</p>
<h3 id='rain_mismatch'>The rainfall and/or rain rate reported by weeWX
do not match the console</h3>
<p>
First of all, be sure that you are comparing the right quantities. The value <span class='code'>rain</span>
is the amount of rainfall observed in a period of time. The period of time might be a LOOP interval, in
which case the <span class='code'>rain</span> is the amount of rain since the last LOOP packet. Or the
period of time might be an archive interval, in which case the <span class='code'>rain</span> is the total
of rain reported in each LOOP packet since the last archive record.
</p>
<p>
Some consoles report the amount of rain in the past hour, or the amount of rain since midnight.
</p>
<p>
The rain rate is a derived quantity. Some stations report a rain
rate, but for those that do not, weeWX will calculate the rain
rate.
</p>
<p>
Be sure that the units are correct.
</p>
<p>
Finally, beware of calibration factors specific to the hardware.
For example, the bucket type on a Vantage station must be
specified when you set up the weather station. If you modify the
rain bucket with a larger collection area, then you will have to
add a multiplier in the <span class='code'>StdCalibrate</span>
section.
</p>
<p>
To diagnose rain issues, run weeWX directly so that you can see
each LOOP packet and REC archive record. Tip the bucket to verify
that each bucket tip is detected and reported by weeWX. Verify
that each bucket tip is converted to the correct rainfall amount.
Then check the database to verify that the values are properly
added and recorded.
</p>
<h3 id="zero_windspeed">There is no wind direction when wind speed is zero</h3>
<p>
This is by design - if there is no wind, then the wind direction is undefined. An undefined value is
represented by a NULL in the database or a None in Python. This policy is enforced by the <span
class='code'>StdWXCalculate</span> service. If necessary, it can be overridden. See the <a
href="#StdWXCalculate"><span class='code'>StdWXCalculate</span></a> section for instructions.
</p>
<p>
WeeWX distinguishes between a value of zero and no value (NULL or None). However,
some services do not make this distinction and replace a NULL or None with a clearly invalid value such as
-999.
</p>
</div> <!--- end technical_content -->
<div class="footer">
<p class="copyright"> &copy; <a href="copyright.htm">Copyright</a> Tom Keffer </p>
</div>
</div>
<!-- Our scripts load last so the content can load first -->
<script type="text/javascript" src="js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.10.4.custom.min.js"></script>
<script type="text/javascript" src="js/jquery.tocify-1.9.0.min.js"></script>
<script type="text/javascript" src="js/weewx.js"></script>
<script type="text/javascript">
$(function () {
var level = get_default_level();
create_toc_control(level);
generate_toc(level);
});
</script>
<script type="text/javascript">
function showtab(tab, id) {
document.getElementById(tab + '-deb').style.display = 'none';
document.getElementById(tab + '-rpm').style.display = 'none';
document.getElementById(tab + '-macos').style.display = 'none';
document.getElementById(tab + '-setup').style.display = 'none';
document.getElementById(tab + '-' + id).style.display = 'block';
document.getElementById(tab + '-tab-deb').className = 'tab';
document.getElementById(tab + '-tab-rpm').className = 'tab';
document.getElementById(tab + '-tab-macos').className = 'tab';
document.getElementById(tab + '-tab-setup').className = 'tab';
document.getElementById(tab + '-tab-' + id).className = 'tab selected';
}
</script>
</body>
</html>