[Gelöst] Problem mit Python 3.7
[Gelöst] Problem mit Python 3.7
Liebe Debiangemeinde, ich habe an einen Raspberry Pi 3B einen Dreidraht Temperatursensor DS1820 angeschlossen. In /boot/config.txt habe ich den nötigen Eintrag gemacht: dtoverlay=w1-gpio, gpioin=4 Damit kennt der Raspi die Hardware und weiss, dass ich an Pin 4 angeschlossen habe.
In der bash kann ich jetzt die Temperatur abfragen mit:
cat /sys/devices/w1_bus_master1/10-000803635672/w1_slave
t=29125 sagt, dass die gemessene Temperatur 29.1°C beträgt.
pi@venus:~ $
3a 00 4b 46 ff ff 0a 10 eb : crc=eb YES
3a 00 4b 46 ff ff 0a 10 eb t=29125
Jetzt würde ich gerne diese Temperaturwerte für Python 3.7 verfügbar machen. Also habe ich probiert:
>>> import subprocess
>>> subprocess.run(["cat","/sys/devices/w1_bus_master1/10-000803635672/w1_slave"])
und erhalte zu meiner Freude:
39 00 4b 46 ff ff 04 10 f2 : crc=f2 YES
39 00 4b 46 ff ff 04 10 f2 t=28500
CompletedProcess(args=['cat', '/sys/devices/w1_bus_master1/10-000803635672/w1_slave'], returncode=0)
>>>
Jetzt kommt die Frage: wie kann ich die ersten zwei Zeilen des Outputs, also die Temperatur für Python verfügbar machen? Anscheinend wird von subprocess.run eine Instanz von bash gestartet und sie kann die interessanten beiden Zeilen auf den Bildschirm schreiben. Dann wird alles an Python zurückgegeben und Python berichtet, dass der Job mit returncode 0 ordentlich beendet wurde. Der Underscore von Python gibt leider nur die letzte Zeile aus.
Entsprechend erhalte ich für
>>> a=subprocess.run(["cat","/sys/devices/w1_bus_master1/10-000803635672/w1_slave"])
3f 00 4b 46 ff ff 03 10 0f : crc=0f YES
3f 00 4b 46 ff ff 03 10 0f t=31562
>>> a
CompletedProcess(args=['cat', '/sys/devices/w1_bus_master1/10-000803635672/w1_slave'], returncode=0)
>>>
Wenn ich in der bash bin, kann ich als workaround die beiden Zeilen der Antwort des Sensors in eine Datei umleiten.
einfach mit blabla... > temperatur.txt
Von dort könnte man sie mit Python lesen. Der Nachteil dieser Methode wäre weiter eine unanständig hohe Abnützung derSmartcard durch all diese Öffnen und Schliessen der Datei.
Zudem ist mir die Umleitung nicht gelungen, wenn ich es von Python aus mit subprocess.run versucht habe. Es ist mir nicht gelingen das > temperatur.txt in den Aufruf einzubetten.
Natürlich könnte man es durch den Aufruf einer Batchdatei versuchen, die den Thermosensor liest und den Wert in eine Datei schreibt. Aber das ist ein hässliches Gemurkse und der Verschleiss der SD Card wird noch grösser.
In der bash kann ich jetzt die Temperatur abfragen mit:
cat /sys/devices/w1_bus_master1/10-000803635672/w1_slave
t=29125 sagt, dass die gemessene Temperatur 29.1°C beträgt.
pi@venus:~ $
3a 00 4b 46 ff ff 0a 10 eb : crc=eb YES
3a 00 4b 46 ff ff 0a 10 eb t=29125
Jetzt würde ich gerne diese Temperaturwerte für Python 3.7 verfügbar machen. Also habe ich probiert:
>>> import subprocess
>>> subprocess.run(["cat","/sys/devices/w1_bus_master1/10-000803635672/w1_slave"])
und erhalte zu meiner Freude:
39 00 4b 46 ff ff 04 10 f2 : crc=f2 YES
39 00 4b 46 ff ff 04 10 f2 t=28500
CompletedProcess(args=['cat', '/sys/devices/w1_bus_master1/10-000803635672/w1_slave'], returncode=0)
>>>
Jetzt kommt die Frage: wie kann ich die ersten zwei Zeilen des Outputs, also die Temperatur für Python verfügbar machen? Anscheinend wird von subprocess.run eine Instanz von bash gestartet und sie kann die interessanten beiden Zeilen auf den Bildschirm schreiben. Dann wird alles an Python zurückgegeben und Python berichtet, dass der Job mit returncode 0 ordentlich beendet wurde. Der Underscore von Python gibt leider nur die letzte Zeile aus.
Entsprechend erhalte ich für
>>> a=subprocess.run(["cat","/sys/devices/w1_bus_master1/10-000803635672/w1_slave"])
3f 00 4b 46 ff ff 03 10 0f : crc=0f YES
3f 00 4b 46 ff ff 03 10 0f t=31562
>>> a
CompletedProcess(args=['cat', '/sys/devices/w1_bus_master1/10-000803635672/w1_slave'], returncode=0)
>>>
Wenn ich in der bash bin, kann ich als workaround die beiden Zeilen der Antwort des Sensors in eine Datei umleiten.
einfach mit blabla... > temperatur.txt
Von dort könnte man sie mit Python lesen. Der Nachteil dieser Methode wäre weiter eine unanständig hohe Abnützung derSmartcard durch all diese Öffnen und Schliessen der Datei.
Zudem ist mir die Umleitung nicht gelungen, wenn ich es von Python aus mit subprocess.run versucht habe. Es ist mir nicht gelingen das > temperatur.txt in den Aufruf einzubetten.
Natürlich könnte man es durch den Aufruf einer Batchdatei versuchen, die den Thermosensor liest und den Wert in eine Datei schreibt. Aber das ist ein hässliches Gemurkse und der Verschleiss der SD Card wird noch grösser.
Zuletzt geändert von oamaru am 23.09.2021 16:08:27, insgesamt 1-mal geändert.
Re: Problem mit Python 3.7
https://docs.python.org/3/library/subprocess.html
schau Dir mal die Sachen "output" betreffend an (get/check etc)
schau Dir mal die Sachen "output" betreffend an (get/check etc)
Re: Problem mit Python 3.7
Probier mal
Code: Alles auswählen
result = subprocess.run(["cat","/sys/devices/w1_bus_master1/10-000803635672/w1_slave"], check=False, capture_output=True, text=True)
result.check_returncode()
print(result.stdout)
Re: Problem mit Python 3.7
Ich würde an deiner Stelle gar nicht den Aufwand über subprocess machen, sondern die Datei direkt öffnen:
Den Code hab ich übrigens gefunden https://www.kompf.de/weather/pionewiremini.html.
Code: Alles auswählen
# function: read and parse sensor data file
def read_sensor(path):
value = "U"
try:
f = open(path, "r")
line = f.readline()
if re.match(r"([0-9a-f]{2} ){9}: crc=[0-9a-f]{2} YES", line):
line = f.readline()
m = re.match(r"([0-9a-f]{2} ){9}t=([+-]?[0-9]+)", line)
if m:
value = str(float(m.group(2)) / 1000.0)
f.close()
except (IOError), e:
print time.strftime("%x %X"), "Error reading", path, ": ", e
return value
[Gelöst] Re: Problem mit Python 3.7
Herzlichen Dank für Eure anregenden Beiträge.
Eggy da werde ich mich noch tiefer reinknien. Ich glaube es lohnt sich
Bullet64 Ich habe Deinen Vorschlag mit Tonny ausprobiert und eine Fehlermeldung kassiert. Wenn ich Eggys Dokument genügend durchgekaut habe, verstehe ich dann hoffentlich warum
Bluestar: Als ich Deinen Vorschlag gelesen habe habe ich mir auf die Stirn geklatscht und mich gefragt, wieso ich da nicht selbst drauf gekommen bin. Super! Das Problem auf die einfachst mögliche Weise gelöst.
Danke Euch allen und gute Zeit!
Eggy da werde ich mich noch tiefer reinknien. Ich glaube es lohnt sich
Bullet64 Ich habe Deinen Vorschlag mit Tonny ausprobiert und eine Fehlermeldung kassiert. Wenn ich Eggys Dokument genügend durchgekaut habe, verstehe ich dann hoffentlich warum
Bluestar: Als ich Deinen Vorschlag gelesen habe habe ich mir auf die Stirn geklatscht und mich gefragt, wieso ich da nicht selbst drauf gekommen bin. Super! Das Problem auf die einfachst mögliche Weise gelöst.
Danke Euch allen und gute Zeit!
Re: Problem mit Python 3.7
und zum Schluss noch eine peinlich-doofe Frage: Wie bekomme ich das [gelöst] ganz oben in die erste Frage?
Re: Problem mit Python 3.7
Ersten Post editieren.
Re: Problem mit Python 3.7
Danke. Ich hab den Knopf (n+1) {rekursiv anwendbar} übersehen.