<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.thinkwiki.org/w/index.php?action=history&amp;feed=atom&amp;title=Script_for_monitoring_power_consumption</id>
	<title>Script for monitoring power consumption - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.thinkwiki.org/w/index.php?action=history&amp;feed=atom&amp;title=Script_for_monitoring_power_consumption"/>
	<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Script_for_monitoring_power_consumption&amp;action=history"/>
	<updated>2026-05-05T01:18:28Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.31.12</generator>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Script_for_monitoring_power_consumption&amp;diff=24288&amp;oldid=prev</id>
		<title>Matt garman at 21:53, 19 August 2006</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Script_for_monitoring_power_consumption&amp;diff=24288&amp;oldid=prev"/>
		<updated>2006-08-19T21:53:04Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 21:53, 19 August 2006&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l9&quot; &gt;Line 9:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 9:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{NOTE|Please feel ''very free'' to improve/fix this script.&amp;#160; My intent for its posting is to make its ownership as public as possible.&amp;#160; There's no need to try to E-mail me to validate your changes.&amp;#160; If you feel they are in the best interest of the public, just make the changes.&amp;#160; The script attempts to employ pre-conditions to intelligently apply functionality only to those laptops that appear to support it.&amp;#160; Hopefully, its framework will allow for extension without heavy redesign.}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{NOTE|Please feel ''very free'' to improve/fix this script.&amp;#160; My intent for its posting is to make its ownership as public as possible.&amp;#160; There's no need to try to E-mail me to validate your changes.&amp;#160; If you feel they are in the best interest of the public, just make the changes.&amp;#160; The script attempts to employ pre-conditions to intelligently apply functionality only to those laptops that appear to support it.&amp;#160; Hopefully, its framework will allow for extension without heavy redesign.}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;==The script==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{CodeRef|tp_power_monitor.py}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{CodeRef|tp_power_monitor.py}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Scripts]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Scripts]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Matt garman</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Script_for_monitoring_power_consumption&amp;diff=24287&amp;oldid=prev</id>
		<title>Matt garman at 21:50, 19 August 2006</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Script_for_monitoring_power_consumption&amp;diff=24287&amp;oldid=prev"/>
		<updated>2006-08-19T21:50:53Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://www.thinkwiki.org/w/index.php?title=Script_for_monitoring_power_consumption&amp;amp;diff=24287&amp;amp;oldid=24215&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Matt garman</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Script_for_monitoring_power_consumption&amp;diff=24215&amp;oldid=prev</id>
		<title>Thinker: MoveToCode</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Script_for_monitoring_power_consumption&amp;diff=24215&amp;oldid=prev"/>
		<updated>2006-08-17T07:29:17Z</updated>

		<summary type="html">&lt;p&gt;MoveToCode&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 07:29, 17 August 2006&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l9&quot; &gt;Line 9:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 9:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{NOTE|Please feel ''very free'' to improve/fix this script.&amp;#160; My intent for its posting is to make its ownership as public as possible.&amp;#160; There's no need to try to E-mail me to validate your changes.&amp;#160; If you feel they are in the best interest of the public, just make the changes.&amp;#160; The script attempts to employ pre-conditions to intelligently apply functionality only to those laptops that appear to support it.&amp;#160; Hopefully, its framework will allow for extension without heavy redesign.}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{NOTE|Please feel ''very free'' to improve/fix this script.&amp;#160; My intent for its posting is to make its ownership as public as possible.&amp;#160; There's no need to try to E-mail me to validate your changes.&amp;#160; If you feel they are in the best interest of the public, just make the changes.&amp;#160; The script attempts to employ pre-conditions to intelligently apply functionality only to those laptops that appear to support it.&amp;#160; Hopefully, its framework will allow for extension without heavy redesign.}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{MoveToCode}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#!/usr/bin/python&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#!/usr/bin/python&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Thinker</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Script_for_monitoring_power_consumption&amp;diff=24141&amp;oldid=prev</id>
		<title>Matt garman at 18:04, 15 August 2006</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Script_for_monitoring_power_consumption&amp;diff=24141&amp;oldid=prev"/>
		<updated>2006-08-15T18:04:09Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 18:04, 15 August 2006&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l335&quot; &gt;Line 335:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 335:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; main()&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; main()&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Scripts]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key c1thinkwiki:diff::1.12:old-24138:rev-24141 --&gt;
&lt;/table&gt;</summary>
		<author><name>Matt garman</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Script_for_monitoring_power_consumption&amp;diff=24138&amp;oldid=prev</id>
		<title>Matt garman at 17:59, 15 August 2006</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Script_for_monitoring_power_consumption&amp;diff=24138&amp;oldid=prev"/>
		<updated>2006-08-15T17:59:21Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;The intent of this script is to provide Thinkpad power consumption data.  Hopefully the data will allow you to identify areas with higher-than-expected power draw.  The ultimate goal of this script is to act as a tool that will ultimately allow you to maximize your battery time under Linux.&lt;br /&gt;
&lt;br /&gt;
The script is written in Python.&lt;br /&gt;
&lt;br /&gt;
{{WARN|You will probably need to modify this script to suit your needs.  The original script was written using a Thinkpad T43 2668-89U.  So, for example, if your particular does not have an ATI video card, then you will definately need to modify the script.}}&lt;br /&gt;
&lt;br /&gt;
{{HELP|The major deficiency with the script, in its current form, is that it does not consolidate the collected data.  I would suggest that the &amp;quot;tpPowerMonitorDataSource&amp;quot; class be extended so that instances of that class know how to interpret their own data (from which nice reports can be generated).}}&lt;br /&gt;
&lt;br /&gt;
{{NOTE|Please feel ''very free'' to improve/fix this script.  My intent for its posting is to make its ownership as public as possible.  There's no need to try to E-mail me to validate your changes.  If you feel they are in the best interest of the public, just make the changes.  The script attempts to employ pre-conditions to intelligently apply functionality only to those laptops that appear to support it.  Hopefully, its framework will allow for extension without heavy redesign.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
&lt;br /&gt;
# COPYRIGHT (C) 2006 Matthew Garman&lt;br /&gt;
# matthew (dot) garman (at) gmail (dot) com&lt;br /&gt;
# License: MIT &amp;lt;http://www.opensource.org/licenses/mit-license.php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import sys, time, getopt, os, re&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class tpPowerMonitorDataSource:&lt;br /&gt;
&lt;br /&gt;
    # The name of the file to parse for needed data (data_source_file) OR&lt;br /&gt;
    # the name of a command whose output will be read as a file&lt;br /&gt;
    # (os.popen(shell_command)).&lt;br /&gt;
    #&lt;br /&gt;
    # Typically, data_source_file will be something from /proc (or&lt;br /&gt;
    # possibly /sys), and shell_command will be a utility+arguments such&lt;br /&gt;
    # as &amp;quot;iwconfig eth1 power&amp;quot;.&lt;br /&gt;
    #&lt;br /&gt;
    # Note that you should set EITHER data_source_file OR shell_command,&lt;br /&gt;
    # but not both.&lt;br /&gt;
    data_source_file    = None&lt;br /&gt;
    shell_command       = None&lt;br /&gt;
&lt;br /&gt;
    # The line number of the data file containing our data OR the string&lt;br /&gt;
    # that marks the beginning of the line in which we're interested&lt;br /&gt;
    # (startswith_string) OR a regular expression to key the data for&lt;br /&gt;
    # which we're looking (regexp_pattern).&lt;br /&gt;
    line_number         = None&lt;br /&gt;
    startswith_string   = None&lt;br /&gt;
    regexp_pattern      = None&lt;br /&gt;
&lt;br /&gt;
    # The string that delimits the line containing our data.  This will be&lt;br /&gt;
    # used as the parameter to split().  Note that you can leave this as&lt;br /&gt;
    # None to split on whitespace.&lt;br /&gt;
    split_string        = None&lt;br /&gt;
&lt;br /&gt;
    # A mapping of data names to indices in the split string.&lt;br /&gt;
    name_index_map      = dict()&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, file, cmd, line, swstr, pat, splstr, map):&lt;br /&gt;
        self.data_source_file    = file&lt;br /&gt;
        self.shell_command       = cmd&lt;br /&gt;
        self.line_number         = line&lt;br /&gt;
        self.startswith_string   = swstr&lt;br /&gt;
        self.regexp_pattern      = pat&lt;br /&gt;
        self.split_string        = splstr&lt;br /&gt;
        self.name_index_map      = map&lt;br /&gt;
&lt;br /&gt;
    def printMembers(self):&lt;br /&gt;
        print &amp;quot;\t&amp;quot; + 'self.data_source_file = ' + str(self.data_source_file)&lt;br /&gt;
        print &amp;quot;\t&amp;quot; + 'self.shell_command = ' + str(self.shell_command)&lt;br /&gt;
        print &amp;quot;\t&amp;quot; + 'self.line_number = ' + str(self.line_number)&lt;br /&gt;
        print &amp;quot;\t&amp;quot; + 'self.startswith_string = ' + str(self.startswith_string)&lt;br /&gt;
        print &amp;quot;\t&amp;quot; + 'self.regexp_pattern = ' + str(self.regexp_pattern)&lt;br /&gt;
        print &amp;quot;\t&amp;quot; + 'self.split_string = ' + str(self.split_string)&lt;br /&gt;
        print &amp;quot;\t&amp;quot; + 'self.name_index_map = ' + str(self.name_index_map)&lt;br /&gt;
&lt;br /&gt;
    def readData(self, d):&lt;br /&gt;
        # open the data source file or run the command that will produce&lt;br /&gt;
        # the data&lt;br /&gt;
        file = None&lt;br /&gt;
        if self.data_source_file:&lt;br /&gt;
            file = open(self.data_source_file, 'r')&lt;br /&gt;
        elif self.shell_command:&lt;br /&gt;
            file = os.popen(self.shell_command)&lt;br /&gt;
        else:&lt;br /&gt;
            print 'error: no data source defined'&lt;br /&gt;
            self.printMembers()&lt;br /&gt;
        # read the contents of the file into a list and close the file&lt;br /&gt;
        lines = None&lt;br /&gt;
        if file:&lt;br /&gt;
            lines = file.readlines()&lt;br /&gt;
            file.close()&lt;br /&gt;
        else:&lt;br /&gt;
            print 'error: data file not opened'&lt;br /&gt;
            self.printMembers()&lt;br /&gt;
        # now get the line in the file with our data&lt;br /&gt;
        line = None&lt;br /&gt;
        if lines:&lt;br /&gt;
            if None != self.line_number:&lt;br /&gt;
                line = lines[self.line_number]&lt;br /&gt;
            elif self.startswith_string:&lt;br /&gt;
                for l in lines:&lt;br /&gt;
                    if l.startswith(self.startswith_string):&lt;br /&gt;
                        line = l&lt;br /&gt;
                        break&lt;br /&gt;
            elif self.regexp_pattern:&lt;br /&gt;
                for l in lines:&lt;br /&gt;
                    if re.compile(self.regexp_pattern).match(l):&lt;br /&gt;
                        line = l&lt;br /&gt;
                        break&lt;br /&gt;
        else:&lt;br /&gt;
            print 'error: no lines in data file'&lt;br /&gt;
            self.printMembers()&lt;br /&gt;
        # now get the data we want from the line itself&lt;br /&gt;
        if line:&lt;br /&gt;
            fields = line.split(self.split_string)&lt;br /&gt;
            for key in self.name_index_map.keys():&lt;br /&gt;
                d[key] = fields[self.name_index_map[key]].strip()&lt;br /&gt;
        else:&lt;br /&gt;
            print 'error: could not find line with data in file'&lt;br /&gt;
            self.printMembers()&lt;br /&gt;
&lt;br /&gt;
# END --- class tpPowerMonitorDataSource&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tp_data_sources = [&lt;br /&gt;
&lt;br /&gt;
    tpPowerMonitorDataSource(&lt;br /&gt;
        '/proc/cpuinfo',             # data file&lt;br /&gt;
        None,                        # shell command&lt;br /&gt;
        None,                        # line index&lt;br /&gt;
        'cpu MHz',                   # startswith() string&lt;br /&gt;
        None,                        # regexp pattern&lt;br /&gt;
        ':',                         # split string&lt;br /&gt;
        {'proc_cpuinfo_cpu_mhz': 1}  # name-to-index map&lt;br /&gt;
    ),&lt;br /&gt;
&lt;br /&gt;
    # http://thinkwiki.org/wiki/Ipw2200#Power_Management&lt;br /&gt;
    tpPowerMonitorDataSource(&lt;br /&gt;
        None,                          # data file&lt;br /&gt;
        '/sbin/iwpriv eth1 get_power', # shell command&lt;br /&gt;
        0,                             # line index&lt;br /&gt;
        None,                          # startswith() string&lt;br /&gt;
        None,                          # regexp pattern&lt;br /&gt;
        ':',                           # split string&lt;br /&gt;
        {'iwpriv_get_power': 2}        # name-to-index map&lt;br /&gt;
    ),&lt;br /&gt;
&lt;br /&gt;
    # http://forums.gentoo.org/viewtopic-t-447841.html&lt;br /&gt;
    # see post from ruben on Wed Mar 29, 2006 4:09 am&lt;br /&gt;
    tpPowerMonitorDataSource(&lt;br /&gt;
        None,&lt;br /&gt;
        '/usr/bin/sudo /sbin/hdparm -C /dev/sda',&lt;br /&gt;
        None,&lt;br /&gt;
        ' drive state is',&lt;br /&gt;
        None,&lt;br /&gt;
        ':',&lt;br /&gt;
        {'hard_drive_power_state': 1}&lt;br /&gt;
    ),&lt;br /&gt;
&lt;br /&gt;
    # http://thinkwiki.org/wiki/Thermal_sensors&lt;br /&gt;
    tpPowerMonitorDataSource(&lt;br /&gt;
        '/proc/acpi/ibm/thermal',&lt;br /&gt;
        None,&lt;br /&gt;
        0,&lt;br /&gt;
        None,&lt;br /&gt;
        None,&lt;br /&gt;
        None,&lt;br /&gt;
        {'ibm_thermal_cpu':     1,&lt;br /&gt;
         'ibm_thermal_hdaps':   2,&lt;br /&gt;
         'ibm_thermal_pmcia':   3,&lt;br /&gt;
         'ibm_thermal_gpu':     4,&lt;br /&gt;
         'ibm_thermal_batt_fl': 5,&lt;br /&gt;
         'ibm_thermal_batt_br': 7 }&lt;br /&gt;
    ),&lt;br /&gt;
&lt;br /&gt;
    # http://mailman.linux-thinkpad.org/pipermail/linux-thinkpad/2006-July/034738.html&lt;br /&gt;
    tpPowerMonitorDataSource(&lt;br /&gt;
        '/proc/acpi/processor/CPU/power',&lt;br /&gt;
        None,&lt;br /&gt;
        None,&lt;br /&gt;
        'bus master activity',&lt;br /&gt;
        None,&lt;br /&gt;
        ':',&lt;br /&gt;
        {'bus_master_activity': 1}&lt;br /&gt;
    ),&lt;br /&gt;
&lt;br /&gt;
    tpPowerMonitorDataSource(&lt;br /&gt;
        '/proc/acpi/battery/BAT0/state',&lt;br /&gt;
        None,&lt;br /&gt;
        None,&lt;br /&gt;
        'present rate:',&lt;br /&gt;
        None,&lt;br /&gt;
        None,&lt;br /&gt;
        {'battery0_state_present_rate': 2}&lt;br /&gt;
    ),&lt;br /&gt;
&lt;br /&gt;
    tpPowerMonitorDataSource(&lt;br /&gt;
        None,&lt;br /&gt;
        '/usr/bin/sudo /usr/sbin/radeontool dac',&lt;br /&gt;
        0,&lt;br /&gt;
        None,&lt;br /&gt;
        None,&lt;br /&gt;
        None,&lt;br /&gt;
        {'radeontool_dac_ext_vga': -1}&lt;br /&gt;
    ),&lt;br /&gt;
&lt;br /&gt;
    tpPowerMonitorDataSource(&lt;br /&gt;
        None,&lt;br /&gt;
        '/usr/bin/sudo /usr/sbin/radeontool light',&lt;br /&gt;
        0,&lt;br /&gt;
        None,&lt;br /&gt;
        None,&lt;br /&gt;
        None,&lt;br /&gt;
        {'radeontool_light_lcd': -1}&lt;br /&gt;
    ),&lt;br /&gt;
&lt;br /&gt;
    # http://forums.gentoo.org/viewtopic-t-343029-highlight-rovclock.html&lt;br /&gt;
    tpPowerMonitorDataSource(&lt;br /&gt;
        None,&lt;br /&gt;
        '/usr/bin/sudo /usr/sbin/rovclock -i',&lt;br /&gt;
        None,&lt;br /&gt;
        'Core: ',&lt;br /&gt;
        None,&lt;br /&gt;
        None,&lt;br /&gt;
        {'rovclock_gpu_clock': 1,&lt;br /&gt;
         'rovclock_mem_clock': 4 }&lt;br /&gt;
    ),&lt;br /&gt;
&lt;br /&gt;
    tpPowerMonitorDataSource(&lt;br /&gt;
        None,&lt;br /&gt;
        '/sbin/iwconfig eth1',&lt;br /&gt;
        None,&lt;br /&gt;
        None,&lt;br /&gt;
        '.*Power Management.*',&lt;br /&gt;
        ':',&lt;br /&gt;
        {'wireless_power_mgmt_state': 1}&lt;br /&gt;
    ),&lt;br /&gt;
&lt;br /&gt;
    tpPowerMonitorDataSource(&lt;br /&gt;
        '/proc/loadavg',&lt;br /&gt;
        None,&lt;br /&gt;
        0,&lt;br /&gt;
        None,&lt;br /&gt;
        None,&lt;br /&gt;
        None,&lt;br /&gt;
        {'proc_loadavg_1min': 0,&lt;br /&gt;
         'proc_loadavg_5min': 1,&lt;br /&gt;
         'proc_loadavg_15min': 2 }&lt;br /&gt;
    ),&lt;br /&gt;
]&lt;br /&gt;
log_data = list()&lt;br /&gt;
poll_freq_hz = 1&lt;br /&gt;
run_time_sec = 60*60&lt;br /&gt;
logfile = None&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def collectPowerData():&lt;br /&gt;
    global run_time_sec&lt;br /&gt;
    global poll_freq_hz&lt;br /&gt;
    global log_data&lt;br /&gt;
    global logfile&lt;br /&gt;
    global tp_data_sources&lt;br /&gt;
&lt;br /&gt;
    log = None&lt;br /&gt;
    if logfile:&lt;br /&gt;
        log = open(logfile, 'w')&lt;br /&gt;
        log.write(&amp;quot;time, data\n&amp;quot;)&lt;br /&gt;
    end_t = time.time()+run_time_sec&lt;br /&gt;
    while time.time() &amp;lt; end_t:&lt;br /&gt;
        datum = dict()&lt;br /&gt;
        for dsrc in tp_data_sources:&lt;br /&gt;
            dsrc.readData(datum)&lt;br /&gt;
        log_data.append(datum)&lt;br /&gt;
        if log: log.write(str(time.time()) + ', ' + str(datum) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        time.sleep(1.0/float(poll_freq_hz))&lt;br /&gt;
    if log: log.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def createStats():&lt;br /&gt;
    global log_data&lt;br /&gt;
    global logfile&lt;br /&gt;
    log = None&lt;br /&gt;
    if logfile:&lt;br /&gt;
        log = open(logfile, 'a')&lt;br /&gt;
    if log: log.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def usage():&lt;br /&gt;
    print 'Usage: ' + sys.argv[0] + \&lt;br /&gt;
        '[-h] [-f freq_hz] [-t time_min] [-l logfile]'&lt;br /&gt;
    print &amp;quot;\t-h            Display this help&amp;quot;&lt;br /&gt;
    print &amp;quot;\t-f freq_hz    The polling frequency in Hertz, default=&amp;quot; \&lt;br /&gt;
        + str(poll_freq_hz)&lt;br /&gt;
    print &amp;quot;\t-t time_min   Total poll time in minutes, default=&amp;quot; \&lt;br /&gt;
        + str(run_time_sec/60)&lt;br /&gt;
    print &amp;quot;\t-l logfile    Write poll data to indicated log file&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global poll_freq_hz&lt;br /&gt;
    global run_time_sec&lt;br /&gt;
    global logfile&lt;br /&gt;
&lt;br /&gt;
    # parse options&lt;br /&gt;
    # see: http://docs.python.org/lib/module-getopt.html&lt;br /&gt;
    try:&lt;br /&gt;
        opts, args = getopt.getopt(sys.argv[1:], &amp;quot;hf:t:l:&amp;quot;)&lt;br /&gt;
    except getopt.GetoptError:&lt;br /&gt;
        usage()&lt;br /&gt;
        sys.exit(2)&lt;br /&gt;
    for o, a in opts:&lt;br /&gt;
        if '-h' == o:&lt;br /&gt;
            usage()&lt;br /&gt;
            sys.exit()&lt;br /&gt;
        if '-f' == o:&lt;br /&gt;
            poll_freq_hz = int(a)&lt;br /&gt;
        if '-t' == o:&lt;br /&gt;
            run_time_sec = int(a)*60&lt;br /&gt;
        if '-l' == o:&lt;br /&gt;
            logfile = a&lt;br /&gt;
&lt;br /&gt;
    # do stuff&lt;br /&gt;
    print 'running for ' + str(run_time_sec/60) + ' minutes'&lt;br /&gt;
    print 'poll rate:  ' + str(poll_freq_hz) + ' Hz'&lt;br /&gt;
    print 'logfile:    ' + str(logfile)&lt;br /&gt;
    collectPowerData()&lt;br /&gt;
    print '...done!'&lt;br /&gt;
    print 'Data points collected: ' + str(len(log_data))&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for d in log_data:&lt;br /&gt;
        sum += int(d['battery0_state_present_rate'])&lt;br /&gt;
    avg = float(sum) / float(len(log_data))&lt;br /&gt;
    print 'Average power draw:    ' + str(avg)&lt;br /&gt;
    if logfile:     log = open(logfile, 'a')&lt;br /&gt;
    if log:&lt;br /&gt;
        log.write('Average power draw:    ' + str(avg))&lt;br /&gt;
        log.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Matt garman</name></author>
		
	</entry>
</feed>