Ist es ein Umrechnungsfehler?

  • Hallo,
    ich gebe zu, ich kupfere ab, ohne ohne so recht zu wissen, was ich mache. Darum weiß ich auch nicht so recht, wo was falsch läuft und bitte um eure Hilfe.


    Also ich möchte Temperaturen auslesen und in eine Datenbank bringen. Das funktioniert auch wunderbar, allerdings nur bei Temperaturen ab +1Grad.
    Im Temperaturbereich größer -1 und kleiner +1 werden wirre Temperaturen angezeigt, also genau dann, wenn in w1_slave weniger als 4 Stellen ausgewiesen werden.
    Und bei Temperaturen unter -0,999 steigt die angezeigte Temperatur wieder, das Minus wird also ignoriert.


    Das Ausleseskript sieht so aus:



    Der Fehler liegt vermutlich in Zeile 5, aber wie müsste die aussehen, dass negative Werte negativ bleiben und auch Werte korrekt übernommen werden, die in w1_slave kleiner 1000 sind?

    Viele Grüße
    DocAdams

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

  • Probiere mal

    Code
    temp=`echo $tempread | egrep -o '[+-]?[0-9]+$'`

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

  • Das hatte leider keine Wirkung, weder im Bereich um 0 Grad noch im negativen Bereich.

    Viele Grüße
    DocAdams

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

  • Wie sehen denn die gelesenen Tempwerte genau aus? Wenn z.B. noch was dahinter steht funktioniert es so nicht. Dann muss der $ raus aus dem regex.
    Der regex akzeptiert alle gueltigen Integerformate. Du koenntest z.B. mal ein echo $tempread vor dem grep machen.


    Code
    framp@majestix ~/ttt $ echo "dummy -89 grad" | egrep -o '[+-]?[0-9]+'
    -89
    framp@majestix ~/ttt $ echo "dummy -89 grad" | egrep -o '[+-]?[0-9]+$'
    framp@majestix ~/ttt $

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

    Edited once, last by framp ().

  • Sorry, ich weiß nicht so recht, was ich machen soll.

    Code
    pi@FHEM ~ $ sudo /sys/bus/w1/devices/28-00000561484d/w1_slave $ echo  | egrep -o '[+-]?[0-9]+'
    sudo: /sys/bus/w1/devices/28-00000561484d/w1_slave: command not found


    Die auszulesende Datei w1_slave beinhaltet das:

    Code
    77 00 4b 46 7f ff 09 10 52 : crc=52 YES
    77 00 4b 46 7f ff 09 10 52 t=7437


    Daraus werden korrekt 7,4 Grad
    Würde da jetzt z.B. t= 732 stehen, erwarte ich 0,7 Grad, es erscheinen aber Phantasiezahlen (85 Grad oder so) Hm, wenn ich das so sehe, _könnnnte_ das vielleicht das 100fache von der tatsächlichen Gradzahl sein. In dem engen Bereich ist das schlecht zu prüfen.
    Und würde dort z.B. t=-7437 stehen, erwarte ich -7,4 Grad, und nicht 7,4 Grad.

    Viele Grüße
    DocAdams

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

  • Welche Einheit die Messwerte haben weiss ich nicht.


    Wenn Du das folgende Script laufen lässt kannst Du verfolgen wie sich der ausgelesene Temperaturwert ändert. Es werden 10 Werte im Abstand von 5 Sekunden gelesen aud ausgegeben.


    Bash
    #!/bin/bash
    # Read temperature from sensor
    for i in $(seq 1 10); do
        tempread=`cat /sys/bus/w1/devices/28-00000561484d/w1_slave`
        echo $tempread
        sleep  5
    done

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

  • Code
    pi@FHEM ~ $ sudo /sys/bus/w1/devices/28-00000561484d/w1_slave $ echo  | egrep -o '[+-]?[0-9]+'
    sudo: /sys/bus/w1/devices/28-00000561484d/w1_slave: command not found


    Was soll der Befehl denn bewirken?


    Einen Befehl "/sys/bus/w1/devices/28-00000561484d/w1_slave" gibt es nicht, das ist eine Datei
    Also wenn dann müsstest du sudo BEFEHL ausführen, also zum Beispiel: sudo cat /sys/bus/w1/devices/28-00000561484d/w1_slave
    Wenn du die Ausgabe aber weiter verarbeiten willst, musst du entweder die Ausgabe in eine Variable schreiben:

    Code
    Variable=$(sudo cat /sys/bus/w1/devices/28-00000561484d/w1_slave)


    Oder eine andere Schreibweise:

    Code
    Variable=`sudo cat /sys/bus/w1/devices/28-00000561484d/w1_slave`

    (macht beides das selbe)


    Und anschliesend $Variable weiter verarbeiten


    Oder du arbeitest mit sog, pipes ( | :(

    Code
    sudo cat /sys/bus/w1/devices/28-00000561484d/w1_slave | egrep -o '[+-]?[0-9]+'


    Du kannst natürlich auch beides kombinieren:

    Code
    Variable=$(sudo cat /sys/bus/w1/devices/28-00000561484d/w1_slave)
    echo $Variable | egrep -o '[+-]?[0-9]+'


    /EDIT:
    Wenn du aus

    Code
    77 00 4b 46 7f ff 09 10 52 t=7437


    Das t=7437 haben willst würde ich das wie folgt machen:

    Code
    cat /sys/bus/w1/devices/28-00000561484d/w1_slave | grep "t=" | awk {'print $10'}


    Dann würde er dir schon mal t=7437 ausgeben...
    Wenn du das auch noch zerlegen willst weil du das t= nicht haben willst:

    Code
    cat /sys/bus/w1/devices/28-00000561484d/w1_slave | grep "t=" | awk {'print $10'} | cut -d'=' -f2


    Dann wäre die Ausgabe: 7437


    Und um daraus dann einen brauchbaren °C Wert mit Komma Stellen zu kriegen musst du zunächst einen Taschenrechner installieren:

    Code
    apt-get install bc


    Und der Code wäre dann zB:

    Code
    echo "scale=2; $(cat /sys/bus/w1/devices/28-00000561484d/w1_slave | grep "t=" | awk {'print $10'} | cut -d'=' -f2) / 1000" | bc -l)


    Ausgabe wäre:

    Code
    7.43
  • meigrafd: Den cut kann man sich auch noch sparen und gleich den Wert im awk extrahieren mit

    Code
    awk {'split($10,e,"="); print e[2]}'

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

  • Sorry für mein längeres Schweigen, aber ... Weihnachten ist auch wichtig ;)


    Außerdem habe ich versucht, euch zu folgen. Und das dauert bei mir etwas, liegt also ausschließlich an mir.


    Und ich habe einige Testreihen gemacht und denke jetzt, es liegt nicht an dem Skript aus Beitrag #1.
    Ich Nichtprogrammierer interpretiere es so:
    In Zeile 3 wird der Inhalt aus der Datei w1_slave ausgelesen
    In Zeile 5 wird in die Variable temp der Wert eingetragen
    In Zeile 7 wird mit Hilfe von Programm bc dieser Wert durch 1000 geteilt und in Variable temp2 geschrieben
    In Zeile 9 wird daraus $temp2 zur Weiterverarbeitung


    Ich habe es überprüft, die Variable $temp2 hat in jedem gemessenen Temperaturbereich, also bei negativen Temperaturen, bei Temperaturen zwischen >-1 und <+1 Grad und natürlich ab 1 Grad immer den richtigen Wert.


    Der Fehler muss also erst in der späteren Verarbeitung reinkommen. Bleibt eigentlich nur RRDtool, an der grafischen Aufbereitung mit MRTG kann es nicht liegen, weil auch fehlerhafte Zahlenwerte angezeigt werden, nicht nur in der Grafik. Im Bild ist zu sehen, dass ich ca. 20.30 Uhr den Eisbeutel an den Sensor gehalten habe und ab +0.9 Grad und tiefer die Werte spinnen, Grafik und Zahlenwert (siehe Maximalwert).
    Aber eigentlich kann ich mir das nicht vorstellen. MRTG und RRDtool habe ich nach diesem Tut installiert und die ganze Aufbereitung nach diesem Tut. Da ist eigentlich alles logisch, was ich so verstehen kann.
    Schade, denn die ganze Temperaturaufbereitung und so finde ich echt schön und nutzenswert.

  • Aha! Jetzt verräst du zum ersten mal das du MRTG verwendest :(


    Leider ist mit MRTG keine Anzeige negativer Werte möglich.


    Aber du würfelst hier auch leider was durcheinander: MRTG ist nicht RRDtool.. MRTG kann keine nagtiven Werte darstellen wohingegen RRDtool das durchaus kann, allerdings ist die Konfiguration bzw Einrichtung wie ich finde wesendlich komplizierter, weshalb ich bei meinem Temperatur Funk Sensor Projekt stattdessen auf SQLite und JPGraph gesetzt habe ;)




    PS: " größer -1 und kleiner +1 werden" ist stark vewirrend da eigentlich "größer -1" bedeutet das es im plus bereich liegt und "kleiner +1" bedeutet wiederum im Minus Bereich... "kleiner +1" wäre zB 0 oder -1


  • Aha! Jetzt verräst du zum ersten mal das du MRTG verwendest :(
    Leider ist mit MRTG keine Anzeige negativer Werte möglich.
    ...
    PS: " größer -1 und kleiner +1 werden" ist stark vewirrend da eigentlich "größer -1" bedeutet das es im plus bereich liegt und "kleiner +1" bedeutet wiederum im Minus Bereich... "kleiner +1" wäre zB 0 oder -1


    Das erklärt alles. Leider hat es sich damit für mich erledigt, da ich ja auch Außentemperaturen messen möchte.


    Dein Projekt habe ich auch gesehen, allerdings erst nach dem anderen. Vieles ist für mich neu auf dem Gebiet und da mache ich lieber immer nur eine Sache, um nicht durcheinander zu kommen. Nun stürze ich mich auf deins ;)
    Bin aber noch unschlüssig, weil ich eigentlich keine Funkstrecke machen wollte, sondern alles via GPIO. Und da wäre eine 1-wire-Lösung gut. Na, ich grüble noch....


    Zu MRTG und RDDTool hatte ich nichts gesagt, weil ich den Fehler im Skript vermutet hatte. Mein Fehler.


    Ich meinte schon so, wie ich geschrieben hatte. Ich wollte unterscheiden zwischen negativen Temperaturen und dem Temperaturbereich um die 0 Grad. Also der Bereich 0,00 und 0,99 Grad. Denn da spinnt die Anzeige auch. Aber das hat sich jetzt ohnehin erledigt.


    Also vielen Dank noch mal für die Aufklärung.

    Viele Grüße
    DocAdams

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

    Edited once, last by docadams ().

  • Du musst ja nicht das mit den Funkmodulen umsetzen sondern brauchst nur den Part der die Daten ausliest und in die SQLite Datenbank schreibt. Und dann natürlich auch noch den Part der die Daten aus der Datenbank ausliest und mithilfe JPGraph (oder etwas anderem) grafisch darstellt...


    Bei mir ist das allerdings zZt so das meine Temperatur Sensoren selbstständig und regelmässig ihr Daten an dem Empfänger übergeben und deshalb ein perl Script nur permanent laufen muss und auf weitere Werte warten brauch....
    Du hingegen musst das Script regelmässig selber ausführen um die 1wire Sensoren auszulesen und das Script muss die gesammelten Werte dann eben in die Datenbank eintragen. Wie immer gibt es mehrere Möglichkeiten, ich hab in meinem Project den Weg über eine add.php gewählt aber du könntest das auch in dem selben bash Script umsetzen was die Daten ausliest :huh:

  • Vielen Dank für die Ideen, da wird mir auch 2014 sicher nicht langweilig ;)

    Viele Grüße
    DocAdams

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