borg1n Skrevet 12. oktober 2019 Skrevet 12. oktober 2019 (endret) Jeg sliter med å få vb-script som gjør HTTP POST call til å fungere og lurer på om det er et linux problem (kjører Ubuntu 18.04). Jeg har prøvd flere varianter og prøvd flere eksempler rett fra nettet, men alle henger og timer ut på HttpWebRequest.GetRequestStream() (linje Dim myStream As Stream = myWebReq.GetRequestStream() i eksemplet nedenfor). Er det noen som har vært borte i dette tidligere, eller vet om dette er noe som ikke virker for Ubuntu? Imports System.IO Imports System.Net Sub Main(ByVal Parms As Object) Dim logName As String = "WDTV Live" 'set log name for HS log Dim debug As Boolean = True Dim ParmArray() as String ParmArray = Parms.tostring.split(",") 'split parameter into an array Dim playerDev As Integer = CInt(ParmArray(0)) 'device reference ID for the player's device Dim player = ParmArray(1) 'player dns name or ip address Dim cmd, cmdType As String Select Case hs.deviceValueEx(playerDev) Case 33 To 127 cmdType = "remote" cmd = Chr(CInt(hs.deviceValueEx(playerDev))) Case 200 To 300 cmdType = "service" cmd = CStr(hs.deviceValueEx(playerDev) - 200) End Select Dim json As String = "{""" & cmdType & """:""" & cmd & """}" If Debug Then hs.writelog(logName, "Command: " & json) Dim strURL As String = "http://" & player & "/cgi-bin/toServerValue.cgi" 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; charset=utf-8" 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 Debug Then hs.WriteLog(logName, "Response: " & responseText) Catch ex As Exception : hs.writelog(logName, "Error: " & ex.Message.ToString) End Try End Sub Endret 12. oktober 2019 av borg1n Siter
ZoRaC Skrevet 12. oktober 2019 Skrevet 12. oktober 2019 Får du til å kjøre en wget eller cURL mot samme URL? Bare for å verifisere at serveren får koblet seg til. Siter
borg1n Skrevet 12. oktober 2019 Forfatter Skrevet 12. oktober 2019 (endret) Jeg har kjørt et python script mot maskinen (med json payload) for å sjekke at alt virker, og det gjør det. Jeg prøver sende samme payload via vs-script som virker ok fra python. Update: ser ut til å være et kjent, gammelt issue med Mono Update-2: Har kommet frem til at det trolig er enklere å lage et shell eller python script som gjør mye av nettverks kallene og parsingen av json (sed + awk er litt attraktive for det formålet) og så lese inn resultatene i et vb-script. aside: Jeg valgte å installere Uponor Smatrix for et år siden for styring av vannbåren varme og tenkte jeg skulle starte å få integrert lesing av temp, humidity, set-point etc i HS3. Jeg ser at det er blitt gjort for Home Assistant, inkl. støtte for å sette temperatur etc. Om noen allerede har gjort noe for HomeSeer integrasjon hadde det vært fint med en sync/ erfarings-utveksling. Endret 13. oktober 2019 av borg1n Siter
Moskus Skrevet 13. oktober 2019 Skrevet 13. oktober 2019 Flyttes til riktig forum. Dette burde jo ikke være vanskelig i det hele tatt. Men HTTPrequest og HTTPresponse er den vanskelige (og gamle) måten å gjøre det på. Webclient gjør sånt imidlertid mye enklere. Kan du gjøre noe jeg gjør i NewsReader.vb-scriptet: 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("Feil", "Net Feil: " & ex.Message) End Try Webclient har mange supre metoder, og lar deg gjøre stort sett det du vil. Siter
borg1n Skrevet 13. oktober 2019 Forfatter Skrevet 13. oktober 2019 takk for tips, skal prøve å få sett mer på det Siter
borg1n Skrevet 13. oktober 2019 Forfatter Skrevet 13. oktober 2019 Jeg får samme type feil når jeg prøver med WebClient, den henger (og timer ut) når jeg prøver initialisere connection. Får vel sove på det, kanskje det dukker opp en ny ide etterhvert Siter
Moskus Skrevet 14. oktober 2019 Skrevet 14. oktober 2019 Er du sikker på at URLen er riktig? Jeg hadde lagt inn en hs.WriteLog som gir hele URLen før før denne linja. Dim strURL As String = "http://" & player & "/cgi-bin/toServerValue.cgi" Med Webblient skal du bruke UploadString. Hele scriptet burde da se slik ut: Sub Main(ByVal Parms As Object) Dim logName As String = "WDTV Live" 'set log name for HS log Dim debug As Boolean = True Dim ParmArray() as String ParmArray = Parms.tostring.split(",") 'split parameter into an array Dim playerDev As Integer = CInt(ParmArray(0)) 'device reference ID for the player's device Dim player = ParmArray(1) 'player dns name or ip address Dim cmd as String = "" Dim cmdType As String = "" Select Case hs.deviceValueEx(playerDev) Case 33 To 127 cmdType = "remote" cmd = Chr(CInt(hs.deviceValueEx(playerDev))) Case 200 To 300 cmdType = "service" cmd = CStr(hs.deviceValueEx(playerDev) - 200) End Select Dim json As String = "{""" & cmdType & """:""" & cmd & """}" If Debug Then hs.writelog(logName, "Command: " & json) Dim ouptput As String = "" Dim url As String = "http://" & player & "/cgi-bin/toServerValue.cgi" Using client = New System.Net.WebClient client.Headers.Add("Content-Type", "application/json") ouptput = client.UploadString(url, "POST", query) End Using If Debug Then hs.WriteLog(logName, "Response: " & output) End Sub Hvordan ser eventet som kaller dette ut? Siter
borg1n Skrevet 14. oktober 2019 Forfatter Skrevet 14. oktober 2019 (endret) Takk for råd og tips, men er nok redd for at det ikke er der (med mindre jeg ser meg helt blind på dette). Jeg prøver å kjøre følgende: Dim url As String = "http://192.168.1.33/api" Dim response As String hs.WriteLog(logName, "Step-1" & url) Using client As New System.Net.WebClient client.Headers.Add("Content-Type", "application/json") client.BaseAddress = url hs.WriteLog(logName, "Step-2" & url) response = client.UploadString(url, "POST", jsonQuery) hs.WriteLog(logName, "Step-3" & url) End Using Og det henger mellom Step-2 og Step-3. jsonQuery er validert, kopiert fra HS3 log og kjørt fra python ok så det skal ikke være noe feil der heller. Eventet er manuellt trigget og kjørt. Endret 14. oktober 2019 av borg1n Siter
Moskus Skrevet 14. oktober 2019 Skrevet 14. oktober 2019 1 time siden, borg1n skrev: Eventet er manuellt trigget og kjørt. Ja, men hva er parametrene? Hvordan ser da en slik URL ut? Og en ferdig tygget JSON string? Hvis det fungerer fint annet sted så er det sikkert kun en liten formateringsgreie... Siter
borg1n Skrevet 14. oktober 2019 Forfatter Skrevet 14. oktober 2019 (endret) Ingen parametre. Jeg har tatt et annet fungerende script, kopiert det og testet med det helt enkle test-settet som listet over, uten parametre. Jeg vurderer om jeg skal sette opp en demo HS3 på en windows maskin bare for å sikre at det er et linux/ mono issue, det bør bare ta en time eller så. Har prøvd med forskjellige json stringer, men den riktige som skal brukes er: {"jsonrpc":"2.0", "id":8, "method":"read", "params":{"objects":[{"id":"91","properties":{"85":{}}},{"id":"105","properties":{"85":{}}},{"id":"107","properties":{"85":{}}},{"id":"109","properties":{"85":{}}}]}} Som nevnt tidligere er det flere som har rapportert tilsvarende problemer med mono siste 2 årene Endret 14. oktober 2019 av borg1n Siter
borg1n Skrevet 15. oktober 2019 Forfatter Skrevet 15. oktober 2019 (endret) Kjører siste mono, versjon 6.4.0.198. Prøvde også med en versjon langt oppe på 5 tallet først. Ser på nettet en person som ikke har fått det til å virker siden versjon 4.8.x Satte opp en kjapp test-installasjon på windows-10 og den virket umiddelbart. Så da mener jeg det er rimelig avklart at problemet er relatert til linux/ mono. Kunne forsåvidt vært brannveggen på min HS3 linux boks, men ettersom python og wget kallene virker fra boksen kan jeg ikke se at det kan være tilfelle. Endret 15. oktober 2019 av borg1n Siter
Moskus Skrevet 15. oktober 2019 Skrevet 15. oktober 2019 10 timer siden, borg1n skrev: {"jsonrpc":"2.0", "id":8, "method":"read", "params":{"objects":[{"id":"91","properties":{"85":{}}},{"id":"105","properties":{"85":{}}},{"id":"107","properties":{"85":{}}},{"id":"109","properties":{"85":{}}}]}} Når jeg ser denne stusser jeg på om det er riktig. En av fordelen med JSON er jo at alt ikke behøver være definert som strenger, dvs. stå i hermetegn. Hvordan ser det ut i Python? Dette ville jeg tro kunne være riktig: {jsonrpc:2.0, id:8, method:"read", params:{objects:[{id:91,properties:{85:{}}},{id:105,properties:{85:{}}},{id:107,properties:{85:{}}},{id:109,properties:{85:{}}}]}} .... og det er ikke sikkert at "read" engang skal stå i hermetegn. Men dette er det jo egentlig mottaker som bestemmer... Mulig at MONO er litt vanskeligere å ha med å gjøre på nøstede hermetegn enn i Windows, så verdt et forsøk. Siter
borg1n Skrevet 15. oktober 2019 Forfatter Skrevet 15. oktober 2019 Gjør ingen forskjell, og strengt tatt ville jeg ansett det som en bug om mono (eller http protokollen for den saks skyld) skulle være sensitiv for utforming av en application level payload. Siter
Moskus Skrevet 15. oktober 2019 Skrevet 15. oktober 2019 2 timer siden, borg1n skrev: strengt tatt ville jeg ansett det som en bug om mono Ja, det var poenget mitt: Det er ikke sikkert det er mono som er problemet. Men vanskelig å argumentere for det når det fungerer på Windows... Siter
borg1n Skrevet 24. oktober 2019 Forfatter Skrevet 24. oktober 2019 Fikk omsider testet litt mer, endte opp å lage et C# program for å testkjøre det i mono og det virker ok. Dvs. programmet virker når det er kompilert og kjørt direkte i console/ mono, men ikke når det er invokert som script fra HomeSeer. Kan det være relatert til memory allocation kanskje? 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.