rtl_433 icon indicating copy to clipboard operation
rtl_433 copied to clipboard

Device support for Kidde RF-SM-DC smoke detector

Open loopy321 opened this issue 3 years ago • 17 comments

Kidde makes these smoke detectors which use 433MHz.

I have been trying to decode the signal, but do not see anything that looks obvious when doing the -S unknown so I tried button triggering the device while sampling for 15 sec: kidde_RF-SM-DC_15s.zip The signal captured has my two temperature sensors Acurite-986 and Acurite-606, but a "Megacode-Remote" shows up that I do not have and have never seen before, but the time it shows up is later than expected.

My best guess is the signal @1.947876s is the one I am after:

Detected OOK package    @1.947876s
Analyzing pulses...
Total count:  130,  width: 481.68 ms            (120421 S)
Pulse width distribution:
 [ 0] count:   98,  width:  544 us [444;592]    ( 136 S)
 [ 1] count:   13,  width:  372 us [300;420]    (  93 S)
 [ 2] count:    8,  width:  176 us [148;212]    (  44 S)
 [ 3] count:    2,  width:   76 us [76;80]      (  19 S)
 [ 4] count:    6,  width:  260 us [236;288]    (  65 S)
 [ 5] count:    1,  width:   48 us [48;48]      (  12 S)
 [ 6] count:    1,  width:  136 us [136;136]    (  34 S)
 [ 7] count:    1,  width:  108 us [108;108]    (  27 S)
Gap width distribution:
 [ 0] count:   56,  width: 4164 us [4052;4756]  (1041 S)
 [ 1] count:   67,  width: 2096 us [2012;2496]  ( 524 S)
 [ 2] count:    4,  width: 9116 us [8968;9364]  (2279 S)
 [ 3] count:    1,  width: 6672 us [6672;6672]  (1668 S)
 [ 4] count:    1,  width: 2760 us [2760;2760]  ( 690 S)
Pulse period distribution:
 [ 0] count:   56,  width: 4636 us [4336;5176]  (1159 S)
 [ 1] count:   68,  width: 2580 us [2112;2928]  ( 645 S)
 [ 2] count:    4,  width: 9664 us [9512;9908]  (2416 S)
 [ 3] count:    1,  width: 7208 us [7208;7208]  (1802 S)
Pulse timing distribution:
 [ 0] count:   98,  width:  544 us [444;592]    ( 136 S)
 [ 1] count:   13,  width:  372 us [300;420]    (  93 S)
 [ 2] count:    8,  width:  176 us [148;212]    (  44 S)
 [ 3] count:    2,  width:   76 us [76;80]      (  19 S)
 [ 4] count:    6,  width:  260 us [236;288]    (  65 S)
 [ 5] count:    1,  width:   48 us [48;48]      (  12 S)
 [ 6] count:    1,  width:  136 us [136;136]    (  34 S)
 [ 7] count:    1,  width:  108 us [108;108]    (  27 S)
 [ 8] count:   56,  width: 4164 us [4052;4756]  (1041 S)
 [ 9] count:   67,  width: 2096 us [2012;2496]  ( 524 S)
 [10] count:    5,  width: 9296 us [8968;10004] (2324 S)
 [11] count:    1,  width: 6672 us [6672;6672]  (1668 S)
 [12] count:    1,  width: 2760 us [2760;2760]  ( 690 S)
Level estimates [high, low]:  15974,     74
RSSI: -0.1 dB SNR: 23.3 dB Noise: -23.5 dB
Frequency offsets [F1, F2]:    4788,      0     (+18.3 kHz, +0.0 kHz)
Guessing modulation: No clue...

Googling I have found:
https://github.com/tofurky/kidde_cc1101 But looks like a different device from the same manufacturer.

Any suggestion for what to try next? Thanks!

loopy321 avatar Nov 19 '22 19:11 loopy321

All three signals look like Acurite weather sensors and not the typical alarm-thingie. You would need to capture a clean sample. Remove the antenna to limit reception and put the device near. Also use -s 1024k to widen the band, the smoke alarm might not be at exactly 433.92k.

But we already have a Kidde RF-SM ACDC sample here: https://github.com/merbanan/rtl_433_tests/tree/master/tests/KIDDE_RF-SM-ACDC it's the typcial pattern: lots of repeats with just ~24 bit fixed ID in them. This should work: rtl_433 -X 'n=name,m=OOK_PWM,s=400,l=800,r=2000'

zuckschwerdt avatar Nov 19 '22 19:11 zuckschwerdt

Thanks for the pointers! I managed to find the signal at 434.37MHz. Looks similar to the sample you already had in the tests folder - I didn't see that earlier. Doing rtl_433 -X 'n=name,m=OOK_PWM,s=400,l=800,r=2000' gives the repeating data:

ff90e0 [ID 8bit switch is 11110000] = 11111111 10010000 11100000
f9f0bc [value from rtl_433_test file] = 11111001 11110000 10111100

Not much there... My capture file: g001_434M_1024k.zip

loopy321 avatar Nov 19 '22 20:11 loopy321

Interesting about the switches. If you flip one at a time and compare we might get insight about the mapping. But really you just want to set any pattern, then capture the code and on reception recognize that. Or e.g. add ,match={22}ff90e0 to just receive your code.

zuckschwerdt avatar Nov 19 '22 22:11 zuckschwerdt

So the bit count seems a bit weird. Trying to figure out decoding because I think the message will change depending on whether test, alarm, battery, etc.

I get the following when doing rtl_433 -X 'n=kidde,m=OOK_PWM,s=400,l=800,r=2000' on the cap file (repeated ~every 50ms) [id setting on device]:

[11110000] {21}ff90e0 [from above]
[11111111] {18}f8420
[00000000] {25}fffc3f8
[10000000] {24}fff43f

kidde_RF-SM-DC_3dif-codes.zip

loopy321 avatar Nov 20 '22 15:11 loopy321

It isn't actually PWM, it's DMC. There is a sync, then the ID and finally more data bits, see this BitBench.

The OOK looks like this, note the (de-)sync in front. kidde-smoke

zuckschwerdt avatar Nov 20 '22 16:11 zuckschwerdt

btw. why did you record at 256k rate? The default of 250k would be much more common.

zuckschwerdt avatar Nov 20 '22 16:11 zuckschwerdt

Thanks! The 256k was power of 2… old habit from ADCs/fft and trying to get a better sample. If it makes a difference, I can resample.

On Sun, Nov 20, 2022 at 10:34 AM Christian W. Zuckschwerdt < @.***> wrote:

btw. why did you record at 256k rate? The default of 250k would be much more common.

— Reply to this email directly, view it on GitHub https://github.com/merbanan/rtl_433/issues/2240#issuecomment-1321176453, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAH2SKOZACN4UL3RRTREI43WJJHHRANCNFSM6AAAAAASFOPRC4 . You are receiving this because you authored the thread.Message ID: @.***>

loopy321 avatar Nov 20 '22 16:11 loopy321

Incidentally I just today added DMC decoding for flex (#2241). So this will work to get the decoded data: rtl_433 -R 0 -X 'n=name,m=OOK_PCM,s=400,l=400,g=1000,r=2000,decode_dm'

zuckschwerdt avatar Nov 20 '22 16:11 zuckschwerdt

Awesome! Thanks. I just pulled your DMC decoding and now get the following [device ID setting]:

[11110000] {4}1,{25}07bfc78
[11111111] {4}1,{25}7fbfbf8
[00000000] {4}1,{25}003fc00
[10000000] {4}1,{25}00bfc08

I guess there is an extra bit (25 vs. 24).

loopy321 avatar Nov 20 '22 17:11 loopy321

I guess there is an extra bit (25 vs. 24).

Ah, yes. Remove the first bit, then bytes line up nicely. Being DMC that first bit can have data in it, but I guess they choose to use it as start-bit only.

zuckschwerdt avatar Nov 20 '22 18:11 zuckschwerdt

I am just learning your amazing tools at triq.org, thanks for this! (did not realize I could zoom on the pulse train for the details!) Looking at the pulse, I see the output of the DMC decoder adds 4 bits at the end 1000: For example using the bitbench SYNC:4h ?b ID:8b ?8b ?7b ?4b: [11111111] 07fbfbf8 = SYNC:0 ?0 ID:11111111 ?01111111 ?0111111 ?1000 vs.: 2022-11-20 12_29_11-I_Q Spectrogram   Pulsedata

Similarly, [00000000] 0003fc00 = SYNC:0 ?0 ID:00000000 ?01111111 ?1000000 ?0000 vs. 2022-11-20 12_38_34-I_Q Spectrogram   Pulsedata

I can ignore them, but thought it should be consistent. Of course, it is very likely I am missing something, like the OOK settings (using rtl_433 -R 0 -X 'n=name,m=OOK_PCM,s=400,l=400,g=1000,r=2000,decode_dm').

loopy321 avatar Nov 20 '22 19:11 loopy321

That's a representation problem when using nibbles (for every four bits), i.e. the length will always be a multiple of 4 (or 8 even when printing full bytes). For BitBench a 07fbfbf8 is seen as {32}07fbfbf8 to clearly exclude the phantom bits at the end use {29}07fbfbf8

zuckschwerdt avatar Nov 20 '22 19:11 zuckschwerdt

Just curious if there has been any more success on this? I just got the RF-SM-AC and a couple RF-SM-DC units to expand coverage in our finished basement where we had a (thankfully false-alarm) non-interlinked one fail (and couldn't hear it upstairs in bedrooms)

I see Kidde claims its 434.3 MHz, and I know there's somehow "coded" the 8-bit "channel/system ID" so it won't go off when adjacent houses have the same alarms. https://www.kidde.com/home-safety/en/us/support/help-center/browse-articles/articles/how_wireless_smoke_alarms_work.html

My guess is 434.3 is near enough to 433.92 that one SDR could "hear" both...and I would be slightly curious to see this working so that I could pull the data into Home Assistant.

I didn't successfully get a capture of the first two I installed but when the 3rd arrives I will give it another try...but I don't want to torture the dogs TOO much with the house beeping and screaming at them. EDIT: Still no success capturing a signal with the last one I installed and tested...but open to ideas for tips maybe another day I could give another try if needed.

mmiller7 avatar Jun 07 '23 21:06 mmiller7

./rtl_433 -R 0 -X 'n=name,m=OOK_PCM,s=400,l=400,g=1000,r=2000,decode_dm' -f 434300000

I successfully got a capture of my real alarms: smokes_cap_code_00111011.txt

Also captured some working (replay sets off alarms on set channel) RF samples with a Flipper Zero if that helps with the reverse-engineering of the signal allowing others to generate a known-working alarm signal in the most obvious (to me) patterns: https://github.com/mmiller7/flipper/tree/main/subghz/Kidde%20RM-SM-DC%20Smoke%20Alarm

Code 00000000: smokes_cap_00000000.txt

Code 00001111: smokes_cap_00001111.txt

Code 11111111: smokes_cap_11111111.txt

I'm guessing the 'data' field that repeats the most frequently may be the actual correct payload for each?

Using this command to "weed" some of the invalid looking one-character and only-happened-infrequently data payloads grep data filename.txt | egrep -v ': [0-9a-z](, )?$' | sort | uniq -c | egrep -v '^[ ]+[0-9] data'

00000000:

    352 data      : 003fc00   <-- I think this is the real data payload?
     14 data      : 007f80
     13 data      : 02
     14 data      : fc00

00001111:

     12 data      : 07f70
     23 data      : 0fee0
    423 data      : 783fb80   <-- I think this is the real data payload?
     12 data      : c1fdc0
     25 data      : f07f70
     15 data      : fb80

11111111:

    340 data      : 7fbfbf8   <-- I think this is the real data payload?
     11 data      : bf8
     20 data      : dfdfc
     19 data      : fbf8
     11 data      : fefe
     14 data      : ff7f7f

00111011:

    213 data      : 6e3fae0   <-- I think this is the real data payload?
     90 data      : 88, 

mmiller7 avatar Jun 11 '23 14:06 mmiller7

@loopy321 @mmiller7 Where are we on this? Does it work better with current git master? What has to happen to close the issue as solved? Do one of you want to make a PR?

gdt avatar Sep 29 '23 00:09 gdt

@loopy321 @mmiller7 Where are we on this? Does it work better with current git master? What has to happen to close the issue as solved? Do one of you want to make a PR?

Not quite ready for a PR. Will try to take another look this weekend.

loopy321 avatar Sep 29 '23 01:09 loopy321

I don't currently understand enough of how this works to write a fix myself, but I could run a test build to test one.

mmiller7 avatar Oct 22 '23 19:10 mmiller7