Gå til innhold

Scripts til HS3


Anbefalte innlegg

NB!
Denne tråden er kun for scripts. Alle andre innlegg blir rapportert.
Vi har en egen kommentar- og diskusjonstråd her: https://www.diskusjon.no/index.php?showtopic=1709099 :)


Hva er scripting?
De fleste litt større systemer støtter scripting i en eller annen form. Ettersom det er så mye de forskjellige systemene kan gjøre, så er det ikke sikkert at utviklerne har tenkt på alle muligheter som er mulig å få til og legger muligheter for det inn i Event-motorene sine. Det er der scripting kommer inn. Det er en enkel måte å utvide mulighetene i hjemmeautomasjonssystemet sitt.
 
Noen bruker python, ande LUA. HomeSeer er skrevet i .NET og bruker VB.net (og C#) som scriptspråk, og det er en stor del av grunnen til at jeg valgte HomeSeer som styringssystem. Jeg har programmert mye i VB og VB.net (og mer og mer C#), så å kunne bruke samme språk i HomeSeer er jo en enorm fordel. Når det er sagt så er jo ikke LUA så langt borte fra VB.

 

Pr. default er ikke hele .NET biblioteket tilgjengelig som scripting, men de mest brukte funksjonene er der (og det er ikke lite bare det). Man har imidlertid mulighet til å legge til referanser selv hvis man ønsker det.
 
 
Hva trenger jeg?
I utgangspunktet trenger du ingenting, utenom litt kunnskap om VB, .NET og HomeSeer. Hvis du ikke har noe av dette, men likevel kan tenke deg å scripte litt så er det her en liten liste:

.... eller så kopierer du noen av scriptene under. ;)
 

Men... plugins?
"Hvis scripting er så genialt, hvorfor lages det plugins?"

Fordi å lage plugins gir enda større frihet, selv om det er mer arbeid. I en plugin kan man bruke hele .NET biblioteket av funksjoner uten å tenke på om det er støttet ut av esken eller ei. Så hvis man skal lage et system for å lese og skrive til en server (som Fitbit-plugin'en) eller til en kaffetrakter, så er det mye lettere med en plugin der man uten videre kan opprette nye tråder, bruke LiNQ, og lage en enda tettere integrering i HS3.

 

HST har gjort mye smart i SDKet sitt, men personlig synes jeg de utgangspunktene de hadde laget i beste fall var vanskelige å forstå. De som ønsker å se på plugins, kan istedenfor se på mitt eget pluginsample. Det finner du her: http://board.homeseer.com/showthread.php?t=177339

 
Diskusjoner, ønsker og spørsmål tar vi i den dedikerte tråden. :)

Endret av Moskus
  • Liker 3
Lenke til kommentar
Videoannonse
Annonse

... *mumle* j@vla nesevise, utålmodige meddebatanter... *mumle

 

IncrementLight.vb

    Public Sub Main(ByVal _deviceRef As Object)
        Dim deviceRef As Integer = Integer.Parse(_deviceRef)
        Dim deviceValue As Integer = hs.DeviceValue(deviceRef)

        'Exit if the device is already at maximum, i.e. "On"
        If hs.CAPIGetStatus(deviceRef).Status = "On" Then Exit Sub

        'Find the correct CAPI control to execute. I really miss Linq!!!
        For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(deviceRef)
            If cc.ControlValue = (deviceValue + 1) Then

                'Set the correct dim level
                hs.CAPIControlHandler(cc)

                'We're done, so let's exit!
                Exit Sub
            End If
        Next
    End Sub
Lenke til kommentar

CloneDevice.vb

Speiler status fra en device over på flere andre. Praktisk for å f.eks. kunne skru av/på/dimme et helt rom samtidig.

 

Parameter: 100|200+201+202

... hvor 100 er master device (typisk taklampe) og 200-202 er andre devicer,

 

Trigges typisk av master device set to any status.

Sub Main(ByVal parms As String)
        Dim input() As String = Split(parms.ToString, "|")
        Dim control As String = input(0).ToString
        Dim devs() As String = Split(input(1).ToString, "+")
        Dim devicevalue As Double = hs.DeviceValueEx(control)

        Dim CAPIcontrol As HomeSeerAPI.CAPIControl = Nothing
        For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(control)
            If devicevalue = cc.ControlValue Then
                CAPIcontrol = cc
                Exit For
            End If
        Next

        For Each d as String In devs
            Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(d)
            If CAPIcontrol.Label.ToLower.Contains("dim") Then
                If dev.Can_Dim(Nothing) Then
                    Dim capi As HomeSeerAPI.CAPIControl = Nothing
                    For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(d)
                        If cc.Label = CAPIcontrol.Label Then
                            capi = cc
                            Exit For
                        End If
                    Next
                    hs.CAPIControlHandler(capi)
                Else
                    Dim off As HomeSeerAPI.CAPIControl = Nothing
                    For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(d)
                        If cc.Label.ToLower = "off" Then
                            off = cc
                            Exit For
                        End If
                    Next
                    hs.CAPIControlHandler(off)
                End If
            Else
                Dim capi As HomeSeerAPI.CAPIControl = Nothing
                For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(d)
                    If cc.Label = CAPIcontrol.Label Then
                        capi = cc
                        Exit For
                    End If
                Next
                hs.CAPIControlHandler(capi)
            End If

        Next
    End Sub
Lenke til kommentar

SmartToggle.vb

"Toggler" en device mellom "Off" og "On Last Level" hvis den finnes (altså er en Z-wave device). Kun mellom "Off" og "On" ellers.

 

Parameter: 400

... der 400 er device ref til device'n du vil toggle.

Public Sub Main(ByVal input As Object)
    '© Moskus 2015
    Dim control As String = input
    Dim devicevalue As Double = hs.DeviceValueEx(control)

    Dim capi As HomeSeerAPI.CAPIControl = Nothing

    If devicevalue = 0 Then 'device is off, so let's trigger "On Last Level" if it exists on the device, and just "On"
        capi = hs.CAPIGetSingleControl(input, True, "on last level", False, False)

        If capi Is Nothing Then '"On last Level" wasn't found, so we need to find "On"
            capi = hs.CAPIGetSingleControl(input, True, "on", False, False)
        End If

    Else 'The device is on, so let's turn it offf
        capi = hs.CAPIGetSingleControl(input, True, "off", False, False)
    End If

    If capi IsNot Nothing Then
        hs.CAPIControlHandler(capi)
    Else
        hs.WriteLog("SmartToggle", "Could not execute CAPIcontrol, it's nothing! (Input device value: " & devicevalue & ")")
    End If
End Sub
Lenke til kommentar

CheckDoorsAndWindows.vb

Script som sender epost eller push-meldinger om eventuelle dører og vinduer som er åpne når du f.eks. skrur på alarmen eller legger deg.

 

Du må endre tre linjer:

 - Dim rfxcom() As Integer = { DINE RFXCOM-SENSORER HER KOMMASEPARERT }

 - Dim zwave() As Integer = {DINE Z-WAVE-SENSORER HER KOMMASEPARERT}

... og nederst med epost til og fra hvem, eventuelt legge til sending av push fra plugin, hvis du bruker det.

Sub Main(ByVal input As Object)
        Dim lst As New System.Collections.Generic.List(Of String)
        Dim closedStatus As Integer = 100

        'RFXCOM devices
        Dim rfxcom() As Integer = {41, 1188, DINE RFXCOM-SENSORER HER KOMMASEPARERT}
        closedStatus = 2
        For Each d As Integer In rfxcom
            If hs.DeviceValue(d) <> closedStatus Then
                Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(d)
                lst.Add(dev.Location2(hs) & " " & dev.Location(hs) & " " & dev.Name(hs))
            End If
        Next

        'Zwave devices
        Dim zwave() As Integer = {450, 545, DINE Z-WAVE-SENSORER HER KOMMASEPARERT}
        closedStatus = 255
        For Each d As Integer In zwave
            If hs.DeviceValue(d) <> closedStatus Then
                Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(d)
                lst.Add(dev.Location2(hs) & " " & dev.Location(hs) & " " & dev.Name(hs))
            End If
        Next

        If lst.Count > 0 Then
            Dim msg As String = "Følgende vinduer er åpne: " & vbNewLine
            msg &= String.Join(vbNewLine, lst)

            hs.SendEmail("[email protected]", "FRA_HS#@epost.com", "", "", "HS3: Åpne vinduer/dører!", msg, "")
        Else
            hs.WriteLog("Vindu/dører", "Alle er lukket")
        End If

    End Sub
Endret av Moskus
Lenke til kommentar

IncrementLight.vb

Øker lyset med +1% med jevne mellomrom, f.eks. hvert 18. sekund gir 30 minutter. :)

    Public Sub Main(ByVal _deviceRef As Object)
        Dim deviceRef As Integer = Integer.Parse(_deviceRef)
        Dim deviceValue As Integer = hs.DeviceValue(deviceRef)

        'Exit if the device is already at maximum, i.e. "On"
        If hs.CAPIGetStatus(deviceRef).Status = "On" Then Exit Sub

        'Find the correct CAPI control to execute. I really miss Linq!!!
        For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(deviceRef)
            If cc.ControlValue = (deviceValue + 1) Then

                'Set the correct dim level
                hs.CAPIControlHandler(cc)

                'We're done, so let's exit!
                Exit Sub
            End If
        Next
    End Sub

IncrementLightCustom.vb

Ulempen med de fleste dimmere er at de ikke er lineære. De første 1-20% gir en mye større relativt forskjell enn de siste 80-99%. Det gjør det følgende scriptet med, men du trenger en "counter" som må settes til 0 før du starter.

 

Parameter: 100#counter name

... der 100 er device ref til lampen du skal styre, og "counter name" selvfølgelig er navnet på counteren.

    Public Sub Main(ByVal _deviceRefAndCounter As Object)
        Dim deviceRef As Integer = Integer.Parse(_deviceRefAndCounter.ToString.Split("#")(0))
        Dim countervalue As Integer = hs.CounterValue(_deviceRefAndCounter.ToString.Split("#")(1))
        Dim modifier As Integer = 4

        Dim dimvalue As Integer = Math.Ceiling(countervalue ^ (modifier) / 100 ^ (modifier - 1))

        'Exit if the device is already at maximum, i.e. "On"
        If hs.CAPIGetStatus(deviceRef).Status = "On" Then Exit Sub

        'Find the correct CAPI control to execute. I really miss Linq!!!
        For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(deviceRef)
            If cc.ControlValue = dimvalue Then

                'Set the correct dim levelQ
                hs.CAPIControlHandler(cc)

                'We're done, so let's exit!
                Exit Sub
            End If
        Next
    End Sub

IncrementLightRGB.vb

Hvis man istedenfor har en RGB-stripe eller lampe, og man først vil ha lyset rødt, så gult, og deretter hvitt, kan man bruke dette. Du må endre de fire første linjene for å passe til ditt oppsett.

Public Sub Main(ByVal _nothingreally As Object)
        Dim deviceR As Integer = 990
        Dim deviceG As Integer = 991
        Dim deviceB As Integer = 992
        Dim countervalue As Integer = hs.CounterValue("Sunshine soverom")
        Dim modifier As Integer = 2

        Dim dimvalue As Integer = Math.Ceiling(countervalue ^ (modifier) / 100 ^ (modifier - 1))


        'Exit if the device is already at maximum, i.e. "On"
        'If hs.CAPIGetStatus(deviceR).Status = "On" Then Exit Sub

        'Red
        If countervalue <= 100 Then
            'Find the correct CAPI control to execute. I really miss Linq!!!
            For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(deviceR)
                If cc.ControlValue = dimvalue Then
                    If hs.CAPIGetStatus(deviceR).Status <> "On" Then hs.CAPIControlHandler(cc)
                    Exit For
                End If
            Next
        End If

        'Green
        If countervalue > 100 AndAlso countervalue <= 200 Then
            For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(deviceG)
                If cc.ControlValue = countervalue - 100 Then
                    If hs.CAPIGetStatus(deviceG).Status <> "On" Then hs.CAPIControlHandler(cc)
                    Exit For
                End If
            Next
        End If


        If countervalue = 150 Then
            Dim capi As HomeSeerAPI.CAPIControl = hs.CAPIGetSingleControl(deviceB, True, "off", False, False)
            hs.CAPIControlHandler(capi)
        End If

        'Blue
        If countervalue > 150 Then
            For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(deviceB)
                If cc.ControlValue = countervalue - 150 Then
                    If hs.CAPIGetStatus(deviceB).Status <> "On" Then hs.CAPIControlHandler(cc)
                    Exit For
                End If
            Next
        End If
    End Sub

Generelt oppsett av eventer:

1uxCI8r.png

 

eHhfpga.png

 

B9AiIPR.png

Endret av Moskus
Lenke til kommentar

DeviceState.vb

Lar deg lagre og laste inn innstillinger for et utvalgt av enheter. Synes du at lyset er perfekt akkurat nå? Lagre det! Og hent det tilbake senere. :)

    Sub Main(ByVal not_used As Object)
        'By Moskus, August 2015

        'Set up a new config.
        'Specify devices between the brackets below (comma separated):
        Dim devices() As Integer = {342, 872, 873}

        'Specify a configuration name. This is used when calling "Save" and "Load" later.
        Dim config_name As String = "Bedroom"

        'Creating initial ini file and store it in a list
        Dim lst As New System.Collections.Generic.List(Of DeviceState)
        For Each d As Integer In devices
            Dim dS As New DeviceState
            dS.deviceRef = d
            dS.deviceValue = hs.DeviceValueEx(d)
            lst.Add(dS)
        Next

        'Write the list to file
        SaveToFile(config_name, lst)

    End Sub

    Sub Save(ByVal config_name As String)
        'Get the device list
        Dim lst As System.Collections.Generic.List(Of DeviceState) = LoadFromFile(config_name)

        'Get the current device values for each device
        For Each d As DeviceState In lst
            d.deviceValue = hs.DeviceValueEx(d.deviceRef)
        Next

        'Store the list
        SaveToFile(config_name, lst)
    End Sub

    Sub Load(ByVal config_name As String)
        'Get the device list
        Dim lst As System.Collections.Generic.List(Of DeviceState) = LoadFromFile(config_name)

        For Each d As DeviceState In lst
            'Find the correct CAPI based on device value...
            Dim CAPIcontrol As HomeSeerAPI.CAPIControl = Nothing
            For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(d.deviceRef)
                If d.deviceValue = cc.ControlValue Then
                    CAPIcontrol = cc
                    Exit For
                End If
            Next

            '... And execute it
            hs.CAPIControlHandler(CAPIcontrol)
        Next
    End Sub

    Function LoadFromFile(ByVal config_name As String) As System.Collections.Generic.List(Of DeviceState)
        Dim lst As New System.Collections.Generic.List(Of DeviceState)
        Dim filename As String = "DeviceState_" & config_name & ".ini"

        Dim lines() As String = hs.GetINISectionEx("Devices", filename)
        For Each line As String In lines
            Dim deviceRef As Integer = line.Split("=")(0).Trim
            Dim deviceValue As Double = line.Split("=")(1).Trim

            lst.Add(New DeviceState(deviceRef, deviceValue))
        Next


        Return lst
    End Function

    Sub SaveToFile(ByVal config_name As String, ByVal stateList As System.Collections.Generic.List(Of DeviceState))
        Dim filename As String = "DeviceState_" & config_name & ".ini"
        For Each d As DeviceState In stateList
            hs.SaveINISetting("Devices", d.deviceRef, d.deviceValue, filename)
        Next
    End Sub


    <Serializable>
    Public Class DeviceState
        Public Property deviceRef As Integer
        Public Property deviceValue As Double
        Public Sub New()
        End Sub

        Public Sub New(ByVal _deviceRef As Integer, ByVal _deviceValue As Double)
            Me.deviceRef = _deviceRef
            Me.deviceValue = _deviceValue
        End Sub
    End Class

Oppsett:
Det er to måter å lage et oppsett på.
1. Redigere Main()-sub'en med å liste opp device'referansene i krølleparantesene i denne linjen:

Dim devices() As Integer = {342, 872, 873}

og navnet i denne linjen:

Dim config_name As String = "Bedroom"

... og så kjøre scriptet med å kalle Main-sub'en.

2. Lag en INI-fil i \Config-mappen på dette formatet:

[Devices]
devRef1=devValue1
devRef2=devValue2
devRef3=devValue3

Navngi den "DeviceState_DittVariabelNavn.ini" der du bytter ut DittVariabelNavn med noe mer beskrivende. Det er dette du skal kalle senere.

Mitt testeksempel ser slik ut for DeviceState_Bedroom.ini:

[Devices]
342=53
872=25
873=39

Når det er gjort er det bare å lage to eventer. Et for lagring og et for tilbakestilling. Lagring av lys gjøres med å kjøre scriptet "DeviceStates.vb" med funksjon "Save" og parameter satt til DittVariabelNavn, slik:
dohVt.jpg

Tilbakestilling er helt likt, men da bytter du ut "Save" med "Load".


Det er da mulig å lage veldig enkle "scenes" med å kopiere en ini-fil og gi den et nytt navn, som f.eks. "Bedroom-Morning", "Bedroom-Sexytime", "Bedroom-Night", "Bedroom-Off", og så videre. Bare redigere ini-filene med passende verdier, og restore som det passer deg.

Så lenge teknologien som styrer lyset lagrer devicevalue og bruker CAPI til kontroll (og det gjør vel alle skulle jeg mene), så vil dette fungere. Jeg tror til og med det fungerer med andre enheter (som f.eks. Squeezebox Play/Pause, og så videre). :D

 

 

Originalt postet her: https://www.diskusjon.no/index.php?showtopic=1191806&p=22717532

Lenke til kommentar

GrandbeingMX0404.vb

Script for å styre en Grandbeing MX0404 HDMI matrise. Lager en root med tilhørende child-devicer for hver utgang hvor man kan trykke på de forskjellige inngangene. Alt i et script, men dette blir nok en plugin på sikt (der er det lettere å få til en autorefresh, og sånt).

    Dim Scriptname As String = "GrandbeingMX0404.vb"
    Dim hdmi_outputs() As String = {"None", "TV", "SageTV", "Xbox", "Extra"}
    Dim ip_address As String = "192.168.0.39"

    Public Sub Main(parm As Object)
    End Sub

    Public Sub Setup(parm As Object)
        'Setting up devices

        'Creating master device
        Dim dt As New HomeSeerAPI.DeviceTypeInfo
        Dim devref As Integer = hs.NewDeviceRef("Root")
        Dim dv As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(devref)
        Try
            dv.Location(hs) = "HDMI matrix"
            dv.Location2(hs) = "Media"
            dv.Device_Type_String(hs) = "HDMI root"
            dv.DeviceType_Set(hs) = New HomeSeerAPI.DeviceTypeInfo
            dv.Status_Support(hs) = True
            dv.Can_Dim(hs) = False
            hs.SaveEventsDevices()
            dv.MISC_Set(hs, HomeSeerAPI.Enums.dvMISC.SHOW_VALUES)
            dv.MISC_Clear(hs, HomeSeerAPI.Enums.dvMISC.STATUS_ONLY)

            'Adding a "Refresh" button to the root device
            hs.DeviceScriptButton_AddButton(devref, "Refresh", 0, Scriptname, "ButtonPress", "Refresh", 1, 1, 1)
            hs.SaveEventsDevices()

            Dim SVpair As New HomeSeerAPI.VSPair(HomeSeerAPI.ePairStatusControl.Status)
            SVpair.PairType = HomeSeerAPI.VSVGPairType.SingleValue
            SVpair.Value = 0
            SVpair.Status = "HDMI matrix"
            hs.DeviceVSP_AddPair(devref, SVpair)

            Dim VGpair As New HomeSeerAPI.VGPair
            VGpair.PairType = HomeSeerAPI.VSVGPairType.SingleValue
            VGpair.Set_Value = 0
            VGpair.Graphic = "images/Moskus/icon_hdmi.png"
            hs.DeviceVGP_AddPair(devref, VGpair)

            hs.WriteLog("HDMI matrix", "Root device for HDMI matrix created")
        Catch ex As Exception
            hs.WriteLog("HDMI matrix", "Error creating root device: " & ex.Message)
        End Try

        'Creating child devices
        dv.Relationship(hs) = HomeSeerAPI.Enums.eRelationship.Parent_Root
        For i As Integer = 1 To 4
            Dim childref As Integer = CreateOutputDevice(i, devref)
            If childref > 0 Then dv.AssociatedDevice_Add(hs, childref)
        Next

    End Sub

    Public Function CreateOutputDevice(ByVal output As Integer, masterdevice As Integer) As Integer
        'Creating device
        Dim dt As New HomeSeerAPI.DeviceTypeInfo
        Dim devref As Integer = hs.NewDeviceRef("Output " & output)
        Dim dv As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(devref)
        Try
            dv.Location(hs) = "HDMI matrix"
            dv.Location2(hs) = "Media"
            dv.Device_Type_String(hs) = "HDMI out " & output
            dv.DeviceType_Set(hs) = New HomeSeerAPI.DeviceTypeInfo
            hs.SaveEventsDevices()
            dv.Status_Support(hs) = True
            dv.Can_Dim(hs) = False
            dv.MISC_Set(hs, HomeSeerAPI.Enums.dvMISC.SHOW_VALUES)
            dv.MISC_Clear(hs, HomeSeerAPI.Enums.dvMISC.STATUS_ONLY)
            dv.Relationship(hs) = HomeSeerAPI.Enums.eRelationship.Child
            dv.AssociatedDevice_Add(hs, masterdevice)
            dv = Nothing

            hs.WriteLog("HDMI matrix", "Test Device for output " & output & " created")
        Catch ex As Exception
            hs.WriteLog("HDMI matrix", "Error creating devices: " & ex.Message)
            Return 0
        End Try

        Dim SVpair_off As New HomeSeerAPI.VSPair(HomeSeerAPI.ePairStatusControl.Status)
        SVpair_off.PairType = HomeSeerAPI.VSVGPairType.SingleValue
        SVpair_off.Value = 0
        SVpair_off.Status = "None"
        hs.DeviceVSP_AddPair(devref, SVpair_off)

        Dim VGpair_off As New HomeSeerAPI.VGPair
        VGpair_off.PairType = HomeSeerAPI.VSVGPairType.SingleValue
        VGpair_off.Set_Value = 0
        VGpair_off.Graphic = "images/Moskus/icon_hdmi_X.png"
        hs.DeviceVGP_AddPair(devref, VGpair_off)


        'Adding buttons, values and graphic
        For i As Integer = 1 To 4
            hs.DeviceScriptButton_AddButton(devref, output & "-" & i, i, Scriptname, "ButtonPress", output & "-" & i, 1, i, 1)

            Dim SVpair As New HomeSeerAPI.VSPair(HomeSeerAPI.ePairStatusControl.Status)
            SVpair.PairType = HomeSeerAPI.VSVGPairType.SingleValue
            SVpair.Value = i
            SVpair.Status = "Input " & i
            hs.DeviceVSP_AddPair(devref, SVpair)

            Dim VGpair As New HomeSeerAPI.VGPair
            VGpair.PairType = HomeSeerAPI.VSVGPairType.SingleValue
            VGpair.Set_Value = i
            VGpair.Graphic = "images/Moskus/icon_hdmi_" & i & ".png"
            hs.DeviceVGP_AddPair(devref, VGpair)
        Next

        Return devref
    End Function

    Public Sub ButtonPress(Input As Object)
        Dim devref As Integer = Input(0)
        Dim ButtonName As String = Input(1)
        Dim output As String = String.Empty 'Gets filled by GetURLIE

        Dim device As Integer = 0

        Dim master As Integer = hs.GetDeviceParentRefByRef(devref)
        If master = 0 Then master = devref

        Dim dv As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(master)
        For Each devid As Integer In dv.AssociatedDevices(hs)
            Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(devid)
            Select Case dev.Device_Type_String(hs)
                Case Is = "HDMI root"
                    device = 0
                Case Is = "HDMI out 1"
                    device = 1
                Case Is = "HDMI out 2"
                    device = 2
                Case Is = "HDMI out 3"
                    device = 3
                Case Is = "HDMI out 4"

            End Select
        Next

        Dim command As String = "Refresh"

        If device > 0 Then
            Dim value As Integer = hdmi_outputs.ToList.IndexOf(ButtonName)
            command = device & "-" & value
        End If


        Select Case command
            Case Is = "Refresh"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=refrash", True) '"refrash" is actually not a typo on my part...

            Case Is = "1-1"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a09", True)
            Case Is = "1-2"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a1D", True)
            Case Is = "1-3"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a1F", True)
            Case Is = "1-4"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a0D", True)

            Case Is = "2-1"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a17", True)
            Case Is = "2-2"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a12", True)
            Case Is = "2-3"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a59", True)
            Case Is = "2-4"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a08", True)

            Case Is = "3-1"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a5E", True)
            Case Is = "3-2"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a06", True)
            Case Is = "3-3"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a05", True)
            Case Is = "3-4"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a03", True)

            Case Is = "4-1"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a18", True)
            Case Is = "4-2"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a44", True)
            Case Is = "4-3"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a0F", True)
            Case Is = "4-4"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a51", True)
        End Select

        InterpretOutput(devref, output)
    End Sub

    Public Sub InterpretOutput(ByVal devref As Integer, ByVal output As String)
        'output: Output1=1Output2=1Output3=1Output4=1
        Dim data(3) As Integer
        data(0) = CInt(output(8).ToString)
        data(1) = CInt(output(17).ToString)
        data(2) = CInt(output(26).ToString)
        data(3) = CInt(output(35).ToString)

        Dim master As Integer = hs.GetDeviceParentRefByRef(devref)
        If master = 0 Then master = devref

        Dim dv As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(master)
        For Each devid As Integer In dv.AssociatedDevices(hs)
            Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(devid)
            Select Case dev.Device_Type_String(hs)
                Case Is = "HDMI out 1"
                    If hs.DeviceValue(devid) <> data(0) Then
                        hs.SetDeviceValueByRef(devid, data(0), True)
                    Else
                        hs.SetDeviceValueByRef(devid, data(0), False)
                    End If
                Case Is = "HDMI out 2"
                    If hs.DeviceValue(devid) <> data(1) Then
                        hs.SetDeviceValueByRef(devid, data(1), True)
                    Else
                        hs.SetDeviceValueByRef(devid, data(1), False)
                    End If
                Case Is = "HDMI out 3"
                    If hs.DeviceValue(devid) <> data(2) Then
                        hs.SetDeviceValueByRef(devid, data(2), True)
                    Else
                        hs.SetDeviceValueByRef(devid, data(2), False)
                    End If
                Case Is = "HDMI out 4"
                    If hs.DeviceValue(devid) <> data(3) Then
                        hs.SetDeviceValueByRef(devid, data(3), True)
                    Else
                        hs.SetDeviceValueByRef(devid, data(3), False)
                    End If
            End Select
        Next

    End Sub

Gir:

nEibCgm.png

Lenke til kommentar

RandomValue.vb

Setter en eller flere lamper eller en av flere RGB-devicer til en vilkårlig verdi. Festlig for ungene hvis det brukes på en RGB-lampe/stripe! :)

 

Parameter: 100,101,102

... der 100-102 er device ref'er til f.eks R, G og B for en led-stripe. Eller helt uavhengige lamper.

Sub Main(ByVal input As Object)
    Dim generator As New Random
    Dim devices() As String = input.ToString.Split(",")

    For Each d As String In devices
        Dim ref As Integer = CInt(d.Trim)
        Dim newValue As Integer = generator.Next(0, 99)

        Dim CAPIcontrol As HomeSeerAPI.CAPIControl = Nothing
        For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(ref)
            If newValue = cc.ControlValue Then
                CAPIcontrol = cc
                Exit For
            End If
        Next

        If CAPIcontrol IsNot Nothing Then
            hs.CAPIControlHandler(CAPIcontrol)
            CAPIcontrol = Nothing
        Else
            hs.WriteLog("RandomValue script", "CAPI not found for random value " & newValue & " on device " & ref)
        End If

    Next
    generator = Nothing

End Sub
Lenke til kommentar
  • Uderzo avklistret denne emne

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...