The Grandstream GDS3710/3705 SIP Intercom comes with a door/gate open feature via wired comms to your gate or door latch system. It also comes with a HTTP API that can be called where direct access to the GDS unit is available (whether on private network or public network through port forwarding)
Homeseer is an established smart home automation solution allowing comprehensive control of devices throughout your office or home through inbuilt features, plugins and scripting. See https://homeseer.com/
Below is a script that can be used as a triggered action for an event to keep your door/gate open via API. Note this is an alternative method to the simple Open API command as referenced in our other FAQ entry here which simply passes an open command and then gate closes immediately after.
Note: you need to be able to interact with the .Net Http classes. To enable this you need to have the following line in the [Settings]
block of your Homeseer settings.ini file. Homeseer will need to be restarted after changing this.
ScriptingReferences=System.Net.Http;System.Net.Http.dll
The script is written in vb.net (Homeseer scripting language) and must be deployed in your Homeseer deployment custom scripts directory. In a Linux deployment of Homeseer this directory is /usr/local/HomeSeer/scripts/
. The file should be named with a .vb extension e.g. gatetimer.vb
The script expects a parameter from the Event which is the time to keep the gate open. Passing 0 will disable any active timer and close the gate. Passing a value or 5 to 480 will keep the gate open for that number of minutes.
Once saved you can create mutiple events that execute this script when triggered e.g. Disable Timer with parameter of 0 or Open Gate 1 Hour with parameter of 60. I suggest that you create these Events as manually triggered and they can then be triggered as an action of any other Event e.g. Geofence triggered action when you arrive home to Open Gate for 5 Minutes
Change sServer, sAdminPassword and sDoor to your values
sServer
is the server name in url format with port as necessay e.g.https://192.168.1.100
orhttps://dynamicdns.host:1234
sAdminPassword
is the password for the admin user to your GDS Admin GUI.sDoor
is the Door to open. For door 1 set the value to "1", for door 2 set the value to "2" and for both doors set the value to "3"
Credits to @zwolfpack for the MD5 function and to this thread on the Homeseer forum for assistance in generating this script
Sub Main(ByVal sTime As String)
'**********Your Custom Values************
' GDS3710 IP Address or Hostname e.g. https:/yourdyndns.org:1234
Dim sServer As String = "https://192.168.1.100"
' GDS3710 Password for Admin User
Dim sAdminPassword As String = "Password1234"
'Door 1 = 1, Door 2 = 2, Both Doors = 3
Dim sDoor As String = "3"
'**********Your Custom Values************
'Fixed Variables
Dim sResCode AS String
Dim sRetMsg AS String
Dim sChallengeCode AS String
Dim sIDCode AS String
Dim GateXMLDoc As New System.XML.XmlDocument()
Dim handler AS New System.Net.Http.HttpClientHandler()
Dim sGSKey As String = "GDS3710lZpRsFzCbM"
Dim sDoor1CodeEnable As String = "P15429"
Dim sDoor1CodeTime As String = "P15430"
Dim sDoor2CodeEnable As String = "P15455"
Dim sDoor2CodeTime As String = "P15456"
Dim sURL As String = ""
Dim sXML As String = ""
Dim sCookieUname As New System.Net.Cookie("uname", "admin")
Dim sCookieGDSKey As New System.Net.Cookie("gdsauthkey443", "643e985e113a50979fd245762be01a57")
Dim sEnable As String = "1"
'Parse Time Paramter - 0 disables timers
Dim iTime As Integer = CInt(sTime)
If iTime > 480 Then
sTime = "480"
ElseIf iTime > 0 and iTime < 5 Then
sTime = "5"
ElseIf iTime = 0 Then
sEnable = "0"
End If
hs.writelog("Gate Schedule: Params", "Door:" + sDoor + " Enable: " + sEnable + " Time: " + sTime)
Try
'First step of authorisation - Get Challenge Code
Dim sAuthStep1Query As String = "/goform/login?cmd=login&user=admin&type=0"
sURL=sServer+sAuthStep1Query
'hs.writelog("Gate Auth S1: URL", sURL)
GateXMLDoc.Load(sURL)
sResCode = GateXMLDoc.DocumentElement.SelectSingleNode("/Configuration/ResCode").InnerText
'hs.writelog("Gate Auth S1: Result", sResCode)
If sResCode=0 Then
sChallengeCode = GateXMLDoc.DocumentElement.SelectSingleNode("/Configuration/ChallengeCode").InnerText
'hs.writelog("Gate: Challenge Code", sChallengeCode)
Dim sAuthCode AS String = sChallengeCode + ":" + sGSKey +":" + sAdminPassword
'hs.WriteLog("Gate: Auth Code", sAuthCode)
Dim sAuthCodeMD5 AS String = md5sum(sAuthCode)
'hs.WriteLog("Gate: Auth Code MD5", sAuthCodeMD5)
'Second step of authorisation - Authorise and set cookie with session code. Set Cookie Values as prescribed by Grandstream
Dim sAuthStep2Query AS String = "/goform/login?cmd=login&user=admin&authcode=" + sAuthCodeMD5
sURL=sServer+sAuthStep2Query
'hs.writelog("Gate Auth S2: URL", sURL)
Dim authuri As New System.Uri(sURL)
handler.CookieContainer = new System.Net.CookieContainer()
handler.CookieContainer.Add(authuri, sCookieUname)
handler.CookieContainer.Add(authuri, sCookieGDSKey)
Dim client As new System.Net.Http.HttpClient(handler)
sXML = client.GetStringAsync(authuri).Result
GateXMLDoc.LoadXml(sXML)
sResCode = GateXMLDoc.DocumentElement.SelectSingleNode("/Configuration/ResCode").InnerText
'hs.writelog("Gate Auth S2: Result", sResCode)
If sResCode=0 Then
'hs.writelog("Gate Auth S2: Success", sResCode)
'Set Timer - Depending on sDoor value this can be either door or both
'0 Value for sEnable disables timer and closes door
Dim sOpenQuery AS String
If sDoor = "3" Then
sOpenQuery = "/goform/config?cmd=set&" + sDoor1CodeEnable + "=" + sEnable + "&" + sDoor1CodeTime + "=" + sTime + "&" + sDoor2CodeEnable + "=" + sEnable + "&" + sDoor2CodeTime + "=" + sTime
ElseIf sDoor = "2" Then
sOpenQuery = "/goform/config?cmd=set&" + sDoor2CodeEnable + "=" + sEnable + "&" + sDoor2CodeTime + "=" + sTime
Else
sOpenQuery = "/goform/config?cmd=set&" + sDoor1CodeEnable + "=" + sEnable + "&" + sDoor1CodeTime + "=" + sTime
End If
sURL=sServer+sOpenQuery
'hs.writelog("Gate Open: URL", sURL)
Dim openuri as New System.Uri(sURL)
sXML = client.GetStringAsync(openuri).Result
GateXMLDoc.LoadXml(sXML)
sResCode = GateXMLDoc.DocumentElement.SelectSingleNode("/Configuration/ResCode").InnerText
If sResCode=0 Then
'SUCCESFUL Timer Set
hs.writelog("Gate Timer: Success", sResCode)
Else
'FAILED Timer Set
sRetMsg = GateXMLDoc.DocumentElement.SelectSingleNode("/Configuration/RetMsg").InnerText
hs.writelog("Gate Timer: Error", sRetMsg)
End If
Else
sRetMsg = GateXMLDoc.DocumentElement.SelectSingleNode("/Configuration/RetMsg").InnerText
hs.writelog("Gate Auth S2: Error ", sRetMsg)
End If
Else
sRetMsg = GateXMLDoc.DocumentElement.SelectSingleNode("/Configuration/RetMsg").InnerText
hs.writelog("Gate Auth S1: Error", sRetMsg)
End If
Catch ex As Exception
hs.WriteLog ("Gate: Error", ex.Message)
End Try
End Sub
Function md5sum(ByVal strToHash As String) As String
Dim md5Obj As New Security.Cryptography.MD5CryptoServiceProvider
Dim bytesToHash() As Byte = System.Text.Encoding.ASCII.GetBytes(strToHash)
bytesToHash = md5Obj.ComputeHash(bytesToHash)
Dim strResult As String = ""
For Each b As Byte In bytesToHash
strResult += b.ToString("x2")
Next
Return strResult
End Function