Olen rakentanut ubuntu 8.04 (hardy) palvelimen, joka mittaa maidontuottajalle maitosäiliön lämpötilaa tunnin välein, lokitiedostoihin vuorokausittain ja kuukausittain sekä MYSQL tietokantaan 10 min välein, joita voi tutkia palvelimessa olevalla DTGRAPH sovellutuksella.
Palvelin toimii suht. moitteettomasti. Ongelma on eniten se, ettei kone käynnisty täysin takuuvarmasti kuukausien kuluessa ilman tarkkailua. Nähtävästi kiintolevyn tarkistus jää kysymään käyttäjältä mitä tehdään, eikä se käy palvelimessa johon ei olla yhteydessä kuin tiedon tulostuksen yhteydessä. Toinen ongelma on anturin
DS18S20+ erottelukyky.
http://datasheets.maxim-ic.com/en/ds/DS18S20.pdf Sen pienin mahdollinen esitystarkkuus on käytännössä 0,5 astetta.
Parannusehdotuksia kaipaan.
Ensinnäkin kelpaako anturi DS18B20 ilman mitään muutoksia kunhan vain vaihdetaan? TODNÄK käy.
datasivu:
http://datasheets.maxim-ic.com/en/ds/DS18B20.pdfTämän erottelukyky on kuitenkin binäärinä 0.0625 astetta (oletusresoluutio on 12 bittiä virran kytkeytyessä), kun aiemmassa se on 0,5 astetta (9 bittiä).
Ero on varsin merkittävä.
Pastaan tähän skriptit + infoa. Skriptien ajastus on asetettu webminin osiossa "System" --> "Scheduled Cron Jobs".
konfiguraatiot lokeja varten:
digitemp-kk-lokiin.conf:
TTY /dev/ttyS0
LOG_TYPE 1
LOG_FILE /var/www/LOKI/kuluva-kk/data.txt
LOG_FORMAT "<CENTER>%d.%m.%Y klo: %H:%M -- <B> %.1C </B> astetta.</CENTER>"
SENSORS 1
ROM 0 0x10 0xBA 0x4D 0x83 0x01 0x08 0x00 0xBA
digitemp-pvm-lokiin.conf
TTY /dev/ttyS0
LOG_TYPE 1
LOG_FILE /var/www/LOKI/kuluva-pv/data.txt
LOG_FORMAT "<CENTER>%d.%m.%Y klo: %H:%M -- <B> %.1C </B> astetta.</CENTER>"
SENSORS 1
ROM 0 0x10 0xBA 0x4D 0x83 0x01 0x08 0x00 0xBA
Siirtoskriptit:
kuukausilokille:
#!/bin/bash
perushakemisto=/var/www/LOKI/HISTORIA/
mkdir $perushakemisto
ToinenOsa=$(date +kuukausi-lokit-%Y)/
mkdir $perushakemisto$ToinenOsa
loppuosa=$perushakemisto$ToinenOsa$(date +%m)$(date +-%Y)/
mkdir $loppuosa
cp /var/www/LOKI/kuluva-pv/index.php /var/www/LOKI/kuluva-kk/
mv /var/www/LOKI/kuluva-kk/data.txt $loppuosa
cp /var/www/LOKI/kuluva-kk/index.php $loppuosa
exit 0
päiväkohtaiselle lokille:
#!/bin/bash
perushakemisto=/var/www/LOKI/HISTORIA/
mkdir $perushakemisto
vuosihakemisto=$perushakemisto$(date +pvm-lokit-%Y)/
mkdir $vuosihakemisto
KKhakemisto=$vuosihakemisto$(date +%m-%Y)/
mkdir $KKhakemisto
PVhakemisto=$KKhakemisto$(date +%d-%m-%Y)/
mkdir $PVhakemisto
mv /var/www/LOKI/kuluva-pv/data.txt $PVhakemisto
cp /var/www/LOKI/kuluva-pv/index.php $PVhakemisto
exit 0
Konfiguraatio MYSQL tietokannalle:
digitemp-mysql.conf
TTY /dev/ttyS0
LOG_TYPE 1
SENSORS 1
ROM 0 0x10 0xBA 0x4D 0x83 0x01 0x08 0x00 0xBA
Tietokannan kirjausskripti:
digitemp_mysql.pl
#!/usr/bin/perl -W
# DigiTemp MySQL logging script
# Copyright 2002 by Brian C. Lane <bcl@brianlane.com>
# All Rights Reserved
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
#
# -------------------------[ HISTORY ]-------------------------------------
# 08/18/2002 Putting together this MySQL logging script for the new
# bcl release of DigiTemp.
#
# -------------------------------------------------------------------------
#CREATE table digitemp (
# dtKey int(11) NOT NULL auto_increment,
# time timestamp NOT NULL,
# SerialNumber varchar(17) NOT NULL,
# Fahrenheit decimal(3,2) NOT NULL,
# PRIMARY KEY (dtKey),
# KEY serial_key (SerialNumber),
# KEY time_key (time)
# );
# GRANT SELECT,INSERT ON digitemp.* TO dt_logger@localhost;
# IDENTIFIED BY '';
#
# -------------------------------------------------------------------------
use DBI;
# Database info
my $db_name = "stats";
my $db_user = "dtgraph";
my $db_pass = "";
# The DigiTemp Configuration file to use
my $digitemp_rcfile = "/usr/digitemp-mysql.conf";
my $digitemp_binary = "/usr/bin/digitemp";
# EDELLINEN OLI /usr/local/bin/digitemp JA ON NYT MUUTETTU!
my $debug = 0;
my $var1 = shift;
if (defined($var1) && $var1 eq 'debug') {
$debug = 1;
print "Debug moodi on nyt päällä\n";
}
# Connect to the database
my $dbh = DBI->connect("dbi:mysql:$db_name","$db_user","$db_pass")
or die "I cannot connect to dbi:mysql:$db_name as $db_user - $DBI::errstr\n";
# Gather information from DigiTemp
# Read the output from digitemp
# Output in form SerialNumber<SPACE>Temperature in Fahrenheit
# -------------------------------------------------------------------------------------------------------
#print "Starttaan digitemp -ohjelman...\n";
open( DIGITEMP, "$digitemp_binary -q -a -o\"%R %.2F\" -c $digitemp_rcfile |" );
#print "Alan lukea asteet portista\n";
while( <DIGITEMP> )
{
print "$_\n" if($debug);
chomp;
($serialnumber,$temperature) = split(/ /);
#Safety limits: erroneous data tends to be very high or very low
#This usually happens when the sensor is having trouble (water, bad connection)
if ($temperature < -80 || $temperature > 180) {
print "Erroneous data for $serialnumber: $temperature ... Skipping";
#continue;
} else {
$sql="INSERT INTO digitemp SET SerialNumber='$serialnumber',Fahrenheit=$temperature";
print "SQL: $sql\n" if($debug);
$dbh->do($sql) or die "Can't execute statement $sql because: $DBI::errstr";
}
}
close( DIGITEMP );
$dbh->disconnect;
Ehdollinen uudelleenkäynnistys koko koneelle:
(uudelleenkäynnistys toteutuu mikäli kumpaa tahansa lokitiedostoa on muokattu viimeksi yli 3 tuntia sitten)
#!/bin/bash
if [ -f /var/www/LOKI/kuluva-pv/data.txt ] && [ -f /var/www/LOKI/kuluva-kk/data.txt ];
then
# molemmat ovat olemassa ja ovat tiedostoina.
pvlokiviive=$(stat -c %Y /var/www/LOKI/kuluva-pv/data.txt)
kklokiviive=$(stat -c %Y /var/www/LOKI/kuluva-kk/data.txt)
nyt=$(date +%s)
pverotus=$(($nyt - $pvlokiviive))
kkerotus=$(($nyt - $kklokiviive))
# sekunteina kolme tuntia on 10800
max=10800
function uusitarttaus {
echo Kirjaan vikalokiin ja käynnistän koko koneen uudelleen nyt.
vikalokiwriter.cgi
kirjaa-loki.sh
echo odotan 10 sekuntia ja sit reboot
sleep 10
reboot
}
if [ $pverotus -gt $max ];
then
echo
echo Päiväloki on $pverotus sekuntia vanha. maksimi on $max
echo
echo kk-loki kirjattu $kkerotus sekuntia sitten.
echo pv-loki kirjattu $pverotus sekuntia sitten.
uusitarttaus
elif [ $kkerotus -gt $max ];
then
echo
echo Kuukausiloki on $kkerotus sekuntia vanha. maksimi on $max
echo
echo kk-loki kirjattu $kkerotus sekuntia sitten.
echo pv-loki kirjattu $pverotus sekuntia sitten.
uusitarttaus
else
echo
echo kk-loki kirjattu $kkerotus sekuntia sitten.
echo pv-loki kirjattu $pverotus sekuntia sitten.
echo Jos $max sekuntia ylittyy, palvelin käynnistyy uudelleen.
echo
#digitemp -a -q -o"pvm: %d.%m.%Y ---- klo: %H:%M ----- %.1C astetta "
echo
fi
else
echo AINAKIN TOINEN KIRJAUSLOKI PUUTTUU. SUORITAN YLIMÄÄRÄISEN MITTAUKSEN KUMPAANKIN LOKIIN.
kirjaa-loki.sh
fi
Seuraava skripti sattuu olemaan PHP toteutus, koska en viitsinyt alkaa rakentamaan samasta bash versiota.
vikalokiwriter.cgi
#!/usr/bin/php
<?php
$pvdata = "/var/www/LOKI/kuluva-pv/data.txt"; // esittely
//jatketaan tiedon keruuta, jos tiedosto on olemassa
if (file_exists($pvdata)) {
//luetaan tiedoston muokkausaika, sekä lasketaan sen ja nykyhetken erotus
$muokkausaika = filemtime($pvdata);
$nyt_aika = date("U");
$erotus = ("$nyt_aika" - "$muokkausaika");
// luodaan kokonaislukumuuttujat aikaa varten
$vuorokausina = (integer) ("$erotus" / 86400); // valmis kokonaisluku
$tunteina = (integer) (("$erotus" % 86400) / 3600); // valmis kokonaisluku
$minuutteina = (integer) (("$erotus" % 3600) / 60); // valmis kokonaisluku
$sekunteina = (integer) (("$erotus" % 60) / 1); // valmis kokonaisluku
// tämän tiedoston suoritusta ei ole ajastettu.
// tämän tiedoston suorittaa vain /usr/bin/ehdollinen-reboot.sh
// seuraava ehto on poistettu siksi, että tämä tiedosto lisää vikalokiin tekstiä
// aina, kun tämä suoritetaan.
// if (($erotus) > 10800) { // onko muokattu yli kolme tuntia sitten (= 10800 sekuntia)
{
//jatketaan, jos vikaloki.txt on olemassa
if (file_exists("/var/www/vikaloki/vikaloki.txt")) {
//avataan vikaloki kirjoitustilassa ja kirjoitus aloitetaan tiedoston lopusta.
$vikalokifile = fopen("/var/www/vikaloki/vikaloki.txt", "a");
//kirjoitetaan tiedostoon tietorivi; \n tarkoittaa rivinvaihtoa
fwrite($vikalokifile, "Aika: ".date("d.m.Y H:i:s")." - Vian kesto: $vuorokausina vrk $tunteina h $minuutteina min $sekunteina s.\n Palvelin käynnistetty uudelleen.\n\n");
//suljetaan tiedosto
fclose($vikalokifile);
}
}}
?>
kirjaa-loki.sh
digitemp -a -q -c /etc/digitemp-pvm-lokiin.conf -o"%d.%m.%Y klo: %H:%M %.1C "
digitemp -a -q -c /etc/digitemp-kk-lokiin.conf -o"%d.%m.%Y klo: %H:%M %.1C "
Lokitiedoston muotoileva PHP-sivu (kopioidaan lokisiirtojen yhteydessä kohdehakemistoihin):
index.php
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15">
<TITLE>Tilatankin Lämpötila</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER><TT>
<B><FONT style="color: #000000;background: #BFBFFF;">0,5 °C ja alle</FONT></NOBRT></B>
<B><FONT style="color: #000000;background: #BFFFBF;">0,5 ... 1,9 °C</FONT></NOBRT></B>
<B><FONT style="color: #000000;background: #FFFFBF;">2,0 ... 3,4 °C</FONT></NOBRT></B>
<B><FONT style="color: #000000;background: #FFBFBF;">3,5 °C ja yli</FONT></NOBRT></B>
</CENTER></TT>
<BR>
<CENTER>
<H5>Tilatankin Lämpötilat:<BR>
<BR>
Matti Meikäläinen<BR></H5>
</CENTER>
<?php
//käsiteltävä tiedosto
$tiedosto = "data.txt";
//jatketaan, jos tiedosto on olemassa
if (file_exists($tiedosto)) {
//luetaan tiedoston muokkausaika muuttujaan
$kirjoitusaika = filemtime($tiedosto);
//avataan tiedosto lukutilassa
$tekstirivi = fopen($tiedosto, "r");
//nollataan rivinumerolaskuri
$i = 0;
echo "<TT><CENTER>\n";
//luetaan rivejä, kunnes tiedosto loppuu
while (!feof($tekstirivi)) {
//luetaan rivin teksti muuttujaan $rivi
$rivi = fgets($tekstirivi, 100);
// luetaan rivistä tiedot lämpötilasta ja ajasta omiin muuttujiin
$lampotila = substr("$rivi", 24, 4); // Antaa rivin alusta lukien merkit 24, 25, 26 ja 27.
$aika = substr("$rivi", 0, 21); // Antaa riviltä merkit rivin alusta aina 21:een.
//rivin tulostus alkaa
// tarkistan lämpötilan olemassaolon eka
if ($lampotila) { // vasta nyt tulostan
if ($lampotila >= 3.5) { // punaisella
echo "<NOBRT><BR>$aika - <B>",'<FONT style="color: #000000;background: #FFBFBF;">',"$lampotila &#176;C</FONT></NOBRT></B>\n";
} // punainen loppuu
if (($lampotila >= 2.0) and ($lampotila < 3.5)) { // keltaisella
echo "<NOBRT><BR>$aika - <B>",'<FONT style="color: #000000;background: #FFFFBF;">',"$lampotila &#176;C</FONT></NOBRT></B>\n";
} // keltaisen loppu
if (($lampotila >= 0.5) and ($lampotila < 2.0)) { // vihrealla
echo "<NOBRT><BR>$aika - <B>",'<FONT style="color: #000000;background: #BFFFBF;">',"$lampotila &#176;C</FONT></NOBRT></B>\n";
} // vihrean loppu
if ($lampotila < 0.5) { // sininen
echo "<NOBRT><BR>$aika - <B>",'<FONT style="color: #000000;background: #BFBFFF;">',"$lampotila &#176;C</FONT></NOBRT></B>\n";
} // sininen
} // lämpötilan olemassaolon tarkistuksen päättyminen
//kasvatetaan laskuria
$i++;
}
echo "</TT></CENTER>\n\n";
//tulostetaan viimeinen tallennushetki
// echo "<CENTER><H6>Tuorein lokimuutos: " . date("d.m.Y H:i:s", $kirjoitusaika). ".<BR></H6></CENTER>";
// echo "<CENTER><TT>muotoilu p&#228;ivitetty ".date("d.m.Y H:i:s", (filemtime("index.php")))."</TT></CENTER>";
// ei tiedä toimiiko edellinen kun tätä sivua kopioidaan lokiin.
//suljetaan tiedosto
fclose($tekstirivi);
} else {
echo "<TT><CENTER>Tiedostoa data.txt ei ole olemassa t&#228;ss&#228; hakemistossa.</CENTER></TT>";
echo "<TT><CENTER>T&#228;h&#228;n hakemistoon ei ole tallennettu l&#228;mp&#246;tilatietoja.</CENTER></TT>";
}
?>
<CENTER><H5><TT>
<a href="data.txt" title="Tästä linkistä muotoilematon raakaloki" onmouseover="self.status='Tästä linkistä muotoilematon raakaloki'; return true">data.txt</a>
</TT></H5></CENTER><BR>
</BODY>
</HTML>
lokilähde, jota muotoillaan:
data.txt
03.04.2009 klo: 17:00 -1.2
03.04.2009 klo: 18:00 0.0
03.04.2009 klo: 19:00 0.1
03.04.2009 klo: 00:00 0.7
03.04.2009 klo: 01:00 0.8
03.04.2009 klo: 02:00 1.2
03.04.2009 klo: 12:00 2.0
03.04.2009 klo: 13:00 3.4
03.04.2009 klo: 14:00 4.8
03.04.2009 klo: 15:00 1.0
03.04.2009 klo: 16:00 6.2
03.04.2009 klo: 00:00 0.7