J'aimerais voir combien d'énergie mon ordinateur consomme tout le temps.
Par conséquent, je veux un indicateur qui surveille en permanence (par intervalles de 1 seconde) la consommation de courant (courant électrique mesuré en mA ou puissance électrique mesurée en W) et l'affiche dans mon panneau Unity d'Ubuntu 16.04.
Remarque: Pour le moment, il n'est pas possible de mesurer la consommation électrique d'un ordinateur portable avec un adaptateur secteur ou un ordinateur de bureau via un logiciel. veux dire. Même d'autres systèmes d'exploitation, tels que Windows, nécessitent des capteurs matériels externes pour fournir ces informations. Si vous voulez un indicateur pour ordinateur de bureau, cette réponse ne fonctionnera pas pour vous
J'ai écrit un indicateur qui surveille la consommation d'énergie en watts et en milliampères. L'utilisation si très simple:
python /path/to/power-flow-indicator
ou du même répertoire que le script:
./power-flow-indicator
Par défaut, la sortie est affichée en watts, mais l'option --amps
permet d'afficher la sortie en milli-ampères:
python power-flow-indicator --amps
Le -h
affichera les mêmes informations:
usage: power-flow-indicator [-h] [--amps]
optional arguments:
-h, --help show this help message and exit
--amps display output in milliamps
Le code source de l'indicateur est situé sur GitHub . Si vous avez installé git
, vous pouvez cloner le référentiel via:
git clone https://github.com/SergKolo/power-flow-indicator.git
Alternativement, on peut obtenir le fichier Zip via
wget https://github.com/SergKolo/power-flow-indicator/archive/master.Zip
NOTE: l'indicateur a besoin d'une icône. Il est préférable que vous cloniez le référentiel git ou obteniez le package Zip plutôt que de simplement copier le code source.
#!/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()