Get CPU Temperature Statistics

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.