mikrocontroller.net

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


Autor: Dennis Keipp (dkeipp)
Datum:

Bewertung
0 lesenswert
nicht 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:
mysql> describe templog;
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| sensorID   | varchar(20)  | YES  |     | NULL    |       |
| time       | datetime     | YES  |     | NULL    |       |
| temperatur | decimal(5,2) | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+
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:
dknbli10:~# digitemp_DS9097 -t 2 -q
10.69
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

Autor: nicht Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Perlscript schreiben.

doch Gast

Autor: Björn B. (elmo)
Datum:

Bewertung
0 lesenswert
nicht 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.
#!/bin/bash

TIME=`date +%s`

TEMP=`digitemp_DS9097 -t 2 -q`

QUERY="INSERT INTO modul_2 (date,sensor,value) VALUES ('$TIME','0','$TEMP')"


if [[ $TEMP ]];then
  echo $QUERY | mysql -u user --password=password database -h localhost
fi

Gruß
Björn

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Björn B. schrieb:
> das Zeitformat

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

Autor: Dennis Keipp (dkeipp)
Datum:

Bewertung
0 lesenswert
nicht 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:
#!/bin/bash

TIME=`date '+%Y-%m-%d %T'`

TEMP=`digitemp_DS9097 -t 2 -q`

QUERY="INSERT INTO tabelle (sensorID,time,temperatur) VALUES ('Sensor 2','$TIME','$TEMP')"


if [[ $TEMP ]];then
  echo $QUERY | mysql -h hostname -u benutzername --password=passwort datenbankname 
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.

Autor: Björn C. (Firma: privat) (blackmore)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dkeipp (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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/

Autor: Björn C. (Firma: privat) (blackmore)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternative Form, insbesondere nützlich wenn mehrzeilig:
mysql -h hostname -u benutzername --password=passwort <<EOF
sql statement(s)
bla
fasel
sql statement(s)
EOF

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.