Forum: PC-Programmierung Daten aus der Shell in MySQL Datenbank


von Dennis K. (dkeipp)


Lesenswert?

Hallo zusammen,

ich möchte per shell skript daten in eine MySQL Tabelle schreiben. 
Aktuell geht es mir um die Temperatur mehrerer DS18S20 per Digitemp 
gemessen. Später sollen aber noch andere Sachen gespeichert werden. 
Erseinmal habe ich mir eine Tabelle templog angelegt:
1
mysql> describe templog;
2
+------------+--------------+------+-----+---------+-------+
3
| Field      | Type         | Null | Key | Default | Extra |
4
+------------+--------------+------+-----+---------+-------+
5
| sensorID   | varchar(20)  | YES  |     | NULL    |       |
6
| time       | datetime     | YES  |     | NULL    |       |
7
| temperatur | decimal(5,2) | YES  |     | NULL    |       |
8
+------------+--------------+------+-----+---------+-------+
9
3 rows in set (0.06 sec)

Ob für das Feld sensorID der Datentyp varchar nun Optimal ist werde ich 
erst sehen wenn das ganze läuft. Ich bin mir noch nicht ganz sicher ob 
ich dort die Seriennummer oder den Namen (z.B. Aussentemperatur1) 
speichere, aber zum Spielen sicherlich gut genug.
Allerdings bin ich mir momentan noch nicht im klaren wie ich die Daten 
per Shell in die Datenbank bekomme. Ich habe auf dem Rechner wo Digitemp 
läuft keine eigene Datenbank, nur den MySQL-Client, auch ist dort kein 
PHP Installiert. Ich arbeite also mit einem externen MySQL (das 
funktioniert auch!).
Wie wäre also der beste weg die Daten in die Tabelle zu schaufeln? Das 
Skript soll per Cron alle 10 minuten ausgeführt werden. Die verbindung 
sollte somit auch nicht ständig offen bleiben. Digitemp habe ich 
momentan so konfiguriert das es mir  per sensor nur die Temperatur 
ausgibt:
1
dknbli10:~# digitemp_DS9097 -t 2 -q
2
10.69
3
dknbli10:~#
Den Messzeitpunkt bekomme ich ja mit /date '+%Y-%m-%d %T'/ ja passend 
für den Datentyp datetime der Datenbank vorgekaut.

Wie bekomm ich die daten nun in die Datenbank? Das einzige was ich mir 
bisher ergooglen konnte ist die vorgehensweise das ich mir alles in 
einer Datei zusammenschreibe und dann per LOAD DATA LOCAL INFILE in 
MySQL in die Tabelle schiebe. Hier bin ich allerdings auch noch nicht 
ganz zum Ziel gekommen. Gibt es noch eine "schönere" Methode als die von 
mir beschriebene?

Achja, auf dem "Meßrechner" läuft ein Debian Linux, die Datenbank 
ebenfalls, allerdings auf einem VServer irgendwo in den unendlichen 
Weiten des Internets ;-)

Gruß
Dennis

von nicht Gast (Gast)


Lesenswert?

Perlscript schreiben.

doch Gast

von Björn B. (elmo)


Lesenswert?

Geht sehr einfach mit dem mysql client. Hier ein Auszug aus einem meiner 
Scripts. Deinen Befehl habe ich bereits eingefügt, der Query und evtl 
das Zeitformat müssen noch angepasst werden.
1
#!/bin/bash
2
3
TIME=`date +%s`
4
5
TEMP=`digitemp_DS9097 -t 2 -q`
6
7
QUERY="INSERT INTO modul_2 (date,sensor,value) VALUES ('$TIME','0','$TEMP')"
8
9
10
if [[ $TEMP ]];then
11
  echo $QUERY | mysql -u user --password=password database -h localhost
12
fi

Gruß
Björn

von Klaus W. (mfgkw)


Lesenswert?

Björn B. schrieb:
> das Zeitformat

da würde vermutlich passen:
 date +%H:%M:%S

von Dennis K. (dkeipp)


Lesenswert?

Björn B. schrieb:
> Geht sehr einfach mit dem mysql client

Hst recht gehabt :-) Vielen Dank dafür!

für alle die es interessiert hier der von mir angepasste Code:
1
#!/bin/bash
2
3
TIME=`date '+%Y-%m-%d %T'`
4
5
TEMP=`digitemp_DS9097 -t 2 -q`
6
7
QUERY="INSERT INTO tabelle (sensorID,time,temperatur) VALUES ('Sensor 2','$TIME','$TEMP')"
8
9
10
if [[ $TEMP ]];then
11
  echo $QUERY | mysql -h hostname -u benutzername --password=passwort datenbankname 
12
fi

der Code basiert auf der im ersten Beitrag geposteten Tabelle, die 
Parameter tabelle, hostname, benutzername, passwort, datenbankname 
müssen gegen die eigenen angaben ersetzt werden.

Allerdings hätte ich noch eine Frage zum Code:
was macht "if [[ $TEMP ]];" genau, bzw wann wäre die abfrage falsch? und 
der Query wird nicht ausgeführt? Sorry, aber in der bash kenne ich mich 
(noch) nicht besonders gut aus.

edit:
Ich habe schon rausgefunden das bei einer ungültigen abfrage (z.B. 
Sensor 3, welcher nicht vorhanden ist) der Query nicht durchgeführt 
wird.

von Björn C. (Firma: privat) (blackmore)


Lesenswert?

Die IF-Abfrage fragt nur, ob ich der Variablen TEMP auch wirklich ein 
Wert drin steht, und dann den Wert in die MySQL schreibt... oder willst 
Du auch nicht vorhandene Werte haben???

ich versuche mich grad dabei, die Digitemp-Daten als Kurve dar zu 
stellen, so wie es recht oben auf dieser Seite zu sehen ist, nur halt 
Außen und Innentemp...

http://blackmore.homeip.net/rrd.html

von dkeipp (Gast)


Angehängte Dateien:

Lesenswert?

Danke Björn,

Ich visualisiere meine Daten mit DTGraph [1], will aber irgenwann noch 
was eigenes basteln. anbei ein Bild von der DTGraph auswertung



1 - http://sourceforge.net/projects/dtgraph/

von Björn C. (Firma: privat) (blackmore)


Lesenswert?

Werden die Daten dynamisch aus der MySQL-DB gelesen??? also - könnte ich 
meine Daten in eine DB schreiben und dann später DTGraph einsetzen???

Wäre für mich sogar von Vorteil - dann könnte ich auch später 
zurückliegende Daten sehen...

von (prx) A. K. (prx)


Lesenswert?

Alternative Form, insbesondere nützlich wenn mehrzeilig:
1
mysql -h hostname -u benutzername --password=passwort <<EOF
2
sql statement(s)
3
bla
4
fasel
5
sql statement(s)
6
EOF

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.