WeeWX service to fetch data from disdrometers or present weather sensors like Ott Parsivel2 or Thies LNM
Please note: Actually the TCP connection is tested only.
In general you need:
- a disdrometer or present weather sensor like Ott-Hydromet Parsivel2 or Thies LNM (And there are people, who made disdrometers themselves as a DIY project.)
- a converter from RS485 to whatever your computer understands (RS485-to-ethernet converter or RS485-to-USB converter)
- a 24V DC power supply (I recommend using a model including an accumulator for uninterupted supply)
- in case you want to use WLAN a WLAN adapter
- an electric cabinet for outdoor usage to put the power supply and the converter(s) in
- cable glands, wires, connectors etc.
For example I used the following components:
item | amount | description | manufacturer |
---|---|---|---|
01 | 1 pc. | laser disdrometer Parsivel2 | Ott Hydromet GmbH |
02 | 1 pc. | Com-Server++ 58665 | Wiesemann & Theis GmbH |
03 | 1 pc. | 9 pin sub-D connector female 11904 | Wiesemann & Theis GmbH |
04 | 1 pc. | power supply APU230V.24V-6A/20Ah *) | Rinck Electronics Germany GmbH |
05 | 1 pc. | electric cabinet AX 400x500x210 art. 1045000 (including mounting plate and assembling material) | RITTAL GmbH & Co. KG |
06 | 1 set | mast mounting set for AX art. 2584100 | RITTAL GmbH & Co. KG |
07 | 0.40 m | top hat DIN rail IEC/EN 60715 | |
08 | 2.33 m | pipe 2" |
*) If the grid power is more reliable at your location than at mine, you can order that power supply with a smaller accumulator.
This is one possible means to connect the disdrometer to the computer. To use it you have to set up the Com-Server++ to RS485 2-wire communication. Open the device as described in the manual and set the DIP switches as follows:
SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | SW7 | SW8 |
---|---|---|---|---|---|---|---|
ON | ON | OFF | OFF | OFF | ON | ON | OFF |
2 pins of the sub-D connector are used only:
- pin 2: RxD A/-
- pin 7: RxD B/+
If the distance between the Com-Server++ and the disdrometer is not short or both devices are connected to different power supplies, you additionally need an isolator. In case of doubt see the user's manual of the disdrometer for requirements. Please note, that you alone are responsible for what you do.
- WeeWX (of course)
- SQLite3
- python3-configobj
- python3-requests (if the device offers a restful service)
- python3-serial (if the device is connected by USB or serial)
-
download
wget -O weewx-precipmeter.zip https://github.com/roe-dl/weewx-precipmeter/archive/master.zip
-
run the installer
WeeWX up to version 4.X
sudo wee_extension --install weewx-precipmeter.zip
WeeWX from version 5.0 on
sudo weectl extension install weewx-precipmeter.zip
-
edit configuration in weewx.conf
Before using this extension you have to set up which devices to be queried and which variables to be fetched. See section "Configuration" for details.
Caution! If you want to save the readings to a separate database and have it created properly, you have to edit the configuration file before you first start WeeWX after installing the extension.
If you want to add additional variables afterwards you have to extend the database schema manually by using the
wee_database
utility. This is not done automatically. -
restart weewx
for SysVinit systems:
sudo /etc/init.d/weewx stop sudo /etc/init.d/weewx start
for systemd systems:
sudo systemctl stop weewx sudo systemctl start weewx
It is possible to configure more than one device.
enable
: If True or omitted, retrieve data from that device. If False, that subsection is not used. (optional)log_success
: If True, log successful operation. If omitted, global options apply. (optional)log_failure
: If True, log unsuccessful operation. If omitted, global options apply. (optional)data_binding
: data binding to use for storagedb_timeout
: thread database access timeout (optional, default 10s)weathercodes
: device to get present weather codes from (use the section name of the device configuration section)visibility
: device to getvisbility
reading from (use the section name of the device configuration section)precipitation
: Generally the readings ofrain
andrainRate
are not provided by this extension but by the driver that is set up by thestation_type
key in the[Station]
section of weewx.conf. In case you want this extension to providerain
andrainRate
you can set upprecipitation
to point to the device subsection of the device you want to get the readings from. Default is not to providerain
andrainRate
.rainDur
: device to getrainDur
from.freezingPrecipDetectionSource
: source of the indicator value used to decide about freezing precipitation. Possible values are:software
: The value is calculated out of temperature readings within this extension. This is the default.hardware
: The value is provided by some sensor or device by setting the observation typefrostIndicator
. If reading the device requires some extra WeeWX extension, that extension must be included in thedata_services
list ofweewx.conf
beforeuser.precipmeter.PrecipData
.- a subsection of the
PrecipMeter
section that describes the device to get the information from. none
: Freezing precipitation detection shall not be performed.
AWEKAS
: list of subsections to retrieve data for theAWEKASpresentweather
observation type from
host
: host name or IP address of the device to get data fromport
: port numbertimeout
: request timeout (optional, default is 0.5s)retries
: request retries (0 is no retries) (optional, default is no retries)query_interval
: query interval (optional, default 5s)
Actually none.
temp2m
: observation type of air temperature 2m above ground (defaultoutTemp
)temp5cm
: observation type of air temperature 5cm above ground (default no observation available)soil5cm
: observation type of soil temperature 5cm below ground (defaultsoilTemp1
)windSpeed
: observation type of wind speed (defaultwindSpeed
)windSpeed10
: observation type of 10 minutes average of wind speed (defaultwindSpeed10
)windGust
: observation type of wind gust (defaultwindGust
)
model
: device model (actuallyOtt-Parsivel1
,Ott-Parsivel2
,Thies-LNM
orgeneric
)prefix
: observation type name prefix (defaultott
for Ott-Parsivel orthies
for Thies-LNM)telegram
: telegram configuration as set up in the device (Instead of this key a[[[loop]]]
sub-subsection can be used to define the observation types measured by the device.)field_separator
: data field separator. Optional. Default is;
.record_separator
: data record separator. Optional. Default is\r\n
error_limit
: How long a precipitation must last at least to be considered real precipitation and not erroneous reading? In seconds. (Please note: Disdrometers sometimes create false-positive results.)
See WeeWX Customization Guide for a list of predefined units and unit groups.
The observation types are automatically registered with WeeWX.
Note: This section is about WeeWX accumulators and their use together with this extension. For the internal accumulation because of different data intervals see the wiki page.
Accumulators define how to aggregate the readings during the
archive interval.
This extension tries to set up reasonable accumulators. If
they do not work for you, you can set up accumulators manually
in the [Accumulator]
section of weewx.conf
.
See WeeWX Accumulators wiki page
for how to set up accumulators in WeeWX.
The accumulator firstlast
does not work for numeric values of this
extension. The reason is that the database schema within this extension
includes all numeric values in the list of daily summeries tables. But
WeeWX let you have an observation type either with a daily summeries
table or the firstlast
accumulator, not both.
Additionally the accumulator 'firstlast' as of version 4.10.2 converts all values to strings. So it is not suitable for values other than strings (like numbers or lists), anyway.
For the present weather ww
and wawa
this extension includes its
own accumulator. It omits readings that are opposite to the readings
before and after. This is because the propability of error ist about
3%. That is quite frequent. So it is handled specially.
...
[DataBindings]
...
# additional section for an extra database to store the disdrometer data
# optional!
[[precip_binding]]
database = precip_sqlite
table_name = archive
manager = weewx.manager.DaySummaryManager
schema = user.precipmeter.schema
[Databases]
...
# additional section for an extra database to store disdrometer data
# optional!
[[precip_sqlite]]
database_name = precipmeter.sdb
database_type = SQLite
[Engine]
[[Services]]
data_services = ..., user.precipmeter.PrecipData
archive_services = ..., user.precipmeter.PrecipArchive
[PrecipMeter]
data_binding = precip_binding
weathercodes = Parsivel # or Thies
visibility = Parsivel # or Thies
temp5cm = extraTemp1
freezingPrecipDetectionSource = software
[[Parsivel]]
enable = True # or False
model = Ott-Parsivel2
prefix = ott
telegram = "%13;%01;%02;%03;%07;%08;%34;%12;%10;%11;%18;/r/n"
type = tcp # udp tcp restful usb none
host = replace_me
port = replace_me
[[Thies]]
enable = True # or False
model = Thies-LNM
prefix = thies
telegram = 4 # 4...10, default 4
type = tcp # udp tcp restful usb
host = replace_me
port = replace_me
[[GenericDevice]]
enable = True # or False
model = generic
type = tcp # udp tcp restful usb
host = replace_me
port = replace_me
field_separator = replace_me
record_separator = replace_me
[[[loop]]]
[[[[obs1]]]]
name = replace_me # observation type name
unit = replace_me # supplied unit
group = replace_me # unit group
sql_datatype = replace_me # REAL, INTEGER, VARCHAR(...)
description = replace_me # observation type description
[[[[obs2]]]]
name = replace_me # observation type name
unit = replace_me # supplied unit
group = replace_me # unit group
sql_datatype = replace_me # REAL, INTEGER, VARCHAR(...)
description = replace_me # observation type description
...
ww
: most significant present weather code according to WMO table 4677 during the archive interval, enhanced by this extensionwawa
: most significant present weather code according to WMO table 4680 during the archive interval, enhanced by this extensionpresentweatherWw
: present weather code according to WMO table 4677 at the end of the archive interval. This is the weather condition that started at the timepresentweatherStart
reports and lasted for the timepresentweatherTime
reports.hourPresentweatherW1
: 1st past weather code according to WMO table 4561 for the last 60 minutes, related topresentweatherWw
hourPresentweatherW2
: 2nd past weather code according to WMO table 4561 for the last 60 minutes, related topresentweatherWw
andhourPresentweatherW1
presentweatherWawa
: present weather code according to WMO table 4680 at the end of the archive interval. This is the weather condition that started at the timepresentweatherStart
reports and lasted for the timepresentweatherTime
reports.hourPresentweatherWa1
: 1st past weather code according to WMO table 4531 for the last 60 minutes, related topresentweatherWawa
hourPresentweatherWa2
: 2nd past weather code according to WMO table 4531 for the last 60 minutes, related topresentweatherWawa
andhourPresentweatherWa1
presentweatherStart
: timestamp of the beginning of the present weatherpresentweatherTime
: time elapsed since last change of the present weatherprecipitationStart
: timestamp of the beginning of the present precipitation period orNone
if actually no precipitation takes place.frostIndicator
: indicator if the conditions for freezing rain or freezing drizzle are met.visibility
: visibility, derived fromMOR
AWEKASpresentweather
: present weather code according to the specification of AWEKAS. This observation type is provided if and only if the reading changes. This is due to the fact that AWEKAS interprets that observation type as some kind of alert to be sent once and then persisting until a new message arrives. See wiki page AWEKAS for additional information and instructions how to use it.
To get the most significant weather of some timespan, use the max
aggregation type for ww
and wawa
, for example $day.ww.max
To convert the present weather code into a symbol or icon
look for the $presentweather
tag provided by
weewx-DWD.
Example of weather icons supplied by $presentweather
:
drizzle | rain | hail | rain and snow | snow |
---|---|---|---|---|
The observation types ww
, wawa
, presentweatherStart
, and
presentweatherTime
are derived from the device that is set
by the weathercodes
key. The observation type visibility
is derived from the device that is set by the visibility
key. If the configuration keys weathercodes
or visibility
are omitted or point to an unknown subsection, the respective
observation types are omitted.
Those observation type names are prepended by the prefix defined in
weewx.conf
. Default is ott
.
SNR
: serial number of the devicequeryInterval
:sensorState
: 0 - ok, 1 - dirty but measurement is still possible, 2 - dirty, no measurement possible, 3 - laser defectiveerrorCode
:wawa
: present weather code according to WMO table 4680ww
: present weather code according to WMO table 4677METAR
: present weather code according to WMO table 4678NWS
: present weather code according to NWSrainRate
: rain raterainAccu
: accumulated rain since power-onrainAbs
: absolute amount of rainsnowRate
: snow intensitydBZ
: radar reflectivity factorMOR
: meteorological optical range (visibility) in precipitation (This reading does not report fog induced visibility reduction.)raw0000
toraw1023
: raw data (no. 93)rain
: amount of precipitation during the archive interval (calculated by this extension, not provided by the device)rainDur
: duration of precipitation during the archive interval (calculated by this extension, not provided by the device)history
: history of the present weather codes of the last hour. This is for debugging purposes. The internal structure of the value may change without notice.
Those observation type names are prepended by the prefix defined in
weewx.conf
. Default is thies
.
SNR
: serial number of the devicewawa
: present weather code according to WMO table 4680ww
: present weather code according to WMO table 4677METAR
: present weather code according to WMO table 4678precipRate
: precipitation intensity (all kind of precipitation)rainRate
: intensity of liquid precipitationsnowRate
: intensity of solid precipitationrainAccu
: accumulated rain since power-ondBZ
: radar reflectivity factorMOR
: meteorological optical range (visibility) in precipitation (This reading does not report fog induced visibility reduction.)rain
: amount of precipitation during the archive interval (calculated by this extension, not provided by the device)rainDur
: duration of precipitation during the archive interval (calculated by this extension, not provided by the device)history
: history of the present weather codes of the last hour. This is for debugging purposes. The internal structure of the value may change without notice.
In general disdrometers use a subset of the WMO code tables.
WMO code table 4677 ww | WMO code table 4680 wawa |
---|---|
These symbols and appropriate description texts can be displayed by the
$presentweather
tag.
To describe the weather during a past period of time, the WMO defined 2 code tables, that are much simpler and shorter than ww and wawa. Therefore, if you want to aggregate the present weather you need to convert the the codes vom table 4677 to 4561 or 4680 to 4531, respectively. That is, what the special aggregation types provided by this WeeWX extension do.
wmo_W1
: get the most significant weather during the given timespan as table 4561 codewmo_W2
: get the second significant weather during the given timespan as table 4561 codewmo_Wa1
: get the most significant weather during the given timespan as table 4531 codewmo_Wa2
: get the second significant weather during the given timespan as table 4531 codemax
: get the most significant weather during the given timespan using the original code table. This is generally the maximum of the the weather codes within the timespan, but the WMO defined some exception, that are observed by this special version of themax
aggregation type. It is used for observation types of the groupsgroup_wmo_ww
andgroup_wmo_wawa
.
Example: $day(data_binding='precip_binding').ww.wmo_W1
If the disdrometer reports precipitation the respective icon is shown. Otherwise an icon representing the cloud coverage according to the forecast is shown.
<img src="$presentweather(ww=int($current.ww.raw),n=$hour($data_binding='dwd_binding').cloudcover.avg.raw,night=$almanac.sun.alt<0).belchertown_icon" />
If the disdrometer reports precipitation the respective description is displayed. Otherwise a description of the amount of cloud coverage is displayed.
Note: Without the #if
statement the text no cloud development
would always be displayed in case of no precipitation.
#if int($current.ww.raw)==0
#set $icontxt=$presentweather(n=$hour($data_binding='dwd_binding').cloudcover.avg.raw,night=$almanac.sun.alt<0).text
#else
#set $icontxt=$presentweather(ww=int($current.ww.raw),n=$hour($data_binding='dwd_binding').cloudcover.avg.raw,night=$almanac.sun.alt<0).text
#end if
$icontxt
If you have a cloud coverage measuring instrument you can set n
to
the reading of that device instead of using the forecasted value.
Example table:
<table class="table-striped">
<tr>
<th>Bezeichnung</th>
<th>Größe</th>
<th>Wert</th>
<th>WMO</th>
<th>Text</th>
<th>Icon</th>
</tr>
<tr>
<td>ottRainAccu</td>
<td></td>
<td>$current.ottRainAccu.format("%.2f")</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>ottRainAbs</td>
<td></td>
<td>$current.ottRainAbs.format("%.2f")</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>ottRainRate</td>
<td></td>
<td>$current.ottRainRate.format("%.3f")</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>ottSnowRate</td>
<td></td>
<td>$current.ottSnowRate.format("%.3f")</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>ottMOR</td>
<td>MOR</td>
<td>$current.ottMOR</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>ottDBZ</td>
<td>dBZ</td>
<td>$current.ottDBZ</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>ottWw</td>
<td>ww</td>
<td>$current.ottWw</td>
<td>$presentweather(ww=int($current.ottWw.raw)).wmo_symbol</td>
<td>$presentweather(ww=int($current.ottWw.raw),n=$hour($data_binding='dwd_binding').cloudcover.avg.raw,night=$almanac.sun.alt<0).text</td>
<td><img src="$relative_url/images/$presentweather(ww=int($current.ottWw.raw),n=$hour($data_binding='dwd_binding').cloudcover.avg.raw,night=$almanac.sun.alt<0).belchertown_icon"
width="70px" /></td>
</tr>
<tr>
<td>ottWawa</d>
<td>w<sub>a</sub>w<sub>a</sub></td>
<td>$current.ottWawa</td>
<td>$presentweather(wawa=int($current.ottWawa.raw)).wmo_symbol
## $presentweather(wawa=int($current.ottWawa.raw)).text
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>ottMETAR</td>
<td></td>
<td>$current.ottMETAR.raw</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>ottNWS</td>
<td></td>
<td>$current.ottNWS.raw</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>ww</td>
<td>ww</td>
<td>$current.ww</td>
<td>$presentweather(ww=int($current.ww.raw)).wmo_symbol</td>
<td>
#if int($current.ww.raw)==0
$presentweather(n=$hour($data_binding='dwd_binding').cloudcover.avg.raw,night=$almanac.sun.alt<0).text
#else
$presentweather(ww=int($current.ww.raw),n=$hour($data_binding='dwd_binding').cloudcover.avg.raw,night=$almanac.sun.alt<0).text
#end if
</td>
<td><img src="$relative_url/images/$presentweather(ww=int($current.ww.raw),n=$hour($data_binding='dwd_binding').cloudcover.avg.raw,night=$almanac.sun.alt<0).belchertown_icon"
width="70px" /></td>
</tr>
<tr>
<td>Wawa</d>
<td>w<sub>a</sub>w<sub>a</sub></td>
<td>$current.wawa</td>
<td>$presentweather(wawa=int($current.wawa.raw)).wmo_symbol
## $presentweather(wawa=int($current.wawa.raw)).text
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>presentweatherStart</td>
<td></td>
<td>$current.presentweatherStart.raw</td>
<td></td>
<td>$current.presentweatherStart</td>
<td></td>
</tr>
<tr>
<td>presentweatherTime</td>
<td></td>
<td>$current.presentweatherTime</td>
<td></td>
<td>$current.presentweatherTime.long_form</td>
<td></td>
</tr>
</table>
The $presentweather
tag is available from
weewx-DWD.
If you doubt the reason for some present weather code in ww
or wawa
you can inspect the history
observation type to get a list of the
detected weather during the last hour. The following example creates
a table showing start and end of each individual weather, its
duration, the respective values of ww
and wawa
and - if there
is precipitation - the start time of the precipitation.
If there is no weather change during the last hour, no table is
shown at all.
In this example you also learn how to use the ValueTuple
and
ValueHelper
classes for calculated values in WeeWX templates.
#from weewx.units import ValueTuple, ValueHelper
...
#if $len($current.ottHistory.raw)>1
<p>Wetterzustände der letzten Stunde:</p>
<table class="table-striped">
<tr>
<th>Beginn</th>
<th>Ende</th>
<th>Dauer</th>
<th>ww</th>
<th>w<sub>a</sub>w<sub>a</sub></th>
<th>Niederschlagsbeginn</th>
</tr>
#for $ii in reversed($current.ottHistory.raw)
#set $start=ValueHelper(ValueTuple($ii[0],'unix_epoch','group_time'),formatter=$station.formatter)
#set $stop=ValueHelper(ValueTuple($ii[1],'unix_epoch','group_time'),formatter=$station.formatter)
#set $precipstart=ValueHelper(ValueTuple($ii[4],'unix_epoch','group_time'),formatter=$station.formatter)
#set $duration=ValueHelper(ValueTuple($ii[1]-$ii[0],'second','group_deltatime'),formatter=$station.formatter)
<tr>
<td>$start</td>
<td>$stop</td>
<td>
#if $duration.raw>3600
$duration.hour
#else
$duration.minute
#end if
</td>
<td>
$('%02d' % ii[2])
<span style="position:relative;top:4px">$presentweather(ww=$ii[2]).wmo_symbol(width=22)</span>
</td>
<td>
$('%02d' % ii[3])
<span style="position:relative;top:4px">$presentweather(wawa=$ii[3]).wmo_symbol(width=22)</span>
</td>
<td>$precipstart</td>
</tr>
#end for
</table>
<p></p>
#end if
Example how that table could look like:
See wiki.
- How different data intervals are handled within this extension
- How to determine "state after some weather condition" codes (20...29)?
- How to detect freezing rain and freezing drizzle
- Quality checks
- Open the front cover
- Connect the PC to the Parsivel2 by an USB wire
- Start a terminal application on the PC
- macOS:
screen /dev/tty.usb...
- Windows: PuTTY
- macOS:
- If the connection is working properly, a data telegram is shown every minute (or whatever interval is set up into the device).
- Use the commands as described in the Parsivel2 manual
Note: While the USB connection is active, the RS485 interface is not sending data.
-
ERROR thread 'PrecipMeter-Parsivel': opening connection to XXX.XXX.XXX.XXX:XXXX failed with ConnectionRefusedError [Errno 111] Connection refused, will be tried again
May be there is another connection active to
XXX.XXX.XXX.XXX:XXXX
. You cannot have more than one connection at the same time.Check the settings of the RS485 to ethernet converter.
- For
type = tcp
: Is the TCP server mode enabled? - For
type = udp
: Is sending UDP data enabled? Is the target IP address correct?
- For
-
No reasonable data
Make sure the telegram string is the same at the Parsivel2 setting and in
weewx.conf
. To check that connect to the Parsivel2 by USB and enter the commandCS/L<CR>
. That shows the current configuration. So you can compare.If you use the
[[[loop]]]
subsection, make sure it reflects the Parsivel2 telegram setting appropriately.Please take special care on typos.
-
The database is not created properly.
Check the key
schema
in the[[precip_binding]]
section. It must beschema = user.precipmeter.schema
.Please note, that the database table is created at the very first run after setting up the PrecipMeter extension. If you change the settings afterwards, the database table schema is not updated. That's due to how WeeWX processes databases.
-
The device reports precipitation for one moment while there is no precipitation around.
According to the specification about 97% of the present weather readings are correct. That means, up to 3% can be erroneous. So you will see some erroneous results, but that should be rare. Nothing can be done about that. It's the limitation of the device.
-
Typical logging messages
-
At WeeWX start:
May 8 14:31:00 WeatherPC weewx[1234] INFO user.PrecipMeter: PrecipMeter service version 0.3 May 8 14:31:00 WeatherPC weewx[1234] INFO user.PrecipMeter: thread Parsivel2, host XXX.XXX.XXX.XXX, poll interval 5 May 8 14:31:00 WeatherPC weewx[1234] INFO user.PrecipMeter: thread 'PrecipMeter-Parsivel2': TCP connection to XXX.XXX.XXX.XXX:8000 May 8 14:31:00 WeatherPC weewx[1234] INFO user.PrecipMeter: accumulator dict for 'Parsivel2': {'ottRain': {'extractor': 'sum'}, 'ottHistory': {'accumulator': 'firstlast', 'adder': 'noop', 'extractor': 'noop'}, ... May 8 14:31:00 WeatherPC weewx[1234] INFO user.PrecipMeter: thread 'PrecipMeter-Parsivel2' starting May 8 14:31:00 WeatherPC weewx[1234] INFO user.PrecipMeter: PrecipMeter archive version 0.3 May 8 14:31:00 WeatherPC weewx[1234] INFO user.PrecipMeter: Using binding 'precip_binding' to database 'precip.sdb' May 8 14:31:09 WeatherPC weewx[1234] INFO user.PrecipMeter: thread 'PrecipMeter-Parsivel2': sensor ok
-
During normal operation:
May 8 14:35:18 WeatherPC weewx[1234] INFO user.PrecipMeter: 5 records received from Parsivel2 during archive interval May 8 14:40:18 WeatherPC weewx[1234] INFO user.PrecipMeter: 5 records received from Parsivel2 during archive interval
-
At WeeWX stop
May 8 14:40:57 WeatherPC weewx[1234] INFO user.PrecipMeter: thread 'PrecipMeter-Parsivel2': shutdown requested May 8 14:40:59 WeatherPC weewx[1234] INFO user.PrecipMeter: thread 'PrecipMeter-Parsivel2': self.running==False getRecord() select() r [] w [] x [] May 8 14:40:59 WeatherPC weewx[1234] INFO user.PrecipMeter: thread 'PrecipMeter-Parsivel2' stopped
-
English:
German:
English:
- Com-Server++
- user's manual Com-Server++
- connector
- isolator
- isolator and overvoltage protection
- RS232-RS485 converter
- USB-RS485 converter
German:
- Com-Server++
- Bedienanleitung Com-Server++
- Steckverbinder
- Galvanische Trennung
- Galvanische Trennung mit Überspannungsschutz
- RS232-RS485-Umsetzer
- USB-RS485-Umsetzer
- WeeWX website
- WeeWX information in german
- WeeWX customization guide (See this guide for using the observation types in skins.)
- WeeWX accumulators
(This extension tries to set up reasonable accumulators for the
observation types, but if you want them different or if they do not
work appropriately, you can define them in
weewx.conf
) - Calculation in templates