zed.0xff.me

ibm x40 и китайская батарейка :: часть 2 - solution

часть 1 – описание проблемы и скрипт-логгер

результат

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# grep STARTUP /var/log/battery.log -B1 | grep -v - --

Thu Jul  2 16:25:01 YEKST 2009 :: 14365 mW 15620 mWh 14266 mV
============== STARTUP =============
Thu Jul  2 23:15:01 YEKST 2009 :: 12227 mW 34750 mWh 14893 mV
============== STARTUP =============
Fri Jul  3 06:25:01 YEKST 2009 :: 13117 mW 19380 mWh 14227 mV
============== STARTUP =============
Fri Jul  3 21:15:01 YEKST 2009 :: 13208 mW 23190 mWh 13933 mV
============== STARTUP =============
Mon Jul  6 09:15:01 YEKST 2009 :: 18701 mW 32780 mWh 14168 mV
============== STARTUP =============
Mon Jul  6 20:40:01 YEKST 2009 :: 18523 mW 34460 mWh 13462 mV
============== STARTUP =============
Tue Jul  7 07:25:01 YEKST 2009 :: 17194 mW 39810 mWh 14187 mV
============== STARTUP =============
Wed Jul  8 11:20:01 YEKST 2009 :: 13261 mW 55910 mWh 15657 mV
============== STARTUP =============
Fri Jul 10 11:20:01 YEKST 2009 :: 13829 mW 19030 mWh 14481 mV
============== STARTUP =============
Sun Jul 12 21:45:01 YEKST 2009 :: 13559 mW 21810 mWh 13600 mV
============== STARTUP =============
Thu Jul 16 00:15:01 YEKST 2009 :: 12913 mW 23040 mWh 14364 mV
============== STARTUP =============
Tue Jul 21 07:15:01 YEKST 2009 :: 15477 mW 14800 mWh 14344 mV
============== STARTUP =============
Sat Jul 25 17:45:01 YEKST 2009 :: 6650 mW 17680 mWh 14090 mV
============== STARTUP =============
Fri Aug  7 23:05:01 YEKST 2009 :: 14131 mW 13170 mWh 13854 mV
============== STARTUP =============

получаем список минимальных напряжений батареи,
при которых ноут может самопроизвольно выключиться
в течение следующих 5 минут:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# grep STARTUP /var/log/battery.log -B1|grep mV | awk '{print $12}' | sort -n

13462
13600
13854
13933
14090
14168
14187
14227
14266
14344
14364
14481
14547
14893
15657

выделяем отсюда два некоторых средних значения,
соответствующие уровням “осталось мало заряда” и “осталось КРИТИЧЕСКИ мало заряда” :)
и забиваем их в скрипт:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/sh
grep -wq discharging /proc/acpi/battery/BAT0/state
if [ $? = 0 ]; then
        # discharging
        echo -n "`date` :: " >> /var/log/battery.log
        grep -oE "[0-9]+ .*" /proc/acpi/battery/BAT0/state | xargs >> /var/log/battery.log

        VOLTAGE=`cat /proc/acpi/battery/BAT0/state | grep -o "[0-9]* mV" | awk '{print $1}'`
        if [ $VOLTAGE -lt 14600 ]; then
                echo "0 blink" > /proc/acpi/ibm/led
                if [ $VOLTAGE -lt 14400 ]; then
                        echo "1 blink" > /proc/acpi/ibm/led
                fi
        else
                echo "0 off" > /proc/acpi/ibm/led
        fi
else
        # charging / charged
        echo "0 on" > /proc/acpi/ibm/led
        true
fi

в данном случае скрипт будет:
а) моргать зеленым светодиодом “питание от сети” (led 0) при низком уровне заряда
б) моргать зеленым и оранжевым (led 1) диодами при критическом уровне

а дальше – либо втыкаем блок питания и контроллер перехватывает управление диодами, либо заряд совсем кончается и питание аварийно отключается.

ibm x40 и китайская батарейка

Есть у меня довольно старенький ноут ibm x40. Бывает и старее, конечно :). Купил я его в 2005 году, проц там Pentium-M 1.4GHz, памяти добил до 1.5G, винт всего на 40 гигов.

Какое-то время назад родная батарейка (на 1.1Ah кажется) совсем устала, и ее стало хватать максимум минут на 15. И заказал я на ебэе неродную китайскую батарейку аж на 4400mAh !! :)

Батарейка вскоре пришла, ожидания мои оправдались на 100% – ее хватало на часа на 4 точно, а при желании можно было и до шести растянуть :)

Но! Но так как батарейку делали не суровые IBM-щики, а полуподпольные noname-китайцы – то есть в ней некоторый неприятный глюк – ноут практически никогда не успевает отследить момент когда заряд заканчивается – напряжение падает – и ноут, даже не пискнув, отключается.. я пробовал ставить warning-и на 25% и на 30% (в КДЕ-шных настройках питания) – всё равно момент не ловится..

И вот собрал на коленке следующий скрипт для отслеживания уровня батарейки:

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
grep -wq discharging /proc/acpi/battery/BAT0/state
if [ $? = 0 ]; then
        # discharging
        echo -n "`date` :: " >> /var/log/battery.log
        grep -oE "[0-9]+ .*" /proc/acpi/battery/BAT0/state | xargs >> /var/log/battery.log
else
        # charging / charged
        true
fi

скрипт запускаем кроном каждые 5 минут.

в /etc/conf.d/local.start (скрипт, исполняемый в gentoo при стартапе) добавляем следующее:

1
echo "============== STARTUP =============" >> /var/log/battery.log

в /etc/conf.d/local.stop (скрипт, исполняемый в gentoo при шатдауне) добавляем следующее:

1
echo "============== SHUTDOWN ============" >> /var/log/battery.log

таким образом, в логе видим остаток батареи, а так же маркеры [не]преднамеренного шатдауна системы. например, когда батарейка дропнула своё напряжение – то в логе будет только строчка STARTUP, т.к. шатдаун был аварийным.

лог выглядит вот так:

1
2
3
4
Wed Jul  1 20:40:01 YEKST 2009 :: 12115 mW 66880 mWh 16461 mV
Wed Jul  1 20:45:01 YEKST 2009 :: 11701 mW 65970 mWh 16389 mV
Wed Jul  1 20:50:01 YEKST 2009 :: 12177 mW 65070 mWh 16324 mV
Wed Jul  1 20:55:01 YEKST 2009 :: 11675 mW 64200 mWh 16284 mV

продолжение следует..