Created by
CecilWesterhof.
I had some problems with the temperature of my CPU. So I wrote a systemd service (with Tcl) to log the temperature every minute to a SQLite database. And wrote the following script to display statistics of the last seven days and the last day:
#!/usr/bin/env tclsh
package require sqlite3
# for getDB: my way to open the db database
source /usr/local/share/tcltk/utilities.tcl
set periodFormat " %10s | %4s | %4s | %7s | %5s"
set periodDivider [string map {" " - | +} [format $periodFormat "" "" "" "" ""]]
set periodSelect {
SELECT *
FROM temperatureStatistics
WHERE date BETWEEN
DATE('now', '-7 days')
AND DATE('now', '-1 day')
ORDER BY date DESC
}
set yesterdayFormat " %11s | %5s"
set yesterdayDivider [string map {" " - | +} [format $yesterdayFormat "" ""]]
set yesterdaySelect {
SELECT Temperature
, COUNT(*) AS Count
FROM temperature
WHERE date = DATE('now', '-1 day')
GROUP BY Temperature
ORDER BY Temperature DESC
}
getDB
puts $periodDivider
puts [format $periodFormat "Date " Min Max Average Total]
puts $periodDivider
db eval $periodSelect {
puts [format $periodFormat $Date $Minimum $Maximum $Average $Count]
}
puts $periodDivider
puts ""
set i 0
set subtotal 0
set total 0
puts $yesterdayDivider
puts [format $yesterdayFormat "Temperature" Total]
puts $yesterdayDivider
db eval $yesterdaySelect {
puts [format $yesterdayFormat $Temperature $Count]
incr i
incr subtotal $Count
incr total $Count
if {[expr $i % 5] == 0} {
puts $yesterdayDivider
puts [format $yesterdayFormat "SubTotal" $subtotal]
puts $yesterdayDivider
set subtotal 0
}
}
if {[expr $i % 5] != 0} {
puts $yesterdayDivider
if {[expr $i % 5] > 1} {
puts [format $yesterdayFormat "SubTotal" $subtotal]
puts $yesterdayDivider
set subtotal 0
}
}
puts [format $yesterdayFormat "Total" $total]
puts $yesterdayDivider
I put this in a cronjob and the results of this morning where: `
------------+------+------+---------+------
Date | Min | Max | Average | Total
------------+------+------+---------+------
2017-12-19 | 40.5 | 67.0 | 45.5 | 1440
2017-12-18 | 43.5 | 70.5 | 48.1 | 1439
2017-12-17 | 43.5 | 65.5 | 55.1 | 1439
2017-12-16 | 60.5 | 77.5 | 64.1 | 1440
2017-12-15 | 61.5 | 77.5 | 63.9 | 1440
2017-12-14 | 57.5 | 77.5 | 62.4 | 1440
2017-12-13 | 46.0 | 77.0 | 54.1 | 1440
------------+------+------+---------+------
-------------+------
Temperature | Total
-------------+------
67.0 | 1
66.5 | 3
66.0 | 1
65.0 | 4
64.5 | 18
-------------+------
SubTotal | 27
-------------+------
64.0 | 4
63.5 | 11
63.0 | 2
62.5 | 10
62.0 | 10
-------------+------
SubTotal | 37
-------------+------
61.5 | 5
61.0 | 1
60.5 | 5
60.0 | 2
59.5 | 1
-------------+------
SubTotal | 14
-------------+------
59.0 | 1
58.5 | 4
57.5 | 3
57.0 | 1
56.5 | 6
-------------+------
SubTotal | 15
-------------+------
56.0 | 1
55.5 | 2
53.5 | 4
53.0 | 5
52.5 | 5
-------------+------
SubTotal | 17
-------------+------
52.0 | 3
51.5 | 2
51.0 | 4
50.5 | 8
50.0 | 7
-------------+------
SubTotal | 24
-------------+------
49.5 | 13
49.0 | 14
48.5 | 19
48.0 | 22
47.5 | 24
-------------+------
SubTotal | 92
-------------+------
47.0 | 27
46.5 | 56
46.0 | 79
45.5 | 105
45.0 | 188
-------------+------
SubTotal | 455
-------------+------
44.5 | 162
44.0 | 73
43.5 | 40
43.0 | 53
42.5 | 70
-------------+------
SubTotal | 398
-------------+------
42.0 | 96
41.5 | 161
41.0 | 96
40.5 | 8
-------------+------
SubTotal | 361
-------------+------
Total | 1440
-------------+------
`
If people are interested in my systemd service: I can share that also.
Comments and tips are appreciated.
I was asked what getDB does. Here it is:
proc getDB {} {
if {$::argc != 1} {
error [format "ERROR: %s DATABASE" [getScriptName]]
}
sqlite db [lindex $::argv 0]
db timeout [expr {10 * 1000}]
}
And it uses getScriptName:
proc getScriptName {} {
file tail $::argv0
}
I will also share the systemd service and the table and publish the code on GitHub.