statusCallBack.vb

Forum over Homeseer scripts (DUTCH forum)

Moderators: TANE, Ruud

Post Reply
raymonvdm
Senior Member
Senior Member
Posts: 1153
Joined: Sun Dec 18, 2011 1:23 am

statusCallBack.vb

Post by raymonvdm »

Ik heb nu een tijdje een script draaien welke ik gebruik om data uit HomeSeer te loggen naar MySQL dit werkt voor de meeste devices goed maar niet voor mijn RFXcom temperatuur sensoren. (Script heb ik gevonden op internet en is dus niet door mijn brein bedacht)

Nu heb ik gehoord dat je hiervoor in PHP MySQL escape string kan gebruiken (klok klepel auw) maar hoe doe ik dit in VB (Me=VB Rookie)

Code: Select all


Imports System.Data
Imports MySql.Data.MySqlClient

Dim Public ID As String = "statusCallBack.vb"
Sub checkStatus(ByVal aParm as Object)
 dim stat, hc, dc, hdc,refID, sName as String 

 Dim conn As MySqlConnection
 Dim myCommand As New MySqlCommand
 Dim varDate as String
 Dim varTime as String
 Dim varDeviceName as String
 Dim varDeviceCode as String 

'---------------------------------------------------------------
'PLACE THIS STATEMENT IN YOUR STARTUP SCRIPT
' hs.RegisterStatusChangeCB "statusCallBack.vb","checkStatus"
'---------------------------------------------------------------
 hc = aParm(0)
 dc = aParm(1)
 stat = aParm(2)
 refID = aParm(3)
 hdc = hc & dc 

 Dim device
 Dim dn
 Dim type as String
 Dim tijd

 tijd = Datepart("yyyy",Now()) & "-" & Right("0" & DatePart("m",Now()),2) & "-" & Right("0" & DatePart("d",Now()),2) & " " & Right("0" & DatePart("h",Now()),2) & ":" & Right("0" & DatePart("n",Now()),2) & ":" & Right("0" & DatePart("s",Now()),2)

  device = hs.GetDeviceByRef(refID)

  dn = device.name

'
'Detect type of device
'

Select Case (hc) 

 Case "\"
     type = "RFXcom"

  Case "["
     type = "RFXcom"

  Case "]"
     type = "K8055"

  Case "_"
     type = "Chromoflex"

  Case "A"
     type = "Kaku"

  Case "B"
     type = "Bleutooth"

  Case "F"
     type = "Grafiek"

  Case "P"
     type = "Schakelaar"

  Case "Q"
     type = "Z-Wave"

  Case "V"
     type = "Virtual Uptime"

  Case "Z"
     type = "Server"

  Case "^"
     type = "Plugwise"

End Select 

'hs.writelog(ID,"House Code: " & hc & " Device Code " & dc & " Status: " & stat & " Device Value: " & hs.DeviceValue(hdc) & " Device String: " & hs.DeviceString(hdc) & " Name: " & dn & " Type: " & type & " Time: " & tijd)

 conn = New MySqlConnection()
 conn.ConnectionString = "server=127.0.0.128; user id=homeseer; password=zegiknie; database=databeest"

Try
    conn.Open()
    'hs.writelog ("mySQL", "Connection Opened Successfully!")
    myCommand.CommandText = "INSERT INTO tbldevices (hc,devicename,type,dc,value,status,ts)" & " VALUES ('" & hc & "','" & dn & "','" & type & "','" & dc & "','" & hs.DeviceValue(hdc) & "','" & stat & "','" & tijd & "')"
    myCommand.Connection = conn
    myCommand.ExecuteNonQuery()
    'hs.writelog ("mySQL", "Logged to database: " & varDeviceName & ", " & varDeviceCode & ", " & iStatus)
    conn.Close()
    Catch myerror As MySqlException
    hs.writelog ("mySQL", "Error Connecting to Database: " & myerror.Message)
End Try

End Sub

Dit is namelijk de foutmelding welke ik krijg

Code: Select all

2-4-2013 18:05:45  - mySQL - Error Connecting to Database: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Slaapkamer T','RFXcom','2','181','2','2013-04-02 18:05:45')' at line 1
Running HS3PRO on PC with Z-Wave / OpenTherm / Plugwise / RFXcom / MQTT / XAP400 / Logitech Media Server and Squeezelite on PI`s
AshaiRey
Senior Member
Senior Member
Posts: 1310
Joined: Mon Feb 02, 2009 5:27 pm
Location: Netherlands
Contact:

Re: statusCallBack.vb

Post by AshaiRey »

Hoi
right syntax to use near 'Slaapkamer T','RFXcom'
Dit vertel je dat de sql string goed is tot aan dat punt

Kan je dit in het script toevoelgen na mycommand.commandtext (ergens onderaan staat dat) en de sql string hier delen.
hs.writelog("sqlstring", "INSERT INTO tbldevices (hc,devicename,type,dc,value,status,ts)" & " VALUES ('" & hc & "','" & dn & "','" & type & "','" & dc & "','" & hs.DeviceValue(hdc) & "','" & stat & "','" & tijd & "')" )

De escape string is meestal \r (nieuwlijn) en \r (return). Als je die dingen bedoelt dan dan moet je vbCrCl hebben.
Voor meer optie kan je hier kijken http://msdn.microsoft.com/en-us/library ... -snippet-1
Bram
raymonvdm
Senior Member
Senior Member
Posts: 1153
Joined: Sun Dec 18, 2011 1:23 am

Re: statusCallBack.vb

Post by raymonvdm »

Ik heb de regel toegevoegd en dit is het resultaat

Deze gaat goed

Code: Select all

2-4-2013 21:10:42  - sqlstring - INSERT INTO tbldevices (hc,devicename,type,dc,value,status,ts) VALUES ('O','025   CH water temp (C)','','50','59','17','2013-04-02 21:10:42')
Deze gaat niet goed

Code: Select all

2-4-2013 21:11:12  - sqlstring - INSERT INTO tbldevices (hc,devicename,type,dc,value,status,ts) VALUES ('\','Bijkeuken T','RFXcom','22','163','2','2013-04-02 21:11:12')
Running HS3PRO on PC with Z-Wave / OpenTherm / Plugwise / RFXcom / MQTT / XAP400 / Logitech Media Server and Squeezelite on PI`s
AshaiRey
Senior Member
Senior Member
Posts: 1310
Joined: Mon Feb 02, 2009 5:27 pm
Location: Netherlands
Contact:

Re: statusCallBack.vb

Post by AshaiRey »

Oke duidelijk, ik zal je vertellen waarom.
Het \ teken in SQL is een escape code. In combinatie met het teken erna doet het wat. Bijvoorbeeld \n betekend newline. Jij wilt nu een \ wegschrijven naar de database maar SQL denkt er komt nog wat maar dat is niet zo.

Hoe dan toch een huiscode met een \ erin weg schrijven? Dit kan je doen door 2x \ neer te zetten, dus \\
Je moet hiervoor je code een beetje aanpassen. Hieronder is een manier waarop het kan

Code: Select all

 myCommand.CommandText = "INSERT INTO tbldevices (hc,devicename,type,dc,value,status,ts)" & " VALUES ('" & hc & "','" & dn & "','" & type & "','" & dc & "','" & hs.DeviceValue(hdc) & "','" & stat & "','" & tijd & "')"

verander deze regel in

 Dim strSQL As String
 strSQL = "INSERT INTO tbldevices (hc,devicename,type,dc,value,status,ts)" & " VALUES ('" & hc & "','" & dn & "','" & type & "','" & dc & "','" & hs.DeviceValue(hdc) & "','" & stat & "','" & tijd & "')"

 strSQL = Replace(strSQL, "\", "\\"
 myCommand.CommandText = strSQL
Meer over Replace ( http://www.w3schools.com/vbscript/func_replace.asp )
Bram
raymonvdm
Senior Member
Senior Member
Posts: 1153
Joined: Sun Dec 18, 2011 1:23 am

Re: statusCallBack.vb

Post by raymonvdm »

Dit werkt nog niet helemaal

Code: Select all

3-4-2013 11:08:08  - Error - Script compile error: ')' wordt verwacht.on line 104
3-4-2013 11:08:43  - SCR - Option Strict OffImports System.DataImports MySql.Data.MySqlClientimports Schedulerimports SystemPublic Module scriptcode80#Region "Automatically generated code, do not modify"'Automatically generated code, do not modify'Event Sources Begin	<System.ContextStaticAttribute()> Public WithEvents hs As Scheduler.hsapplication	<System.ContextStaticAttribute()> Public WithEvents hsp As scheduler.hsp	<System.ContextStaticAttribute()> Public WithEvents hssystem As scheduler.phone0'Event Sources End'End of automatically generated code#End RegionDim Public ID As String = "statusCallBack.vb"Sub checkStatus(ByVal aParm as Object) dim stat, hc, dc, hdc,refID, sName as String  Dim conn As MySqlConnection Dim myCommand As New MySqlCommand Dim varDate as String Dim varTime as String Dim varDeviceName as String Dim varDeviceCode as String '---------------------------------------------------------------'PLACE THIS STATEMENT IN YOUR STARTUP SCRIPT' hs.RegisterStatusChangeCB "statusCallBack.vb","checkStatus"'--------------------------------------------------------------- hc = aParm(0) dc = aParm(1) stat = aParm(2) refID = aParm(3) hdc = hc & dc  Dim device Dim dn Dim type as String Dim tijd tijd = Datepart("yyyy",Now()) & "-" & Right("0" & DatePart("m",Now()),2) & "-" & Right("0" & DatePart("d",Now()),2) & " " & Right("0" & DatePart("h",Now()),2) & ":" & Right("0" & DatePart("n",Now()),2) & ":" & Right("0" & DatePart("s",Now()),2)  device = hs.GetDeviceByRef(refID)  dn = device.name''Detect type of device'Select Case (hc)  Case "\"     type = "RFXcom"  Case "["     type = "RFXcom"  Case "]"     type = "K8055"  Case "_"     type = "Chromoflex"  Case "A"     type = "Kaku"  Case "B"     type = "Bleutooth"  Case "F"     type = "Grafiek"  Case "P"     type = "Schakelaar"  Case "Q"     type = "Z-Wave"  Case "V"     type = "Virtual Uptime"  Case "Z"     type = "Server"  Case "^"     type = "Plugwise"End Select 'hs.writelog(ID,"House Code: " & hc & " Device Code " & dc & " Status: " & stat & " Device Value: " & hs.DeviceValue(hdc) & " Device String: " & hs.DeviceString(hdc) & " Name: " & dn & " Type: " & type & " Time: " & tijd) conn = New MySqlConnection() conn.ConnectionString = "server=192.168.110.188; user id=homeseer; password=seehome; database=HomeSeerDB2"Try    conn.Open()    'hs.writelog ("mySQL", "Connection Opened Successfully!")        Dim strSQL As String    strSQL = "INSERT INTO tbldevices (hc,devicename,type,dc,value,status,ts)" & " VALUES ('" & hc & "','" & dn & "','" & type & "','" & dc & "','" & hs.DeviceValue(hdc) & "','" & stat & "','" & tijd & "')"    strSQL = Replace(strSQL, "\", "\\"    myCommand.CommandText = strSQL      myCommand.Connection = conn    myCommand.ExecuteNonQuery()    'hs.writelog ("mySQL", "Logged to database: " & varDeviceName & ", " & varDeviceCode & ", " & iStatus)    conn.Close()    Catch myerror As MySqlException    hs.writelog ("mySQL", "Error Connecting to Database: " & myerror.Message)End TryEnd SubEnd Module


Zo ziet het script er nu uit

Code: Select all

Try
    conn.Open()
    'hs.writelog ("mySQL", "Connection Opened Successfully!")
    
    Dim strSQL As String
    strSQL = "INSERT INTO tbldevices (hc,devicename,type,dc,value,status,ts)" & " VALUES ('" & hc & "','" & dn & "','" & type & "','" & dc & "','" & hs.DeviceValue(hdc) & "','" & stat & "','" & tijd & "')"
    strSQL = Replace(strSQL, "\", "\\"
    myCommand.CommandText = strSQL
  
    myCommand.Connection = conn
    myCommand.ExecuteNonQuery()
    'hs.writelog ("mySQL", "Logged to database: " & varDeviceName & ", " & varDeviceCode & ", " & iStatus)
    conn.Close()
    Catch myerror As MySqlException
    hs.writelog ("mySQL", "Error Connecting to Database: " & myerror.Message)
End Try

Is het ook niet zo dat strSQL nu dubbel wordt gedefinieerd?
Running HS3PRO on PC with Z-Wave / OpenTherm / Plugwise / RFXcom / MQTT / XAP400 / Logitech Media Server and Squeezelite on PI`s
AshaiRey
Senior Member
Senior Member
Posts: 1310
Joined: Mon Feb 02, 2009 5:27 pm
Location: Netherlands
Contact:

Re: statusCallBack.vb

Post by AshaiRey »

Sorry ik zit het hier uit mijn hoofd te doen en zoals de foutboodschap aangeeft een ) vergeten.. :-(

Deze dus aan het einde van
strSQL = Replace(strSQL, "\", "\\")
Is het ook niet zo dat strSQL nu dubbel wordt gedefinieerd?
Met Dim strSQL As String wordt hij gedefineerd als een string maar is nog leeg.
Door strSQL = "INSERT <enzovoort> wordt hij gevuld.

En bij strSQL = Replace(strSQL, "\", "\\") wordt de variabele gepakt en daarin wordt alle \ vervangen door \\ en het resultaat wordt weer in de variabele gezet.
Je moet het dus van rechts van het = teken naar links lezen.
<nieuwe waarde> = doe iets met <oude waarde>
Net als A=10
A = A + 1 : heeft als resultaat A = 11
Bram
raymonvdm
Senior Member
Senior Member
Posts: 1153
Joined: Sun Dec 18, 2011 1:23 am

Re: statusCallBack.vb

Post by raymonvdm »

Dit lijkt er inderdaad meer op :D

Ik heb nu van een aantal RFXcom modules waardes in de database

Ik heb hem nu overigens zo aangepast omdat ik de \ ook niet kan gebruiken voor het scriptje wat mijn cacti grafieken voed

Code: Select all

strSQL = Replace(strSQL, "\", "T")
Waarbij ik housecode T niet gebruik in HomeSeer, helaas is het niet mogelijk in de RFXcom plugin de \ aan te passen naar een andere housecode. Dan was dit probleem er al niet geweest om mee te beginnen :evil:
Running HS3PRO on PC with Z-Wave / OpenTherm / Plugwise / RFXcom / MQTT / XAP400 / Logitech Media Server and Squeezelite on PI`s
Post Reply

Return to “Homeseer Scripts Forum”