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

Søk i nettsamfunnet

Viser resultater for emneknaggene 'script'.

  • Søk etter emneknagger

    Skriv inn nøkkelord separert med kommaer.
  • Søk etter forfatter

Innholdstype


Kategorier

  • Generelt
    • Automasjonskaféen
    • Annen Elektronikk
    • Ditt system
    • Grafikk og design
    • Nettverk
    • Nybegynner
  • Bruksområder
    • A/V-kontroll
    • Belysning
    • Klimakontroll
    • Overvåking
    • Sikkerhet
    • Strømsparing og strøm-overvåkning
    • Talestyring
  • Systemer
    • Domoticz
    • Fibaro Home Center
    • Futurehome
    • HDL
    • Home Assistant
    • HomeKit
    • HomeSeer
    • Homey
    • Indigo Domotics
    • Node-Red
    • openHAB
    • Sensio
    • SmartThings
    • Telldus Live!
    • Vera
    • Z-Way
    • Zipato
    • Øvrige systemer
  • Teknologi / Protokoller
    • Blåtann
    • irDA
    • KNX
    • Mikrokontrollere
    • MQTT
    • RF
    • xComfort
    • Z-Wave
    • ZigBee
  • Utlån, kjøp og salg
    • Prisjakt
    • Kjøp / Salg
    • Powerbuy
    • Kommersielle tilbud
    • Utlån
  • Nettstedet
    • Kunngjøringer
    • Nyheter
    • Ris, ros og spørsmål om forumet

Blogger

  • En teknologisk hverdag
  • Enda en hobby?
  • Smånytt
  • en guide til elektro-verdenen

Kategorier

  • Filer
  • HomeSeer
  • Z-Wave

Kategorier

  • Nyheter
    • Produkter
    • Programvare
  • Tester
    • Systemer
  • Guider
    • Fibaro
    • HomeSeer
    • Nettverk
    • openHAB
    • Z-Wave
    • ESP32

Kategorier

  • Regler

Kalendre

  • Eventerer

Product Groups

Ingen resultater.


Finn resultater i...

Finn resultater som inneholder...


Startdato

  • Start

    Slutt


Sist oppdatert

  • Start

    Slutt


Filtrer etter antall...

Ble med

  • Start

    Slutt


Gruppe


Om meg


System

  1. Under "Flows" finnes det en knapp for variabler. Oppretter man variabler der, kan de adresseres som tags i flows. Kjører jeg "example-global-get.js" under "Scripts", hadde jeg forventet å se disse variablene, men de listes ikke. Kan noen kort forklare eller henvise til literatur angående scope på variabler i Homey Scripts? Er objektmodellen den samme under Athom Homey Pro 2019 og 2023?
  2. Jeg har en del virtuelle enheter som jeg ønsker å kunne "nullstille" ved å sette verdien på alle enhetene til 0. Har forsøkt å bruke hs.SetDeviceValueByRef men får det ikke helt til å fungere. Hvordan kan jeg enklest mulig liste opp alle adressene som jeg ønsker å sette til 0? PS. Ikke veldig bevandret med script, men dette er sikkert en smal sak for dere som kan scripting, så setter stor pris på om noen ville ta seg tid til å gi meg en "ferdig" script-tekst jeg kan kopiere.
  3. Hei! Utvikleren til Device History plugin-et har vore meget serviceinnstilt og levert kode for å hente ut gjennomsnittsverdi frå sist time og skrive verdien til et virtuellt device. På denne måten kan eg sammenligne direkte med en verdi, istedenfor å gjennomsnittsberegne for kvar enkelt funksjon. Koden er som følger: Public Sub UpdateHourlyStats(parms As String) Dim intSourceRef As Integer Dim intDestRef As Integer Dim dtmFrom As Date Dim dtmTo As Date Dim strDeviceStats As String Dim astrStats() As String Const IDX_STATS_MIN As Integer = 0 Const IDX_STATS_MAX As Integer = 1 Const IDX_STATS_AVG As Integer = 2 Const IDX_STATS_COUNT As Integer = 3 Dim dblMin As Double Dim dblMax As Double Dim dblAvg As Double Dim intCount As Integer 'figure out the parameters intSourceRef = CType(parms.Split(";")(0), Integer) intDestRef = CType(parms.Split(";")(1), Integer) dtmTo = Date.Now dtmFrom = dtmTo.AddHours(-1) hs.WriteLog("Device History", "Getting updated stats for device " & intSourceRef & " from '" & dtmFrom.ToString() & "' to '" & dtmTo.ToString() & "' ...") 'Ask the plugin for the stats strDeviceStats = hs.PluginFunction("Device History", "", "GetRangeStats", {intSourceRef.ToString(), dtmFrom.ToString(), dtmTo.ToString()}) 'Parse the response into discrete variables astrStats = strDeviceStats.Split("|") If astrStats.Length() = 4 Then dblMin = astrStats(IDX_STATS_MIN) dblMax = astrStats(IDX_STATS_MAX) dblAvg = astrStats(IDX_STATS_AVG) intCount = astrStats(IDX_STATS_COUNT) 'Do something with the output hs.WriteLog("Device History", "Device " & intSourceRef & " ranged from " & dblMin & " to " & dblMax & ", with an average value of " & dblAvg & " taken from " & intCount & " changes.") hs.WriteLog("Device History", "Updating device " & intDestRef & " with value " & dblAvg) hs.SetDeviceValueByRef(intDestRef, dblAvg, True) Else hs.WriteLog("Error", "Retrieval of stats for device " & intSourceRef & " failed.") End If End Sub Korleis lagre som .vb fil? Og så må eg ha litt rettleiing på kva som er rett device-ref. Er det root-device, eller ref på funksjoner etc. Edit: I tillegg ser det ut til eg også må lære å legge inn kode som skjult tekst og rett formatering, slik som de andre bruker.
  4. Det hender jeg eksperimenterer med Z-wave, til og med på hovedsystemet. Jeg har et par Z-wave-interfacer jeg bytter mellom (kjører restore av backup til et nytt interface før for mye testing), og det fjerner all potensiell routing-informasjon. I løpet av de første timene prøver altså huset å "finne seg selv", alt går litt tregt, og det blir høyere risiko for at noe er satt til "Unknown". Jeg skrev et script for å finne disse enhetene, og så polle dem for å faktisk lese statusen de har. Det hjelper både for å få fjernet de irriterende "Unknown"-status'ene, og det hjelper på å bedre routingen fordi kommandoen blir utført. For at dette skal fungere ut av esken må HomeSeer finne seg selv på localholst på port 80. Hvis ikke må du endre "Dim url as String"-linja. CheckForUnknown.vb Public Sub Main(ByVal params As Object) 'Moskus 2020 Dim subStart As DateTime = DateTime.UtcNow Dim url As String = "http://localhost/json?request=getstatus" Dim json As String = "" Dim DEBUG As Boolean = False If DEBUG Then hs.WriteLog("CheckForErrors", "Downloading data... ") Using client As New System.Net.WebClient json = client.DownloadString(url) json = json.ToLower() End Using If DEBUG Then hs.WriteLog("CheckForErrors", "Download done!") Dim searchString As String = ("{""ref"":").ToLower() Dim errorSearchString As String = ("""status"":""Unknown"",""device_type_string"":""Z-Wave Switch").ToLower() Dim lst As New System.Collections.Generic.List(Of Integer) Dim start As Integer = 0 If json.IndexOf(errorSearchString) > 0 Then ' Yes, we have errors, lets find the devices by looping through all devices While start <> -1 Dim deviceJsonStart As Integer = json.IndexOf(searchString, start) If deviceJsonStart = -1 Then Exit While Dim deviceJsonEnd As Integer = json.IndexOf(searchString, deviceJsonStart + searchString.Length) If deviceJsonEnd = -1 Then Exit While Dim deviceJson As String = json.Substring(deviceJsonStart, deviceJsonEnd - deviceJsonStart) 'This is the JSON for a device If deviceJson.Contains(errorSearchString) Then 'Check if the device contains the error and get the deviceRef if it doesn't Dim deviceRef As Integer = deviceJson.Substring(searchString.Length, deviceJson.IndexOf(",") - searchString.Length) lst.Add(deviceRef) If DEBUG Then hs.WriteLog("CheckForErrors", "Found reference '" + deviceRef.ToString + "'") End If start = json.IndexOf(searchString, deviceJsonStart + 10) End While End If For Each d As Integer In lst Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(d) Dim devName As String = dev.Location2(hs) & ", " & dev.Location(hs) & ", " & dev.Name(hs) Dim pollResult As HomeSeerAPI.IPlugInAPI.PollResultInfo = hs.PluginFunction("Z-Wave", "", "PollDevice", New Object() {d}) hs.WriteLog("CheckForErrors", "Poll of device " & d.ToString & " (" & devName & ") returned " & pollResult.Result.ToString & " (" & pollResult.Value & ")") 'Check if the device has the correct value If pollResult.Result = HomeSeerAPI.IPlugInAPI.enumPollResult.OK OrElse pollResult.Result = HomeSeerAPI.IPlugInAPI.enumPollResult.Timeout_OK Then Dim pollValue As Integer = pollResult.Value Dim devValue As Integer = hs.DeviceValue(d) 'Set the device to the correct value If devValue <> pollValue Then For Each CAPI As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(d) If CAPI.ControlValue = devValue Then Dim response As CAPIControlResponse = hs.CAPIControlHandler(CAPI) hs.WriteLog("CheckForErrors", "Set " & d.ToString & " (" & devName & ") to " & CAPI.Label & ": " & response.ToString) Exit For End If Next End If End If Next hs.WriteLog("CheckForErrors", "Done! Elapsed time: " & Math.Round(DateTime.UtcNow.Subtract(subStart).TotalSeconds, 2) & " seconds") End Sub Jeg kjører dette scriptet i et event hver 10. minutt. Men jeg har også en begrensning på at det ikke må ha vært bevegelse i huset i løpet av 5 minutter for å redusere trafikken når routingen er på det verste. Jeg hadde selvfølgelig tenkt å disable scriptet når det ikke var behov for det, men ellers merker jeg ikke noe til det for det er særdeles sjeldent scriptet finner "Unknown" lenger, det ser jeg jo nå i loggen.
  5. Sub Main(ByVal input As Object) Dim deviceRef As Integer = input.ToString Dim weekNumber As Integer = DatePart(DateInterval.WeekOfYear, Date.Now, FirstDayOfWeek.Monday, FirstWeekOfYear.System) hs.SetDeviceValueByRef(input, weekNumber, True) hs.SetDeviceString(input, "Uke " & weekNumber, False) End Sub
  6. Sub Main(ByVal parameters As Object) 'Moskus 2020 Dim devID As Integer = parameters.ToString Dim useHTMLtable As Boolean = True Dim url As String = "https://www.vg.no/spesial/2020/corona-viruset/data/norway-table-overview/" Dim source As String = "" Try Using client = 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("CoronaScript", "Net Feil: " & ex.Message) End Try If source = "" Then hs.WriteLog("CoronaScript", "Got no response from url: " & url) Exit Sub End If Dim json = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(source) Dim output As String = "" Try Dim confirmed As Integer = json("totals")("confirmed") If useHTMLtable Then output &= "<table border=0 cellspacing=0 cellpadding=0>" output &= "<tr><td><b>Totalt</b></td><td align='right'>" & json("totals")("confirmed") & "</td><td align='right'>" & json("totals")("dead") & "</td><td align='right'>" & json("totals")("recovered") & "</td></tr>" For i As Integer = 0 To json("cases").Count - 1 output &= "<tr><td>" & json("cases")(i)("name") & "</td><td align='right'>" & json("cases")(i)("confirmed") & "</td><td align='right'>" & json("cases")(i)("dead") & "</td><td align='right'>" & json("cases")(i)("recovered") & "</td></tr>" Next output &= "</table>" Else output &= "<b>Totalt: " & json("totals")("confirmed") & " / " & json("totals")("dead") & " / " & json("totals")("recovered") & "</b><br>" For i As Integer = 0 To json("cases").Count - 1 output &= "• " & json("cases")(i)("name") & ": " & json("cases")(i)("confirmed") & " / " & json("cases")(i)("dead") & " / " & json("cases")(i)("recovered") & "<br>" Next End If hs.SetDeviceString(devID, output, False) hs.SetDeviceValueByRef(devID, confirmed, True) Catch ex As Exception hs.WriteLog("CoronaScript", "Net Feil: " & ex.Message) End Try End Sub Trigger: Kjøres hvert 5. minutt Parameter: DeviceIDen til en virtuell device som skal holde verdien. Du kan endre variabelen "useHTMLtable" til False hvis du vil ha det i HStouch, for HStouch viser ikke pene HTML-tabeller... Oppdatert med data fra RapidAPI siden jeg ble lei av at VG er så dårlig på å oppdatere tallene sine: Sub Main(ByVal parameters As Object) 'Moskus 2020 Dim devID As Integer = parameters.ToString Dim url As String = "https://covid-193.p.rapidapi.com/statistics?country=Norway" Dim source As String = "" Try Using client = New System.Net.WebClient 'TLS1.2 and encoding (UTF8) Net.ServicePointManager.SecurityProtocol = Net.SecurityProtocolType.Tls12 client.Encoding = System.Text.Encoding.UTF8 'Headers client.Headers.Set("x-rapidapi-host", "covid-193.p.rapidapi.com") client.Headers.Set("x-rapidapi-key", "DIN_RAPIDAPI_KEY_HER") 'GET the url source = client.DownloadString(url) End Using Catch ex As Exception hs.WriteLog("CoronaScript", "Net Feil: " & ex.Message) End Try If source = "" Then hs.WriteLog("CoronaScript", "Got no response from url: " & url) Exit Sub End If Try Dim json = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(source) Dim confirmed As Integer = json("response")(0)("cases")("total") Dim output As String = "" output &= "<b>Aktive: " & json("response")(0)("cases")("active") & " (" & json("response")(0)("cases")("new") & ") " & "</b><br>" output &= "Totalt: " & json("response")(0)("cases")("total") & "<br>" output &= "Dødsfall: " & json("response")(0)("deaths")("total") & " (" & IIf(json("response")(0)("deaths")("new").ToString = "", "0", json("response")(0)("deaths")("new")) & ") " & "<br>" output &= "Testede: " & json("response")(0)("tests")("total") & "<br>" output &= "<i>Sist oppdatert: " & json("response")(0)("time") & "</i><br>" hs.SetDeviceString(devID, output, False) hs.SetDeviceValueByRef(devID, confirmed, True) Catch ex As Exception hs.WriteLog("CoronaScript Error", "Parsefeil: " & ex.Message) End Try End Sub Kjøres nå hver time, jeg vet ikke begrensningene hos RapidAPI.
  7. Public Sub Main(ByVal input As Object) 'Moskus 2020 Dim device As Scheduler.Classes.DeviceClass Dim DE As Scheduler.Classes.clsDeviceEnumeration Dim counter As Integer = 0 Dim counterBelow100 As Integer Dim filter As String = "batter" 'tar da både "battery" og "batteri" hs.WriteLog("Battery", "Looking for battery devices...") DE = hs.GetDeviceEnumerator() Do While Not DE.Finished device = DE.GetNext If device.Device_Type_String(hs).ToLower.Contains(filter) OrElse device.DeviceType_Get(hs).Device_Type_Description.ToLower.Contains(filter) OrElse device.Name(hs).Contains(filter) Then Dim devName As String = device.Location2(hs) & ", " & device.Location(hs) & ", " & device.Name(hs) Dim devValue As Double = hs.DeviceValueEx(device.Ref(hs)) If devValue < 100 Then hs.WriteLog("Battery", "Device: " & devName & ", battery: " & devValue) counterBelow100 += 1 End If counter += 1 End If Loop hs.WriteLog("Battery", "Done! Found " & counter & " devices, " & counterBelow100 & " have levels below 100%.") End Sub Bare lagre som "GetBatteryLevels.vb" og kjør det. Det skrives til loggen.
  8. 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. Hvis du oppdaterer, så kan du istedenfor kjøre "AddDeviceButtons"-funksjonen og bruke deviceID'en til eksisterende Twinkly-devicer som parameter (en om gangen). Twinkly.vb 'Moskus 2019-2020 Dim IP As String 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) IP = DirectCast(hs.GetDeviceByRef(deviceRef), Scheduler.Classes.DeviceClass).Device_Type_String(hs) Dim cmd As String = input(1) If cmd.StartsWith("Brightness_") Then Dim value As Integer = cmd.Split("_")(1) DoCmd("Brightness", value) Else If DoCmd(cmd) Then hs.SetDeviceString(deviceRef, cmd, True) End If If DoCmd(cmd) Then hs.SetDeviceString(deviceRef, cmd.Replace("_", " "), True) End Sub Public Function DoCmd(ByVal command As String, Optional ByVal value As Integer = 100) 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) If command = "Brightness" Then SetBrightness(value) Else SetMode(command) End If 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", 101, "Twinkly.vb", "ButtonPress", "Movie", 1, 1, 1)) hs.WriteLog("Twinkly", "Added button 2: " & hs.DeviceScriptButton_AddButton(devID, "Effect", 102, "Twinkly.vb", "ButtonPress", "Effect", 1, 2, 1)) hs.WriteLog("Twinkly", "Added button 3: " & hs.DeviceScriptButton_AddButton(devID, "Demo", 103, "Twinkly.vb", "ButtonPress", "Demo", 1, 3, 1)) hs.WriteLog("Twinkly", "Added button 4: " & hs.DeviceScriptButton_AddButton(devID, "Pause", 104, "Twinkly.vb", "ButtonPress", "RT", 1, 4, 1)) hs.WriteLog("Twinkly", "Added button 5: " & hs.DeviceScriptButton_AddButton(devID, "Off", 0, "Twinkly.vb", "ButtonPress", "Off", 1, 5, 1)) For i As Integer = 10 To 100 Step 10 hs.WriteLog("Twinkly", "Added dimming " & i & " : " & hs.DeviceScriptButton_AddButton(devID, (i & "%").ToString, i, "Twinkly.vb", "ButtonPress", "Brightness_" & i, 2 + Math.Floor(i / 51), (i / 10 - Math.Floor(i / 51) * 5), 1)) Next 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> ''' Get brightness ''' </summary> Public Function GetBrightness() As Integer Console.Write("Getting brigthness...") Dim output As String = RunAPI("led/out/brightness") Dim json = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(output) Return json("value") End Function ''' <summary> ''' Set brightness ''' </summary> ''' <param name="brightness">0-100</param> Public Sub SetBrightness(ByVal brightness As Integer) If debug Then hs.WriteLog("Twinkly", "Setting brigthness to '" & brightness & "'...") Dim data As New System.Collections.Generic.Dictionary(Of String, Object) data.Add("mode", "enabled") data.Add("value", brightness) data.Add("type", "A") Dim output As String = RunAPI("led/out/brightness", Newtonsoft.Json.JsonConvert.SerializeObject(data)) If debug Then hs.WriteLog("Twinkly", IIf(output.Contains("1000"), " was a success!", " failed. :(")) 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 Gammelt script: Da får du en device som dette: Gå inn på Devicen, og gå til Advanced. Legg så IP-adressen til Twinkly-lenken inn under "Device Type (String)": ... og siden vi endrer Device Types, må vi huske å vise alle etter på: Den nye versjonen støtter altså flere lenker på samme script, man slipper å lage kopier av scriptet hvis man har flere lenker.
  9. 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:
  10. 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
  11. Tegneserier er gøy. Automatiske tegneserier er selvfølgelig enda gøyere. Tidligere var det bare å linke bildet på nettet, men VG ville gjøre det litt vanskeligere for oss. Men det lar seg ordne. Aller først trenger vi SP_ID'en din. Logg inn på VG (det holder med en gratis-konto), og trykk F12 (eller åpne Developer Console) Så finner du "Application" på menyen øverst, finner så cookies, og velger "www.vg.no". Dobbelttrykk på tekstfeltet etter "SP_ID" og kopier hele denne lange, uforståelige teksten til et sted. NB! Dette scriptet omfatter sletting av filer, og kan potensielt gå ad undas. Det er selvfølgelig testet en del av meg, men som alltid: Ta backup først! Scriptet er her: Tegneserie.vb Sub Main(ByVal input As Object) 'Moskus 2019 'Parametre: device_ID|Tegneserie 'Serie-alternativer: Pondus, Lunch, Hjalmar, Tegnehanne Dim devID As String = input.ToString.Split("|")(0) Dim serie As String = input.ToString.Split("|")(1) Dim deleteFiles As Boolean = True Dim SP_ID As String = "DIN_LANGE_SPID_STRENG_HER" Dim directoryName As String = hs.GetAppPath & "/html/images/Tegneserier/" 'Check if "Tegneserier" exits If (Not System.IO.Directory.Exists(directoryName)) Then System.IO.Directory.CreateDirectory(directoryName) 'Delete local files If deleteFiles Then For Each deleteFile As String In System.IO.Directory.GetFiles(directoryName, serie.ToLower & "*.*", System.IO.SearchOption.TopDirectoryOnly) System.IO.File.Delete(deleteFile) Next End If Dim remoteFile As String = "" Dim filename As String = serie.ToLower & "_" & Now.Date.ToString("yyMMdd") & ".jpg" Dim localFile As String = hs.GetAppPath & "/html/images/Tegneserier/" & filename Dim dateFormat As String = Now.Year & "-" & Now.Month.ToString("00") & "-" & Now.Day.ToString("00") Select Case serie.ToLower Case = "pondus" remoteFile = "https://www.vg.no/tegneserier/api/images/pondus/" & dateFormat Case = "lunch" remoteFile = "https://www.vg.no/tegneserier/api/images/lunch/" & dateFormat Case = "hjalmar" remoteFile = "https://www.vg.no/tegneserier/api/images/hjalmar/" & dateFormat Case = "tegnehanne" remoteFile = "https://www.vg.no/tegneserier/api/images/tegnehanne/" & dateFormat End Select If remoteFile <> "" Then Try Using client As New System.Net.WebClient Net.ServicePointManager.SecurityProtocol = Net.SecurityProtocolType.Tls12 client.Headers.Add(Net.HttpRequestHeader.Cookie, "SP_ID=" & SP_ID) client.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0") client.DownloadFile(remoteFile, localFile) client.Dispose() End Using Catch ex As Exception hs.WriteLog("Tegneserier", "Ex: " & ex.ToString) End Try Dim dateValue As Integer = CInt(Now.Date.ToString("yyMMdd")) hs.SetDeviceString(devID, "<img src='/images/HomeSeer/status/custom.gif' />", True) hs.SetDeviceString(devID, "<img src='./images/Tegneserier/" & filename & "' width='300px' />", False) hs.SetDeviceValueByRef(devID, dateValue, True) Else hs.WriteLog("Tegneserie", "RemoteFile ikke spesifisert for tegneserie: " & serie) End If End Sub Du legger inn SP_ID-strengen din istedenfor "DIN_LANGE_SPID_STRENG_HER". I tillegg må du lage en device pr. tegneserie du er interessert i. Som i nyhetsscriptet er dette en "Status Only" device. Så er det bare å sette opp eventet. Tegneseriene blir oppdatert kl. 08:00, så 08:15 er sikkert et bra tidspunkt. Kun ukedager og lørdager. Huk av "Wait for Script to finish" og "Only allow singe instance". Så repeter for hver tegneserie. Parameter er dev_ID|Tegneserie, f.eks. 3689|Pondus. ... som gir oss: Bredden er satt til 300px for at hele tegneserien skal dukke opp i Device Management, men dette er ikke en begrensning i f.eks. HStouch.
  12. 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.
  13. Problemet er som følger: Jeg overvåker fryser og ønsker å sende en melding i god tid før den har nådd 0 grader. Etter å ha opplevd ett par ganger at fryseren er blitt lukket, men ikke tett med tilsvarende dårlig kjøling så ønsker jeg å kunne varsle meg selv når man er på vei mot 0 grader ett stykke før den har nådd f.eks. -3 grader. Nå overvåker jeg kun på overstigning av -3 grader, men dette har en tendens å inntreffe lenge etter at jeg har dratt inn til jobb og siden jeg er pendler ett greit stykke (Moss - Oslo) så er det ikke å stikke fra jobben for å sjekke/lukke fryseren. Finnes det noe plugin eller script for å se om temperaturen er på vei opp utenom de vanlige "bølgene" som oppstår mellom hver gang kompressoren slår inn? Eller er dette noe man må "snekre" selv?
  14. De som har lest HomeSeer-skolen vet at jeg er veldig opptatt av å holde orden i systemet sitt. Det er fordi da er det så mye enklere å finne frem når man skal automatisere. Det er lett å huske hva "Node 11 Switch Multilevel 1" er når man bare har 11 noder, men når man har mange er det selvfølgelig helt umulig. I HomeSeer er det lett å tilordne rom og etasje til enhetene dine, men det er tungvindt å gi selve devicene noe mer fornuftig valg. Jeg navngir enheter med "Enhet, device_type", slik at det f.eks. er "Taklys, Switch Multilevel 1" eller "Taklys, Power", og det har jeg frem til nå gjort manuelt fordi jeg legger til en og en node. Men tidligere i vår satte jeg opp et helt hus på et par dager, på over 60 noder. Da tar det altfor lang tid å gjøre det manuelt, og et script var på sin plass. Scriptet gjør at dette: ... enkelt kan forandres til dette (etter å ha også gitt dem nye etaskjer og rom): ... og dermed kan man med litt sjuling av "unødvendige enheter" ende opp med noe enklere: Det fungerer også på andre sensorer, bl.a. bevegelsessensorer og magnetbrytere. Før: Etter: Bruk Måten det gjøres på er at root-devicen navngis med navnet du har tenkt å bruke og med et komma og Root bak, f.eks. "Taklys, Root (123)" (jeg har også begynt å sette nodenummeret i parentes bak Root). Så kjøres scriptet med Root Device ID som parameter, sub/function må settes til "RenameDevices". RenameDevices.vb Sub RenameDevices(input As String) 'Moskus 2019 Dim rootRef As Integer = input Dim rootDevice As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(rootRef) rootDevice.MISC_Set(hs, HomeSeerAPI.Enums.dvMISC.NO_LOG) If Not rootDevice.Name(hs).Contains("Switch") Then rootDevice.MISC_Clear(hs, HomeSeerAPI.Enums.dvMISC.AUTO_VOICE_COMMAND) Dim rootName As String = rootDevice.Name(hs) Dim prefix As String = rootName.Substring(0, rootName.IndexOf(",")).Trim hs.WriteLog("RenameDevices", "Starting with prefix: " & prefix) Dim i As Integer 'For i = (rootRef + 1) To endRef For Each i In rootDevice.AssociatedDevices(hs) Dim device As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(i) device.Name(hs) = prefix + ", " + device.Name(hs) device.MISC_Set(hs, HomeSeerAPI.Enums.dvMISC.NO_LOG) If Not device.Name(hs).Contains("Switch") Then device.MISC_Clear(hs, HomeSeerAPI.Enums.dvMISC.AUTO_VOICE_COMMAND) Next hs.SaveEventsDevices() hs.WriteLog("RenameDevices", "Done renaming " & prefix) End Sub
  15. Inspirert til å løse @toonwolf sitt problem. Se under: Sub Add(ByVal inputArgs As String) 'Input: RootReference;place;NewPin 'Example: 342;65;1234 hs.WriteLog("Add user", "Adding user...") Dim interfaceID As String = hs.GetINISetting("Interfaces", "IFace_0_Unique", "", "Z-Wave.ini") hs.WriteLog("Add user", "InterfaceID: " & interfaceID) Dim rootDeviceRef As Integer = inputArgs.Split(";")(0) Dim place As Integer = inputArgs.Split(";")(1) Dim PINnumber As Integer = inputArgs.Split(";")(2) Dim PINstring As String = PINnumber.ToString("0000") Dim nodeNumber As String = ZwaveUtil_GetNodeIdByRef(rootDeviceRef) hs.WriteLog("Removing user", "Node number: " & nodeNumber) Dim configResult = hs.PluginFunction("Z-Wave", "", "AddUserCodePin", {nodeNumber, place.ToString, PINstring, "TEST-user", interfaceID}) hs.WriteLog("Add user", "Done with result " & configResult.ToString) End Sub Sub Remove(ByVal inputArgs As String) 'Input: RootReference;place 'Example: 342;65 hs.WriteLog("Removing user", "Removing user...") Dim interfaceID As String = hs.GetINISetting("Interfaces", "IFace_0_Unique", "", "Z-Wave.ini") hs.WriteLog("Removing user", "InterfaceID: " & interfaceID) Dim rootDeviceRef As Integer = inputArgs.Split(";")(0) Dim place As Integer = inputArgs.Split(";")(1) Dim nodeNumber As String = ZwaveUtil_GetNodeIdByRef(rootDeviceRef) hs.WriteLog("Removing user", "Node number: " & nodeNumber) Dim ConfigResult = hs.PluginFunction("Z-Wave", "", "RemoveUserCodePin", {nodeNumber, place.ToString, interfaceID}) hs.WriteLog("Removing user", "Done with result " & ConfigResult.ToString) End Sub Public Function ZwaveUtil_GetNodeIdByRef(ByVal deviceId As Integer) As Integer Dim nodeId As Integer = -1 If (deviceId > 0) Then Dim device As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(deviceId) If (device IsNot Nothing) Then Dim pdata As HomeSeerAPI.PlugExtraData.clsPlugExtraData = device.PlugExtraData_Get(hs) If (pdata IsNot Nothing) Then nodeId = pdata.GetNamed("node_id") End If End If Else Throw New System.Exception("Device not found: " + deviceId) End If Return nodeId End Function
  16. Jeg mener dette er min første post her - jeg har hatt mye hjelp av å lese her, og nå er det kanskje på tide jeg bidrar litt. Jeg har kikket etter et script som gjør det jeg ønsker (...og ikke minst på den måten jeg ønsker:-) uten å finne det - og har derfor prøvd å skrive et selv. Jeg har "hentet inspirasjon" fra noen av Moskus' scripts. Input parametre: <deviceref>:<start>:<stop>:<time> Litt opplagt igrunn - men uansett vil dette endre devicen fra start til stopp, og bruke (tilnærmet) tid på det. (På grunn av litt avrundinger, så kan det ta noen sekunder mer eller mindre enn det du oppgir) For å ikke sende altfor mange kommandoer, så begrenser jeg meg per default til maks 4 kommandoer per sec (kan konfigureres) Noen spesialverdier: start = -1 - da leser jeg nåværende verdi, og dimmer til stoppverdi start = -2 - da leser jeg nåværende verdi, og øker/minker denne med stoppverdien Eksempler: 100:10:30:5 - skru dev 100 fra 10% til 30% (uavhengig av hva nåværende verdi er)- og bruke 5 sec på det 100:-1:30:5 - skru device fra nåværende verdi til 30% - og bruke 5 sec. 100:-2:-10:5 - endre device 100 med sluttverdien. Her er både positiv og negativ verdi tillatt - Om device 100 var på 35% før du startet scriptet, så vil den være på 25% etterpå. (og igjen - bruker 5 sec) Dette er ikke veldig foolproof - det er helt sikkert mulig å legge inn verdier som kræsjer hele scriptet - men så lang så fungerer det som jeg vil. Blant annet så tester det ikke om det finnes noe <deviceref>... (ikke ennå iallefall) Jeg kjører HomeSeer på Linux - ikke testet ut på en Windows-serveer (Og jeg har strengt tatt ikke planer om å gjøre det heller...) Jeg bruker det hovedsakelig til to ting: Styre utelyset mitt på en litt elegant måte, samt å skånsomt skru opp lyset på soverommet om morgenen. Kommentarer er mer en velkommen. Endringsforslag og "bug-reports" likeså
  17. 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.
  18. Vi har HSTouch på mobilene våre og jeg har lenge tenkt jeg skulle legge inn noen av de grafene jeg har tilgang på fra Device History. Startet med det i dag og da innså jeg at det var veldig begrenset hvor mye man kunne tilpasse grafene via vanlig event, mens man kunne gjøre mye mer tilpassninger via script. Med script ble det også en fordel at man bare trenger å endre ett sted om jeg vil endre noe på designet på grafene, i stedet for å måtte endre mange events. Sub Main(ByVal params as Object) ' @Author: ZoRaC ' @Version: 1.1 (2019-01-09) ' @Syntax: dvRef|time in hours|Y1-label ' SETTINGS Dim parameters() as String = params.ToString.Split("|") Dim dvRef As String = parameters(0) Dim hours As Integer = parameters(1) Dim y1Lbl As String = parameters(2) Dim dv As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(dvRef) Dim dvName As String = dv.Name(Nothing) Dim filename As String = Nothing Dim seconds As Integer = hours*60*60 Dim timeString As String = parameters(1) & " timer" If hours > 24 Then timeString = "1 dag" End If If hours > 48 Then timeString = TimeSpan.FromSeconds(seconds).Days & " dager" End If ' CREATE GRAPH filename = hs.PluginFunction("Device History", "", "CreateChartEx",New Object(){dvRef,"{'Title': '" & dvName & " (" & timeString & ")', 'Y1Label': '" & y1Lbl & "','Y2Label': '','XLabel': 'Dato/Tid', 'ShowLegend': false, 'DurationType': 2, 'PeriodType': 1, 'Periods': " & hours & ", 'Style': 2, 'UseMarkers': false, 'Width': 460, 'Height': 310, 'RotateDegrees': 270}", "", ""}) End Sub I manualen til Device History finnes det mange flere parametere man kan putte inn for å tilpasse utseendet på grafen. Scriptet gir f.eks dette (med parametere: "789|24|% RH"): I HSTouch har jeg laget egne screens: Jeg har laget 3 events pr rom: På de 3 tekst-knappene over grafen har jeg satt "IgnorePresses=false" og lagt inn dette i "ActionWhenPressed": Vent i 1000ms, slik at den rekker å generere bildet. Deretter tvinger den den til å laste bildet på nytt - setter bare URL til det samme som den opprinnelig er (PNG-URLen): Slik ble resultatet:
  19. 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
  20. 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
  21. 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.
  22. 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
  23. Jeg har lurt litt på hvordan jeg kan bruke RGB-lys og en MiCube fra Xiaomi (lett integrerbart i HomeSeer med deCONZ/JowiHue). Har laget et par scripts til det. Se bloggen for en video. Det første justerer lysstyrken med å vri på kuben. Hvilket farge (eller lys) den styrer er avhengig av hvilken side som vender opp. Settes opp slik: ... og i eksempelet over er 2566 er rotasjon-devicen, 2565 er side-devicen. 900, 901 og 902 er devicer for hhv. rød, grønn og blå. Den oppmerksomme leser vil legge merke til at det er mulig å styre flere lys samtidig (greenID1+greenID2+....). F.eks. ville 990+1045+1077 styre tre forskjellige lys. Praktisk hvis man har flere RGB-lenker i samme rom. Jeg bruker den muligheten i stua. MiCube_RGB.vb Du trenger selvfølgelig ikke bruke rød, grønn og blå, du kan bruke andre devicer så lenge de bruker vanlige 0-99-nivåer. Med en liten endring kan du styre opp til 6 forskjellige lys fra en kube. Det andre scriptet skal skru av og på med et "dobbelt tap", men kan også brukes til å styre noe når siden flippes over. Her trengs kun side-rotasjonen, men har et ekstra tillegg for å skru av alle lys. Device 989 er "all colors" på en Fibaro RGBW modul. MiCube_side.vb
  24. Se neste post for oppdatert versjon.
  25. Jeg begynte på dette prosjektet fordi jeg hadde glemt å følge med på trykkmåleren for varmtvann til radiatorene i huset. Rørleggeren som så at det var nesten ikke vann i systemet lurte på om jeg hadde veldig god råd siden jeg risikerte å ødelegge hele systemet. Klok av skade så begynte jeg å drodle opp en løsning for å kunne automatisere overvåkningen siden tanken og måleren er i ett rom jeg ikke går ofte inn i (og selv når jeg er der så glemmer jeg å sjekke status). Tidligere har jeg laget overvåkning av elektrisitetsmåleren på loftet og jeg begynte med en lignende løsning. Foran måleren monterte jeg ett wifi webkamera med ir (jeg gikk for DLink DCS932L, men her er det sikkert mange som fungerer like bra). Dette kameraet kan man sette opp til å sende via ftp. Jeg sender ett bilde til en ftp-server som jeg har på en windowsserver (den magiske serveren som drar alt her i huset). Det tas ett nytt bilde ca hvert 5 minutt og det overskriver det eksisterende bildet siden jeg ikke trenger noe historikk. "Råbilde" På serveren har jeg en windows service som følger med på folderen som bildet legges inn i. Ved en ny eller endret jpg-fil begynner denne servicen å jobbe. Jeg bruker her ett gratis bibliotek som heter OpenCv til å undersøke bildet. Jeg har valgt veien via templates, mens en som kan bildebehandling sikkert ville brukt forskjellige andre funksjoner. I første omgang leter jeg igjennom bildet etter selve måleren ved hjelp av en mal og "klipper" ut den hvis jeg finner den. "Målermal" Etter litt bildebehandling sitter jeg igjen med. "Måleren" Etter dette bruker jeg en mal basert på måler nålen i ønsket posisjon og tester mot utklippet bilde. Jeg roterer malen slik at jeg tester for alle 360 grader. Det "treffet" som har høyest sannsynlighet tas vare på og lagres ned i en database. "Mal for målernål i ønsket posisjon (rotasjon 0 grader)" For å få dette over i Homeseer så har windows servicen en liten webserver basert på NancyFx som har kun en side som vises på localhost. Her kommer data som en semikolon separert streng hvor man har datanavn=data. Jeg prøvde å gjøre dette litt bedre med json i starten, men ble stående fast og gikk for en enkel løsning hvor data kommer som en tekststreng. Mulig jeg skal se på dette ved en senere anledning, men det er ingen hast siden dette er noe som kun brukes lokalt på min server. CS-scriptet kjøres hvert 20 minutt og henter ut data fra windows service. Veldig enkle greier som henter ut rotasjon i grader, sannsynlighet og bildets dato/tid og dette legges inn i hardkodede deviceId (virtuelle devicer). (Og man må jo lage seg 3 devicer i Homeseer som skal motta verdiene) Jeg har en event som sjekker om rotasjonen er over +/-10 grader. Hvis det skjer så får jeg en melding på sms. "Oversikt i Homeseer" Script for å hente tall fra windows service I tillegg er det en windows service som er veldig spesifikk for meg. Hvis det er interresse så kan jeg prøve å lage noe mer generelt som folk kan leke med. Link til kildekode: https://github.com/oesolberg/MeterReaderService Link til zip-fil med service ferdig kompilert (23 MB pakket, 65 MB utpakket). http://bit.ly/MeterReaderHjemmeAutomasjon Hvordan å installere: Pakk ut alle filene i en egnet katalog (f.eks. c:\program files\meterreader) bruk Powershell og skriv inn følgende kommando : new-service -Name MeterReaderService -DisplayName "MeterReaderService" -Description "MeterReaderService" -BinaryPathName "c:\program files\meterreader\MeterReaderService.exe" -StartupType Manual For å starte service kan du kjøre kommando (i powershell): start-service -name "MeterReaderService" For å endre litt på hva som skal overvåkes må du inn og editere i MeterReaderService.exe.config filen. Følgende er nå satt: <add key="folder" value="C:\temp\warmwater\" /> <!- Hvilken folder som overvåkes --> <add key="filter" value="*.jpg" /> <!- Hvilken filtype man skal trigge på (men her er jeg redd at det kun fungerer med jpg-filer) --> <add key="sleepinterval" value="2000"/> <!- Antall millisekunder man skal vente fra en fil har endret seg til man begynner å behandle den --> <add key="port" value="1234"/> <!- porten til Nancy webserver - url http://localhost:1234 --> <add key="MaalerMal" value="MeterMalWithGray.jpg" /> <!- filen som inneholder målermalen (må ligge i underkatalogen Templates) --> <add key="NaalMal" value="KorrektNaalMedGraatt.jpg" /> <!- filen som inneholder målernålen (må ligge i underkatalogen Templates) -->
  • Medlemsstatistikk

    6 764
    Totalt antall medlemmer
    1 891
    Flest pålogget
    ArtHav
    Nyeste medlem
    ArtHav
    Ble med
×
×
  • 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.