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

[LØST] Timer - telle nedover


ZoRaC

Anbefalte innlegg

Noen som har et enkelt script for å få en timer til å telle nedover (i HSTouch)? Ser for meg man kanskje må ha en device å lagre til og hvert sekund ta starttid-nåværende timerverdi?

 

Noen som har laget en enkel og grei løsning på dette?

Endret av ZoRaC
Løst! :D
Lenke til kommentar
Del på andre sider

Et øyeblikk siden, ZoRaC skrev:

Finner sikkert en "SecondsToPrettyTime"-funksjon som kan benyttes til det. :) 

Scripting it is! :)

Du kan lagre sekund-verdien i en device, og så oppdatere Device String'en til denne devicen slik:

hs.SetDeviceString(YOUR_DEVICE_REF, TimeSpan.FromSeconds(hs.DeviceValue(YOUR_DEVICE_REF)).ToString("HH:mm:ss"), False)

 

  • Like 1
Lenke til kommentar
Del på andre sider

Genialt! Trodde jeg måtte ha en egen funksjon som kalkulerte timer/min/sek, men dette så jo veldig enkelt ut. :)

 

Vil ikke counteren være antall sekunder? Så jeg kan ta verdien av den i stedet? Kan jeg kanskje sette counterens devicestring, så slipper jeg en ekstra device helt?

Lenke til kommentar
Del på andre sider

9 minutter siden, ZoRaC skrev:

Vil ikke counteren være antall sekunder? Så jeg kan ta verdien av den i stedet?

Jepp! :)

Endre den "midterste" YOUR_DEVICE_REF til counteren sin device ref.

 

9 minutter siden, ZoRaC skrev:

Kan jeg kanskje sette counterens devicestring, så slipper jeg en ekstra device helt?

Jo, det kan du kanskje. Counteren viser nok bare value, og ingen Device String. :)

 

Lenke til kommentar
Del på andre sider

1 time siden, Moskus skrev:

 


hs.SetDeviceString(YOUR_DEVICE_REF, TimeSpan.FromSeconds(hs.DeviceValue(YOUR_DEVICE_REF)).ToString("HH:mm:ss"), False)

 

 

Hm, den delen med "TimeSpan" feiler:

"Running script /tmp/K5.vb :Exception has been thrown by the target of an invocation.Input string was not in a correct format."

 

hs.SetDeviceString("122", "test", False) fungerer. 

 

Forslag?

 

Og hvordan setter jeg startverdien til counteren? Den starter jo på 0 og jeg finner ikke noe sted å endre startverdi?

Lenke til kommentar
Del på andre sider

OK, da kan det være at du må putte det i en egen script-fil.

 

UpdateTime.vb

Sub Main(byval param as Object)
    hs.SetDeviceString(YOUR_DEVICE_REF, TimeSpan.FromSeconds(hs.DeviceValue(YOUR_DEVICE_REF)).ToString("HH:mm:ss"), False)
End Sub

Hvis ikke det fungerer, så prøv å legg "System." (med punktum, ja) rett foran ordet "TimeSpan".

 

Hvis ikke DET fungerer, må vi gjøre det på den tungvindte måten.

Lenke til kommentar
Del på andre sider

Fant ut at det - man må escape ":" i format-spesifiseringen i tillegg til at det skal være lowercaps, så da virker det som immediate-script også. :)

&hs.SetDeviceString("122", TimeSpan.FromSeconds(hs.DeviceValue("111")).ToString("hh\:mm"), False)

I stedet for å blandet inn en counter, hadde det ikke vært enklere å benytte timer-devicen likevel? Den er jo lettere å starte/stoppe/resume/resette/osv. I stedet for å lage event som må kjøre hvert sekund for å decrementere en counter.

 

Timeren har jo en value som er sekunder. Hvis jeg da tar antall sekunder minus timer-value, så får jeg jo antall sekunder som er igjen. Hvis jeg kjører det hvert sek og heller bare henter verdien fra den og oppdaterer en annen device-string, så er det kanskje enklere?

Lenke til kommentar
Del på andre sider

3 minutter siden, ZoRaC skrev:

Fant ut at det - man må escape ":" i format-spesifiseringen i tillegg til at det skal være lowercaps, så da virker det som immediate-script også. :)

Øh... jaha? Det var rart!

Kjører du på Linux, kanskje?

 

4 minutter siden, ZoRaC skrev:

I stedet for å blandet inn en counter, hadde det ikke vært enklere å benytte timer-devicen likevel? Den er jo lettere å starte/stoppe/resume/resette/osv. I stedet for å lage event som må kjøre hvert sekund for å decrementere en counter.

Ja, gjerne det. Men du må ha en trigger som oppdaterer utregningen uansett, og om det er i et rent Event, eller et Event knyttet til Timeren er jo akkurat det samme.

Lenke til kommentar
Del på andre sider

1 minutt siden, Moskus skrev:

Øh... jaha? Det var rart!

Kjører du på Linux, kanskje?

 

Jepp. :)

Men, tror ikke det var Linux-spesifikt, fant det i dokumentasjonen:

https://msdn.microsoft.com/en-us/library/ee372287(v=vs.110).aspx

 

1 minutt siden, Moskus skrev:

Ja, gjerne det. Men du må ha en trigger som oppdaterer utregningen uansett, og om det er i et rent Event, eller et Event knyttet til Timeren er jo akkurat det samme.

 

Hmm, sant det...

Lenke til kommentar
Del på andre sider

Det ser ikke ut til at det er mulig å sette en counter til en gitt verdi, verken "manuelt" eller med script... Da vil jo ikke det fungere.

Må nok hente sekunder fra timeren og oppdatere en annen device med "formatert" tid likevel da.

 

Lenke til kommentar
Del på andre sider

1 time siden, ZoRaC skrev:

Det ser ikke ut til at det er mulig å sette en counter til en gitt verdi, verken "manuelt" eller med script... Da vil jo ikke det fungere.

Joda. Bare bruk hs.SetDeviceValueByRef hvis du bruker script, eller bruk Setup -> Global Variables, Timers, Counters -> Counters. :)

 

 

2 timer siden, ZoRaC skrev:

Men, tror ikke det var Linux-spesifikt, fant det i dokumentasjonen:

https://msdn.microsoft.com/en-us/library/ee372287(v=vs.110).aspx

Ja, jøss! Rart siden alle andre ToString-formater vanligvis kan brukes vanlig HH:mm:ss. De er jo standardiserte, og jeg bruker "HH:mm:ss" i andre prosjekter... ?

 

Lenke til kommentar
Del på andre sider

11 minutter siden, Moskus skrev:

Joda. Bare bruk hs.SetDeviceValueByRef hvis du bruker script, eller bruk Setup -> Global Variables, Timers, Counters -> Counters. :)

 

Ah, jeg prøvde bare setDeviceValue, det gikk ikke. Via GUI får jeg også bare til å øke/minke med 1, selv om jeg skriver noe annet i "boksen" ved siden av som visstnok skal endre på det...

 

Endte med å gjøre det slik, som fungerer strålende :)


Sub Main(ByVal theDevice As String)
    Dim seconds
    seconds = cint(hs.DeviceValue(theDevice))
    seconds = 10800 - seconds

    hs.SetDeviceString(124, TimeSpan.FromSeconds(seconds).ToString("hh\:mm"), True)
End Sub

 

Hvordan kan jeg endre denne til at jeg kan sende inn flere parametere? Jeg ville kunne kalle denne med "111,124,10800,hh\:mm"

(111=timerdevice, 124=virtuell device, 10800=sekunder, formatet til slutt). 

Liker å kunne gjenbruke ting senere :)

Endret av ZoRaC
Lenke til kommentar
Del på andre sider

9 timer siden, ZoRaC skrev:

Hvordan kan jeg endre denne til at jeg kan sende inn flere parametere? Jeg ville kunne kalle denne med "111,124,10800,hh\:mm"

(111=timerdevice, 124=virtuell device, 10800=sekunder, formatet til slutt). 

Liker å kunne gjenbruke ting senere :)

Gjenbruk av kode er alltid en god ide! :)

 

Det er mulig å sende flere parametere, men du må ta en omvei. Som du ser tar en sub eller funksjon kun én parameter, men siden dette er en string så kan vi herje litt med den. Legg dette til i begynnelsen under Sub Main(Byval params as Object) (main krever i utgangspunktet et object som parameter-type):

Dim parameters() as String = params.ToString.Split(",")
Dim timerDeviceRef as Integer = parameters(0)
Dim virtualDeviceRef as Integer = parameters(1)
Dim totalSeconds as Integer = parameters(2)
Dim timeFormat as String = parameters(3)

 

  • Like 1
Lenke til kommentar
Del på andre sider

Jeg prøvde noe lignende selv, men fikk kompileringsfeil - sikkert bommet litt på syntax. Med dine linjer fungerer det utmerket! :D

 


Sub Main(Byval params as Object)
    Dim parameters() as String = params.ToString.Split(",")
    Dim timerDeviceRef as Integer = parameters(0)
    Dim virtualDeviceRef as Integer = parameters(1)
    Dim totalSeconds as Integer = parameters(2)
    Dim timeFormat as String = parameters(3)

    Dim seconds
    seconds = cint(hs.DeviceValue(timerDeviceRef))
    seconds = totalSeconds - seconds

    hs.SetDeviceString(virtualDeviceRef, TimeSpan.FromSeconds(seconds).ToString(timeFormat), True)
End Sub

 

 

IMG_4478.PNG

Lenke til kommentar
Del på andre sider

19 minutter siden, ZoRaC skrev:

Med dine linjer fungerer det utmerket! :D

Så bra! :)

 

seconds-linjene dine fungerer, men ser litt snåle ut. Jeg hadde gjort det slik:

    Dim seconds As Integer = totalSeconds - hs.DeviceValue(timerDeviceRef)

... men alt fungerer! :) 

  • Like 1
Lenke til kommentar
Del på andre sider

2 timer siden, Moskus skrev:

Så bra! :)

 

seconds-linjene dine fungerer, men ser litt snåle ut. Jeg hadde gjort det slik:


    Dim seconds As Integer = totalSeconds - hs.DeviceValue(timerDeviceRef)

... men alt fungerer! :) 

 

Jeg strevde litt med syntax'en, så det endte til slutt opp slik :P Jeg kan PHP, Javascript, Java og PowerShell - strever litt med å lære meg syntaxen her, siden alle har forskjellig...

Endret til ditt forslag nå, funket det også! ;) 

  • Like 1
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.