RFXCOM Power, Water and Gas data collection tool

Forum regarding Windows Software and Home Automation Domotica.
User avatar
b_weijenberg
Forum Moderator
Forum Moderator
Posts: 1746
Joined: Sun May 14, 2006 4:32 pm
Location: Netherlands

Re: RFXCOM Power, Water and Gas data collection tool

Post by b_weijenberg »

The RFXMeter software is open and Dec 4th I have sent the message below, with the RFXMeter decoding part of the RFreceiver program, to Piotr and I've received a read response so I don't understand the message above.
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
Bert
phoenixb
Advanced Member
Advanced Member
Posts: 512
Joined: Thu Jul 23, 2009 1:00 pm
Location: Netherlands

Re: RFXCOM Power, Water and Gas data collection tool

Post by phoenixb »

And is it possible to run this software next to homeseer?
So can you use the RFXCOM data with homeseer and the collection tool at the same time?
__________________
User avatar
b_weijenberg
Forum Moderator
Forum Moderator
Posts: 1746
Joined: Sun May 14, 2006 4:32 pm
Location: Netherlands

Re: RFXCOM Power, Water and Gas data collection tool

Post by b_weijenberg »

You have to collect the data in Homeseer because only one application can connect the the receiver COM port. Or (much better solution ;-) ) buy a second receiver.
Set a value change event in Homeseer on the RFXMeter device and store the device value in a database.
Post Reply

Return to “Windows Forum”