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

  • Автор темы Автор темы DmitryiAsp
  • Дата начала Дата начала

DmitryiAsp

Client
Регистрация
24.08.2016
Сообщения
90
Реакции
6
Баллы
8
Всем привет. Собственно сабж. Нужен сниппет по съему температуры с процессоров и ядер. Кто, что может предложить?
 
  • Спасибо
Реакции: Phoenix78
Как вариант
1577536588396.png
 
Спасибо - реализовал данный пример в Зеннопостере - показывает температуру :-)
Как вариант
Посмотреть вложение 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
Спасибо - реализовал данный пример в Зеннопостере - показывает температуру :-)

Код:
Развернуть Свернуть Копировать
// Вызывать с кубика:
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
 
Последнее редактирование:
Спасибо - реализовал данный пример в Зеннопостере - показывает температуру :-)

Код:
Развернуть Свернуть Копировать
// Вызывать с кубика:
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.
 
Что, у тех кто лайкал BAZAG, его код правильную температуру отдает по ядрам? а то у меня кривую выдавало, по этому и полез другое решение искать, у него судя по скринам тоже криво и на форумах люди пишут, что оно почти везде не правильно работает
 
Последнее редактирование:
Нет желающих за $ допилить сниппет товарища выше?
 
Что, у тех кто лайкал 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
Вы предоставили ссылку - я перешел на страничку и подумал, что есть смысл адаптировать код под Зеннопостер и предоставить его здесь.
Информацию показывает он аналогичную той, которую возвращает 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 переменную.
Код:
Развернуть Свернуть Копировать
// Добавляем в решение в общий код рядом с таким же методом
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
Раз пошла такая пьянка, как smart диска считать?
 
Вы предоставили ссылку - я перешел на страничку и подумал, что есть смысл адаптировать код под Зеннопостер и предоставить его здесь.

Ой, даже и забыл(видимо мозг пропустил эту информацию), что там по ссылке помимо OpenHardwareMonitor(про который и хотел собственно сказать), еще нерабочий вариант через WMI есть
 

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