Add support for ECODHOME smart socket (#1544)
This commit is contained in:
parent
c4d9e95e3e
commit
cdad2eb269
8 changed files with 212 additions and 0 deletions
|
@ -248,6 +248,7 @@ See [CONTRIBUTING.md](./docs/CONTRIBUTING.md).
|
||||||
[171] LaCrosse Technology View LTV-TH Thermo/Hygro Sensor
|
[171] LaCrosse Technology View LTV-TH Thermo/Hygro Sensor
|
||||||
[172] Bresser Weather Center 6-in-1
|
[172] Bresser Weather Center 6-in-1
|
||||||
[173] Bresser Weather Center 7-in-1
|
[173] Bresser Weather Center 7-in-1
|
||||||
|
[174] EcoDHOME Smart Socket and MCEE Solar monitor
|
||||||
|
|
||||||
* Disabled by default, use -R n or -G
|
* Disabled by default, use -R n or -G
|
||||||
|
|
||||||
|
|
|
@ -355,6 +355,7 @@ stop_after_successful_events false
|
||||||
protocol 171 # LaCrosse Technology View LTV-TH Thermo/Hygro Sensor
|
protocol 171 # LaCrosse Technology View LTV-TH Thermo/Hygro Sensor
|
||||||
protocol 172 # Bresser Weather Center 6-in-1
|
protocol 172 # Bresser Weather Center 6-in-1
|
||||||
protocol 173 # Bresser Weather Center 7-in-1
|
protocol 173 # Bresser Weather Center 7-in-1
|
||||||
|
protocol 174 # EcoDHOME Smart Socket and MCEE Solar monitor
|
||||||
|
|
||||||
## Flex devices (command line option "-X")
|
## Flex devices (command line option "-X")
|
||||||
|
|
||||||
|
|
|
@ -181,6 +181,7 @@
|
||||||
DECL(lacrosse_th3) \
|
DECL(lacrosse_th3) \
|
||||||
DECL(bresser_6in1) \
|
DECL(bresser_6in1) \
|
||||||
DECL(bresser_7in1) \
|
DECL(bresser_7in1) \
|
||||||
|
DECL(ecodhome) \
|
||||||
/* Add new decoders here. */
|
/* Add new decoders here. */
|
||||||
|
|
||||||
#define DECL(name) extern r_device name;
|
#define DECL(name) extern r_device name;
|
||||||
|
|
|
@ -59,6 +59,7 @@ add_library(r_433 STATIC
|
||||||
devices/directv.c
|
devices/directv.c
|
||||||
devices/dish_remote_6_3.c
|
devices/dish_remote_6_3.c
|
||||||
devices/dsc.c
|
devices/dsc.c
|
||||||
|
devices/ecodhome.c
|
||||||
devices/ecowitt.c
|
devices/ecowitt.c
|
||||||
devices/efergy_e2_classic.c
|
devices/efergy_e2_classic.c
|
||||||
devices/efergy_optical.c
|
devices/efergy_optical.c
|
||||||
|
|
|
@ -58,6 +58,7 @@ rtl_433_SOURCES = abuf.c \
|
||||||
devices/directv.c \
|
devices/directv.c \
|
||||||
devices/dish_remote_6_3.c \
|
devices/dish_remote_6_3.c \
|
||||||
devices/dsc.c \
|
devices/dsc.c \
|
||||||
|
devices/ecodhome.c \
|
||||||
devices/ecowitt.c \
|
devices/ecowitt.c \
|
||||||
devices/efergy_e2_classic.c \
|
devices/efergy_e2_classic.c \
|
||||||
devices/efergy_optical.c \
|
devices/efergy_optical.c \
|
||||||
|
|
203
src/devices/ecodhome.c
Normal file
203
src/devices/ecodhome.c
Normal file
|
@ -0,0 +1,203 @@
|
||||||
|
/** @file
|
||||||
|
Decoder for EcoDHOME Smart Socket and MCEE Solar monitor.
|
||||||
|
|
||||||
|
Copyright (C) 2020 Christian W. Zuckschwerdt <zany@triq.net>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "decoder.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
Decoder for EcoDHOME Smart Socket and MCEE Solar monitor.
|
||||||
|
|
||||||
|
(the Smart Switch should be the same as the Smart Socket.)
|
||||||
|
|
||||||
|
Smart Socket receives and implements the switching on/off instruction remotely from the Controller.
|
||||||
|
The Transmitters with sensor clamps collect home energy consumption data for the MCEE Solar monitor.
|
||||||
|
|
||||||
|
see https://github.com/merbanan/rtl_433/issues/1525
|
||||||
|
|
||||||
|
The transmission is FSK PCM with 250 us bit width.
|
||||||
|
|
||||||
|
## PV Transmitter (P/N 01333-5847-00)
|
||||||
|
|
||||||
|
Example data:
|
||||||
|
|
||||||
|
{144}aaaaaa 2dd4 8c74 d4b9 3eb3 223844 51 550000
|
||||||
|
{144}aaaaaa 2dd4 8c74 d4b9 3eb3 c53344 ef 550000
|
||||||
|
{144}aaaaaa 2dd4 8c76 d4b9 71b3 863363 04 550000 (every 71 seconds)
|
||||||
|
|
||||||
|
Other device:
|
||||||
|
|
||||||
|
{144}aaaaaa 2dd4 8c74 12d6 Type: 3eb3 bc3544
|
||||||
|
{144}aaaaaa 2dd4 8c76 12d6 Type: 71b3 333363 (also 863363)
|
||||||
|
|
||||||
|
- 3eb3 messages are a power reading of LL HH 0x44, LL and HH start at 0x33 (=0) and wrap up to 0x32 (=255)
|
||||||
|
- 71b3 messages (arrive every 71 seconds)
|
||||||
|
- 71b3 863363 04 550000 which might be some kind of status then and not a reading.
|
||||||
|
|
||||||
|
The checksum is: add all bytes after the sync word plus 0x35 (mod 0xff).
|
||||||
|
|
||||||
|
## Smart Socket (P/N 01333-5840-00)
|
||||||
|
|
||||||
|
Example data:
|
||||||
|
|
||||||
|
{155}2ad455555516ea2918ae353b802b2d3f8029a12
|
||||||
|
{154}55a8 aaaaaa 2dd4 5231 5c6a 7700 565a 7f00 53 42 4
|
||||||
|
|
||||||
|
Data Seen:
|
||||||
|
|
||||||
|
52315c6a 7700 565a 007f00
|
||||||
|
52315c6a 7700 565a 007e00
|
||||||
|
52315c6a 7700 565a 007d00
|
||||||
|
46315c6a 7700 414b 000000
|
||||||
|
52315c6a 7700 565a 008000
|
||||||
|
46315c6a 7700 5053 000000
|
||||||
|
52315c6a 7700 414b 000000
|
||||||
|
52315c6a 7700 565a 008100
|
||||||
|
52315c6a 7700 565a 008200
|
||||||
|
52315c6a 7700 565a 008300
|
||||||
|
52315c6a 7700 414b 003209
|
||||||
|
52315c6a 7700 414b 003d03
|
||||||
|
52315c6a 7700 565a 007c00
|
||||||
|
52315c6a 7700 565a 007b00
|
||||||
|
52315c6a 7700 565a 007a00
|
||||||
|
|
||||||
|
Removing the first 1 or 2 bits gives a prefix of 55a8aaaaaa2dd4, the leading bits are likely warmup or garbage.
|
||||||
|
|
||||||
|
The next bytes of 5231 5c6a 7700 are likely a serial number (id).
|
||||||
|
|
||||||
|
Then we have messages with 414b or 565a or 5053 which likely is a message type.
|
||||||
|
On 414b the two byte (little endian) power value follows. For the other types it is unknonwn, maybe kWh or state.
|
||||||
|
Lastly there is a fixed 53 (status? stop?) and a checksum byte.
|
||||||
|
|
||||||
|
Interesting to note that 414b, 565a, and 53 are "AK", "VZ", and "S" which might not be a coincidence.
|
||||||
|
|
||||||
|
The checksum is: add all bytes after the sync word (mod 0xff).
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int ecodhome_decode(r_device *decoder, bitbuffer_t *bitbuffer)
|
||||||
|
{
|
||||||
|
uint8_t const preamble_pattern[] = {0xaa, 0xaa, 0x2d, 0xd4};
|
||||||
|
|
||||||
|
data_t *data;
|
||||||
|
uint8_t msg[13];
|
||||||
|
|
||||||
|
if (bitbuffer->num_rows != 1 || bitbuffer->bits_per_row[0] < 128) {
|
||||||
|
if (decoder->verbose > 1)
|
||||||
|
fprintf(stderr, "%s: to few bits (%u)\n", __func__, bitbuffer->bits_per_row[0]);
|
||||||
|
return DECODE_ABORT_LENGTH; // unrecognized
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned start_pos = bitbuffer_search(bitbuffer, 0, 0,
|
||||||
|
preamble_pattern, sizeof(preamble_pattern) * 8);
|
||||||
|
start_pos += sizeof(preamble_pattern) * 8;
|
||||||
|
|
||||||
|
if (start_pos >= bitbuffer->bits_per_row[0]) {
|
||||||
|
if (decoder->verbose > 1)
|
||||||
|
fprintf(stderr, "%s: preamble not found\n", __func__);
|
||||||
|
return DECODE_ABORT_EARLY; // no preamble found
|
||||||
|
}
|
||||||
|
//if (start_pos + sizeof (msg) * 8 >= bitbuffer->bits_per_row[0]) {
|
||||||
|
if (start_pos + 12 * 8 >= bitbuffer->bits_per_row[0]) {
|
||||||
|
if (decoder->verbose > 1)
|
||||||
|
fprintf(stderr, "%s: message too short (%u)\n", __func__, bitbuffer->bits_per_row[0] - start_pos);
|
||||||
|
return DECODE_ABORT_LENGTH; // message too short
|
||||||
|
}
|
||||||
|
|
||||||
|
bitbuffer_extract_bytes(bitbuffer, 0, start_pos, msg, sizeof(msg) * 8);
|
||||||
|
if (decoder->verbose > 1) {
|
||||||
|
bitrow_printf(msg, sizeof(msg) * 8, "%s: MSG: ", __func__);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t id = ((uint32_t)msg[0] << 24) | (msg[1] << 16) | (msg[2] << 8) | (msg[3]);
|
||||||
|
int m_type = (msg[4] << 8) | (msg[5]);
|
||||||
|
int m_subtype = (msg[6] << 8) | (msg[7]); // only Smart Socket
|
||||||
|
|
||||||
|
if (m_type == 0x7700) {
|
||||||
|
int sum = add_bytes(msg, 11); // socket
|
||||||
|
if ((sum & 0xff) != msg[11]) {
|
||||||
|
if (decoder->verbose > 1)
|
||||||
|
fprintf(stderr, "%s: checksum fail %02x vs %02x\n", __func__, sum, msg[9]);
|
||||||
|
return DECODE_FAIL_MIC;
|
||||||
|
}
|
||||||
|
if (msg[10] != 0x53) {
|
||||||
|
if (decoder->verbose > 1)
|
||||||
|
fprintf(stderr, "%s: wrong stop byte %02x\n", __func__, msg[10]);
|
||||||
|
return DECODE_FAIL_SANITY;
|
||||||
|
}
|
||||||
|
int raw = (msg[8] << 8) | (msg[9]);
|
||||||
|
int power_w = (msg[9] << 8) | (msg[8]);
|
||||||
|
|
||||||
|
/* clang-format off */
|
||||||
|
data = data_make(
|
||||||
|
"model", "", DATA_STRING, "EcoDHOME-SmartSocket",
|
||||||
|
"id", "", DATA_FORMAT, "%08x", DATA_INT, id,
|
||||||
|
"message_type", "Message Type", DATA_FORMAT, "%04x", DATA_INT, m_type,
|
||||||
|
"message_subtype", "Message Subtype", DATA_FORMAT, "%04x", DATA_INT, m_subtype,
|
||||||
|
"power_W", "Power", DATA_COND, m_subtype == 0x414b, DATA_FORMAT, "%.1f W", DATA_DOUBLE, (double)power_w,
|
||||||
|
"raw", "Raw data", DATA_FORMAT, "%06x", DATA_INT, raw,
|
||||||
|
"mic", "Integrity", DATA_STRING, "CHECKSUM",
|
||||||
|
NULL);
|
||||||
|
/* clang-format on */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int sum = add_bytes(msg, 9) + 0x35; // transmitter
|
||||||
|
if ((sum & 0xff) != msg[9]) {
|
||||||
|
if (decoder->verbose > 1)
|
||||||
|
fprintf(stderr, "%s: checksum fail %02x vs %02x\n", __func__, sum, msg[9]);
|
||||||
|
return DECODE_FAIL_MIC;
|
||||||
|
}
|
||||||
|
if (msg[10] != 0x55) {
|
||||||
|
if (decoder->verbose > 1)
|
||||||
|
fprintf(stderr, "%s: wrong stop byte %02x\n", __func__, msg[10]);
|
||||||
|
return DECODE_FAIL_SANITY;
|
||||||
|
}
|
||||||
|
if (msg[11] != 0x00) {
|
||||||
|
if (decoder->verbose > 1)
|
||||||
|
fprintf(stderr, "%s: wrong poststop byte %02x\n", __func__, msg[11]);
|
||||||
|
return DECODE_FAIL_SANITY;
|
||||||
|
}
|
||||||
|
int raw = (msg[6] << 16) | (msg[7] << 8) | (msg[8]);
|
||||||
|
int power_w = ((uint8_t)(msg[7] - 0x33) << 8) | (uint8_t)(msg[6] - 0x33);
|
||||||
|
|
||||||
|
/* clang-format off */
|
||||||
|
data = data_make(
|
||||||
|
"model", "", DATA_STRING, "EcoDHOME-Transmitter",
|
||||||
|
"id", "", DATA_FORMAT, "%08x", DATA_INT, id,
|
||||||
|
"message_type", "Message Type", DATA_FORMAT, "%04x", DATA_INT, m_type,
|
||||||
|
"power_W", "Power", DATA_COND, m_type == 0x3eb3, DATA_FORMAT, "%.1f W", DATA_DOUBLE, (double)power_w,
|
||||||
|
"raw", "Raw data", DATA_FORMAT, "%06x", DATA_INT, raw,
|
||||||
|
"mic", "Integrity", DATA_STRING, "CHECKSUM",
|
||||||
|
NULL);
|
||||||
|
/* clang-format on */
|
||||||
|
}
|
||||||
|
|
||||||
|
decoder_output_data(decoder, data);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *output_fields[] = {
|
||||||
|
"model",
|
||||||
|
"id",
|
||||||
|
"message_type",
|
||||||
|
"message_subtype",
|
||||||
|
"power_W",
|
||||||
|
"raw",
|
||||||
|
"mic",
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
r_device ecodhome = {
|
||||||
|
.name = "EcoDHOME Smart Socket and MCEE Solar monitor",
|
||||||
|
.modulation = FSK_PULSE_PCM,
|
||||||
|
.short_width = 250,
|
||||||
|
.long_width = 250,
|
||||||
|
.reset_limit = 6000,
|
||||||
|
.decode_fn = &ecodhome_decode,
|
||||||
|
.fields = output_fields,
|
||||||
|
};
|
|
@ -184,6 +184,7 @@ COPY ..\..\libusb\MS64\dll\libusb*.dll $(TargetDir)</Command>
|
||||||
<ClCompile Include="..\src\devices\directv.c" />
|
<ClCompile Include="..\src\devices\directv.c" />
|
||||||
<ClCompile Include="..\src\devices\dish_remote_6_3.c" />
|
<ClCompile Include="..\src\devices\dish_remote_6_3.c" />
|
||||||
<ClCompile Include="..\src\devices\dsc.c" />
|
<ClCompile Include="..\src\devices\dsc.c" />
|
||||||
|
<ClCompile Include="..\src\devices\ecodhome.c" />
|
||||||
<ClCompile Include="..\src\devices\ecowitt.c" />
|
<ClCompile Include="..\src\devices\ecowitt.c" />
|
||||||
<ClCompile Include="..\src\devices\efergy_e2_classic.c" />
|
<ClCompile Include="..\src\devices\efergy_e2_classic.c" />
|
||||||
<ClCompile Include="..\src\devices\efergy_optical.c" />
|
<ClCompile Include="..\src\devices\efergy_optical.c" />
|
||||||
|
|
|
@ -283,6 +283,9 @@
|
||||||
<ClCompile Include="..\src\devices\dsc.c">
|
<ClCompile Include="..\src\devices\dsc.c">
|
||||||
<Filter>Source Files\devices</Filter>
|
<Filter>Source Files\devices</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\src\devices\ecodhome.c">
|
||||||
|
<Filter>Source Files\devices</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\src\devices\ecowitt.c">
|
<ClCompile Include="..\src\devices\ecowitt.c">
|
||||||
<Filter>Source Files\devices</Filter>
|
<Filter>Source Files\devices</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue