Jump to content

Remote Sensor Monitor - A RESTful Web Server

Recommended Posts

Remote Sensor Monitor is a small freeware Windows console application (requires .NET 4.0) that initially started out with support for HWiNFO, GPU-Z and Open Hardware Monitor. With v2.1.0, support for AIDA64 has also been added. Please test out and provide feedback / bug reports. If you find this tool helpful, spread the word and leave a note here :)




Remote Sensor Monitor
Copyright © 2013 Ganesh T S


Remote Sensor Monitor is a Windows console application designed to present various hardware sensor parameters reported by HWiNFO / GPU-Z / AIDA64 / Open Hardware Monitor as a JSON string and make it available over the network. Enabling GPU-Z, HWiNFO and AIDA64 requires the programs to be running the background. The minimum supported versions are: GPU-Z: 0.7.4, HWiNFO: 4.30, AIDA64: 4.00.2706. Open Hardware Monitor sensors can be reported only if OpenHardwareMonitorLib.dll is present in the same folder as that of the application. Once the web server starts up, the JSON string is available by visiting IP:PORT with a web browser ; The reported parameters can be filtered / configured via the web interface at IP:PORT/config ; The program requires administrative privileges in order to open and close the applicable port in the firewall when necessary.


Command Line Options:

p, port : (Default: 55555) Port number to use
hwinfo : (Default: 1) Enable (1) / Disable (0) sending out sensor readings from HWiNFO
gpuz : (Default: 1) Enable (1) / Disable (0) sending out sensor readings from GPU-Z
aida64 : (Default: 1) Enable (1) / Disable (0) sending out sensor readings from AIDA64
ohm : (Default: 1) Enable (1) / Disable (0) sending out sensor readings from OpenHardwareMonitor
h, help : Display this help screen.



"Remote Sensor Monitor.exe" [-p=<port_number>] [--hwinfo=<0|1>] [--gpuz=<0|1>] [--aida64=<0|1>] [--ohm=<0|1>]



Version History:


Release Notes:
1. Added support for AIDA64 sensor / data reporting

2. Removed external DLL dependency for GPU-Z shared memory access


Release Notes:
1. Fixed bug related to certain sensors being reported multiple times in Hyper-V enabled machines

Release Notes:
1. Initial public releas


Link to post
Share on other sites

Thank you Ganesh, it looks like a very useful app!





Fiery, Thanks for the kind words.


If I can request one feature, would it be possible to have a sub-1s scan interval for the sensor parameters being updated in the shared memory? Currently, only HWiNFO allows a configurable scan interval in milliseconds (I set it to 900ms in order to capture sensor values every 1s over the network). GPU-Z has no configurable scan interval (currently 1s on the tool's own window and 2.5s on the shared memory). With AIDA64, 1s is the minimum possible (I tried entering 0.9 in the Update Frequency box, but it went back to 5s after closing and opening that dialog box). It would be really nice if we could enter values with millisecond precision (or at least one value less than or equal to 900ms) for the external application update frequency.

Link to post
Share on other sites

Update frequency is limited that way, because collecting all sensor values AIDA64 supports (CPU DTS, motherboard sensor chip(s), chipset sensors, sensor and VRM chips for all GPUs, HDD and SSD sensors, DIMM TS sensors, fan controllers, various sensor devices, etc) may take 200-300 or sometimes even 600-800 milliseconds combined.  Not to mention that you may also enable measuring a lot of other system values that can be even slower to measure, like clock speeds, memory/CPU/GPU utilization, etc. etc.  So configuring a sub-1sec update frequency is potentially dangerous and would result in a constant polling of sensors and a high CPU utilization.

Link to post
Share on other sites

It may not cause too much troubles on your particular machine, or some other machines out there, but on some configurations it wouldn't work well.  We try to make a tool that works alright on any systems, so it has to be prepared for the worst situations "out of the box".  For example, if you've got an iGPU, 100 millisec may work fine, but if you add 4 dGPUs to the system (like two HD7990 cards), you will have a much higher CPU impact at each updates -- so keeping the update rate higher would be the best idea.


One thing that might work is enabling sub-1sec update frequency only via editing the AIDA64.INI configuration file.  That way power users can see what rate is acceptable for their particular usage scenario.  We'll do that in the next AIDA64 beta release (due in a few days), and I will post a message in this topic once the new beta is available ;)

Link to post
Share on other sites

We've decided to let the Preferences / Hardware Monitoring / Update Frequency page settings go down to 500 milliseconds in 100 ms steps, so you (and other power users) will not have to deal with .INI file editing and other hurdles :)  Please upgrade to the latest AIDA64 beta release available at:


Let me know how it works for you ;)
Link to post
Share on other sites
  • 3 months later...

Remote Sensor Monitor is a small freeware Windows console application (requires .NET 4.0) that initially started out with support for HWiNFO, GPU-Z and Open Hardware Monitor. With v2.1.0, support for AIDA64 has also been added. Please test out and provide feedback / bug reports. If you find this tool helpful, spread the word and leave a note here :)


Thanks Ganesh_AT, I have been looking for somthing like this !! Going to test it ! :rolleyes:

Link to post
Share on other sites
  • 4 years later...

Starting the utility from a Admin Command Prompt with with  Remote Sensor Monitor.exe --p=8085 --hwinfo=0 --gpuz=0 --aida64=1 --ohm=0,

The programs crashes

Starting Remote Sensor Monitor on port 8085...

AIDA64 process found! Enabling AIDA64...

Please wait for the web server to start....Couldn't open AIDA64 Shared Memory: Unable to find the specified file.

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
   at RemoteSensorMonitor.AIDA64Wrapper.GetSensorClasses()
   at RemoteSensorMonitor.GlobalOptions.InitializeEnabledStatus()
   at RemoteSensorMonitor.GlobalOptions.ProcessStartupOptions(String[] args)
   at RemoteSensorMonitor.Program.Main(String[] args)

Running v2.1.0

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Similar Content

    • By FuglyOtherMucker
      As the title says...
      Have attached the Sensor Debug Info File. Hope that helps!
      thx & cheers
    • By Mkaak
      Rtss fps counter dosen't work on my sensor panel it always show me thats the fps is 0 even when im play , how can i fix this 
    • By tuning76
      Nem tudom mi lehet az oka,de az AIDA64 nem tudja kiolvasni a ventillátor sebességét, de más diag és figyelő szoftver sem. Csak a BIOS-ban látható.
      Mi lehet az oka ? 
      A válaszokat előre is köszönöm!
    • By bkw_17
      Hey, there's probably an easy answer to this that is somehow evading me but I can't seem to figure out how to keep the sensor display window open after closing the main Aida64 window. It automatically closes the sensor display as well. Any help is appreciated!
    • By Irios
      After coming across this post on the AutoIt forums while researching how to access shared memory of processes in AutoIt, I decided to have a go at translating the Delphi example code.
      Below is a function w/ a working example showing how to access the AIDA64 shared memory.
      First enable shared memory here: Preferences > Hardware Monitoring > External Applications > Enable Shared Memory
      The length of the data depends on the number of active sensors and their content. As AIDA64 does not provide a buffer size value, we use _WinAPI_GetSystemInfo() <WinAPISys.au3> to get dwPageSize ($aArray[1]). This value is then used as an address offset, and we continue reading chunks of data until we encounter a 0x00 NUL character.
      Based on the Delphi example found in the AIDA64 documentation: https://www.aida64.co.uk/user-manual/external-applications
      Feedback appreciated, especially as all this shared memory stuff is not my ordinary cup of... cake. And regarding this whole ordeal of reading data without knowing the exact length; I'm suspecting my solution to read chunks of data like done below is not by the book, and I'm concerned what might happen if the final chunk is exactly 4096 bytes in length. Will there still be a NUL terminator there? Hmm.
      #NoTrayIcon #include <WinAPIFiles.au3> #include <WinAPISys.au3> ; #INDEX# =========================================================================================================================== ; Title .........: AIDA64 Shared Memory access for AutoIt3 ; Author(s) .....: demux4555 ; Reference .....: https://www.aida64.co.uk/user-manual/external-applications ; =================================================================================================================================== Global $vSharedmem_data ; The variable used to store the data we read from the shared memory Global $return = ExtApp_SharedMem_ReadBuffer_v2($vSharedmem_data) ; Now, let's see what happens when we run the function... If @error Then _Echo("! ExtApp_SharedMem_ReadBuffer_v2(): @errror = " & @error) If IsBinary($vSharedmem_data) Then ; Convert type Binary to actual human readable text. We also remove the excess of trailing 0x00 characters. $vSharedmem_data = StringStripWS(BinaryToString($vSharedmem_data), $STR_STRIPLEADING+$STR_STRIPTRAILING) EndIf _Echo() _Echo("> return = " & $return) ; The return value. Will be True if everything went ok. _Echo("> length = " & StringLen($vSharedmem_data)) ; The number of characters read from shared memory. _Echo("> data = " & $vSharedmem_data) ; The actual data. _Echo("> data(40) = " & "..." & StringRight($vSharedmem_data, 40)) ; shows the 40 right-most characters, and _should_ show the very end of the data at this point. _Echo() Exit ; #FUNCTION# ==================================================================================================================== ; Name ..........: ExtApp_SharedMem_ReadBuffer_v2 ; Description ...: AIDA64 Shared Memory Example for AutoIt3 ; Syntax ........: ExtApp_SharedMem_ReadBuffer_v2(Byref $_dOutput[, $_sSharedmemName = "AIDA64_SensorValues"]) ; Parameters ....: $_dOutput - [in/out] Variable to store the read data. ; $_sSharedmemName - [optional] Name of the AIDA64 shared memory. Default is "AIDA64_SensorValues". ; Return values .: Success: True. $_dOutput will be type Binary, containing a string of the XML values of the active sensors. ; Failure: False. ; Author ........: demux4555 ; Reference .....: https://www.aida64.co.uk/user-manual/external-applications ; =============================================================================================================================== Func ExtApp_SharedMem_ReadBuffer_v2(ByRef $_dOutput, $_sSharedmemName = "AIDA64_SensorValues") Local $_bReturn = False Local $_aGSI = _WinAPI_GetSystemInfo() ; Retrieves information about the current system... Ref: https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsysteminfo Local $_iPageSize = $_aGSI[1] ; ... the page size and the granularity of page protection and commitment. Usually it is 4096, but we read it anyway. Ref: https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-system_info Local $_hMapping = _WinAPI_OpenFileMapping($_sSharedmemName, $FILE_MAP_READ) ; Opens a named file mapping object. Ref: https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-openfilemappingw If Not IsPtr($_hMapping) Then Return SetError(-2, 0, $_bReturn) Local $_pMappedData = _WinAPI_MapViewOfFile($_hMapping, 0, 0, $FILE_MAP_READ) ; Pointer to the start address. Maps a view of a file mapping into the address space of a calling process. Ref: https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-mapviewoffile If @error Or Not IsPtr($_pMappedData) Then Return SetError(-2, 0, $_bReturn) ; Now we loop until we reach the end of the data. Local $_tData, $_dBuffer While 1 $_tData = DllStructCreate("BYTE[" & $_iPageSize & "]", $_pMappedData) ; Note: we use type BYTE[] (AutoIt type Binary) instead of CHAR[] (AutoIt type String). This allows us to look for value 0x00 (NUL termination of the data). If @error Then ExitLoop $_dBuffer = DllStructGetData($_tData, 1) ; The returned value is type Binary. If @error Or ($_dBuffer==0) Or (BinaryLen($_dBuffer)=0) Then ExitLoop ; Pretty sure $_dBuffer==0 can not happen, so just in case. $_dOutput = Binary($_dOutput & $_dBuffer) ; Add the read data to the end of the output variable. If StringRight($_dBuffer, 2)=="00" Then ExitLoop ; Look for NUL termination of the string data. $_pMappedData += $_iPageSize ; We change the address by using the page granularity value (i.e. 4096) as the offset. WEnd ; Quick cleanup $_bReturn = _WinAPI_UnmapViewOfFile($_pMappedData)=1 ; Unmaps a mapped view of a file from the calling process's address space. Ref: https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-unmapviewoffile _WinAPI_CloseHandle($_hMapping) Return $_bReturn EndFunc; Func _Echo($_data = "") ConsoleWrite($_data & @CRLF) EndFunc  
  • Create New...