bemasher / rtlamr

An rtl-sdr receiver for Itron ERT compatible smart meters operating in the 900MHz ISM band.
GNU Affero General Public License v3.0
2.19k stars 249 forks source link

Compatibility question - Landis+Gyr Focus kWh #156

Closed mrd0n closed 4 years ago

mrd0n commented 4 years ago

Hi - curious if the Landis+Gyr Focus KwH electrical unit is supported or if you think it could be?

The FCC ID is : https://fccid.io/ROV-CLTR900M

The manual for the unit is: https://www.solar-electric.com/lib/wind-sun/Focus-technical-manual.pdf

Thank you for this awesome contribution - my water meter and gas meter are being captured perfectly!

mrd0n commented 4 years ago

Adding some more info that is hopefully useful.

From the FCC document, the device frequency range is 913.98-917.58 MHz.

I've tried a capture using rtlcap -centerfreq=915M -tunergainmode=false -gainbyindex=29 -squelch=0.658 -bytes=25M -o capture-915M.cu8 capture.zip

I think the device ID is 40615079.

Added some photos. IMG_1310 IMG_1312

bemasher commented 4 years ago

Your 100G should be compatible based on the label, but your Focus is likely not compatible. Based on the samples you provided, it does not contain any messages from your gas meter.

Below is a test to decode the samples you provided.

package main

import (
    "io"
    "os"
    "testing"

    "github.com/bemasher/rtlamr/idm"
    "github.com/bemasher/rtlamr/protocol"
    "github.com/bemasher/rtlamr/scm"
)

func TestRead(t *testing.T) {
    sampleFile, err := os.Open("capture-915M.cu8")
    if err != nil {
        t.Fatal(err)
    }
    defer sampleFile.Close()

    d := protocol.NewDecoder()
    d.RegisterProtocol(scm.NewParser(72))
    d.RegisterProtocol(idm.NewParser(72))
    d.Allocate()

    block := make([]byte, d.Cfg.BlockSize2)

    for {
        // Read new sample block.
        _, err := sampleFile.Read(block)
        if err == io.EOF {
            break
        }
        if err != nil {
            t.Fatal("Error reading samples: ", err)
        }

        offset, _ := sampleFile.Seek(0, os.SEEK_CUR)

        for msg := range d.Decode(block) {
            t.Logf("%9d %T %+v\n", uint64(offset)>>1, msg, msg)
        }
    }
}

This is the output.

=== RUN   TestRead
    main_test.go:40:    253952 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    270336 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    303104 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    319488 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    352256 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    376832 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    393216 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    417792 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    434176 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    450560 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    475136 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    491520 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    516096 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    548864 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    565248 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    598016 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    614400 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    630784 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    647168 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    663552 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    679936 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    696320 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    712704 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    729088 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    761856 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    778240 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    811008 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    827392 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    843776 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    860160 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    876544 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    901120 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    917504 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    933888 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    950272 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:    983040 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1007616 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1040384 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1064960 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1081344 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1105920 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1122304 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1138688 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1163264 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1179648 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1196032 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1228800 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1245184 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1277952 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1294336 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1310720 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1327104 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1343488 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1359872 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1376256 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1392640 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1409024 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1441792 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1466368 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1499136 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1515520 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1531904 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1548288 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1564672 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1581056 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1597440 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1613824 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1638400 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1662976 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1687552 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1720320 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1736704 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
    main_test.go:40:   1761280 scm.SCM {ID:30037481 Type:13 Tamper:{Phy:00 Enc:03} Consumption:  149960 CRC:0x89E9}
--- PASS: TestRead (0.26s)
PASS
ok      github.com/bemasher/rtlamr/data/focus   (cached)
mrd0n commented 4 years ago

Thank you for your time! Bummer on the Focus not likely being compatible.

The 100G gas meter is being decoded - yay!.

seancolyer commented 3 years ago

@bemasher do you know what the issue is here? Looking at a couple of the other tickets it looks like there's a variety of potential issues that seem to group around two classes:

Is that right? If it's the first issue, I was thinking about trying to dive in and see if I could possibly put something together built on your work, would that make sense to attempt?

bemasher commented 3 years ago

I have no direct experience with non-ERT meters, you are welcome to fork rtlamr and build support yourself. I don't have time or resources to support these meters in rtlamr, so it would have to remain a separate project.

bemasher commented 3 years ago

For the curious among you, this page has quite a lot of good information regarding Landis+Gyr meters and decoding the protocol at least some of them use.

https://wiki.recessim.com/view/Gr-smart_meters_Setup_Guide