Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 'AVCS SENS - AIDA64 Sensor Data Monitoring Function v2.6
- ' - Parses new AIDA64 data every 3 seconds (including External DHT11 data every 30 seconds, if available)
- ' - Rolling data points of 10, averages calculated over the last 30 seconds
- ' - Differential Diagnostic Algorithm of data compared to low/med/high/extreme baselines via DHT11 data
- ' by SemlerPDX Mar2022
- ' VETERANS-GAMING.COM
- Imports Microsoft.VisualBasic
- Imports System
- Imports System.IO
- Imports System.IO.Ports
- Imports System.Math
- Imports System.Text.RegularExpressions
- Imports System.Diagnostics
- Imports System.Text
- Imports System.Linq
- Imports System.Xml
- Imports System.Threading
- Public Class VAInline
- dim MonitorTimerDelay as integer = 3000 'in milliseconds (default 3000 == 3 seconds)
- dim SensorsCheckDelay as integer = 10 'in multiples of MonitorTimerDelay (default 10 == 30 seconds)
- dim itemDataPointsMax as decimal? = 10 'total data points to keep in any array, used with AVCS_SENS_DataPointsTotal (Dec)
- dim itemDataPointsTotal as decimal? = 0 'variable current data points of any given array
- dim newSensorsCount as integer = 0
- dim dtFormat as string = "M/d/yyyy H:mm:ss"
- dim diagnosticsSensors() as string = {"SCPUUTI","TCPU","TCPUDIO","TCPUPKG","FCPU","FCPUOPT","SMEMUTI","SGPU1UTI","SVMEMUSAGE","TGPU1DIO","FGPU1","TMOBO","TPCHDIO","FPCH","TSB","FSB","TNB","FNB","TVRM","TFAN1VRM","FCHA","FCHA1","FCHA2","FCHA3","FCHA4","FCHA5","FCHA6","FCHA7","FCHA8","FCHA9"}
- dim savedRequests as integer = 0
- dim mainInterval as integer = 0
- dim historicLevels() as string = {"LOW","MEDIUM","HIGH","EXTREME"}
- dim levelBracket as string = ""
- dim historicLevelBracket as string = ""
- dim percentDifferenceMax as decimal? = 100
- dim pdMaxTemps as decimal? = 25
- dim pdMaxFans as decimal? = 100
- dim diagnosis as boolean
- dim currentAverage as decimal = 1
- dim debugging as boolean = false
- dim debugStopwatch as boolean = false
- dim debugSensors as boolean = false
- dim debugAIDA as boolean = false
- dim debugArduino as boolean = false
- dim debugAverages as boolean = false
- dim checkResults as boolean = false
- Public Function LoadHistoricSensorBaselines()
- dim checkBaselinesSet() as string = {"MEDIUM","HIGH","EXTREME"}
- dim checkBaselines as string
- dim contents() as string
- dim entry() as string
- if ((VA.GetText("AVCS_SENS_HistoricBaselineData")) IsNot nothing)
- checkBaselines = VA.GetText("AVCS_SENS_HistoricBaselineData")
- if (checkBaselines.Contains(vbNewLine))
- contents = checkBaselines.Split(new string() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
- for each line as string in contents
- entry = line.Split("=")
- VA.SetText(entry(0), entry(1))
- next
- end if
- for each baseline as string in checkBaselinesSet
- if (checkBaselines.Contains("AVCS_SENS_SensorAverages_" + baseline))
- VA.SetBoolean("AVCS_SENS_SET_BASELINE_LEVEL_" + baseline, true)
- else
- VA.SetBoolean("AVCS_SENS_SET_BASELINE_LEVEL_" + baseline, nothing)
- end if
- next
- end if
- End Function
- Public Function GetFanLabelKeyword(ByVal sensorID as string, ByVal sensorLabel as string, ByVal sensorValue as string)
- if (VA.GetText("AVCS_SENS_FAN_" + sensorID) isNot nothing)
- sensorLabel = VA.GetText("AVCS_SENS_FAN_" + sensorID)
- else
- 'Get User Choice for Fan Label and Command Phrase
- VA.SetText("AVCS_SENS_FAN_LABEL", "Sensor ID: " + sensorID + "(\n)Sensor Label: " + sensorLabel + "(\n)Sensor Value: " + sensorValue)
- VA.Command.Execute("F_AIDA_CASE_FANS", true)
- if (VA.GetText("AVCS_SENS_FAN_LABEL") isNot nothing)
- sensorLabel = VA.GetText("AVCS_SENS_FAN_LABEL").Replace(" ", "") + "_fan"
- 'This value seems unused - test without and see if all works... maybe leftover from previous build?
- VA.SetText("AVCS_SENS_FAN_" + sensorID, sensorLabel)
- if (VA.GetInt("AVCS_DATA_SAVED_requests") isNot nothing)
- savedRequests = VA.GetInt("AVCS_DATA_SAVED_requests") + 1
- else
- savedRequests = 1
- end if
- VA.SetInt("AVCS_DATA_SAVED_requests", savedRequests)
- VA.SetText("AVCS_DATA_SAVED_name_" + savedRequests.ToString(), "AVCS_SENS_FAN_" + sensorID)
- VA.SetText("AVCS_DATA_SAVED_value_" + savedRequests.ToString(), sensorLabel)
- else
- return nothing
- end if
- end if
- VA.SetText("AVCS_SENS_FAN_LABEL", nothing)
- return sensorLabel
- End Function
- Public Function GetLargestInteger(ParamArray integers as integer()) as integer
- if integers.Length = 0
- throw New ArgumentException("AVCS ERROR: GetLargestInteger check params input")
- end if
- return integers.Max()
- End Function
- Public Function GetAverages(ByRef itemData as string, ByVal dataLabel as string, ByRef itemDataPointsTotal as decimal?)
- dim dataPointsArray() as string
- dim dataSum as decimal? = 0
- dim dataPointsLen as decimal? = 0
- dim dataAverage as decimal? = 0
- dataPointsArray = itemData.Split(New String() {","}, StringSplitOptions.RemoveEmptyEntries)
- dataPointsLen = Convert.ToDecimal(dataPointsArray.Length)
- if (dataPointsLen >= 11)
- itemData = dataPointsArray(1)
- for i as integer = 2 to dataPointsArray.Length - 1
- if ((dataPointsArray(i) isNot nothing) andAlso (dataPointsArray(i) <> ""))
- itemData = itemData + "," + dataPointsArray(i)
- if (debugSensors)
- VA.WriteToLog("Check DataPoint = " + dataPointsArray(i).ToString(), "green")
- end if
- end if
- next
- VA.SetText("AVCS_SENS_" + dataLabel, itemData)
- if (debugSensors)
- VA.WriteToLog("Check Variable = " + "AVCS_SENS_" + dataLabel + " = " + VA.GetText("AVCS_SENS_" + dataLabel).ToString(), "purple")
- end if
- dataPointsArray = itemData.Split(New String() {","}, StringSplitOptions.RemoveEmptyEntries)
- dataPointsLen = Convert.ToDecimal(dataPointsArray.Length)
- itemDataPointsTotal = dataPointsLen
- if (debugSensors)
- VA.WriteToLog("AVCS SENS New DataPointsMax = " + itemDataPointsTotal.ToString(), "green")
- end if
- else
- if (debugSensors)
- VA.WriteToLog("AVCS SENS Cannot build averages yet, data points below 10 = " + dataPointsLen.ToString(), "orange")
- end if
- end if
- if (debugSensors)
- VA.WriteToLog("dataPoints = " + itemData.ToString(), "pink")
- VA.WriteToLog("dataPointsLen = " + itemDataPointsTotal.ToString(), "pink")
- end if
- for each dataPoint as string in dataPointsArray
- try
- dataSum += Convert.ToDecimal(dataPoint)
- if (debugSensors)
- VA.WriteToLog("DataPoint = " + dataPoint, "pink")
- end if
- catch
- if (debugSensors)
- VA.WriteToLog("DataPoint NOT numeric = " + dataPoint, "red")
- end if
- end try
- next
- dataAverage = dataSum / dataPointsLen
- if (debugSensors)
- VA.WriteToLog("Equation: " + dataAverage.ToString() + " = " + dataSum.ToString() + " / " + dataPointsLen.ToString(), "green")
- end if
- if (itemDataPointsTotal = 0)
- itemDataPointsTotal = dataPointsLen
- end if
- return dataAverage
- end function
- Public Function GetAveragedAverages(ByVal givenAverages() as decimal)
- dim averagesSum as decimal = 0
- dim averagesLen as decimal = 0
- dim averagesAverage as decimal = 0
- try
- for x as integer = 0 to givenAverages.GetUpperBound(0)
- averagesSum = averagesSum + givenAverages(x)
- next
- averagesLen = givenAverages.Length
- averagesAverage = averagesSum / averagesLen
- if (debugAverages)
- VA.WriteToLog("func sum = " + averagesSum.ToString(), "pink")
- VA.WriteToLog("func len = " + averagesLen.ToString(), "pink")
- VA.WriteToLog("func avg = " + averagesAverage.ToString(), "red")
- end if
- catch
- if (debugAIDA)
- VA.WriteToLog("AVCS SENS CATCH CalcAvgs possible divide by zero - givenAverages.Length = " + givenAverages.Length.ToString(), "red")
- end if
- end try
- return averagesAverage
- End Function
- Public Function GetAverageDistances(ByVal thisAverage as decimal, ByVal theseAverages() as decimal)
- dim historicDistances() as decimal = {}
- dim nearestDistance as decimal = decimal.MaxValue
- dim currentDistance as decimal = decimal.MaxValue
- try
- for y as integer = 0 to theseAverages.GetUpperBound(0)
- currentDistance = Abs(thisAverage - theseAverages(y))
- if (isNumeric(currentDistance))
- redim preserve historicDistances(historicDistances.length)
- historicDistances(historicDistances.length - 1) = currentDistance
- end if
- if (Abs(thisAverage - theseAverages(y)) < nearestDistance)
- nearestDistance = Abs(thisAverage - theseAverages(y))
- if (y <= 3)
- historicLevelBracket = historicLevels(y)
- end if
- end if
- next
- if (debugAverages)
- VA.WriteToLog("AVCS SENS GetAvgD distance from nearest HistoricAverage = " + nearestDistance.ToString(), "pink")
- end if
- catch
- VA.WriteToLog("AVCS SENS GetAvgD function error at TryCatch", "red")
- end try
- nearestDistance = nothing
- currentDistance = nothing
- return historicDistances
- End Function
- Public Function GetRoundedAverage(ByVal thisDecimal as decimal, ByVal decimalPlaces as integer)
- try
- 'Try to compare decimal with integer version of itself to discover decimal places, then round
- dim checkInteger as Int32 = Convert.ToInt32(thisDecimal)
- if (thisDecimal = checkInteger)
- 'For TTS brevity use the one that couldn't end with .000
- thisDecimal = checkInteger
- elseif (checkInteger <> thisDecimal)
- 'dim roundDecimal as Double = checkInteger
- dim roundDecimal as Double = thisDecimal
- thisDecimal = Round(roundDecimal, decimalPlaces)
- end if
- catch
- 'Result is a whole number already, does not need rounding for TTS brevity
- end try
- return thisDecimal
- end function
- Public Function GetRebuiltAverages(ByVal averagesArray() as decimal)
- dim rebuiltAveragesArray() as decimal = {}
- 'Handle 0 values by turning into 1, should work if consitently applied to all
- for i as integer = 0 to averagesArray.GetUpperBound(0)
- redim preserve rebuiltAveragesArray(rebuiltAveragesArray.length)
- if (averagesArray(i) < 1)
- rebuiltAveragesArray(rebuiltAveragesArray.length - 1) = 1
- else
- rebuiltAveragesArray(rebuiltAveragesArray.length - 1) = averagesArray(i)
- end if
- next
- return rebuiltAveragesArray
- End Function
- Public Function DifferentialDiagnostics(ByVal newLabel as string, ByVal newAverage as decimal)
- dim averages() as decimal = {}
- dim averageDistances() as decimal = {}
- dim historicAverages() as decimal = {}
- dim historicAverageDistances() as decimal = {}
- dim historicAveragesDistances() as decimal = {}
- dim historicLevelBrackets() as decimal = {}
- dim historicAverageDistance as decimal = 1
- dim averagedAverage as decimal = 1
- dim historicAverage as decimal = 1
- dim percentDifference as decimal = 0
- dim averageDistance as decimal = 0
- dim differentialDiagnosis as string = "stable"
- dim roundResult as Double
- if ((newLabel <> "") and (newAverage > -1))
- 'If it is temperature sensor, data to get is delta-T over Ambient
- if (newLabel.StartsWith("Temp"))
- newLabel = "dTa_" + newLabel
- end if
- if (VA.GetText("AVCS_SENS_SensorAverages_LOW_" + newLabel) isNot nothing)
- historicAverages = VA.GetText("AVCS_SENS_SensorAverages_LOW_" + newLabel).Split(New String() {","}, StringSplitOptions.RemoveEmptyEntries).[Select](Function(n) decimal.Parse(n)).ToArray()
- if not(historicAverages.Length < 10)
- 'step 1 -- for low, medium, high, and extreme - get average arrays for this level, build into an Array of level averages
- for i as integer = 0 to historicLevels.GetUpperBound(0)
- redim historicAverages(0)
- historicLevelBracket = ""
- if (VA.GetText("AVCS_SENS_SensorAverages_" + historicLevels(i) + "_" + newLabel) isNot nothing)
- historicAverages = VA.GetText("AVCS_SENS_SensorAverages_" + historicLevels(i) + "_" + newLabel).Split(New String() {","}, StringSplitOptions.RemoveEmptyEntries).[Select](Function(n) decimal.Parse(n)).ToArray()
- if not(historicAverages.Length < 1)
- averagedAverage = 0
- averagedAverage = GetAveragedAverages(historicAverages)
- if (IsNumeric(averagedAverage))
- if (debugAverages)
- VA.WriteToLog("averagedAverage of bracket '" + i.ToString() + "' = " + averagedAverage.ToString(), "orange")
- end if
- redim preserve historicLevelBrackets(historicLevelBrackets.length)
- historicLevelBrackets(historicLevelBrackets.length - 1) = averagedAverage
- end if
- if (debugAverages)
- VA.WriteToLog("averages of bracket '" + historicLevels(i).ToString() + "' = " + averagedAverage.ToString(), "pink")
- end if
- end if
- end if
- next
- if (debugAverages)
- VA.WriteToLog("historicLevelBrackets = " + historicLevelBrackets(0).ToString(), "green")
- end if
- 'step 2 - identify nearest bracket by value of newAverage against historicLevelBrackets
- GetAverageDistances(newAverage, historicLevelBrackets)
- 'Checking historicLevelBrackets:
- if (debugAverages)
- VA.WriteToLog("historicLevelBrackets(0) = " + historicLevelBrackets(0).ToString(), "yellow")
- VA.WriteToLog("historicLevelBrackets(1) = " + historicLevelBrackets(1).ToString(), "yellow")
- VA.WriteToLog("historicLevelBrackets(2) = " + historicLevelBrackets(2).ToString(), "yellow")
- VA.WriteToLog("historicLevelBrackets(3) = " + historicLevelBrackets(3).ToString(), "yellow")
- end if
- 'save return as 'historicLevelBracket' gets changed anytime function is called, but only useful here
- levelBracket = historicLevelBracket
- VA.SetText("AVCS_SENS_Current_LevelBracket",levelBracket)
- 'step 3 - get an average of all the historic averages distances to each other
- 'now that we know which bracket to examine, use the levelBracket to get that bracket averages
- redim historicAverages(0)
- if (VA.GetText("AVCS_SENS_SensorAverages_" + levelBracket + "_" + newLabel) isNot nothing)
- historicAverages = VA.GetText("AVCS_SENS_SensorAverages_" + levelBracket + "_" + newLabel).Split(New String() {","}, StringSplitOptions.RemoveEmptyEntries).[Select](Function(n) decimal.Parse(n)).ToArray()
- if (debugAverages)
- for i as integer = 0 to historicAverages.GetUpperBound(0)
- VA.WriteToLog("historicAverages("+i.ToString()+") = " + historicAverages(i).ToString(), "pink")
- next
- end if
- for i as integer = 0 to historicAverages.GetUpperBound(0)
- if (IsNumeric(historicAverages(i)))
- historicAverageDistances = GetAverageDistances(historicAverages(i), historicAverages)
- 'Replace zero-distance to self in each iteration with 1
- historicAverageDistances = GetRebuiltAverages(historicAverageDistances)
- 'Get Average of these distances and add to AveragesDistances array
- averageDistance = GetAveragedAverages(historicAverageDistances)
- redim preserve historicAveragesDistances(historicAveragesDistances.length)
- historicAveragesDistances(historicAveragesDistances.length - 1) = averageDistance
- if (debugAverages)
- VA.WriteToLog("averageDistance = " + averageDistance.ToString(), "pink")
- for x as integer = 0 to historicAveragesDistances.GetUpperBound(0)
- VA.WriteToLog("bracket historicAverages = " + historicAveragesDistances(x).ToString(), "yellow")
- next
- end if
- end if
- next
- 'Check all average distances created above
- if (debugAverages)
- for f as integer = 0 to historicAveragesDistances.GetUpperBound(0)
- VA.WriteToLog("historicAverageDistances("+f.ToString()+") = " + historicAveragesDistances(f).ToString(), "pink")
- next
- end if
- 'Get the average distance between all averages in this set
- historicAverageDistance = GetAveragedAverages(historicAveragesDistances)
- 'Get the average distance between given average and all historic averages
- averageDistances = GetAverageDistances(newAverage, historicAverages)
- averageDistance = GetAveragedAverages(averageDistances)
- end if
- 'Check the historicLevelBracket that was determined:
- if (checkResults)
- select case levelBracket
- case historicLevels(0)
- VA.WriteToLog(newLabel + " is LOW", "green")
- case historicLevels(1)
- VA.WriteToLog(newLabel + " is MEDIUM", "yellow")
- case historicLevels(2)
- VA.WriteToLog(newLabel + " is HIGH", "orange")
- case historicLevels(3)
- VA.WriteToLog(newLabel + " is EXTREME", "red")
- case else
- VA.WriteToLog("AVCS SENS ERROR: Select Case levelBracket failed", "red")
- end select
- VA.WriteToLog("averageDistance of current number from historic averages= " + GetRoundedAverage(averageDistance,2).ToString(), "green")
- VA.WriteToLog("historicAverageDistance of historic averages from each other = " + GetRoundedAverage(historicAverageDistance,2).ToString(), "green")
- end if
- 'Get Percent Difference via (((ad-had)/had)*100)
- if (historicAverageDistance < averageDistance)
- percentDifference = (((averageDistance - historicAverageDistance)/historicAverageDistance) * 100)
- roundResult = percentDifference
- percentDifference = GetRoundedAverage(roundResult, 3)
- else
- percentDifference = 0
- end if
- if (newLabel.Contains("fan"))
- percentDifferenceMax = pdMaxFans
- else
- percentDifferenceMax = pdMaxTemps
- end if
- 'Store baseline/up/down status with VA Boolean states of notset/true/false
- historicAverage = GetAveragedAverages(historicAverages)
- VA.SetBoolean("AVCS_SENS_ATYPICAL_" + newLabel, nothing)
- if (percentDifference > percentDifferenceMax)
- if (newAverage > historicAverage)
- differentialDiagnosis = "higher"
- VA.SetBoolean("AVCS_SENS_ATYPICAL_" + newLabel, true)
- elseif (newAverage < historicAverage)
- differentialDiagnosis = "lower"
- VA.SetBoolean("AVCS_SENS_ATYPICAL_" + newLabel, false)
- end if
- end if
- if (checkResults)
- VA.WriteToLog("FINAL percent diff = " + GetRoundedAverage(percentDifference, 2).ToString() + "% (" + differentialDiagnosis + ")", "green")
- end if
- 'Set data to final variable for this sensor with a timestamp, overwriting previous data
- VA.SetText("~dtFormat",dtFormat)
- dtFormat = VA.ParseTokens("{DATETIMEFORMAT:~dtFormat}")
- differentialDiagnosis = dtFormat + "," + newAverage.ToString() + "," + historicAverage.ToString() + "," + averageDistance.ToString() + "," + percentDifference.ToString() + "," + differentialDiagnosis
- VA.SetText("AVCS_SENS_DIAGNOSTICS_" + newLabel, differentialDiagnosis)
- if (debugAverages)
- VA.WriteToLog("AVCS_SENS_DIAGNOSTICS_" + newLabel + " = " + differentialDiagnosis, "green")
- end if
- elseif ((historicAverages.Length > 0) and (historicAverages.Length < itemDataPointsMax))
- 'Wait for enough historic data points before diagnosing
- if (debugAverages)
- VA.WriteToLog("AVCS SENS Cannot build differential diagnostics yet, data points below 10 = " + historicAverages.Length.ToString(), "orange")
- end if
- end if
- end if
- end if
- historicAverageDistance = nothing
- averagedAverage = nothing
- historicAverage = nothing
- percentDifference = nothing
- averageDistance = nothing
- differentialDiagnosis = nothing
- levelBracket = nothing
- historicLevelBracket = nothing
- roundResult = nothing
- averages = nothing
- averageDistances = nothing
- historicAverages = nothing
- historicAverageDistances = nothing
- historicAveragesDistances = nothing
- historicLevelBrackets = nothing
- End Function
- Public Function MonitorDebug(ByVal requestAllOff as boolean)
- if (requestAllOff)
- debugging = false
- debugSensors = false
- debugAIDA = false
- debugArduino = false
- debugAverages = false
- checkResults = false
- debugStopwatch = false
- VA.SetBoolean("AVCS_SENS_Debugging", false)
- VA.SetBoolean("AVCS_SENS_DebugSensors", false)
- VA.SetBoolean("AVCS_SENS_DebugAIDA", false)
- VA.SetBoolean("AVCS_SENS_DebugArduino", false)
- VA.SetBoolean("AVCS_SENS_DebugAverages", false)
- VA.SetBoolean("AVCS_SENS_DebugCheckResults", false)
- VA.SetBoolean("AVCS_SENS_DebugStopwatch", false)
- else
- if ((VA.GetBoolean("AVCS_SENS_DebugSensors") isNot nothing) andAlso (VA.GetBoolean("AVCS_SENS_DebugSensors")))
- debugSensors = true
- else
- debugSensors = false
- end if
- if ((VA.GetBoolean("AVCS_SENS_DebugAIDA") isNot nothing) andAlso (VA.GetBoolean("AVCS_SENS_DebugAIDA")))
- debugAIDA = true
- else
- debugAIDA = false
- end if
- if ((VA.GetBoolean("AVCS_SENS_DebugArduino") isNot nothing) andAlso (VA.GetBoolean("AVCS_SENS_DebugArduino")))
- debugArduino = true
- else
- debugArduino = false
- end if
- if ((VA.GetBoolean("AVCS_SENS_DebugAverages") isNot nothing) andAlso (VA.GetBoolean("AVCS_SENS_DebugAverages")))
- debugAverages = true
- else
- debugAverages = false
- end if
- if ((VA.GetBoolean("AVCS_SENS_DebugCheckResults") isNot nothing) andAlso (VA.GetBoolean("AVCS_SENS_DebugCheckResults")))
- checkResults = true
- else
- checkResults = false
- end if
- if ((VA.GetBoolean("AVCS_SENS_DebugStopwatch") isNot nothing) andAlso (VA.GetBoolean("AVCS_SENS_DebugStopwatch")))
- debugStopwatch = true
- else
- debugStopwatch = false
- end if
- end if
- End Function
- Private Sub MonitorTimerElapsed(sender As Object, e As System.Timers.ElapsedEventArgs)
- if ((VA.GetBoolean("AVCS_MAIN_TIMER_WORKING") isNot nothing) andAlso (VA.GetBoolean("AVCS_MAIN_TIMER_WORKING")))
- 'do nothing for now, maybe debug msg later?
- else
- VA.SetBoolean("AVCS_MAIN_TIMER_WORKING", true)
- dim keyFile as string = ""
- dim reBuild as string = "<?xml version=""1.0"" encoding=""UTF-8""?>" + vbNewLine + "<sensordata>" + vbNewLine
- dim fixLines as string = ">" + vbNewLine + "<"
- dim contents() as string
- dim doc as XmlDocument = New XmlDocument()
- dim nodeGet as XmlNode
- dim baselineLevels() as string = {"LOW","MEDIUM","HIGH","EXTREME"}
- dim itemDataAverage as decimal? = 0
- dim itemID as string = ""
- dim itemNode as string = ""
- dim itemLabel as string = ""
- dim itemValue as string = ""
- dim itemData as string = ""
- dim currentLabel as string = ""
- dim counter as integer = 0
- dim valueDHTc as decimal = 0
- dim valueDeltaToverAmb as decimal = 0
- dim intervalSensors as Int32 = 0
- dim debugWatch as Stopwatch = New Stopwatch
- if ((VA.GetBoolean("AVCS_SENS_Debugging") isNot nothing) andAlso (VA.GetBoolean("AVCS_SENS_Debugging")))
- MonitorDebug(true)
- else
- MonitorDebug(false)
- end if
- if (debugStopwatch)
- 'VA.WriteToLog("AVCS AIDA64 Sensor Monitor is now executing at " + e.SignalTime.ToString(), "green")
- debugWatch.Start()
- end if
- if ((VA.GetBoolean("AVCS_SENS_ReloadBaselines") isNot nothing) andAlso (VA.GetBoolean("AVCS_SENS_ReloadBaselines")))
- if (debugAverages)
- VA.WriteToLog("AVCS SENS - re-loading baseline data found on file....", "black")
- end if
- VA.Command.Execute("F_AIDA_BASELINES", true)
- VA.SetBoolean("AVCS_SENS_ReloadBaselines", nothing)
- LoadHistoricSensorBaselines()
- Thread.Sleep(100)
- end if
- 'SensorsCheckDelay Config Setting -- when changed, new minimum time must be >= 2000ms, as a multiple of main timer loop interval
- if ((VA.GetInt("AVCS_SENS_SensorsCheckDelay") isNot nothing) andAlso (Integer.TryParse(VA.GetInt("AVCS_SENS_SensorsCheckDelay"), SensorsCheckDelay)))
- if ((SensorsCheckDelay * MonitorTimerDelay) < 2000)
- SensorsCheckDelay = 10
- if (debugSensors)
- VA.WriteToLog("AVCS SENS ERROR: SensorsCheckDelay interval lower than 2 seconds, resetting to minimum 10xMonitorTimerDelay...", "red")
- end if
- end if
- end if
- if ((VA.GetBoolean("AVCS_SENS_Logging") isNot nothing) andAlso (VA.GetBoolean("AVCS_SENS_Logging")))
- 'USB External DHT11 Serial Data Parsing Section ================================
- if (VA.GetInt("AVCS_SENS_IntervalAIDA") isNot nothing)
- intervalSensors = Convert.ToInt32(VA.GetInt("AVCS_SENS_IntervalAIDA"))
- intervalSensors += 1
- if (intervalSensors >= SensorsCheckDelay)
- intervalSensors = 0
- end if
- VA.SetInt("AVCS_SENS_IntervalAIDA", intervalSensors)
- else
- VA.SetInt("AVCS_SENS_IntervalAIDA", 0)
- end if
- if (debugAIDA)
- VA.WriteToLog("AVCS AIDA64 Sensor Monitor Interval = " + intervalSensors.ToString(), "blue")
- end if
- 'AIDA SharedMem Data Parsing Section ================================
- if (VA.GetText("AVCS_SENS_SHAREDMEM_XML") isNot nothing)
- keyFile = VA.GetText("AVCS_SENS_SHAREDMEM_XML").Replace("><", fixLines)
- if (debugSensors)
- VA.WriteToLog("AVCS_SENS_SHAREDMEM_XML is NOT nothing", "pink")
- VA.WriteToLog(keyFile, "pink")
- end if
- if (keyFile.Contains(vbNewLine))
- contents = keyFile.Split(new string() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
- for each line as string in contents
- if (line.StartsWith("<") or line.StartsWith(" ") or line.StartsWith("\t"))
- reBuild = reBuild + line.ToString() + vbNewLine
- end if
- next
- reBuild = reBuild + "</sensordata>" + vbNewLine
- end if
- doc.LoadXml(reBuild)
- for each node as XmlNode in doc.SelectNodes("/sensordata/*")
- if (doc.GetElementsByTagName("label").Item(counter) isNot nothing)
- nodeGet = doc.GetElementsByTagName("id").Item(counter)
- itemID = nodeGet.ChildNodes(0).InnerText
- nodeGet = doc.GetElementsByTagName("label").Item(counter)
- itemLabel = nodeGet.ChildNodes(0).InnerText
- nodeGet = doc.GetElementsByTagName("value").Item(counter)
- itemValue = nodeGet.ChildNodes(0).InnerText
- if (itemValue = "0")
- itemValue = "1"
- end if
- itemID = itemID.Replace(" ", "_")
- 'VA.WriteToLog("NODENAME: " + node.Name + " (" + itemID + ") " + itemLabel + " = " + itemValue, "yellow")
- 'NEW----------- Set/Get Sensor Item Label ---EXAMPLES:
- 'VA.SetText("AVCS_SENS_" + itemID, itemLabel)
- 'VA.SetText("AVCS_SENS_" + itemLabel, data)
- 'VA.GetText("AVCS_SENS_" + VA.ParseTokens("{TXT:AVCS_SENS_" + itemID + ":}")) = data
- itemNode = ""
- select case (node.Name)
- case "sys"
- itemNode = "sys"
- case "temp"
- itemNode = "temp"
- case "fan"
- itemNode = "fan"
- case "duty"
- itemNode = "sys"
- case "volt"
- itemNode = "volt"
- case "curr"
- itemNode = "curr"
- case "pwr"
- itemNode = "pwr"
- case else
- itemNode = "sys"
- end select
- if (VA.GetText("AVCS_SENS_" + itemID) is nothing)
- itemLabel = itemLabel.
- Replace(" (HH:MM)", "").
- Replace("Utilization", "Use").
- Replace("Processes", "Process_Count").
- Replace("CPU OPT", "Optional CPU").
- Replace("PCH Diode", "PCH").
- Replace("GPU Diode", "GPU").
- Replace("Chassis ", "Case ").
- Replace("iGPU", "GPU").
- Replace("GPU1", "GPU").
- Replace("GPU2", "GPU").
- Replace("South Bridge", "Southbridge").
- Replace("#", "").
- Replace(" ", "_")
- if (debugSensors)
- VA.WriteToLog("(" + itemID + ") " + itemLabel + " = " + itemValue, "yellow")
- end if
- select case (node.Name)
- case "sys"
- itemLabel = itemLabel
- case "temp"
- itemLabel = itemLabel + "_temp"
- case "fan"
- if (itemLabel.Contains("Case"))
- itemLabel = GetFanLabelKeyword(itemID, itemLabel, itemValue)
- else
- itemLabel = itemLabel + "_fan"
- end if
- case "duty"
- itemLabel = itemLabel + "_fan_use"
- case "volt"
- itemLabel = itemLabel + "_voltage"
- case "curr"
- itemLabel = itemLabel + "_amperage"
- case "pwr"
- itemLabel = itemLabel + "_wattage"
- case else
- itemLabel = nothing
- end select
- 'Get/Set itemLabel function...
- 'save to variable ... save to baselines file
- if (itemLabel isNot nothing)
- VA.SetText("AVCS_SENS_" + itemID, itemLabel)
- if (VA.GetInt("AVCS_DATA_SAVED_requests") isNot nothing)
- savedRequests = VA.GetInt("AVCS_DATA_SAVED_requests") + 1
- else
- savedRequests = 1
- end if
- VA.SetInt("AVCS_DATA_SAVED_requests", savedRequests)
- VA.SetText("AVCS_DATA_SAVED_name_" + savedRequests.ToString(), "AVCS_SENS_" + itemID)
- VA.SetText("AVCS_DATA_SAVED_value_" + savedRequests.ToString(), itemLabel)
- end if
- else
- itemLabel = VA.GetText("AVCS_SENS_" + itemID)
- end if
- 'Record this Sensor Data to Variables
- if (itemLabel isNot nothing)
- itemData = nothing
- if (not(itemValue.Contains(":")))
- if (VA.GetText("AVCS_SENS_" + itemLabel) isNot nothing)
- itemData = VA.GetText("AVCS_SENS_" + itemLabel)
- itemData = itemData + "," + itemValue
- itemDataAverage = GetAverages(itemData, itemLabel, itemDataPointsTotal)
- 'Round electric values to two decimal places, else 0 decimal places
- if (itemLabel.EndsWith("_voltage") or itemLabel.EndsWith("_amperage") or itemLabel.EndsWith("_wattage"))
- itemDataAverage = GetRoundedAverage(itemDataAverage, 2)
- else
- itemDataAverage = GetRoundedAverage(itemDataAverage, 0)
- end if
- if (debugSensors)
- VA.WriteToLog("New Average for " + itemLabel + " = " + itemDataAverage.ToString(), "grey")
- end if
- VA.SetText("AVCS_SENS_" + itemLabel, itemData)
- VA.SetDecimal("AVCS_SENS_LastAverage_" + itemLabel, itemDataAverage)
- if ((VA.GetDecimal("AVCS_SENS_TempDHTc") isNot nothing) andAlso ((diagnosticsSensors.Contains(itemID)) andAlso (itemDataPointsTotal >= itemDataPointsMax)))
- if ((VA.GetBoolean("AVCS_SENS_GET_BASELINE") isNot nothing) andAlso (VA.GetBoolean("AVCS_SENS_GET_BASELINE")))
- if ((VA.GetText("AVCS_SENS_SET_BASELINE_LEVEL") isNot nothing) andAlso (baselineLevels.Contains(VA.GetText("AVCS_SENS_SET_BASELINE_LEVEL"))))
- if (VA.GetInt("AVCS_DATA_SAVED_requests") isNot nothing)
- savedRequests = VA.GetInt("AVCS_DATA_SAVED_requests") + 1
- else
- savedRequests = 1
- end if
- VA.SetInt("AVCS_DATA_SAVED_requests", savedRequests)
- VA.SetText("AVCS_DATA_SAVED_name_" + savedRequests.ToString(), "AVCS_SENS_SensorAverages_" + VA.GetText("AVCS_SENS_SET_BASELINE_LEVEL") + "_" + itemLabel)
- VA.SetText("AVCS_DATA_SAVED_value_" + savedRequests.ToString(), itemData)
- VA.SetText("AVCS_SENS_SensorAverages_" + VA.GetText("AVCS_SENS_SET_BASELINE_LEVEL") + "_" + itemLabel, itemData)
- end if
- end if
- end if
- else
- VA.SetText("AVCS_SENS_" + itemLabel, itemValue)
- end if
- 'Check if this is a temperature sensor
- if ((node.Name = "temp") andAlso (VA.GetDecimal("AVCS_SENS_TempDHTc") isNot nothing))
- if (debugSensors)
- VA.WriteToLog("New Temp Sensor for " + itemLabel + " and Ambient = " + VA.GetDecimal("AVCS_SENS_TempDHTc").ToString(), "yellow")
- end if
- 'Calculate Delta-T over Ambient from DHT11 Temp (c) value
- if (Decimal.TryParse(itemValue, valueDeltaToverAmb)) andAlso ((valueDeltaToverAmb <> 0) and (valueDeltaToverAmb > (Decimal.TryParse(VA.GetDecimal("AVCS_SENS_TempDHTc"), valueDHTc))))
- valueDeltaToverAmb -= valueDHTc
- if (debugSensors)
- VA.WriteToLog("New Ambient = " + valueDHTc.ToString(), "yellow")
- VA.WriteToLog("New dTa for " + itemLabel + " = " + valueDeltaToverAmb.ToString(), "green")
- end if
- itemData = nothing
- itemDataPointsTotal = 0
- itemValue = valueDeltaToverAmb.ToString()
- itemLabel = "dTa_" + itemLabel
- if (VA.GetText("AVCS_SENS_" + itemLabel) isNot nothing)
- itemData = VA.GetText("AVCS_SENS_" + itemLabel)
- itemData = itemData + "," + itemValue
- itemDataAverage = GetAverages(itemData, itemLabel, itemDataPointsTotal)
- itemDataAverage = GetRoundedAverage(itemDataAverage, 3)
- if (debugSensors)
- VA.WriteToLog("New Average for " + itemLabel + " = " + itemDataAverage.ToString(), "grey")
- end if
- VA.SetText("AVCS_SENS_" + itemLabel, itemData)
- VA.SetDecimal("AVCS_SENS_LastAverage_" + itemLabel, itemDataAverage)
- if ((diagnosticsSensors.Contains(itemID)) andAlso (itemDataPointsTotal >= itemDataPointsMax))
- if ((VA.GetBoolean("AVCS_SENS_GET_BASELINE") isNot nothing) andAlso (VA.GetBoolean("AVCS_SENS_GET_BASELINE")))
- if ((VA.GetText("AVCS_SENS_SET_BASELINE_LEVEL") isNot nothing) andAlso (baselineLevels.Contains(VA.GetText("AVCS_SENS_SET_BASELINE_LEVEL"))))
- if (VA.GetInt("AVCS_DATA_SAVED_requests") isNot nothing)
- savedRequests = VA.GetInt("AVCS_DATA_SAVED_requests") + 1
- else
- savedRequests = 1
- end if
- VA.SetInt("AVCS_DATA_SAVED_requests", savedRequests)
- VA.SetText("AVCS_DATA_SAVED_name_" + savedRequests.ToString(), "AVCS_SENS_SensorAverages_" + VA.GetText("AVCS_SENS_SET_BASELINE_LEVEL") + "_" + itemLabel)
- VA.SetText("AVCS_DATA_SAVED_value_" + savedRequests.ToString(), itemData)
- VA.SetText("AVCS_SENS_SensorAverages_" + VA.GetText("AVCS_SENS_SET_BASELINE_LEVEL") + "_" + itemLabel, itemData)
- end if
- end if
- end if
- else
- VA.SetText("AVCS_SENS_" + itemLabel, itemValue)
- end if
- else
- if (debugSensors)
- VA.WriteToLog("AVCS SENS ERROR at TryParse Decimal dTa - check code at dTa Calc", "red")
- end if
- end if
- end if
- else
- VA.SetText("AVCS_SENS_" + itemLabel, itemValue)
- end if
- end if
- counter += 1
- end if
- next
- if ((VA.GetInt("AVCS_SENS_MAIN_INTERVAL") isNot nothing) andAlso (VA.GetInt("AVCS_SENS_MAIN_INTERVAL") < 100))
- VA.SetInt("AVCS_SENS_MAIN_INTERVAL", VA.GetInt("AVCS_SENS_MAIN_INTERVAL") + 1)
- elseif (VA.GetInt("AVCS_SENS_MAIN_INTERVAL") is nothing)
- VA.SetInt("AVCS_SENS_MAIN_INTERVAL", 1)
- end if
- if (debugStopwatch)
- VA.WriteToLog("Current Main Interval: " + VA.GetInt("AVCS_SENS_MAIN_INTERVAL").ToString(), "pink")
- end if
- 'Save To File function for Get Baseline calls
- if (VA.GetInt("AVCS_DATA_SAVED_requests") isNot nothing)
- if ((VA.GetBoolean("AVCS_SENS_GET_BASELINE") isNot nothing) andAlso (VA.GetBoolean("AVCS_SENS_GET_BASELINE")))
- VA.SetText("AVCS_SENS_SET_BASELINE_LEVEL", "")
- VA.SetBoolean("AVCS_SENS_ReloadBaselines", true)
- VA.Command.Execute("F_SFS_SAVE_BASELINES", true)
- VA.SetBoolean("AVCS_SENS_GET_BASELINE", false)
- else
- VA.Command.Execute("F_SFS_SAVE_DATA", true)
- end if
- end if
- if (debugSensors)
- VA.WriteToLog("New DataPointsMax = " + itemDataPointsTotal.ToString(), "orange")
- VA.WriteToLog("New System Uptime = " + VA.GetText("AVCS_SENS_WindowsOS_Uptime"), "orange")
- end if
- 'AVCS Differential Diagnosis Algorithm Section ================================
- if ((VA.GetDecimal("AVCS_SENS_TempDHTc") isNot nothing) andAlso ((itemDataPointsTotal >= itemDataPointsMax) and ((intervalSensors = 4) or (intervalSensors = 9))))
- if (debugArduino)
- VA.WriteToLog("AVCS SENS - Diagnostic Interval Entered....", "yellow")
- end if
- if ((VA.GetBoolean("AVCS_SENS_Diagnosing") isNot nothing) andAlso (not(VA.GetBoolean("AVCS_SENS_Diagnosing"))))
- VA.SetBoolean("AVCS_SENS_Diagnosing", true)
- if ((VA.GetText("AVCS_SENS_DIAGNOSTIC_SENSORS") isNot nothing) andAlso (VA.GetText("AVCS_SENS_DIAGNOSTIC_SENSORS").Contains(",")))
- diagnosticsSensors = VA.GetText("AVCS_SENS_DIAGNOSTIC_SENSORS").Split(",").ToArray()
- end if
- dim countLow as integer = 0
- dim countMed as integer = 0
- dim countHigh as integer = 0
- dim countExtr as integer = 0
- for i as integer = 0 to diagnosticsSensors.GetUpperBound(0)
- if ((diagnosticsSensors(i) <> "") andAlso (VA.GetText("AVCS_SENS_" + diagnosticsSensors(i)) isNot nothing))
- currentLabel = VA.GetText("AVCS_SENS_" + diagnosticsSensors(i))
- currentAverage = -1
- 'If it is temperature sensor, data to get is deltaT over Ambient
- if (currentLabel.StartsWith("Temp"))
- if (VA.GetDecimal("AVCS_SENS_LastAverage_dTa_" + currentLabel) isNot nothing)
- currentAverage = VA.GetDecimal("AVCS_SENS_LastAverage_dTa_" + currentLabel)
- if (debugSensors)
- VA.WriteToLog("AVCS SENS SUCCESS at DifferentialDiagnosis - dta Temp currentAverage is:" + currentAverage.ToString(), "green")
- end if
- else
- if (debugSensors)
- VA.WriteToLog("AVCS SENS Error at DifferentialDiagnosis - dta Temp currentAverage is nothing", "red")
- end if
- end if
- else
- if (VA.GetDecimal("AVCS_SENS_LastAverage_" + currentLabel) isNot nothing)
- currentAverage = VA.GetDecimal("AVCS_SENS_LastAverage_" + currentLabel)
- if (debugSensors)
- VA.WriteToLog("AVCS SENS SUCCESS at DifferentialDiagnosis - non Temp currentAverage is:" + currentAverage.ToString(), "green")
- end if
- else
- if (debugSensors)
- VA.WriteToLog("AVCS SENS Error at DifferentialDiagnosis - non Temp currentAverage is nothing", "red")
- end if
- end if
- end if
- if (currentAverage > -1)
- DifferentialDiagnostics(currentLabel,currentAverage)
- if (VA.GetText("AVCS_SENS_Current_LevelBracket") isNot nothing)
- select case (VA.GetText("AVCS_SENS_Current_LevelBracket"))
- case historicLevels(0)
- countLow += 1
- case historicLevels(1)
- countMed += 1
- case historicLevels(2)
- countHigh += 1
- case historicLevels(3)
- countExtr += 1
- case else
- VA.WriteToLog("AVCS SENS ERROR: Select Case levelBracket failed", "red")
- end select
- end if
- if (debugSensors)
- VA.WriteToLog("AVCS SENS DifferentialDiagnosis complete on this set", "green")
- end if
- else
- if (debugSensors)
- VA.WriteToLog("AVCS SENS Error at DifferentialDiagnosis Section of Timer Event line 1060", "red")
- end if
- end if
- else
- if (debugSensors)
- VA.WriteToLog("AVCS SENS Error at DifferentialDiagnosis Else line 1031", "red")
- end if
- end if
- next
- 'Evaluate number of sensors reporting state similar to a low-extreme baseline to assume overall PC state
- select case (GetLargestInteger(countLow,countMed,countHigh,countExtr))
- case countLow
- VA.SetText("AVCS_SENS_Current_LevelBracket", "LOW")
- case countMed
- VA.SetText("AVCS_SENS_Current_LevelBracket", "MEDIUM")
- case countHigh
- VA.SetText("AVCS_SENS_Current_LevelBracket", "HIGH")
- case countExtr
- VA.SetText("AVCS_SENS_Current_LevelBracket", "EXTREME")
- case else
- VA.SetText("AVCS_SENS_Current_LevelBracket", "LOW")
- end select
- countLow = nothing
- countMed = nothing
- countHigh = nothing
- countExtr = nothing
- VA.SetBoolean("AVCS_SENS_Diagnosing", false)
- if (debugArduino)
- VA.WriteToLog("AVCS SENS - Diagnostic Interval Completed....", "green")
- end if
- else
- if (debugArduino)
- VA.WriteToLog("AVCS SENS - Diagnostic Interval Postponed (bool in use)....", "yellow")
- end if
- end if
- end if
- end if
- else
- VA.WriteToLog("AVCS AIDA64 Sensor Monitor has been terminated...", "black")
- VA.SetBoolean("AVCS_SENS_Monitoring", nothing)
- VA.SetInt("AVCS_SENS_MAIN_INTERVAL", nothing)
- if (VA.GetBoolean("AVCS_SENS_UnloadClose") is nothing)
- VA.SetText("AVCS_SENS_TTS_WILDCARD", "Sensor Data [Monitoring;;] Systems have been [terminated;disabled;ended]")
- VA.Command.Execute("F_SAY_TTS", true)
- end if
- sender.Stop()
- end if
- if (debugStopwatch)
- debugWatch.Stop()
- VA.WriteToLog("Interval " + intervalSensors.ToString() + " Function Time to Complete: " + debugWatch.Elapsed.TotalMilliseconds.ToString() + "ms", "pink")
- end if
- VA.SetBoolean("AVCS_MAIN_TIMER_WORKING", nothing)
- end if
- End Sub
- Private Sub MonitorTimer(ByVal timerInterval as integer)
- dim t as New System.Timers.Timer(timerInterval)
- AddHandler t.Elapsed, AddressOf MonitorTimerElapsed
- VA.WriteToLog("AVCS AIDA64 Sensor Monitor is now running...", "black")
- t.Start()
- End Sub
- Public Sub Main()
- 'Begin AVCS AIDA64 Sensor Monitor Systems
- if ((VA.GetBoolean("AVCS_SENS_Monitoring") isNot nothing) andAlso (VA.GetBoolean("AVCS_SENS_Monitoring")))
- MonitorDebug(false)
- 'DataPointsTotal Config Setting -- when changed, new baselines must be established to include equal data points
- if ((VA.GetDecimal("AVCS_SENS_DataPointsTotal") isNot nothing) andAlso (Decimal.TryParse(VA.GetDecimal("AVCS_SENS_DataPointsTotal"), itemDataPointsMax)))
- if (itemDataPointsMax < 10)
- itemDataPointsMax = 10
- if (debugSensors)
- VA.WriteToLog("AVCS SENS ERROR: DataPointsTotal lower than 10, resetting to minimum 10...", "red")
- end if
- end if
- end if
- if ((VA.GetInt("AVCS_SENS_MonitorTimerDelay") isNot nothing) andAlso (Integer.TryParse(VA.GetInt("AVCS_SENS_MonitorTimerDelay"), MonitorTimerDelay)))
- if (MonitorTimerDelay < 1000)
- MonitorTimerDelay = 1000
- if (debugSensors)
- VA.WriteToLog("AVCS SENS ERROR: MonitorTimerDelay lower than 1 second, resetting to minimum 1 sec...", "red")
- end if
- end if
- end if
- VA.SetBoolean("AVCS_SENS_Diagnosing", false)
- VA.SetBoolean("AVCS_SENS_Logging", true)
- MonitorTimer(MonitorTimerDelay)
- 'Check if called by autostart - bypass TTS if not called by command or Sensor Menu
- if (VA.ParseTokens("{CMDACTION}") = "Plugin")
- VA.SetText("AVCS_SENS_TTS_WILDCARD", "Sensor Data [Monitoring;;] Systems are now [active;online;ready;engaged]")
- VA.Command.Execute("F_SAY_TTS", true)
- end if
- else
- VA.WriteToLog("AVCS AIDA64 Sensor Monitor called but Shared Memory Monitor not running... exiting...", "red")
- VA.SetBoolean("AVCS_SENS_Logging", false)
- VA.SetBoolean("AVCS_SENS_Monitoring", false)
- MonitorDebug(true)
- end if
- VA.SetBoolean("AVCS_SENS_Monitor_Startup", nothing)
- End Sub
- End Class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement