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

SCRIPT: Styre lys (RGB?) med en Xiaomi MiCube


Moskus

Anbefalte innlegg

Jeg har lurt litt på hvordan jeg kan bruke RGB-lys og en MiCube fra Xiaomi (lett integrerbart i HomeSeer med deCONZ/JowiHue). Har laget et par scripts til det. Se bloggen for en video.

 

Det første justerer lysstyrken med å vri på kuben. Hvilket farge (eller lys) den styrer er avhengig av hvilken side som vender opp.

Settes opp slik:

image.png

 

... og i eksempelet over er 2566 er rotasjon-devicen, 2565 er side-devicen. 900, 901 og 902 er devicer for hhv. rød, grønn og blå. Den oppmerksomme leser vil legge merke til at det er mulig å styre flere lys samtidig (greenID1+greenID2+....). F.eks. ville 990+1045+1077 styre tre forskjellige lys. Praktisk hvis man har flere RGB-lenker i samme rom. Jeg bruker den muligheten i stua.

 

MiCube_RGB.vb

Spoiler

Sub Main(parms As Object)
        'Moskus 2018
        'Parameter: rotationID,sideID,redID1+redID2+...,greenID1+greenID2+...,blueID1+blueID2+...

        Dim input() As String = parms.ToString.Split(",")
        Dim rotationDevice As String = input(0).ToString
        Dim sidesDevice As String = input(1).ToString

        Dim redDevices() As String = input(2).ToString.Split("+")
        Dim greenDevices() As String = input(3).ToString.Split("+")
        Dim blueDevices() As String = input(4).ToString.Split("+")
        Dim controlDevices() As String = Nothing

        Dim rotation As Double = hs.DeviceValueEx(rotationDevice)
        Dim side As Integer = hs.DeviceValue(sidesDevice)
        If side.ToString.StartsWith("1") Then
            controlDevices = redDevices
        ElseIf side.ToString.StartsWith("2") Then
            controlDevices = greenDevices
        ElseIf side.ToString.StartsWith("3") Then
            controlDevices = blueDevices
        ElseIf side.ToString.StartsWith("4") Then
            controlDevices = blueDevices
        ElseIf side.ToString.StartsWith("5") Then
            controlDevices = greenDevices
        ElseIf side.ToString.StartsWith("6") Then
            controlDevices = redDevices
        Else
            Exit Sub
        End If


        Dim lastValue As Integer = hs.DeviceValue(controlDevices(0))
        Dim newValue As Integer = CInt(lastValue + rotation*100/180)
        If newValue < 0 Then newValue = 0
        If newValue > 99 Then newValue = 99


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

    End Sub

 

Du trenger selvfølgelig ikke bruke rød, grønn og blå, du kan bruke andre devicer så lenge de bruker vanlige 0-99-nivåer. Med en liten endring kan du styre opp til 6 forskjellige lys fra en kube. :)

 

 

image.png

 

 

 

 

Det andre scriptet skal skru av og på med et "dobbelt tap", men kan også brukes til å styre noe når siden flippes over.

image.png

 

Her trengs kun side-rotasjonen, men har et ekstra tillegg for å skru av alle lys. Device 989 er "all colors" på en Fibaro RGBW modul.

 

MiCube_side.vb

Spoiler

 


Sub Main(parms As Object)
        'Moskus 2018
        'Parameter: sideID,redID1+redID2+...,greenID1+greenID2+...,blueID1+blueID2+...,allDeviceIDs

        Dim input() As String = parms.ToString.Split(",")
        Dim sidesDevice As String = input(0).ToString

        Dim redDevices() As String = input(1).ToString.Split("+")
        Dim greenDevices() As String = input(2).ToString.Split("+")
        Dim blueDevices() As String = input(3).ToString.Split("+")
        Dim allDevices() As String = input(4).ToString.Split("+")
        Dim controlDevices() As String = Nothing

        Dim side As Integer = hs.DeviceValue(sidesDevice)

        'Double tap
        If side = 1001 Then
            controlDevices = redDevices
        ElseIf side = 2002 Then
            controlDevices = greenDevices
        ElseIf side = 3003 Then
            controlDevices = blueDevices
        ElseIf side = 4004 Then
            controlDevices = blueDevices
        ElseIf side = 5005 Then
            controlDevices = greenDevices
        ElseIf side = 6006 Then
            controlDevices = redDevices

        ElseIf side = 7007 Then '"Stirred well"
            For Each d As Integer In allDevices
                TurnOff(d)
                Exit Sub
            Next


        Else
            Exit Sub
        End If


        For Each d As Integer In controlDevices
            SmartToggle(d)
        Next

    End Sub


    Sub SmartToggle(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

    Sub TurnOff(ByVal input As Object)
        Dim control As String = input
        Dim devicevalue As Double = hs.DeviceValueEx(control)

        Dim capi As HomeSeerAPI.CAPIControl = hs.CAPIGetSingleControl(input, True, "off", False, False)
        If capi IsNot Nothing Then
            hs.CAPIControlHandler(capi)
        Else
            hs.WriteLog("Off", "Could not execute CAPIcontrol, it's nothing! (Input device value: " & devicevalue & ")")
        End If
    End Sub

 

 

 

 

  • Like 7
Lenke til kommentar
Del på andre sider

  • 7 måneder senere...

Hei Magnus

 

Meget bra jobbet her, får min Cube idag.

 

Kunne du peket meg litt i riktig retning her, hva må endres i script?

 

Jeg tenkte å benytte dette på min datters rom for å styre spotter(Fibaro Dimmer 2), Nattlampe (Trådfri E14), Sonos Beam.

 

Jeg tenker side 1 og 2 til lys og 3-6 trigger forskjellige Sonos playlister via et vanlig event, men styring av Sonos Volum på disse sidene og dobble tap for stop

 

Feks

Side 1: Spotter lysstyrke, dobble tap for å skru av

Side 2: Nattlampe, lysstyrke, dobble tap for å skru av

Side 3-6: Sonos Volum (Vil det være mulig å styre "player stop(1002)" dobble tap, den ligger på en annen id enn volum)

 

Spotter ID: 2768

Nattlampe ID: 2267

Sonos Volum ID: 2684

Sonos Player ID: 3674

 

Mvh

Kim

 

 

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.