Zur Darstellung der Messdaten verwendete ich das wetter.cgi aus dem Paket WS 2500 von Rainer Krinke.
Speziell für die Darstellung der Sonnenscheinwerte (sofern man bei dieser Station davon sprechen kann ) hat Rainer eine spezielle Version des wetter.cgi Scriptes geschrieben. Bei Bedarf einfach bei ihm Anfragen.
Der Konfigurationsteil aus dem Script für meine Station war:
# -------- START CONFIG VARIABLES ---------------------------------------------
#
$driver="mysql";
$sysDbName="mysql";
$dbServer="sqlhost";
$dbUser="sqluser";
$dbPassword="sqlpassword";
$database="database";
$defaultPort="3306";
# This variable controls if the *output* is in GMT or in Local time
# Internally very date and time value is in GMT. User input is converted to GMT.
$timeIsGMT=0; # This variable controls if the script time
# input as well as output is in
# GMT or in Local time. Internally every date and
# time value is in GMT. User input is converted
# to GMT if needed.
$colGrfxTable=2; # Number of columns in HTML table for graphics
$initialDisplayDays=7; # range ofdays to be initially displayed
$doAutoBaseData=185; # If the date range to be displayed has more than
# this number of days we automatically use average
# values on hourly basis for display. If you don't
# want this, set this variable to 0
$navPanelPos="top"; # Position where the navigation panel (Darstellungsparameter) is
# displayed. May be "top" (above graphics) or "bottom" (beneath graphics)
# If you assign a URL to this variable the target (should be a .css text file)
# is used to get all the css definitions instead of the internal definitions
# made below (search for variable $docCss). If you leave $externalCssUrl
# empty the internal definitions are used.
#$externalCssUrl="https://localhost/mypath/wetter.css";
#$externalCssUrl="";
# Unit of Windspeed to be displayed
# 0: km/h, 1: Knots, 10: Knots and Km/h
$latestWindSpeedType="0";
# TH=Temp/Hum; PR=Pressure; WI=Wind; LI=Light; RA=Rain; PY=Pyranometer
# Which sensor to display in Latest data section of display
# Only add Sensors you really have!!!
# eg: $latestSens="TH,PR,WI,RA,LI,LD";
# By default for each sensor the sensor with its default Id is used
# usually "1". If you want to display the latest data of another
# sensor (except for the type TH) with a
# different sensorId, then set the Variable %latestSensId like:
# $latestSensId{"RA"}=2
# meaning, that the rain sensor with the sensorId 2 will be displayed
# instead of the rain sensor with id 1. For a TH-sensor see $latest_th below.
#$latestSens="TH,WI,PR,RA,LI";
$latestSens="TH,WI,PR,RA,LD";
$latest_th=[1];
$latestSensId{"WI"}=30;
$latestSensId{"PR"}=20;
$latestSensId{"RA"}=40;
$latestSensId{"LD"}=50;
# If you secifies sensor type TH above, you can say here which T/H sensors
# should be displayed inlatest sensor display
$latest_th=[10,9,2,1];
#$latest_th=[10,9,2,1]; # LATEST T/H VALS only from inside sens (id: 17)
# You may list more ids here like
# $latest_th=[1,17,2,3,4,5,6,7,8]
# *** You HAVE TO specify sens ids that ***
# *** really exist ***
# Some options that can be used to display data that is calculated from the
# original data values. The value on the right side is a list of logical names
# that can be calculated like WindChill and Dewpoint.
# The latest_do variable defines for the sensor type and sensor id that is noted on
# the left side, what shall be calculated with which another additional sensor id
# noted on the right side. .
# So $latest_do->{"wind"}->{"1"}="WindChill(1)"; means that we want to display the
# windchill temperature for the windsensor with id 1, based on the temperature
# sensor (right side) with sensor id 1
# $latest_do->{"th"}->{"1"}="DewPoint,absHum"; means that we want to calculate
# dewpoint and the abolute humidity based on data of temp/hum sensor 1.
undef %latest_do;
#$latest_do->{"wind"}->{"1"}="WindChill(1)";
#$latest_do->{"th"}->{"1"}="DewPoint,absHum";
$latest_do{"30"}="WindChill(9)";
$latest_do{"9"}="DewPoint,absHum";
# This variable lets you omit some values from the latest data display of one sensor
# If you want eg not to display the Humidity value of a TH sensor but only the
# temperature in the latest data section of this sensor
# the following will do the job for a sensor with sensor id 1
# The value ("H") is the name of the database column to be omitted.
#$latest_omit{"1"}="H";
$latest_omit{"1"}="H";
# For rain and pressure sensors you can activate the trendData display. Doing this
# shows at *most* 3 older values from these sensors (as well as the current value anyway)
# in the latest display. Note: Only *3* values are allowed since there is no more room for more
# values. You have to specify the number of hours for each of the three values of each sensor.
# If you e.g. say: 1h,6h,12h this means that for this sensor the value one/six/12 hour(s) ago will be
# displayed. Please keep the format: eg "6h" not "6" nor "360Minutes"!!! If you do not want these
# values to be displayed say eg: $latest_trendRain=[ ];
$latest_trendRain=[ "1h", "12h", "24h" ];
$latest_trendPressure=[ "3h", "12h", "24h" ];
$latest_trendLight=[ "1h", "3h", "5h" ];
#
# Watch out this is for a trend sign (up or downarrow) for temperature/humidity
# sensors. The left value is the sensorid, the right value the time in *MINUTES*
# to look back in order to compare this value with the current one.
# So "17:10" means that for temp/hum sensor with id 17 we look for a value that
# is 10 minutes old. For each sensor only one value is allowed here.
# Be sure to choose a time that is long enough. If eg your station collects data at an
# interval of 15 minutes it does not make sense to use eg 10 minutes below.
# You can define it here for all sensors it will be used only for those you
# add below using addSensor()
$latest_trendTemp=[ "17:30", "1:30", "2:30", "3:30", "4:30", "5:30", "6:30", "7:30", "8:30"];
# The threshold values for sensors which show trends by an arrow sign. If the difference
# of the current value of such a sensor and an older value is larger than the first value
# given below an arrow (up or down) will be displayed.
# The values given below define ranges for the value difference. For example the
# values 0.1, 0.2, 0.4 define three ranges: 0.1->0.2[, 0.2->0.4[, 0.4 ->....
# Differencevalues smaller than the first value (here:0.1) will not be decorated
# with a trend sign. Depending on which range the current difference fits in, a different
# symbol for "small change", "more change" and "big change" will be displayed.
# Exactly three values a,b,c (defining three ranges) are allowed.
$latest_trendThresholdT=["0.1", "0.3", "0.5"]; # Tempdifference values little, some, a lot
$latest_trendThresholdH=["1", "3", "5"]; # Humidity difference
$latest_trendThresholdPres=["1", "2", "3"]; # Pressure difference
# The trend-symbol definition. There are three up and three down symbols that indicate
# a week, average and a strong thrend up or down.
$latest_trendSymbDown= ['<FONT color="black">↓</FONT>', # a little
'<FONT color="darkRed">↓</FONT>', # somewhat more
'<FONT color="red">↓</FONT>' ]; # a lot
#
$latest_trendSymbUp=['<FONT color="black">↑</FONT>', # a little
'<FONT color="darkRed">↑</FONT>', # somewhat more
'<FONT color="red">↑</FONT>' ]; # a lot
# You may choose if a trend symbol or the symbol and the difference value or
# only the difference value without a symbol should be printed.
$latest_trendSymbMode="symbol+value";
#$latest_trendSymbMode="symbol";
#$latest_trendSymbMode="value";
#
# The colors for different amounts of the difference. Corresponds to
# $latest_trendSymbDown[123] and $latest_trendSymbUp[123]
$latest_trendSymbTextCol=["black", "darkRed","red"];
# Relative text size: Allowed are values like -1, -2, ... which makes the text size
# used for printing the value one, two, ... steps smaller than regular text.
$latest_trendSymbTextSize="-2";
# This variable controls whether in the latest data output a sensors errors
# will be displayed. If its !=0 then if a sensor had more dropouts in the last
# hours (given by $latestAlertHours) the sensors name will be printed in
# the color $latestAlertColor, to show the user that this sensor had
# to much errors (==drop outs) in this period of time.
# The numbers of errors is taken from the error table in the database.
# So, for example
# you could say, that if any of sensors displayed in the latest data section
# had more than 10 errors in the last 12 hours then display its name in red:
#
$latestAlertErrCount=10;
$latestAlertHours=12; #
$latestAlertColor="red"; # Value has to be html conform
$tmpName="$$";
# Path where the created images are stored
#$basePath="/home/admin/www/wetter";
$basePath="/srv/www/htdocs/weather";
#$imgPath="$basePath/images";
$imgPath="$basePath/Graphiken";
# URL to access the images in Path "$imgPath" via the web-server
#$baseImgUrl="https://www.uni-koblenz.de/~krienke/wetter/images";
$baseImgUrl="https://ws500.dynalias.org/weather/Graphiken";
# Default Id for wether station. 1 ist the id for the first one
# You may add a different station ID to each individual sensor description
# created by addSensor() below by simply adding eg: "stationId" => 2
# to the addSensor call.
$defaultStationId=1;
# Next you define all the sensor graphics that will be displayed in a HTML table
# For each sensor you want to add, you have to write down a addSensor() call
# with appropriate paramters. Bevor the first call to addSensor() you have to create
# an object of Class "sensDisplayData". This is done by exactly using the first line
# see below) with sensDisplayData->new() before the first addSensor() demo call.
# This has to be done excatly ONE time, and then you can place calls to addSensor()
# using the just created object. The minimum of information in the first parameter
# (the first hash, surrounded by {}) in addSensor() is the sensor
# type which may be one of TH, PR, WI, WD, WA, RA, LI.
# TH is a Temperature Himidity display
# PR is the air pressure display
# WI is the wind display sowing the windspeed over time
# WD is the wind display, showing the direction and speed in a polar
# coordinate system
# WA is the winddisplay showing the winddirection and varince over time
# LI is the light display.
#All Parameters are given in a anonymous
# hash ({"NAME1"=>"value1", "NAME2"="VALUE2", ...}). Besides the type of sensor you
# can specify all the parameters defined in the set??defaults() functions defined below,
# where ?? is one of the Types from above (TH, ...). You probably want to specify
# the sensorid of the sensor to be displayed, else the default sensorId for each
# type is used. To specify one or more sensorids for one graphics simply add
# the ids like {"sensType"=>"TH", "sensIds" => [1,2,17]}. This example would then
# display T/H sensors with id 1,2 and 17 in one graphic.
# Especially for TH sensors where temperature and humidity can be printed
# it might be useful to be able to display just one of both or even none of
# both but just the windchill value (a virtual sensor) based on this sensor.
# To do so just set the omit array to the values that should not be printed. eg:
# "omit"=>["T", "H"] would not display temp and hum of a TH sensor. So if there was no
# virtual sensor defined you would'nt see anything but an error message the there are
# no output values to be displayed! So always take care that there is at least one value left
# one of a T, H value or a virtual sensor value.
#
# For some sensors it might be useful to let gnuplot automatically calculate
# the Y-range. Usually the lower value is set by the script to a fix value.
# For TH-Sensors this is eg 0". If you would like to let gnuplot
# determine the Y bounds by itself set "lowYbounds"=>"auto" in the
# addsensor() call like shown below.
#
# If you do not like the default sizes of the graphics you can modify them for each sensor
# by adding non default values to the addSensorCall like
#$sensorData->addSensor( {"sensType" => "TH", "sensIds" => [3]},
# "xSmallScale"=>0.75, "ySmallScale"=>0.75,
# "xNormalScale"=>1.5, "yNormalScale"=>1.5,
# { } );
# the Smallscale Variables desscribes the relative size of a graphic in the overview, whereas
# the NormalScale Variables determine the relative size in the detailed sensor graphics
# The default for SmallScale is 0.5, the default for NormalScale is 1.1. These values are multiplied
# with the default width/height that gnuplot generates. So a value of 0.5 means "half of the normal size"
# The "normal" size is given by what gnuplot generates for the PNG terminal.
#
# By default all sensors (exepct WA, WD) defined by addSensor() will also be used in the
# statisticsMode. This may lead to a strange looking statistics table in
# case that one real sensor is shown in two graphics for example with
# different virtual sensor values. In the statistics display this would lead to the fact
# that the same sensor beeing shown twice with the same statistic values since
# the statistic display only shows stats of real sensor values not of virtual.
# If a sensor that is defined by addSensor shall NOT be visible in the statistics overview
# then one may set the attribute "statistics" => "0" like this:
#
#$sensorData->addSensor( {"sensType" => "TH", "sensIds" => [3]},
# "statistics"=>"0",
# "xSmallScale"=>0.75, "ySmallScale"=>0.75,
# "xNormalScale"=>1.5, "yNormalScale"=>1.5,
# { } );
#
# It is even possible to define sensors only for statistic evaluation that will
# never be displayed in a graphics. This can be done by setting the "graphics"
# flag to "0" like in:
#
#$sensorData->addSensor( {"sensType" => "TH", "sensIds" => [3]},
# "graphics"=>"0", {} );
#
# In this case the sensor will not be visible as a graphics but will appear in the
# statistics display.
#
# In such a case the sensor is shown in the graphics mode but is hidden in the
# statistics mode.
#
# The addSensor() function actually has two Parameters. The first one has been descibed just above.
# The second one describes which virtual sensors (if there are any defined in the
# set*defaults() functions) should be active.
# At the moment only for TH-sensors there are virtual sensors for windchill,
# absolute humidity and dewpoint calculation. To activate one of them for a
# TH-sensor the second parameter for addSensor() is a hash like:
# {"windChill" =>"1", "absHumidity"=>"1", "dewPoint" =>"1" }
# In this hash virtual sensors can be turned on by assigning them a "1" as showed above.
# If left undefined ({}) or even omitted no virtual sensors will be displayed.
# Please take care of the spelling of the virtual sensor names given above
# Only one or all in the three (windChill, absHumidity, dewPoint) can be used.
#
# The wind sensor can be configured to plot data in kts instead of km/h
# To do so simply put the directive "windSpeedType"=>1 in the definition of the windsensor.
# The example below. "windSpeedType"=>0 is the default and means plot in km/h.
# You can set this option for every WI (Windspeed) and WD (Winddirection/speed)
# plot type individually.
#
# Attention. Either define the sensors here NOT using a config file or
# comment out the demo defs below and put the real definitions into
# your config file. But DONT put addSensor()-calls and the creation of
# the sensDisplayData object in both the script and
# your config file, since this will result in nonesense or even an error!
# Values you might find useful to change are marked as USER in function
# setTHdefaults(). The same is of course true for the other sensor types not
# only for T/H.
#$sensorData=sensDisplayData->new($imgPath, $baseImgUrl, $tmpName);
#
#$sensorData->addSensor( {"sensType" => "TH", "sensIds" => [17,2],
# "grfxName" => "My graphics Name"},
# "lowYbounds"=>"auto",
# { } ); # No virtual sensors activated
#
# Now we want to define a TH sensor with virtual sensors windChill and
# dewPoint activated:
#$sensorData->addSensor( {"sensType" => "TH", "sensIds" => [1]},
# {"windChill" =>"1", "dewPoint" =>"1" } ); # Virtual Sensors
# The same like above but we only want to print the virtual sensor values
# not temperature or Humidity
#$sensorData->addSensor( {"sensType" => "TH", "sensIds" => [1], "omit"=>["T", "H"] },
# {"windChill" =>"1", "dewPoint" =>"1" } ); # Virtual Sensors
#
# Defined a TH sensor with sensid 3 but do not activate any virtual sensors
# for it, so only temp and humidity will be displayed
#$sensorData->addSensor( {"sensType" => "TH", "sensIds" => [3]}, { } );
#$sensorData->addSensor( {"sensType" => "PR"}, {} );
#$sensorData->addSensor( {"sensType" => "WI"}, {} ); # Plot unit is km/h
#$sensorData->addSensor( {"sensType" => "WI", "windSpeedType"=>1}, {} ); # Plot unit is kts
#$sensorData->addSensor( {"sensType" => "WI"}, {} );
#$sensorData->addSensor( {"sensType" => "RA"}, {} );
#$sensorData->addSensor( {"sensType" => "WD"}, {} );
#$sensorData->addSensor( {"sensType" => "WA"}, {} );
#$sensorData->addSensor( {"sensType" => "LI"}, {} );
$sensorData=sensDisplayData->new($imgPath, $baseImgUrl, $tmpName);
$tmp=$sensorData->addSensor( {"sensType"=>"TH", "sensIds"=>[9], "grfxName" => "Temperatur/Feuchte Außen (in 2m Höhe)"},
{"dewPoint"=>"1"} );
$sensorData->setVirtSensAttrib($tmp, "dewPoint", "doPrintMma", 2);
#$sensorData->addSensor( {"sensType" => "TH", "sensIds" => [1], "statistics"=>"0", "grfxName" => "Außentemperatur (-80cm)" }, { } );
$tmp=$sensorData->addSensor( {"sensType"=>"TH", "sensIds"=>[9], "omit"=>["H"], "mmaOmit"=>["H"], "statistics" => "0", "grfxName" =>
"Temp/Windchill Außen/Feuchte"}, {"windChill" =>"1", "absHumidity"=>"1", });
$sensorData->setVirtSensAttrib($tmp, "absHumidity", "doPrintMma", 2);
$sensorData->setVirtSensAttrib($tmp, "windChill", "doPrintMma", 2);
$tmp=$sensorData->addSensor( {"sensType"=>"TH", "sensIds"=>[2], "statistics" => "0", "grfxName" =>
"Temperatur/Feuchte Saustall"}, {"absHumidity"=>"1", });
$tmp=$sensorData->addSensor( {"sensType"=>"TH", "sensIds"=>[10], "statistics" => "0", "grfxName" =>
"Temperatur/Feuchte Innen"}, {"absHumidity"=>"1", });
$sensorData->setVirtSensAttrib($tmp, "absHumidity", "doPrintMma", 2);
$sensorData->addSensor( {"sensType" => "PR", "sensIds" => [20], "lowYbounds"=>"auto", "grfxName" => "rel. Luftdruck" }, { } );
#$sensorData->addSensor( {"sensType" => "LI", "sensIds" => [50], "lowYbounds"=>"auto", "grfxName" => "Sonnenschein" }, { } );
$sensorData->addSensor( {"sensType"=>"LD", "sensIds"=>[50]}, {} );
$sensorData->addSensor( {"sensType" => "RA", "sensIds" => [40], "lowYbounds"=>"auto", "grfxName" => "Niederschläge" }, { } );
$sensorData->addSensor( {"sensType" => "WI", "sensIds" => [30], "lowYbounds"=>"auto", "grfxName" => "Windgeschwindigkeiten" }, { } );
$sensorData->addSensor( {"sensType" => "WD", "sensIds" => [30], "lowYbounds"=>"auto", "grfxName" => "Windgeschwindigkeiten / -richtungen" }, { } );
$sensorData->addSensor( {"sensType" => "WA", "sensIds" => [30], "grfxName" => "Windrichtungen / -schwankungen" }, { } );
$position="Standort: Pliening, 502m über NN.\n";
$pageTitle="Wetterdaten aus PLIENING";
$pageAuthors='krienke@uni-koblenz.de,tdressler@tdressler.net,joerg@alcatraz.shacknet.nu,philip.marien@pandora.be';
$pageDescription="linux ws500 based weather data display";
#$position="Standort: Koblenz Lay, 125m über NN.\n";
#$pageTitle="Wetterdaten aus Koblenz";
#$pageAuthors='krienke@uni-koblenz.de,tdressler@tdressler.net,joerg@alcatraz.shacknet.nu,philip.marien@pandora.be';
#$pageDescription="linux ws2500 based weather data display";
# Your contact address
$contact='Kontakt: Django <A href="mailto:django@mnet-mail.de">django@mnet-mail.de</A>';
$pageMetaKeywords="wetter, Pliening";
$pageBackgroundPicture="../wetter/sky.jpg";
#$contact='Kontakt: Mr. X <A href="mailto:mrx@y.de">mrx@y.de</A>';
#$pageMetaKeywords="wetter, Koblenz";
#$pageBackgroundPicture="sky.jpg";
$pageBackgroundColor="#F0F8FF";
$pageTextColor="#000000";
$pageLinkColor="red";
$pageVisitedLinkColor="blue";
# Gnuplot background colors for graphics
$bgColorNormal="xEAF0FF";
$bgColorAverage="xE3e8F8";
# DST config, values are set by checkDst() no need to change this
$dstStart="2004-03-29 02:00:00"; # When dst starts
$deltaIsDst=2; # Difference in h from GMT->DST time
$dstEnd="2004-10-31 03:00:00"; # When DST ends
$deltaNoDst=1; # Difference in h from GMT-> localtime
# Some queries may be optimized by using SQL subqueries. Subqueries are
# available since MYSQL Server Version 4.1. They seem to work really
# efficiently starting with MYSQL 5.0
# The variable below determines if the script should use subqueries
# for MMA determination. Usually this variable is set automatically
# to 0 or 1 depending on the MYSQL server version. If this is > 5.0 it
# is set to 1 else to 0. You can however overwrite this automatic here by
# manually setting this variable to either 0 or 1.
# If you want to use the automatic
# setting put a comment sign (#) at the beginning of the line.
# Note: You need at leaset MYSQL version 4.1 if you want to use subqueries
# else you will see SQL errors.
# $useSqlSubQueries=1;
# *** You can copy all the variables between START CONFIG and END CONFIG
# *** into a file that can be reached by your web-server unter the path
# *** given below in $configpath. $configPath is set to the value of the
# *** scriptname (eg wetter.cgi) with ".conf" appended. The scriptname
# *** and path are retrieved from the webservers environment variable
# *** named SCRIPT_FILENAME. apache on linux does provide this variable.
# *** If the given file exists and is readable
# *** the scripts config will be read from there overriding the variables
# *** set above. So then you do not have to modify
# *** further entries in the script itself e.g. for new versions.
# *** Take care that your config file contains a valid perl-script if
# *** unsure use perl -c wetter.cgi.conf to check the syntax, because
# *** running wetter.cgi you won't see an error if your config file is
# *** wrong!!!!! You will just see, that wetter.cgi is not showing any
# *** output.
# *** Please take care that your config file is readable only by you and your
# *** web server but not to anyone else!
# *** If this method fails you can still hard code a value for
# *** $configPath in the last else-branch of the if staement.
# R.K.
#
#$scriptBasename=`basename $0`;
#chomp($scriptBasename);
#if( defined($ENV{"SCRIPT_FILENAME"}) && -r $ENV{"SCRIPT_FILENAME"} ){
# $configPath=$ENV{"SCRIPT_FILENAME"}. ".conf";
#}elsif( defined($ENV{"SCRIPT_NAME"}) && -r $ENV{"SCRIPT_NAME"} ){
# $configPath=$ENV{"SCRIPT_NAME"} . ".conf";
#}else{
# if( -r "${scriptBasename}.conf" ){
# $configPath="${scriptBasename}.conf"
# }elsif(-r "/etc/ws2500/wetter.cgi.conf" ){
# $configPath="/etc/ws2500/wetter.cgi.conf";
# }else{
# $configPath="/home/krienke/wetter/wetter.cgi.conf"
# }
#}
$scriptBasename=`basename $0`;
chomp($scriptBasename);
if( defined($ENV{"SCRIPT_FILENAME"}) && -r $ENV{"SCRIPT_FILENAME"} ){
$configPath=$ENV{"SCRIPT_FILENAME"}. ".conf";
}elsif( defined($ENV{"SCRIPT_NAME"}) && -r $ENV{"SCRIPT_NAME"} ){
$configPath=$ENV{"SCRIPT_NAME"} . ".conf";
}else{
if( -r "${scriptBasename}.conf" ){
$configPath="${scriptBasename}.conf"
}elsif(-r "/etc/ws2500/wetter.cgi.conf" ){
$configPath="/etc/ws2500/wetter.cgi.conf";
}else{
$configPath="/home/krienke/wetter/wetter.cgi.conf"
}
}
#
# -------- END CONFIG VARIABLES ---------------------------------------------