1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3
4# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved.
5# Use of this source code is governed by a BSD-style license that can be
6# found in the LICENSE file.
7
8"""
9A clone of 'sensors' utility on Linux printing hardware temperatures,
10fans speed and battery info.
11
12$ python scripts/sensors.py
13asus
14    Temperatures:
15        asus                 57.0°C (high=None°C, critical=None°C)
16    Fans:
17        cpu_fan              3500 RPM
18acpitz
19    Temperatures:
20        acpitz               57.0°C (high=108.0°C, critical=108.0°C)
21coretemp
22    Temperatures:
23        Physical id 0        61.0°C (high=87.0°C, critical=105.0°C)
24        Core 0               61.0°C (high=87.0°C, critical=105.0°C)
25        Core 1               59.0°C (high=87.0°C, critical=105.0°C)
26Battery:
27    charge:     84.95%
28    status:     charging
29    plugged in: yes
30"""
31
32from __future__ import print_function
33
34import psutil
35
36
37def secs2hours(secs):
38    mm, ss = divmod(secs, 60)
39    hh, mm = divmod(mm, 60)
40    return "%d:%02d:%02d" % (hh, mm, ss)
41
42
43def main():
44    if hasattr(psutil, "sensors_temperatures"):
45        temps = psutil.sensors_temperatures()
46    else:
47        temps = {}
48    if hasattr(psutil, "sensors_fans"):
49        fans = psutil.sensors_fans()
50    else:
51        fans = {}
52    if hasattr(psutil, "sensors_battery"):
53        battery = psutil.sensors_battery()
54    else:
55        battery = None
56
57    if not any((temps, fans, battery)):
58        print("can't read any temperature, fans or battery info")
59        return
60
61    names = set(list(temps.keys()) + list(fans.keys()))
62    for name in names:
63        print(name)
64        # Temperatures.
65        if name in temps:
66            print("    Temperatures:")
67            for entry in temps[name]:
68                print("        %-20s %s°C (high=%s°C, critical=%s°C)" % (
69                    entry.label or name, entry.current, entry.high,
70                    entry.critical))
71        # Fans.
72        if name in fans:
73            print("    Fans:")
74            for entry in fans[name]:
75                print("        %-20s %s RPM" % (
76                    entry.label or name, entry.current))
77
78    # Battery.
79    if battery:
80        print("Battery:")
81        print("    charge:     %s%%" % round(battery.percent, 2))
82        if battery.power_plugged:
83            print("    status:     %s" % (
84                "charging" if battery.percent < 100 else "fully charged"))
85            print("    plugged in: yes")
86        else:
87            print("    left:       %s" % secs2hours(battery.secsleft))
88            print("    status:     %s" % "discharging")
89            print("    plugged in: no")
90
91
92if __name__ == '__main__':
93    main()
94