Python Ausgabe in MariaDB speichern

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Noob24
User
Beiträge: 4
Registriert: Dienstag 26. Januar 2021, 23:31

Hallo zusammen - Ich bin am Verzweifeln :shock:

leider bin ein ziemlicher Anfänger in Python und komm nun nach 1 Woche Recherche nicht weiter und benötige Hilfe.

Ausgangssituation:
Ich erhalte über ein XBee auf einen RaspberryPi Daten. Hierfür habe ich ein Python Skript zusammengebastelt, welches mir einen Zahlenwert (zwischen 0 & 1023) ausgibt. Wenn ich das Skript im Terminal ausführe, sehe ich alle 2 Sekunden wie ein neuer Wert hinzukommt.

Ziel:
Diese Terminal-Ausgabe in eine MariaDB zu speichern

Hier stehe ich:
-Eine MariaDB habe ich bereits erfolgreich installiert
-Eine Tabelle ist angelegt

Meine Gedanken
Meine Recherche hat mich drauf gebracht, ein weiteres Python Skript zu schreiben, welches meinen stdout - Stream in meine MariaDB schreibt (mit Hilfe von "Subprocessen" oder gibt es hierfür bereits eine Library?)

Ich würde mich sehr freuen, wenn mir jemand mit einer Idee oder einem Roten Faden helfen kann.

Vielen Dank im Voraus!
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Noob24: Warum ein zusätzliches Programm? Warum baust Du das nicht in das vorhandene Programm ein? Und zwar nicht die Terminalausgabe sondern die Daten. Macht ja wenig Sinn da erst wieder die Terminalausgabe zu parsen wenn man die Daten vorher bereits als Zahlen hatte.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Noob24
User
Beiträge: 4
Registriert: Dienstag 26. Januar 2021, 23:31

Danke @blackjack für den Hinweis. Die Antwort ist ziemlich simple. Ich habe es einfach nicht zum laufen bekommen *SchandeÜberMeinHaupt*. Ich benutze eine Library (Digi.Xbee). Diese greift das "Sample" (den auszugebenden Wert) ab, rechnet diese von HEX in Dezimal um und gibt den Wert aus.

In dem Script noch die Datenbank zu integrieren überschreitet meine Kenntnisse. Der Weg ein neues Skript zu schreiben, welches diese Ausgabe in die Datenbank schreibt erschien mir "handlebarer".
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Diese Wahrnehmung trügt. Bitte zeig deinen Code für den XBee -Teil, und was du probiert hast in Bezug auf MySQL.
Noob24
User
Beiträge: 4
Registriert: Dienstag 26. Januar 2021, 23:31

from digi.xbee.devices import XBeeDevice
from digi.xbee.io import IOLine, IOMode
from datetime import datetime
import mysql.connector

# Eingang USB Port
PORT = "/dev/ttyUSB0"

# Baud Rate einstellen
BAUD_RATE = 9600

REMOTE_NODE_ID = "REMOTE"

DIGITAL_LINE = IOLine.DIO5_AD5
ANALOG_LINE = IOLine.DIO3_AD3

IO_SAMPLING_RATE = 1 # 2 seconds.


def main():

device = XBeeDevice(PORT, BAUD_RATE)

try:
device.open()

# Obtain the remote XBee device from the XBee network.
xbee_network = device.get_network()
remote_device = xbee_network.discover_device(REMOTE_NODE_ID)
if remote_device is None:
print("Could not find the remote device")
exit(1)

# XBee einstellen
remote_device.set_dest_address(device.get_64bit_addr())

# XBee Input Kanäle einstellen
remote_device.set_io_configuration(ANALOG_LINE, IOMode.ADC)

# Enable periodic sampling every IO_SAMPLING_RATE seconds in the remote device.
remote_device.set_io_sampling_rate(IO_SAMPLING_RATE)

# Enable DIO change detection in the remote device.
remote_device.set_dio_change_detection({DIGITAL_LINE})

# Register a listener to handle the samples received by the local device.
def io_samples_callback(adc_value, remote, time):

print("%s" % (remote_device.get_adc_value(IOLine.DIO3_AD3))) #DIESEN WERT MÖCHTE ICH IN MEINE DATENBANK SPEICHERN

device.add_io_sample_received_callback(io_samples_callback)

input()

finally:
if device is not None and device.is_open():
device.close()

if __name__ == '__main__':
main()


#Connection aufbauen
conn = mysql.connector.connect(
host='localhost',database='meineDatenbank', user='Ich', password='password')

#Cursor createn
cursor = conn.cursor()

#Datenbank vorbereiten auf Einsetzen
insert_stmt = (
"INSERT INTO Temperatur(ErsteSpalte, ZweiteSpalte)"
"VALUES (%s, %s)"
)
data = ('Uhrzeit', 'Wert') #Hier würde ich gerne die Uhrzeit und den stdoutWert drin haben


try:
cursor.execute(insert_stmt, data)

conn.commit()

except:
conn.rollback()

conn.close()


Kommentar:
Das ist das was ich habe. Die Werte ausgeben klappt, ich kann auch per python einen fixen "data"-Wert in die MySQL reinschreiben lassen. Aber leider bekomme ich es nicht hin, dass er kontinuierlich (in Sample_Rate) die XBeeWert (erstes grün) in die Datenbank (zweites grün) quasi "streamt" oder "pusht"
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Noob24: Was heisst Du bekommst das nicht hin? Was hast Du denn schon ernsthaft versucht? Wenn Du programmieren willst, musst Du programmieren lernen. Dass das *so* nicht funktionieren kann sollte eigentlich klar sein wenn man ein Grundlagentutorial durchgearbeitet hat. Und in dem Fall sollte der Versuch auch anders aussehen als zwei Quelltexte hintereinander zu kopieren und irgendwie zu hoffen der Rechner wird das schon auf magische Weise in einer passenden Reihenfolge, also nicht hintereinander wie es dort steht, ausführen.

Also Grundlagen lernen! In der Python-Dokumentation gibt es beispielsweise ein Tutorial.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Noob24
User
Beiträge: 4
Registriert: Dienstag 26. Januar 2021, 23:31

@blackjack Ja, ich bin kein guter Programmierer und komme mehr aus der Elektronik. Deswegen habe ich mich ja auch nicht getraut, das in einem Skript zusammenzufassen und wollte es in einem zweiten separaten Skript. Aber trotzdem danke :)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Auch für deinen 2-Skript-Ansatz musst du programmieren & die Operationen richtig verschrænken. Ob du nun eine DB öffnest oder eine Datei, ob du in die DB schreibst, oder in eine Datei - das ist an der gleichen Stelle. Genauso im zweiten Skript. Du öffnest den Sensor. Oder eine Datei. Du liest den Sensor. Oder eine Datei.
geckocode
User
Beiträge: 3
Registriert: Montag 16. November 2020, 22:08

Hallo,
also Datenbank ist mir noch zu kompliziert. ich speichere daten auf dem Raspi einfach in eine *.csv datei ab.
und damit ich nicht jede minute schreiben muss sammle ich immer 15 Werte (von drei Temperaturfühlern) im array und speichere dann... :ugeek:

Code: Alles auswählen

def DatenArrayInDatei (filename, datenarray):
    #print (filename)
    try:
        myfile = open(filename, 'a')
        for data in datenarray:
            myfile.write(data)
        myfile.close() 
        return 1           
    except:
        return 0
        print ("failed writing in Datei")
ich hangele mich mit tutorials und suchen am konkreten Problem durch. Erstelle gerade für meine Daten einen plot mit matplotlib....
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Mit einem array meinst Du wohl eine Liste. Es ist wichtig die richtigen Begriffe zu benutzen, weil es sonst sehr schnell unübersichtlich wird.
Du hast eine interessante Mischung aus deutsch und englisch, vor allem deutsche Funktionsnamen und englische Meldungen.
Du wandelst eine aussagekräftige Exception in einer nichtssagende Zahl um. Ein nacktes except fängt alle Fehler ab, auch viele Programmierfehler. Daher immer die Exception so konkret wie möglich angeben, hier IOError.
Das print wird nie ausgeführt, weil vorher per return die Funktion verlassen wird. Wenn man einen Wahrheitswert will, benutzt man nicht 0 und 1 sondern True und False.
Aber wenn Du nicht weist, was schief läuft, wunderst Du dich, warum nie Daten geschrieben werden.

Code: Alles auswählen

def write_data(filename, data):
    # print(filename)
    try:
        with open(filename, 'a', encoding="ASCII") as output:
            output.writelines(data)
        return True          
    except IOError:
        logging.exception("failed writing data")
        return False
Antworten