Teile einer CSV oder DB3 Datei auslesen

Zvoni

Erfahrenes Mitglied
Wieso so umständlich?
Wenn ich die Webseite von Dect!Read richtig lese, kann man direkt in eine SQLite oder MySQL schreiben.
Dann sind es simple SELECTs

EDIT: Würde eher zu MySQL tendieren, da (mindestens) zwei Clients auf die Datenbank zugreifen:
Dect!Read schreibend, und deine Webseite lesend
SQLite kann man zwar für concurrent access "konfigurieren", macht aber keinen Spass....
 
Zuletzt bearbeitet:

mstut

Mitglied
Hallo

Erst ein mal vielen Dank für deine Hilfe,
aber das ist nicht das was ich wollte. Ist mir viel zu kompliziert.
Ich möcht nichts Installieren oder mich Stunden lang mit FTP beschäftigen.
Kleine Änderungen sollten für mich ohne Hilfe möglich sein.
Ich habe gedacht, das es wesentlich einfacher ist das umzusetzen.

Ich habe mir aber heute noch ein mal Gedanken gemacht und in der Arbeitspause im Netz gesucht.
Ich kann die CSV Datei in Abständen von zb. 1 Tag oder 1 Woche verschieben oder umbenennen und Dect Read erzeugt automatisch eine neu CSV. Die ist dann sehr klein und zum Übertragen ok.
Und ich habe noch ein Script gefunden das so etwas macht was ich suche.
Nur es werden alle AINs und alle Daten angezeigt.
Aber ich weiß nicht, ob man das Scrips verwenden darf und es müsste dann angepasste werden.

Ich hoffe das das ok ist und ich niemanden verärgert habe.

mfg
Michael
 

Zvoni

Erfahrenes Mitglied
Was soll daran kompliziert sein? Und was hat das mit FTP zu tun?
Es sei denn, diese Webseite hostest du nicht selbst, sondern bei einem externen Anbieter.
wenn du selbst hostest, ist alles im internen Netzwerk, und da ist es ziemlich einfach MySQL aufzusetzen
 

Sempervivum

Erfahrenes Mitglied
aber das ist nicht das was ich wollte. Ist mir viel zu kompliziert.
Ich möcht nichts Installieren oder mich Stunden lang mit FTP beschäftigen.
Kleine Änderungen sollten für mich ohne Hilfe möglich sein.
Ich habe gedacht, das es wesentlich einfacher ist das umzusetzen.
Manchmal ist es so, dass man den Pelz des Bären nicht waschen kann ohne ihn nass zu machen.
Möglicher Weise bin ich bei meinem Skript jedoch von falschen Voraussetzungen aus gegangen: Weil Du Domainfactory ins Spiel gebracht hast, habe ich angenommen, dass deine Website dort gehostet wird während diese CSV-Datei auf deinem eigenen PC liegt. Und dann hätten wir die Dateien mit FTP dort hin übertragen müssen. Trifft das denn jetzt zu oder hast Du auf deinem eigenen PC einen Webserver laufen und hostest deine Website selber?
 

mstut

Mitglied
Weil Du Domainfactory ins Spiel gebracht hast, habe ich angenommen, dass deine Website dort gehostet wird während
Ich habe keinen eigenen Webserver und die Seite ist bei DF.
während diese CSV-Datei auf deinem eigenen PC liegt
Die CSV ist auf dem PC wo ja auch DR ist und die Datei erzeugt.
Und dann hätten wir die Dateien mit FTP dort hin übertragen müssen
Es gibt ein Übertragungsprogramm auf dem PC das die Wetter Daten alle 10 Minuten überträgt.
Es gibt einen Ordner auf dem PC der mit dem gleichen Ordner auf DF Synchronisier wird.
Wenn die CSV in diesem Ordner liegt wird sie mit Übertragen.

mfg
 

Sempervivum

Erfahrenes Mitglied
Es gibt ein Übertragungsprogramm auf dem PC das die Wetter Daten alle 10 Minuten überträgt.
Es gibt einen Ordner auf dem PC der mit dem gleichen Ordner auf DF Synchronisier wird.
Wenn die CSV in diesem Ordner liegt wird sie mit Übertragung.
Das ist jetzt natürlich eine ganz wichtige Info, die bisher gefehlt hat und dann braucht es allerdings kein FTP.

BTW: Das PHP-Skript, das Du da gefunden hast, ist auch nicht nennenswert einfacher als mein Python-Skript ;)
 

mstut

Mitglied
Entweder die Auswertung auf der HP mit PHP und die CSV kleiner machen und Übertragen
oder alles auf dem PC erstellen und nur das Ergebniss übertragen
mfg
 

Sempervivum

Erfahrenes Mitglied
Ich habe mal das FTP aus meinem Skript heraus genommen und statt dessen die Daten in eine JSON-Datei geschrieben. Sieht dann so aus:
Code:
import sys
import os
import time
import datetime
from csv import reader
import json

try:
    # Intervall in Sekunden für das Prüfen der CSV-Datei:
    intvPoll = 10
    # Anzahl von Datensätzen, die aus der
    # CSV-Datei übernommern werden sollen:
    nrData = 10
    # Intervall in Sekunden, in dem die CSS-Datei
    # aktualisiert wird:
    intvCsv = 600  # 10 Minuten
    # Parameter in der CSV-Datei
    # Schlüssel: Frei wählbarer Name
    # Wert: Der Index in der CSV-Zeile
    confParams = {
        'AIN': 0,
        'Spannung': 1,
        'Leistung': 2,
        'Zaehlerstand': 3,
        'Temperatur': 4,
        'Datum': 5,
        'Zeit': 6
    }
    # AIN der Steckdose, die gelesen werden soll:
    ainToRead = '116570450402'
    # Dateiname der CSV-Datei:
    filenameInCsv = 'DectRead_test.csv'
    filenameOutJson = 'dect-read.json'

    # Ab hier braucht nichts mehr geändert zu werden

    # Zeitraum, innerhalb dessen Daten übernommen werden sollen
    # bzw. maximales Alter der Daten:
    maxAge = nrData * intvCsv
    # Verzeichnis dieser Skriptdatei ermitteln:
    dir = os.path.dirname(os.path.realpath(__file__))
    # Wir gehen davon aus,
    # dass Skript und CSV-Datei im selben Verzeichnis liegen:
    pathIn = dir + '\\' + filenameInCsv
    pathOut = dir + '\\' + filenameOutJson
    # Merker für Zeitstempel:
    tim = 0
    # Endlosschleife:
    while True:
        # Zeit der letzten Änderung der CSV-Datei ermitteln:
        mtime = os.path.getmtime(pathIn)
        # Hat sich die Zeit geändert?
        if(mtime > tim):
            # Neue Zeit merken:
            tim = mtime
            now = datetime.datetime.now()
            # CSV-Datei öffnen:
            with open(pathIn, 'r') as fileIn:
                output = []
                # pass the file object to reader() to get the reader object
                csv_reader = reader(fileIn)
                # Iterate over each row in the csv using reader object
                for row in csv_reader:
                    # row variable is a list that represents a row in csv
                    # print(row)
                    # Zeit für die aktuelle Zeile ermitteln:
                    timeRow = datetime.datetime.strptime(
                        row[confParams['Datum']] + 'T' + row[confParams['Zeit']], "%Y-%m-%dT%H:%M:%S")
                    # Alter der Daten ermittteln durch Subtrahieren der Zeit der Zeile
                    # von der Jetzt-Zeit:
                    ageRow = (now - timeRow).total_seconds()
                    # Ist das Alter der Zeile kleiner als das konfigurierte maximale?
                    if ageRow < maxAge:
                        # Gilt die Zeile für die Steckdose, die übertragen werden soll?
                        if row[confParams['AIN']] == ainToRead:
                            # Alle Parameter zum Ausgabe-Array hinzu fügen:
                            params = {}
                            for key in confParams:
                                params[key] = row[confParams[key]]
                            output.append(params)
                # Ausgabe-Array in JSON kodieren:
                with open(pathOut, 'w') as fileOut:
                    fileOut.write(json.dumps(output))
        # Konfigurierte Zeit warten:
        time.sleep(intvPoll)
except:
    print("Error at line", sys.exc_info()[2].tb_lineno, sys.exc_info())
# Zum testen, damit wir die Fehleranzeigen zu Gesicht bekommen:
input()
Welche Daten übernommen werden kannst Du über die Variable confParams steuern.
Ausgabe in eine Tabelle dann z. B. so:
Code:
    <table>
        <tbody>
<?php
$data = json_decode(file_get_contents('dect-read.json'));
foreach ($data as $row) {
    echo "
            <tr>
                <td>$row->Spannung</td>
                <td>$row->Leistung</td>
                <td>$row->Zaehlerstand</td>
                <td>$row->Temperatur</td>
                <td>$row->Datum</td>
                <td>$row->Zeit</td>
            </tr>
";
}
?>
        </tbody>
    </table>
Kopf kannst Du selbst hinzu fügen.