Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for sensors from liquidctl #202

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions freon@UshakovVasilii_Github.yahoo.com/extension.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const AticonfigUtil = Me.imports.aticonfigUtil;
const NvidiaUtil = Me.imports.nvidiaUtil;
const HddtempUtil = Me.imports.hddtempUtil;
const SensorsUtil = Me.imports.sensorsUtil;
const liquidctlUtil = Me.imports.liquidctlUtil;
const smartctlUtil = Me.imports.smartctlUtil;
const nvmecliUtil = Me.imports.nvmecliUtil;
const BumblebeeNvidiaUtil = Me.imports.bumblebeeNvidiaUtil;
Expand Down Expand Up @@ -68,6 +69,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend
};
this._initDriveUtility();
this._initGpuUtility();
this._initLiquidctlUtility();

let temperatureIcon = Gio.icon_new_for_string(Me.path + '/icons/material-icons/material-temperature-symbolic.svg');
this._sensorIcons = {
Expand Down Expand Up @@ -106,6 +108,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend
this._addSettingChangedSignal('show-voltage', this._querySensors.bind(this));
this._addSettingChangedSignal('drive-utility', this._driveUtilityChanged.bind(this));
this._addSettingChangedSignal('gpu-utility', this._gpuUtilityChanged.bind(this));
this._addSettingChangedSignal('show-liquidctl', this._liquidctlUtilityChanged.bind(this));
this._addSettingChangedSignal('position-in-panel', this._positionInPanelChanged.bind(this));
this._addSettingChangedSignal('panel-box-index', this._positionInPanelChanged.bind(this));
this._addSettingChangedSignal('group-temperature', this._querySensors.bind(this))
Expand Down Expand Up @@ -247,6 +250,24 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend
this._querySensors();
}

_initLiquidctlUtility() {
if (this._settings.get_boolean('show-liquidctl'))
this._utils.liquidctl = new liquidctlUtil.LiquidctlUtil();
}

_destroyLiquidctlUtility() {
if (this._utils.liquidctl) {
this._utils.liquidctl.destroy();
delete this._utils.liquidctl;
}
}

_liquidctlUtilityChanged() {
this._destroyLiquidctlUtility();
this._initLiquidctlUtility();
this._querySensors();
}

_updateTimeChanged(){
Mainloop.source_remove(this._timeoutId);
this._addTimer();
Expand All @@ -267,6 +288,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend
_onDestroy(){
this._destroyDriveUtility();
this._destroyGpuUtility();
this._destroyLiquidctlUtility();
Mainloop.source_remove(this._timeoutId);
Mainloop.source_remove(this._updateUITimeoutId);

Expand Down Expand Up @@ -341,6 +363,12 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend
driveTempInfo = this._utils.disks.temp;
}

if (this._utils.liquidctl && this._utils.liquidctl.available) {
sensorsTempInfo = sensorsTempInfo.concat(this._utils.liquidctl.temp);
fanInfo = fanInfo.concat(this._utils.liquidctl.rpm);
voltageInfo = voltageInfo.concat(this._utils.liquidctl.volt);
}

sensorsTempInfo.sort(function(a,b) { return a.label.localeCompare(b.label) });
driveTempInfo.sort(function(a,b) { return a.label.localeCompare(b.label) });
fanInfo.sort(function(a,b) { return a.label.localeCompare(b.label) });
Expand Down
90 changes: 90 additions & 0 deletions freon@UshakovVasilii_Github.yahoo.com/liquidctlUtil.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
// Provide sensor data from liquidctl.

const GLib = imports.gi.GLib;

const Me = imports.misc.extensionUtils.getCurrentExtension();
const commandLineUtil = Me.imports.commandLineUtil;

var LiquidctlUtil = class extends commandLineUtil.CommandLineUtil {
constructor() {
super();
const path = GLib.find_program_in_path('liquidctl');
this._argv = path ? [path, 'status', '--json'] : null;
}

// Avoid processing the data more than once.
execute(callback) {
super.execute(() => {
try {
const output = this._output.join('');
if (output == '')
throw 'no data (liquidctl probably exited with an error)';

let temp = [];
let rpm = [];
let volt = [];

let dest = null;
let type = null;

for (const device of JSON.parse(output)) {
// use a shorter device name to reduce visual noise:
// - omit manufacturer name
// - omit details in parenthesis
const shortDevice = device.description.replace(/(^.+? )|( \(.+)/g, '');

for (const item of device.status) {
switch (item.unit) {
case '°C':
dest = temp;
type = 'temp';
break;
case 'rpm':
dest = rpm;
type = 'rpm';
break;
case 'V':
dest = volt;
type = 'volt';
break;
default:
continue;
}

// use a shorter sensor name to reduce visual noise:
// - omit temperature|speed|voltage suffix
const shortKey = item.key.replace(/ (temperature|speed|voltage)/, '');

const feature = {
label: shortDevice + ' ' + shortKey,
[type]: item.value,
};
dest.push(feature);
}
}

this._temp = temp;
this._rpm = rpm;
this._volt = volt;
callback();
} catch (e) {
this._temp = null;
this._rpm = null;
this._volt = null;
global.log('failed to process data from liquidctl: ' + e.toString());
}
});
}

get temp() {
return this._temp || [];
}

get rpm() {
return this._rpm || [];
}

get volt() {
return this._volt || [];
}
};
6 changes: 5 additions & 1 deletion freon@UshakovVasilii_Github.yahoo.com/prefs.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,13 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex
'nvidia-settings' : _('NVIDIA'),
'aticonfig' : _('Catalyst'),
'bumblebee-nvidia-smi': _('Bumblebee + NVIDIA') },
key: 'gpu-utility', y : i, x : 3,
key: 'gpu-utility', y : i++, x : 3,
label: _('Video Card Temperature Utility')
});

this._addSwitch({key : 'show-liquidctl', y : i++, x : 3,
label : _('Show liquidctl Sensors'),
help : _('Show data from liquidctl v1.7.0 or later')});
}

_addSwitch(params){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,12 @@
<description>Utility for detect video card temperature ('none', 'nvidia-settings' or 'aticonfig')</description>
</key>

<key type="b" name="show-liquidctl">
<default>false</default>
<summary>Show liquidctl sensors</summary>
<description>Show data from liquidctl v1.7.0 or later</description>
</key>

<key type="s" name="position-in-panel">
<default>'right'</default>
<summary>Position in Panel</summary>
Expand Down