<?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=Code%2Ftp_power_monitor.py</id>
	<title>Code/tp power monitor.py - 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=Code%2Ftp_power_monitor.py"/>
	<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Code/tp_power_monitor.py&amp;action=history"/>
	<updated>2026-04-29T10:07:45Z</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=Code/tp_power_monitor.py&amp;diff=50251&amp;oldid=prev</id>
		<title>Newacct at 03:54, 9 January 2011</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Code/tp_power_monitor.py&amp;diff=50251&amp;oldid=prev"/>
		<updated>2011-01-09T03:54:13Z</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 03:54, 9 January 2011&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-l37&quot; &gt;Line 37:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 37:&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;&amp;#160;&amp;#160; &amp;#160; # A mapping of data names to indices in the split string.&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; # A mapping of data names to indices in the split string.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&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: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; name_index_map&amp;#160; &amp;#160; &amp;#160; = &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;dict()&lt;/del&gt;&lt;/div&gt;&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;&amp;#160;&amp;#160; &amp;#160; name_index_map&amp;#160; &amp;#160; &amp;#160; = &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;{}&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;/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;&amp;#160;&amp;#160; &amp;#160; def __init__(self, file, cmd, line, swstr, pat, splstr, map):&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; def __init__(self, file, cmd, line, swstr, pat, splstr, map):&lt;/div&gt;&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-l97&quot; &gt;Line 97:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 97:&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; &amp;#160; &amp;#160; if line:&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; &amp;#160; &amp;#160; if line:&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;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; fields = line.split(self.split_string)&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; &amp;#160; &amp;#160; &amp;#160; &amp;#160; fields = line.split(self.split_string)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&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: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; for key in self.name_index_map.&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;keys&lt;/del&gt;():&lt;/div&gt;&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;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; for key&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;, value &lt;/ins&gt;in self.name_index_map.&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;items&lt;/ins&gt;():&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&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: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; d[key] = fields[&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;self.name_index_map[key]&lt;/del&gt;].strip()&lt;/div&gt;&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;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; d[key] = fields[&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;value&lt;/ins&gt;].strip()&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;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; else:&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; &amp;#160; &amp;#160; else:&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;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; print 'error: could not find line with data in file'&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; &amp;#160; &amp;#160; &amp;#160; &amp;#160; print 'error: could not find line with data in file'&lt;/div&gt;&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-l251&quot; &gt;Line 251:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 251:&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; end_t = time.time()+run_time_sec&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; end_t = time.time()+run_time_sec&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;#160;&amp;#160; &amp;#160; while time.time() &amp;lt; end_t:&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; while time.time() &amp;lt; end_t:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&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: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; datum = &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;dict()&lt;/del&gt;&lt;/div&gt;&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;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; datum = &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;{}&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;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; for dsrc in tp_data_sources:&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; &amp;#160; &amp;#160; for dsrc in tp_data_sources:&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;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; dsrc.readData(datum)&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; &amp;#160; &amp;#160; &amp;#160; &amp;#160; dsrc.readData(datum)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key c1thinkwiki:diff::1.12:old-24558:rev-50251 --&gt;
&lt;/table&gt;</summary>
		<author><name>Newacct</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Code/tp_power_monitor.py&amp;diff=24558&amp;oldid=prev</id>
		<title>Micampe at 06:21, 9 September 2006</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Code/tp_power_monitor.py&amp;diff=24558&amp;oldid=prev"/>
		<updated>2006-09-09T06:21:07Z</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 06:21, 9 September 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-l1&quot; &gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&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: #ffe49c; 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;+&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 class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;pre&amp;gt;&lt;/ins&gt;#!/usr/bin/python&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;div&gt;# COPYRIGHT (C) 2006 Matthew Garman&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;# COPYRIGHT (C) 2006 Matthew Garman&lt;/div&gt;&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-l323&quot; &gt;Line 323:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 323:&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;if __name__ == '__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;if __name__ == '__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;#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 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;&amp;lt;/pre&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key c1thinkwiki:diff::1.12:old-24284:rev-24558 --&gt;
&lt;/table&gt;</summary>
		<author><name>Micampe</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Code/tp_power_monitor.py&amp;diff=24284&amp;oldid=prev</id>
		<title>Matt garman at 21:35, 19 August 2006</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Code/tp_power_monitor.py&amp;diff=24284&amp;oldid=prev"/>
		<updated>2006-08-19T21:35:23Z</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;#!/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;/div&gt;</summary>
		<author><name>Matt garman</name></author>
		
	</entry>
</feed>