Seite 1 von 1
Autostart von einem Programm
Verfasst: Freitag 6. Januar 2017, 17:32
von Daniel-owl
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)
Re: Autostart von einem Programm
Verfasst: Freitag 6. Januar 2017, 18:35
von BlackJack
@Daniel-owl: Woher weisst Du dass das nicht läuft?
Re: Autostart von einem Programm
Verfasst: Freitag 6. Januar 2017, 18:40
von Daniel-owl
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
Re: Autostart von einem Programm
Verfasst: Freitag 6. Januar 2017, 18:44
von BlackJack
@Daniel-owl: Wo liegt die Datei denn? Bist Du sicher das Du an der richtigen Stelle schaust?
Re: Autostart von einem Programm
Verfasst: Samstag 7. Januar 2017, 09:47
von noisefloor
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
Re: Autostart von einem Programm
Verfasst: Samstag 7. Januar 2017, 16:31
von Daniel-owl
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
Re: Autostart von einem Programm
Verfasst: Samstag 7. Januar 2017, 16:48
von Daniel-owl
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
Re: Autostart von einem Programm
Verfasst: Samstag 7. Januar 2017, 17:20
von Sirius3
@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()
Re: Autostart von einem Programm
Verfasst: Montag 9. Januar 2017, 12:19
von Daniel-owl
@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
Re: Autostart von einem Programm
Verfasst: Montag 9. Januar 2017, 12:31
von Daniel-owl
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'
Re: Autostart von einem Programm
Verfasst: Montag 9. Januar 2017, 13:09
von Sirius3
@Daniel-owl: Da ist mir auch ein / zu viel reingerutscht: os.path.join('/sys/bus/w1/devices', slave, 'w1_slave')
Re: Autostart von einem Programm
Verfasst: Montag 9. Januar 2017, 13:24
von Daniel-owl
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
Re: Autostart von einem Programm
Verfasst: Montag 9. Januar 2017, 13:26
von Sirius3
@Daniel-owl: ja, manchmal programmiert man im Schlaf. Beim "with open" fehlt das "as data".
Re: Autostart von einem Programm
Verfasst: Montag 9. Januar 2017, 13:30
von Daniel-owl
@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
Re: Autostart von einem Programm
Verfasst: Montag 9. Januar 2017, 13:33
von Daniel-owl
Wenn ich es mit meinem ursprünglichen Code vergleiche hatte ich dort auch
stehen.
Ob es nun " oder ' Anführungszeichen sind sollte doch den Fehler nicht auslösen
Re: Autostart von einem Programm
Verfasst: Montag 9. Januar 2017, 13:42
von Daniel-owl
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
Re: Autostart von einem Programm
Verfasst: Montag 9. Januar 2017, 14:17
von Daniel-owl
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?
Re: Autostart von einem Programm
Verfasst: Dienstag 10. Januar 2017, 11:58
von noisefloor
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
Re: Autostart von einem Programm
Verfasst: Dienstag 10. Januar 2017, 12:26
von Daniel-owl
Hallo,
Super, dank Dir.
habe es jetzt mit Semikolon [;] getrennt.
Das reicht mir aus.
Gruß,
Daniel