Ola,
Having some issues with a program and the HTTPPut command. I'll paste the relevant part of the program below (edited for space). but basically I've got a datalogger with 5 tables that I need pushed (put) to an HTTPS address. I've been given an authentication code but keep getting a 401 error. Also the errors populate in the http_header variable not in the "http_Put_Response" variable.
'Declare Variables and Units
Public BattV : Units BattV = volts
Public PTemp_C : Units PTemp_C = °C
Public PTemp_F : Units PTemp_F = °F
Public CVData(14)
Public SlrTF_MJ : Units SlrTF_MJ = MJ/m²
Public CVMeta As String * 40
Public WSpdPrev : Units WSpdPrev = miles/hour
Public WindDirPrev : Units WindDirPrev = degrees
Public MaxWSpdPrev : Units MaxWSpdPrev = miles/hour
Public Invalid_Wind As Long
Public http_header As String * 200
Public http_put_response1 As String * 200
Public http_put_response2 As String * 200
Public http_put_response3 As String * 200
Public http_put_response4 As String * 200
Public http_put_response5 As String * 200
Public SERVER_PATH As String *250
Public http_put_tx1
Public http_put_tx2
Public http_put_tx3
Public http_put_tx4
Public http_put_tx5
Alias CVData(1) = SlrFD_W : Units SlrFD_W = W/m²
Alias CVData(2) = Rain : Units Rain = inches
Alias CVData(3) = Strikes : Units Strikes = count
Alias CVData(4) = Distance : Units Distance = miles
Alias CVData(5) = WindSpd : Units WindSpd = miles/hour
Alias CVData(6) = WindDir : Units WindDir = °
Alias CVData(7) = MaxWindSpd : Units MaxWindSpd = miles/hour
Alias CVData(8) = AirTemperature : Units AirTemperature = °F
Alias CVData(9) = Vapor_Press : Units Vapor_Press = mbar
Alias CVData(10) = Barometric_Press : Units Barometric_Press = mbar
Alias CVData(11) = Relative_Humidity : Units Relative_Humidity = %
Alias CVData(12) = Relative_Humidity_Temp : Units Relative_Humidity_Temp = °F
Alias CVData(13) = TiltNS_deg : Units TiltNS_deg = °
Alias CVData(14) = TiltWE_deg : Units TiltWE_deg = °
Public CollectData(3) As Boolean
Public Result_AC(3) As Long
Public Accel_AC1(3)
Alias Accel_AC1(1) = Accel_1x
Alias Accel_AC1(2) = Accel_1y
Alias Accel_AC1(3) = Accel_1z
Public Accel_AC2(3)
Alias Accel_AC2(1) = Accel_2x
Alias Accel_AC2(2) = Accel_2y
Alias Accel_AC2(3) = Accel_2z
Public Accel_AC3(3)
Alias Accel_AC3(1) = Accel_3x
Alias Accel_AC3(2) = Accel_3y
Alias Accel_AC3(3) = Accel_3z
Dim i
'Define Data Tables
DataTable(CT_Wx,True,-1)
DataInterval(0,10,Min,10)
Minimum(1,BattV,FP2,False,False)
Sample(1,PTemp_C,FP2)
Sample(1,SlrFD_W,IEEE4)
Average(1,SlrFD_W,IEEE4,False)
Minimum(1,SlrFD_W,IEEE4,False,True)
Maximum(1,SlrFD_W,IEEE4,False,True)
Totalize(1,Rain,IEEE4,False)
Totalize(1,Strikes,FP2,False)
Minimum(1,Distance,FP2,False,True)
Maximum(1,Distance,FP2,False,False)
Sample(1,WindSpd,FP2)
Sample(1,WindDir,FP2)
WindVector(1,WindSpd,WindDir,FP2,False,90,0,0)
FieldNames("WS_ms_S_WVT,WindDir_D1_WVT,WindDir_SD1_WVT")
Maximum(1,MaxWindSpd,FP2,False,False)
Sample(1,AirTemperature,FP2)
Average(1,AirTemperature,FP2,False)
Minimum(1,AirTemperature,FP2,False,True)
Maximum(1,AirTemperature,FP2,False,True)
Sample(1,Vapor_Press,IEEE4)
Sample(1,Barometric_Press,IEEE4)
StdDev(1,Barometric_Press,IEEE4,False)
Sample(1,Relative_Humidity,FP2)
Sample(1,Relative_Humidity_Temp,FP2)
StdDev(1,Relative_Humidity_Temp,FP2,False)
Sample(1,TiltNS_deg,FP2)
Sample(1,TiltWE_deg,FP2)
Totalize(1,SlrTF_MJ,IEEE4,False)
EndTable
'Accelerometer Data
DataTable(CT_AC1,True,-1)
Sample(3,Accel_AC1(),IEEE4)
EndTable
DataTable(CT_AC2,True,-1)
Sample(3,Accel_AC2(),IEEE4)
EndTable
DataTable(CT_AC3,True,-1)
Sample(3,Accel_AC3(),IEEE4)
EndTable
DataTable(Daily_Data,True,-1)
DataInterval(86390,86400,Sec,10)
Minimum(1,BattV,FP2,False,False)
Minimum(1,PTemp_C,FP2,False,True)
Maximum(1,PTemp_C,FP2,False,True)
Maximum(1,SlrFD_W,FP2,False,True)
Totalize(1,Rain,FP2,False)
Minimum(1,Distance,FP2,False,True)
Average(1,WindSpd,FP2,False)
WindVector(1,WindSpd,WindDir,FP2,False,90,0,0)
FieldNames("WindSpd_S_WVT,WindDir_D1_WVT,WindDir_SD1_WVT")
Maximum(1,MaxWindSpd,FP2,False,True)
Minimum(1,AirTemperature,FP2,False,True)
Maximum(1,AirTemperature,FP2,False,True)
Minimum(1,Vapor_Press,IEEE4,False,True)
Maximum(1,Vapor_Press,IEEE4,False,True)
Minimum(1,Barometric_Press,IEEE4,False,True)
Maximum(1,Barometric_Press,IEEE4,False,True)
Minimum(1,Relative_Humidity,FP2,False,True)
Maximum(1,Relative_Humidity,FP2,False,True)
Totalize(1,Invalid_Wind,FP2,False)
Sample(1,CVMeta,String)
EndTable
'Main Program
BeginProg
SetSetting("StationName", "CT_Wx")
'apply power to the ClimaVUE50
SW12 (SW12_1,1 )
http_header = "Internal file tag"&CHR(13)&CHR(10)&"internat logger tag"
SERVER_PATH = "https://altitude.stantec.com/func/api/RunCampbellScientificFunction?code=Authorization code"
'If the datalogger program has just started running, delay program execution for ten seconds to allow the ClimaVUE50 time to warm up
Delay(0,10,Sec)
'Main Scan
Scan(10,Sec,1,0)
'Default CR6 Datalogger Battery Voltage measurement 'BattV'
Battery(BattV)
'Default CR6 Datalogger Wiring Panel Temperature measurement 'PTemp_C'
PanelTemp(PTemp_C,60)
PTemp_F = PTemp_C * 1.8 + 32
'ClimaVUE50 Compact Digital Weather Sensor measurements
'SlrFD_W', 'Rain', 'Strikes', 'Distance', 'WindSpd', 'WindDir',
'MaxWindSpd', 'AirTemperature', 'Vapor_Press', Barometric_Press', 'Relative_Humidity', 'Relative_HumidityT_F',
'TiltNS_deg', and 'TiltWE_deg'
'Get data from ClimaVUE50 Compact Digital Weather Sensor
SDI12Recorder(CVData(),C1,"0","R7!",1,0,-1)
'Convert fractional relative humidity into percent relative humidity
Relative_Humidity = Relative_Humidity*100
'Calculate total solar flux in MJ/m² from flux density in W/m²
'The multiplier to calculate total flux was calculated by Short Cut
'and based on a program execution rate (scan rate) of 10 Seconds.
'If you change the program execution rate outside of Short Cut with the CRBasic Editor
'you will need to recalculate this multiplier. See the sensor manual for more details.
SlrTF_MJ = SlrFD_W*1E-05
'Convert rain in mm to inch
Rain = Rain * 0.03937
'Convert average strike distance in kilometers to miles
Distance = Distance * 0.621371
'Convert wind speed in meters/second to miles/hour
WindSpd = WindSpd * 2.23694
'Convert maximum wind speed in meters/second to miles/hour
MaxWindSpd = MaxWindSpd * 2.23694
'Convert air temperature in °C to °F
AirTemperature = AirTemperature * 1.8 + 32
'Convert vapor pressure in kPa to mbar
Vapor_Press = Vapor_Press * 10
'Convert barometric pressure in kPa to mbar
Barometric_Press = Barometric_Press * 10
'Convert relative humidity sensor temperature in °C to °F
Relative_Humidity_Temp = Relative_Humidity_Temp * 1.8 + 32
'High winds with rain can temporarily interfere with sonic wind measurements causing the sensor to output -9999 or -9990. The following instructions set invalid wind measurements
'to the previous valid wind measurements. This will 'flat-line' the measurements until the sensor is able to make good readings again. The Invalid_Wind variable will be set to 1 when
'a wind measurement is invalid. For troubleshooting purposes, it is highly recommended that you totalize the Invalid_Wind variable in any output tables you define that include
'wind speed and/or direction data from the ClimaVUE50.
If WindSpd < 0 Then
WindSpd = WSpdPrev
WindDir = WindDirPrev
MaxWindSpd = MaxWSpdPrev
Invalid_Wind = 1
Else
WSpdPrev = WindSpd
WindDirPrev = WindDir
MaxWSpdPrev = MaxWindSpd
Invalid_Wind = 0
EndIf
'Get ClimaVUE50 Compact Digital Weather Sensor metadata 'CVMeta' every day at midnight in case sensor is swapped or OS is updated
If IfTime(0,1,Day) Then
SDI12Recorder(CVMeta,C1,"0","I!",1,0)
EndIf
'Call Data Tables and Store Data
CallTable CT_Wx
CallTable Daily_Data
'set remote stations clock to match base station
If TimeIntoInterval (0,1430,Min)
ClockReport (COMRF,0,1)
ClockReport (COMRF,0,2)
ClockReport (COMRF,0,3)
EndIf
NextScan
SlowSequence
Scan (1,Min,3,0)
If IfTime (2,10,Min) Then
For i = 1 To 3
CollectData(i) = True
Next i
EndIf
If CollectData(1) Then
GetDataRecord (Result_AC(1),COMRF,0,1,0,0.05,4,32769,CT_AC1,-1)
If Result_AC(1) = 0 Then CollectData(1) = false
EndIf
If CollectData(2) Then
GetDataRecord (Result_AC(2),COMRF,0,2,0,0.05,4,32769,CT_AC2,-1)
If Result_AC(2) = 0 Then CollectData(2) = false
EndIf
If CollectData(3) Then
GetDataRecord (Result_AC(3),COMRF,0,3,0,0.05,4,32769,CT_AC3,-1)
If Result_AC(3) = 0 Then CollectData(3) = false
EndIf
If IfTime (5,10,min)Then
http_put_tx1 = HTTPPut (SERVER_PATH,"CT_Wx",http_put_response1,http_header,0,10,min,-1008,7500)
Delay (1,30,Sec)
http_put_tx2 = HTTPPut (SERVER_PATH,"Daily_Data",http_put_response2,http_header,0,10,min,-1008,7500)
Delay (1,30,Sec)
http_put_tx3 = HTTPPut (SERVER_PATH,"CT_AC1",http_put_response3,http_header,0,10,min,-1008,7500)
Delay (1,30,Sec)
http_put_tx4 = HTTPPut (SERVER_PATH,"CT_AC2",http_put_response4,http_header,0,10,min,-1008,7500)
Delay (1,30,Sec)
http_put_tx5 = HTTPPut (SERVER_PATH,"CT_AC3",http_put_response5,http_header,0,10,min,-1008,7500)
EndIf
NextScan
EndProg
Main thing is I need to know if I'm doing something wrong with the HTTPPut command?
Also, should I be putting the server_path and http_header in as constants? Actually I've already done that, but when I did I couldn't get any error codes to pop up in the http_put_response variables.
Also because i'm sending data from 5 tables should I (as I did) break it up into 5 seperate commands? or is there a way to do it all in one?
This post is under review.