Gå til innhold
  • Bli medlem
Moskus

SCRIPT: VirtualThermostat.vb (beta) - En virtuell termostat med programfunksjon

Anbefalte innlegg

4 timer siden, Moskus skrev:

5. Scriptet oppretter et device som kjører scriptet hvert 5. minutt

 

Regner med du mener "event"? :) 

Topp script! Må vurdere om jeg skal ta i bruk det i stedet for RFXCOM. :) 

Del dette innlegget


Lenke til innlegg
Del på andre sider
11 minutter siden, ZoRaC skrev:

Regner med du mener "event"? :) 

Wops, indeed!

 

11 minutter siden, ZoRaC skrev:

Topp script! Må vurdere om jeg skal ta i bruk det i stedet for RFXCOM. :) 

Ja, jeg ble litt kjepphøy og opprettet en ny RFXCOM-termostat for å "bevise" at den fungerte fint.

Det gjorde den ikke, så da måtte jeg jo bare krype til korset og fullføre scriptet... ;) 

  • Like 1

Del dette innlegget


Lenke til innlegg
Del på andre sider

Vakkert. En liten sak, dukker ikke opp i Imperihome eller HStouch som termostat. Lurer på om det kan skyldes at devicen mangler info på 

Device Type Internal: No API, Type: Type 0, SubType:

Endret av Johs.

Del dette innlegget


Lenke til innlegg
Del på andre sider

Det er riktig. Det er ingen termostat, teknisk sett, og i scripts kan jeg ikke implementere Thermostat API som kreves for at HomeSeer teknisk sett skal definere det som en.

Men det går å justere temperaturen med devicene. :) 

 

Det er ikke bare å sette riktig "Device Type", men det må også implementeres noen forhåndsdefinerte rutiner som scriptpakken ikke kan gjøre. Men det får bli når jeg oppgraderer scriptet til en plugin. ;) 

Del dette innlegget


Lenke til innlegg
Del på andre sider

Mulighet for å legge til flere enn en HeaterDeviceReference?(Har fire panelovner tilkoblet hver sine wall-plugs på stua)

Del dette innlegget


Lenke til innlegg
Del på andre sider
9 timer siden, gullfrode skrev:

Mulighet for å legge til flere enn en HeaterDeviceReference?(Har fire panelovner tilkoblet hver sine wall-plugs på stua)

Tja... det er teknisk mulig å skrive om scriptet slik at HeaterDeviceReference er en kommaseparert liste...?

 

Det jeg hadde gjort er å først lage en virtuell device som heter f.eks. "Varme", og så laget to eventer som skrur av eller på alle panelovnene dine når "Varme" blir skrudd av eller på. Deretter er det bare å la scriptet styre "Varme" istedenfor å styre panelovnen direkte. :) 

Del dette innlegget


Lenke til innlegg
Del på andre sider
1 minutt siden, ZoRaC skrev:

I siste versjon av HS kan man linke devicer. Kan man ikke bare linke panelovnene?

Jo! Det er faktisk en mulignet! :)

Hvis man vil kunne styre det avhengig av tid på døgnet kan man jo også bruke CloneDevice.vb-scriptet mitt.

 

Tenkte ikke på den muligheten... 😖

:P 

  • Like 1

Del dette innlegget


Lenke til innlegg
Del på andre sider

Kongle!

Master Moskus, får du til å implementere i scriptet at om en/flere dørsensorer er åpen så skrur ovnene seg av, eller må man løse det med  if VD ditt eller datt. 

Begynner å bnærme seg funksjonalitet i Hc2 dette Homeseergreiene;-P

Del dette innlegget


Lenke til innlegg
Del på andre sider
Et øyeblikk siden, gullfrode skrev:

Master Moskus, får du til å implementere i scriptet at om en/flere dørsensorer er åpen så skrur ovnene seg av, eller må man løse det med  if VD ditt eller datt.

Du kan komme veldig langt med scripting, men når scriptet trenger input fra andre sensorer, så må man uansett til med et event. Da kan man like greit lage et event som skrur av termostaten når du åpner vinduet, og på igjen etterpå.

 

Eventuelt kan du bruke DeviceState.vb-scriptet mitt til å lagre statusen på termostaten (mode og temperatur), slik at du kan få nøyaktig samme innstilling før og etter åpning av vinduet/døren.

 

 

... med mindre @ZoRaC kommer på en mulighet jeg har oversett. ;) 

  • Like 1

Del dette innlegget


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

Kongle!

Master Moskus, får du til å implementere i scriptet at om en/flere dørsensorer er åpen så skrur ovnene seg av, eller må man løse det med  if VD ditt eller datt. 

I mitt system, endrer jeg bare settpunkt på termostaten til f.eks 10grader når dører/vinduer åpnes.

Del dette innlegget


Lenke til innlegg
Del på andre sider
9 minutter siden, Blodstrupmoen skrev:

I mitt system, endrer jeg bare settpunkt på termostaten til f.eks 10grader når dører/vinduer åpnes.

Men da er det en reell termostat og ikke en virtuell?

Del dette innlegget


Lenke til innlegg
Del på andre sider
15 minutter siden, Blodstrupmoen skrev:

I mitt system, endrer jeg bare settpunkt på termostaten til f.eks 10grader når dører/vinduer åpnes.

Utfordringen er mer hva du skal sette den til når du lukker vinduet igjen. :)

 

Del dette innlegget


Lenke til innlegg
Del på andre sider
Et øyeblikk siden, Moskus skrev:

Utfordringen er mer hva du skal sette den til når du lukker vinduet igjen. :)

Da settes den til den verdien som er relevant for tidspunkt på døgnet. Fungerer utmerket.

 

Målet mitt med HA er at det skal være automatisk, og man skal slippe å trykke/skru på knapper for å få det som man vil. Dette har jeg oppnådd ganske bra, og det er ytterst sjelden det er behov for å endre temp, lys etc. ut over det som er satt i systemet. Men hvis man skulle ha endret settpunkt manuelt, så vil det jo gå tilbake til standard verdi etter av vindu/dør har vært åpnet. Dette ser jeg på som helt uproblematisk.

Del dette innlegget


Lenke til innlegg
Del på andre sider

Ja. Og det er fint mulig med HomeSeer hvis man kan scripte det. Som sagt, er det faktisk relativt enkelt med dette scriptet, men man får jo selvfølgelig enda flere muligheter hvis man bygger det selv.

 

Det jeg har gjort, er å sette skru av termostaten (eller sette setpoint til lav -> samme effekt), og så sette den på Auto etterpå (siden Auto kan gi deg forskjellig temperatur basert på klokkeslett).

Ferdig arbeid. :)

 

Del dette innlegget


Lenke til innlegg
Del på andre sider

Event som setter til manuell og gitt temp ved åpen dørsensor fungerte selvfølgelig fint med VD-ene. 

Lagde bare som Moskus foreslo en VD for rom med flere varmenoder, og egen event for av og på. 

Men hvordan implementere fridager-scriptet i scriptet, slik at Alternative scedule blir valgt på fridager?

Del dette innlegget


Lenke til innlegg
Del på andre sider
Den ‎15‎.‎04‎.‎2017 klokken 14.45, gullfrode skrev:

Men hvordan implementere fridager-scriptet i scriptet, slik at Alternative scedule blir valgt på fridager?

Hva nøyaktig er problemet? Det er vel bare å implementere scriptet, og referere det i .ini-filen?

Del dette innlegget


Lenke til innlegg
Del på andre sider
Hva nøyaktig er problemet? Det er vel bare å implementere scriptet, og referere det i .ini-filen?

Ikke noe problem, bare løsning.
Dvs AlternativeScheduleDeviceReference="Reference ID på Fridag-device"
Takk Moskus, noob som nevnt.
  • Like 1

Del dette innlegget


Lenke til innlegg
Del på andre sider

Hei,

 

denne er veldig aktuell for meg. Har fulgt oppskriften over (flere ganger), men får ikke dette til å virke. Det blir ikke opprettet noe event jeg kan jobbe videre med.

Har fulgt oppskriften til punkt og prikke.

(kan sies at jeg "remoter" inn)

 

Noen tips?

 

takk,

 

S

Del dette innlegget


Lenke til innlegg
Del på andre sider

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå

  • Lignende innhold

    • Av Moskus
      Dette scriptet lar deg logge alle bevegelser til en device, slik at det blir enklere å se på web eller HStouch. Bevegelser (eller enhver hendelse) blir da logget slik.
       

       
       MotionLog.vb (ny)
      Public Sub Main(ByVal input As Object) Dim logDeviceRef As Integer = 1081 ' Update this Dim count As Integer = 9 'Maximum number of lines shown on the device - 1. 9 means 10 lines are shown Dim currentText As String = hs.DeviceString(logDeviceRef) currentText = currentText.Replace("<br>", "|") Dim lines() As String = currentText.Split("|") If lines.GetLength(0) < count Then count = lines.GetLength(0) Dim oldLines(count - 1) As String Array.Copy(lines, oldLines, count) 'Creating the device text Dim newText As String = Now.Date & " " & Now.ToLongTimeString & " - " & input.ToString If lines.GetLength(0) > 0 And lines(0) <> "" Then newText &= "<br>" 'Adding the previous lines newText &= String.Join("<br>", oldLines) 'Updating the device string hs.SetDeviceString(logDeviceRef, newText, True) 'hs.TriggerEvent("Restart SisteBeveglse timer") lines = Nothing oldLines = Nothing End Sub  
       
       
      For hver bevegelsessensor har jeg da et event som blir trigget ved bevegelse (selvfølgelig! ), som i tillegg til å styre lys der det er nødvendig, kjører dette scriptet med sub Main og parameter med navnet på sensoren, som "Kjøkken" eller "Stue".
       
      I tillegg har jeg en timer som he ter "SisteBevegelse", som jeg resetter når dette skjer. Hvis du også vil bruke dette, må du opprette den timeren, lage et Event (som jeg har kalt "Restart SisteBevegelse timer" fordi det ikke finnes kode for å restarte den), og fjerne fnutten foran den nest siste linjen i koden.
       
       
      EDIT: Oppdatert slik at det blir penere i HStouch.  
      EDIT2:  Bruker arrays for å gjøre scriptet enklere. Burde nå kjøre på Linux uten problemer.
    • Av Jonnyhar
      Hei.
       
      Jeg har laget et script for å starte og parkere Gardena Smart Sileno gressklippere. Testet og fungerer på min Gardena Smart Sileno R100Li.
      Legg inn e-postadressen, passordet, og navnet på klipperen på linje 12->14 i skriptet.
      Sett logJson = True for å se alt i json-responsen fra Gardena. Det ligger mye nyttig informasjon i responsen fra get_device_id.
       
      Kall scriptet med parameter start eller stop.
      Disse parametrene blir så brukt lenger nede i scriptet til:
       
          'Available start commands:
          'Start according to schedule: "{""name"":""start_resume_schedule"", ""parameters"":{}}"
          'Start overriding schedule. Run for 1440 minutes: "{""name"":""start_override_timer"", ""parameters"":{""duration"": 1440}}"
          
          'Available stop commands:
          'Park and pause all schedules: "{""name"":""park_until_further_notice""}"
          'Park and start again at next schedule: "{""name"":""park_until_next_timer""}"
      Imports System.IO Imports System.Net '*** Choose if json-responces should get written to the log *** Const logJson As Boolean = False '************************************************************** Public Sub Main(ByVal command As String) '*** Put in e-mailadress and password and lawnmover-name *** '*** They must be exactly as entered into the Gardena app *** Dim email As String = "myemail@gmail.com" Dim password As String = "Mypassword" Dim mower_name As String = "Name_of_lawnmower_in_gardena_app" '************************************************* '*** NO NEED TO EDIT BEHIND THIS POINT! *** '************************************************* 'Get token and username Dim jsonGetToken As String = "{""sessions"":{""email"":""" & email & """,""password"":""" & password & """}}" Dim tokenAndUser() As String = getToken(jsonGetToken) 'Get location Dim location As String = getLocation(tokenAndUser) 'Get device-id for lawnmover set in mower_name Dim locationAndToken(3) as String locationAndToken(0) = tokenAndUser(0) locationAndToken(1) = location locationAndToken(2) = mower_name Dim deviceId As String = getdeviceId(locationAndToken) 'Send start or stop command to mower Dim data(4) as String data(0) = tokenAndUser(0) data(1) = location data(2) = deviceId data(3) = command sendCommand(data) End Sub Public Function getToken(json As string) As String() 'Get token and user ID based on e-mail and password Dim strURL As String = "https://sg-api.dss.husqvarnagroup.net/sg-1/sessions" Dim myWebReq As HttpWebRequest Dim myWebResp As HttpWebResponse Dim encoding As New System.Text.UTF8Encoding Dim sr As StreamReader Dim result(2) As String Try Dim data As Byte() = encoding.GetBytes(json) myWebReq = DirectCast(WebRequest.Create(strURL), HttpWebRequest) myWebReq.ContentType = "application/json" myWebReq.ContentLength = data.Length myWebReq.Method = "POST" Dim myStream As Stream = myWebReq.GetRequestStream() If data.Length > 0 Then myStream.Write(data, 0, data.Length) myStream.Close() End If myWebResp = DirectCast(myWebReq.GetResponse(), HttpWebResponse) sr = New StreamReader(myWebResp.GetResponseStream()) Dim responseText As String = sr.ReadToEnd() if logJson Then hs.WriteLog("Gardena", "Response getToken: " & responseText) End If 'Search json for token Dim sSource As String = responseText 'String that is being searched Dim sDelimStart As String = """token"":""" 'First delimiting word Dim sDelimEnd As String = """,""user_id" 'Second delimiting word Dim nIndexStart As Integer = sSource.IndexOf(sDelimStart) 'Find the first occurrence of f1 Dim nIndexEnd As Integer = sSource.IndexOf(sDelimEnd) 'Find the first occurrence of f2 If nIndexStart > -1 AndAlso nIndexEnd > -1 Then '-1 means the word was not found. Dim token As String = Strings.Mid(sSource, nIndexStart + sDelimStart.Length + 1, nIndexEnd - nIndexStart - sDelimStart.Length) 'Crop the text between hs.WriteLog("Gardena", "Token: " & token) 'We got the token, continue to get the user id sDelimStart = "user_id"":""" 'First delimiting word sDelimEnd = """,""refresh_token" 'Second delimiting word nIndexStart = sSource.IndexOf(sDelimStart) 'Find the first occurrence of f1 nIndexEnd = sSource.IndexOf(sDelimEnd) 'Find the first occurrence of f2 If nIndexStart > -1 AndAlso nIndexEnd > -1 Then '-1 means the word was not found. Dim user As String = Strings.Mid(sSource, nIndexStart + sDelimStart.Length + 1, nIndexEnd - nIndexStart - sDelimStart.Length) 'Crop the text between hs.WriteLog("Gardena", "User: " & user) result(0) = token result(1) = user return result Else hs.WriteLog("Gardena", "Error: Did not receive user ID") End If Else hs.WriteLog("Gardena", "Error: Did not receive token") End If Catch ex As Exception : hs.writelog("Gardena", "Error: " & ex.Message.ToString) End Try End Function Public Function getLocation(tokenAndUser() As String) As String 'Get location based on token and user id Dim token As String = tokenAndUser(0) Dim user As String = tokenAndUser(1) Dim strURL As String = "https://sg-api.dss.husqvarnagroup.net/sg-1/locations/?user_id=" & user Dim myWebReq As HttpWebRequest Dim myWebResp As HttpWebResponse Dim sr As StreamReader Try myWebReq = DirectCast(WebRequest.Create(strURL), HttpWebRequest) myWebReq.ContentType = "application/json" myWebReq.Method = "GET" myWebReq.Headers.Add("X-session", token) myWebResp = DirectCast(myWebReq.GetResponse(), HttpWebResponse) sr = New StreamReader(myWebResp.GetResponseStream()) Dim responseText As String = sr.ReadToEnd() if logJson Then hs.WriteLog("Gardena", "Response getLocation: " & responseText) End if 'Search json for location Dim sSource As String = responseText 'String that is being searched Dim sDelimStart As String = """id"":""" 'First delimiting word Dim sDelimEnd As String = """,""name" 'Second delimiting word Dim nIndexStart As Integer = sSource.IndexOf(sDelimStart) 'Find the first occurrence of f1 Dim nIndexEnd As Integer = sSource.IndexOf(sDelimEnd) 'Find the first occurrence of f2 If nIndexStart > -1 AndAlso nIndexEnd > -1 Then '-1 means the word was not found. Dim location As String = Strings.Mid(sSource, nIndexStart + sDelimStart.Length + 1, nIndexEnd - nIndexStart - sDelimStart.Length) 'Crop the text between hs.WriteLog("Gardena", "Location: " & location) return location Else hs.WriteLog("Gardena", "Error: Did not receive location") End If Catch ex As Exception : hs.writelog("Gardena", "Error: " & ex.Message.ToString) End Try End Function Public Function getdeviceId(tokenAndLocation() As String) As String 'Get device id for lawnmover based on location and mower_name Dim token As String = tokenAndLocation(0) Dim location As String = tokenAndLocation(1) Dim mower_name As String = tokenAndLocation(2) Dim strURL As String = "https://sg-api.dss.husqvarnagroup.net/sg-1/devices?locationId=" & location Dim myWebReq As HttpWebRequest Dim myWebResp As HttpWebResponse Dim sr As StreamReader Try myWebReq = DirectCast(WebRequest.Create(strURL), HttpWebRequest) myWebReq.ContentType = "application/json" myWebReq.Method = "GET" myWebReq.Headers.Add("X-session", token) myWebResp = DirectCast(myWebReq.GetResponse(), HttpWebResponse) sr = New StreamReader(myWebResp.GetResponseStream()) Dim responseText As String = sr.ReadToEnd() if logJson Then hs.WriteLog("Gardena", "Response getLocation: " & responseText) End If 'Finn Device ID Dim sSource As String = responseText 'String that is being searched Dim sDelimEnd As String = """,""name"":""" & mower_name & """,""category"":""mower""" 'Second delimiting word Dim nIndexStart As Integer = sSource.IndexOf(sDelimEnd) - 36 Dim nIndexEnd As Integer = sSource.IndexOf(sDelimEnd) 'Find the first occurrence of f2 If nIndexStart > -1 AndAlso nIndexEnd > -1 Then '-1 means the word was not found. Dim deviceId As String = Strings.Mid(sSource, nIndexStart + 1, nIndexEnd - nIndexStart) 'Crop the text between hs.WriteLog("Gardena", "Device ID: " & deviceId) return deviceId Else hs.WriteLog("Gardena", "Error: Did not receive device ID") End If Catch ex As Exception : hs.writelog("Gardena", "Error: " & ex.Message.ToString) End Try End Function Public Function sendCommand(data() As String) 'Send start or stop to the mower. Dim token As String = data(0) Dim location As String = data(1) Dim device As String = data(2) Dim command As String = data(3) Dim json As String '*** Here you can change what start and stop does.*** 'Available start commands: 'Start according to schedule: "{""name"":""start_resume_schedule"", ""parameters"":{}}" 'Start overriding schedule. Run for 1440 minutes: "{""name"":""start_override_timer"", ""parameters"":{""duration"": 1440}}" 'Available stop commands: 'Park and pause all schedules: "{""name"":""park_until_further_notice""}" 'Park and start again at next schedule: "{""name"":""park_until_next_timer""}" if command = "start" Then json = "{""name"":""start_resume_schedule"", ""parameters"":{}}" else if command = "stop" Then json = "{""name"":""park_until_further_notice""}" else hs.writelog("Gardena", "Error: Angi start eller stop som parameter") End If Dim strURL As String = "https://sg-api.dss.husqvarnagroup.net/sg-1/devices/" & device & "/abilities/mower/command?locationId=" & location Dim myWebReq As HttpWebRequest Dim myWebResp As HttpWebResponse Dim encoding As New System.Text.UTF8Encoding Dim sr As StreamReader Try Dim data As Byte() = encoding.GetBytes(json) myWebReq = DirectCast(WebRequest.Create(strURL), HttpWebRequest) myWebReq.ContentType = "application/json" myWebReq.ContentLength = data.Length myWebReq.Headers.Add("X-session", token) myWebReq.Method = "POST" Dim myStream As Stream = myWebReq.GetRequestStream() If data.Length > 0 Then myStream.Write(data, 0, data.Length) myStream.Close() End If myWebResp = DirectCast(myWebReq.GetResponse(), HttpWebResponse) sr = New StreamReader(myWebResp.GetResponseStream()) Dim responseText As String = sr.ReadToEnd() hs.WriteLog("Gardena", "Sent command: " & command) Catch ex As Exception : hs.writelog("Gardena", "Error: " & ex.Message.ToString) End Try End Function  
    • Av Julius
      Hei, har nettopp startet med homeseer og ønsker å lage noen enkle skript i c#. Men det er vist ikke like enkelt...
       
      Scenario: Har skrevet data til en influxdb og vil lese disse igjen (med en mean aggregering). Problemet er at jeg vil bruke Newtonsoft.Json.Net til å parse JSON resultatet. See hele koden under. 
       
      Problemet er hvordan refererer jeg til Newtonsoft.Json.dll? I følge dokumentasjonen jeg fant her (under c# scripting) så står det: 
       
      Så det gjorde jeg... Jeg ser at Newtonsoft.Json.dll ligger i bin\Homeseer folderen og tenkte der for at det ikke var nødvending å legge til noe path. Har prøvd mye men får feil hele tiden. Det virker ikke som //css_reference har noen effekt.
       
      Kode:
      //css_reference Newtonsoft.Json.dll; using Newtonsoft.Json; using Newtonsoft.Json.Linq; public object Main(object param) { var sensitivity = double.Parse((string)param); var deviceId = 271; var INFLUX_DB_SERVER_IP = "10.0.0.104"; var INFLUX_DB_SERVER_PORT = "8086"; var INFLUX_DB_DATABASE_NAME = "homeseer"; var query = "q=select mean(value) from Downstairs_Bathroom_Humidity where time > now() - 1d"; var url = "http://" + INFLUX_DB_SERVER_IP + ":" + INFLUX_DB_SERVER_PORT + @"/query?db=" + INFLUX_DB_DATABASE_NAME; var request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; try { request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; var data = System.Text.Encoding.ASCII.GetBytes(query); request.ContentLength = data.Length; request.Timeout = 5000; var stream = request.GetRequestStream(); try { stream.Write(data, 0, data.Length); } finally { stream.Close(); } var response = (System.Net.HttpWebResponse)request.GetResponse(); var responseString = new System.IO.StreamReader(response.GetResponseStream()).ReadToEnd(); var result = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString); var meanValue = (double) ((Newtonsoft.Json.Linq.JValue)((Newtonsoft.Json.Linq.JContainer)result)["results"].First["series"].First["values"].First.Last).Value; var value = hs.DeviceValue(deviceId); if((value - sensitivity) > meanValue) { hs.TriggerEvent("Run Ventilator for 10 minuttes"); hs.WriteLog("Julius-Ventilation", "Info: Triggered Ventilation"); } } catch (System.Exception ex) { hs.WriteLog("Julius-Ventilation", "Error: " + ex.Message); } return 0; } Feil medling:
      Compiling script C:\Program Files (x86)\HomeSeer HS3\scripts\CSharpTest.cs: {interactive}(93,30): error CS0103: The name `Newtonsoft' does not exist in the current context {interactive}(93,41): error CS0023: The `.' operator cannot be applied to operand of type `' {interactive}(93,17): error CS0825: The contextual keyword `var' may only appear within a local variable declaration {interactive}(95,106): error CS0841: A local variable `result' cannot be used before it is declared {interactive}(95,74): error CS0246: The type or namespace name `Newtonsoft' could not be found. Are you missing a using directive or an assembly reference? {interactive}(95,17): error CS0825: The contextual keyword `var' may only appear within a local variable declaration {interactive}(101,44): error CS0841: A local variable `meanValue' cannot be used before it is declared {interactive}(11,17): warning CS0414: The private field `Script.hs' is assigned but its value is never used  
    • Av ZoRaC
      Scriptet er basert på @Moskus sitt "Fridager.vb":

      Tar derfor bare "kortversjonen" av oppsettet her:
      * Lag en virtuell device "Flaggdag" med verdiene "Ja" (On) og "Nei" (Off)
      * Noter deg devID
      * Lag "Flaggdag.vb":
      Sub Main(ByVal deviceReference As String) 'Moskus 2017 Dim devRef As Integer = Integer.Parse(deviceReference.ToString) Dim isCurrentDateFlagday As Boolean = IsFlagday(Now) If isCurrentDateFlagday Then hs.CAPIControlHandler(hs.CAPIGetSingleControlByUse(devRef, HomeSeerAPI.ePairControlUse._On)) Else hs.CAPIControlHandler(hs.CAPIGetSingleControlByUse(devRef, HomeSeerAPI.ePairControlUse._Off)) End If End Sub Public Function IsFlagday(ByVal _date As Date) As Boolean 'translated php script form xibriz: https://www.diskusjon.no/index.php?showtopic=1084239 _date = _date.Date 'in case time was added Dim easterDate As Date = GetEasterDate(_date.Year) 'Sjekker om datoen er 1. Januar If _date = New Date(_date.Year, 1, 1) Then Return True 'Sjekker om datoen er 21. Januar (Prinsesse Ingrid Alexandra) If _date = New Date(_date.Year, 1, 21) Then Return True 'Sjekker om datoen er 6. februar (samefolkets dag) If _date = New Date(_date.Year, 2, 6) Then Return True 'Sjekker om datoen er 21. februar (Kong Haralds bursdag) If _date = New Date(_date.Year, 2, 21) Then Return True 'Sjekker om datoen er 1. påskedag If _date = easterDate Then Return True 'Sjekker om datoen er 1. mai (offentlig høytidsdag) If _date = New Date(_date.Year, 5, 1) Then Return True 'Sjekker om datoen er 8. mai (frigjøringsdag) If _date = New Date(_date.Year, 5, 8) Then Return True 'Sjekker om datoen er 17. mai (grunnlovsdag) If _date = New Date(_date.Year, 5, 17) Then Return True 'Sjekker om datoen er 7. juni (unionsoppløsning) If _date = New Date(_date.Year, 6, 7) Then Return True 'Sjekker om datoen er 1. pinsedag (50. påskedag) If _date = easterDate.AddDays(49) Then Return True 'Sjekker om datoen er 4. juli (Dronning Sonja) If _date = New Date(_date.Year, 7, 4) Then Return True 'Sjekker om datoen er 20. juli (Kronprins Haakon) If _date = New Date(_date.Year, 7, 20) Then Return True 'Sjekker om datoen er 29. juli (Olsok) If _date = New Date(_date.Year, 7, 29) Then Return True 'Sjekker om datoen er 19. august (Mette-Marit) If _date = New Date(_date.Year, 8, 19) Then Return True 'Sjekker om datoen er 1. juledag (25. desember) If _date = New Date(_date.Year, 12, 25) Then Return True Return False End Function Public Function GetEasterDate(ByVal Year As Integer) As Date 'Originally taken from: http://www.thoughtproject.com/Snippets/Easter/Easter.vb.txt Dim a As Integer Dim b As Integer Dim c As Integer Dim d As Integer Dim e As Integer Dim f As Integer Dim g As Integer Dim h As Integer Dim i As Integer Dim k As Integer Dim l As Integer Dim m As Integer Dim n As Integer Dim p As Integer If Year < 1583 Then Return Nothing Else ' Step 1: Divide the year by 19 and store the ' remainder in variable A. Example: If the year ' is 2000, then A is initialized to 5. a = Year Mod 19 ' Step 2: Divide the year by 100. Store the integer ' result in B and the remainder in C. b = Year \ 100 c = Year Mod 100 ' Step 3: Divide B (calculated above). Store the ' integer result in D and the remainder in E. d = b \ 4 e = b Mod 4 ' Step 4: Divide (b+8)/25 and store the integer ' portion of the result in F. f = (b + 8) \ 25 ' Step 5: Divide (b-f+1)/3 and store the integer ' portion of the result in G. g = (b - f + 1) \ 3 ' Step 6: Divide (19a+b-d-g+15)/30 and store the ' remainder of the result in H. h = (19 * a + b - d - g + 15) Mod 30 ' Step 7: Divide C by 4. Store the integer result ' in I and the remainder in K. i = c \ 4 k = c Mod 4 ' Step 8: Divide (32+2e+2i-h-k) by 7. Store the ' remainder of the result in L. l = (32 + 2 * e + 2 * i - h - k) Mod 7 ' Step 9: Divide (a + 11h + 22l) by 451 and ' store the integer portion of the result in M. m = (a + 11 * h + 22 * l) \ 451 ' Step 10: Divide (h + l - 7m + 114) by 31. Store ' the integer portion of the result in N and the ' remainder in P. n = (h + l - 7 * m + 114) \ 31 p = (h + l - 7 * m + 114) Mod 31 ' At this point p+1 is the day on which Easter falls. ' n is 3 for March or 4 for April. Return DateSerial(Year, n, p + 1) End If End Function * Lag disse eventene:

      (parameters er devID til devicen du laget)
       
      Påminnelse om å flagge:

      (jeg bruker et script som sender meg pushvarsel via Pushover, hvis jeg er hjemme, men du kan bruke hva du vil som "action")

      Påminnelse om å ta ned:

      Her er "cannot re-run for" en fordel, for man skal ta ned flagget enten kl 2100 eller ved solnedgang. Ønsker ikke påminnelse på begge de tidspunktene.  
    • Av mpdei
      Jeg ønsker å få til trinnvis belysning av trappetrinn på samme måte som her: https://kreativbelysning.no/butikk/trappebelysning/automatisk-trappebelysning
      Tenker følgende:
      - Bevegelsesdetektor i topp og bunn
      - 4 stk Fibaro rgbw hvor hver utgang er koblet til ett trinn
      - Lage et script som styrer rekkefølgen og tidsintervall på når hvert trinn tennes (hsp.WaitMS?)
       
      Utfordringen er at jeg aldri har laget et script før, og vet knapt nok hvordan det fungerer. Så mitt spørsmål er: hvordan skal et slikt script skrives?
       
       
      Setter stor pris på tips i riktig retning
       
       
×