Gå til innhold
  • Bli medlem
Moskus

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

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 6

Del dette innlegget


Lenke til innlegg
Del på andre sider

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

 

 

Del dette innlegget


Lenke til innlegg
Del på andre sider

For spillelister er er det kanskje lettere å bruke eventer enn å bruke dette scriptet. :) 

Så må du redigere scriptet med å fjerne oppsjoner for side 3-6... får ikke sett på det akkurat nå.

  • Like 1

Del dette innlegget


Lenke til innlegg
Del på andre sider

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Fjern formatering

  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.


  • Lignende innhold

    • Av Blodstrupmoen
      Min Fibaro universal sensor begynte i går å sende masse gjentakende rapporteringer på z-wave nettverket mitt slik at kontrolleren knelte. Etter en restart av noden har den fortsatt og sende doble postinger av alle rapporteringer. Er det noen som har opplevd det samme, og her en løsning på dette?

    • Av kmlugg
      Kanskje greit med en generell tråd, så ikke det blir en ny per lille fillespørsmål.
       
      Jeg har fått opp min første z-wave enhet i hass. Men da fikk jeg to. Hva er greia med det?
       

    • Av Moskus
      Dette scriptet lar deg hente inn trafikkinformasjon fra EnTur.  
       
      Finne reiseruter, IDer for "StopPlace" og "Quay"
      Å bruke scriptet er ikke så vanskelig. Det vanskelige er å finne IDene til stasjonene du vil spore. 
       
      La oss si at jeg vil finne alle busser som går fra "Tasta Senter" (og mot Stavanger sentrum, men det kommer vi tilbake til)
      Gå til en-tur.no Tast inn stoppesteder til og fra Kopier URL'en fra nettleseren etter søket (f.eks. som denne) inn URLdecoder.org for å gjøre den lettere å lese. Finn "startID" og kopier ut strengen som begynner med "NSR:". For Tasta Senter er denne "NSR:StopPlace:28163"  
      Oppdatering: Etter tips fra @Odd Are er det enklere å gå hit med brukernavn/passord guest/guest og hente QuayIDer og StopPlaceIDer derfra.
       

       
      Vel og bra!  Nå vet vi at busstoppet ved Tasta Senter heter "NSR:StopPlace:28163". Men et busstopp kan faktisk ha flere plattformer, f.eks. en på hver side av veien. Det heter visst "Quay" på engelsk.
       
      Jeg er ikke interessert i begge sider av veien for kun en av dem har vanligvis trafikk mot sentrum. For å finne Quay, må vi bruke GraphQL-exploreren til EnTur (som dessverre ikke er like forseggjort som Tibber sin). Vi er interessert i denne spørringen som finner alle avganger for et stoppested, og vi må endre id: "NSR:StopPlace:28163" og avgangstiden (startTime:"2018-06-19T09:00:00+0200") til det riktige. I skrivende stund ser min spørring slik ut. 
       
      Så går vi gjennom resultatene, vi skal prøve å finne riktig "Quay".
       
      Det første treffet er inneholder denne teksten:
      "destinationDisplay": { "frontText": "Tasta - Vardeneset" }, "quay": { "id": "NSR:Quay:48450" }, ... men en buss med "Tasta - Vardeneset" tar meg i feil retning! Ergo er "NSR:Quay:48450" ikke riktig.
       
      Det neste treffet inneholder dette:
      "destinationDisplay": { "frontText": "Stavanger" }, "quay": { "id": "NSR:Quay:48449" }, Jepp! Riktig! Altså kan vi filtrere på "NSR:Quay:48449" for å finne avganger fra "NSR:StopPlace:28163" som kun går mot Stavanger.
       
       
       
      Installasjon
      Du trenger en referanse til Newtonsoft.Json.dll for at scriptet skal fungere. Json er mye i bruk i dag, og siden jeg har oppdaget at Webclient nå er innebygget i HS3 (og superenkel å bruke), så er det bare å legge inn Json-støtte for scripting også.
       
      Lukk HS3. Åpne settings.ini Finn linjen som begynner med ScriptingReference= Vanligvis står det kun System.Core;System.Core.dll. Vi skal legge til Newtonsoft bak der. Hos meg (på Windows) skal linjen da se slik ut:  
      ScriptingReferences=System.Core;System.Core.dll,Newtonsoft.Json;C:\Program Files (x86)\HomeSeer HS3\Bin\homeseer\Newtonsoft.Json.dll Lagre og start HS3 igjen. For Linux skal den muligens se slik ut, men du må sjekke plasseringen på /bin/homeseer/Newtonsoft.Json.dll selv.
      ScriptingReferences=System.Core;System.Core.dll,Newtonsoft.Json;/usr/local/HomeSeer/bin/homeseer/Newtonsoft.Json.dll  
       
      Kopier scriptet under og lagre det som EnTur.vb. Etter massiv testing fra @Tor-Erik er vi ganske sikre på at det også kjører på Linux.  
       
      EnTur.vb:
       
       
      Du må også lage deg noen devicer selv for å faktisk vise data. Dette gjør foreløpig ikke scriptet for deg. Den trenger ingen status values, men kanskje en enkel status Graphics for å ha et ikon (istedenfor Off/Dim/On-ikoner)
        

       

       
       
       
      Så trenger vi et event for å oppdatere teksten. Dette kan f.eks. kjøre hvert minutt.
      Parametre for funksjonen "CallsFromStopplace" er deviceID, stopplaceID, quayID (optional), antall_avganger (optional).
       

       
      Du kan ha flere script-kall i et event, hvis du har flere stopp, avganger, etc du vil kontrollere.  
       

       
       
      Parametre for funksjonen "TripsBetweenStops" er deviceID, stopplaceID (fra), stopplaceID (til), antall_avganger (optional). Det er et enkelt ruteoppslag, fint fra større stasjoner (f.eks. "Stavanger") til et bestemt stoppested.
       
      DeviceValue i hver device er antall minutter til neste avgang. Kan brukes til automasjon.  
       

       
       
      EDIT:
      Oppdatert juli 2019 pga. flytting av URL for EnTur APIet. Gjeldene URL er nå: https://api.entur.io/journey-planner/v2/graphql
      Oppdatert januar 2020 pga. bruk av TSL12.
       
    • Av Lundefuglen
      Hei, og god jul 🙂
       
      Driver å bygger en hytte, og har planer om å gjøre det relativt smart med gode muligheter for å bli smartere. I skrivende stund legger vi skjult anlegg (jobber personlig som elektriker, men har ikke mye erfaringer med smarthus). Har prøvd å lest meg klok på forumet, og har lagd meg en plan på det jeg ønsker. Allikevel regner jeg med og håper dere har noen gode innspill og forbedringer å komme med  
       
      Brukervennlighet står høyt, og det er viktig med fysiske brytere i alle rom. Det kommer til å bli brukt av diverse gjester så er viktig de klarer å skru av og på lyset  
       
      Planen var originalt å bruke Atom Homey, men har gått over til HomeSeer (Zee S2) da det var gode guider på forumet og lettere å finne svar på det man lurer på. 
      Av lysstyring så er planen å bruke fibaro sine aktuatorer, og utifra det jeg har lest er dette noe ala xcomfort i størrelse som passer fint inn i en normal veggboks.
      Til varmekabler var planen å bruke Heatit
      Har også en google home jeg tenkte å få inn i systemet.
      Er også en del varmeovner, her har jeg ikke sett så nøye enda men regner med at det finnes plenty av muligheter for smarte varmeovner. 
      Har heller ikke sett så altfor mye på brannvarslingen, men tenker å bruke kablet NEST detektorere. 
      Har også prosjektert til astrour, har sett litt uten å finne noe smart astrour. Er det noen bedre løsninger som gir samme resultat bare med mulighet til å overstyre i app/bryte?.
      Vil også gjerne ha brytere med scenarioer i stue/kjøkken - er det da en trådløs bryter man kobler opp til HS? Gjerne en med 3+ brytermuligheter og ligner nogenlunde på elko. 
       
      Håper dette ser ut som et ok utgangspunkt, og tar gjerne imot tips eller forbedringer.
       
      Så til neste del av spørsmålet - nå som veggen er åpen og jeg enkelt kan legge strøm/tomrør dit jeg vil, hva burde jeg tenke på. 
       
      Vil ha muligheter senere til å oppgradere på den beste måten. 
       
      Har tenkt på å sette enkle stikkontakter i hjørner (v/tak) f.eks på stue hvis Sonos el. skulle bli aktuelt.
      Smartere dørlåser? Er alt trådløst eller burde jeg legge ved noe ekstra? (dette er ikkenoe vi skal ha med det første, men fint å ha mulighet)
      Ethernet? Er det noe uvanlig sted jeg trenger det? Enn så lenge er ruteren prosjektert bak TV, med et rør opp til 2 etg.
       
      Takk for alle svar og forslag, imens skal jeg lese rundt på forumet og prøve å bli klokere 🙂 
    • Av Moskus
      Det er det samme maset hvert år: "Hvorfor må vi alltid ha disse kjedelige juletrelysene? Klart jeg kan bruke RGBW-lys, men de er så... statiske.". Vi har alle vært der.
       
      Vel, Twinkly er svaret. Det er juletrelys som kan styres via en app, man kan legge til animasjoner, og man kan til og med lage egne og "tegne" fargene på treet i sanntid. Og nå kan man også selvfølgelig styre treet fra HomeSeer.
       
      Lagre scriptet under som Twinkly.vb i /scripts-mappen, endre IPen (nest øverste linje), og lag et event der du kjører "Setup"-funksjonen.
      'Moskus 2019 Const IP As String = "192.168.0.166" Dim debug As Boolean = False Public Sub Main(ByVal something As Object) End Sub Public Sub ButtonPress(ByVal input As Object) Dim deviceRef As Integer = input(0) Dim cmd As String = input(1) If DoCmd(cmd) Then hs.SetDeviceString(deviceRef, cmd, True) End Sub Public Function DoCmd(ByVal command As String) As Boolean 'SetMode("rt") 'SetMode("demo") 'SetMode("movie") 'SetMode("effect") 'SetMode("off") If debug Then hs.WriteLog("Twinkly", "Starting DoCmd()") Dim code As String = GetRandomCode() If debug Then hs.WriteLog("Twinkly", "Code: " & code) Dim auth As TwinklyAuthentication = Login(code, forceNew:=True) If debug Then hs.WriteLog("Twinkly", "Authentication_token: " & auth.authentication_token) Dim success As Boolean = Verify() If debug Then hs.WriteLog("Twinkly", "Verified: " & success) SetMode(command) Return True End Function Public Sub Setup(ByVal not_used As String) Dim new_ref As Integer = hs.NewDeviceRef("Twinkly") Dim dv As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(new_ref) dv.Location(hs) = "Twinkly" dv.Location2(hs) = "Twinkly" dv.Can_Dim(hs) = False dv.DeviceType_Set(hs) = New HomeSeerAPI.DeviceTypeInfo dv.Status_Support(hs) = True dv.Can_Dim(hs) = False dv.MISC_Set(hs, HomeSeerAPI.Enums.dvMISC.SHOW_VALUES) 'This is &H100 dv.MISC_Clear(hs, HomeSeerAPI.Enums.dvMISC.STATUS_ONLY) 'This is &H10 hs.SaveEventsDevices() AddDeviceButtons(new_ref) hs.WriteLog("Twinkly", "Initiation done!") End Sub Public Sub AddDeviceButtons(ByVal device_ref As String) Dim devID As Integer = CInt(device_ref) hs.DeviceScriptButton_DeleteAll(devID) hs.DeviceProperty_dvMISC(device_ref, HomeSeerAPI.Enums.eDeviceProperty.MISC_Set, HomeSeerAPI.Enums.dvMISC.SHOW_VALUES) Try hs.WriteLog("Twinkly", "Added button 1: " & hs.DeviceScriptButton_AddButton(devID, "Movie", 1, "Twinkly.vb", "ButtonPress", "Movie", 1, 1, 1)) hs.WriteLog("Twinkly", "Added button 2: " & hs.DeviceScriptButton_AddButton(devID, "Effect", 2, "Twinkly.vb", "ButtonPress", "Effect", 1, 2, 1)) hs.WriteLog("Twinkly", "Added button 3: " & hs.DeviceScriptButton_AddButton(devID, "Demo", 3, "Twinkly.vb", "ButtonPress", "Demo", 1, 3, 1)) hs.WriteLog("Twinkly", "Added button 4: " & hs.DeviceScriptButton_AddButton(devID, "RT", 4, "Twinkly.vb", "ButtonPress", "RT", 2, 1, 1)) hs.WriteLog("Twinkly", "Added button 5: " & hs.DeviceScriptButton_AddButton(devID, "Off", 0, "Twinkly.vb", "ButtonPress", "Off", 2, 2, 1)) Catch ex As Exception hs.WriteLog("Twinkly", "Error adding buttons: " & ex.Message) End Try End Sub Public Sub SetMovieConfig(ByVal frameDelay As Integer, ByVal numberOfLEDs As Integer, ByVal framesNumber As Integer, ByVal loopType As Integer) Dim data As New System.Collections.Generic.Dictionary(Of String, Integer) data.Add("frame_delay", frameDelay) data.Add("leds_number", numberOfLEDs) data.Add("frames_number", framesNumber) Dim output As String = RunAPI("led/movie/config", Newtonsoft.Json.JsonConvert.SerializeObject(data)) If debug Then hs.WriteLog("Twinkly", "SetMovieConfig: " & output) End Sub Public Sub GetMovieConfig() ' {"frame_delay":66,"leds_number":175,"loop_type":0,"frames_number":212,"sync":{"mode":"none","slave_id":"","master_id":""},"code":1000} Dim output As String = RunAPI("led/movie/config") If debug Then hs.WriteLog("Twinkly", "GetMovieConfig: " & output) End Sub Public Sub GetMovieFull() If debug Then hs.WriteLog("Twinkly", "GetMovieFull: ") Dim output As Byte() = RunAPIraw("led/movie/all") If debug Then hs.WriteLog("Twinkly", ConvertByteArrayToString(output) & " ... done!") End Sub Public Sub SetMovieFull(ByVal octetString As String) Dim movie() As Byte = ConvertStringToByteArray(octetString) If debug Then hs.WriteLog("Twinkly", "SetMovieFull: ") Dim ret = RunAPIraw("led/movie/full", movie) If debug Then hs.WriteLog("Twinkly", System.Text.Encoding.ASCII.GetString(ret) & " ... done!") End Sub ''' <summary> ''' Sets the display ''' </summary> ''' <param name="mode">rt, movie, demo, restart, effect, off</param> Public Sub SetMode(ByVal mode As String) If debug Then hs.WriteLog("Twinkly", "Setting mode to '" & mode & "'") Dim data As New System.Collections.Generic.Dictionary(Of String, String) data.Add("mode", mode.ToLower()) Dim output As String = RunAPI("led/mode", Newtonsoft.Json.JsonConvert.SerializeObject(data)) Dim success As Boolean = output.Contains("1000") If debug Then hs.WriteLog("Twinkly", "Mode set: " & IIf(success, " was a success!", " failed. :(")) If Not success And debug Then hs.WriteLog("Twinkly", "Output: " & output) End Sub Public Function GetAuthentication() As TwinklyAuthentication Dim auth As TwinklyAuthentication = New TwinklyAuthentication Dim authString As String = hs.GetINISetting("Twinkly", "Authentication", "", "Twinkly.ini") Try If authString <> "" Then auth = Newtonsoft.Json.JsonConvert.DeserializeObject(Of TwinklyAuthentication)(authString) End If Catch ex As Exception End Try Return auth End Function Public Function Verify() As Boolean Dim auth As TwinklyAuthentication = GetAuthentication() Dim data As New System.Collections.Generic.Dictionary(Of String, String) data.Add("challenge-response", auth.challengeresponse) Dim output As String = RunAPI("verify", Newtonsoft.Json.JsonConvert.SerializeObject(data)) Return output.Contains("1000") End Function Public Function Login(ByVal challenge As String, Optional ByVal forceNew As Boolean = False) As TwinklyAuthentication Dim auth As TwinklyAuthentication = Nothing Dim authString As String = "" authString = hs.GetINISetting("Twinkly", "Authentication", "", "Twinkly.ini") Try If authString <> "" Then auth = Newtonsoft.Json.JsonConvert.DeserializeObject(Of TwinklyAuthentication)(authString) Catch ex As Exception End Try If auth Is Nothing OrElse forceNew Then Dim data As New System.Collections.Generic.Dictionary(Of String, String) data.Add("challenge", challenge) Dim output As String = RunAPI("login", Newtonsoft.Json.JsonConvert.SerializeObject(data)) hs.SaveINISetting("Twinkly", "Authentication", output, "Twinkly.ini") auth = Newtonsoft.Json.JsonConvert.DeserializeObject(Of TwinklyAuthentication)(output) End If Return auth End Function Private Function RunAPI(ByVal urlFunction As String, Optional ByVal query As String = "") As String Dim source As String = "" Dim url As String = "http://" & IP & "/xled/v1/" & urlFunction Dim auth As TwinklyAuthentication = GetAuthentication() Using client As New System.Net.WebClient client.Headers.Add("Content-Type", "application/json") If auth.authentication_token <> "" Then client.Headers.Add("X-Auth-Token", auth.authentication_token) End If If query <> "" Then source = client.UploadString(url, "POST", query) Else source = client.DownloadString(url) End If End Using Return source End Function Private Function RunAPIraw(ByVal urlFunction As String, Optional ByVal bytes() As Byte = Nothing) As Byte() Dim auth As TwinklyAuthentication = GetAuthentication() Dim source As Byte() = {} Dim url As String = "http://" & IP & "/xled/v1/" & urlFunction Using client As New System.Net.WebClient Net.ServicePointManager.DefaultConnectionLimit = 9999 client.Headers.Add("Content-Type", "application/octet-stream") If auth.authentication_token <> "" Then client.Headers.Add("X-Auth-Token", auth.authentication_token) End If If bytes IsNot Nothing Then source = client.UploadData(New Uri(url), bytes) Else source = client.DownloadData(url) End If End Using Return source End Function Public Function GetRandomCode(Optional ByVal forceNew As Boolean = False) As String Dim code As String = hs.GetINISetting("Twinkly", "Code", "", "Twinkly.ini") If code = "" OrElse forceNew Then code = GetRandomString(32) hs.SaveINISetting("Twinkly", "Code", code, "Twinkly.ini") End If Return code End Function Private Function GetRandomString(ByVal length As Integer) Dim s As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" Dim r As New Random Dim sb As New Text.StringBuilder For i As Integer = 0 To length - 1 Dim idx As Integer = r.Next(0, 35) sb.Append(s.Substring(idx, 1)) Next Return sb.ToString() End Function Public Function ConvertStringToByteArray(ByVal input As String) As Byte() Dim lst As New System.Collections.Generic.List(Of Byte) For i As Integer = 0 To input.Length - 1 Step 2 Dim temp As String = input.Substring(i, 2) Dim val As Integer = Convert.ToInt32(temp, 16) lst.Add(Convert.ToByte(val)) Next Return lst.ToArray() End Function Public Function ConvertByteArrayToString(ByVal bytes() As Byte) As String Dim ret As String = "" For Each b As Byte In bytes ret &= Convert.ToChar(b).ToString() Next Return ret End Function Public Class TwinklyAuthentication Private _authentication_token As String Public Property authentication_token() As String Get Return _authentication_token End Get Set(ByVal value As String) _authentication_token = value End Set End Property Private _authentication_token_expires_in As Integer Public Property authentication_token_expires_in() As Integer Get Return _authentication_token_expires_in End Get Set(ByVal value As Integer) _authentication_token_expires_in = value End Set End Property Private _challengeresponse As String Public Property challengeresponse() As String Get Return _challengeresponse End Get Set(ByVal value As String) _challengeresponse = value End Set End Property Private _code As Integer Public Property code() As Integer Get Return _code End Get Set(ByVal value As Integer) _code = value End Set End Property End Class
×
×
  • Opprett ny...