Gå til innhold
  • Bli medlem
Moskus

SCRIPT: Twinkly.vb - Juletrelys med forhåndsdefinerte og egne animasjoner

Anbefalte innlegg

Twinkly.gif

 

 

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

image.png

  • Like 4

Del dette innlegget


Lenke til innlegg
Del på andre sider
1 time siden, gullfrode skrev:

Er vel bare å bytte IP i starten og kalle scriptet noe annet?

Ikke bare. Du må da også bytte ut "Twinkly.vb" navnet  i AddDeviceButtons. Men ellers er det slik.

Del dette innlegget


Lenke til innlegg
Del på andre sider

Hei,

Takk for at du deler.  Jeg har ingen kompetanse på VBscript og får det ikke til å kjøre hos meg. Kan det være at dette scriptet kun kjører godt i Windows?

Jeg kjører HS3 i Linux.

 

Dec-21 09:58:29   Error Compiling script /HomeSeer/scripts/Twinkly.vb: 'i'.
Dec-21 09:58:29   Error Compiling script /HomeSeer/scripts/Twinkly.vb: 'Newtonsoft' is not declared. It may be inaccessible due to its protection level.
Dec-21 09:58:29   Error Compiling script /HomeSeer/scripts/Twinkly.vb: 'Newtonsoft' is not declared. It may be inaccessible due to its protection level.
Dec-21 09:58:29   Error Compiling script /HomeSeer/scripts/Twinkly.vb: 'Newtonsoft' is not declared. It may be inaccessible due to its protection level.
Dec-21 09:58:29   Error Compiling script /HomeSeer/scripts/Twinkly.vb: 'ex'.
Dec-21 09:58:29   Error Compiling script /HomeSeer/scripts/Twinkly.vb: 'Newtonsoft' is not declared. It may be inaccessible due to its protection level.
Dec-21 09:58:29   Error Compiling script /HomeSeer/scripts/Twinkly.vb: 'Newtonsoft' is not declared. It may be inaccessible due to its protection level.
Dec-21 09:58:29   Error Compiling script /HomeSeer/scripts/Twinkly.vb: 'ex'.
Dec-21 09:58:29   Error Compiling script /HomeSeer/scripts/Twinkly.vb: 'Newtonsoft' is not declared. It may be inaccessible due to its protection level.
Dec-21 09:58:29   Error Compiling script /HomeSeer/scripts/Twinkly.vb: 'Newtonsoft' is not declared. It may be inaccessible due to its protection level.
Dec-21 09:58:29   Error Compiling script /HomeSeer/scripts/Twinkly.vb: Function without an 'As' clause; return type of Object assumed.
Dec-21 09:58:29   Error Compiling script /HomeSeer/scripts/Twinkly.vb: Variable declaration without an 'As' clause; type of Object assumed.
Dec-21 09:58:29   Error Compiling script /HomeSeer/scripts/Twinkly.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.
Dec-21 09:58:29   Event Running script in background: /HomeSeer/scripts/Twinkly.vb("Setup")

 

Del dette innlegget


Lenke til innlegg
Del på andre sider
59 minutter siden, einarli skrev:

Kan det være at dette scriptet kun kjører godt i Windows?

Jeg kjører HS3 i Linux.

Det er ikke testet på Linux, men programmert for å kunne støtte det. (Ellers er det en del forenklinger jeg hadde valgt)

 

 

Men det er en ting jeg har glemt å nevne! Sorry! :( 

Du trenger en referanse til Newtonsoft.Json.Dll. Beskrivelsen om hvordan du legger til det finnes under "Installasjon" for EnTur.vb-scriptet.

Del dette innlegget


Lenke til innlegg
Del på andre sider

Testet på Linux her også nå - funket helt topp! :) så nå har jeg fjernet den store Nexa-klumpen jeg hadde brukt for smart on/off frem til nå. ;) 

  • Like 1

Del dette innlegget


Lenke til innlegg
Del på andre sider

Har ikke fått testet scriptet enda, men det så såppas interessant ut at jeg måtte innom kjell og handle en twinkly lenke like før jul.

Har lekt litt med den kun via appen, og er forsåvidt ganske imponert over lysene.

 

Nå lurer jeg imidlertid litt på hva knappene til devicen gjør?  jeg ser referanse til i koden til movie, men hva med RT/Effect/Demo ?

Kan man lage egne knapper til egendefinerte scener? Og så lurer jeg på hvor i konfigen du peker en devicebutton til hvilket script/funksjon i scriptet.

Del dette innlegget


Lenke til innlegg
Del på andre sider
2 timer siden, Gjelsvik skrev:

Nå lurer jeg imidlertid litt på hva knappene til devicen gjør?  jeg ser referanse til i koden til movie, men hva med RT/Effect/Demo ?

Kan man lage egne knapper til egendefinerte scener?

Man kan pr. nuh ikke lage egendefinerte scener. For det er litt plunder. Man må sniffe trafikken og lagre det, sammen med noen innstillinger. Jeg hadde håpet at det var enklere enn det, men sånn flaks har vi ikke hatt til nå...

 

RT er faktisk bare "Pause". "Effekt" er en innebygget "movie". "Demo" er jeg faktisk ikke helt sikker på hva gjør... :P

 

2 timer siden, Gjelsvik skrev:

Og så lurer jeg på hvor i konfigen du peker en devicebutton til hvilket script/funksjon i scriptet.

Sjekk sub'en "AddDeviceButtons".

Del dette innlegget


Lenke til innlegg
Del på andre sider
12 timer siden, einarli skrev:

Jeg har GOLD AWW LEDs. Var mest opptatt av å kunne styre varme styrke på lysene og ikke så mye farge.

OK, de kan jeg ingenting om. Hvilke er det?

Del dette innlegget


Lenke til innlegg
Del på andre sider

 

På 27.12.2019 den 12.00, Moskus skrev:

OK, de kan jeg ingenting om. Hvilke er det?

 

Det er også fra Twinkly, men ikke RGB LED,  De har varme nyanser fra helt hvit til veldig varmt lys og mulighet for dimming.

 

Del dette innlegget


Lenke til innlegg
Del på andre sider
10 timer siden, einarli skrev:

Det er også fra Twinkly, men ikke RGB LED,  De har varme nyanser fra helt hvit til veldig varmt lys og mulighet for dimming.

 

OK, de har jeg ikke kontroll på. Scriptet er bare basert på de APIene som andre har funnet frem til med reverse engineering.

 

Men noen kan sikkert sniffe seg frem til disse også... :)

Del dette innlegget


Lenke til innlegg
Del på andre sider

Litt off topic:

En DIY versjon av Twinkly.

Hvis en har en nodeMCU og noen ledløkker liggende så kan vel wled gjøre noe tilsvarende https://github.com/Aircoookie/WLED

Er klar for både MQTT & E1.31

 

Jeg hadde store planer i år, men det er vist veto mot RGB på Juletreet...

 

Integrasjon til Home Assistant (!HA) er klar ser det ut til https://selfhostedhome.com/christmas-tree-lights-using-wled/

 

Del dette innlegget


Lenke til innlegg
Del på andre sider
On 27/12/2019 at 11:59, Moskus said:

Man kan pr. nuh ikke lage egendefinerte scener. For det er litt plunder. Man må sniffe trafikken og lagre det, sammen med noen innstillinger. Jeg hadde håpet at det var enklere enn det, men sånn flaks har vi ikke hatt til nå...

 

RT er faktisk bare "Pause". "Effekt" er en innebygget "movie". "Demo" er jeg faktisk ikke helt sikker på hva gjør... :P

 

Sjekk sub'en "AddDeviceButtons".

 Så det eneste du kan gjøre via dette scriptet er basicly pause en animasjon som er startet fra appen?

 

"movie" er ikke et begrep jeg kjenner igjen noe sted fra twinkly appen.

Del dette innlegget


Lenke til innlegg
Del på andre sider
2 timer siden, Gjelsvik skrev:

 Så det eneste du kan gjøre via dette scriptet er basicly pause en animasjon som er startet fra appen?

Du kan starte valgt effekt fra app'en (som er det som heter "movie"), du kan kjøre en demo (dvs "effect"), du kan pause ("RT") og skru den av.

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 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 clio75
      Hva skal hentes denne uka er et gjentagende SPM hjemme hos oss. 
      Så jeg fant APPEN "Min renovasjon.". Men en app er jo ikke løsningen på noe. For man vil jo ha denne informasjonen inn i homeseer. 
       
      MinRenovasjon.vb
      Sub Main(ByVal parameters As Object) 'Clio75 All Credits to Moskus@hjemmeautomasjon.no 'Inspired and based on Moskus scrip NewsReader.vb Dim DevID As Integer = parameters.ToString.Split("|")(0) Dim KommuneNr As String = parameters.ToString.Split("|")(1) Dim Gatekode As String = parameters.ToString.Split("|")(2) Dim GateNavn As String = parameters.ToString.Split("|")(3) Dim GateNr As String = parameters.ToString.Split("|")(4) 'Sette sammen URL: Dim kommuneURL as string = "kommunenr=" & KommuneNr Dim GateKodeURL as string = "gatekode=" & Gatekode Dim GateNavnURL as string = "gatenavn=" & GateNavn Dim GateNrURL as string = "husnr=" & GateNr Dim url As String = "https://komteksky.norkart.no/komtek.renovasjonwebapi/api/tommekalender/?" & kommuneURL & "&" & GateNavnURL & "&" & GateKodeURL & "&" & GateNrURL 'hs.WriteLog("Soppel Error", "url " & url) Dim source As String = "" Try Using client As New System.Net.WebClient 'Sette Headers client.headers.set("Kommunenr", KommuneNr ) client.headers.set("RenovasjonAppKey", "AE13DEEC-804F-4615-A74E-B4FAC11F0A30") Net.ServicePointManager.SecurityProtocol = Net.SecurityProtocolType.Tls12 client.Encoding = System.Text.Encoding.UTF8 source = client.DownloadString(url) End Using Catch ex As Exception hs.WriteLog("Soppel Error", "Net Feil: " & ex.Message) End Try If source = "" Then hs.WriteLog("soppel Error", "Got no response from url: " & url) Exit Sub End If Try 'Dim json as Newtonsoft.Json.string = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(source) Dim json as Object = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(source) Dim numMembers As Integer = json.Count -1 Dim DeviceText As String = "" For i As Integer = 0 To numMembers Dim output As String = "" Dim output2 As String = "" output = json(i)("FraksjonId") output2 = json(i)("Tommedatoer")(0) & " Neste :" Try output2 &= json(i)("Tommedatoer")(1) Catch ex As Exception output2 &= " -- " End Try Select Case Output Case "1" output = Replace(output, "1", "<b>Restavfall : </b><br>") Case "2" output = Replace(output, "2", "<b>Papiravfall : </b><br>") Case "3" output = Replace(output, "3", "<b>Matavfall : </b> <br>") Case "4" output = Replace(output, "4", "<b>Glass/Metall : </b><br>") Case "5" output = Replace(output, "5", "<b>Drikkekartonger </b><br>") Case "6" output = Replace(output, "6", "<b>Grovavfall : </b><br>") Case "7" output = Replace(output, "7", "<b>Plastavfall : </b><br>") End Select DeviceText &= "" & output & " " & output2 & "<br>" Next hs.SetDeviceString(DevID, DeviceText , True) Catch ex As Exception hs.WriteLog("Soppel Error", "Net Feil: " & ex.Message) End Try End Sub Så en event : 
      Parameters : 
      DevieRef | Kommunenummer | Gatenummer | GataNavn | Husnummer
       
      Ser jeg forsatt har manuell trigger i screenshot, men en gang i døgnet burde vel holde i de fleste tilfeller. 

       
      SOM ga meg denne : 
       

       
      Instalering : 
      VeiNummer: 
      For å finne vegnummeret kan du gå inn på https://www.vegvesen.no/vegkart zoom deg inn på vegen din og nærmest mulig huset ditt klikker du på veien, Så finner du de 5 sifferene du trenger(Rødt). 
      Kommune Nummeret var de fire første her i Blått : 0710 

       
      HomeSeer trenger en referanse til Newtonsoft.Json.Dll, det kan du sette opp ved å lese under "Installasjon" i denne tråden: https://www.hjemmeautomasjon.no/forums/topic/4338-script-enturvb-få-inn-data-fra-entur/
       
      Takk Til: 
      Dette hadde jeg ikke klart alene.
       @Moskus skal ha en stor takk for sine delinger av script. Tatt utgangspunktet i hans NewsReader.VB
       @Marhil  Takk for tipset om Min renovasjons app eller hvordan jeg fant Gatenummer
      Og alle de andre som deler kode og eksempler åpnet på nett
       

    • Av Moskus
      Nå kan du endelig få endre trigger-tiden til dine eventer med noen enkle tastetrykk! Det fungerer fint på websiden, HStouch og HS Mobile.  
       
      Vi har alle eventer som går av på et visst tidspunkt. F.eks. vekkerklokker. Av og til vil man enkelt kunne endre tiden på vekkerklokken uten å måtte navigere til Event-siden og finne selve eventet. Kanskje vil man at ungene skal kunne gjøre det, etc.
       
      Med dette scriptet får du en device som dette:
      ... som lar deg endre klokkeslettet på et event.
       
      Her er scriptet (vær nøye med filnavnet, det må være riktig):
      TimeDevice.vb
      Public Sub Main(ByVal input As Object) 'Moskus 2019 '----------------------------- 'The Main sub will update 'DeviceRef,NewTime 'Example: 3245,13:00 -> will set device 3245 to 13:00 and the event to trigger at 13:00 '----------------------------- Dim deviceRef As Integer = input.ToString.Split(",")(0) Dim timeString As String = input.ToString.Split(",")(1) Dim _time As TimeSpan = TimeSpan.Parse(timeString) UpdateDeviceAndEvent(deviceRef, _time) End Sub Public Sub CreateDevice(byval input as Object) Dim deviceRef As Integer = hs.NewDeviceRef("Klokkekontroll") Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(deviceRef) dev.Location(hs) = "Klokke" dev.Location2(hs) = "Klokke" dev.Device_Type_String(hs) = "Ditt event her" hs.SaveEventsDevices() AddDeviceButtons(deviceRef) Dim _time As New TimeSpan hs.SetDeviceString(deviceRef, _time.ToString("hh\:mm"), False) hs.SetDeviceValueByRef(deviceRef, _time.TotalMinutes, True) End Sub Public Sub ButtonPress(ByVal input As Object) Dim deviceRef As Integer = input(0) Dim parameter As String = input(1) Dim deviceValue As Integer = hs.DeviceValue(deviceRef) Dim minutesToAdd As Integer = Integer.Parse(parameter) Dim newValue As Integer = deviceValue + minutesToAdd If newValue < 0 Then newValue = 24 * 60 + minutesToAdd If newValue > 24 * 60 Then newValue = minutesToAdd Dim _time As TimeSpan = New TimeSpan(0, newValue, 0) UpdateDeviceAndEvent(deviceRef, _time) End Sub Public Sub UpdateDeviceAndEvent(ByVal deviceRef As Integer, ByVal _time As TimeSpan) hs.SetDeviceString(deviceRef, _time.ToString("hh\:mm"), False) hs.SetDeviceValueByRef(deviceRef, _time.TotalMinutes, True) Dim eventName As String = DirectCast(hs.GetDeviceByRef(deviceRef), Scheduler.Classes.DeviceClass).Device_Type_String(hs) Dim eventRef As String = hs.GetEventRefByName(eventName) hs.EventSetTimeTrigger(eventRef, New Date(1, 1, 1).Add(_time)) hs.SaveEventsDevices() 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("TimeDevice.vb", "Added button 1: " & hs.DeviceScriptButton_AddButton(devID, "+5 min", 5, "TimeDevice.vb", "ButtonPress", "+5", 1, 1, 1)) hs.WriteLog("TimeDevice.vb", "Added button 2: " & hs.DeviceScriptButton_AddButton(devID, "-5 min", -5, "TimeDevice.vb", "ButtonPress", "-5", 1, 2, 1)) hs.WriteLog("TimeDevice.vb", "Added button 3: " & hs.DeviceScriptButton_AddButton(devID, "+15 min", 15, "TimeDevice.vb", "ButtonPress", "+15", 1, 3, 1)) hs.WriteLog("TimeDevice.vb", "Added button 4: " & hs.DeviceScriptButton_AddButton(devID, "-15 min", -15, "TimeDevice.vb", "ButtonPress", "-15", 1, 4, 1)) hs.WriteLog("TimeDevice.vb", "Added button 5: " & hs.DeviceScriptButton_AddButton(devID, "+1 time", 60, "TimeDevice.vb", "ButtonPress", "+60", 2, 1, 1)) hs.WriteLog("TimeDevice.vb", "Added button 6: " & hs.DeviceScriptButton_AddButton(devID, "-1 time", -60, "TimeDevice.vb", "ButtonPress", "-60", 2, 2, 1)) Catch ex As Exception hs.WriteLog("TimeDevice.vb", "Error adding buttons: " & ex.Message) End Try End Sub  
      Du trenger først å lage et event som trigger scriptet med rutinen "CreateDevice", slik:

       
      Gå nå til Device Manager-siden. Velg at "Klokke" skal vises, både for "Floor" og "Room". MEN: Du må også huske på å velge ALLE device typer:

       
      Da får du opp den nye devicen. Denne kan du navngi og gi plassering akkurat som det passer deg.
       
      Så skal vi bestemme hvilket event som skal trigges. Navnet sette vi som en "Device Type String" under Advanced-taben. Merk at hele navnet skal brukes, og at det er "Gruppe" + mellomrom + "Event navn". La oss si at jeg vil trigge et test-event som jeg har navngitt "Et timer-event", som her:

       
      Da er hele evnetnavnet mitt: "Test Et timer-event", og det setter vi inn her:

      ... og trykker "Done".
      NB! Når vi nå går tilbake til Device Manager, må vi huske på å vise alle Device Types igjen, fordi den har vi nettopp endret til noe nytt som ikke var valgt før.
       
      Så er det bare å stille klokka.  
      Endrer vi tiden på devicen til dette...

      ... vil eventet også endres:

       
      Det gjør ingenting om eventet ditt har andre conditions, de vil ikke bli påvirket av dette.  
       
       
       
      Scriptet har også en rutine for å endre klokkeslettet med eventer, f.eks. hvis man skal stille tilbake flere  vekkerklokker etter en ferie. 
      Da kaller man bare rutinen/metoden "Main" (eller lar være å spesifisere rutine), og bruker deviceRef og klokkeslett som parameter.
      Dette:

       
      ... gir dette:

      ... og selvfølgelig dette:

       
    • Av Moskus
      Nyheter er viktig, og din bolig burde vite hva som skjer. HStouch kommer med en RSS-leser, men den støtter ikke norske tegn, og fungerer bare når den vil. Ettersom jeg ble lei av det, skrev jeg et lite script for å hente frem nyheter.
       
      NewsReader.vb
      Sub Main(ByVal parameters As Object) 'Moskus 2019 Dim devID As Integer = parameters.ToString.Split("|")(0) Dim url As String = "https://api.rss2json.com/v1/api.json?rss_url=" & System.Net.WebUtility.HtmlEncode(parameters.ToString.Split("|")(1)) Dim source As String = "" Try Using client As New System.Net.WebClient Net.ServicePointManager.SecurityProtocol = Net.SecurityProtocolType.Tls12 client.Encoding = System.Text.Encoding.UTF8 source = client.DownloadString(url) End Using Catch ex As Exception hs.WriteLog("NewsReader Error", "Net Feil: " & ex.Message) End Try If source = "" Then hs.WriteLog("NewsReader Error", "Got no response from url: " & url) Exit Sub End If Try Dim json = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(source) Dim output As String = "" For i As Integer = 0 To 4 output &= "• <b>" & json("items")(i)("title") & "</b><br>" output &= json("items")(i)("description") & "<br><br>" Next hs.SetDeviceString(devID, output, True) Catch ex As Exception hs.WriteLog("NewsReader Error", "Net Feil: " & ex.Message) End Try End Sub HomeSeer trenger en referanse til Newtonsoft.Json.Dll, det kan du sette opp ved å lese under "Installasjon" i denne tråden: https://www.hjemmeautomasjon.no/forums/topic/4338-script-enturvb-få-inn-data-fra-entur/
       
       
      Du trenger en virtuell device per nyhetskilde du vil ha. Ingen controller er viktig, velg "Status Only device" og "Do not log commands from this device".
       
      Så lager du et event. Det kan trigge hvert 15. minutt. Og så legger du til en kjøring av NewsReader.vb for hver nyhetskilde du ønsker deg. Parameter for scriptet er "DEV_ID|http://nyhetskilde.com/rss/", altså device ID, en "pipe" | og kilden. Huk av "Wait for script to finish" og "Only allow a single instance"
       

       
      Da blir resultatet dette:

       
      Her er noen nyhetskilder:
      https://www.aftenbladet.no/rss
      https://www.aftenposten.no/rss
      https://www.nrk.no/toppsaker.rss
      https://www.dagbladet.no/rss/
      https://www.vg.no/rss/feed/?categories=1068&limit=10&format=rss&private=1  - sjekk https://vg.no/rss for å sette opp din egen feed.
       
       
       
    • Av Moskus
      Tegneserier er gøy. Automatiske tegneserier er selvfølgelig enda gøyere. Tidligere var det bare å linke bildet på nettet, men VG ville gjøre det litt vanskeligere for oss. Men det lar seg ordne.
       
      Aller først trenger vi SP_ID'en din. Logg inn på VG (det holder med en gratis-konto), og trykk F12 (eller åpne Developer Console)
      Så finner du "Application" på menyen øverst, finner så cookies, og velger "www.vg.no". Dobbelttrykk på tekstfeltet etter "SP_ID" og kopier hele denne lange, uforståelige teksten til et sted.
       

       
       
       
      NB! Dette scriptet omfatter sletting av filer, og kan potensielt gå ad undas. Det er selvfølgelig testet en del av meg, men som alltid: Ta backup først!
       
      Scriptet er her:
      Tegneserie.vb
      Sub Main(ByVal input As Object) 'Moskus 2019 'Parametre: device_ID|Tegneserie 'Serie-alternativer: Pondus, Lunch, Hjalmar, Tegnehanne Dim devID As String = input.ToString.Split("|")(0) Dim serie As String = input.ToString.Split("|")(1) Dim deleteFiles As Boolean = True Dim SP_ID As String = "DIN_LANGE_SPID_STRENG_HER" Dim directoryName As String = hs.GetAppPath & "/html/images/Tegneserier/" 'Check if "Tegneserier" exits If (Not System.IO.Directory.Exists(directoryName)) Then System.IO.Directory.CreateDirectory(directoryName) 'Delete local files If deleteFiles Then For Each deleteFile As String In System.IO.Directory.GetFiles(directoryName, serie.ToLower & "*.*", System.IO.SearchOption.TopDirectoryOnly) System.IO.File.Delete(deleteFile) Next End If Dim remoteFile As String = "" Dim filename As String = serie.ToLower & "_" & Now.Date.ToString("yyMMdd") & ".jpg" Dim localFile As String = hs.GetAppPath & "/html/images/Tegneserier/" & filename Dim dateFormat As String = Now.Year & "-" & Now.Month.ToString("00") & "-" & Now.Day.ToString("00") Select Case serie.ToLower Case = "pondus" remoteFile = "https://www.vg.no/tegneserier/api/images/pondus/" & dateFormat Case = "lunch" remoteFile = "https://www.vg.no/tegneserier/api/images/lunch/" & dateFormat Case = "hjalmar" remoteFile = "https://www.vg.no/tegneserier/api/images/hjalmar/" & dateFormat Case = "tegnehanne" remoteFile = "https://www.vg.no/tegneserier/api/images/tegnehanne/" & dateFormat End Select If remoteFile <> "" Then Try Using client As New System.Net.WebClient Net.ServicePointManager.SecurityProtocol = Net.SecurityProtocolType.Tls12 client.Headers.Add(Net.HttpRequestHeader.Cookie, "SP_ID=" & SP_ID) client.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0") client.DownloadFile(remoteFile, localFile) client.Dispose() End Using Catch ex As Exception hs.WriteLog("Tegneserier", "Ex: " & ex.ToString) End Try Dim dateValue As Integer = CInt(Now.Date.ToString("yyMMdd")) hs.SetDeviceString(devID, "<img src='/images/HomeSeer/status/custom.gif' />", True) hs.SetDeviceString(devID, "<img src='./images/Tegneserier/" & filename & "' width='300px' />", False) hs.SetDeviceValueByRef(devID, dateValue, True) Else hs.WriteLog("Tegneserie", "RemoteFile ikke spesifisert for tegneserie: " & serie) End If End Sub Du legger inn SP_ID-strengen din istedenfor "DIN_LANGE_SPID_STRENG_HER".
       
      I tillegg må du lage en device pr. tegneserie du er interessert i. Som i nyhetsscriptet er dette en "Status Only" device.
       
      Så er det bare å sette opp eventet. Tegneseriene blir oppdatert kl. 08:00, så 08:15 er sikkert et bra tidspunkt. Kun ukedager og lørdager. Huk av "Wait for Script to finish" og "Only allow singe instance". Så repeter for hver tegneserie.
       
      Parameter er dev_ID|Tegneserie, f.eks. 3689|Pondus.

       

       
       
      ... som gir oss:

       
      Bredden er satt til 300px for at hele tegneserien skal dukke opp i Device Management, men dette er ikke en begrensning i f.eks. HStouch.
×
×
  • Opprett ny...