1
1
Fork 0
mirror of https://github.com/vicious-widgets/vicious synced 2023-12-14 07:13:07 +01:00

contrib: import nvidia SMI widget type

Right now nvsmi is just interested in temperature information. My
streaming server GPU 'fell of the bus' last night while decoding
video, I suspect overheating.
This commit is contained in:
Adrian C. (anrxc) 2014-02-09 19:28:28 +01:00
parent df19dac43e
commit 178bc65f1b
2 changed files with 47 additions and 0 deletions

View file

@ -68,6 +68,11 @@ vicious.contrib.openweather
- returns a table with string keys: {city}, {wind deg}, {wind aim},
{wind kmh}, {wind mps}, {sky}, {weather}, {temp c}, {humid}, {press}
vicious.contrib.nvsmi
- provides (very basic) information about Nvidia GPU status from SMI
- takes optional card ID as an argument, i.e. "1", or defaults to ID 0
- returns 1st value as temperature of requested graphics device
vicious.contrib.ossvol
-

42
contrib/nvsmi.lua Normal file
View file

@ -0,0 +1,42 @@
---------------------------------------------------
-- Licensed under the GNU General Public License v2
-- * (c) 2014, Adrian C. <anrxc@sysphere.org>
---------------------------------------------------
-- {{{ Grab environment
local tonumber = tonumber
local io = { popen = io.popen }
local setmetatable = setmetatable
local string = { match = string.match }
-- }}}
-- nvsmi: provides GPU information from nvidia SMI
-- vicious.contrib.nvsmi
local nvsmi = {}
-- {{{ GPU Information widget type
local function worker(format, warg)
-- Fallback to querying first device
if not warg then warg = "0" end
-- Get data from smi
-- * Todo: support more; MEMORY,UTILIZATION,ECC,POWER,CLOCK,COMPUTE,PIDS,PERFORMANCE
local f = io.popen("nvidia-smi -q -d TEMPERATURE -i " .. warg)
local smi = f:read("*all")
f:close()
-- Not installed
if smi == nil then return {0} end
-- Get temperature information
local _thermal = string.match(smi, "Gpu[%s]+:[%s]([%d]+)[%s]C")
-- Handle devices without data
if _thermal == nil then return {0} end
return {tonumber(_thermal)}
end
-- }}}
return setmetatable(nvsmi, { __call = function(_, ...) return worker(...) end })