Kirjoittaja Aihe: digitemp ja www  (Luettu 6934 kertaa)

mihatsu

  • Käyttäjä
  • Viestejä: 77
    • Profiili
digitemp ja www
« : 09.07.06 - klo:16.21 »
Hei

Tein tuossa ubuntu serverille sääaseman joka mittaa lämpötilat ja piirtää käppyrät niistä www:lle. Ohjelmina käytän digitemppiä ja rrdtoolia käppyröiden piirtämiseen. Käppyrät tulostuu nyt oikein ja nyt pitäisi saada vain nettisivulle sen hetkinen lämpötila. Mulla on valmis www sivu jossa päivän, viikon ja kk:n käppyröistä kuvat. Kuvat päivittyy 5min välkein. Tietääkö joku saako tuolla rrdtoolilla tulostettua viimeinen arvo jotenkin kuvana? Vai pitääkö alkaa tekemään sen hetkisen lämpötilan näyttö jotenkin muuten? Jos komentokehtotteessa antaa käskyn

serveri:/var/www/saa# digitemp_DS9097 -a -q -c /home/mihatsu/.digitemprc
0       25.69

Olisiko tuo 25,68 arvo mahdollista kirjoittaa siihen html sivuun tiettyyn paikkaan jollain scriptillä ja sitten se scripti ajettas vaikka 5 min välein?

Tietenkin jos tuolta rrdtoolilla sais homman toteutettua niin että siitä sais vaikka sen hetkisen lämmön numeroina ja lisäksi vaikka viikon ja kk:n korkeimman ja matalimman lämmön niin ois hyvä mutta onko se edes mahdollista tuolla ohjelmalla?

Mika

raimo

  • Käyttäjä
  • Viestejä: 4269
  • openSUSE Tumbleweed
    • Profiili
Re: digitemp ja www
« Vastaus #1 : 09.07.06 - klo:17.48 »
Ko. ohjelmista en tiedä mitään...

Mutta onko serveri omasi?
Lähinnä siksi utelen että pitäisi tietää mitä tekniikoita on käytettävissä (PHP?, SSI?, Perl?)
Omalla serverillä tietenkin on mahdollisisia kaikki tekniikat mitä on olemassa. ;)

Minä tekisin tuon Perl-skriptillä, jonka sitten yllättäen JavaScriptillä (AJAX) ajaisin,
jolloin saadaan täysin vilkkumaton toiminta. Tosin onnistuu se PHP:lläkin.

AJAX siksi että sillä on helppo muuttaa sivua lataamatta sitä kokonaan uudelleen.
Kuvaksi ko asian saa imagemagickillä, jota jälleen ajettaisiin Perlistä käsin.

Yksi  vaihtoehto (helpoin) on SSI, jolla pystyy ajamaan komentoja sivulta käsin,
mutta ei sitä sillä saa päivittymään itsestään: ts. päivittyy vain kun sivu ladataan.
SSI:llä se menisi ihan näinkin helposti:
Koodia: [Valitse]
<!--#exec cmd="digitemp_DS9097 -a -q -c /home/mihatsu/.digitemprc 0" -->
(kuuluuko tuo 0 ko. komentoon?)
Jolloin ko. lämpö tai mikä hyvänään tulostuu sivulle sille kohdalle jossa tuo höpötys on.
Apachessa pitää olla mod_include käytössä, ja sivu pitää olla *.shtml (perusasetuksilla) jotta tuo toimii.

Mutta siis AJAX ja Perl, jolloin komento ajetaan Perl-skriptillä joka käynnistetään Javascript -ajastimella.
Rakentelen joutessani pienen esmerkin, joten stay tuned... ;)


Tietä käyden tien on vanki. Vapaa on vain umpihanki.
Aaro Hellaakoski

mihatsu

  • Käyttäjä
  • Viestejä: 77
    • Profiili
Re: digitemp ja www
« Vastaus #2 : 09.07.06 - klo:19.04 »
Kyllä serveri on oma joten voin säätää sitä miten vain. Rajoitteena on ennemminkin osaaminen. Kun olen lueskellut noita sivuja niin aika moni on toteuttanut tuon homman myslillä ja sitten www hakee ne arvot sieltä. Mutta tosiaan kun en osaa niin tämän hetkinen tarve on tuo sen hetken lämpötila vain. Käppyrät tulostuu tällä hetkelleä tällä scriptillä.

#<pre>
#!/bin/bash

# DigiTemp RRD logging script
# Copyright 1997-2002 by Brian C. Lane <bcl@brianlane.com> www.brianlane.com

# Get the current temperatures, digitemp has been previously initalized with
# digitemp -i -s /dev/ttyS0 -o2 -a

# Run it in quiet mode, output is 0\tsensor#1\tsensor#2\tsensor#3

#reading=`/usr/bin/digitemp_DS9097 -a -q`
reading=`/usr/bin/digitemp_DS9097 -a -q -c /home/mihatsu/.digitemprc`

# Diagnostic output
sensor1=`echo $reading | gawk '{print $2}'`

# Update the database
/usr/bin/rrdtool update /var/www/saa/digitemp.rrd N:$sensor1


cd /var/www/saa/
#/home/www/see.the.enemy.org/rrd/digitemp/create_graf.sh

rrd=digitemp.rrd
#rrd= /home/www/see.the.enemy.org/rrd/digitemp/digitemp.rrd

rrdtool graph MS4_daily.png --imgformat PNG   \
    --start -86400   \
    --title="daily"     --width 800 --height 200    \
    DEF:Ulko=$rrd:sensor1:AVERAGE  \
    LINE1:Ulko#0000FF:'Ulko' 1> /dev/null
   

rrdtool graph MS4_weekly.png --imgformat PNG   \
    --start -604800 \
    --title="weekly" \
    --width 800 --height 200    \
    DEF:Ulko=$rrd:sensor1:AVERAGE  \
    LINE1:Ulko#0000FF:'Ulko' 1> /dev/null


rrdtool graph MS4_monthly.png --imgformat PNG   \
    --start -3170880 \
    --title="monthly" \
    --width 800 --height 200    \
    DEF:Ulko=$rrd:sensor1:AVERAGE  \
    LINE1:Ulko#0000FF:'Ulko' 1> /dev/null


rrdtool graph MS4_daily_mobile.png --imgformat PNG   \
    --start -86400   \
    --title="daily"     --width 550 --height 120    \
    DEF:Ulko=$rrd:sensor1:AVERAGE  \
    LINE1:Ulko#0000FF:'Ulko' 1> /dev/nul


Se 0 joka oli siinä lämpötilan edessä ei kuulu käskyyn vaan se tulostuu siihen tulokseen. Tarkoittaa varmaan sensori 0:aa.

Mika

raimo

  • Käyttäjä
  • Viestejä: 4269
  • openSUSE Tumbleweed
    • Profiili
Re: digitemp ja www
« Vastaus #3 : 09.07.06 - klo:20.21 »
Siis tuoko piirtää jo kuvaa? ilmeisesti ..
Tässä esimerkkinä AJAX-systeemi nyt ajaa uptime käskyä JavaScript timerillä säädetyn ajan välein,
muuta perliskriptiin $cmd muuttujaan uptimen tilalle haluamasi komento.
Ensin (X)HTML osuus:
Koodia: [Valitse]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>

<script type="text/javascript">
// säädä asetukset tässä sekä Perl-skriptissä //
var time = 10;                                 // ajastin, 10 = 10 sekuntia
var program = '/cgi-bin/lampo.pl';    // skriptin polku
//----------------------------------//

function ajax_request(){
var rand = Math.floor(Math.random() * 2000); //ranom-numero cachekilleri-querylle
var file = program + '?' + rand;
var request = false;
 try{
  request = new XMLHttpRequest();                   //Gekot ja Opera
 } catch(error){}
 try{
  request = new ActiveXObject('Msxml2.XMLHTTP');    //MSIE
 } catch(error){}
 try{
  request = new ActiveXObject('Microsoft.XMLHTTP'); //MSIE
 } catch(error){}

request.open('GET', file, false);
 request.send(null);
 if (request.status == 200)
  return request.responseText
 else return 'Virhe: ' + request.status;
 
}

function start(){
var elm = document.getElementById('tmp');
 setTimeout("start()", time * 1000);
 elm.innerHTML = ajax_request();
}

window.onload = function(){ // käynnistytään itsestään
 start();
}

</script>

<title>AJAX-testi</title>
</head>

<body>
<div id="content">

<div id="tmp">
<!-- uusi tieto ilmenee time -ajan välein tähän. -->
</div>

<br />
<button onclick="alert(ajax_request())">testi</button>
</div>

</body>
</html>

Ja sitten Perliä:
Koodia: [Valitse]
#!/usr/bin/perl
use strict;
# AJAX-juttu
# sudo cp lampo.pl /var/www/cgi-bin/lampo.pl
# sudo chomod 755 /var/www/cgi-bin/lampo.pl

# -------------------- ASETUKSET ---------------------- #
my $cmd = "uptime";              # ajettava komento tähän
# ----------------------------------------------------- #

print "Content-Type: text/xml; charset=utf-8\n\n";
# vaihda alla oleva käyttöön jos käytät HTML -sivulla
#print "Content-Type: text/html; charset=utf-8\n\n";

# Tarkistetaan varulta että cachekilleri-query on numero ja vähän muutakin.
# skriptiä voi ajaa selaimella suoraan vain jos URL-query -osa on numero ja alle 5 merkkiä pitkä.
exit print "virhe" if $ENV{"QUERY_STRING"} !~ /^\d+$/?1:0 ||
                       length($ENV{"QUERY_STRING"}) > 4 ||
                       $ENV{"REQUEST_METHOD"} ne "GET";

 open C, "$cmd |";  # ajetaan käsky
  my $data = <C>;
 close C;

# jos on tarvetta parturoida $data:aa, se tapahtuu tässä
$data = "<p id=\"upd\">uptime: $data</p>";    
$data =~ s/\s{3}//g; #liiat tyhjämerkit pois    

# tulostetaan sivulle
print "$data\n";
   
exit 0;
#
« Viimeksi muokattu: 09.07.06 - klo:22.31 kirjoittanut raimo »
Tietä käyden tien on vanki. Vapaa on vain umpihanki.
Aaro Hellaakoski

raimo

  • Käyttäjä
  • Viestejä: 4269
  • openSUSE Tumbleweed
    • Profiili
Re: digitemp ja www
« Vastaus #4 : 09.07.06 - klo:21.51 »
Pannaanpas vähän paremmaksi, nyt saat haluamasi kuvan vaihtumaan, jos sellainen valmiiksi on olemassa:
Vaihda tämä alkup. start function tilalle ja laita haluamasi kuvan polku oikeaksi.
Koodia: [Valitse]
function start(){
var draw = 1;                   // muuta samaksi kuin Perlin $draw (0/1)
var image = 'lampo.png'; // vaihtuvan kuvan polku

var elm = document.getElementById('tmp');
 setTimeout("start()", time * 1000);
 elm.innerHTML = ajax_request(); // tyhjentää samalla vanhan kuvan pois
 
if (draw == 1){
 var img = document.createElement("img");
 var rand = Math.floor(Math.random() * 2000); // taas viilataan välimuistia linssiin ;)
  img.setAttribute('src', image + '?' + rand);
  img.setAttribute('alt', 'lämpö');
 elm.appendChild(img);
 }
}

Tai jos valmista kuvaa ei ole, tämä Perli piirtää sen:
imagemagick pitää olla asennettuna.
Koodia: [Valitse]
#!/usr/bin/perl
use strict;
# AJAX-juttu, imagemagick tarvitaan:
# sudo apt-get install imagemagick
#
# sudo cp lampo.pl /var/www/cgi-bin/lampo.pl
# sudo chomod 755 /var/www/cgi-bin/lampo.pl
# HUOM:
# sudo chgrp www-data lampo.png
# sudo chown www-data lampo.png

# -------------------- ASETUKSET ---------------------- #
my $cmd        = "uptime";  # ajettava komento
my $draw       = 1;         # piirrä kuva = 1, teksti = 0 muuta draw samaksi JS-skriptiin
my $image     = "/usr/www/htdocs/lampo.png"; #kuvan polku
my $size         = "400x18";  # kuvan koko
my $bg           = "#D0D0F0"; # taustaväri
my $fc            = "#606060"; # fontin väri
my $border     = 1;         # reunuksen paksuus
my $bordercol = "#606060"; # reunuksen väri
# ------------------------------------------------------#

print "Content-Type: text/xml; charset=utf-8\n\n";
# vaihda alla oleva käyttöön jos käytät HTML -sivulla
#print "Content-Type: text/html; charset=utf-8\n\n";

# Tarkistetaan varulta että cachekilleri-query on numero ja vähän muutakin.
# skriptiä voi ajaa selaimella suoraan vain jos URL-query -osa on numero ja alle 5 merkkiä pitkä.
exit print "virhe" if $ENV{"QUERY_STRING"} !~ /^\d+$/?1:0 ||
                      length($ENV{"QUERY_STRING"}) > 4 ||
                      $ENV{"REQUEST_METHOD"} ne "GET";

 open C, "$cmd |";
  my $data = <C>;
 close C;

# jos on tarvetta parturoida $data:aa, se tapahtuu tässä
$data =~ s/\s{3}//g; #liiat tyhjämerkit pois

if ($draw == 1){# piirrellään kuva
my $options = " -size $size" .
              " -background \"$bg\"" .
              " -fill \"$fc\"" .
              " -border \"$border\"" .
              " -bordercolor \"$bordercol\"";

 open C, "convert " . $options . " \ label:'" . $data . "' $image |";
 close C;
}

# tulostetaan teksti jos ei piirrelty kuvaa
$data = "<p id=\"upd\">uptime: $data</p>";
print "$data\n" if $draw != 1;

exit 0;

Siinäpä muutama AJAX juttu, esimerkiksi tai jotain. ;)

edit, löytyy myös tuolta:
http://dash.atspace.org/kvaak/
« Viimeksi muokattu: 09.07.06 - klo:22.32 kirjoittanut raimo »
Tietä käyden tien on vanki. Vapaa on vain umpihanki.
Aaro Hellaakoski

mihatsu

  • Käyttäjä
  • Viestejä: 77
    • Profiili
Re: digitemp ja www
« Vastaus #5 : 10.07.06 - klo:22.10 »
Hei

Nyt en oikein pääse testimään noita kun en saa jostain syystä ajettua tuota lämmönhakukomentoa luuserina vaan ainoastaan roottina.
mihatsu@serveri:/var/www/saa$ digitemp_DS9097 -a -q -c /home/mihatsu/.digitemprc
Error locking ttyS0. Do you have permission to write to /var/lock?

drwxrwxrwt  3 root root  4096 2006-07-10 22:10 lock

Eli hitollakohan tuota sais ajettua peruskäyttäjänä

Mika

tpaivaa

  • Käyttäjä
  • Viestejä: 1
    • Profiili
Vs: Re: digitemp ja www
« Vastaus #6 : 27.08.08 - klo:20.38 »
Hei

Nyt en oikein pääse testimään noita kun en saa jostain syystä ajettua tuota lämmönhakukomentoa luuserina vaan ainoastaan roottina.
mihatsu@serveri:/var/www/saa$ digitemp_DS9097 -a -q -c /home/mihatsu/.digitemprc
Error locking ttyS0. Do you have permission to write to /var/lock?

drwxrwxrwt  3 root root  4096 2006-07-10 22:10 lock

Eli hitollakohan tuota sais ajettua peruskäyttäjänä

Mika

Sun looser user ei omista oikeuksia käytää tuota /dev/ttyS0 ....
joten pitänee muokata oikeuksia hieman...