Bugfixes
[rtl-433.git] / src / devices / blyss.c
1 /* blyss DC5-UK-WH as sold by B&Q
2  * 
3  * DC5-UK-WH pair with receivers, the codes used may be specific to a receiver - use with caution
4  * 
5  * Copyright (C) 2016 John Jore
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  */
11
12 #include "rtl_433.h"
13 #include "util.h"
14
15 static int blyss_dc5_uk_wh(bitbuffer_t *bitbuffer)
16 {
17         bitrow_t *bb = bitbuffer->bb;
18
19         for (int i = 0; i < bitbuffer->num_rows; i++)
20         {
21                 //This needs additional validation, but works on mine. Suspect each DC5-UK-WH uses different codes as the transmitter
22                 //is paired to the receivers to avoid being triggerd by the neighbours transmitter ?!?
23                 if (((bb[i][0] == 0xce) && (bb[i][1] == 0x8e) && (bb[i][2] == 0x2a) && (bb[i][3] == 0x6c) && (bb[i][4] == 0x80)) || 
24                         ((bb[i][0] == 0xe7) && (bb[i][1] == 0x37) && (bb[i][2] == 0x7a) && (bb[i][3] == 0x2c) && (bb[i][4] == 0x80)))
25                 {
26                         if (debug_output) {
27                                 fprintf(stdout, "blyss DC5-UK-WH ringing\n");
28                                 bitbuffer_print(bitbuffer);
29                         }
30
31                         data_t *data;
32                         char time_str[LOCAL_TIME_BUFLEN];
33                         local_time_str(0, time_str);
34
35                         data = data_make("time", "", DATA_STRING, time_str,
36                                 "type", "", DATA_STRING, "doorbell",
37                                 "make", "", DATA_STRING, "blyss",
38                                 "model", "", DATA_STRING, "dc5-uk-wh",
39                                 "mode", "", DATA_STRING, "ringing",
40                                 NULL);
41                         data_acquired_handler(data);
42
43                         return 1;
44                 }
45         }
46
47         //This was not a blyss device after all
48         return 0;
49 }
50
51 static char *output_fields[] = {
52         "time",
53         "type",
54         "make",
55         "model",
56         "mode",
57         NULL
58 };
59
60 static int blyss_callback(bitbuffer_t *bitbuffer) {
61         // Validate its a 'blyss' we understand
62         int rows = bitbuffer->num_rows;
63
64         for (int i = 0; i < rows; i++) {
65                 unsigned bits = bitbuffer->bits_per_row[i];
66
67                 //blyss DC5-UK-WH
68                 if (bits == 33) { //33 bits in a "proper" message. Last row is 32
69                         //We have found:
70                         int result = blyss_dc5_uk_wh(bitbuffer);
71
72                         return result; // done
73                 }
74         }
75
76         //If we got this far, its not a blyss device we know of
77         return 0;
78 }
79
80
81 r_device blyss = {
82         .name           = "blyss DC5-UK-WH (433.92 MHz)",
83         .modulation     = OOK_PULSE_PWM_RAW,
84         .short_limit    = 1010,
85         .long_limit     = 4000,
86         .reset_limit    = 10000,        
87         .json_callback  = &blyss_callback,
88         .disabled       = 0,
89         .demod_arg      = 0,
90 };