Přidání teploměru TM - RS232

Z Wiki UnArt Slavičín
Skočit na navigaciSkočit na vyhledávání

Pokud máme v pc teploměr TM - RS232 můžeme aktuální teplotu odebírat přes snmp.

Zobrazení teploty z čidla

Teplotu z čihla si můžeme zobrazit více způsoby viz. [1].

cat /dev/ttyS0

sed 's/\r.*//;q' /dev/ttyS0

head -n 1 /dev/ttyS0

read teplota < /dev/ttyS0 && echo -n $teplota

způsobů je více a výstup by měl vypadat třeba takhle

server:# head -n 1 /dev/ttyS0
+028.1C

Odebírání teploty přes SNMP

Jak přidat do snmp vlastní OID už víme.

Skript get_temperature_template.sh pro snmp může vypadat třeba takhle:

#!/bin/sh -f

PATH=:/bin:/usr/bin

TEMPERATURE=xxx;

PLACE=".1.3.6.1.4.1.2021.255"
REQ="$2"

case "$REQ" in
    $PLACE)      RET=$PLACE.1 ;;
    *)           exit 0 ;;
esac

echo "$RET"
case "$RET" in
  $PLACE.1) echo "integer"; echo $TEMPERATURE; exit 0 ;;
esac

Důležitá je pro nás proměnná TEMPERATURE, kde namísto xxx má být naše teplota. Jelikož SNMP umí jen celá čísla, tak se musíme zbavit desetinných míst. Teploměr vrací hodnotu ve tvaru [znaménko][celá část].[desetinná část]C, např. 044.5C . Desetinné části ze zbavíme tak, že číslo vynásobíme 10 a po přečtení hodnoty z snmp zase vydělíme. Bohužel se mi nedaří získát tuto hodnotu pomocí výše uvedených příkazů přímo v tomto skriptu. Resp. hodnota získat jde ale pokud si prohlédneme dané OID, tak hodnota není definovaná. Pokud někdo ví jak na to, tak sem s tím:-)

Pro je tu ještě jeden skript getnsavet.sh, který ze skriptu get_temperature_template.sh vytváří skript get_temperature.sh ve kterém edituje řádek s teplotou. Výsledným skriptem pro SNMP je tedy get_temperature.sh.

Skript getnsavet.sh:

#!/bin/sh

read TEMP < /dev/ttyS0

SIGN=${TEMP:0:1}
if [ "$SIGN" = "+" ]; then
 VAR=10;
else
 VAR=-10;
fi


# Remove sign
TEMP=${TEMP#?}

# Remove C as Celsius
TEMP=${TEMP%C}

# If number has a float point then we save numner after it.
FLOAT=${TEMP#???.}

# If number has a float point then we remove it and everything after.
TEMP=${TEMP%.?}

# If first digit in number is zero then we remove it.
TEMP=${TEMP#0}


TEMP=$(($TEMP*$VAR + ($FLOAT*$VAR/10)));

sed "5s/.*/TEMPERATURE=$TEMP;/" /var/net-snmp/get_temperature_template.sh > /var/net-snmp/get_temperature.sh

No a jeho pravidelné spuštění každou minutu zajistíme třeba pomocí cronu:

*/1 *    * * * sh /var/net-snmp/getnsavet.sh