Gå til innhold
  • Bli medlem
Moskus

SCRIPT: GrandbeingMX0404 - Styring av en 4x4 HDMI-matrise

Anbefalte innlegg

GrandbeingMX0404.vb

Script for å styre en Grandbeing MX0404 HDMI matrise. Lager en root med tilhørende child-devicer for hver utgang hvor man kan trykke på de forskjellige inngangene. Alt i et script, men dette blir nok en plugin på sikt (der er det lettere å få til en autorefresh, og sånt).

    '© Moskus 2014
    
    Dim Scriptname As String = "GrandbeingMX0404.vb"
    Dim hdmi_outputs() As String = {"None", "TV", "SageTV", "Xbox", "Extra"}
    Dim ip_address As String = "192.168.0.39"

    Public Sub Main(parm As Object)
    End Sub

    Public Sub Setup(parm As Object)
        'Setting up devices

        'Creating master device
        Dim dt As New HomeSeerAPI.DeviceTypeInfo
        Dim devref As Integer = hs.NewDeviceRef("Root")
        Dim dv As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(devref)
        Try
            dv.Location(hs) = "HDMI matrix"
            dv.Location2(hs) = "Media"
            dv.Device_Type_String(hs) = "HDMI root"
            dv.DeviceType_Set(hs) = New HomeSeerAPI.DeviceTypeInfo
            dv.Status_Support(hs) = True
            dv.Can_Dim(hs) = False
            hs.SaveEventsDevices()
            dv.MISC_Set(hs, HomeSeerAPI.Enums.dvMISC.SHOW_VALUES)
            dv.MISC_Clear(hs, HomeSeerAPI.Enums.dvMISC.STATUS_ONLY)

            'Adding a "Refresh" button to the root device
            hs.DeviceScriptButton_AddButton(devref, "Refresh", 0, Scriptname, "ButtonPress", "Refresh", 1, 1, 1)
            hs.SaveEventsDevices()

            Dim SVpair As New HomeSeerAPI.VSPair(HomeSeerAPI.ePairStatusControl.Status)
            SVpair.PairType = HomeSeerAPI.VSVGPairType.SingleValue
            SVpair.Value = 0
            SVpair.Status = "HDMI matrix"
            hs.DeviceVSP_AddPair(devref, SVpair)

            Dim VGpair As New HomeSeerAPI.VGPair
            VGpair.PairType = HomeSeerAPI.VSVGPairType.SingleValue
            VGpair.Set_Value = 0
            VGpair.Graphic = "images/Moskus/icon_hdmi.png"
            hs.DeviceVGP_AddPair(devref, VGpair)

            hs.WriteLog("HDMI matrix", "Root device for HDMI matrix created")
        Catch ex As Exception
            hs.WriteLog("HDMI matrix", "Error creating root device: " & ex.Message)
        End Try

        'Creating child devices
        dv.Relationship(hs) = HomeSeerAPI.Enums.eRelationship.Parent_Root
        For i As Integer = 1 To 4
            Dim childref As Integer = CreateOutputDevice(i, devref)
            If childref > 0 Then dv.AssociatedDevice_Add(hs, childref)
        Next

    End Sub

    Public Function CreateOutputDevice(ByVal output As Integer, masterdevice As Integer) As Integer
        'Creating device
        Dim dt As New HomeSeerAPI.DeviceTypeInfo
        Dim devref As Integer = hs.NewDeviceRef("Output " & output)
        Dim dv As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(devref)
        Try
            dv.Location(hs) = "HDMI matrix"
            dv.Location2(hs) = "Media"
            dv.Device_Type_String(hs) = "HDMI out " & output
            dv.DeviceType_Set(hs) = New HomeSeerAPI.DeviceTypeInfo
            hs.SaveEventsDevices()
            dv.Status_Support(hs) = True
            dv.Can_Dim(hs) = False
            dv.MISC_Set(hs, HomeSeerAPI.Enums.dvMISC.SHOW_VALUES)
            dv.MISC_Clear(hs, HomeSeerAPI.Enums.dvMISC.STATUS_ONLY)
            dv.Relationship(hs) = HomeSeerAPI.Enums.eRelationship.Child
            dv.AssociatedDevice_Add(hs, masterdevice)
            dv = Nothing

            hs.WriteLog("HDMI matrix", "Test Device for output " & output & " created")
        Catch ex As Exception
            hs.WriteLog("HDMI matrix", "Error creating devices: " & ex.Message)
            Return 0
        End Try

        Dim SVpair_off As New HomeSeerAPI.VSPair(HomeSeerAPI.ePairStatusControl.Status)
        SVpair_off.PairType = HomeSeerAPI.VSVGPairType.SingleValue
        SVpair_off.Value = 0
        SVpair_off.Status = "None"
        hs.DeviceVSP_AddPair(devref, SVpair_off)

        Dim VGpair_off As New HomeSeerAPI.VGPair
        VGpair_off.PairType = HomeSeerAPI.VSVGPairType.SingleValue
        VGpair_off.Set_Value = 0
        VGpair_off.Graphic = "images/Moskus/icon_hdmi_X.png"
        hs.DeviceVGP_AddPair(devref, VGpair_off)


        'Adding buttons, values and graphic
        For i As Integer = 1 To 4
            hs.DeviceScriptButton_AddButton(devref, output & "-" & i, i, Scriptname, "ButtonPress", output & "-" & i, 1, i, 1)

            Dim SVpair As New HomeSeerAPI.VSPair(HomeSeerAPI.ePairStatusControl.Status)
            SVpair.PairType = HomeSeerAPI.VSVGPairType.SingleValue
            SVpair.Value = i
            SVpair.Status = "Input " & i
            hs.DeviceVSP_AddPair(devref, SVpair)

            Dim VGpair As New HomeSeerAPI.VGPair
            VGpair.PairType = HomeSeerAPI.VSVGPairType.SingleValue
            VGpair.Set_Value = i
            VGpair.Graphic = "images/Moskus/icon_hdmi_" & i & ".png"
            hs.DeviceVGP_AddPair(devref, VGpair)
        Next

        Return devref
    End Function

    Public Sub ButtonPress(Input As Object)
        Dim devref As Integer = Input(0)
        Dim ButtonName As String = Input(1)
        Dim output As String = String.Empty 'Gets filled by GetURLIE

        Dim device As Integer = 0

        Dim master As Integer = hs.GetDeviceParentRefByRef(devref)
        If master = 0 Then master = devref

        Dim dv As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(master)
        For Each devid As Integer In dv.AssociatedDevices(hs)
            Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(devid)
            Select Case dev.Device_Type_String(hs)
                Case Is = "HDMI root"
                    device = 0
                Case Is = "HDMI out 1"
                    device = 1
                Case Is = "HDMI out 2"
                    device = 2
                Case Is = "HDMI out 3"
                    device = 3
                Case Is = "HDMI out 4"

            End Select
        Next

        Dim command As String = "Refresh"

        If device > 0 Then
            Dim value As Integer = hdmi_outputs.ToList.IndexOf(ButtonName)
            command = device & "-" & value
        End If


        Select Case command
            Case Is = "Refresh"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=refrash", True) '"refrash" is actually not a typo on my part...

            Case Is = "1-1"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a09", True)
            Case Is = "1-2"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a1D", True)
            Case Is = "1-3"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a1F", True)
            Case Is = "1-4"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a0D", True)

            Case Is = "2-1"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a17", True)
            Case Is = "2-2"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a12", True)
            Case Is = "2-3"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a59", True)
            Case Is = "2-4"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a08", True)

            Case Is = "3-1"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a5E", True)
            Case Is = "3-2"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a06", True)
            Case Is = "3-3"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a05", True)
            Case Is = "3-4"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a03", True)

            Case Is = "4-1"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a18", True)
            Case Is = "4-2"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a44", True)
            Case Is = "4-3"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a0F", True)
            Case Is = "4-4"
                output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a51", True)
        End Select

        InterpretOutput(devref, output)
    End Sub

    Public Sub InterpretOutput(ByVal devref As Integer, ByVal output As String)
        'output: Output1=1Output2=1Output3=1Output4=1
        Dim data(3) As Integer
        data(0) = CInt(output(8).ToString)
        data(1) = CInt(output(17).ToString)
        data(2) = CInt(output(26).ToString)
        data(3) = CInt(output(35).ToString)

        Dim master As Integer = hs.GetDeviceParentRefByRef(devref)
        If master = 0 Then master = devref

        Dim dv As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(master)
        For Each devid As Integer In dv.AssociatedDevices(hs)
            Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(devid)
            Select Case dev.Device_Type_String(hs)
                Case Is = "HDMI out 1"
                    If hs.DeviceValue(devid) <> data(0) Then
                        hs.SetDeviceValueByRef(devid, data(0), True)
                    Else
                        hs.SetDeviceValueByRef(devid, data(0), False)
                    End If
                Case Is = "HDMI out 2"
                    If hs.DeviceValue(devid) <> data(1) Then
                        hs.SetDeviceValueByRef(devid, data(1), True)
                    Else
                        hs.SetDeviceValueByRef(devid, data(1), False)
                    End If
                Case Is = "HDMI out 3"
                    If hs.DeviceValue(devid) <> data(2) Then
                        hs.SetDeviceValueByRef(devid, data(2), True)
                    Else
                        hs.SetDeviceValueByRef(devid, data(2), False)
                    End If
                Case Is = "HDMI out 4"
                    If hs.DeviceValue(devid) <> data(3) Then
                        hs.SetDeviceValueByRef(devid, data(3), True)
                    Else
                        hs.SetDeviceValueByRef(devid, data(3), False)
                    End If
            End Select
        Next

    End Sub

 

Gir:

nEibCgm.png

  • Like 1

Del dette innlegget


Lenke til innlegg
Del på andre sider

Jeg har laget en ett matrise oppsett med VIrtuelle Devicer, men mine innganger er ikke gruppert sånn som dine. Jeg ser du gjør dette via ett script, betyr det at devicene blir opprettet hver gang du kjører dette scriptet. Når kjører du det ? Er det mulig å gruppere devicer i fra Websiden, eller må dette gjøres vha script ?

Del dette innlegget


Lenke til innlegg
Del på andre sider

Som du ser i scriptet har jeg en "Setup()" rutine.

Her er "dv" root-devicen, og siste delen lager children og assosierer dem med root:

'Creating child devices
dv.Relationship(hs) = HomeSeerAPI.Enums.eRelationship.Parent_Root
For i As Integer = 1 To 4
    Dim childref As Integer = CreateOutputDevice(i, devref)
    If childref > 0 Then dv.AssociatedDevice_Add(hs, childref)
Next

 

Del dette innlegget


Lenke til innlegg
Del på andre sider

Hva gjør den siste subrutina ? 

 

data(0) = CInt(output(8).ToString)
data(1) = CInt(output(17).ToString)
data(2) = CInt(output(26).ToString)
data(3) = CInt(output(35).ToString)

Hva er output(8), output(17), output(26), og output(35) ?

 

Del dette innlegget


Lenke til innlegg
Del på andre sider

"Output" er bare en laaaang streng. "Output(8)" henter ut den niende bokstaven (som "Char") og konverterer den til String. Og deretter blir hele sulamiten konvertert til et tall. :) 

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 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"
       
       
      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.  
       

       
       
    • Av ZoRaC
      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:

    • 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  
×