Gå til innhold
  • Bli medlem
Moskus

SCRIPT: Logge verdi eller status til fil

Anbefalte innlegg

To scripts som logger verdier til flate tekstfiler, med tidspunktet og verdien eller statusen separert med tab. Kan da enkelt limes inn i f.eks. Excel.

 

LogValueToFile.vb

    Sub Main(parm As Object)
        Dim deviceRef As Integer = parm.ToString()
        Dim out As String = Now.ToShortDateString & " " & Now.ToLongTimeString & vbTab & hs.DeviceValueEx(deviceRef).ToString("f1")

        Try
            My.Computer.FileSystem.WriteAllText(hs.GetAppPath & "\Logs\" & deviceRef & ".txt", out & vbNewLine, True)
        Catch ex As Exception
            hs.WriteLog("LogValueToFile ERROR", ex.Message)
        End Try

    End Sub

 

 

Å hente status kan være verre, for det er flere måter å gjøre det på.

 

LogStatusToFile.vb

    Sub Main(parm As Object)
        Dim deviceRef As Integer = parm.ToString()
        Dim out As String = Now.ToShortDateString & " " & Now.ToLongTimeString & vbTab & GetDeviceString(deviceRef)

        Try
            My.Computer.FileSystem.WriteAllText(hs.GetAppPath & "\Logs\" & deviceRef & ".txt", out & vbNewLine, True)
        Catch ex As Exception
            hs.WriteLog("LogStatusToFile ERROR", ex.Message)
        End Try

    End Sub

    Function GetDeviceString(ByVal DeviceRef As Integer) As String
        'Henter device string fra HS
        Dim devstring As String = hs.DeviceString(DeviceRef)
        If devstring <> String.Empty Then Return devstring

        'Henter devicestring directe fra CAPI-status, hvis den finnes
        devstring = hs.CAPIGetStatus(DeviceRef).Status
        If devstring <> String.Empty Then Return devstring

        'Henter devicestring fra CAPI beskrivelse (basert på value)
        devstring = GetCapiString(DeviceRef)
        If devstring <> String.Empty Then Return devstring

        'Henter devicestring fra device class
        Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(DeviceRef)
        devstring = dev.devString(Nothing)
        If devstring <> String.Empty Then Return devstring

        Return "String not found for " & DeviceRef & ", value = " & hs.DeviceValueEx(DeviceRef)
    End Function

    Function GetCapiString(ByVal DeviceRef As Integer) As String
        For Each CAPI As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(DeviceRef)
            If CAPI.ControlValue = hs.DeviceValue(DeviceRef) Then Return CAPI.Label.ToString
        Next
        Return String.Empty
    End Function

 

Kalles med device Ref som parameter. :) 

  • Like 2
  • Thanks 1

Del dette innlegget


Lenke til innlegg
Del på andre sider

Får error: 

nov-28 14:45:36   Error 1 Running script C:\Program Files (x86)\HomeSeer HS3\scripts\LogValueToFile.vb :Målet forårsaket et unntak under aktivering.Konvertering fra strengen f1 til typen Integer er ikke gyldig.

 

image.thumb.png.3839c1394d1ec39fd150fac60a395a06.png

 

image.png.94b576ebf083139fab8543d57281a8ab.png

 

Tips mottas :)

Del dette innlegget


Lenke til innlegg
Del på andre sider

Kopierte og limte inn i visual basic:

768153958_002-script.thumb.png.4ad01491e8cf086454e8806c1e15ede7.png

 

Opprettet event:

1409034012_003-script.png.776df492ea4d433dae4c1ccf40356f89.png

 

Fikk da feilmeldingen:

419164517_001-script.png.a00e063b00cb0c201840bc545887ecd4.png

 

 

Er det denne linjen som er grunnen?

Dim deviceRef As Integer = parm.ToString()

 

 

Prøvde å endre den til:

Dim deviceRef As String = parm.ToString()

 

Får da følgende feil:

1828306288_004-script.png.147ff3e4ed935bd63283cfe27ba1dd8c.png

 

 

Del dette innlegget


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

Tips mottas :)

 

Uten kunnskap er det vanskelig, men har prøvd å forstå koden.

ToString("f1")

Klarer du å se hva denne gjør?

Antar den gir ut en streng verdi som kan ha  positiv eller negativ verdi, og definerer om desimaltall skal skilles med komma eller punktum, avhengig av systeminnstillinger?

 

Utover det klarer jeg ikke forstå hvorfor det benyttes integer og så ha en verdi som string?

Vil ikke det si at dersom det er en bokstav i string, så vil den ikke kunne lagres som integer?

 

Dim deviceRef As Integer = parm.ToString()

Del dette innlegget


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

Tips mottas :)

 

Da tror jeg du må forklare hva du prøver å oppnå... hvorfor har du lagt til .ToString("f1")? For det er der feilen ligger...

  • Thanks 1

Del dette innlegget


Lenke til innlegg
Del på andre sider

Fantastisk!

Det funket

 

Sub Main(parm As Object)
    Dim deviceRef As Integer = parm.ToString()
    Dim out As String = Now.ToShortDateString & " " & Now.ToLongTimeString & vbTab & hs.DeviceValueEx(deviceRef).ToString()
 
    Try
        My.Computer.FileSystem.WriteAllText(hs.GetAppPath & "\Logs\" & deviceRef & ".txt", out & vbNewLine, True)
    Catch ex As Exception
        hs.WriteLog("LogValueToFile ERROR", ex.Message)
    End Try
 
End Sub

Del dette innlegget


Lenke til innlegg
Del på andre sider

Jaja, lov til å være håpefull  :)

 

 

Dim out As String = Now.ToShortDateString("yyyy") & vbTab & Now.ToShortDateString("MM") & vbTab & Now.ToShortDateString("dd") & vbTab & Now.ToLongTimeString & vbTab & hs.DeviceValueEx(deviceRef).ToString()

Del dette innlegget


Lenke til innlegg
Del på andre sider

Ikke langt unna, denne virket.

 

Dim out As String = Now.ToString("yyyy") & vbTab & Now.ToString("MM") & vbTab & Now.ToString("dd") & vbTab & Now.ToLongTimeString & vbTab & hs.DeviceValueEx(deviceRef).ToString()

 

 

Scriptet over lager en fil som heter "103.txt", er det en enkel måte å få det til å lage et enklere filnavn å forholde seg til?

F.eks. "kWh logg for panelovn entré.txt"?

 

Tenkte først på å bytte ut deviceid med filnavn, men hvis scriptet skal kunne brukes på mange sensorer, vil jo ikke det fungere.

 

Edit.

Ikke viktig, da det enkelt kan løses i excel med formatet:

Dim out As String = deviceRef & vbTab & vbTab & Now.ToString("yyyy") & vbTab & Now.ToString("MM") & vbTab & Now.ToString("dd") & vbTab & Now.ToLongTimeString & vbTab & hs.DeviceValueEx(deviceRef).ToString()

 

 

 

Endret av Teza

Del dette innlegget


Lenke til innlegg
Del på andre sider

 

13 hours ago, ZoRaC said:

Da tror jeg du må forklare hva du prøver å oppnå... hvorfor har du lagt til .ToString("f1")? For det er der feilen ligger...

 

On 11/10/2017 at 09:24, Moskus said:

 

To scripts som logger verdier til flate tekstfiler, med tidspunktet og verdien eller statusen separert med tab. Kan da enkelt limes inn i f.eks. Excel.

 

 

Har bare prøvd å oppnå det som @Moskus har skrevet i første post. :)

 

Er 3% av innholdet i scriptet som sier meg noe fornuftig, så jeg har ikke peiling. Bare copy/paste.

Endret av JohnMartin

Del dette innlegget


Lenke til innlegg
Del på andre sider
2 minutes ago, Moskus said:

Ja, dette konverterer tallet til en formatert streng med 1 desimal. Det burde fungert med, så det er er litt snodig...

 

Er det Windows eller Linux? (Ikke at det spiller noen rolle, men jeg vil sjekke og lære :) )

 

Det er windows.

Fjernet jeg f1, så fikk jeg 3 desimaler. Som vises i HS3
 

image.png

Del dette innlegget


Lenke til innlegg
Del på andre sider

Windows 7 for min del.

Prøver å forstå koden for å lære litt selv.

 

Dim deviceRef As Integer = parm.ToString()

Vet ikke om det er skivebom, men:

Dim definerer en en variabel som heter deviceRef, som defineres som et tall.
Verdien til deviceRef er definert som en streng (bokstaver og tall)?

Horfor er den ene kun et tall mens den andre er tall og bokstaver, er ikke det litt motsigende?

Vil ikke det si at dersom det er en bokstav i strengen så kan ikke den lagres i deviceref?

Del dette innlegget


Lenke til innlegg
Del på andre sider

Planen er forøvrig å ordne en graf med forbruk, Time for time i Excel

Hvordan dato/tid stempel er best å bruke da?

image.png.1d62331c9ba01c0fe34fd55207c451c7.png

 

Ser kanskje for meg at det er dato i en kolonne, klokke i en kolonne og verdi i den 3.
Hvordan må det skrives i scriptet for å få en mellomting av det i bildet?

Del dette innlegget


Lenke til innlegg
Del på andre sider

Jeg kommer til å endre klokkeslettet til å kun inneholde timer og minutter i tillegg.

 

Dim out As String = Now.ToString("yyyy") & vbTab & Now.ToString("MM") & vbTab & Now.ToString("dd") & vbTab & Now.ToLongTimeString & vbTab &hs.DeviceValueEx(deviceRef).ToString()

Har du flere sensorer, kan det være en ide å legge til deviceRef i tillegg.

 

deviceRef & vbTab & 

 

Endret av Teza

Del dette innlegget


Lenke til innlegg
Del på andre sider
17 minutter siden, JohnMartin skrev:

Det er windows.

Fjernet jeg f1, så fikk jeg 3 desimaler. Som vises i HS3

Bruker maskinen "norsk komma" som desimalskille? Ser slik ut...

Forstår ikke hvorfor det ikke fungerer, det burde gå helt fint. Det er jo det jeg gjør selv. ;) 

 

10 minutter siden, JohnMartin skrev:

Planen er forøvrig å ordne en graf med forbruk, Time for time i Excel

Hvordan dato/tid stempel er best å bruke da?

Bruk dato og klokkeslett så kan du få Excel til å formatere det som du ønsker senere. :) 

 

15 minutter siden, Teza skrev:

Dim definerer en en variabel som heter deviceRef, som defineres som et tall.
Verdien til deviceRef er definert som en streng (bokstaver og tall)?

Horfor er den ene kun et tall mens den andre er tall og bokstaver, er ikke det litt motsigende?

Vil ikke det si at dersom det er en bokstav i strengen så kan ikke den lagres i deviceref?

Variabelen deviceRef blir opprettet, definert som et heltall. (Integer = heltall, Double = desimaltall)

parm, som kommer når funksjonen eller sub'en blir kallet blir konvertert fra Object til en String (dvs tekst), før .NET konverterer det til et tall. Gammel vane.

 

Et en streng som dette: "123" kan enkelt konverteres til et tall.

En streng som dette "123abc" kan ikke like enkelt konverteres til tall.

Del dette innlegget


Lenke til innlegg
Del på andre sider
1 minute ago, Moskus said:

Bruker maskinen "norsk komma" som desimalskille? Ser slik ut...

Øh.. du spør du.. 🤔

Vet ikke hvordan jeg sjekker ut det?

Trykker jeg på komma på tastaturet så får jeg denne , , , , , , 😝

 

3 minutes ago, Moskus said:

Bruk dato og klokkeslett så kan du få Excel til å formatere det som du ønsker senere.

Bruker jeg "din" måte, så blir det slik når jeg limer inn i excel:
image.png.50e0f235e0d27e35cbaf686c776e1cff.png

Ikke noe problem for Excel å formatere senere etter ønske uten å måtte redigere dato/tid cellen?
Den klarer å lese ut både dato og klokkeslett for å lage graf?
 

Er kanskje litt på tynn is her. Har brukt excel tidligere til grafer og lignende, husker bare da at jeg slet litt for å få dato/tid korrekt. Så vært greit å hatt det korrekt fra starten av 😃

 

Del dette innlegget


Lenke til innlegg
Del på andre sider
23 minutter siden, JohnMartin skrev:

Ikke noe problem for Excel å formatere senere etter ønske uten å måtte redigere dato/tid cellen?
Den klarer å lese ut både dato og klokkeslett for å lage graf?

Jepp. Enklere å håndtere det i Excel enn å måtte lage spesialformateringer i den lagrede filen. :) 

 

23 minutter siden, JohnMartin skrev:

Er kanskje litt på tynn is her. Har brukt excel tidligere til grafer og lignende, husker bare da at jeg slet litt for å få dato/tid korrekt. Så vært greit å hatt det korrekt fra starten av 😃

Det kommer litt an på når dette var. Excel 2013 og utover har blitt mye bedre på å håndtere tid som tid istedenfor kun et datapunkt. :) 

  • Like 1

Del dette innlegget


Lenke til innlegg
Del på andre sider

Har kjørt scriptet LogValueToFile.vb en kort periode for å teste det, og har litt utfordring med dette.

 

Fra:   29/11   01:00

til:    03/12   11:00

Har jeg 2033 logg punkter fordelt på 19 devices. (hver hele time)

I denne perioden mangler det 105 logg punkter og i tillegg er 5 forskjellige loggpunkter registrert 2 ganger i loggen.

 

Jeg har kun en scriptfil, antar at denne kan kjøres ubegrenset antall ganger samtidig?

(Blir vel kun lest og ikke skrevet til?)

 

Jeg kjører polling av 19 devices hver hele time, deretter logging av verdien som er pollet.

Antar dette burde spres i tid innenfor ett minutt?

Hvor mange kan kjøres samtidig og hvor lang tid mellom hver bolk?

 

Fordelingen av manglende logg punkter ser ut til å være mer eller mindre vilkårlig.

 

 

Feil.thumb.PNG.deed1e70e4620187e28e0614c3a0f580.PNG

Del dette innlegget


Lenke til innlegg
Del på andre sider
2 minutter siden, Teza skrev:

Jeg har kun en scriptfil, antar at denne kan kjøres ubegrenset antall ganger samtidig?

Ja, så lenge denne blir kalt med forskjellige parametre.

 

Antall feil er ikke så spennende som HVILKEN feil du får. ;) 

Del dette innlegget


Lenke til innlegg
Del på andre sider

Mange loggpunkter blir ikke registrert hver time.

 

Ved å velge script i loggen har jeg 62 logg entrys som sier:

LogValueToFile.vb is currently running, waiting for it to complete before its run again.

 

Alle eventene har forskjellige parametre.

Har satt wait 1 sek mellom  polling og logging i eventene. (en event pr. device)

Antok det kunne være en liten forsinkelse mellom polling og oppdatering av verdi.

 

Kan dette være grunnen?

 


 

 

 

Del dette innlegget


Lenke til innlegg
Del på andre sider

Har du satt opp hver enhet til å logge hvis verdien er det samme? Jeg er usikker på om dette har noe å si, men default i HS er at hvis det  ikke er endring på verdi så logges ikke noen endring.

Edit: Det gjelder kanskje kun oppdateringsdato

Endret av Guahtdim

Del dette innlegget


Lenke til innlegg
Del på andre sider
52 minutter siden, Teza skrev:

Antok det kunne være en liten forsinkelse mellom polling og oppdatering av verdi.

Polling kan ta mer enn ett sekund, spesielt hvis det er MYE polling. Hva med 10 sekunder?

 

 

52 minutter siden, Teza skrev:

LogValueToFile.vb is currently running, waiting for it to complete before its run again.

Aha, da vet vi litt mer. :)

 

Ta bort dette valget i Eventene, så burde det gå bra:

image.png

Del dette innlegget


Lenke til innlegg
Del på andre sider

@Guahtdimlogger verdi uansett om det er endring eller ikke, den delen fungerer godt.

 

@Moskusi utgangspunktet ønsket jeg kun rene klokkeslett i loggen, dvs. hele timer (10:00, 11:00 osv)(, men dette kan sikkert også oppnås på andre måter).

Dog har jeg ikke funnet noen måte å importere dataene inn i excel, slik jeg ønsker de importert, og ettersom dette pr. i dag må gjøres manuelt er det ikke i konflikt med excel.

 

Pr. i dag starter alle pollinger klokken XX.00.00. og det er kun 1 sek delay før logging.

Burde heller neste polling event startes f.eks 2 sekunder etter forrige pollingevent, for å redusere belastningen på nettverket?

For å så i tillegg ha en forsinkelse på 10 sek før loggingen blir utført?

 

Det virker som alle 19 devicer er pollet/oppdatert i løpet av 2 sekunder.

Er ute etter den mest stabile løsningen for nettverket, som samtidig gir et mest mulig riktig forbruksbilde pr. hele time. (mao 100% nøyaktighet er unødvendig til mitt bruk).

 

 

"Only allow a single instance to run at a time." har ikke vært markert i noen av eventene, så det kan ikke være denne som er problemet.

Del dette innlegget


Lenke til innlegg
Del på andre sider
4 timer siden, Moskus skrev:

Antall feil er ikke så spennende som HVILKEN feil du får. ;) 

 

Grunnen til at jeg la så mye arbeid i å kartlegge hvilke loggpunkter det var feil med, var for å se om feilene var samlet rundt gitte tidspunkt.

Var de det var tanken at det kunne være oppdateringer eller andre ting som påvirket loggingen.

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 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
    • 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.
       
       
       
×
×
  • Opprett ny...