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

vb-script, http-post request og linux


borg1n

Anbefalte innlegg

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 av borg1n
Lenke til kommentar
Del på andre sider

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 av borg1n
Lenke til kommentar
Del på andre sider

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.

Lenke til kommentar
Del på andre sider

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?

Lenke til kommentar
Del på andre sider

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 av borg1n
Lenke til kommentar
Del på andre sider

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

Lenke til kommentar
Del på andre sider

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 av borg1n
Lenke til kommentar
Del på andre sider

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 av borg1n
Lenke til kommentar
Del på andre sider

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.

Lenke til kommentar
Del på andre sider

  • 2 uker senere...

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?

Lenke til kommentar
Del på andre sider

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.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

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