Announcement

Collapse
No announcement yet.

Sample Creating a Device

Collapse
This is a sticky topic.
X
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • alexbk66
    replied
    Originally posted by dzee View Post
    When I click the buttons they don't do anything.
    if I create a device manually on the device screen and add Value/Status pairs, the buttons will actually change the mode
    It's described in SDK documentation, there two different ways to control the state, I was also struggling with this.
    I created the base library for HS3 plugin: https://forums.homeseer.com/forum/de...plugin-library

    The difference between two modes is that when you control your plugin device (i.e. click the button) - HS doesn't update the state straight away - instead it tells your plugin (via SetIOMulti) about the intent. Then your plugin should perform the action (i.e. control thermostat) - and if succeeded tell HS to update the device state (via SetDeviceValueByRef).
    Kind of makes sense.

    You can check my library DeviceBase.ValueChanged() - there are some comments explaining.

    Leave a comment:


  • dzee
    replied
    Question #2: I have the thermostat mode controls created using C# with the buttons Off, Heat, Cool, Auto displayed properly and the values 0-3, respectively. When I click the buttons they don't do anything.

    By contrast, if I create a device manually on the device screen and add Value/Status pairs, the buttons will actually change the mode.

    When creating devices with buttons via programming, is it necessary to write some kind of scripting to make the buttons actually function and change the mode, or is it something I may have forgotten to do when defining the control?

    Here's my code for that device through the creation of the first "Off" button.

    Code:
    dv = (DeviceClass)GlobalVar.hs.GetDeviceByRef(devref);
    dv.set_Address(GlobalVar.hs, "Venstar");
    dv.set_Device_Type_String(GlobalVar.hs, "Mode");
    //this is creating a new room for the device. Some users may not like it, but it can be changed.
    dv.set_Location(GlobalVar.hs, "Venstar");
    //set up the device type for later addition to the device
    DeviceTypeInfo_m.DeviceTypeInfo dt = new DeviceTypeInfo_m.DeviceTypeInfo();
    dt.Device_Type = (int)DeviceTypeInfo_m.DeviceTypeInfo.eDeviceAPI.Plug_In;
    //no subtype
    //dt.Device_SubType = (int)DeviceTypeInfo_m.DeviceTypeInfo.
    dv.set_DeviceType_Set(GlobalVar.hs, dt);
    
    dv.set_InterfaceInstance(GlobalVar.hs, "");
    //Show values, clear status only (both control & status), support triggers
    dv.MISC_Set(GlobalVar.hs, Enums.dvMISC.SHOW_VALUES);
    dv.MISC_Clear(GlobalVar.hs, Enums.dvMISC.STATUS_ONLY);
    dv.MISC_Clear(GlobalVar.hs, Enums.dvMISC.NO_STATUS_TRIGGER);
    dv.set_Status_Support(GlobalVar.hs, true);
    //start in auto mode
    GlobalVar.hs.SetDeviceValueByRef(devref, 3, true);
    GlobalVar.hs.SetDeviceString(devref, "Auto", false);
    
    //make associations with parent
    dv.AssociatedDevice_ClearAll(GlobalVar.hs);
    dv.set_Relationship(GlobalVar.hs, HomeSeerAPI.Enums.eRelationship.Child);
    dv.AssociatedDevice_Add(GlobalVar.hs, parent);
    
    
    VSVGPairs.VSPair statusPair = new VSVGPairs.VSPair(ePairStatusControl.Both);
    
    GlobalVar.hs.DeviceVSP_ClearAll(devref, true);
    statusPair.PairType = VSVGPairs.VSVGPairType.SingleValue;
    statusPair.Value = 0;
    statusPair.Status = "Off";
    statusPair.Render_Location.Row = 0;
    statusPair.Render_Location.Column = 0;
    statusPair.StringListAdd = "Off";
    statusPair.IncludeValues = true;
    statusPair.ControlUse = ePairControlUse._ThermModeOff;
    statusPair.Render = Enums.CAPIControlType.Button_Script; //this is what leads me to believe there may be a script necessary to make the button function
    GlobalVar.hs.DeviceVSP_AddPair(devref, statusPair);
    
    GlobalVar.hs.DeviceVGP_ClearAll(devref, true);
    VSVGPairs.VGPair graphicsPair = new VSVGPairs.VGPair();
    graphicsPair.PairType = VSVGPairs.VSVGPairType.SingleValue;
    graphicsPair.Set_Value = 0;
    graphicsPair.Graphic = @"images\HomeSeer\status\off.gif";
    GlobalVar.hs.DeviceVGP_AddPair(devref, graphicsPair);
    If anyone can help, feel free to respond with VB example or lines, and I'll figure it out. Thanks!

    Leave a comment:


  • dzee
    replied
    I'm writing a Venstar thermostat plugin and have all the API worked out, but am still struggling to create the devices in HS3. So far, I've used the examples to create the parent and child devices, have the value status and value graphic pairs all loading properly, but still have some problems.

    I've found this thread and some other great examples, but my head is now a sufficient pulp from beating it on a wall that I feel I have to ask the experts that came before me.

    How do I get something like the Heat Set Point to actually show the pull-down with the temps?

    Here's what I have (C#). What am I missing to make the heating set point a control and show it as a pull-down?

    Code:
    devref = GlobalVar.hs.NewDeviceRef("Heat Set Point");
    if (devref > 0)
    {[INDENT]string[] disp = new string[2];
    
    myDevice = devref;
    dv = (DeviceClass)GlobalVar.hs.GetDeviceByRef(devref);
    
    dv.set_Address(GlobalVar.hs, "Venstar");
    dv.set_Device_Type_String(GlobalVar.hs, "Heat Setpoint");
    dv.set_Location(GlobalVar.hs, "Venstar");
    
    DeviceTypeInfo_m.DeviceTypeInfo dt = new DeviceTypeInfo_m.DeviceTypeInfo();
    dt.Device_Type = (int)DeviceTypeInfo_m.DeviceTypeInfo.eDeviceAPI.Thermostat;
    dt.Device_SubType = (int)DeviceTypeInfo_m.DeviceTypeInfo.eDeviceSubType_Setpoint .Heating_1;
    dv.set_DeviceType_Set(GlobalVar.hs, dt);
    dv.set_Interface(GlobalVar.hs, GlobalVar.IFACE_NAME);
    dv.set_InterfaceInstance(GlobalVar.hs, "");
    dv.set_Status_Support(GlobalVar.hs, true);
    dv.MISC_Clear(GlobalVar.hs, Enums.dvMISC.STATUS_ONLY);
    
    dv.set_Relationship(GlobalVar.hs, HomeSeerAPI.Enums.eRelationship.Child);
    dv.AssociatedDevice_Add(GlobalVar.hs, parent);
    
    //setup value-status pairs
    GlobalVar.hs.DeviceVSP_ClearAll(devref, true);
    
    VSVGPairs.VSPair statusPair = new VSVGPairs.VSPair(ePairStatusControl.Both);
    
    statusPair.PairType = VSVGPairs.VSVGPairType.Range;
    statusPair.RangeStart = 00;
    statusPair.RangeEnd = 119;
    statusPair.RangeStatusPrefix = "";
    statusPair.RangeStatusSuffix = "°F";
    statusPair.HasScale = true;
    statusPair.Render_Location.Row = 0;
    statusPair.Render_Location.Column = 0;
    statusPair.Render = Enums.CAPIControlType.ValuesRange;
    statusPair.IncludeValues = true;
    statusPair.ControlUse = ePairControlUse._HeatSetPoint;
    GlobalVar.hs.DeviceVSP_AddPair(devref, statusPair);
    
    //setup value-graphics pairs
    GlobalVar.hs.DeviceVGP_ClearAll(devref, true);
    VSVGPairs.VGPair graphicsPair = new VSVGPairs.VGPair();
    graphicsPair.PairType = VSVGPairs.VSVGPairType.Range;
    //we want temp ranges from 0-110 in groups of 10
    int rangestart = 0;
    int rangestep = 10;
    for (int i = 0; i <= 11; i++)
    {[/INDENT][INDENT=2]int rangelow = rangestart + rangestep* i;
    int rangehigh = rangestart + rangestep * (i + 1) - 1;
    graphicsPair.RangeStart = rangelow;
    graphicsPair.RangeEnd = rangehigh;
    graphicsPair.Graphic = @"images\HomeSeer\status\Thermometer-" + rangelow.ToString("00") + ".png";
    GlobalVar.hs.DeviceVGP_AddPair(devref, graphicsPair);[/INDENT][INDENT]}
    children.Add(devref);[/INDENT]
     
      }

    If anyone can help, feel free to respond with VB example or lines, and I'll figure it out. Thanks!

    Leave a comment:


  • mattgam
    replied
    Alex could you provide the full function that is failing and the actual error message you are seeing?

    Leave a comment:


  • alexz99
    replied
    I've seen the sample. just I need to know what reference to add.
    Since I have included references: HomeSeerAPI, Scheduler, RssToolkit, HSCF, and HomeSeerUtil.

    Is there any other reference must add?

    Also I made a VSVGPairRender variable which is:

    Dim VSVGPairRender As Enums.CAPIControlType

    Still doesn't work.
    Sorry for bugging you just there is an assignment I need to get done.
    Last edited by alexz99; October 22, 2018, 06:33 PM.

    Leave a comment:


  • Rick Tinker
    replied
    You have to add a reference to the HomeSeer objects (Scheduler, DLL, etc.) and then the Enums will have this. See the sample project (which I assume they still publish) and it should have it in the example.

    Leave a comment:


  • alexz99
    replied
    Is there another way to render the button?
    I've tried this(VB Code):

    Pair.Render = VSVGPairRender.Button

    But it says that VSVGPairRender is not defined.

    Since it was used back at 2013 and updates during the last 5 years, is there any other way to render a button?
    This may sound dumb but I am new to Homeseer by the way.

    Leave a comment:


  • mnsandler
    replied
    what's the trick for getting an On, Off and value list on the same device; similar to the current hs2 setup

    I can get either the on & off btn or the value list, but not both

    do i need to order the rendering or give them positions?

    Leave a comment:


  • dcorsus
    replied
    Originally posted by Rick Tinker View Post
    I just mentioned those in the other thread... They are named differently and are not in a structure in .11 (and I think a release before that) but they have been there for a while. I added ColumnSpan, and when I did that I shortened the names and put all 3 inside a structure. So other than that, the code will work.

    The new feature that caused the change in those is a ColumnSpan giving you more control over the placement of the controls (buttons, sliders, drop-lists) generated from the value/status pairs.

    The render type ValuesSlider I think is in .11 as well - you might like that - especially for relatively low ranges of values (e.g. 0 to 100) it draws a slider rather than drop-downs for selecting dim levels, and in your case, volume levels!
    This is the second post. This is the code to create status devices and the attached picture shows the icons that I don't want

    PHP Code:
        Private Function CreateHSDevice(ByVal DeviceType As DeviceInfoIndexDevString As String) As Integer
            CreateHSDevice 
    = -1
            Dim dv 
    As Scheduler.Classes.DeviceClass
            Dim DevName 
    As String ZoneName " - " DevString
            Dim dvParent 
    As Scheduler.Classes.DeviceClass Nothing
            Dim HSRef 
    As Integer = -1
            
    Try
                
    HSRef hs.NewDeviceRef(DevName)
                If 
    g_bDebug Then Log("CreateHSDevice for Zone = " ZoneName " created deviceType " DeviceType.ToString " with Ref " HSRef.ToStringLogType.LOG_TYPE_INFO)
                
    ' Force HomeSeer to save changes to devices and events so we can find our new device
                hs.SaveEventsDevices()
                dv = hs.GetDeviceByRef(HSRef)
                dv.Interface(hs) = tIFACE_NAME

                dv.Location(hs) = "Sonos" '
    IFACE_NAME
                dv
    .Location2(hs) = ZoneName 'IFACE_NAME & InstanceFriendlyName.ToString
                dv.MISC_Set(hs, Enums.dvMISC.STATUS_ONLY)
                dv.Can_Dim(hs) = False
                dv.Image(hs) = ""
                dv.Buttons(hs) = ""
                dv.OLD_Values(hs) = ""
                Dim DT As New DeviceTypeInfo
                DT.Device_API = DeviceTypeInfo.eDeviceAPI.Media
                Select Case DeviceType
                    Case DeviceInfoIndex.diTrackHSRef
                        dv.Device_Type_String(hs) = "Track"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Media_Track
                        DT.Device_SubType_Description = "Sonos Player Track Name"
                    Case DeviceInfoIndex.diNextTrackHSRef
                        dv.Device_Type_String(hs) = "Next Track"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Player_Status_Additional
                        DT.Device_SubType_Description = "Sonos Player Next Track Name"
                    Case DeviceInfoIndex.diArtistHSRef
                        dv.Device_Type_String(hs) = "Artist"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Media_Artist
                        DT.Device_SubType_Description = "Sonos Player Artist Name"
                    Case DeviceInfoIndex.diNextArtistHSRef
                        dv.Device_Type_String(hs) = "Next Artist"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Player_Status_Additional
                        DT.Device_SubType_Description = "Sonos Player Next Artist Name"
                    Case DeviceInfoIndex.diAlbumHSRef
                        dv.Device_Type_String(hs) = "Album"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Media_Album
                        DT.Device_SubType_Description = "Sonos Player Album Name"
                    Case DeviceInfoIndex.diNextAlbumHSRef
                        dv.Device_Type_String(hs) = "Next Album"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Player_Status_Additional
                        DT.Device_SubType_Description = "Sonos Player Next Album Name"
                    Case DeviceInfoIndex.diArtHSRef
                        dv.Device_Type_String(hs) = "Art"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Player_Status_Additional
                        DT.Device_SubType_Description = "Sonos Player AlbumArt URL"
                    Case DeviceInfoIndex.diNextArtHSRef
                        dv.Device_Type_String(hs) = "Next Art"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Player_Status_Additional
                        DT.Device_SubType_Description = "Sonos Player AlbumArt URL"
                    Case DeviceInfoIndex.diPlayStateHSRef
                        dv.Device_Type_String(hs) = "State"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Player_Status
                        DT.Device_SubType_Description = "Sonos Player State"
                    Case DeviceInfoIndex.diVolumeHSRef
                        dv.Device_Type_String(hs) = "Volume"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Player_Volume
                        DT.Device_SubType_Description = "Sonos Player Volume"
                    Case DeviceInfoIndex.diMuteHSRef
                        dv.Device_Type_String(hs) = "Mute"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Player_Status_Additional
                        DT.Device_SubType_Description = "Sonos Player Mute State"
                    Case DeviceInfoIndex.diLoudnessHSRef
                        dv.Device_Type_String(hs) = "Loudness"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Player_Status_Additional
                        DT.Device_SubType_Description = "Sonos Player Loudness State"
                    Case DeviceInfoIndex.diBalanceHSRef
                        dv.Device_Type_String(hs) = "Balance"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Player_Status_Additional
                        DT.Device_SubType_Description = "Sonos Player Balance State"
                    Case DeviceInfoIndex.diTrackLengthHSRef
                        dv.Device_Type_String(hs) = "Track Length"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Player_Status_Additional
                        DT.Device_SubType_Description = "Sonos Player Track Length"
                    Case DeviceInfoIndex.diTrackPosHSRef
                        dv.Device_Type_String(hs) = "Track Position"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Player_Status_Additional
                        DT.Device_SubType_Description = "Sonos Player Track Position"
                    Case DeviceInfoIndex.diRadiostationNameHSRef
                        dv.Device_Type_String(hs) = "Radiostation Name"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Player_Status_Additional
                        DT.Device_SubType_Description = "Sonos Player Radiostation Name"
                    Case DeviceInfoIndex.diTrackDescrHSRef
                        dv.Device_Type_String(hs) = "Track Descr"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Player_Status_Additional
                        DT.Device_SubType_Description = "Sonos Player Track Descriptor"
                    Case DeviceInfoIndex.diRepeatHSRef
                        dv.Device_Type_String(hs) = "Repeat"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Player_Repeat
                        DT.Device_SubType_Description = "Sonos Player Repeat State"
                    Case DeviceInfoIndex.diShuffleHSRef
                        dv.Device_Type_String(hs) = "Shuffle"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Player_Shuffle
                        DT.Device_SubType_Description = "Sonos Player Shuffle State"
                    Case DeviceInfoIndex.diGenreHSRef
                        dv.Device_Type_String(hs) = "Genre"
                        DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Media_Genre
                        DT.Device_SubType_Description = "Sonos Player Track Genre"
                End Select

                dv.DeviceType_Set(hs) = DT
                dv.Status_Support(hs) = True
                hs.SetDeviceString(HSRef, "", False)
                ' 
    This device is a child devicethe parent being the root device for the entire security system
                
    ' As such, this device needs to be associated with the root (Parent) device.
                dvParent = hs.GetDeviceByRef(HSRefPlayer)
                If dvParent.AssociatedDevices_Count(hs) < 1 Then
                    ' 
    There are none addedso it is OK to add this one.
                    
    dvParent.AssociatedDevice_Add(hsHSRef)
                Else
                    
    Dim Found As Boolean False
                    
    For Each ref As Integer In dvParent.AssociatedDevices(hs)
                        If 
    ref HSRef Then
                            Found 
    True
                            
    Exit For
                        
    End If
                    
    Next
                    
    If Not Found Then
                        dvParent
    .AssociatedDevice_Add(hsHSRef)
                    Else
                        
    ' This is an error condition likely as this device's reference ID should not already be associated.
                    
    End If
                
    End If

                
    ' Now, we want to make sure our child device also reflects the relationship by adding the parent to
                '   
    the child's associations.
                dv.AssociatedDevice_ClearAll(hs)  ' 
    There can be only one parentso make sure by wiping these out.
                
    dv.AssociatedDevice_Add(hsdvParent.Ref(hs))
                
    hs.DeviceVSP_ClearAll(HSRefTrue)
                
    WriteStringIniFile("UPnP HSRef to UDN"HSRefUDN)
                Return 
    HSRef
            
    Catch ex As Exception
                Log
    ("Error in CreateHSDevice with Error =  " ex.MessageLogType.LOG_TYPE_ERROR)
            
    End Try
        
    End Function 
    Attached Files

    Leave a comment:


  • dcorsus
    replied
    Originally posted by Rick Tinker View Post
    I just mentioned those in the other thread... They are named differently and are not in a structure in .11 (and I think a release before that) but they have been there for a while. I added ColumnSpan, and when I did that I shortened the names and put all 3 inside a structure. So other than that, the code will work.

    The new feature that caused the change in those is a ColumnSpan giving you more control over the placement of the controls (buttons, sliders, drop-lists) generated from the value/status pairs.

    The render type ValuesSlider I think is in .11 as well - you might like that - especially for relatively low ranges of values (e.g. 0 to 100) it draws a slider rather than drop-downs for selecting dim levels, and in your case, volume levels!
    OK, here is my code and see below how it renders .... Note that the row/column don't seem to do anything.
    I'll do a second posting on a "status device" with a picture of how it renders

    PHP Code:
        Private Function SonosCreatePlayerDevice(ByVal HSRef As IntegerByVal ZoneName As StringZoneModel As StringNewDevice As Boolean) As Integer
            SonosCreatePlayerDevice 
    = -1
            Dim dv 
    As Scheduler.Classes.DeviceClass
            Dim DevName 
    As String ZoneName " - Player"
            
    Dim dvParent As Scheduler.Classes.DeviceClass Nothing
            
    Try
                If 
    HSRef = -1 Then
                    HSRef 
    hs.NewDeviceRef(DevName)
                    
    Log("SonosCreatePlayerDevice: Created device " DevName " with reference " HSRef.ToString " and ZoneModel = " ZoneModelLogType.LOG_TYPE_INFO)
                    
    ' Force HomeSeer to save changes to devices and events so we can find our new device
                    hs.SaveEventsDevices()
                End If
                dv = hs.GetDeviceByRef(HSRef)
                dv.Interface(hs) = tIFACE_NAME
                If NewDevice Then
                    dv.Location(hs) = "Sonos" '
    IFACE_NAME
                    dv
    .Location2(hs) = ZoneName 'IFACE_NAME & InstanceFriendlyName.ToString
                    dv.Device_Type_String(hs) = SonosHSDevices.Player.ToString
                    dv.MISC_Set(hs, Enums.dvMISC.SHOW_VALUES)
                    dv.Can_Dim(hs) = False
                    dv.Image(hs) = ""
                    dv.Buttons(hs) = ""
                    dv.OLD_Values(hs) = ""
                    Dim DT As New DeviceTypeInfo
                    DT.Device_API = DeviceTypeInfo.eDeviceAPI.Media
                    DT.Device_Type = DeviceTypeInfo.eDeviceType_Media.Root
                    DT.Device_SubType_Description = "Sonos Player Master Control"
                    dv.DeviceType_Set(hs) = DT
                    dv.Status_Support(hs) = True
                    hs.SetDeviceString(HSRef, "", False)
                    ' 
    This device is a child devicethe parent being the root device for the entire security system
                    
    ' As such, this device needs to be associated with the root (Parent) device.
                    dvParent = hs.GetDeviceByRef(MasterHSDeviceRef)
                    If dvParent.AssociatedDevices_Count(hs) < 1 Then
                        ' 
    There are none addedso it is OK to add this one.
                        
    dvParent.AssociatedDevice_Add(hsHSRef)
                    Else
                        
    Dim Found As Boolean False
                        
    For Each ref As Integer In dvParent.AssociatedDevices(hs)
                            If 
    ref HSRef Then
                                Found 
    True
                                
    Exit For
                            
    End If
                        
    Next
                        
    If Not Found Then
                            dvParent
    .AssociatedDevice_Add(hsHSRef)
                        Else
                            
    ' This is an error condition likely as this device's reference ID should not already be associated.
                        
    End If
                    
    End If

                    
    ' Now, we want to make sure our child device also reflects the relationship by adding the parent to
                    '   
    the child's associations.
                    dv.AssociatedDevice_ClearAll(hs)  ' 
    There can be only one parentso make sure by wiping these out.
                    
    dv.AssociatedDevice_Add(hsdvParent.Ref(hs))
                    
    hs.DeviceVSP_ClearAll(HSRefTrue)
                
    End If

                
    hs.DeviceVSP_ClearAll(HSRefTrue)
                
    Dim ValuePairs As Integer hs.DeviceVGP_Count(HSRef)
                
    Log("Test in SonosCreatePlayerDevice counting value/graphics pairs. Count =  " ValuePairs.ToStringLogType.LOG_TYPE_INFO)
                
    hs.DeviceVGP_ClearAll(HSRefTrue)

                
    Dim Pair As VSPair
                Pair 
    = New VSPair(HomeSeerAPI.ePairStatusControl.Control)
                
    Pair.PairType VSVGPairType.SingleValue
                
    'Pair.ProtectionSet = ePairProtection.Do_Not_Delete
                Pair.Value = 1
                Pair.Status = "Play"
                Pair.Render = VSVGPairRender.Button
                Pair.ButtonRender_Row = 0
                Pair.ButtonRender_Column = 0
                hs.DeviceVSP_AddPair(HSRef, Pair)

                Pair = New VSPair(HomeSeerAPI.ePairStatusControl.Control)
                Pair.PairType = VSVGPairType.SingleValue
                '
    Pair.ProtectionSet ePairProtection.Do_Not_Delete
                Pair
    .Value 2
                Pair
    .Status "Stop"
                
    Pair.Render VSVGPairRender.Button
                Pair
    .ButtonRender_Row 0
                Pair
    .ButtonRender_Column 1
                hs
    .DeviceVSP_AddPair(HSRefPair)

                
    Pair = New VSPair(HomeSeerAPI.ePairStatusControl.Control)
                
    Pair.PairType VSVGPairType.SingleValue
                
    'Pair.ProtectionSet = ePairProtection.Do_Not_Delete
                Pair.Value = 3
                Pair.Status = "Pause"
                Pair.Render = VSVGPairRender.Button
                Pair.ButtonRender_Row = 0
                Pair.ButtonRender_Column = 2
                hs.DeviceVSP_AddPair(HSRef, Pair)

                Pair = New VSPair(HomeSeerAPI.ePairStatusControl.Control)
                Pair.PairType = VSVGPairType.SingleValue
                '
    Pair.ProtectionSet ePairProtection.Do_Not_Delete
                Pair
    .Value 5
                Pair
    .Status "Prev"
                
    Pair.Render VSVGPairRender.Button
                Pair
    .ButtonRender_Row 0
                Pair
    .ButtonRender_Column 3
                hs
    .DeviceVSP_AddPair(HSRefPair)

                
    Pair = New VSPair(HomeSeerAPI.ePairStatusControl.Control)
                
    Pair.PairType VSVGPairType.SingleValue
                
    'Pair.ProtectionSet = ePairProtection.Do_Not_Delete
                Pair.Value = 4
                Pair.Status = "Next"
                Pair.Render = VSVGPairRender.Button
                Pair.ButtonRender_Row = 0
                Pair.ButtonRender_Column = 4
                hs.DeviceVSP_AddPair(HSRef, Pair)

                If ZoneModel.ToUpper = "WD100" Then
                    Pair = New VSPair(HomeSeerAPI.ePairStatusControl.Control)
                    Pair.PairType = VSVGPairType.SingleValue
                    '
    Pair.ProtectionSet ePairProtection.Do_Not_Delete
                    Pair
    .Value 6
                    Pair
    .Status "BuildDB"
                    
    Pair.Render VSVGPairRender.Button
                    Pair
    .ButtonRender_Row 0
                    Pair
    .ButtonRender_Column 5
                    hs
    .DeviceVSP_AddPair(HSRefPair)
                
    End If

                
    Pair = New VSPair(HomeSeerAPI.ePairStatusControl.Control)
                
    Pair.PairType VSVGPairType.SingleValue
                
    'Pair.ProtectionSet = ePairProtection.Do_Not_Delete
                Pair.Value = 7
                Pair.Status = "Shuffle"
                Pair.Render = VSVGPairRender.Button
                Pair.ButtonRender_Row = 1
                Pair.ButtonRender_Column = 0
                hs.DeviceVSP_AddPair(HSRef, Pair)

                Pair = New VSPair(HomeSeerAPI.ePairStatusControl.Control)
                Pair.PairType = VSVGPairType.SingleValue
                '
    Pair.ProtectionSet ePairProtection.Do_Not_Delete
                Pair
    .Value 8
                Pair
    .Status "Repeat"
                
    Pair.Render VSVGPairRender.Button
                Pair
    .ButtonRender_Row 1
                Pair
    .ButtonRender_Column 1
                hs
    .DeviceVSP_AddPair(HSRefPair)

                
    Pair = New VSPair(HomeSeerAPI.ePairStatusControl.Control)
                
    Pair.PairType VSVGPairType.SingleValue
                
    'Pair.ProtectionSet = ePairProtection.Do_Not_Delete
                Pair.Value = 9
                Pair.Status = "Up"
                Pair.Render = VSVGPairRender.Button
                Pair.ButtonRender_Row = 2
                Pair.ButtonRender_Column = 0
                hs.DeviceVSP_AddPair(HSRef, Pair)

                Pair = New VSPair(HomeSeerAPI.ePairStatusControl.Control)
                Pair.PairType = VSVGPairType.SingleValue
                '
    Pair.ProtectionSet ePairProtection.Do_Not_Delete
                Pair
    .Value 10
                Pair
    .Status "Dn"
                
    Pair.Render VSVGPairRender.Button
                Pair
    .ButtonRender_Row 2
                Pair
    .ButtonRender_Column 1
                hs
    .DeviceVSP_AddPair(HSRefPair)

                
    Pair = New VSPair(HomeSeerAPI.ePairStatusControl.Control)
                
    Pair.PairType VSVGPairType.SingleValue
                
    'Pair.ProtectionSet = ePairProtection.Do_Not_Delete
                Pair.Value = 11
                Pair.Status = "Mute"
                Pair.Render = VSVGPairRender.Button
                Pair.ButtonRender_Row = 2
                Pair.ButtonRender_Column = 2
                hs.DeviceVSP_AddPair(HSRef, Pair)

                Pair = New VSPair(HomeSeerAPI.ePairStatusControl.Control)
                Pair.PairType = VSVGPairType.SingleValue
                '
    Pair.ProtectionSet ePairProtection.Do_Not_Delete
                Pair
    .Value 12
                Pair
    .Status "Left"
                
    Pair.Render VSVGPairRender.Button
                Pair
    .ButtonRender_Row 2
                Pair
    .ButtonRender_Column 3
                hs
    .DeviceVSP_AddPair(HSRefPair)

                
    Pair = New VSPair(HomeSeerAPI.ePairStatusControl.Control)
                
    Pair.PairType VSVGPairType.SingleValue
                
    'Pair.ProtectionSet = ePairProtection.Do_Not_Delete
                Pair.Value = 13
                Pair.Status = "Right"
                Pair.Render = VSVGPairRender.Button
                Pair.ButtonRender_Row = 2
                Pair.ButtonRender_Column = 4
                hs.DeviceVSP_AddPair(HSRef, Pair)

                Pair = New VSPair(HomeSeerAPI.ePairStatusControl.Control)
                Pair.PairType = VSVGPairType.SingleValue
                '
    Pair.ProtectionSet ePairProtection.Do_Not_Delete
                Pair
    .Value 14
                Pair
    .Status "Loudness"
                
    Pair.Render VSVGPairRender.Button
                Pair
    .ButtonRender_Row 2
                Pair
    .ButtonRender_Column 5
                hs
    .DeviceVSP_AddPair(HSRefPair)

                Return 
    HSRef
            
    Catch ex As Exception
                Log
    ("Error in SonosCreatePlayerDevice with Error =  " ex.MessageLogType.LOG_TYPE_ERROR)
            
    End Try
        
    End Function 
    Attached Files

    Leave a comment:


  • dcorsus
    replied
    Originally posted by Rick Tinker View Post
    I just mentioned those in the other thread... They are named differently and are not in a structure in .11 (and I think a release before that) but they have been there for a while. I added ColumnSpan, and when I did that I shortened the names and put all 3 inside a structure. So other than that, the code will work.

    The new feature that caused the change in those is a ColumnSpan giving you more control over the placement of the controls (buttons, sliders, drop-lists) generated from the value/status pairs.

    The render type ValuesSlider I think is in .11 as well - you might like that - especially for relatively low ranges of values (e.g. 0 to 100) it draws a slider rather than drop-downs for selecting dim levels, and in your case, volume levels!
    I definitely need to try the slider, that would be an awesome addition for volume controls or track position controls.

    Now I need to figure out why my code is not working, neither for these icons nor for the row/column thing. I'm going to post my code tonight for you to look at, I think there are others who struggle with the same (the icons thing that is).

    Dirk

    Leave a comment:


  • Rick Tinker
    replied
    Originally posted by dcorsus View Post
    I see this in your code, but it doesn't do anything for me. Is this part of v.11 or a yet-to-be-released version of HS3?
    I just mentioned those in the other thread... They are named differently and are not in a structure in .11 (and I think a release before that) but they have been there for a while. I added ColumnSpan, and when I did that I shortened the names and put all 3 inside a structure. So other than that, the code will work.

    The new feature that caused the change in those is a ColumnSpan giving you more control over the placement of the controls (buttons, sliders, drop-lists) generated from the value/status pairs.

    The render type ValuesSlider I think is in .11 as well - you might like that - especially for relatively low ranges of values (e.g. 0 to 100) it draws a slider rather than drop-downs for selecting dim levels, and in your case, volume levels!

    Leave a comment:


  • dcorsus
    replied
    Originally posted by Rick Tinker View Post
    Pair.Render_Location.Row = 1
    Pair.Render_Location.Column = 3
    Rick,

    I see this in your code, but it doesn't do anything for me. Is this part of v.11 or a yet-to-be-released version of HS3?

    Thanks

    Dirk

    Leave a comment:


  • Rick Tinker
    replied
    Originally posted by mnsandler View Post
    Thanks for posting.
    #1 I tried the range code. How does HS know to increment by 3 each time, how can i make it increment by 10?

    #2. also, i tried a single loop: 0 to 100 step 10 to add unique values instead. the values were not ordered correctly in the dropdown. do i need to tell each value what its order is in the list?
    You are right, you have to do it manually if you want it in increments by 10. HomeSeer has a number (forget what it is right now) on how many entries in a drop-down list so that the page does not take long to load all of the options. Taking the difference between the upper boundary of the range and the lower boundary, and dividing by that number, it came up with the step 3. It seems weird for 0-100, but for something such as a scientific temperature sensor that has a range from -4 billion to 4 billion, it handles things nicely. Again, doing it "manually" is perfectly fine.

    The ordering problem is due to a change somebody made without checking with me that I have to undo, so do nothing about it right now and I will have it fixed in the next release.

    Leave a comment:


  • mnsandler
    replied
    Thanks for posting.
    #1 I tried the range code. How does HS know to increment by 3 each time, how can i make it increment by 10?

    Code:
     Pair = New VSPair(HomeSeerAPI.ePairStatusControl.Both)
    Pair.PairType = VSVGPairType.Range
    Pair.RangeStart = 1
    Pair.RangeEnd = 99
    Pair.RangeStatusPrefix = "Dim "
    Pair.RangeStatusSuffix = "%"
    Pair.Render = Enums.CAPIControlType.ValuesRangeSlider
    hs.DeviceVSP_AddPair(dv.Ref(hs), Pair)
    #2. also, i tried a single loop: 0 to 100 step 10 to add unique values instead. the values were not ordered correctly in the dropdown. do i need to tell each value what its order is in the list?

    Leave a comment:

Working...
X