Portál AbcLinuxu, 14. května 2024 16:10


Dotaz: Průměrná teplota cyklem v bash

14.6.2019 09:13 cvp | skóre: 18
Průměrná teplota cyklem v bash
Přečteno: 513×
Odpovědět | Admin

Ahojte,
snažím se rozběhnout script pro vytvoření cyklu, který spočítá teplotu dohramdy a na konci provedu dělení a získám tak průměrnou teplotu.
Bohužel se mně to nějak nedaří dát dohromady. Poradíte prosím?

 

#!/bin/bash
total_temp=0
avg_temp=0
for i in {1..5}
do
teplota="`cat /sys/bus/w1/devices/28-0301977927ab/w1_slave | sed -n 's/^.*\(t=[^ ]*\).*/\1/p' | sed 's/t=//' | awk '{x=$1}END{print(x/1000)}'`"
total_temp = $total_temp + $teplota
sleep 2
done

avg_temp = $total_temp / 4

echo $avg_temp

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

14.6.2019 10:26 NN
Rozbalit Rozbalit vše Re: Průměrná teplota cyklem v bash
Odpovědět | | Sbalit | Link | Blokovat | Admin
Minimalne ta aritmetika(neumi desetina cisla..) v shellu by mela byt takto:
total_temp=$(($total_temp + $teplota))
avg_temp=$(($total_temp / 4))
Co je vystupem prikazu:
cat /sys/bus/w1/devices/28-0301977927ab/w1_slave
?
14.6.2019 14:18 GeorgeWH | skóre: 42
Rozbalit Rozbalit vše Re: Průměrná teplota cyklem v bash
Na vypocty by som skor pouzil man 1 bc.
16.6.2019 14:57 asdf
Rozbalit Rozbalit vše Re: Průměrná teplota cyklem v bash
Co je vystupem prikazu:
cat /sys/bus/w1/devices/28-0301977927ab/w1_slave
?
neco jako:
9a 01 4b 46 7f ff 0c 10 9f : crc=9f YES
9a 01 4b 46 7f ff 0c 10 9f t=25625
14.6.2019 14:13 GeorgeWH | skóre: 42
Rozbalit Rozbalit vše Re: Průměrná teplota cyklem v bash
Odpovědět | | Sbalit | Link | Blokovat | Admin
Priemernu teplotu pri piatich meraniach vypocitam vydelenim suctu teplot cislom styri... https://www.youtube.com/watch?v=03dfoqw70lw&t=10
15.6.2019 08:22 Peter Golis | skóre: 64 | blog: Bežné záležitosti | Bratislava
Rozbalit Rozbalit vše Re: Průměrná teplota cyklem v bash
To by dokazovalo pôvod globálneho oteplovania.
16.6.2019 16:06 asdf
Rozbalit Rozbalit vše Re: Průměrná teplota cyklem v bash
Odpovědět | | Sbalit | Link | Blokovat | Admin
#!/bin/bash
total_temp=0
values=0
for i in {1..5}; do
    teplota=`awk -F'=' '/t/{print $2/1000}' /sys/bus/w1/devices/28-0301977927ab/w1_slave`
    total_temp=`echo $total_temp + $teplota | bc -l`
    values=$(($values + 1))
    sleep 2
done

avg_temp=`echo $total_temp / $values |bc -l`

echo $avg_temp
16.6.2019 17:45 debian+
Rozbalit Rozbalit vše Re: Průměrná teplota cyklem v bash
Co tak pouzit:
let values++
k3dAR avatar 16.6.2019 22:20 k3dAR | skóre: 62
Rozbalit Rozbalit vše Re: Průměrná teplota cyklem v bash
a co tak pouzit:
((values++))
porad nemam telo, ale uz mam hlavu... nobody
17.6.2019 23:54 asdf
Rozbalit Rozbalit vše Re: Průměrná teplota cyklem v bash
Coz tak netrolit a ukazat vlastni kod ?
17.6.2019 16:19 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Průměrná teplota cyklem v bash
Odpovědět | | Sbalit | Link | Blokovat | Admin
#!/bin/bash
total_temp=0
values=5
for ((i=0; i<$values; i++)); do
    teplota=`sed -n 's/^.*t=\([^ ]*\).*/\1/p' /sys/bus/w1/devices/28-0301977927ab/w1_slave`
    ((total_temp+=teplota))
    sleep 2
done

((avg_temp=total_temp/values))
echo ${avg_temp%???}.${avg_temp: -3}
A mas to aj s povodnou presnostou (fixed point arithmetic) a s minimom novych procesov (aj ta funkcnost toho sedu sa da prepisat do cisteho bashu, cim sa to asi 10x urychli, ale uz sa mi nechce).
If you hold a Unix shell up to your ear, you can you hear the C.
18.6.2019 00:07 asdf
Rozbalit Rozbalit vše Re: Průměrná teplota cyklem v bash
A nebo to rovnou nabastlime cele v awk kdyz uz se stejne pouzil
# cat w1_awg.awk
BEGIN {
    if ((ARGC < 2) || (ARGC > 3)) {
        print "Usage:", ARGV[0], "/sys/bus/w1/devices/[sensor_id]/w1_slave [samples]"
        exit 1
    }
    if (ARGC==3){
        SAMPLES=ARGV[2]
        if (SAMPLES !~ "[1-9][0-9]*") {
            print "Number of samples must be number greather than zero"
            exit 2
        }
    } else {
        SAMPLES=5
    }
    FNAME=ARGV[1]
    TEMP_SUM=0

    for (i = 1; i <= SAMPLES; ++i) {
        while((getline line < FNAME) > 0 ) {
             if (line ~ "t=") {
                split(line, f, "=")
                TEMP_SUM+=f[2]/1000
             }
        }
        close(FNAME)
        system("sleep 2")
    }
    print TEMP_SUM/SAMPLES
}
# awk -f w1_awg.awk /sys/bus/w1/devices/28-0301977927ab/w1_slave 3
25.75
#

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.