Сниппет по съему температуры с процессоров

DmitryiAsp

Client
Регистрация
24.08.2016
Сообщения
90
Благодарностей
6
Баллы
8
Всем привет. Собственно сабж. Нужен сниппет по съему температуры с процессоров и ядер. Кто, что может предложить?
 
  • Спасибо
Реакции: Phoenix78

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 454
Баллы
113
Спасибо - реализовал данный пример в Зеннопостере - показывает температуру :-)
Как вариант
Посмотреть вложение 47471
Код:
// Вызывать с кубика:
CommonCode.CPUtprt(project);

// В ссылки из GAS добавить System.Management.dll
// В общий код
using System.Management;

namespace ZennoLab.OwnCode {
    public class CommonCode {
        public static void CPUtprt(IZennoPosterProjectModel project) {
            ManagementObjectSearcher mos = new ManagementObjectSearcher(@"root\WMI", "Select * From MSAcpi_ThermalZoneTemperature");
            foreach (ManagementObject mo in mos.Get()) {
                double CPUtprt = Convert.ToDouble(Convert.ToDouble(mo.GetPropertyValue("CurrentTemperature").ToString()) - 2732) / 10;
                project.SendInfoToLog(string.Format(@"{0}  °C",CPUtprt));
            }
        }
    }
}
 

Вложения

  • Спасибо
Реакции: DmitryiAsp и Astraport

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
Спасибо - реализовал данный пример в Зеннопостере - показывает температуру :-)

Код:
// Вызывать с кубика:
CommonCode.CPUtprt(project);

// В ссылки из GAS добавить System.Management.dll
// В общий код
using System.Management;

namespace ZennoLab.OwnCode {
    public class CommonCode {
        public static void CPUtprt(IZennoPosterProjectModel project) {
            ManagementObjectSearcher mos = new ManagementObjectSearcher(@"root\WMI", "Select * From MSAcpi_ThermalZoneTemperature");
            foreach (ManagementObject mo in mos.Get()) {
                double CPUtprt = Convert.ToDouble(Convert.ToDouble(mo.GetPropertyValue("CurrentTemperature").ToString()) - 2732) / 10;
                project.SendInfoToLog(string.Format(@"{0}  °C",CPUtprt));
            }
        }
    }
}
Дак не то показывает, я это еще первым делом проверил
47473
 
Последнее редактирование:

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 454
Баллы
113

DmitryiAsp

Client
Регистрация
24.08.2016
Сообщения
90
Благодарностей
6
Баллы
8
Спасибо - реализовал данный пример в Зеннопостере - показывает температуру :-)

Код:
// Вызывать с кубика:
CommonCode.CPUtprt(project);

// В ссылки из GAS добавить System.Management.dll
// В общий код
using System.Management;

namespace ZennoLab.OwnCode {
    public class CommonCode {
        public static void CPUtprt(IZennoPosterProjectModel project) {
            ManagementObjectSearcher mos = new ManagementObjectSearcher(@"root\WMI", "Select * From MSAcpi_ThermalZoneTemperature");
            foreach (ManagementObject mo in mos.Get()) {
                double CPUtprt = Convert.ToDouble(Convert.ToDouble(mo.GetPropertyValue("CurrentTemperature").ToString()) - 2732) / 10;
                project.SendInfoToLog(string.Format(@"{0}  °C",CPUtprt));
            }
        }
    }
}
Почему то ошибку показывает. Вроде бы все добавил в using и в gac.
 

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
Что, у тех кто лайкал BAZAG, его код правильную температуру отдает по ядрам? а то у меня кривую выдавало, по этому и полез другое решение искать, у него судя по скринам тоже криво и на форумах люди пишут, что оно почти везде не правильно работает
 
Последнее редактирование:

DmitryiAsp

Client
Регистрация
24.08.2016
Сообщения
90
Благодарностей
6
Баллы
8
Нет желающих за $ допилить сниппет товарища выше?
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 454
Баллы
113
Что, у тех кто лайкал BAZAG, его код правильную температуру отдает по ядрам? а то у меня кривую выдавало, по этому и полез другое решение искать, у него судя по скринам тоже криво и на форумах люди пишут, что оно почти везде не правильно работает
Вы предоставили ссылку - я перешел на страничку и подумал, что есть смысл адаптировать код под Зеннопостер и предоставить его здесь.
Информацию показывает он аналогичную той, которую возвращает WMI в командной строке - из-за чего делаю вывод что код рабочий.
Но, после мне стало также как и Вам интересно почему же всегда одна и та же температура - и оказалось что если показывает одни и те же значения - значит WMI не считывает информацию с нужных сенсоров.
После чего я предоставил скриншоты, чтобы указать на этот момент - видимо у одних может работать корректно, а у других может выдавать одно и то же (прям мой случай).

В итоге - вопрос открыт - считать температуру процессора с C# оказалось не так просто, как предполагалось.
Есть ещё библиотека, которая должна выполнять данную работу - но, признаюсь что я не пытался даже её использовать.
Мне бы было интересно узнать от практикующих программистов алгоритм решения подобных задач.
Может быть всё куда проще - обращаемся в поддержку своей материнской платы, они оттуда присылают ссылку на документацию - и уже согласно этой документации можно сотворить для себя какое-то решение (но, поддержка ASUS мне пока не ответила).

P.S. Кстати, запустил я решение с помощью библиотеки.
Качаем: https://openhardwaremonitor.org/files/openhardwaremonitor-v0.8.0-beta.zip
Оттуда берем библиотеку OpenHardwareMonitorLib.dll и забрасываем в папку C:\Program Files\ZennoLab\RU\ZennoPoster Pro\5.39.0.0\Progs\ExternalAssemblies
Дальше в ссылки из GAS добавить OpenHardwareMonitorLib.dll
В общий код добавляем:
Код:
using OpenHardwareMonitor.Hardware;
namespace ZennoLab.OwnCode {
    public class CommonCode {
public class UpdateVisitor : IVisitor {
           public void VisitComputer(IComputer computer) {
               computer.Traverse(this);
           }
           public void VisitHardware(IHardware hardware) {
               hardware.Update();
               foreach (IHardware subHardware in hardware.SubHardware) subHardware.Accept(this);
           }
           public void VisitSensor(ISensor sensor) { }
           public void VisitParameter(IParameter parameter) { }
       }
       public static void GetSystemInfo(IZennoPosterProjectModel project) {
           UpdateVisitor updateVisitor = new UpdateVisitor();
           Computer computer = new Computer();
           computer.Open();
           computer.CPUEnabled = true;
           computer.Accept(updateVisitor);
           for (int i = 0; i < computer.Hardware.Length; i++) {
               if (computer.Hardware[i].HardwareType == HardwareType.CPU) {
                   for (int j = 0; j < computer.Hardware[i].Sensors.Length; j++) {
                       if (computer.Hardware[i].Sensors[j].SensorType == SensorType.Temperature){
                            string temp = string.Format(@"{0}: {1}",computer.Hardware[i].Sensors[j].Name, computer.Hardware[i].Sensors[j].Value.ToString());
                          project.SendInfoToLog(temp);
                    }
                   }
               }
           }
           computer.Close();
       }
}
}
Вызываем в кубике примерно так - в логе видим температуру всех ядер.
Код:
CommonCode.GetSystemInfo(project);
Библиотеку и шаблон добавлю ещё здесь.
 

Вложения

Последнее редактирование:
  • Спасибо
Реакции: Metrix и DmitryiAsp

DmitryiAsp

Client
Регистрация
24.08.2016
Сообщения
90
Благодарностей
6
Баллы
8
Вы предоставили ссылку - я перешел на страничку и подумал, что есть смысл адаптировать код под Зеннопостер и предоставить его здесь.
Информацию показывает он аналогичную той, которую возвращает WMI в командной строке - из-за чего делаю вывод что код рабочий.
Но, после мне стало также как и Вам интересно почему же всегда одна и та же температура - и оказалось что если показывает одни и те же значения - значит WMI не считывает информацию с нужных сенсоров.
После чего я предоставил скриншоты, чтобы указать на этот момент - видимо у одних может работать корректно, а у других может выдавать одно и то же (прям мой случай).

В итоге - вопрос открыт - считать температуру процессора с C# оказалось не так просто, как предполагалось.
Есть ещё библиотека, которая должна выполнять данную работу - но, признаюсь что я не пытался даже её использовать.
Мне бы было интересно узнать от практикующих программистов алгоритм решения подобных задач.
Может быть всё куда проще - обращаемся в поддержку своей материнской платы, они оттуда присылают ссылку на документацию - и уже согласно этой документации можно сотворить для себя какое-то решение (но, поддержка ASUS мне пока не ответила).

P.S. Кстати, запустил я решение с помощью библиотеки.
Качаем: https://openhardwaremonitor.org/files/openhardwaremonitor-v0.8.0-beta.zip
Оттуда берем библиотеку OpenHardwareMonitorLib.dll и забрасываем в папку C:\Program Files\ZennoLab\RU\ZennoPoster Pro\5.39.0.0\Progs\ExternalAssemblies
Дальше в ссылки из GAS добавить OpenHardwareMonitorLib.dll
В общий код добавляем:
Код:
using OpenHardwareMonitor.Hardware;
namespace ZennoLab.OwnCode {
    public class CommonCode {
public class UpdateVisitor : IVisitor {
           public void VisitComputer(IComputer computer) {
               computer.Traverse(this);
           }
           public void VisitHardware(IHardware hardware) {
               hardware.Update();
               foreach (IHardware subHardware in hardware.SubHardware) subHardware.Accept(this);
           }
           public void VisitSensor(ISensor sensor) { }
           public void VisitParameter(IParameter parameter) { }
       }
       public static void GetSystemInfo(IZennoPosterProjectModel project) {
           UpdateVisitor updateVisitor = new UpdateVisitor();
           Computer computer = new Computer();
           computer.Open();
           computer.CPUEnabled = true;
           computer.Accept(updateVisitor);
           for (int i = 0; i < computer.Hardware.Length; i++) {
               if (computer.Hardware[i].HardwareType == HardwareType.CPU) {
                   for (int j = 0; j < computer.Hardware[i].Sensors.Length; j++) {
                       if (computer.Hardware[i].Sensors[j].SensorType == SensorType.Temperature){
                            string temp = string.Format(@"{0}: {1}",computer.Hardware[i].Sensors[j].Name, computer.Hardware[i].Sensors[j].Value.ToString());
                          project.SendInfoToLog(temp);
                    }
                   }
               }
           }
           computer.Close();
       }
}
}
Вызываем в кубике примерно так - в логе видим температуру всех ядер.
Код:
CommonCode.GetSystemInfo(project);
Библиотеку и шаблон добавлю ещё здесь.
Работает, спасибо!
Подскажите, как все значения сохранить в переменные?
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 454
Баллы
113
  • Спасибо
Реакции: DmitryiAsp

DmitryiAsp

Client
Регистрация
24.08.2016
Сообщения
90
Благодарностей
6
Баллы
8

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 454
Баллы
113
Желательно каждую температуру с каждого ядра в 1 переменную.
Код:
// Добавляем в решение в общий код рядом с таким же методом
public static List<string> GetSystemInfo() {
            List<string> data = new List<string>();
           UpdateVisitor updateVisitor = new UpdateVisitor();
           Computer computer = new Computer();
           computer.Open();
           computer.CPUEnabled = true;
           computer.Accept(updateVisitor);
           for (int i = 0; i < computer.Hardware.Length; i++) {
               if (computer.Hardware[i].HardwareType == HardwareType.CPU) {
                   for (int j = 0; j < computer.Hardware[i].Sensors.Length; j++) {
                       if (computer.Hardware[i].Sensors[j].SensorType == SensorType.Temperature){
                            string temp = string.Format(@"{0}: {1}",computer.Hardware[i].Sensors[j].Name, computer.Hardware[i].Sensors[j].Value.ToString());
                        data.Add(temp);
                         
                    }
                   }
               }
           }
           computer.Close();
        return data;
       }
В кубике указываем вызов. Внимание, должны быть созданы переменные в проекте.
Код:
List<string> data = CommonCode.GetSystemInfo();

int count = data.Count;

// Создаем в проекте переменные v0,v1, v2, v3, v4, v5, v6... (сколько есть ядер + 1)
for(int i =0; i<data.Count; i++) {
    project.Variables[string.Format(@"v{0}",i)].Value = data[i];
}
Измененный согласно данного описания шаблон добавляю к сообщению (требует естественно библиотеку, о которой писал в предыдущем сообщении).
 

Вложения

  • Спасибо
Реакции: DmitryiAsp

che100

Client
Регистрация
18.04.2017
Сообщения
808
Благодарностей
503
Баллы
63
Раз пошла такая пьянка, как smart диска считать?
 

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
Вы предоставили ссылку - я перешел на страничку и подумал, что есть смысл адаптировать код под Зеннопостер и предоставить его здесь.
Ой, даже и забыл(видимо мозг пропустил эту информацию), что там по ссылке помимо OpenHardwareMonitor(про который и хотел собственно сказать), еще нерабочий вариант через WMI есть
 

Кто просматривает тему: (Всего: 6, Пользователи: 0, Гости: 6)