PC(Linux)のバッテリ容量をプログラムから知りたいことがあったのでPythonで作ってみました。
例によって参考程度になればと貼っておきます。
他にもっといい方法あれば教えてください。
一応ノードも作りました。
#! /usr/bin/env python
import re
class AcpiChecker():
"""read /proc/acpi/battery/*** files for check the PC's battery"""
def __init__(self, battery_name):
self._info_path = "/proc/acpi/battery/" + battery_name + "/info"
self._state_path = "/proc/acpi/battery/" + battery_name + "/state"
def get_capacity(self):
f = open(self._info_path)
for line in f:
match = re.search(r'^last full capacity:\s*(\d+)', line)
if match:
capacity = match.groups()[0]
f.close()
return capacity
def get_state(self):
f = open(self._state_path)
for line in f:
match = re.search(r'^remaining capacity:\s*(\d+)', line)
if match:
state = match.groups()[0]
f.close()
return state
def get_rate(self):
return float(self.get_state()) / float(self.get_capacity())
if __name__=='__main__':
checker = AcpiChecker('BAT0')
print checker.get_rate()
ノードはこんな感じでてきとーに作ってみました。
#! /usr/bin/env python
import roslib
roslib.load_manifest('otl_battery_checker')
import rospy
from std_msgs.msg import Float64
from battery_check import AcpiChecker
class BatteryCheckerNode():
"""check battery and publish the charge rate"""
def __init__(self, battery_name='BAT0'):
self._checker = AcpiChecker(battery_name)
self._pub = rospy.Publisher('/pc/battery_rate', Float64)
def proc(self):
msg = Float64()
msg.data = self._checker.get_rate()
self._pub.publish(msg)
if __name__=='__main__':
rospy.init_node('pc_battery_checker')
battery_name = 'BAT0'
if rospy.has_param('~device'):
battery_name = rospy.get_param('~device')
check = BatteryCheckerNode(battery_name)
rate = rospy.Rate(1)
while not rospy.is_shutdown():
check.proc()
rate.sleep()
参考にしたサイト