Daten aus der Shell in MySQL Datenbank

OP #1935666
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
#1935680
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
OP #1935719
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.
(Firma: privat) #1954660
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.