WebService: acquisizione di dati da un servizio esterno di rilevazione dati tramite URL

' Il seguente frammento di codice fornisce un esempio di come sia possibile acquisire informazioni da un 
' un servizio esterno di rilevazione dati tramite la chiamata ad un WebService utilizzando una URL che restituisce una stringa XML.
' Nella fattispecie, viene utilizzato il Web Service messo a disposizione dal sistema di monitoraggio dei 
' pannelli fotovoltaici SolarEdge )

' L'output è il seguente:
' <series>
'    <timeUnit>HOUR</timeUnit>
'    <unit>Wh</unit>
'    <measuredBy>INVERTER</measuredBy>
'    <values>
'      <dateValue>
'         <date>2017-05-08 00:00:00</date>
'         <value>0.0</value>
'      </dateValue>
' ....
'    </values>
' </series>

' I dati vengono recuperati su base giornaliera (per il giorno corrente) e memorizzati in una griglia
Dim d as string=ltrim(str(Today.Year))+"-"+ltrim(str(Today.Month))+"-"+ltrim(str(Today.Day))
Dim url As String = "https://monitoringapi.solaredge.com/site/349661/energy.xml?timeUnit=HOUR&endDate="+d+"&startDate="+d+"&api_key=KDZ46QJYX2HQPIVPJY7KX3R9HA7UENRA" 

Dim webClient As New System.Net.WebClient
Dim result As String = webClient.DownloadString(Url)

' Recupero della risposta e parse dell'XML
Dim response = System.XML.Linq.XElement.Parse(result)

for each el as System.XML.Linq.Xelement in response.LastNode.Nodes ' Il LastNode è "Values", e ne estrae tutti i nodi
   ' Il quarto nodo è quello dei Values
   Dim Data As String
   Dim Valore as String

   Data=Ctype(el.FirstNode,System.Xml.Linq.Xelement).Value
   Valore=Ctype(el.LastNode,System.Xml.Linq.Xelement).Value
 
   if Valore<>"null"
      form.findcontrol("Grid1").MoveFirst()
      if not form.findcontrol("Grid1").LocateRow("CUSTOM1='"+Data+"'")
         form.findcontrol("Grid1").AddRow()
         form.findcontrol("Grid1").AssignField("CUSTOM1",Data)
      End If
      form.findcontrol("Grid1").AssignField("NUMBER1",val(Valore))
      form.findcontrol("Grid1").SaveRow()
   End If 
next

form.findcontrol("Grid1").Refresh()
form.findcontrol("Grid1").MoveLast()