The RFreceiver doesn't write data to a SQL db so if that coding part was needed the RFreceiver source would not give any additional information.
The RFXMeter protocol is open and is described in chapter 11 http://www.rfxcom.com/documents/RFXMeter.pdf" onclick="window.open(this.href);return false;
So if this is the only device you like to sample to the sql it must be possible for you to write your decoding program.
Code: Select all
If recbits = 48 Then 'check if RFXMeter or RFXPower
parity = Not ((recbuf(0) >> 4) + (recbuf(0) And &HF) _
+ (recbuf(1) >> 4) + (recbuf(1) And &HF) _
+ (recbuf(2) >> 4) + (recbuf(2) And &HF) _
+ (recbuf(3) >> 4) + (recbuf(3) And &HF) _
+ (recbuf(4) >> 4) + (recbuf(4) And &HF) _
+ (recbuf(5) >> 4)) And &HF
If (parity = (recbuf(5) And &HF)) And (recbuf(0) + (recbuf(1) Xor &HF) = &HFF) Then
processrfxmeter()
End If
End If
Sub processrfxmeter()
Dim measured_value As Single
WriteMessage(" RFXMeter[" & (recbuf(0) * 256 + recbuf(1)).ToString & "]M", False)
WriteMessage(" RFXMeter addr:" & VB.Right("0" & Hex(recbuf(0)), 2), False)
WriteMessage(VB.Right("0" & Hex(recbuf(1)), 2), False)
WriteMessage(" ID:" & Convert.ToString(recbuf(1) + (recbuf(0) * 256)) & " ", False)
Select Case recbuf(5) And &HF0
Case &H0
measured_value = ((recbuf(4) * 65536) + (recbuf(2) * 256) + recbuf(3))
WriteMessage("RFXMeter: " & Convert.ToString(measured_value), False)
WriteMessage("; RFXPower: " & Convert.ToString(measured_value / 100) & " kWh", False)
WriteMessage("; RFXPwr-Module: " & Convert.ToString(measured_value / 1000) & " kWh", False)
Case &H10
WriteMessage("Interval: ", False)
Select Case recbuf(2)
Case &H1
WriteMessage("30 sec.", False)
Case &H2
WriteMessage("1 min.", False)
Case &H4
WriteMessage("6 (old=5) min.", False)
Case &H8
WriteMessage("12 (old=10) min.", False)
Case &H10
WriteMessage("15 min.", False)
Case &H20
WriteMessage("30 min.", False)
Case &H40
WriteMessage("45 min.", False)
Case &H80
WriteMessage("60 min.", False)
Case Else
WriteMessage("illegal value", False)
End Select
Case &H20
Select Case (recbuf(4) And &HC0)
Case &H0
WriteMessage("Input-0 ", False)
Case &H40
WriteMessage("Input-1 ", False)
Case &H80
WriteMessage("Input-2 ", False)
Case Else
WriteMessage("Error, unknown input ", False)
End Select
measured_value = (((recbuf(4) And &H3F) * 65536) + (recbuf(2) * 256) + recbuf(3)) / 1000
WriteMessage("Calibration: " & Convert.ToString(measured_value) & "msec ", False)
If measured_value <> 0 Then
WriteMessage("RFXPower= " & Convert.ToString(Round(1 / ((16 * measured_value) / (3600000 / 100)), 3)) & "kW", False)
WriteMessage(" RFXPwr= " & Convert.ToString(Round(1 / ((16 * measured_value) / (3600000 / 62.5)), 3)) & "|" & Convert.ToString(Round((1 / ((16 * measured_value) / (3600000 / 62.5))) * 1.917, 3)) & "kW", False)
End If
Case &H30
WriteMessage("New address set", False)
Case &H40
Select Case (recbuf(4) And &HC0)
Case &H0
WriteMessage("Counter for Input-0 will be set to zero within 5 seconds OR push MODE button for next command.", False)
Case &H40
WriteMessage("Counter for Input-1 will be set to zero within 5 seconds OR push MODE button for next command.", False)
Case &H80
WriteMessage("Counter for Input-2 will be set to zero within 5 seconds OR push MODE button for next command.", False)
Case Else
WriteMessage("Error, unknown input ", False)
End Select
Case &H50
WriteMessage("Push MODE push button within 5 seconds to increment the 1st digit.", False)
measured_value = (recbuf(2) >> 4) * 100000 + (recbuf(2) And &HF) * 10000 + (recbuf(3) >> 4) _
* 1000 + (recbuf(3) And &HF) * 100 + (recbuf(4) >> 4) * 10 + (recbuf(4) And &HF)
WriteMessage("Counter value = " & VB.Right("00000" & Convert.ToString(measured_value), 6), False)
Case &H60
WriteMessage("Push MODE push button within 5 seconds to increment the 2nd digit.", False)
measured_value = (recbuf(2) >> 4) * 100000 + (recbuf(2) And &HF) * 10000 + (recbuf(3) >> 4) _
* 1000 + (recbuf(3) And &HF) * 100 + (recbuf(4) >> 4) * 10 + (recbuf(4) And &HF)
WriteMessage("Counter value = " & VB.Right("00000" & Convert.ToString(measured_value), 6), False)
Case &H70
WriteMessage("Push MODE push button within 5 seconds to increment the 3rd digit.", False)
measured_value = (recbuf(2) >> 4) * 100000 + (recbuf(2) And &HF) * 10000 + (recbuf(3) >> 4) _
* 1000 + (recbuf(3) And &HF) * 100 + (recbuf(4) >> 4) * 10 + (recbuf(4) And &HF)
WriteMessage("Counter value = " & VB.Right("00000" & Convert.ToString(measured_value), 6), False)
Case &H80
WriteMessage("Push MODE push button within 5 seconds to increment the 4th digit.", False)
measured_value = (recbuf(2) >> 4) * 100000 + (recbuf(2) And &HF) * 10000 + (recbuf(3) >> 4) _
* 1000 + (recbuf(3) And &HF) * 100 + (recbuf(4) >> 4) * 10 + (recbuf(4) And &HF)
WriteMessage("Counter value = " & VB.Right("00000" & Convert.ToString(measured_value), 6), False)
Case &H90
WriteMessage("Push MODE push button within 5 seconds to increment the 5th digit.", False)
measured_value = (recbuf(2) >> 4) * 100000 + (recbuf(2) And &HF) * 10000 + (recbuf(3) >> 4) _
* 1000 + (recbuf(3) And &HF) * 100 + (recbuf(4) >> 4) * 10 + (recbuf(4) And &HF)
WriteMessage("Counter value = " & VB.Right("00000" & Convert.ToString(measured_value), 6), False)
Case &HA0
WriteMessage("Push MODE push button within 5 seconds to increment the 6th digit.", False)
measured_value = (recbuf(2) >> 4) * 100000 + (recbuf(2) And &HF) * 10000 + (recbuf(3) >> 4) _
* 1000 + (recbuf(3) And &HF) * 100 + (recbuf(4) >> 4) * 10 + (recbuf(4) And &HF)
WriteMessage("Counter value = " & VB.Right("00000" & Convert.ToString(measured_value), 6), False)
Case &HB0
Select Case recbuf(4)
Case &H0
WriteMessage("Counter for Input-0 reset to zero.", False)
Case &H40
WriteMessage("Counter for Input-1 reset to zero.", False)
Case &H80
WriteMessage("Counter for Input-2 reset to zero.", False)
Case Else
WriteMessage("protocol error.", False)
End Select
Case &HC0
WriteMessage("Enter SET INTERVAL RATE mode within 5 seconds OR push MODE button for next command.", False)
Case &HD0
Select Case (recbuf(4) And &HC0)
Case &H0
WriteMessage("Enter CALIBRATION mode for Input-0 within 5 seconds OR push MODE button for next command.", False)
Case &H40
WriteMessage("Enter CALIBRATION mode for Input-1 within 5 seconds OR push MODE button for next command.", False)
Case &H80
WriteMessage("Enter CALIBRATION mode for Input-2 within 5 seconds OR push MODE button for next command.", False)
Case Else
WriteMessage("Error, unknown input ", False)
End Select
Case &HE0
WriteMessage("Enter SET ADDRESS mode within 5 seconds OR push MODE button for next command.", False)
Case &HF0
If recbuf(2) < &H40 Then
WriteMessage("RFXPower Identification,", False)
ElseIf recbuf(2) < &H80 Then
WriteMessage("RFXWater Identification,", False)
ElseIf recbuf(2) < &HC0 Then
WriteMessage("RFXGas Identification,", False)
Else
WriteMessage("RFXMeter Identification,", False)
End If
WriteMessage(" Firmware Version: " & VB.Right("0" & Hex(recbuf(2)), 2), False)
WriteMessage(", Interval rate: ", False)
Select Case recbuf(3)
Case &H1
WriteMessage("30 seconds", False)
Case &H2
WriteMessage("1 minute", False)
Case &H4
WriteMessage("6 minutes", False)
Case &H8
WriteMessage("12 minutes", False)
Case &H10
WriteMessage("15 minutes", False)
Case &H20
WriteMessage("30 minutes", False)
Case &H40
WriteMessage("45 minutes", False)
Case &H80
WriteMessage("60 minutes", False)
Case Else
WriteMessage("illegal value", False)
End Select
Case Else
WriteMessage("illegal packet type", False)
End Select
End Sub