Tcl script to get temperature statistics

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Tcl script to get temperature statistics

Cecil Westerhof-5
I promised to share my fruits with Tcl. I took some time (very busy with a
lot of Tcl things), but here is one example.

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 I can share some more.

--
Cecil Westerhof
_______________________________________________
sqlite-users mailing list
[hidden email]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users