Dim AppPath As String Dim m_sDeviceLocation As String Dim m_sLocationArray(5) As String Const m_csCreateHouseCode As String = "X" Const m_cbCreateDevices As Boolean = False Const m_bDebug As Boolean = False Sub Main(strMode) Dim PageData As String Dim HostURL As String Dim PageURL As String Dim iPosition As Integer Dim Array1() As String Dim Array2() As String Dim sTemp As String Dim hs As Object Dim i As Integer hs = createObject("HomeSeer.Application") If strMode = "ProcessSchedule" Then Call ProcessSchedule Exit Sub End If 'Set our AppPath and URL values AppPath = hs.getapppath + "\PageData\" HostURL = "http://www.weatherdirect.com" PageURL = "/TX60.aspx?&wusid=183726&bxid=2147901275" 'Scrape page data after header section PageData = Trim(hs.GetUrl(HostURL, PageURL, True, 80)) iPosition = InStr(1, PageData, "Link") + 4 PageData = Trim(Right(PageData, Len(PageData) - iPosition)) 'Start if we have something, otherwise write to log If iPosition > 0 Then Array1 = Split(PageData, vbcrlf) 'Loop through and build a string of pipe delimited values For i = 0 to UBound(Array1) If Trim(Array1(i)) <> "" Then sTemp = sTemp & Trim(Array1(i)) & "|" End If Next 'Replace spacing and fairenheight/misc symbols sTemp = sTemp.Replace(" ", "") sTemp = sTemp.Replace("°F", "") sTemp = sTemp.Replace("Â", "") sTemp = sTemp.Replace("n/a", "0") 'Also remove left and right pipes sTemp = Left(sTemp, Len(sTemp) - 1) sTemp = Right(sTemp, Len(sTemp) - 1) 'Split our values once more into a clean array Array2 = Split(sTemp, "||") 'Write sensor data to the settings.ini and update HS devices Call UpdateSensorData("Location", Array2, 1) Call UpdateSensorData("Probe", Array2, 2) Call UpdateSensorData("Device", Array2, 3) Call UpdateSensorData("Humidity", Array2, 4) Call UpdateSensorData("LastSeen", Array2, 5) Call UpdateSensorData("Battery", Array2, 6) Call UpdateSensorData("LinkStatus", Array2, 7) 'Save values for averages Call hs.SaveINISetting("SensorHistory", "Sensor1Probe", CSng(hs.GetINISetting("SensorHistory", "Sensor1Probe", "0")) + CSng(Array2(2))) Call hs.SaveINISetting("SensorHistory", "Sensor1ProbeCount", CSng(hs.GetINISetting("SensorHistory", "Sensor1ProbeCount", "0")) + 1) Call hs.SaveINISetting("SensorHistory", "Sensor1Device", CSng(hs.GetINISetting("SensorHistory", "Sensor1Device", "0")) + CSng(Array2(3))) Call hs.SaveINISetting("SensorHistory", "Sensor1DeviceCount", CSng(hs.GetINISetting("SensorHistory", "Sensor1DeviceCount", "0")) + 1) Call hs.SaveINISetting("SensorHistory", "Sensor2Probe", CSng(hs.GetINISetting("SensorHistory", "Sensor2Probe", "0")) + CSng(Array2(9))) Call hs.SaveINISetting("SensorHistory", "Sensor2ProbeCount", CSng(hs.GetINISetting("SensorHistory", "Sensor2ProbeCount", "0")) + 1) Call hs.SaveINISetting("SensorHistory", "Sensor2Device", CSng(hs.GetINISetting("SensorHistory", "Sensor2Device", "0")) + CSng(Array2(10))) Call hs.SaveINISetting("SensorHistory", "Sensor2DeviceCount", CSng(hs.GetINISetting("SensorHistory", "Sensor2DeviceCount", "0")) + 1) Call hs.SaveINISetting("SensorHistory", "Sensor3Probe", CSng(hs.GetINISetting("SensorHistory", "Sensor3Probe", "0")) + CSng(Array2(16))) Call hs.SaveINISetting("SensorHistory", "Sensor3ProbeCount", CSng(hs.GetINISetting("SensorHistory", "Sensor3ProbeCount", "0")) + 1) Call hs.SaveINISetting("SensorHistory", "Sensor3Device", CSng(hs.GetINISetting("SensorHistory", "Sensor3Device", "0")) + CSng(Array2(17))) Call hs.SaveINISetting("SensorHistory", "Sensor3DeviceCount", CSng(hs.GetINISetting("SensorHistory", "Sensor3DeviceCount", "0")) + 1) Call hs.SaveINISetting("SensorHistory", "Sensor4Probe", CSng(hs.GetINISetting("SensorHistory", "Sensor4Probe", "0")) + CSng(Array2(23))) Call hs.SaveINISetting("SensorHistory", "Sensor4ProbeCount", CSng(hs.GetINISetting("SensorHistory", "Sensor4ProbeCount", "0")) + 1) Call hs.SaveINISetting("SensorHistory", "Sensor4Device", CSng(hs.GetINISetting("SensorHistory", "Sensor4Device", "0")) + CSng(Array2(24))) Call hs.SaveINISetting("SensorHistory", "Sensor4DeviceCount", CSng(hs.GetINISetting("SensorHistory", "Sensor4DeviceCount", "0")) + 1) Call hs.SaveINISetting("SensorHistory", "Sensor5Probe", CSng(hs.GetINISetting("SensorHistory", "Sensor5Probe", "0")) + CSng(Array2(30))) Call hs.SaveINISetting("SensorHistory", "Sensor5ProbeCount", CSng(hs.GetINISetting("SensorHistory", "Sensor5ProbeCount", "0")) + 1) Call hs.SaveINISetting("SensorHistory", "Sensor5Device", CSng(hs.GetINISetting("SensorHistory", "Sensor5Device", "0")) + CSng(Array2(31))) Call hs.SaveINISetting("SensorHistory", "Sensor5DeviceCount", CSng(hs.GetINISetting("SensorHistory", "Sensor5DeviceCount", "0")) + 1) Call UpdateAverages(Array2) Else hs.WriteLog("My_SensorData", "There was a problem reading sensor data from weatherdirect.com") End If End Sub Sub UpdateAverages(ByVal sArray() As String) Dim iSensorCount As Integer Dim ProbeAvg As Single Dim DeviceAve As Single Dim i As Integer iSensorCount = hs.GetINISetting("SensorHistory", "NumberofSensors", "0") For i = 1 to iSensorCount ProbeAvg = hs.GetINISetting("SensorHistory", "Sensor" & i & "Probe", "0") / hs.GetINISetting("SensorHistory", "Sensor" & i & "ProbeCount", "0") DeviceAve = hs.GetINISetting("SensorHistory", "Sensor" & i & "Device", "0") / hs.GetINISetting("SensorHistory", "Sensor" & i & "DeviceCount", "0") hs.SetDeviceString(m_csCreateHouseCode & UBound(sArray) + i, ProbeAvg.ToString("0.0"), True) hs.SetDeviceString(m_csCreateHouseCode & UBound(sArray) + i + iSensorCount, DeviceAve.ToString("0.0"), True) Next End Sub Sub ClearAverages(ByVal sClear As String) hs.ClearINISection("SensorHistory", "settings.ini") End Sub Sub UpdateSensorData(ByVal sSensorName As String, ByVal sArray() As String, ByVal iOffset As Integer) Const iNumSensorFields As Integer = 7 'This won't change unless the page changes Dim iSensorCount As Integer Dim i As Integer 'Get our number of sensors from the total number of items iSensorCount = UBound(sArray) / iNumSensorFields Call hs.SaveINISetting("SensorHistory", "NumberofSensors", iSensorCount) 'Loop through sensors. The offset is passed in and incremented each time by the 'number of fields on the page (currently 7). This cycles through all of them 'and still keeps things dynamic so more temp sensors can be added. For i = 1 to iSensorCount 'Save sensor data to ini. Call hs.SaveINISetting("SensorData", "Sensor" & i & sSensorName, Trim(sArray(iOffset))) 'Check if we should create devices. If so, use the sensor location for the 'device location in HomeSeer which can be done by saving them to an array as 'we go through. If m_cbCreateDevices Then If sSensorName.ToUpper = "LOCATION" Then m_sDeviceLocation = sArray(iOffset) m_sLocationArray(i) = m_sDeviceLocation Else m_sDeviceLocation = m_sLocationArray(i) End If Call CreateDevice(sSensorName, m_sDeviceLocation, iOffset) Call CreateDevice("Probe Avg", m_sDeviceLocation, UBound(sArray) + i) Call CreateDevice("Device Avg", m_sDeviceLocation, UBound(sArray) + i + iSensorCount) End If 'Update HomeSeer device value hs.SetDeviceString(m_csCreateHouseCode & iOffset, sArray(iOffset), True) iOffset = iOffset + iNumSensorFields Next End Sub Sub CreateDevice(ByVal sSensorName As String, ByVal sLocation As String, ByVal sDeviceCode As String) dim dvRef As Integer Dim dv As Scheduler.Classes.DeviceClass 'Check if the device exists before creating dvRef = hs.DeviceExistsRef(m_csCreateHouseCode & sDeviceCode) If dvRef = -1 Then dv = hs.NewDeviceEx(sSensorName) dv.location = sLocation dv.hc = m_csCreateHouseCode dv.dc = sDeviceCode 'Status only dv.misc = "&h10" Else hs.WriteLog("My_SensorData", "Couldn't create device " & m_csCreateHouseCode & sDeviceCode & " because it already exists") End If End Sub Sub ProcessSchedule() Dim ChamberCount Dim DeviceCodes, FanCode, HeatCode, SP, CurrentTemp Dim KeyInfo, Beer Dim StartDate, StartTemp Dim ChangeType1, ChangeDate1, ChangeTemp1 Dim ChangeType2, ChangeDate2, ChangeTemp2 Dim ChangeType3, ChangeDate3, ChangeTemp3 Dim ChangeType4, ChangeDate4, ChangeTemp4 Dim Allowance As Single Dim i as Integer Const UseProbeForChangeTemp As Boolean = True ChamberCount = Trim(hs.GetINISetting("Brewhouse", "ChamberCount", "")) 'Loop through chambers and update ini values For i = 1 To CInt(ChamberCount) 'Load Beer name & misc info KeyInfo = Trim(hs.GetINISetting("Brewhouse", "BeerData" & CStr(i), "")) If KeyInfo <> "" Then SP = Split(KeyInfo ,"|") Beer=SP(0) 'TODO other info about the beer 'HCDC=SP(1) End If 'Load Device Codes DeviceCodes = Trim(hs.GetINISetting("Brewhouse", "DeviceCodes" & CStr(i), "")) If DeviceCodes <> "" Then SP = Split(DeviceCodes ,"|") FanCode=SP(0) HeatCode=SP(1) End If 'Check to see if we have a schedule to apply If UCase(Beer) <> "EMPTY" Then If m_bDebug Then hs.WriteLog("My_SensorData", CStr(i) & "=" & UCase(Beer)) End If 'Load Fermentation Schedule from the ini KeyInfo = Trim(hs.GetINISetting("Brewhouse", "Schedule" & CStr(i), "")) If KeyInfo <> "" Then SP = Split(KeyInfo ,"|") StartDate=SP(0) StartTemp=SP(1) ChangeType1=SP(2) ChangeDate1=SP(3) ChangeTemp1=SP(4) ChangeType2=SP(5) ChangeDate2=SP(6) ChangeTemp2=SP(7) ChangeType3=SP(8) ChangeDate3=SP(9) ChangeTemp3=SP(10) ChangeType4=SP(11) ChangeDate4=SP(12) ChangeTemp4=SP(13) End If 'Grab Beer/Chamber Temperature 'Need to put a toggle on the screen for whether to use the probe or chamber temp for what to change. 'Can change this constant in the meantime If UseProbeForChangeTemp Then CurrentTemp = Trim(hs.GetINISetting("SensorData", "Sensor" & CStr(i) & "Probe", "")) Allowance = .2 hs.WriteLog("My_SensorData", "Beer " & CStr(i) & " Temp: " & CurrentTemp) Else CurrentTemp = Trim(hs.GetINISetting("SensorData", "Sensor" & CStr(i) & "Device", "")) Allowance = 1 hs.WriteLog("My_SensorData", "Chamber " & CStr(i) & " Temp: " & CurrentTemp) End If 'Process this chamber's schedule starting with the last change date 'and work our way to the start date. The CompareTemps function returns true 'when we have a change to make. If false, move on to the next. If Not CompareTemps(ChangeDate4, CurrentTemp, ChangeTemp4, Allowance, FanCode, HeatCode, i) Then If Not CompareTemps(ChangeDate3, CurrentTemp, ChangeTemp3, Allowance, FanCode, HeatCode, i) Then If Not CompareTemps(ChangeDate2, CurrentTemp, ChangeTemp2, Allowance, FanCode, HeatCode, i) Then If Not CompareTemps(ChangeDate1, CurrentTemp, ChangeTemp1, Allowance, FanCode, HeatCode, i) Then CompareTemps(StartDate, CurrentTemp, StartTemp, Allowance, FanCode, HeatCode, i) End If End If End If End If Else 'If Empty, make sure they are off. hs.execx10(FanCode,"off",0) hs.execx10(HeatCode,"off",0) End If Next End Sub Function CompareTemps(ChangeDate, CurrentTemp, ChangeTemp, Allowance, FanCode, HeatCode, i) As Boolean Dim ChangeMinutes As Integer Dim ChangeHours As Single CompareTemps = False If Trim(ChangeDate) <> "" Then 'Add 12am to our date for the comparison (change at midnight) ChangeDate = ChangeDate & " 12:00:00 AM" ChangeMinutes = DateDiff("n", Now, ChangeDate) ChangeHours = ChangeMinutes / 60 If m_bDebug Then hs.WriteLog("My_SensorData", "ChangeDate=" & Trim(ChangeDate)) hs.WriteLog("My_SensorData", "ChangeHours=" & ChangeHours) hs.WriteLog("My_SensorData", "ChangeMinutes=" & ChangeMinutes) End If 'Any value less than 1 should include our latest change temp. If ChangeMinutes < "1" Then hs.WriteLog("My_SensorData", "Chamber " & CStr(i) & " Set To: " & ChangeTemp) hs.WriteLog("My_SensorData", "Current=" & CurrentTemp & " Change=" & ChangeTemp & " (Allowance is " & Allowance & " degrees)") If CurrentTemp > (ChangeTemp + Allowance) Then hs.execx10(FanCode,"on",0) hs.execx10(HeatCode,"off",0) hs.WriteLog("My_SensorData", "Chamber " & CStr(i) & " Fan On") hs.WriteLog("My_SensorData", "Chamber " & CStr(i) & " Heat Off") ElseIf CurrentTemp < ChangeTemp hs.execx10(FanCode,"off",0) hs.execx10(HeatCode,"on",0) hs.WriteLog("My_SensorData", "Chamber " & CStr(i) & " Heat On") hs.WriteLog("My_SensorData", "Chamber " & CStr(i) & " Fan Off") Else 'Turn both off but blow fan for 10 secs before shutting off hs.execx10(HeatCode,"off",0) 'hs.execx10(FanCode,"on",0) 'hs.WaitSecs(10) hs.execx10(FanCode,"off",0) hs.WriteLog("My_SensorData", "Chamber " & CStr(i) & " Both Off") End If CompareTemps = True End If End If End Function