Autostart von einem Programm

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Daniel-owl
User
Beiträge: 15
Registriert: Mittwoch 21. Dezember 2016, 14:54

Guten Tag,

Ich möchte gerne ein Programm (Temp3.py) automatisch bei Systemstart starten lassen.

dazu habe ich in /etc/rc.local folgendes eingetragen

/bin/sleep 10 && /usr/bin/python2 /home/pi/Temp3.py &

Wenn ich nun mit sudo sh -vx /etc/rc.local dieses ausführe funktioniert auch alles.
Leider läuft das Programm aber nicht nach eine reboot automatisch.

Was mache ich da Falsch?

Programm ist folgendes

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Signalleitung Temperatur GPIOPIN 7

import sys
import os
import time

datum = time.strftime ("%Y.%m.%d")

file = open('/sys/devices/w1_bus_master1/w1_master_slaves')
w1_slaves = file.readlines()
#print w1_slaves
file.close()

for line in w1_slaves:
	w1_slave = line.split("\n")[0]
	file = open('/sys/bus/w1/devices/' + str(w1_slave) + '/w1_slave')
	filecontent = file.read()
#	print filecontent
	file.close()

	stringvalue = filecontent.split("\n")[1].split(" ")[9]
	temperature = float(stringvalue[2:]) / 1000
	print  temperature
#	print datum
	print time.strftime("%H:%M:%S")
	print(str(w1_slave) + ':%6.2f°C' % temperature )
	datei = open(datum + '.csv', 'a')
	datei.write(str(w1_slave) + "\n" '%6.2f' % temperature + "\n" + time.strftime("%H:%M:%S") + "\n")
	datei.close()
sys.exit(0)
Zuletzt geändert von Anonymous am Freitag 6. Januar 2017, 18:27, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Daniel-owl: Woher weisst Du dass das nicht läuft?
Daniel-owl
User
Beiträge: 15
Registriert: Mittwoch 21. Dezember 2016, 14:54

Es wird nichts in die CSV Datei geschrieben

Das ist zumindest mein Ziel des Skriptes gewesen.
Die Temperatursensoren auslesen und die Daten in eine csv Datei schreiben
BlackJack

@Daniel-owl: Wo liegt die Datei denn? Bist Du sicher das Du an der richtigen Stelle schaust?
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@Daniel-owl: Da im Skript für die CSV-Datei kein absoluter Pfad mitgegeben wird, wird die Datei da geschrieben, wo das Skript ausgeführt wird. Was ziemlich sicher irgend ein Systemverzeichnis ist und nicht dein Home-Verzeichnis.

Zum Skript:
* Die prints sind eigentlich beim automatische Ausführen sinnlos, weil du die Ausgabe nie siehst.
* Die Dateiendung CSV ist irreführend, weil du von der Struktur her keine CSV-Datei hast.
* Ich würde das unter Raspbian über eine systemd Timer Unit machen. Dann bekommst du das Logging via systemd direkt dazu.

Gruß, noisefloor
Daniel-owl
User
Beiträge: 15
Registriert: Mittwoch 21. Dezember 2016, 14:54

Vielen Dank für die Rückmeldung.

Die Datei sollte eigentlich auf /home/pi liegen.

Wie soll ich die Datei denn dann enden lassen oder wie mache ich eine richtige csv Datei daraus?
Ich kann sie jetzt mit excel öffnen.

Warum funktioniert das Skript richtig wenn ich die es mit sudo sh -vx /etc/rc.local
ausführe?

wäre es besser wenn ich es über "Crantab" laufen lasse?

Vielen Dank für eure Hilfe
Daniel-owl
User
Beiträge: 15
Registriert: Mittwoch 21. Dezember 2016, 14:54

Ich habe es mal als cronjob angelegt.

da läuft das Skript und speichert es mir auch in der richtigen Datei ab.
Das ist für mich okay und auch ausreichend.

LG
Daniel
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Daniel-owl: das ändert aber nichts daran, dass Du damit nur Dein Problem umgangen hast. Programme werden von `/etc/rc.local`aus in irgendeinem Verzeichnis gestartet, während Cronjobs zufälligerweise von Home-Verzeichnis (`/home/pi`) aus gestartet werden. Wenn Du die csv-Datei also an einem bestimmten Ort ablegen willst, solltest Du diesen auch absolut im Programm angeben.

Wenn man strikt ist, erzeugst Du schon eine csv-Datei, aber eben eine sehr spezielle, nämlich eine, die nur aus einer Spalte besteht. Zum Programm: Dateien sollten mit dem with-Statement geöffnet werden, um das Zeileende-Zeichen zu entfernen, nimmt man üblicherweise `.rstrip` und nicht `.split`. Pfade setzt man mit os.path.join zusammen. Beim Parsen von Dateien sollte man nicht so viele magische Indizes verwenden. Statt immer wieder die Ergebnisdatei neu zu öffnen, reicht es, sie einmal am Anfang zu öffnen und immer wieder hineinzuschreiben:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Signalleitung Temperatur GPIOPIN 7
 
import sys
import os
import time

def iter_slaves():
    with open('/sys/devices/w1_bus_master1/w1_master_slaves') as slaves:
        for slave in slaves:
            yield slave.rstrip()

def read_temperature(slave):
    with open(os.path.join('/sys/bus/w1/devices/', slave, '/w1_slave')) as lines:
        _crc = next(lines)
        _, _, temperature = next(lines).partition('t=')
        return float(temperature) / 1000.0
        
def main():
    datum = time.strftime("%Y.%m.%d")
    with open('/home/pi/{}.csv'.format(datum), 'a'):
        for slave in iter_slaves():
            temperature = read_temperature(slave)
            data.write('{},{:%6.2f},{}\n'.format(
                slave,
                temperature,
                time.strftime('%H:%M:%S'),
            ))

if __name__ == '__main__':
    main()
Daniel-owl
User
Beiträge: 15
Registriert: Mittwoch 21. Dezember 2016, 14:54

@Sirius3

Vielen vielen Dank für Deine Hilfe.

Was müsste ich denn machen um die Informationen hintereinander in mehrere Spalten zu schreiben?

(Bin leider noch recht unerfahren mit Python=

LG
Daniel
Daniel-owl
User
Beiträge: 15
Registriert: Mittwoch 21. Dezember 2016, 14:54

Leider bekomme ich bei den Skript von Dir einen Fehler. Er scheint den Unterordner /w1_slaves nicht zu finden.
Das Programm habe ich Temp7 genannt.
Mein Skript findet den Ordner.

Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "Temp7.py", line 32, in <module>
    main()
  File "Temp7.py", line 24, in main
    temperature = read_temperature(slave)
  File "Temp7.py", line 15, in read_temperature
    with open(os.path.join('/sys/bus/w1/devices/', slave, '/w1_slave')) as lines:
IOError: [Errno 2] No such file or directory: '/w1_slave'
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Daniel-owl: Da ist mir auch ein / zu viel reingerutscht: os.path.join('/sys/bus/w1/devices', slave, 'w1_slave')
Daniel-owl
User
Beiträge: 15
Registriert: Mittwoch 21. Dezember 2016, 14:54

Sirius3 hat geschrieben:@Daniel-owl: Da ist mir auch ein / zu viel reingerutscht: os.path.join('/sys/bus/w1/devices', slave, 'w1_slave')
Danke.
Hätte ich ja auch selber sehen können :(

Jetzt bekomme ich noch das Problem, dass `data`für die Formatierung des Textes nicht definiert ist.

Code: Alles auswählen

Traceback (most recent call last):
  File "Temp7.py", line 32, in <module>
    main()
  File "Temp7.py", line 25, in main
    data.write('{},{:%6.2f},{}\n'.format(
NameError: global name 'data' is not defined
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Daniel-owl: ja, manchmal programmiert man im Schlaf. Beim "with open" fehlt das "as data".
Daniel-owl
User
Beiträge: 15
Registriert: Mittwoch 21. Dezember 2016, 14:54

@Sirius3

Danke.

Habe es jetzt wie folgt in:

Code: Alles auswählen

def main():
    datum = time.strftime("%Y.%m.%d")
    with open('/home/pi/{}.csv'.format(datum), 'a') as data:
        for slave in iter_slaves():
            temperature = read_temperature(slave)
            data.write('{},{:%6.2f},{}\n'.format(
                slave,
                temperature,
                time.strftime('%H:%M:%S'),
            ))

jetzt macht er mir komischerweise ein Problem mit der Zeit im main

Code: Alles auswählen

Traceback (most recent call last):
  File "Temp7.py", line 32, in <module>
    main()
  File "Temp7.py", line 28, in main
    time.strftime('%H:%M:%S'),
ValueError: Invalid conversion specification
Daniel-owl
User
Beiträge: 15
Registriert: Mittwoch 21. Dezember 2016, 14:54

Wenn ich es mit meinem ursprünglichen Code vergleiche hatte ich dort auch

Code: Alles auswählen

time.strftime("%H:%M:%S")
stehen.
Ob es nun " oder ' Anführungszeichen sind sollte doch den Fehler nicht auslösen
Daniel-owl
User
Beiträge: 15
Registriert: Mittwoch 21. Dezember 2016, 14:54

Auch wenn ich die Zeile ausklammere bekomme ich noch eine Fehlermeldung

Code: Alles auswählen

Traceback (most recent call last):
  File "Temp7.py", line 32, in <module>
    main()
  File "Temp7.py", line 27, in main
    temperature,
ValueError: Invalid conversion specification
wie ich die los werden könnte habe ich keine Idee
Daniel-owl
User
Beiträge: 15
Registriert: Mittwoch 21. Dezember 2016, 14:54

Ich habe eine Lösung gefunden.

Code: Alles auswählen

def main():
    datum = time.strftime("%Y.%m.%d")
    with open('/home/pi/{}.csv'.format(datum), 'a') as data:
        for slave in iter_slaves():
            temperature = read_temperature(slave)
#           print temperature
            data.write('{}\n{}\n{}\n'.format(
                slave,
                temperature,
                time.strftime('%H:%M:%S'),
            ))
den print temperature hatte ich eingefügt um zu sehen welches Format dieses Element hat.

das Skript läuft jetzt.

wie würde ich es denn schaffen, dass er mir die Informationen je in eine Spalte schreibt?
Zuletzt geändert von Anonymous am Dienstag 10. Januar 2017, 12:08, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
wie würde ich es denn schaffen, dass er mir die Informationen je in eine Spalte schreibt?
Indem du keinen Zeilenumbrüche `\n` in die Datei schreibst, sondern die drei Werte z.B. per Semikolon trennst. Oder du nimmst direkt das `csv` Modul, das kümmert sich um den Trenner und wenn nötig auch um's korrekte Quoting.

Gruß, noisefloor
Daniel-owl
User
Beiträge: 15
Registriert: Mittwoch 21. Dezember 2016, 14:54

Hallo,


Super, dank Dir.

habe es jetzt mit Semikolon [;] getrennt.
Das reicht mir aus.

Gruß,
Daniel
Antworten