[Gelöst] Problem mit Python 3.7

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
oamaru
Beiträge: 45
Registriert: 24.09.2015 11:06:12

[Gelöst] Problem mit Python 3.7

Beitrag von oamaru » 21.09.2021 12:27:40

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.
Zuletzt geändert von oamaru am 23.09.2021 16:08:27, insgesamt 1-mal geändert.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Problem mit Python 3.7

Beitrag von eggy » 21.09.2021 13:26:19

https://docs.python.org/3/library/subprocess.html
schau Dir mal die Sachen "output" betreffend an (get/check etc)

Bullet64
Beiträge: 49
Registriert: 02.06.2017 19:57:01

Re: Problem mit Python 3.7

Beitrag von Bullet64 » 21.09.2021 17:35:42

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)

Benutzeravatar
bluestar
Beiträge: 2346
Registriert: 26.10.2004 11:16:34
Wohnort: Rhein-Main-Gebiet

Re: Problem mit Python 3.7

Beitrag von bluestar » 21.09.2021 19:54:25

Ich würde an deiner Stelle gar nicht den Aufwand über subprocess machen, sondern die Datei direkt öffnen:

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
Den Code hab ich übrigens gefunden https://www.kompf.de/weather/pionewiremini.html.

oamaru
Beiträge: 45
Registriert: 24.09.2015 11:06:12

[Gelöst] Re: Problem mit Python 3.7

Beitrag von oamaru » 23.09.2021 09:45:21

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 :twisted:

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!

oamaru
Beiträge: 45
Registriert: 24.09.2015 11:06:12

Re: Problem mit Python 3.7

Beitrag von oamaru » 23.09.2021 09:56:26

und zum Schluss noch eine peinlich-doofe Frage: Wie bekomme ich das [gelöst] ganz oben in die erste Frage? :facepalm: :oops:

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Problem mit Python 3.7

Beitrag von eggy » 23.09.2021 11:04:43

Ersten Post editieren.

oamaru
Beiträge: 45
Registriert: 24.09.2015 11:06:12

Re: Problem mit Python 3.7

Beitrag von oamaru » 23.09.2021 16:06:21

Danke. Ich hab den Knopf (n+1) {rekursiv anwendbar} übersehen. :facepalm:

Antworten