Wert von Pythonscript in CSV Datei speichern

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
BlackJack

Freitag 24. Februar 2017, 17:25

@erz55: Ich würde in ``/var/www/html/`` einen symbolischen Link auf die tatsächliche Datei setzen, dann braucht man dort nicht anderen Schreibrechte gewähren.

Die Zeile im Traceback sieht übrigens so aus als wenn Du entweder Dein Programm in ``/var/www/html/`` abgelegt hast, oder `os.chdir()` verwendet wird. Beides sollte man nicht tun. Und statt `file()` bitte `open()` verwenden.
erz55
User
Beiträge: 9
Registriert: Mittwoch 22. Februar 2017, 15:42
Kontaktdaten:

Freitag 24. Februar 2017, 18:06

Sorry hatte mich vertippt. Die Datei die angelegt wird heist
"verbrauch.html" und nicht "verbrauch.csv".
Ich habe das Programm schon ueberall abgelegt und getestet..
Es haengt immer an den Schreibrechten. Da ich allein im Netzwerk bin,
waer es egal mit den Schreibrechten
Mit dem symbolischen Link das muss ich erstmal testen.
Ich moechte den Wert auf "verbrauch.html" von einen anderen PC im Netzwerk
mit Excel einlesen lassen. Da ist ein direkter Zugriff auf die Seite besser.Was muss ich
tun um das Speichern auf /var/www/html zu erreichen?
Sirius3
User
Beiträge: 8120
Registriert: Sonntag 21. Oktober 2012, 17:20

Freitag 24. Februar 2017, 19:19

@erz55: es wird immer verwirrender. Bisher hast Du nur Zahlen in Deiner Datei, das ist dann eher cvs als html. Und dieses Format ist dann auch für Excel besser geeignet. Und willst Du jetzt einen direkten Zugriff oder einen über einen Webserver?
BlackJack

Freitag 24. Februar 2017, 19:57

@erz55: Die Rechte sind nicht egal, auch nicht wenn man alleine im Netzwerk ist. So sollte man gar nicht erst anfangen. Um irgendwo speichern zu können müssen halt die Rechte stimmen. Es muss also entweder mit dem passenden Benutzer ausgeführt werden, oder es müssen die passenden Rechte auf den Verzeichnissen existieren.

Allerdings ist IMHO ein symbolischer Link am einfachsten. Dann muss man im Webbereich nicht allgemein etwas zum schreiben freigeben.
JStefan
User
Beiträge: 2
Registriert: Donnerstag 7. Dezember 2017, 17:39
Wohnort: Südamerika
Kontaktdaten:

Donnerstag 7. Dezember 2017, 19:53

Erstmal ein freundliches HALLO in die Runde.
Ich bin Stefan (55), zusammen mit meiner Frau seit 8 Jahren auf drei Achsen in der Weltgeschichte unterwegs...aktuell in Kolumbien. Vor 4 Wochen habe ich einen Raspi 3 gekauft und versuche nun Ihn sinnvoll einzusetzen. Scripen etc. WISSEN / ERFAHRUNG: NULL ansonsten sind wir IT mässig im Obstladen... (mehr unter http://www.tvware.de)

Das erste sinnvolle Python Projekt soll die Überwachung unserer Kühl und Gefrier Kombi werden. Will sagen: Erster Schritt Aufzeichnung folgender Daten:
Laufzeiten der beiden Kühlkompressoren, innen Temperaturen, Außentemperatur, Höhe über NN.

Warum: Diese beiden Geräte sind die grössten elektrischen Verbraucher bei beschränktem Energievorrat (Batterien). Die aktive Lüftung, der Gasdruck etc. sind von mir beeinflussbar und ich denke es gibt Optimierungs Möglichkeiten... wenn Messdaten vorhanden sind und nicht geschätzt werden muss.
Die Hardware Umsetzung ist nicht mein Problem, es scheitert am Wissen um die Weichware...

Zum Thema:
Kopieren ist die höchste Form der Anerkennung...

Ich bin auf diesen Thread hier gestoßen und dachte, das kennst Du doch, denn mit dem Script habe ich auch angefangen (http://www.netzmafia.de/skripten/hardwa ... O_int.html und es wurde weiter entwickelt... gut so. Nun die Frage: Wo liegt der Bug...
Traceback (most recent call last):
File "/home/pi/KSKompressor5_1.py", line 46, in <module>
main()
File "/home/pi/KSKompressor5_1.py", line 32, in main
dauer += zeit - start
UnboundLocalError: local variable 'start' referenced before assignment
ist die Fehler Meldung von Thonny

Code: Alles auswählen

#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import queue as Queue
 
# Callback-Funktion fuer beide Flanken
def measure(queue):
    # Flanke und Zeit speichern
    queue.put((GPIO.input(6) == 0, time.time()))
 
def main():
    # GPIO initialisieren
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(6, GPIO.IN)
   
    # internen Pullup-Widerstand aktivieren.
    # GPIO.setup(21, GPIO.IN, pull_up_down = GPIO.PUD_UP)
 
    queue = Queue.Queue()
    # Interrupt fuer beide Flanken aktivieren
    GPIO.add_event_detect(6, GPIO.BOTH, callback=lambda _: measure(queue), bouncetime=500)
 
    try:
            dauer = 0
            while True:
                edge, zeit = queue.get()
                if edge:
                    start = zeit
                else:
                    dauer = 0
                    dauer += zeit - start
                    s = "%1.2f" % dauer
                    print (s)
                    with open("verbrauch.csv", "a") as f:
                        f.write(s)

               
    except KeyboardInterrupt:
        pass
    finally:
        GPIO.cleanup()
    print("\nBye!")
    
if __name__== '__main__':
    main()
   
Erstmal vielen Dank bei allen bisher Beteiligten... und seit einem Newcommer nicht böse...jeder hat mal angefangen.... Ja ja ich lese es jetzt schon... fang klein an, Tuto's etc. ist klar..

Muchas Gracias
Stefan
JStefan
User
Beiträge: 2
Registriert: Donnerstag 7. Dezember 2017, 17:39
Wohnort: Südamerika
Kontaktdaten:

Donnerstag 7. Dezember 2017, 21:12

Ich vergaß:
Dieses Script soll mir als Basis dienen, um die weiteren Funktionen hinzuzufügen.
Kompressor 1: Kompressor "ein" kommt als Low am Gpio 6 an.
__deets__
User
Beiträge: 3119
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 7. Dezember 2017, 23:25

Es gibt einen Bug im callback. GPIO.input(..) == 0 invertiert die Logik. Womit zuerst der else Zweig deiner Bedingung durchlaufen wird. Und da hat halt noch niemand den Wert für start gesetzt. Was die Fehlermeldung auch recht klar benennt.

Die unmittelbare Lösung ist aus der 0 eine 1 zu machen. Dann läuft das Skript, solange der kompressor oder was auch immer gerade nicht läuft, wenn man es startet.

Nachtrag: scheint ja bei dir schon aus Prinzip invertiert. Die fehlerursache bleibt: der Startzeitpunkt des Skripts ist kritisch. So wie es jetzt geschrieben ist, kommt es unweigerlich zu Fehlern, wenn die erwartete Reihenfolge nicht mit der beobachteten übereinstimmt.

Ich habe nicht lange Gesucht, aber ggf wirst du glücklicher mit einer abstrakteren Software. Zb einem datenlogger für den Anfang. Und später vielleicht eher eine Heimautomationssoftware wie FHEM.
Antworten