Bugfixes
[rtl-433.git] / src / devices / kedsum.c
1 #include "rtl_433.h"
2 #include "data.h"
3 #include "util.h"
4
5 /* Kedsum temperature and humidity sensor (http://amzn.to/25IXeng)
6    My models transmit at a bit lower freq. Around ~433.71 Mhz
7
8    Copyright (C) 2016 John Lifsey
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License version 3 as
11    published by the Free Software Foundation.
12
13    Largely based on prologue, esperanza_ews, s3318p
14    Frame appears to be a differently-endianed version of the esperanza
15
16    Frame structure:
17    IIIIIIII????CC++++ttttTTTThhhhHHHH?????? PP
18
19    IIIIIIII unique id. changes on powercycle
20    CC channel, 00 = ch1, 10=ch3
21    ++++ low temp nibble
22    tttt med temp nibble
23    TTTT high temp nibble
24    hhhh humidity low nibble
25    HHHH humidity high nibble
26 */
27
28
29 static int kedsum_callback(bitbuffer_t *bitbuffer) {
30     bitrow_t *bb = bitbuffer->bb;
31     data_t *data;
32
33     char time_str[LOCAL_TIME_BUFLEN];
34     local_time_str(0, time_str);
35
36     int r = bitbuffer_find_repeated_row(bitbuffer, 6, 42);
37     if (r<0 || bitbuffer->bits_per_row[r] != 42 || bitbuffer->num_rows != 14)
38         return 0;
39
40     uint8_t *b = bb[r];
41
42     uint8_t humidity;
43     uint8_t channel;
44     uint16_t temperature_with_offset;
45     float temperature_f;
46
47     channel  = (uint8_t)(((b[1] & 0x0C) >> 2) + 1);
48     humidity = (uint8_t)((b[3] & 0x03) << 6) | ((b[4] & 0xC0) >> 2) | ((b[3] & 0x3C) >> 2);
49
50     uint8_t tnH, tnM, tnL;
51     tnL = ((b[1] & 0x03) << 2) | ((b[2] & 0xC0) >> 6); // Low temp nibble
52     tnM = ((b[2] & 0x3C) >> 2);                        // Med temp nibble
53     tnH = ((b[2] & 0x03) << 2) | ((b[3] & 0xC0) >> 6); // high temp nibble
54
55     temperature_with_offset =  (tnH<<8) | (tnM<<4) | tnL;
56     temperature_f = (temperature_with_offset - 900) / 10.0;
57
58     if (debug_output) {
59       fprintf(stdout, "Bitstream HEX        = %02x %02x %02x %02x %02x %02x\n",b[0],b[1],b[2],b[3],b[4],b[5]);
60       fprintf(stdout, "Humidity HEX         = %02x\n", b[3]);
61       fprintf(stdout, "Humidity DEC         = %u\n",   humidity);
62       fprintf(stdout, "Channel HEX          = %02x\n", b[1]);
63       fprintf(stdout, "Channel              = %u\n",   channel);
64       fprintf(stdout, "temp_with_offset HEX = %02x\n", temperature_with_offset);
65       fprintf(stdout, "temp_with_offset     = %d\n",   temperature_with_offset);
66       fprintf(stdout, "TemperatureF         = %.1f\n", temperature_f);
67     }
68
69     data = data_make("time",          "",            DATA_STRING, time_str,
70                      "model",         "",            DATA_STRING, "Kedsum Temperature & Humidity Sensor",
71                      "channel",       "Channel",     DATA_INT, channel,
72                      "temperature_F", "Temperature", DATA_FORMAT, "%.02f F", DATA_DOUBLE, temperature_f,
73                      "humidity",      "Humidity",    DATA_FORMAT, "%u %%", DATA_INT, humidity,
74                       NULL);
75
76     data_acquired_handler(data);
77     return 1;
78 }
79
80 static char *output_fields[] = {
81     "time",
82     "model",
83     "channel",
84     "temperature_F",
85     "humidity",
86     NULL
87 };
88
89 r_device kedsum = {
90     .name           = "Kedsum Temperature & Humidity Sensor",
91     .modulation     = OOK_PULSE_PPM_RAW,
92     .short_limit    = 2800,
93     .long_limit     = 4400,
94     .reset_limit    = 8000,
95     .json_callback  = &kedsum_callback,
96     .disabled       = 0,
97     .demod_arg      = 0,
98     .fields         = output_fields
99 };