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

SCRIPT: Logge verdi eller status til fil


Moskus

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
Lenke til kommentar
Del på andre sider

  • 1 år senere...

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

 

 

Lenke til kommentar
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()
Lenke til kommentar
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
Lenke til kommentar
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()
Lenke til kommentar
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
Lenke til kommentar
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
Lenke til kommentar
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

Lenke til kommentar
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?

Lenke til kommentar
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?

Lenke til kommentar
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
Lenke til kommentar
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.

Lenke til kommentar
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 ?

 

Lenke til kommentar
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
Lenke til kommentar
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

Lenke til kommentar
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. ;) 

Lenke til kommentar
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?

 


 

 

 

Lenke til kommentar
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
Lenke til kommentar
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

Lenke til kommentar
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.

Lenke til kommentar
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.

Lenke til kommentar
Del på andre sider

Bli med i samtalen

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

Gjest
Skriv svar til emnet...

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

  Du kan kun bruke opp til 75 smilefjes.

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

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

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

×
×
  • Opprett ny...

Viktig informasjon

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