1 (edytowany przez gregd72002 2020-10-30 13:18:55)

Temat: Monitor temperatury i napięcia modemu

Witam,

Mam zbudowany router (16mb ram) z kartą sierra wireless (MC8705). Mam zrobiony własny obraz do niego kompilując 19.07.4 i dodając kilka pakietów od Cezarego (np 3ginfo).

Wszystko śmiga jak ma. Ale chciałbym monitorować temperaturę modemu i napięcie. Używając minicoma mogę odczytać te parametry używając

AT
OK
AT!PCVOLT?
Volt state: Normal
Power supply voltage: 3433 mV (143 cnt)


OK
AT!PCTEMP?
Temp state: Normal
Temperature: 35 degC


OK

Modem działa na 'directip' a komendy AT działają na /dev/ttyUSB3

Chciałbym to jakoś skleić np przez 'collectd' tak żeby odczytywał parametry co kilka sekund i tworzył statystyki.

Którędy droga?

2

Odp: Monitor temperatury i napięcia modemu

Collectd ma collectd-mod-exec, więc możesz sobie zrobić skrypt który przez gcom się pyta o parametry które chcesz, a mod-exec to woła.

Ja mam coś takiego zrobionego ale akurat nie do collectd tylko do swoich mechanizmów.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

3 (edytowany przez gregd72002 2020-10-30 22:15:04)

Odp: Monitor temperatury i napięcia modemu

Dzięki Cezary. Wypróbowałem i działa ale czasami dochodzi do konfliktu - ten gcom skrypt się czasami wywala bo np 'gcom-directip' własnie rozmawia z modemem na tym samym urządzeniu /dev/ttyUSB3.

Domyślam się że problem będzie jeszcze większy jak zacznę wywoływać 3ginfo.

Jest na to jakiś sposób sposób?

4

Odp: Monitor temperatury i napięcia modemu

No masz to sam oprogramować. Czyli np. najpierw sprawdzić czy nic już nie korzysta z tego portu.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

5 (edytowany przez gregd72002 2020-11-01 11:05:18)

Odp: Monitor temperatury i napięcia modemu

Chyba wszystko śmiga jak ma teraz. Dzięki!

Podmieniłem /usr/bin/gcom (który był symlinkiem do comgt) tym skryptem który przepuszcza tylko jeden proces:

#!/bin/sh
LOCK=/tmp/modem.lock

LOG=/tmp/modem.log

/bin/lock $LOCK
chmod 777 $LOCK > /dev/null 2>&1

echo -e "$@" >> $LOG
chmod 777 $LOG > /dev/null 2>&1

/usr/bin/comgt $@
ret=$?
echo -e "exit: $ret\r\n" >> $LOG

/bin/lock -u $LOCK

exit $ret

Także teraz 3ginfo i mój collectd i skrypt directip nie wchodzą sobie w drogę.

A co do zbierania danych z modemu to dla tych co to interesuje to taki mam skrypt:

opengt
set com 115200n81
set senddelay 0.05
waitquiet 1 0.2

//send "AT^m"
//waitfor 1 "OK"
//if % != 0 goto error

send "AT!PCVOLT?^m"
get 2 "^m" $s
get 2 "^m" $s
get 2 "^m" $s
waitfor 5 "OK"
if % != 0 goto error
let $r=$left($s,22)
let $r=$right($r,21)
if $r <> "Power supply voltage:" goto error
let a=len($s)
let a=a-23
let $s=$right($s,a)
let v=val($s)
if v=0 let v=0

send "AT!GSTATUS?^m"
get 2 "^m" $s
get 2 "^m" $s
get 2 "^m" $s
get 2 "^m" $q
get 2 "^m" $q
get 2 "^m" $q
get 2 "^m" $q
get 2 "^m" $q
get 2 "^m" $q
get 2 "^m" $q
get 2 "^m" $q
get 2 "^m" $q
waitfor 5 "OK"
if % != 0 goto error
let $s=$right($s,3)
let t=val($s)

let a=len($q)
let $r=$right($q,a-16)
let s=val($r)

print "",v,",",t,",",s,"\n"
exit 0

:error
exit 1

A collectd exec'uje ten oto skrypt:

#!/bin/sh

PORT=/dev/ttyUSB3

HOST=$COLLECTD_HOSTNAME
INTERVAL=$COLLECTD_INTERVAL

INTERVAL=$(awk -v i=$INTERVAL 'BEGIN{print int(i)}')

while true; do
    val=$(gcom -d $PORT -s /opt/modem.collectd)
    v="$(echo "$val" | cut -d',' -f1)"
    t="$(echo "$val" | cut -d',' -f2)"
    s="$(echo "$val" | cut -d',' -f3)"
    echo "PUTVAL \"$HOST/exec-modem/temperature\" interval=$INTERVAL N:$t"
    echo "PUTVAL \"$HOST/exec-modem/voltage\" interval=$INTERVAL N:$v"
    echo "PUTVAL \"$HOST/exec-modem/signal_power\" interval=$INTERVAL N:$s"
    sleep $INTERVAL
done

Do tego UI do luci_statistics (/usr/lib/lua/luci/statistics/rrdtool/definitions/exec.lua):

module("luci.statistics.rrdtool.definitions.exec", package.seeall)

function item()
    return luci.i18n.translate("Exec")
end

function rrdargs( graph, plugin, plugin_instance )

    return {
        {
            per_instance = true,
            title = "%H: %pi - temperature",
            vlabel = "\176C",
            number_format = "%4.0lf \176C",
            data = {
                types = { "temperature" },
                options = {
                    temperature__value = {
                        color = "ff0000",
                        title = "Temperature"
                    }
                }
            }
        },
        {
            per_instance = true,
            title = "%H: %pi - voltage",
            vlabel = "mV",
            number_format = "%4.0lf mV",
            data = {
                types = { "voltage" },
                options = {
                    voltage__value = {
                        color = "ff0000",
                        title = "Voltage"
                    }
                }
            }
        },
        {
            per_instance = true,
            title = "%H: %pi - signal",
            vlabel = "dBm",
            number_format = "%3.0lf dBm",
            data = {
                types = { "signal_power" },
                options = {
                    signal_power__value = {
                        color = "0000ff",
                        noarea = true,
                        title = "Signal quality"
                    }
                }
            }
        }
    }
end

https://i.paste.pics/d478db05a2c9455e155af0436b91460a.png