No announcement yet.

Thermostat Scheduler?

  • Filter
  • Time
  • Show
Clear All
new posts

  • Guest's Avatar
    Guest replied
    Originally posted by johan View Post
    Looks like we are taking the same approach. It's getting complicated, and I am too trying to learn how to write scrpits. Haven't written a line of code for 20 years and the programming languages back then were called pascal and cobol if my memory serves me right...

    I am in the same boat. I wrote a bunch of Excel macros in VBA about 10 years ago to facilitate my work. Fortunately is similar and Microsoft gives the Express version away for free. The tenScripting program -- search this message board for it -- makes it a breeze and Microsoft's object browser and intellisense expose the current HomeSeer object model -- which is important because the HomeSeer scripting docs and the thermostat API in the SDK are dated. The learning curve is not all that steep once you get going -- a loop is a loop...

    Here is some code I wrote in VB.Net that may help you get started. The subroutine (now known as a method) "List_Stat_Details" goes through pretty much all of the Thermostat Plug-in's stat properties. My Enumerations (Enum) cover all the thermostat mode and state properties I could find for the various set and get functions of the therm plug-in. The only part of the code that is not self-explanatory is that I use a virtual device in HS to hold the override flag -- I set a global constant for my virtual device's house code & user code.

    I also have a callback working -- see "My_Status_Change_CB" --but right now it just writes a log entry to let me know it is working. Ultimately, I will use this to react to temperature and other changes in my home.

    I have not gotten much further that this, but it won't take long from here. Just need to loop around thermostats for various states of the HVAC system, time of day, and add overrides and other switches, etc. I plan on using one of Leviton's scene or zone controllers to set switches -- away, home, hold, etc.

    Good luck.

    'Public Module Therms_Dev 'comment this out to run as HS script -- don't forget to comment END MODULE too...
      '******************** VB.Net Script for Thermostat Control **********************
      'Global Constants
      Const gMe As String = "Therms_dev.vb"
      Const gOverRideDeviceCode As String = "O1" 'the hcdc of my virtual device override flag
      'My Temp Constants
      Const Heat_Default As Integer = 67
      Const Cool_Default As Integer = 78
      Dim sMode As String() = {"Off", "Heat", "Cool", "Auto", "Aux_Emerg", "mResume", "Fan Only", "Furnace", "Dry Air", "Moist Air", "Auto Change", "Energy Save Heat", "Energy Save Cool", "Away"} 'Therm Mode Settings
      Private Enum THERM_MODE As Integer
        off = 0
        heat = 1
        cool = 2
        auto = 3
        aux_Emerg = 4
        mResume = 5
        fanOnly = 6
        furnace = 7
        dryAir = 8
        moistAir = 9
        autoChange = 10
        energySaveHeat = 11
        energySaveCool = 12
        away = 13
      End Enum
      Dim sState As String() = {"Idle", "Heating", "Cooling", "Fan  Only", "Pending Heat", "Pending Cool", "Vent Economy"} 'Therm Mode States
      Dim sFanMode As String() = {"Auto", "On Low", "Auto High", "On High", "", "", "", "", "", "", "", "", "", "", "", "Not Selected"} 'Fan Settings
      Private Enum FAN_MODE As Integer
        auto = 0
        onLow = 1
        autoHigh = 2
        onHigh = 3
        notSelected = 15
      End Enum
      Dim sFanState As String() = {"Idle", "Low", "High"} 'Fan States
      Dim sHoldState As String() = {"Hold Off", "Hold On"}  'Hold States
      Dim sRunState As String() = {"Not Running", "Running"}  'Operating States
      Dim sStatus As String() = {"0", "1", "On", "Off", "Dim", "Dim", "", "", "", "", "", "", "", "", "", "", "", "Unknown"}
      Private Enum DEVICE_STATUS As Integer
        isOn = 2
        isOff = 3
        isDim = 4
        isDim2 = 5
        isUnknown = 17
      End Enum
      '*************** MAIN **********************
      Public Sub Main(ByVal Parms As Object)
        Dim oTPI As Scheduler.HSPI_ZWAVETHERM.HSPI
        HS.RegisterStatusChangeCB(gMe, "My_Status_Change_CB") 'calls My_Status_Change_CB on ANY status change
        oTPI = HS.Plugin("ZWave Thermostats")
        If oTPI Is Nothing Then
          HS.WriteLog(gMe, "Plugin not found -- Aborting Sub.")
          Exit Sub
        End If
        HS.WriteLog(gMe, "Completed Script: " & gMe)
      End Sub
      '****************End Main ******************
      Private Sub Test_Set_Therm_1(ByVal oTPI As Scheduler.HSPI_ZWAVETHERM.HSPI)
        Dim bOverRide As Boolean, bOkay As Boolean
        Dim stat As Integer, partition As Integer
        Dim mode As Integer, fan As Integer, heatPoint As Double, coolPoint As Double
        Dim iOverride As Integer
        mode =
        fan =
        heatPoint = Heat_Default
        coolPoint = Cool_Default
        If (HS.DeviceExistsRef(gOverRideDeviceCode) = -1) Then
          HS.WriteLog(gMe, "Override device " & gOverRideDeviceCode & " does not exist. Aborting script.")
          Exit Sub
          iOverride = HS.DeviceStatus(gOverRideDeviceCode)
          If iOverride = DEVICE_STATUS.isOn Then
            bOverRide = True
          ElseIf iOverride = DEVICE_STATUS.isOff Then
            bOverRide = False
            HS.WriteLog(gMe, "Override device is neither on or off: " & iOverride & ". Aborting script.")
            Exit Sub
          End If
        End If
        HS.WriteLog(gMe, "OverRide Switch = " & bOverRide)
        stat = 1 'use stat #1 as tester
        partition = 1
        If Not bOverRide Then bOkay = Set_Therm(oTPI, stat, partition, mode, fan, heatPoint, coolPoint)
        If bOkay Then
          HS.WriteLog(gMe, "Sucessfully set Thermostat settings.")
          HS.WriteLog(gMe, "One or more settings were not set.")
        End If
        List_Stat_Details(oTPI, stat)
      End Sub
      '**************My Procs ********************
      Private Function Set_Therm(ByVal t As Object, ByVal i As Integer, ByVal j As Integer, ByVal m As Integer, ByVal f As Integer, ByVal h As Double, ByVal c As Double) As Boolean
          Dim count As Integer
          count = t.CmdSetMode(i, m, j)
          count = count + t.CmdSetFan(i, f, j)
          count = count + t.CmdSetHeat(i, h, j)
          count = count + t.CmdSetCool(i, c, j)
          If count = 0 Then
            Set_Therm = True 'Success = 0
            Set_Therm = False 'For all Cmdxxxxx functions: <> 0 = Failure Error Code
          End If
        Catch ex As Exception
          HS.WriteLog(gMe, "Set_Therm -- Well, that didn't work ... Exception: " & ex.ToString)
          Set_Therm = False
        End Try
      End Function
      Private Function Set_Hold(ByVal t As Object, ByVal i As Integer, ByVal j As Integer, ByVal hold As Integer) As Boolean
          If t.CmdSetHold(i, hold, j) = 0 Then
            Set_Hold = True 'Success
            Set_Hold = False
          End If
        Catch ex As Exception
          HS.WriteLog(gMe, "Set Hold -- Well, that didn't work ... Exception: " & ex.ToString)
          Set_Hold = False
        End Try
      End Function
      Private Sub List_All_Stat_Details(ByVal Log As String)
        Dim oTPI As Scheduler.HSPI_ZWAVETHERM.HSPI
        oTPI = HS.Plugin("ZWave Thermostats")
        If oTPI Is Nothing Then
          HS.WriteLog(Log, "Plugin not found -- Aborting Sub.")
          Exit Sub
        End If
        HS.WriteLog(Log, "The Plugin is: " &
        HS.WriteLog(Log, "The total number of thermostats is: " & oTPI.NThermostats)
        For i As Integer = 1 To oTPI.NThermostats 'Total number of Thermostats
          List_Stat_Details(oTPI, i)
        Next i
      End Sub
      'This Sub uses ALL of the Plugin's Documented Properties and methods! 
      Private Sub List_Stat_Details(ByVal oTPI As Scheduler.HSPI_ZWAVETHERM.HSPI, ByVal i As Integer)
        Dim s As String, ss As String, sTemp As String
        With oTPI
          HS.WriteLog(gMe, "The Plugin is: " & .name)
          HS.WriteLog(gMe, "The total number of thermostats is: " & .NThermostats)
          HS.WriteLog(gMe, "Thermostat " & i & " is: " & .ThermName(i) & " at z-wave address " _
                            & .ThermAddress(i) & " with " & .NTemps(i) & " sensor(s). Location: " & .ThermLoc(i))
          For j As Integer = 1 To .NTemps(i)
            s = "--Stat " & i & ", Sensor " & j
            ss = s & " supports"
            If .SupportsStat(i, j) Then
              'Heat and Cool Settings
              HS.WriteLog(gMe, s & " current temperature is: " & .GetTemp(i, j))
              sTemp = s & " Heat setting is : " & .GetHeatSet(i, j)
              If .SupportsCoolSet(i, j) Then
                HS.WriteLog(gMe, sTemp & ", Cool setting is: " & .GetCoolSet(i, j))
                HS.WriteLog(gMe, sTemp & ", cool setting is not supported (False).")
              End If
              sTemp = ""
              'Mode & state stuff
              If .SupportsOperating(i, j) Then
                HS.WriteLog(gMe, s & " current operating mode: " & .GetOperating(i, j)) 'True = running, false = not running.
              End If
              HS.WriteLog(gMe, s & " mode is: " & sMode(.GetModeSet(i, j)) & ".")
              HS.WriteLog(gMe, s & " fan mode is: " & sFanMode(.GetFanMode(i, j)) & "; fan state is: " & _
                                sFanState(.GetCurrentFan(i, j)))
              If .GetModeSet(i, j) = Then
                HS.WriteLog(gMe, s & " current mode state is: " & sState(.GetCurrentMode(i, j)))
              End If
              'How Controllable is it?
              If .SupportsDirect(i, j) Then
                HS.WriteLog(gMe, ss & " direct setting.")
                HS.WriteLog(gMe, ss & " " & .NumSetbacks(i, j) & " setback(s).")
              End If
              If .SupportsHold(i, j) Then
                HS.WriteLog(gMe, s & " hold setting is : " & .GetHoldMode(i, j))
                HS.WriteLog(gMe, ss & " hold Override? " & .SupportsHoldOverride(i, j))
                HS.WriteLog(gMe, s & " does not support hold.")
              End If
              HS.WriteLog(gMe, ss & " Aux/Emergency? " & .SupportsAux(i, j))
            End If
          Next j
        End With
      End Sub
      Private Sub List_Plugins(ByVal gMe As String)
        Dim col_PlugIns As Collection
        Dim PlugItem As Object
        Dim Caps As Short
        Dim s As String
        Const CA_THERM As Short = &H10  '(16) Supports the Thermostat API
        col_PlugIns = HS.GetPluginsEX
        HS.WriteLog(gMe, "There are " & col_PlugIns.Count.ToString & " plug-ins in your system.")
        For Each PlugItem In col_PlugIns
          If Not PlugItem Is Nothing Then
            s = "ERROR"
            s =
            Caps = PlugItem.capabilities
            If (Caps And CA_THERM) = CA_THERM Then
              HS.WriteLog(gMe, s & " is a thermostat plug-in.")
            End If
          End If
      End Sub
      'HS will run this in event of ANY device Status Change if Registered
      Public Sub My_Status_Change_CB(ByVal parms As Object)
        HS.writelog(gme,"Successfully triggered Call Back Method!")
        Dim hc As String, dc As String
        Dim status As Integer, devRef As Integer
        Dim device As Object
        hc = parms(0)     'house code of the device that changed status
        dc = parms(1)     'device code of the device that changed status
        status = parms(2) 'the X10 status that the device changed to.
        devRef = parms(3) 'the device reference number. 
        device = HS.GetDeviceByRef(devRef) 'the device
        If Not Is_Thermostat(device) Then Exit Sub 'check to see if device is temperature or therm settings, etc.
        'do something with the status information
      End Sub
      Private Function Is_Thermostat(ByVal device As Object) As Boolean
        Is_Thermostat = False
        If 1 = 1 Then 'change this to something meaningful
          Is_Thermostat = True
        End If
      End Function
    'End Module ' comment out for HS script

    Leave a comment:

  • johan
    doing the same...

    Looks like we are taking the same approach. It's getting complicated, and I am too trying to learn how to write scrpits. Haven't written a line of code for 20 years and the programming languages back then were called pascal and cobol if my memory serves me right...

    Leave a comment:

  • Guest's Avatar
    Guest replied
    you are not alone

    I am trying to do pretty much the same thing. Right now I am using about a dozen or more events. Each event has to set, at least, the heat and cool setpoints for every thermostat. I will have 12 stats when fully implemented. I use a virtual device as a flag for set backs like "hold away" or "occupied" that the scheduler will check before executing the normal daily events -- home, away, wake and sleep.

    Using only events for programming multiple stats for multiple occupation schedules at multiple seasons gets complicated quickly. This job would really benefit from an addin or robust script. I would pay good $ for this--it cannot be just the two of us looking to simplify scheduling and control of multiple stats.

    Personally, I am trying to move up the learning curve, but it's very time consuming...and having remote access to HS may get me fired.

    Leave a comment:

  • johan
    started a topic Thermostat Scheduler?

    Thermostat Scheduler?

    If I knew how to program or write scripts I would write a scipt or plug in that could do scheduling of my trane z-wave thermostats (or any other for that matter). I have a large vacation house in the mountains (it gets cold) with radiant floor heating (supposedly not supported by trane, but it works) with 9 heating zones. That means 9 thermostats! Trying to set schedules for those using events is becoming a nightmare, especially considering that I don't want bed rooms and living areas to have the same profile. I'd love to see a plug in where I could configure a couple of schedules and then apply them to different thermostats. Of course I would also have an away setting that would override the schedules (like the hold setting on my old LUX programmable thermostat).

    I'm thinking this is a pretty rudimentary thing that should already be out there, but I haven't found anything. Am I missing something?