PCdisplay icon indicating copy to clipboard operation
PCdisplay copied to clipboard

Api

Open nikitachukov opened this issue 8 years ago • 6 comments

Alex, не могли бы вы сделать описание того что и как HardwareMonitor шлет в ардуинку, есть желание приспособить ваш замечательный монитор для мониторинга серверов.

nikitachukov avatar Nov 23 '17 20:11 nikitachukov

nikitachukov - все же есть в исходниках. (openhardwaremonitor_source, PCdisplay_v.1.3, PCdisplay_v_1.3_1602) В любом случае, Вам нужно будет подключение по ssh или же какое-то серверное api (скрипт на стороне сервера, возвращающий данные по датчикам) или же отправка данных с серверов Вам (т.е. какая-то обратная связь) На Вашей стороне нужен будет какой-то скрипт, принимающий данные и отправляющий их в com-порт.

P.S. - для серверов смотрите, как минимум в сторону

lm-sensors

Делаете парсинг "выхлопа" и все - дело в шляпе

1271 avatar Nov 25 '17 18:11 1271

Перефразирую вопрос: Можно ли краткое описание того что и как слать в ардуино?

nikitachukov avatar Nov 25 '17 19:11 nikitachukov

Если знаете C#, смотрите тут: https://github.com/AlexGyver/PCdisplay/blob/master/openhardwaremonitor_source/GUI/MainForm.cs#L814 (можете вывести в формочку вывод данных, например. Там просто текст, переведенный в байты) Если проще на примере скетча (что врятли, как по мне), то смотрите тут: https://github.com/AlexGyver/PCdisplay/blob/master/PCdisplay_v_1.3_1602/PCdisplay_v_1.3_1602.ino#L307

http://gyazo.sttv.me/grab/484d.png - тут пример того, что отправляется, в виде текста (можете посмотреть подробнее в исходниках по первой ссылке) Описание функции кодирования тут: https://msdn.microsoft.com/ru-ru/library/ds4kkd55(v=vs.110).aspx

Аналог функции на Python:

_str = "test_str"
_bytes = str.encode(_str)

P.S. В общем, отправляется этот массив данных:

{
    (int)MaxTemp(computer, HardwareType.CPU),
    (int)MaxTemp(computer, HardwareType.GpuAti) + AvgTemp(computer, HardwareType.GpuNvidia), // тут float                    
    (int)MaxTemp(computer, HardwareType.Mainboard),
    (int)MaxTemp(computer, HardwareType.HDD),
    (int)UsageInPercent(computer, HardwareType.CPU, "CPU Total"),
    (int)(UsageInPercent(computer, HardwareType.GpuAti, "GPU Core") + UsageInPercent(computer, HardwareType.GpuNvidia, "GPU Core")), // тут int                    
    (int)UsageInPercent(computer, HardwareType.RAM, "Memory"),
    (int)UsageInPercent(computer, HardwareType.GpuAti, "GPU Memory") + UsageInPercent(computer, HardwareType.GpuNvidia, "GPU Memory"), // тут float                                    
                
    // Right group.
    settings.GetValue("nMaxFan", 100),
    settings.GetValue("nMinFan", 20),
    settings.GetValue("nMaxTemp", 100),
    settings.GetValue("nMinTemp", 10),

    // Flags
    settings.GetValue("chkManualFan", false) ? 1 : 0,
    settings.GetValue("chkManualColor", false) ? 1 : 0,

    // Sliders.
    settings.GetValue("sldManualFan", 50),
    settings.GetValue("sldManualColor", 500),
    settings.GetValue("sldLedBrightness", 50),
    settings.GetValue("sldPlotInterval", 5),

    settings.GetValue("cboMaxTempSource", 0),
}; 

P.P.S. - Все это можно перенастроить под свои нужды, естественно. Только поправьте скетч в ардуино (вторая ссылка)

1271 avatar Nov 25 '17 21:11 1271

Если знаете C#, смотрите тут: https://github.com/AlexGyver/PCdisplay/blob/master/openhardwaremonitor_source/GUI/MainForm.cs#L814 (можете вывести в формочку вывод данных, например. Там просто текст, переведенный в байты) Если проще на примере скетча (что врятли, как по мне), то смотрите тут: https://github.com/AlexGyver/PCdisplay/blob/master/PCdisplay_v_1.3_1602/PCdisplay_v_1.3_1602.ino#L307

http://gyazo.sttv.me/grab/484d.png - тут пример того, что отправляется, в виде текста (можете посмотреть подробнее в исходниках по первой ссылке) Описание функции кодирования тут: https://msdn.microsoft.com/ru-ru/library/ds4kkd55(v=vs.110).aspx

Аналог функции на Python:

_str = "test_str"
_bytes = str.encode(_str)

P.S. В общем, отправляется этот массив данных:

{
    (int)MaxTemp(computer, HardwareType.CPU),
    (int)MaxTemp(computer, HardwareType.GpuAti) + AvgTemp(computer, HardwareType.GpuNvidia), // тут float                    
    (int)MaxTemp(computer, HardwareType.Mainboard),
    (int)MaxTemp(computer, HardwareType.HDD),
    (int)UsageInPercent(computer, HardwareType.CPU, "CPU Total"),
    (int)(UsageInPercent(computer, HardwareType.GpuAti, "GPU Core") + UsageInPercent(computer, HardwareType.GpuNvidia, "GPU Core")), // тут int                    
    (int)UsageInPercent(computer, HardwareType.RAM, "Memory"),
    (int)UsageInPercent(computer, HardwareType.GpuAti, "GPU Memory") + UsageInPercent(computer, HardwareType.GpuNvidia, "GPU Memory"), // тут float                                    
                
    // Right group.
    settings.GetValue("nMaxFan", 100),
    settings.GetValue("nMinFan", 20),
    settings.GetValue("nMaxTemp", 100),
    settings.GetValue("nMinTemp", 10),

    // Flags
    settings.GetValue("chkManualFan", false) ? 1 : 0,
    settings.GetValue("chkManualColor", false) ? 1 : 0,

    // Sliders.
    settings.GetValue("sldManualFan", 50),
    settings.GetValue("sldManualColor", 500),
    settings.GetValue("sldLedBrightness", 50),
    settings.GetValue("sldPlotInterval", 5),

    settings.GetValue("cboMaxTempSource", 0),
}; 

P.P.S. - Все это можно перенастроить под свои нужды, естественно. Только поправьте скетч в ардуино (вторая ссылка) Здравтвуйте! Будьте добры, поскажите пожалуйста, каким конкртено образом нужно изменить код программы чтобы в COM-порт выводились данные, нужные мне? Например, хочу чтобы выводились частоты процессора, следовательно я меняю настройки в MainForm.cs, а дальше что делать? Уже всю голову сломал.

KirGorXXL avatar Jan 30 '23 10:01 KirGorXXL

@KirGorXXL добрый день

Как и писал раньше - вам нужно добавить сюда больше данных (те, что нужны) Например тут я добавил среднюю температуру по CPU и частоту (не проверял, но должно работать)

image

На стороне ардуино вам нужно будет считать это (помните, что вы добавили больше данных, значит должны это учитывать)

Касаемо частоты. Это ПЛОХОЙ пример и наверное можно сделать чуть лучше (я не шарпист), но будет выглядеть примерно так:



    float AvgCpuFreq(Computer computer, HardwareType type)
    {
        var cpus = computer.Hardware.Where(x => x.HardwareType == type).ToArray();

        if (cpus.Any())
        {

            var freqSum = 0.0f;
            var freqCnt = 0;

            foreach (var cpu in cpus)
            {
                var freq = cpu.Sensors.Where(x => x.SensorType == SensorType.Clock).ToArray();

                    foreach(var fq in freq)
                    {
                        var freqValue = fq.Value;
                        if (freqValue != null)
                        {
                            freqSum += (float)freqValue;
                            freqCnt += 1;
                        }
                    }

            }

            return freqSum / freqCnt;
        }
        
        return 0.0f;
    }


1271 avatar Feb 09 '23 17:02 1271

@1271 добрый вечер Спасибо большое за ответ, стало гораздо понятнее! Буду разбираться

KirGorXXL avatar Feb 09 '23 18:02 KirGorXXL