Skip to content

Commit e5682e3

Browse files
committed
feat(subghz): add Honeywell 5834-4 keyfob protocol (#4339)
- Add Honeywell 5834-4 decoder and encoder (345 MHz, 48-bit frame, AM650, pulse-width encoding; Arm Away, Stay, Disarm, Panic) - Register protocol and add Set Type preset Honeywell5834_345 - Add unit tests and test assets (honeywell_5834.sub, Manifest_test) - Size encoder upload buffer for 48-bit frame only (H5834_UPLOAD_MAX) to save ~116 bytes RAM per encoder instance on device
1 parent c9ab2b6 commit e5682e3

File tree

9 files changed

+569
-51
lines changed

9 files changed

+569
-51
lines changed

applications/debug/unit_tests/resources/unit_tests/Manifest_test

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ F:54ceacb8c156f9534fc7ee0a0911f4da:11380:subghz/holtek_ht12x_raw.sub
4040
F:4a9567c1543cf3e7bb5350b635d9076f:31238:subghz/holtek_raw.sub
4141
F:ca86c0d78364d704ff62b0698093d396:162:subghz/honeywell_wdb.sub
4242
F:f606548c935adc8d8bc804326ef67543:38415:subghz/honeywell_wdb_raw.sub
43+
F:14edaac76a69457b795c5c391cf581b1:12281:subghz/honeywell_5834_arm_away.sub
44+
F:a958447531d0ea1a1f6ee3ccb3501842:10041:subghz/honeywell_5834_disarm.sub
45+
F:d8f736cc1c020e9c062bb8ced371dcba:10239:subghz/honeywell_5834_panic.sub
46+
F:f406deee6ecb957cb40a8edcad58f842:13442:subghz/honeywell_5834_stay.sub
4347
F:20bba4b0aec006ced7e82513f9459e31:15532:subghz/hormann_hsm_raw.sub
4448
F:3392f2db6aa7777e937db619b86203bb:10637:subghz/ido_117_111_raw.sub
4549
F:cc5c7968527cc233ef11a08986e31bf2:167:subghz/intertechno_v3.sub
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Filetype: Flipper SubGhz Key File
2+
Version: 1
3+
Frequency: 345000000
4+
Preset: FuriHalSubGhzPresetOok650Async
5+
Protocol: Honeywell5834
6+
Bit: 48
7+
Key: 00 00 AB CD E0 00 04 00

applications/debug/unit_tests/tests/subghz/subghz_test.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,14 @@ MU_TEST(subghz_decoder_honeywell_wdb_test) {
585585
"Test decoder " SUBGHZ_PROTOCOL_HONEYWELL_WDB_NAME " error\r\n");
586586
}
587587

588+
MU_TEST(subghz_decoder_honeywell_5834_test) {
589+
mu_assert(
590+
subghz_decoder_test(
591+
EXT_PATH("unit_tests/subghz/honeywell_5834_raw.sub"),
592+
SUBGHZ_PROTOCOL_HONEYWELL_5834_NAME),
593+
"Test decoder " SUBGHZ_PROTOCOL_HONEYWELL_5834_NAME " error\r\n");
594+
}
595+
588596
MU_TEST(subghz_decoder_magellan_test) {
589597
mu_assert(
590598
subghz_decoder_test(
@@ -837,6 +845,12 @@ MU_TEST(subghz_encoder_honeywell_wdb_test) {
837845
"Test encoder " SUBGHZ_PROTOCOL_HONEYWELL_WDB_NAME " error\r\n");
838846
}
839847

848+
MU_TEST(subghz_encoder_honeywell_5834_test) {
849+
mu_assert(
850+
subghz_encoder_test(EXT_PATH("unit_tests/subghz/honeywell_5834.sub")),
851+
"Test encoder " SUBGHZ_PROTOCOL_HONEYWELL_5834_NAME " error\r\n");
852+
}
853+
840854
MU_TEST(subghz_encoder_magellan_test) {
841855
mu_assert(
842856
subghz_encoder_test(EXT_PATH("unit_tests/subghz/magellan.sub")),
@@ -973,6 +987,7 @@ MU_TEST_SUITE(subghz) {
973987
MU_RUN_TEST(subghz_decoder_doitrand_test);
974988
MU_RUN_TEST(subghz_decoder_phoenix_v2_test);
975989
MU_RUN_TEST(subghz_decoder_honeywell_wdb_test);
990+
MU_RUN_TEST(subghz_decoder_honeywell_5834_test);
976991
MU_RUN_TEST(subghz_decoder_magellan_test);
977992
MU_RUN_TEST(subghz_decoder_intertechno_v3_test);
978993
MU_RUN_TEST(subghz_decoder_clemsa_test);
@@ -1012,6 +1027,7 @@ MU_TEST_SUITE(subghz) {
10121027
MU_RUN_TEST(subghz_encoder_doitrand_test);
10131028
MU_RUN_TEST(subghz_encoder_phoenix_v2_test);
10141029
MU_RUN_TEST(subghz_encoder_honeywell_wdb_test);
1030+
MU_RUN_TEST(subghz_encoder_honeywell_5834_test);
10151031
MU_RUN_TEST(subghz_encoder_magellan_test);
10161032
MU_RUN_TEST(subghz_encoder_intertechno_v3_test);
10171033
MU_RUN_TEST(subghz_encoder_clemsa_test);

applications/main/subghz/helpers/subghz_custom_event.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ typedef enum {
2222
SubmenuIndexSecPlus_v2_310_00,
2323
SubmenuIndexSecPlus_v2_315_00,
2424
SubmenuIndexSecPlus_v2_390_00,
25+
SubmenuIndexHoneywell5834_345,
2526

2627
//SubGhzCustomEvent
2728
SubGhzCustomEventSceneDeleteSuccess = 100,

applications/main/subghz/scenes/subghz_scene_set_type.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@ void subghz_scene_set_type_on_enter(void* context) {
109109
SubmenuIndexSecPlus_v2_390_00,
110110
subghz_scene_set_type_submenu_callback,
111111
subghz);
112+
submenu_add_item(
113+
subghz->submenu,
114+
"Honeywell5834_345",
115+
SubmenuIndexHoneywell5834_345,
116+
subghz_scene_set_type_submenu_callback,
117+
subghz);
112118

113119
submenu_set_selected_item(
114120
subghz->submenu, scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneSetType));
@@ -212,6 +218,16 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) {
212218
generated_protocol = subghz_txrx_gen_secplus_v2_protocol(
213219
subghz->txrx, "AM650", 390000000, key, 0x68, 0xE500000);
214220
break;
221+
case SubmenuIndexHoneywell5834_345: {
222+
/* 20-bit random serial in bits [47:28], default Arm Away state */
223+
uint64_t serial_20 = (uint64_t)(key & 0xFFFFF) << 28;
224+
uint64_t state_bits = (uint64_t)0x40 << 4; /* Arm Away in state byte */
225+
uint64_t frame = serial_20 | state_bits;
226+
/* Set parity: bit 0 = popcount parity of bits [47:1] */
227+
frame |= subghz_protocol_blocks_get_parity(frame >> 1, 47);
228+
generated_protocol = subghz_txrx_gen_data_protocol(
229+
subghz->txrx, "AM650", 345000000, SUBGHZ_PROTOCOL_HONEYWELL_5834_NAME, frame, 48);
230+
} break;
215231
default:
216232
return false;
217233
break;

0 commit comments

Comments
 (0)