Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Script for dimming - Vikarierende feilmelding?


Husmann

Anbefalte innlegg

Jeg har begynt å se litt på scripting for Homeseer og miljøene som brukes ifbm. dette. Visual Studio og Tenscripting er (såvidt) installert.

Det er et stykke vei å gå før jeg begynner å bli litt varm i trøya på dette (har litt programmeringserfaring), men jeg har en utfordring akkurat nå som jeg håpet kanskje noen her kunne hjulpet med.

 

Utfordringen er kort fortalt at jeg har en Heatit Z-push button 8 som er tenkt å styre noen Philips Hue-pærer. Så langt har det gått greit å få den til å slå pærene av og på, men jeg skulle jo gjerne hatt dimming, da.. Etter litt leting kom jeg over dette innlegget på Homeseer-forumet. Her er det et script som tar i mot bl.a. device ref og dimmer device'n opp eller ned. (Det ser ut som om det er bygget bare for en device, så det bør kanskje bygges ut til å takle flere, men det er en annen historie.)

 

Når jeg prøver dette i HS så får jeg feilmeldinger bl.a. om at "System.core" mangler osv. Fullstendige feilmeldinger gjengitt nederst.

 

Her er scriptet gjengitt (minimalt endret) i sin helhet:

 

Public Sub Main(ByVal Parms As Object)
        '' This script should be called when a central scene is set to "held down"
        '' it dims A dimmable device either up Or down until the central scene becomes "key released" or the load hits 99 or 0
        '' Parameters '<device ref #>|<device ref central scene #>|up|<dimrate>' or '<device ref #>|<device ref central scene #>|down|<dimrate>'
        '' ie: 79|78|up|10

        Dim ParmArray() As String
        ParmArray = Parms.ToString.Split(ToChar("|"))

        Dim DeviceRef As Integer = Integer.Parse(ParmArray(0))
        Dim DeviceValue As Integer = hs.DeviceValue(DeviceRef)
        Dim DeviceRefCS As Integer = Integer.Parse(ParmArray(1))
        Dim DeviceValueCS As Integer
        Dim Keyreleased As Integer = 5001

        Dim UpDown As String = ParmArray(2)

        '' DimStep is the increment value for each dim setting
        Dim DimStep As Integer = 3

        If UpDown = "down" Then DimStep = DimStep * -1
        If UpDown = "down" Then Keyreleased = 6001

        '' DimRate is how long to take between dim levels; ie the rate of dimming in milliseconds
        Dim DimRate As Integer = Integer.Parse(ParmArray(3))


        For value As Integer = 0 To 100

            '' increment the dim% value then set min and max values
            DeviceValue = DeviceValue + DimStep
            If DeviceValue > 99 Then DeviceValue = 99
            If DeviceValue < 0 Then DeviceValue = 0

            '' set the device to the current value
            Dim cc As HomeSeerAPI.CAPIControl = hs.CAPIGetSingleControl(DeviceRef, True, "Dim (value)%", False, False)
            cc.ControlValue = DeviceValue
            Dim cr As HomeSeerAPI.CAPIControlResponse = hs.CAPIControlHandler(cc)

            '' get current central scene value
            DeviceValueCS = hs.DeviceValue(DeviceRefCS)

            '' check to see if we should exit the loop
            If DeviceValue = 0 Or DeviceValue = 99 Or DeviceValueCS = Keyreleased Then Exit Sub

            Thread.Sleep(DimRate)
        Next

    End Sub

 

Her er feilmeldingene jeg får i loggen:

 

mar-17 11:45:10

 

Error

Compiling script C:\HS\scripts\dim_updown.vb: 'Thread' is not declared. It may be inaccessible due to its protection level.

mar-17 11:45:10

 

Error

Compiling script C:\HS\scripts\dim_updown.vb: Namespace or type specified in the Imports 'System.Core' doesn't contain any public member or cannot be found. Make sure the namespace or the type is defined and contains at least one public member. Make sure the imported element name doesn't use any aliases.

mar-17 11:45:10

 

Error

Compiling script C:\HS\scripts\dim_updown.vb: 'Thread' is not declared. It may be inaccessible due to its protection level.

mar-17 11:45:10

 

Error

Compiling script C:\HS\scripts\dim_updown.vb: Namespace or type specified in the Imports 'System.Core' doesn't contain any public member or cannot be found. Make sure the namespace or the type is defined and contains at least one public member. Make sure the imported element name doesn't use any aliases.

mar-17 11:45:10

 

Event

Running script in background: C:/HS/scripts/dim_updown.vb

mar-17 11:45:10

 

Event

Event Trigger "Kitchen Heatit8 switch gr3_2 (off) Dim down"

mar-17 11:45:10

 

Event

Running script in background: C:/HS/scripts/dim_updown.vb

mar-17 11:45:10

 

Event

Event Trigger "Kitchen Heatit8 switch gr3_1 (on) Dim up"

mar-17 11:45:10

 

Z-Wave

Device: 2. etg Kitchen Heatit push 8 switch - Central Scene Set to 5002

 

...Er det noen som ser noen umiddelbar grunn til disse feilene? Etter diverse søk har jeg fått forståelsen av at feilen ang. System.Core kan være en vikarierende feilmelding som egentlig skyldes noe helt annet.

 

Takknemlig for all hjelp! ☺️

Lenke til kommentar
Del på andre sider

Takk for tips!

Prøvde det, og System.Core-feilen forsvant, men fikk i steden dette:

 

mar-17 18:47:06   Z-Wave Device: 2. etg Kitchen Heatit push 8 switch - Central Scene Set to 5001
mar-17 18:47:04   Error 1 Running script C:\HS\scripts\dim_updown.vb :Exception has been thrown by the target of an invocation.Object reference not set to an instance of an object.
mar-17 18:47:04   Error 1 Running script C:\HS\scripts\dim_updown.vb :Exception has been thrown by the target of an invocation.Object reference not set to an instance of an object.
mar-17 18:47:04   Event Running script in background: C:/HS/scripts/dim_updown.vb
mar-17 18:47:04   Event Running script in background: C:/HS/scripts/dim_updown.vb
mar-17 18:47:04   Event Event Trigger "Kitchen Heatit8 switch gr3_2 (off) Dim down"
mar-17 18:47:04   Event Event Trigger "Kitchen Heatit8 switch gr3_1 (on) Dim up"
mar-17 18:47:04   Z-Wave Device: 2. etg Kitchen Heatit push 8 switch - Central Scene Set to 5002

 

Noen hint om veien videre herfra? 

Lenke til kommentar
Del på andre sider

Denne linja:

Dim cc As HomeSeerAPI.CAPIControl = hs.CAPIGetSingleControl(DeviceRef, True, "Dim (value)%", False, False)

... forutsetter at lysene som skal dimmes har "labels" som begynner med "Dim ". Og i de siste årene har HomeSeer strøket "Dim " foran. Du kan istedenfor prøve med:

Dim cc As HomeSeerAPI.CAPIControl = hs.CAPIGetSingleControl(DeviceRef, True, "(value)%", False, False)

 

 

...hvis ikke det fungerer, så er det bedre å loope gjennom verdiene som skal settes og hente riktig CAPI derfra:

'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 cc.ControlValue = DIN_VERDI_ELLER_VARIABEL_HER Then
        CAPIcontrol = cc
        Exit For
    End If
Next

'... And execute it
hs.CAPIControlHandler(CAPIcontrol)

 

Du burde kunne bruke det over hvis du erstatter "DIN_VERDI_ELLER_VARIABEL_HER" med "DeviceValue"

Lenke til kommentar
Del på andre sider

Ok, det tok dessverre noen dager før jeg fikk sett på dette igjen, men nå har jeg kommet i mål med en versjon som fungerer.

Takk til @HSv og @Moskus for god hjelp!

 

Her er den versjonen jeg kjører pr i dag:

 

Public Sub Main(ByVal Parms As Object)
        '' This script should be called when a central scene is set to "held down"
        '' it dims A dimmable device either up Or down until the central scene becomes "key released" or the load hits 254 or 1 (values, not %)
        '' Parameters '<device ref #>|<device ref central scene #>|Up/Down|<dimrate>|<csdimKeyUpreleased>|<csdimKeyDownreleased>'
        '' ie: 79|78|Up|10|1001|2001      --> 1001 = typically Central scene dim key 1 (up/on) released, 2001 = typically dim Central scene 2 (down/off) released

        Dim ParmArray() As String
        ParmArray = Parms.ToString.Split("|")

        Dim DeviceRef As Integer = Integer.Parse(ParmArray(0))
        Dim DeviceValue As Integer = hs.DeviceValue(DeviceRef)
        Dim DeviceRefCS As Integer = Integer.Parse(ParmArray(1))
        Dim DeviceValueCS As Integer
        Dim Keyreleased As Integer = Integer.Parse(ParmArray(4))

        Dim UpDown As String = ParmArray(2)

        '' DimStep is the increment value for each dim setting
        Dim DimStep As Integer = 6

        If UpDown = "Down" Then DimStep = DimStep * -1
        If UpDown = "Down" Then Keyreleased = Integer.Parse(ParmArray(5))

        '' DimRate is how long to take between dim levels; ie the rate of dimming in milliseconds
        Dim DimRate As Integer = Integer.Parse(ParmArray(3))

        For value As Integer = 0 To 255

            '' increment the dim value then set min and max values
            DeviceValue = DeviceValue + DimStep
            If DeviceValue > 254 Then DeviceValue = 254
            If DeviceValue < 1 Then DeviceValue = 1

            '' set the device to the current value
            Dim cc As HomeSeerAPI.CAPIControl = hs.CAPIGetSingleControl(DeviceRef, True, UpDown, False, False)
            cc.ControlValue = DeviceValue
            Dim cr As HomeSeerAPI.CAPIControlResponse = hs.CAPIControlHandler(cc)

            '' get current central scene value
            DeviceValueCS = hs.DeviceValue(DeviceRefCS)

            '' check to see if we should exit the loop
            If DeviceValue = 1 Or DeviceValue = 254 Or DeviceValueCS = Keyreleased Then Exit Sub

            System.Threading.Thread.Sleep(DimRate)
        Next

    End Sub

Det er bygget litt ut til også å kunne ta i mot parametre som forteller scriptet hvilken Central scene button som skal holdes styr på.

Scriptet har nok forbedringspotensiale så det holder,  men det virker, i alle fall så lenge det blir foret med riktige verdier.

 

Neste steg blir å utvide det til å ta hensyn til en bevegelsessensor: Ønsket funksjonalitet er at når det ikke har vært bevegelse i rommet på f.eks. 5 min, så skal to av de tre lysene dempes ned (eller opp) til en forhåndsbestemt verdi, samt at de skifter til en varmere fargetemperatur. Når noen går inn i rommet igjen skal de dimmes opp/ned til den verdien og fargetempen de hadde før.

 

For å få til dette må gjeldende dim-verdier lagres før de dimmes til forhåndsbestemt verdi. Tenkte å bruke en VD eller to (ja, uheldig forkortelse.. Er det en annen som er vanlig i bruk?) for å lagre disse verdiene (settes via scriptet). Men er det en smartere måte å gjøre det på? (Den enkleste måten ville kanskje vært med Easy triggers "Set device to another device", men dette fungerte ikke skikkelig sammen med scriptet og satte feil verdier på VD'en)

  • Like 1
Lenke til kommentar
Del på andre sider

  • 1 år senere...

Jeg har samme oppsett med Heatit Z-Push Button og Philips Hue pærer gjennom deCONZ. Scriptet fungerer, men det er forsinkelse fra jeg trykker på bryteren til lyset begynner å dimme. Og dermed fortsetter også lyset å dimme etter at jeg slipper bryteren. Har prøvd å endre dimrate og dimstep, uten at det gjør noen forskjell.

 

Er det noen som har noen tips?

Lenke til kommentar
Del på andre sider

  • 2 måneder senere...

 

Etter klipp og lim tror jeg at jeg har fått dette scriptet til å funke for IKEA Symfonisk mot ei Hue lampe (via zigbee2mqtt)) og en Heatit Z-dim.

Har enheter både med "Dim (value)%" og "(value)%" så har kopiert inn @Moskus sitt tips over.

Også har jeg lagt inn dimstep i eventen siden jeg ønsker å endre både rate og step på de ulike lampene.

Det er merkbart større forsinkelse mot HUE lampa enn Heatit dimmeren. 

 

Bruker akkurat nå 1085|1045|up|50|2|2|1 som input til HUE. 

 

Er det noe mer/bedre måte å sett opp et slikt bryter-dimmer script?

 

 

Spoiler

Public Sub Main(ByVal Parms As Object)
        '' This script should be called when a central scene is set to "held down"
        '' it dims A dimmable device either up Or down until the central scene becomes "key released" or the load hits 99 or 1 
        '' Parameters '<device ref #>|<device ref central scene #>|up/down|<dimrate>|<csdimKeyUpreleased>|<csdimKeyDownreleased>|<dimstep>'
        '' ie: 79|78|up|10|2|2|1     --> 2 = typically dim key stop rotating on my IKEA Symfonisk (independent of direction)

 

        Dim ParmArray() As String
        ParmArray = Parms.ToString.Split("|")

        Dim DeviceRef As Integer = Integer.Parse(ParmArray(0))
        Dim DeviceValue As Integer = hs.DeviceValue(DeviceRef)
        Dim DeviceRefCS As Integer = Integer.Parse(ParmArray(1))
        Dim DeviceValueCS As Integer
        Dim Keyreleased As Integer = Integer.Parse(ParmArray(4))

        Dim UpDown As String = ParmArray(2)

 

        '' DimStep is the increment value for each dim setting
        Dim DimStep As Integer = Integer.Parse(ParmArray(6))

        If UpDown = "down" Then DimStep = DimStep * -1
        If UpDown = "down" Then Keyreleased = Integer.Parse(ParmArray(5))

 

        '' DimRate is how long to take between dim levels; ie the rate of dimming in milliseconds
        Dim DimRate As Integer = Integer.Parse(ParmArray(3))

        For value As Integer = 0 To 100

            '' increment the dim% value then set min and max values
            DeviceValue = DeviceValue + DimStep
            If DeviceValue > 99 Then DeviceValue = 99
            If DeviceValue < 1 Then DeviceValue = 1
            
            'Find the correct CAPI based on device value...
            Dim CAPIcontrol As HomeSeerAPI.CAPIControl = Nothing
            For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(DeviceRef)
                If cc.ControlValue = DeviceValue Then
                    CAPIcontrol = cc
                    Exit For
                End If
            Next
            
            '... And execute it
            hs.CAPIControlHandler(CAPIcontrol)


            '' get current central scene value
            DeviceValueCS = hs.DeviceValue(DeviceRefCS)

            '' check to see if we should exit the loop
            If DeviceValue = 1 Or DeviceValue = 99 Or DeviceValueCS = Keyreleased Then Exit Sub

            System.Threading.Thread.Sleep(DimRate)
        Next

    End Sub

 

Lenke til kommentar
Del på andre sider

  • 1 år senere...
On 03/03/2021 at 12:31, aarpi3 said:

Er det noe mer/bedre måte å sett opp et slikt bryter-dimmer script?

 

 

Jeg trengte å styre noen lamper fra en annen plass en dimmeren så kjøpte en Heatit Z-push wall controller.

Lampene er koblet til en Heatit Z-dim og får styrt lampene med Z-push.

Dessverre er  dimming med med Event'er og scriptet over  IKKE bra nok for alle i huset :(

Det største problemet er at dimmingen ikke slutter fort nok etter at en har sluppet bryteren.

 

Finnes det noe bedre måte å dimme lys på med script?

Akkurat med Z-Push kunne jeg testa ut associations hvis jeg hadde klart å vekke den.

Men spørsmålet gjelder også andre brytere jeg bruker som Hue dimmer.

Lenke til kommentar
Del på andre sider

Ja, Heatit Z-push wall controller er Z-wave så assosiasjoner mot en z-dim burde fungere fint. Problemet med det er at jeg ikke klarer å holde den våken slik at jeg får satt det opp.

Men generelt hadde jeg håpet at kontinuerlig dimming med event og skript var bedre slik at jeg kunne brukt enklere Zigbee kontrollere som Hue dimmer.

Lenke til kommentar
Del på andre sider

  • 2 uker senere...
On 30/03/2022 at 08:48, aarpi3 said:

Problemet med det er at jeg ikke klarer å holde den våken slik at jeg får satt det opp.

Bare fortsett å trykk ned de to øverste knappene fortløpende (dvs. iallfall innimellom) når du konfigurerer den. Ikke ideelt eller i henhold til manualen, men det fungerer.

  • Like 1
Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.