LMU - Das Hilfe Forum für Linux Mint

Software => Shell-Programmierung und Scripting => Thema gestartet von: r00x am 04.02.2021, 10:29:20

Titel: Bash Script mit Schleife und Ausgabe in Datei
Beitrag von: r00x am 04.02.2021, 10:29:20
Hallo.

Ich kenne mich mit bash zu wenig aus um dies selbst zu schaffen. Hinzu kommt eine Schleife, womit ich noch nicht gearbeitet habe. Deshalb hoffe ich hier auf Hilfe.

Zur Idee: Ich lese mit dem Raspberry Temperatur Sensoren aus und habe mir damit eine visuelle Darstellung auf einem Webserver mit PHP & SQL geschaffen.
Grundsätzlich funktioniert alles. Das einzige Problem ist, dass manchmal ein Sensor falsch ausgelsen wird. Dieser Fehler ist leider nicht reproduzierbar. Manchmal ist von 100x auslesen nur 1x ein falscher Wert und manchmal 3x hintereinander der falsche Wert.

Bis jetzt habe ich die Sensoren mit PHP ausgelesen. Um aber auf zusätzliche Pakete verzichten zu können, möchte ich dies gerne mit einem bash Script realisieren. (Ich lese Werte von mehreren Raspberrys an unterschiedlichen Standorten aus)
Mit einem bash Script wäre auch die "Wartung" der Raspberrys einfacher, da ich nicht auf den Softwarestand der verwendeten Pakete schauen muss, bzw. wenn sich wieder mal der Syntax bei PHP ändert muss ich nicht alles ändern.

Was soll das Script nun können?

1. Sensor auslesen
2. Werte formatieren (Denke zumindest, dass dies nötig ist)
3. Prüfen ob die Werte stimmen
4. Wenn die Werte stimmen in Datei schreiben, sonst nochmals den Sensor auslesen

Gedacht habe ich an eine while Schleife, nur wie geschrieben bekomme ich das nicht hin.

So sehen die Daten vom Sensor aus

Ausgabe:
6a 01 4b 46 7f ff 06 10 5f : crc=5f YES
6a 01 4b 46 7f ff 06 10 5f t=21750

Diese Daten habe ich bis jetzt mit PHP weiter verarbeitet und in die Datenbank geschrieben.
Zur Veranschaulichung hier der PHP Code:

$temperatureSensorPath1 = "Sensorpfad";
while ($temperature1 >= 85)
{
$tempSensorRawData1 = implode('', file($temperatureSensorPath1));
$tempSensorTemperature1 = substr($tempSensorRawData1, strpos($tempSensorRawData1, "t=") + 2);
$temperature1 = sprintf("%2.1f", $tempSensorTemperature1 / 1000);
}


Also denke ich muss ich diese Daten formatieren damit ich diese dann im Bash Script verarbeiten (vergleichen) kann.
Dafür habe ich den Befehl mit awk gefunden.

cat /sys/bus/w1/devices/28-000002bb404f/w1_slave | awk '/t=/{sub(/^.+t=/, "");c=$0/1000;print c}'
Ausgabe:
21.75
Dies wäre nun der Temperaturwert formatiert mit einem Komma. Auch die Ausgabe vom Vorzeichen "-" funktioniert mit diesem Befehl. Optimal wäre noch, wenn der Wert auf nur 1 Kommastelle gerundet ausgegeben wird.

Nun noch zum "falschen" Wert. Die Ausgabe sieht dann so aus:

Ausgabe:
50 05 4b 46 7f ff 0c 10 1c : crc=1c YES
50 05 4b 46 7f ff 0c 10 1c t=85000

Also die Ausgabe t=85000 als falsch, ist immer die gleiche. Somit müsste ich dem Script nun sagen, wenn der Wert 85 ist, soll es den Sensor nochmals lesen und erst dann in eine Datei schreiben.

Ich hoffe meine Problemstellung ist nicht zu kompliziert formuliert und man kann dem einigermaßen folgen.

Würde mich freuen, wenn mir jemand helfen kann.

Danke & mfg r00x

//edit: Wie die Ausgabe dann in eine Datei aussieht wäre mir egal, dies würde ich dann mit PHP weiter bearbeiten. Also egal ob der gesamte String vom Sensor in eine Datei geschrieben wird oder nur der tatsächliche Temperaturwert.

//edit2: Derzeit lese ich die Sensoren "raw" auf den Server, verarbeite die Daten mit PHP und schreibe diese in die Datenbank. Danach prüfe ich die SQL Datenbank ob der Wert 85 vorkommt und lösche einfach den ganzen Datensatz wenn dem so ist. ::)

//edit3: Ok ich habe es irgendwie geschafft. Obwohl ich trotzdem nicht mit dem Syntax von Bash und awk klar komme  :o

Hier ein kurzes Beispiel:
temp1=$(ssh 192.168.0.4 cat /sys/bus/w1/devices/28-0000073ae18d/w1_slave | awk '/t=/{sub(/^.+t=/, "");c=$0/1000;print c}')
while [ $temp1 = 85 ]
do
temp1=$(ssh 192.168.0.4 cat /sys/bus/w1/devices/28-0000073ae18d/w1_slave | awk '/t=/{sub(/^.+t=/, "");c=$0/1000;print c}')
done
echo $temp1 >> /home/pi/test/temp1

Verbesserungen werden trotzdem gerne angenommen  ;)