Ermittelten Temperaturwert in andere Datei schreiben

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo,
    nachdem Dank eurer Hilfe meine Rollos zeitgesteuert wunderbar hoch- und runter fahren, möchte ich noch etwas Luxus einbringen. Und zwar soll dies nicht nur Zeit- sondern auch noch temperaturgesteuert erfolgen. Nach dem Motto, je kälter es draußen ist, desto später sollen die Rollos hoch, bzw. früher runter gefahren werden.

    Eigentlich habe ich die Skriptschnipsel beisammen, habe aber als Nichtprogrammierer ein Dilemma. Die Temperaturerfassung erfolgt in Python, die Zeiterfassung in Bash (wo ich noch am ehesten durchblicke).

    Ich nutze seit mehreren Monaten schon die Temperaturerfassung nach einer Idee von Martin Kompf.
    Der Temperaturwert ist also bereits einmal gemessen und auf Sinnhaftigkeit geprüft. Ich dachte mir nun, dass ich diesen Wert in eine Zwischendatei schreibe, die nichts anderes enthält, als diesen Temperaturwert. Und diesen Wert kann ich mit anderen Programmen mittels cat auslesen und weiter verarbeiten.

    Idealerweise wäre das Skript von Martin Kompf um dem Befehl zu erweitern "Schreibe den Wert temp_nord in die Datei norden.xyz" Vorher noch vielleicht den alten Inhalt oder die ganze Datei norden.xyz löschen.

    Geht das oder ist das zu kompliziert gedacht?

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

  • Ermittelten Temperaturwert in andere Datei schreiben? Schau mal ob du hier fündig wirst!

    • Offizieller Beitrag

    ein simples

    Code
    with open('/PFAD/ZUm/TEMPFILE', 'w') as temp_file:
        temp_file.write(data)

    sollte schon reichen

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Einmal editiert, zuletzt von dbv (4. November 2014 um 18:54)

  • Hallo,


    Der Temperaturwert ist also bereits einmal gemessen und auf Sinnhaftigkeit geprüft. Ich dachte mir nun, dass ich diesen Wert in eine Zwischendatei schreibe, die nichts anderes enthält, als diesen Temperaturwert. Und diesen Wert kann ich mit anderen Programmen mittels cat auslesen und weiter verarbeiten.

    warum so kompliziert?
    Mit Deinem "anderen Programm" hast doch den gleichen Effekt, ohne den Temp-Wert iwo "zwischenpeichern"zu müssen.
    Also:
    Dein Python Proggi liest öffent das DS1820 File(dadurch wird ein neuer Lesezyklus aktiviert)
    prüft und liest den Wert, das File wird wieder geschlossen.
    Der Temp-Wert liegt jetzt inner Variablen.
    In Abhängigkeit davon werden im(gleichen) Python Proggi Rollos hoch oder runtergefahren.
    Das wars.
    Hoffe habe mich verständlich ausgedrückt.

    gruß root

  • Hallo und Danke für eure Tipps.

    Ich weiß, ich neige gern dazu, manches zu verkomplizieren. Um später auch noch durch zu blicken, möchte ich möglichst modular arbeiten. Die Temperaturmessung ist ein eigenes Programm mit einem eigenen Ordner. Ebenso die Rollladensteuerung.

    Nun habe ich eine Aufgabenstellung, wo beide Teile gemeinsam gebraucht werden. Für meine "Denke" ist da diese Zwischendatei ganz gut.
    Den einzigen Nachteil, den ich da sehe ist, dass alle 5 Minuten diese Datei auf die SD geschrieben wird, selbst wenn sie gar nicht gebraucht wird. (Eigentlich brauche ich sie nur 2 mal am Tag und auch nur in der kalten Jahreszeit) Wenn das gravierend für die SD ist, müsste ich mir überlegen, ob ich doch eine gesonderte Temperaturabfrageroutine, die nur bei Bedarf startet, schreibe. Dann hätte ich aber die Angst, dass sich die beiden Abfragen ins Gehege kommen, und falsche (Fehler-) Meldungen verursachen. Ich hatte da mal irgendwo was von Einschwingzeit gelesen.

    Aber hier geht es um das Schreiben der Zwischendatei.

    Leider ist es für mich nicht ganz so simpel ;)

    Um es zu verstehen, habe ich mir mal ein kleines Übungsprogramm im Ordner /home/pi/Skripte/test geschrieben. Der gemessene Temperaturwert heißt im Original "temp5". Hier habe ich ihn nur fest vergeben und ausgedruckt. Die Zwischendatei soll suedtemp heißen.

    Python
    #!/usr/bin/python
    
    
    temp5 = 12.34
    data = temp5
    print temp5, data
    
    
    with open('/home/pi/skripte/test/suedtemp', 'w') as temp_file:
    	temp_file.write(data)


    Nun habe ich schon mit Tabulatoren und Bezeichnungen herumexperimentiert, leider kommen immer wieder Fehlermeldungen, z.B.

    Code
    ~/skripte/test $ ./uebung.py
    12.34 12.34
    Traceback (most recent call last):
      File "./uebung.py", line 8, in <module>
        temp_file.write(data)
    TypeError: expected a character buffer object


    Wo ist mein Denkfehler?[/code]

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

    Einmal editiert, zuletzt von docadams (6. November 2014 um 11:47)

  • Hm, keiner eine Idee?

    [quote='docadams','http://test.forum-raspberrypi.de/forum/index.ph…5935#post115935']
    Hallo und Danke für eure Tipps.

    Ich weiß, ich neige gern dazu, manches zu verkomplizieren. Um später auch noch durch zu blicken, möchte ich möglichst modular arbeiten. Die Temperaturmessung ist ein eigenes Programm mit einem eigenen Ordner. Ebenso die Rollladensteuerung.

    Nun habe ich eine Aufgabenstellung, wo beide Teile gemeinsam gebraucht werden. Für meine "Denke" ist da diese Zwischendatei ganz gut.
    Den einzigen Nachteil, den ich da sehe ist, dass alle 5 Minuten diese Datei auf die SD geschrieben wird, selbst wenn sie gar nicht gebraucht wird. (Eigentlich brauche ich sie nur 2 mal am Tag und auch nur in der kalten Jahreszeit) Wenn das gravierend für die SD ist, müsste ich mir überlegen, ob ich doch eine gesonderte Temperaturabfrageroutine, die nur bei Bedarf startet, schreibe. Dann hätte ich aber die Angst, dass sich die beiden Abfragen ins Gehege kommen, und falsche (Fehler-) Meldungen verursachen. Ich hatte da mal irgendwo was von Einschwingzeit gelesen.

    Aber hier geht es um das Schreiben der Zwischendatei.

    Leider ist es für mich nicht ganz so simpel ;)

    Um es zu verstehen, habe ich mir mal ein kleines Übungsprogramm im Ordner /home/pi/Skripte/test geschrieben. Der gemessene Temperaturwert heißt im Original "temp5". Hier habe ich ihn nur fest vergeben und ausgedruckt. Die Zwischendatei soll suedtemp heißen.

    Python
    #!/usr/bin/python
    
    
    temp5 = 12.34
    data = temp5
    print temp5, data
    
    
    with open('/home/pi/skripte/test/suedtemp', 'w') as temp_file:
    	temp_file.write(data)


    Nun habe ich schon mit Tabulatoren und Bezeichnungen herumexperimentiert, leider kommen immer wieder Fehlermeldungen, z.B.

    Code
    ~/skripte/test $ ./uebung.py
    12.34 12.34
    Traceback (most recent call last):
      File "./uebung.py", line 8, in <module>
        temp_file.write(data)
    TypeError: expected a character buffer object


    Wo ist mein Denkfehler?

    [quote='docadams','http://test.forum-raspberrypi.de/forum/index.ph…5935#post115935']
    Hallo und Danke für eure Tipps.

    Ich weiß, ich neige gern dazu, manches zu verkomplizieren. Um später auch noch durch zu blicken, möchte ich möglichst modular arbeiten. Die Temperaturmessung ist ein eigenes Programm mit einem eigenen Ordner. Ebenso die Rollladensteuerung.

    Nun habe ich eine Aufgabenstellung, wo beide Teile gemeinsam gebraucht werden. Für meine "Denke" ist da diese Zwischendatei ganz gut.
    Den einzigen Nachteil, den ich da sehe ist, dass alle 5 Minuten diese Datei auf die SD geschrieben wird, selbst wenn sie gar nicht gebraucht wird. (Eigentlich brauche ich sie nur 2 mal am Tag und auch nur in der kalten Jahreszeit) Wenn das gravierend für die SD ist, müsste ich mir überlegen, ob ich doch eine gesonderte Temperaturabfrageroutine, die nur bei Bedarf startet, schreibe. Dann hätte ich aber die Angst, dass sich die beiden Abfragen ins Gehege kommen, und falsche (Fehler-) Meldungen verursachen. Ich hatte da mal irgendwo was von Einschwingzeit gelesen.

    Aber hier geht es um das Schreiben der Zwischendatei.

    Leider ist es für mich nicht ganz so simpel ;)

    Um es zu verstehen, habe ich mir mal ein kleines Übungsprogramm im Ordner /home/pi/Skripte/test geschrieben. Der gemessene Temperaturwert heißt im Original "temp5". Hier habe ich ihn nur fest vergeben und ausgedruckt. Die Zwischendatei soll suedtemp heißen.

    Python
    #!/usr/bin/python
    
    
    temp5 = 12.34
    data = temp5
    print temp5, data
    
    
    with open('/home/pi/skripte/test/suedtemp', 'w') as temp_file:
    	temp_file.write(data)


    Nun habe ich schon mit Tabulatoren und Bezeichnungen herumexperimentiert, leider kommen immer wieder Fehlermeldungen, z.B.

    Code
    ~/skripte/test $ ./uebung.py
    12.34 12.34
    Traceback (most recent call last):
      File "./uebung.py", line 8, in <module>
        temp_file.write(data)
    TypeError: expected a character buffer object


    Wo ist mein Denkfehler?

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

    Einmal editiert, zuletzt von docadams (7. November 2014 um 10:28)

  • Ihr seid mir ein paar Pythonexperten :lol:
    Du versuchst eine Zahl (Temperatur) in der Variable data in einer Funktion die nur Strings verarbeitet (write) zu verwenden.

    Python
    #!/usr/bin/python
    
    
    temp5 = 12.34
    data = str(temp5)
    print temp5, data
    
    
    with open('/home/pi/skripte/test/suedtemp', 'w') as temp_file:
        temp_file.write(data)

    sollte funktionieren.

  • Danke, so funktioniert es.
    Leider bin ich noch nicht am Ziel. Das liegt ein meiner vereinfachten Fragestellung.

    Das Ziel meines Exports ist ein Bash-Script, es können da wohl nur ganze Zahlen verarbeitet werden. Für meine Aufgabenstellung ist diese Genauigkeit völlig ausreichend.

    Ich dachte nun,
    - ich messe die Temperatur und kopiere sie mir in eine eigene Variable, um mein ursprüngliches Script nicht durcheinander zu bringen
    - wandle die neue Variable in eine ganze Zahl um
    - wandle diese, wie du es vorgeschlagen hast, in eine Zeichenkette um
    - und kann diese dann exportieren.

    Beim Umwandeln in eine Ganze Zahl scheitere ich allerdings. Der Code

    Code
    temp5 = read_sensor(temp5_path)
    temp5a = temp5
    temp5a = int(temp5a)


    bringt diese Fehlermeldung:

    Code
    Traceback (most recent call last):
      File "./gettemptest.py", line 93, in <module>
        temp5a = int(temp5a)
    ValueError: invalid literal for int() with base 10: '15.937'


    Runden funktioniert zwar:

    Code
    temp5a = float(temp5a)
    temp5a = round(temp5a)
    temp5a = str(temp5a)


    Das Ergebnis ist allerdings 16.0, damit kann mein Shell-Script nichts anfangen.

    EDIT:
    Habe eine Lösung gefunden, bezweifle aber, dass dieser Weg optimal ist. Der gemessene Wert ist offenbar eine Zeichenkette. Diese muss erst in eine Zahl umgewandelt werden, dann in eine ganze Zahl und zum Schluss wieder in eine Zeichenkette, die dann exportiert werden kann.

    Code
    temp5 = read_sensor(temp5_path)
    temp5a = temp5
    temp5a = int(float(temp5a))
    temp5a = str(temp5a)
    with open('/home/pi/raspi2/temp-sued', 'w') as temp_file:
    	temp_file.write(temp5a)


    ... dass ich mich in meinem Leben noch mal mit Fließkommazahlen, Ganzen Zahlen usw. beschäftige ...

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

    Einmal editiert, zuletzt von docadams (9. November 2014 um 19:13)

  • Also, Bash selbst kann nicht mit Fließkommazahlen umgehen, das CLI-Tool "bc" kann das allerdings.
    Eventuell ist es einfacher das Bash-Script umzuschreiben.

    Aber die Lösung scheint mir gut, du könntest das ganze eben etwas kleiner schreiben:

    Code
    temp5 = read_sensor(temp5_path)
    
    
    temp5a = str(int(float(temp5)))
    
    
    with open('/home/pi/raspi2/temp-sued', 'w') as temp_file:
        temp_file.write(temp5a)

    Ich glaube allerdings dass bei der Umwandlung von float nach int die Nachkommastellen einfach abgeschnitten werden,
    das ist keine Rundung meines Wissens. Ich weiß nicht wie wichtig das für dein Script ist, aber eine Rundung würde dann wohl so aussehen:

    Code
    temp5 = read_sensor(temp5_path)
    
    
    temp5a = str(int(round(float(temp5))))
    
    
    with open('/home/pi/raspi2/temp-sued', 'w') as temp_file:
        temp_file.write(temp5a)

    In der zweiten Zeile passiert alles, die Ausgabe deines Sensors wird zum Typ float (Fließkommazahl => 35.1458), dann gerundet (round => 35.0),
    dann zu Integer umgewandelt (int => 35), und wieder zum Typ String (str => 35).

    EDIT:
    gerade mal ausprobiert, also wenn es einen Unterscheid für dich macht, lass round drin:

    Einmal editiert, zuletzt von GosuSan (11. November 2014 um 12:08)


  • ValueError: invalid literal for int() with base 10: '15.937'
    Runden funktioniert zwar:
    Das Ergebnis ist allerdings 16.0, damit kann mein Shell-Script nichts anfangen.

    ... dass ich mich in meinem Leben noch mal mit Fließkommazahlen, Ganzen Zahlen usw. beschäftige ...

    wie jung bist du ? auch gerne per PN denn docadams kennen wirklich nur die alten "Säcke" wie ich :lol:


    Ich glaube allerdings dass bei der Umwandlung von float nach int die Nachkommastellen einfach abgeschnitten werden,
    das ist keine Rundung meines Wissens.

    ähm, wer das von docadams liest sieht doch wie aus 15.937 eben 16.0 wird, wenn das nicht runden ist?

    aber das verstehe ich nicht:

    warum nicht so? was passiert dann?

    Code
    >>> temp = 43.6
    >>> print(temp)
    >>> temp = float(temp)
    >>> print(temp)
    >>> temp = round(temp)
    >>> print(temp)
    >>> temp = int(round(temp))
    >>> print(temp)

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)


  • ähm, wer das von docadams liest sieht doch wie aus 15.937 eben 16.0 wird, wenn das nicht runden ist?


    MIT round() ist es gerundet (dritter Code-Abschnitt in seinem Beitrag), in seinem "EDIT"-Code, in dem er die Lösung gefunden, hat hat er es weggelassen.


    aber das verstehe ich nicht:

    Das ist nur ein Versuch im Terminal um den Unterschied zwischen round() und float() -> int() - Konvertierung
    zu veranschaulichen, hat mit dem Script des Thread-Erstellers erstmal nix zu tun.

  • Hallo,
    das Runden ist für meine Aufgabenstellung nicht so wichtig. Runden oder Abschneiden, da gibt es einen Fehler von maximal +- 0,5 Grd).

    Mein Ziel ist es, dass im Winter die Rollos bei Kälte später hoch fahren. Ich habe es noch nicht umgesetzt, aber ich dachte etwa so, dass bei einer Außentemperatur unter 10 Grd Celsius das Rollo 900 sec später hoch fährt, unter 5 Grd. weitere 900 sec, unter 0 Grd. weitere 900 sec. usw.
    Abends entsprechend eher, da muss ich allerdings das Rollo-hoch-Script eher starten lassen. Und im Sommer soll ab über einer bestimmten Temperatur die Rollos runter, damit die Sonne nicht so einheizt. Aber ob das nun bei 11 oder 10 Grd. passiert, ist nicht wichtig, die Werte sind eh willkürlich genommen. So ist der Plan.

    Eigentlich hätte ich als allererstes eine andere Frage klären sollen.
    Macht man das überhaupt diese Weise, Werte von einem Programm in ein anderes Programm übertragen?

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

  • Wenn du wirklich einen einzigen Wert übertragen willst kannst du das durchaus so machen.
    Hättest du mehrere Werte / Parameter zu übertragen könnte man über Austauschsysteme wie z.B. XML oder einer MySQL-Datenbank nachdenken,
    aber für einen einzigen Temperaturwert tuts die Textdatei genau so gut, wenn nicht sogar besser (manchmal ist einfacher besser).

    Wenn dein zweites Programm ein Shell-Script (und kein compiliertes Programm) ist, dann würde ich mir überlegen beide zu kombinieren
    (ob nun in als Shell- oder in Python-Script dürfte egal sein)


  • Wenn dein zweites Programm ein Shell-Script (und kein compiliertes Programm) ist, dann würde ich mir überlegen beide zu kombinieren
    (ob nun in als Shell- oder in Python-Script dürfte egal sein)


    Das lasse ich mal lieber. Ich bin kein Programmierer. Deshalb teile ich das lieber in Teilaufgaben. Einmal, dass ich es überhaupt verstehe, was ich da mache, und auch später noch durchblicke.
    Und außerdem habe ich da bestimmt noch lange irgendwas zu "optimieren".

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,


  • Hallo,
    das Runden ist für meine Aufgabenstellung nicht so wichtig. Runden oder Abschneiden, da gibt es einen Fehler von maximal +- 0,5 Grd).

    aber warum versuchst du nicht mal das?

    warum nicht so? was passiert dann?

    Code
    >>> temp = 43.6
    >>> print(temp)
    >>> temp = float(temp)
    >>> print(temp)
    >>> temp = round(temp)
    >>> print(temp)
    >>> temp = int(round(temp))
    >>> print(temp)

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • aber warum versuchst du nicht mal das?

    warum nicht so? was passiert dann?

    Code
    .....



    Da passiert immernoch genau das selbe wie in meinem Beitrag Nummer 8 im zweiten Code Tag steht. ;)
    Wie von bootsmann schon so blumig umschrieben.


  • Das ist nur ein Versuch im Terminal um den Unterschied zwischen round() und float() -> int() - Konvertierung
    zu veranschaulichen, hat mit dem Script des Thread-Erstellers erstmal nix zu tun.

    das weiss ich doch :wallbash:

    war auch eigentlich an docadams gerichtet

    das sollte er mal probieren:


    warum nicht so? was passiert dann?

    Code
    >>> temp = 43.6
    >>> print(temp)
    >>> temp = float(temp)
    >>> print(temp)
    >>> temp = round(temp)
    >>> print(temp)
    >>> temp = int(round(temp))
    >>> print(temp)


    Da passiert immernoch genau das selbe wie in meinem Beitrag Nummer 8 im zweiten Code Tag steht. ;)
    Wie von bootsmann schon so blumig umschrieben.

    ja und, es wird beklagt das es nicht läuft

    Code
    >>> temp = 43.6
    >>> print(temp)
    >>> print(float(temp))
    >>> print(round(temp))
    >>> print(int(temp))
    >>> print(temp)

    jede Funktion funktioniert, sieht man an den Ausgaben, aber temp selber wird nie verändert, es gibt keine Zuweisung, deswegen soll das ja probiert werden,

    Code
    >>> temp = 43.6
    >>> print(temp)
    >>> temp = float(temp)
    >>> print(temp)
    >>> temp = round(temp)
    >>> print(temp)
    >>> temp = int(round(temp))
    >>> print(temp)

    vorletzte Zeile wird der Funktion int() die round() eingepflanzt

    nur zu sagen es geht nicht, ohne die Ausgabe zu posten ist mir zu dünne ;)

    Etwas Mitarbeit von einem jungen TO darf erwartet werden.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (12. November 2014 um 10:52)

  • Hallo noch mal.
    es gibt jetzt hier eine lange Nachrede wegen des Rundens. Meine Codezeile

    Code
    temp5a = round(temp5a)

    aus #7 war doch nur der unsinnige Versuch, durch Runden die Nachkommastellen weg zu bekommen. Das ist natürlich völliger Unsinn, wie ich inzwischen (wieder) gelernt habe.
    Aber das ist wirklich nicht so wichtig, ob bereits ab 9,999 Grad oder erst an 9,499 Grad die Rollos später hoch fahren.
    Ich glaube euch, dass es mit dem Runden geht :D

    Die Aufgabe funktioniert jetzt so, wie ich es mir vorgestellt hatte. Die Aufgabe des bei Kälte früheren Runterfahrens ist ja ähnlich, da müssen nur die Wartezeiten pro Woche noch umgeschrieben werden, weil sich ja die Startzeit ändert. Das ist aber stupides Zahlenändern und "rückwärtsdenken".

    Aber ich habe mit dem Projekt noch so viele Baustellen, wo ich meine Zähne wetzen oder ausbeißen kann.
    Eine Baustelle schiebe ich schon lange vor mir her. Bevor ich da aber Fragen stelle, will ich erst mal sehen, ob ich selber weiter komme.
    Deshalb mach ich jetzt hier mal zu.

    Also nochmals vielen Dank an alle, die mir hier weitergeholfen haben :bravo2:

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!