Logga temperaturer till MySQL och generera grafer

Generella Linux-frågor och frågor gällande Linuxmjukvara som saknar egen forumkategori skall postas i detta forum
Kategoriregler
Vill du visa bilder i ditt inlägg? Använd funktionen "Ladda upp bilaga" nedanför textrutan!
Användarvisningsbild
bertilson
Tar hemautomation på allvar
Inlägg: 133
Blev medlem: 21 dec 2009, 11:41
Ort: Borås

Logga temperaturer till MySQL och generera grafer

Inlägg av bertilson »

Hej

Har tröttnat på rrdtool och vill gå över till MySQL istället. Dels för att jag inte gillar sättet rrd lagrar data på, och dels för att jag har mer användning i andra områden av att kunna sql.

Nån som kör MySQL som vill dela med sig av lite script för att lagra data?

Vad använder man för att generera grafer? Vill kunna köra graderna on demand I php.

Skickat från min LT26i via Tapatalk 2
gflygt
Tar hemautomation på allvar
Inlägg: 101
Blev medlem: 26 jul 2009, 08:24
Ort: Stockholm

Re: Logga temperaturer till MySQL och generera grafer

Inlägg av gflygt »

Jag har inget avancerat, men jag kör med mysql, och GNUPlot för att generera graferna. Jag kan leta reda på mina enkla script. Återkommer.

Gunnar
gflygt
Tar hemautomation på allvar
Inlägg: 101
Blev medlem: 26 jul 2009, 08:24
Ort: Stockholm

Re: Logga temperaturer till MySQL och generera grafer

Inlägg av gflygt »

Så här ser mitt insamlingsscript ut. Min databas heter alltså weathersensors.

Kod: Markera allt

#!/bin/bash
# collect.sh Script to collect data from 1-wire sensors
# Created 29 July 2009 by Gunnar Flygt
# The sensors have soft links in the working directory
#

mysql="/usr/bin/mysql -ugunnar -pmittpassword weathersensors"
GREP="/bin/grep"
TR="/usr/bin/tr"

cd /home/gunnar/weatherdata

nr="1"

# This is the collector procedure
while [ $nr -le 4 ];
do
  # Get the sensor ID for storing in database
  sensid=`ls -l sensor$nr | awk '{ print $11 }' \
	| awk 'BEGIN { FS = "/" } ; { print $5 }'`

  # Get the temperature value strip whitespace
  temp=`$GREP . sensor$nr | $TR -d [:space:]`

  # define INSERT statement
  insert="INSERT INTO measures VALUES('${sensid}',${temp},CURRENT_TIMESTAMP)"

  # pollute database
  `echo ${insert} | ${mysql}`

  nr=$(( $nr + 1 ))
done
Räknaren räknar till 4 eftersom jag har 4 sensorer. Jag har 3 tabeller, en för temperaturdata, en för fuktmätning och en för sensorerna.

Kod: Markera allt

mysql> show tables;
+--------------------------+
| Tables_in_weathersensors |
+--------------------------+
| fukt                     |
| measures                 |
| sensors                  |
+--------------------------+
3 rows in set (0.00 sec)

mysql> desc sensors;
+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| namn   | varchar(128) | YES  |     | NULL    |       |
| sensor | varchar(20)  | YES  |     | NULL    |       |
+--------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> select * from sensors;
+--------------------+-----------------+
| namn               | sensor          |
+--------------------+-----------------+
| Ute                | 10.67AC92010800 |
| Kallare            | 10.88AA92010800 |
| Varmvattenberedare | 10.C0C692010800 |
| Inne               | 10.FEC592010800 |
| Humidity           | 26.88C1E2000000 |
+--------------------+-----------------+
5 rows in set (0.00 sec)

mysql> desc measures;
+----------+--------------+------+-----+-------------------+-----------------------------+
| Field    | Type         | Null | Key | Default           | Extra                       |
+----------+--------------+------+-----+-------------------+-----------------------------+
| sensor   | varchar(20)  | YES  |     | NULL              |                             |
| value    | decimal(8,6) | YES  |     | NULL              |                             |
| tidpunkt | timestamp    | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+----------+--------------+------+-----+-------------------+-----------------------------+
3 rows in set (0.00 sec)
Och sen några script för att plot-a
plotweek.sh här:

Kod: Markera allt

#!/bin/bash
# Script to get data from weathersensors database
# Copied and modified by Gunnar Flygt 29 July 2009
#
NU=$(date '+%H%M')
IDAG=$(date '+%Y%m%d')

cd /home/gunnar/weatherdata
mysql="/usr/bin/mysql -ugunnar -pmittpassword weathersensors"

# PLATS är de olika sensorerna
for PLATS in Ute Kallare Varmvattenberedare Inne ; do
        query="SELECT tidpunkt,value FROM measures WHERE
                DATE_SUB(CURDATE(),INTERVAL 1 WEEK) <= tidpunkt
                AND sensor = (SELECT sensor FROM sensors WHERE namn='${PLATS}')
                ORDER BY tidpunkt;"
        # Mata ut och få in data.
        echo ${query} | ${mysql} | sed 's/\ /-/1;1d' >weekdata.${PLATS}
									        
										done

cp /home/gunnar/public_html/plotweek.png arkiv/${IDAG}week.png

# Plotta
/usr/bin/gnuplot <weekdata.plotfile
där man ju också måste se weekdata.plotfile:

Kod: Markera allt

#!/usr/bin/gnuplot
#
# hel.plotfile
#
# Plotscript © Gunnar Flygt
# Stulet av Måns Nilsson med Måns tillstånd ;-)
#
set xdata time
set timefmt "%Y-%m-%d-%H:%M%S"

# Vi vill ha streck i stället för punkter, och ett rutnät att fästa mot.
set style data lines
set grid
# Förklaringar.
set title "Temperaturer senaste veckan, Orno"
set xlabel "Datum"
set ylabel "Grader Celsius"
# PNG liten font och transparens.
set term png small transparent

# Filnamn
set output "/home/gunnar/public_html/plotweek.png"
# Plotkommando tre kolumner; tid, sensor-ID, värde
# där sensorvärde är redundant tack vare tidigare
# sortering till separata filer.
plot	'weekdata.Ute' using 1:2 title "Ute", \
	'weekdata.Kallare' using 1:2 title "Kallare", \
	'weekdata.Varmvattenberedare' using 1:2 title "Varmvattenberedare", \
	'weekdata.Inne' using 1:2 title "Inne"
Ungefär så alltså. Jag tycker också att det är roligare att ha efteråt påverkbar data.

Gunnar
Användarvisningsbild
CirruZZ
Master Moderator
Inlägg: 1621
Blev medlem: 13 feb 2008, 16:46
Ort: Ystad

Re: Logga temperaturer till MySQL och generera grafer

Inlägg av CirruZZ »

Jag förstår vad du menar, det är inte helt enkelt med rrdtool alltid. Dock tycker jag att när det väl funkar, är oslagbart.

Tips, kolla på http://jpgraph.net/ har ingen erfarenhet av det själv, men har sneglat på det. Du verkar kunna göra fina grafer med det.

Sen kan du faktiskt även göra rrd grafer direkt från MySQL också, har testat det, men då tappar man lite prestanda, men inget som stör oss amatörer :wink: .
Skriv svar