Christian Skrevet 24. januar 2017 Skrevet 24. januar 2017 Jeg har en Json string som ser ur som følger : {"Name":"HomeSeer Devices","Version":"1.0","Devices":[{"ref":29,"name":"test","location":"Unknown","location2":"Unknown","value":0,"status":"Off","device_type_string":"","last_change":"\/Date(-62135596800000)\/","relationship":0,"hide_from_view":false,"associated_devices":[],"device_type":{"Device_API":0,"Device_API_Description":"No API","Device_Type":0,"Device_Type_Description":"Type 0","Device_SubType":0,"Device_SubType_Description":""},"device_image":"","UserNote":"","UserAccess":"Any","status_image":"/images/HomeSeer/status/off.gif"}]} Jeg har skrevet følgende script : Imports Newtonsoft.Json Imports Newtonsoft.Json.Linq Sub Main (params as Object) Dim value As String Dim obj As New Object Dim url as string Dim json as String url = "http://192.168.253.8/json?request=getstatus&ref=29" json=hs.urlAction(url, "GET","","") obj = JsonConvert.DeserializeObject(json) value = obj.tostring hs.WriteLog ("obj", obj) hs.WriteLog("Value of device", value) hs.WriteLog ("INFO",json) end sub Jeg får feilmelding i loggen, som sier "Running script C:\Program Files (x86)\HomeSeer HS3\scripts\test.vb :Målet forårsaket et unntak under aktivering.Objektreferanse er ikke satt til en objektforekomst." Mener og tror dette er det samme som "object reference not set to an instance of an object" på engelsk. Noen som har ett godt forslag på hvordan dette kan løses ? Er det mulig å få alle feilmeldinger i loggen i HS3 ut på engelsk forresten ? Siter
ZoRaC Skrevet 25. januar 2017 Skrevet 25. januar 2017 Mulig du skal gjøre noe avansert etter hvert, men til det du har nå kan du heller bruke: value = hs.DeviceValueByRef(29) Siter
Christian Skrevet 25. januar 2017 Forfatter Skrevet 25. januar 2017 Ja vet det, men det var bare for å teste en json string.. skal nok gjøre andre ting etterhvert jsSent from my iPhone using Tapatalk Siter
Moskus Skrevet 25. januar 2017 Skrevet 25. januar 2017 Her kan det ha skjedd ting siden jeg sjekket, men det er ikke nok å bare bruke "Imports". For å øke hurtigheten på script-kompileringen i HS er ikke hele .NET tilgjengelig ut av esken. Du må legge referanser til selv til ScriptingReferences i settings.ini-filen. Se denne tråden her: https://forums.homeseer.com/showthread.php?t=172336 ... og nærmere bestemt denne posten: https://forums.homeseer.com/showpost.php?p=1156598&postcount=6 Siter
Christian Skrevet 25. januar 2017 Forfatter Skrevet 25. januar 2017 Takk for svar. Ja, det så jeg, så det er gjort. Jeg fant fant sånn halveis ut av det. Fikk scriptet til å fungere dersom jeg spør etter "Name", "Devices" eller "Version". Dersom jeg skal spørre etter noe annet får jeg følgende feilmelding : "cannot access child value on newtonsoft.json.linq.jproperty" Siter
Moskus Skrevet 25. januar 2017 Skrevet 25. januar 2017 7 minutter siden, Christian skrev: Dersom jeg skal spørre etter noe annet får jeg følgende feilmelding : "cannot access child value on newtonsoft.json.linq.jproperty" Hvordan spør du da? Riktignok C#, men du tar tegningen (bare bytt ut klamme-parenteser med vanlige): http://stackoverflow.com/questions/37575123/accessing-child-value-of-json-in-c-sharp Siter
Christian Skrevet 25. januar 2017 Forfatter Skrevet 25. januar 2017 Mener det var slik jeg gjorde : uptime = obj.Item("Devices")("value").ToString Siter
Moskus Skrevet 25. januar 2017 Skrevet 25. januar 2017 Hmmm... problemet er muligens at "Devices" er en liste. Jeg deseraliserer alltid til en liste, uansett om det er én eller flere devices i den (men det er i plugins/eksterne programmer så jeg står vesentlig friere) Men siden "Devices" er en liste, så kan det være at du må spesifisere index, altså slik: Dim deviceJson As String = obj.Item("Devices")(0) Dim deviceJson As String = obj.Item("Devices")(0) ... og så deserialisere JSON'en du får fra det igjen. Det kan være at noe slikt fungerer: Dim deviceJson As String = obj.Item("Devices")(0)("uptime") ... men det er et skudd i blinde. Bruker du Visual Studio og tenScripting? Siter
Christian Skrevet 25. januar 2017 Forfatter Skrevet 25. januar 2017 Nei, har ikke kommet så langt at jeg har fått begynt å bruke VS, jeg sitter i en teksteditor for Mac, og scriptvinduet til HS Siter
Christian Skrevet 26. januar 2017 Forfatter Skrevet 26. januar 2017 (endret) Fikk løst det med å deseralisere til klasser. Endret 26. januar 2017 av Christian 1 Siter
Moskus Skrevet 26. januar 2017 Skrevet 26. januar 2017 Siden andre helt sikkert lurer (eller kommer til å lure på det samme), kan du poste koden din? Siter
Christian Skrevet 26. januar 2017 Forfatter Skrevet 26. januar 2017 Tenkte jeg skulle forsøke meg på å få kontakt med MyQ. Jada, vet at det finnes en plugin til dette allerede, men fant ut at dette kunne være en artig og relativt enkel plass å begynne å se på scripting. Jeg fant først en side på nettet som kan hjelpe til med å lage de klassene man trenger, dette skal visstnok også kunne implementeres rett inn i Visual Studio, men jeg gikk på jsonutils.com. Her kan du lime inn json strengen, eller en URL, så får du ut klassene. Status kan ha fire statuser : 1 - åpen 2 - lukket 3 - closing 4 - opening Koden min ble da som følger : Class Min_lille_lekestue Public Class Attribute Public Property AttributeId As Integer Public Property Name As String Public Property Value As String Public Property UpdatedTime As String Public Property MyQDeviceTypeAttributeId As Integer Public Property IsDeviceProperty As Boolean Public Property AttributeDisplayName As String Public Property IsPersistent As Boolean Public Property IsTimeSeries As Boolean Public Property IsGlobal As Boolean Public Property UpdatedDate As DateTime End Class Public Class Device Public Property MyQDeviceId As Integer Public Property MyQDeviceTypeId As Integer Public Property MyQDeviceTypeName As String Public Property DeviceId As String Public Property DeviceName As String Public Property TypeId As Integer Public Property TypeName As String Public Property RegistrationDateTime As DateTime Public Property SerialNumber As String Public Property UserName As String Public Property UserConnectServerId As Integer Public Property UserCountryId As Integer Public Property Attributes As Attribute() Public Property ChildrenMyQDeviceIds As String Public Property UpdatedBy As String Public Property UpdatedDate As DateTime Public Property ParentMyQDeviceId As Integer? End Class Public Class JsonKlasse Public Property Devices As Device() Public Property ReturnCode As String Public Property ErrorMessage As String Public Property CorrelationId As String End Class Public Sub Main(ByVal Params As Object) Dim Attrib As New Attribute Dim Token As String Dim objToken As New JObject Dim TokenUrl As String Dim Tokenjson As String Dim TokenwebAddress As String Dim StatusUrl As String Dim Statusjson As String Dim objStatus As New JsonKlasse Dim Status As String Dim StatuswebAddress As String Dim appId As String Dim username As String Dim password As String 'Some Constants appId = "Vj8pQggXLhLy0WHahglCD4N1nAkkXQtGYpq2HrHD7H1nvmbT55KqtN6RSF4ILB%2fi" username = "**account_name**" password = "**account_password**" TokenwebAddress = "https://myqexternal.myqdevice.com/Membership/ValidateUserWithCulture?appId=" StatuswebAddress = "https://myqexternal.myqdevice.com/api/UserDeviceDetails?" 'Get Token - gets the token from the Myq device, this will change expires after about an hour TokenUrl = TokenwebAddress & appId & "&securityToken=null&username=" & username & "&password=" & password & "&culture=en" Tokenjson = hs.URLAction(TokenUrl, "GET", "", "") objToken = CType(JsonConvert.DeserializeObject(Tokenjson), JObject) Token = objToken.Item("SecurityToken").ToString() 'Get Status - getting the status json and deserealise it to a string, prints the status in immediate window of VS and the HS log StatusUrl = StatuswebAddress & "appId=" & appId & "&securityToken=" & Token Statusjson = hs.URLAction(StatusUrl, "GET", "", "") objStatus = JsonConvert.DeserializeObject(Of JsonKlasse)(Statusjson) Status = objStatus.Devices(1).Attributes(3).Value If Status = 2 Then hs.Writelog ("Garasjeporten er lukket") Debug.Print("Garasjen er lukket" & Status) End If End Sub End Class 1 Siter
Anbefalte innlegg
Bli med i samtalen
Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.