The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Device::VantagePro - Perl module to request data in real-time or archive and configure a Davis Vantage Pro Weather Station that is equiped with a WeatherLink datalogger/serial port.

SYNOPSIS

  use Device::VantagePro;
  use Data::Dumper;
  
  my %arg_hsh;  
  $arg_hsh{baudrate} = 19200;
  $arg_hsh{port} = "/dev/ttyr08";

  my $vp_obj = new Device::VantagePro(\%arg_hsh);

  $vp_obj->wake_up();

  # Start loop for 2 times and read loop data
  $vp_obj->start_loop(2); 
 
  for my $i (1..2)
  {
      my $hsh_ref = $vp_obj->read_loop();
      print Dumper $hsh_ref; # Print out data hash 
      sleep 2; 
  }

Or perhaps better yet

  for my $i (1..2)
  {
       my $hsh_ref = $vp_obj->get_one_loop();
       print Dumper $hsh_ref; # Print out data hash 
       sleep 2;   # Sleep arbitary number of seconds no less than 1 sec. 
  }

To retrieve archive data first requires a date/time stamp and then a call to do_dmpaft

  # Create date/time stamp for April 17 2010 at 0805 
  my ($dstamp,$tstamp) = $vp_obj->make_date_time_stamp(2010,4,17,8,5);
  
  my $data_ref = $vp_obj->do_dmpaft($dstamp,$tstamp); 
  foreach my $ref ( @{$data_ref} )      
  {
      # Do something with the data hash reference
      print Dumper $ref; # data hash of archive record. 
  }

DESCRIPTION

A module to provide direct access to many of the features of the Davis VantagePro Weather family of weather stations.

This module was developed and tested on a Linux operating system and relies upon the Unix specific Device::SerialPort module. A port to Windows could be accomplished using the Win32::SerialPort module which uses the same calls. See code for more details.

Some things to note: The Archive data packet and the Loop data packet provide different data values. For example, the Loop data packet has a value for the 10-Minute ave wind speed while the Archive data packet has only the wind speed average for the archive period. The Archive data packet only gives the instantaneous maximum wind speed over the archive period and not a true wind gust measurement as defined by NOAA as a maximum sustained wind speed over a 3 second period, therefore wind gusts tend to be high.

METHODS

new

Object Constructor which expects an argument with a hash or reference to a hash providing the communication parameters.

        $vp_obj = Device::VantagePro->new(%arg_hsh); 

Available arguements: baudrate, parity, databits, stopbits, port

Defaults for these argument parameters are as follows:

  $arg_hsh{'port'}   = "/dev/ttyS0";
  $arg_hsh{baudrate} = 19200;
  $arg_hsh{parity}   = "none";
  $arg_hsh{databits} = 8;
  $arg_hsh{stopbits} = 1;

wake_up

The device sleeps in order to conserve power after 2 minutes of inactivity. A wake up call is provided which conforms to Section IV Waking up the Console

        $vp_obj->wake_up();

Sending a command when the console is sleeping might not wake up the device fast enough to read the first character correctly. Because of this, you should always perform a wakeup call before sending commands. Many of the calls such as start_loop, read_loop, get_one_loop, etc send a wake_up() command implicitly so there is no need to send one.

get_archive_period

Retrieves the archive period for the device. The archive period is the time period between each archived data record.

    my $arc_period = $vp_obj->get_archive_period(); 
    my $arc_sec = $arc_period * 60; 
    print ">Archive Period is currently: $arc_period minutes\n";

set_archive_period

Sets the archive period. Acceptable values are 1, 5, 10, 15, 30, 60, 120 minutes. See Davis documentation.

    $vp_obj->set_archive_period(5) || warn "Archive Period not set" ;
 

According to the documentation this call clears the archive data.

gettime

Retrieve the current device time

    my $ref = $vp_obj->gettime(); 
 

Returns a reference to a list ordered as

        #        hour   :  min    :   sec       month /    day  /     year    
        print "$ref->[2]:$ref->[1]:$ref->[0] $ref->[4]/$ref->[3]/$ref->[5]\n"; 
 

The values are returned in the same order as provided in the Davis documentation.

settime

Set the device time using a reference to a list compatible with the gettime returned reference.

The order is similar to the array returned by the perl localtime function. Here is an example setting the device time to the server time.

    my $s_time = [ localtime() ]; 
    $s_time->[4] += 1; 
    $vp_obj->settime($s_time); 

get_timezone

Returns the timezone of the device as a DateTime::TimeZone object.

The VantagePro does not deal with timezones particularly well. The time field contained in a record is the local time, with no information as to its timezone. This is problematic when the local time reverts from daylight saving time, as for the duration of that hour there will be multiple records containing the same time value, with no way of differentiating them other than the order that they have been recorded. In much the same way, if the timezone of the unit is changed, no record of this will be attached to each of the downloaded records.

For the above reasons, it is recommended that the device is configured for a named timezone, rather than offset from GMT, as it is easier to compensate for daylight saving changes.

start_loop

Begins a loop data acquisition sequence. Input is the number of loops to request. If no value is provided a loop of 1 is assumed. The function returns and expects a read_loop call to service the data which is delivered every 2-seconds per the documenation. I have found problems with higher numbered loops (>40 loops) and recommend the integrated get_one_loop() call instead and read a loop data packet at whatever rate you wish.

    $vp_obj->start_loop(10);

read_loop

Reads the LOOP data format as identified in Section IX Data Formats in the documentation. Note this only reads the later revision B loop format that is found in Vantage Pro devices after April 2002.

The data is returned via a reference to a hash.

    $vp_obj->start_loop();
    my $hsh_ref = $vp_obj->read_loop();

    # print out hash reference 
    print Dumper $hsh_ref; 

get_one_loop

Combines a start_loop and a read_loop and returns a data hash.

    my $hsh_ref = $vp_obj->get_one_loop();

I have not tested to see how fast this function can be called before the device chokes. It will run at a 2-second rep rate without a problem.

The Loop data packet has a value for the Next_Record. This can be monitored in a loop and used to trigger an event to read the archive via do_dmpaft.

make_date_time_stamp

Function to create a date and time stamp suitable for using in the dmpaft command. The function expects a list in the following order ($year, $mon, $mday, $hour, $min) and returns a date stamp and time stamp.

    my ($dstamp,$tstamp) = $vp_obj->make_date_time_stamp(2010,4,17,19,15);
 

do_dmpaft

Function to retrieve the archive data after a provided date and time stamp. Refer to the Davis documentation Section IX. Data Formats for the sub-section concerning DMP and DMPAFT data format.

Functions requires a date stamp and time stamp as detailed in the documenation or provided in the make_date_time_stamp function above.

The date/time stamp is returned in the archive record and you can save the last returned date/time stamp values to use in the next call to return archive data after that date/time stamp. Note the date/time stamp must match a date/time stamp in the archive memory or the whole 513 records will be returned. Also if no date/time stamp is provided the complete archive will be returned.

The returned value is a reference to a list of hashes, one hash for each archive record.

   my $ref = $vp_obj->do_dmpaft($dstamp,$tstamp); 
   unless ( @{$ref} ) { return 0 }
 
   foreach my $arc_ref ( @{$ref} ) 
   {
      # Do something with the hash reference.... 
          print Dumper $arc_ref; 
   } 

get_eeprom

Retrieve specific EEPROM configuration settings. Currently the following parameters are supported:

    ARCHIVE_PERIOD
    TIME_ZONE
    MANUAL_OR_AUTO
    DAYLIGHT_SAVINGS
    GMT_OFFSET
    GMT_OR_ZONE
    SETUP_BITS

The return value is the raw hex value from the unit, so needs to be decoded:

    my $rst = $self->get_eeprom('archive_period');
    my $archive_period = hex($rst->[0]);

get_setup_bits

Retrieve the setup of the device. Returns a hashref with the following keys:

    TimeMode
    IsAM
    MonthDayFormat
    WindCupSize
    RainCollectorSize
    Latitude
    Longitude

SEE ALSO

Refer to:

Vantage Pro and Vantage Pro2 Serial Communication Reference Manual Available at:

http://www.davisnet.com/support/weather/download/VantageSerialProtocolDocs_v230.pdf

Example of module being used at:

http://lpo.dt.navy.mil

Other related Perl modules that might be of interest....

Device::Davis - Low level read/write function vanprod - High-level integrated daemon package with lots of bells and whistles. However, no support for retrieving archive data or setting archive period.

PREREQUISITES

Device::SerialPort Time::HiRes use POSIX qw(:errno_h :fcntl_h strftime) use Time::Local

Except for Device::SerialPort the prerequisites should be loaded with a default install.

AUTHOR

Steve Troxel, troxel AT perlworks.com

COPYRIGHT AND LICENSE

Copyright (C) 2010 by Steve Troxel

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available.