- Регистрация
- 24.08.2016
- Сообщения
- 90
- Благодарностей
- 6
- Баллы
- 8
Как вариант
Посмотреть вложение 47471Get CPU Temperature Using Open Hardware Monitor In C# - Arduino Project Hub
Use OpenHardwareMonitor to get a reading on the diagnostics of my hardware in C#. Not WMI. Make a DIY Computer cooling system by yourself! By Haoming Weng.create.arduino.cc
// Вызывать с кубика:
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));
}
}
}
}
Дак не то показывает, я это еще первым делом проверилСпасибо - реализовал данный пример в Зеннопостере - показывает температуру
Код:// Вызывать с кубика: 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)); } } } }
Спасибо - реализовал данный пример в Зеннопостере - показывает температуру
Код:// Вызывать с кубика: 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)); } } } }
Вы предоставили ссылку - я перешел на страничку и подумал, что есть смысл адаптировать код под Зеннопостер и предоставить его здесь.Что, у тех кто лайкал BAZAG, его код правильную температуру отдает по ядрам? а то у меня кривую выдавало, по этому и полез другое решение искать, у него судя по скринам тоже криво и на форумах люди пишут, что оно почти везде не правильно работает
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);
Работает, спасибо!Вы предоставили ссылку - я перешел на страничку и подумал, что есть смысл адаптировать код под Зеннопостер и предоставить его здесь.
Информацию показывает он аналогичную той, которую возвращает 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);
Вам в 1 переменную или в несколько?Работает, спасибо!
Подскажите, как все значения сохранить в переменные?
Желательно каждую температуру с каждого ядра в 1 переменную.Вам в 1 переменную или в несколько?
Желательно каждую температуру с каждого ядра в 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];
}
Ой, даже и забыл(видимо мозг пропустил эту информацию), что там по ссылке помимо OpenHardwareMonitor(про который и хотел собственно сказать), еще нерабочий вариант через WMI естьВы предоставили ссылку - я перешел на страничку и подумал, что есть смысл адаптировать код под Зеннопостер и предоставить его здесь.