web-dev-qa-db-ja.com

消費電力インジケータはありますか?

私のノートブックが常にどれだけの電力を消費しているかを知りたいです。

したがって、現在の消費電力(mAで測定される電流またはWで測定される電力)を常に(1秒の間隔で)常にモニターし、Ubuntu 16.04のUnityパネルに表示するインジケーターが必要です。

5
Byte Commander

注:現在のところ、ソフトウェアを介してACアダプタまたはデスクトップコンピュータ上のラップトップの消費電力を測定することはできません手段。 Windowsなどの他のOSでも、その情報を提供するために外部ハードウェアセンサーが必要です。デスクトップコンピューターのインジケーターが必要な場合、この回答は機能しません

ワットとミリアンペアの両方でエネルギー消費を監視するインジケーターを作成しました。非常に単純な場合の使用法:

 python /path/to/power-flow-indicator

または、スクリプトと同じディレクトリから:

 ./power-flow-indicator

デフォルトでは、出力はワットで表示されますが、--ampsオプションを使用すると、出力をミリアンペアで表示できます。

python power-flow-indicator --amps

-hは同じ情報を表示します:

usage: power-flow-indicator [-h] [--amps]

optional arguments:
  -h, --help  show this help message and exit
  --amps      display output in milliamps

インジケーターの取得

インジケーターのソースコードは GitHub にあります。 gitがインストールされている場合、次の方法でリポジトリを複製できます。

git clone https://github.com/SergKolo/power-flow-indicator.git

または、次の方法でZipファイルを取得できます。

 wget https://github.com/SergKolo/power-flow-indicator/archive/master.Zip

ソースコード

NOTE:インジケーターにはアイコンが必要です。ソースコードのみをコピーするのではなく、gitリポジトリのクローンを作成するか、Zipパッケージを取得することをお勧めします。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#
# Author: Serg Kolo , contact: [email protected]
# Date: July 21, 2012
# Purpose: Indicator that displays power  
#          consumption of  laptop battery
#
# Written for: http://askubuntu.com/q/801003/295286
# Tested on: Ubuntu 16.04 LTS
#
#
#
# Licensed under The MIT License (MIT).
# See included LICENSE file or the notice below.
#
# Copyright © 2016 Sergiy Kolodyazhnyy
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import gi
gi.require_version('AppIndicator3', '0.1')
from gi.repository import GLib as glib
from gi.repository import AppIndicator3 as appindicator
from gi.repository import Gtk as gtk
import os
import dbus
import subprocess
import argparse

class LockKeyStatusIndicator(object):

    def __init__(self, show_amps):
        self.show_amps = show_amps
        self.app = appindicator.Indicator.new(
            'power-flow-indicator', "",
            appindicator.IndicatorCategory.APPLICATION_STATUS)

        self.app.set_status(appindicator.IndicatorStatus.ACTIVE)
        self.icon_path = os.path.dirname( os.path.realpath(__file__) )
        self.app.set_icon( os.path.join(self.icon_path,"pwi_icon.png"  ))

        self.update_label()
        self.app_menu = gtk.Menu()
        self.quit_app = gtk.MenuItem('Quit')
        self.quit_app.connect('activate', self.quit)
        self.quit_app.show()
        self.app_menu.append(self.quit_app)

        self.app.set_menu(self.app_menu)

    def run(self):

        try:
            gtk.main()
        except KeyboardInterrupt:
            pass

    def quit(self, data=None):

        gtk.main_quit()

    def run_cmd(self, cmdlist):

        new_env = dict( os.environ ) 
        new_env['LC_ALL'] = 'C' 
        try:
            stdout = subprocess.check_output(cmdlist,env=new_env)
        except subprocess.CalledProcessError:
            pass
        else:
            if stdout:
                return stdout

    def run_dbus_method(self, bus_type, obj, path, interface, method, arg):

        if bus_type == "session":

            bus = dbus.SessionBus()

        if bus_type == "system":

            bus = dbus.SystemBus()

        proxy = bus.get_object(obj, path)
        method = proxy.get_dbus_method(method, interface)

        if arg:

            return method(arg)

        else:

            return method()

    def get_power_info(self):

        battery_path = None
        battery_info = []
        energy_rate = None
        voltage = None
        current = None
        on_battery = None

        for line in self.run_cmd(['upower', '-e']).decode().split('\n'):
            if 'battery_BAT' in line:
                battery_path = line
                break
        self.run_dbus_method('system', 'org.freedesktop.UPower',
                             battery_path, 'org.freedesktop.UPower.Device',
                             'Refresh', 'None')

        for entry in self.run_cmd(
                ['upower', '-i', battery_path]).decode().split('\n'):
            if 'state' in entry:
                if entry.replace(" ", "").split(':')[1] == 'discharging':
                    on_battery = True
            if 'energy-rate' in entry:
                energy_rate = entry.replace(" ", "").split(':')[1][:-1]
                print energy_rate
            if 'voltage' in entry:
                voltage = entry.replace(" ", "").split(':')[1]

        current = round(
            1000 * float(energy_rate[:-1]) / float(voltage[:-1]), 4)

        if on_battery:
            return str(round(float(energy_rate),2)) + 'W', str(int(current)) + 'mA'
        else:
            return 'on ac', 'on ac'

    def update_label(self):

        cwd = os.getcwd()
        red_icon = os.path.join(cwd, 'red.png')
        green_icon = os.path.join(cwd, 'green.png')
        if self.show_amps:
            label_text = self.get_power_info()[1]
        else:
            label_text = self.get_power_info()[0]

        self.app.set_label(label_text, "")
        glib.timeout_add_seconds(1, self.set_app_label)

    def set_app_label(self):

        self.update_label()


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--amps", help="display output in milliamps", action="store_true")
    args = parser.parse_args()
    indicator = LockKeyStatusIndicator(args.amps)
    indicator.run()

if __== '__main__':
    main()
3