Снятие показаний электросчетчика средствами OpenWRT

(на примере роутера TP-LINK TL-WR842ND)

Предупреждение: все что вы делаете на свой страх и риск, так как существует вероятность «окирпичивания» Вашего роутера.

Итак, берем роутер TP-LINK с прошивкой OpenWrt (на момент написания статьи автор использовал версию CHAOS CALMER 15.05, r46767) По начальной настройке роутера c OpenWrt информации в сети много. В OpenWrt должeн установлен пакет bc.

Создаем директорию: /usr/local/power, где будут хранится данные нашей программы: в файле /usr/local/power/v220 - показания электросчетчика, в файле /usr/local/power/watts - потребляемая мощность.

Заменяем файл /etc/rc.button/reset на следующее содержание:

#!/bin/sh
POWER_LED=/sys/devices/platform/leds-gpio/leds/tp-link:green:system/brightness
. /lib/functions.sh
if [ "${ACTION}" = "released" ]
then
echo 0 > $POWER_LED
cat $POWER_LED > /usr/local/power/switch
else
echo 1 > $POWER_LED
cat $POWER_LED > /usr/local/power/switch
fi
return 0

Разбирам роутер, выводим контакты с кнопки reset и подключаем к телеметрическому выходу электросчетчика. Если электросчетчик опламбирован, то подключаем роутер через фоторезистор к светодиоду счетчика. (Тогда в файле /usr/local/power/switch делаем замену echo 0 на echo 1 в шестой строке и echo 1 на echo 0 в девятой строке).

Теперь при нажатии (подачи КЗ) кнопки reset будет гореть индикатор "SYS", и в файле /usr/local/power/switch будет "1". При отжатии кнопки (снятии КЗ) соответствено гаснет "SYS" и в файле /usr/local/power/switch будет "0".

Создаем файл /usr/local/power/my_power.sh c правом исполнения.

В файле my_power.sh редактируем константу MERCURY в зависимости от электосчетчика (32 стоит по умолчанию, работал со счетчиком "Меркурий 201.5", где передаточное число, 3200 имп/кВт*ч) то есть сотая часть значения передаточного числа.

содержание файла my_power.sh:

#!/bin/sh
SWITCH=/usr/local/power/switch
MERCURY=32;
COUNT=0;
BLACK_COUNT=0;
let START_TIME=`date +%s`
read POWER < /usr/local/power/v220 ;
while true
do
read pressed < $SWITCH
if [ "$pressed" = "1" ] ;
then

if [ "$BLACK_COUNT" = "0" ] ;
then
let POWER_OFF=0
let BLACK_COUNT=BLACK_COUNT+1
let COUNT=COUNT+1
if [ "$COUNT" = "$MERCURY" ] ;
then
let END_TIME=`date +%s`
let DELTA=$(($END_TIME-$START_TIME))
let WATTS=$((3600/$DELTA))
printf "%g" "$(echo "scale=3; $WATTS/100"|bc )" > /usr/local/power/watts
let COUNT=0
POWER=$(echo "scale=2; $POWER+0.01" | bc)

let START_TIME=$END_TIME
printf "%g" "$(echo "$POWER" )" > /usr/local/power/v220 ;
fi
fi
fi
if [ "$pressed" = "0" ];
then
let BLACK_COUNT=0
fi
done

И запускаем командой : /usr/local/power/my_power.sh &