9#ifdef MYCILA_LOGGER_SUPPORT
10 #include <MycilaLogger.h>
11extern Mycila::Logger logger;
12 #define LOGD(tag, format, ...) logger.debug(tag, format, ##__VA_ARGS__)
13 #define LOGI(tag, format, ...) logger.info(tag, format, ##__VA_ARGS__)
14 #define LOGW(tag, format, ...) logger.warn(tag, format, ##__VA_ARGS__)
15 #define LOGE(tag, format, ...) logger.error(tag, format, ##__VA_ARGS__)
17 #define LOGD(tag, format, ...) ESP_LOGD(tag, format, ##__VA_ARGS__)
18 #define LOGI(tag, format, ...) ESP_LOGI(tag, format, ##__VA_ARGS__)
19 #define LOGW(tag, format, ...) ESP_LOGW(tag, format, ##__VA_ARGS__)
20 #define LOGE(tag, format, ...) ESP_LOGE(tag, format, ##__VA_ARGS__)
23#ifndef GPIO_IS_VALID_OUTPUT_GPIO
24 #define GPIO_IS_VALID_OUTPUT_GPIO(gpio_num) ((gpio_num >= 0) && \
25 (((1ULL << (gpio_num)) & SOC_GPIO_VALID_OUTPUT_GPIO_MASK) != 0))
28#ifndef GPIO_IS_VALID_GPIO
29 #define GPIO_IS_VALID_GPIO(gpio_num) ((gpio_num >= 0) && \
30 (((1ULL << (gpio_num)) & SOC_GPIO_VALID_GPIO_MASK) != 0))
33#define LOBYTE(x) ((uint8_t)((x) & 0xFF))
34#define HIBYTE(x) ((uint8_t)((x) >> 8))
37#define JSY_LOCK_TIMEOUT 2000
44#define JSY_REGISTER_MODEL1 0x0000
45#define JSY_REGISTER_MODEL2 0x0001
46#define JSY_REGISTER_VOLTAGE_RANGE 0x0002
47#define JSY_REGISTER_CURRENT_RANGE 0x0003
50#define JSY_REGISTER_ID_AND_BAUDS 0x0004
51#define JSY_REGISTER_SWITCH_MODE 0x0005
52#define JSY_MODE_AC 0x01
53#define JSY_MODE_DC 0x02
59#define JSY_1031_REGISTER_VOLTAGE 0x0048
60#define JSY_1031_REGISTER_CURRENT 0x0049
61#define JSY_1031_REGISTER_ACTIVE_POWER 0x004B
62#define JSY_1031_REGISTER_ACTIVE_ENERGY 0x004D
63#define JSY_1031_REGISTER_POWER_FACTOR 0x004F
64#define JSY_1031_REGISTER_FREQUENCY 0x0050
65#define JSY_1031_REGISTER_CO2 0x0051
66#define JSY_1031_REGISTER_RESERVED 0x0053
67#define JSY_1031_REGISTER_APPARENT_POWER 0x0057
68#define JSY_1031_REGISTER_REACTIVE_POWER 0x0059
69#define JSY_1031_REGISTER_PHASE_ANGLE 0x005B
71#define JSY_1031_REGISTER_LEN 2
72#define JSY_1031_REGISTER_COUNT 19
73#define JSY_1031_REGISTER_START JSY_1031_REGISTER_VOLTAGE
79#define JSY_163_REGISTER_VOLTAGE 0x0048
80#define JSY_163_REGISTER_CURRENT 0x0049
81#define JSY_163_REGISTER_ACTIVE_POWER 0x004A
82#define JSY_163_REGISTER_ACTIVE_ENERGY_IMPORTED 0x004B
83#define JSY_163_REGISTER_POWER_FACTOR 0x004D
84#define JSY_163_REGISTER_ACTIVE_ENERGY_RETURNED 0x004E
85#define JSY_163_REGISTER_ACTIVE_POWER_SIGN 0x0050
86#define JSY_163_REGISTER_FREQUENCY 0x0051
88#define JSY_163_REGISTER_LEN 2
89#define JSY_163_REGISTER_COUNT 10
90#define JSY_163_REGISTER_START JSY_163_REGISTER_VOLTAGE
96#define JSY_193_REGISTER_CH1_VOLTAGE 0x0100
97#define JSY_193_REGISTER_CH1_CURRENT 0x0101
98#define JSY_193_REGISTER_CH1_ACTIVE_POWER 0x0102
99#define JSY_193_REGISTER_CH1_ACTIVE_POWER_SIGN 0x0103
100#define JSY_193_REGISTER_CH1_ACTIVE_ENERGY_POSITIVE 0x0104
101#define JSY_193_REGISTER_CH1_ACTIVE_ENERGY_NEGATIVE 0x0106
102#define JSY_193_REGISTER_CH1_POWER_FACTOR 0x0108
103#define JSY_193_REGISTER_CH1_FREQUENCY 0x0109
104#define JSY_193_REGISTER_CH2_VOLTAGE 0x010A
105#define JSY_193_REGISTER_CH2_CURRENT 0x010B
106#define JSY_193_REGISTER_CH2_ACTIVE_POWER 0x010C
107#define JSY_193_REGISTER_CH2_ACTIVE_POWER_SIGN 0x010D
108#define JSY_193_REGISTER_CH2_ACTIVE_ENERGY_POSITIVE 0x010E
109#define JSY_193_REGISTER_CH2_ACTIVE_ENERGY_NEGATIVE 0x0110
110#define JSY_193_REGISTER_CH2_POWER_FACTOR 0x0112
111#define JSY_193_REGISTER_CH2_FREQUENCY 0x0113
113#define JSY_193_REGISTER_LEN 2
114#define JSY_193_REGISTER_COUNT 20
115#define JSY_193_REGISTER_START JSY_193_REGISTER_CH1_VOLTAGE
121#define JSY_194_REGISTER_CH1_VOLTAGE 0x0048
122#define JSY_194_REGISTER_CH1_CURRENT 0x0049
123#define JSY_194_REGISTER_CH1_ACTIVE_POWER 0x004A
124#define JSY_194_REGISTER_CH1_ACTIVE_ENERGY_IMPORTED 0x004B
125#define JSY_194_REGISTER_CH1_POWER_FACTOR 0x004C
126#define JSY_194_REGISTER_CH1_ACTIVE_ENERGY_RETURNED 0x004D
127#define JSY_194_REGISTER_ACTIVE_POWER_SIGNS 0x004E
128#define JSY_194_REGISTER_FREQUENCY 0x004F
129#define JSY_194_REGISTER_CH2_VOLTAGE 0x0050
130#define JSY_194_REGISTER_CH2_CURRENT 0x0051
131#define JSY_194_REGISTER_CH2_ACTIVE_POWER 0x0052
132#define JSY_194_REGISTER_CH2_ACTIVE_ENERGY_IMPORTED 0x0053
133#define JSY_194_REGISTER_CH2_POWER_FACTOR 0x0054
134#define JSY_194_REGISTER_CH2_ACTIVE_ENERGY_RETURNED 0x0055
136#define JSY_194_REGISTER_LEN 4
137#define JSY_194_REGISTER_COUNT 14
138#define JSY_194_REGISTER_START JSY_194_REGISTER_CH1_VOLTAGE
144#define JSY_22x_REGISTER_VOLTAGE 0x0100
145#define JSY_22x_REGISTER_CURRENT 0x0102
146#define JSY_22x_REGISTER_ACTIVE_POWER 0x0104
147#define JSY_22x_REGISTER_REACTIVE_POWER 0x0106
148#define JSY_22x_REGISTER_APPARENT_POWER 0x0108
149#define JSY_22x_REGISTER_POWER_FACTOR 0x010A
150#define JSY_22x_REGISTER_FREQUENCY 0x010C
151#define JSY_22x_REGISTER_ACTIVE_ENERGY 0x010E
152#define JSY_22x_REGISTER_REACTIVE_ENERGY 0x0110
153#define JSY_22x_REGISTER_POWER_SUPPLY 0x0112
154#define JSY_22x_REGISTER_ACTIVE_POWER_SIGN 0x0114
155#define JSY_22x_REGISTER_REACTIVE_POWER_SIGN 0x0115
156#define JSY_22x_REGISTER_ACTIVE_ENERGY_POSITIVE 0x0116
157#define JSY_22x_REGISTER_ACTIVE_ENERGY_NEGATIVE 0x0118
158#define JSY_22x_REGISTER_REACTIVE_ENERGY_POSITIVE 0x011A
159#define JSY_22x_REGISTER_REACTIVE_ENERGY_NEGATIVE 0x011C
161#define JSY_22x_REGISTER_LEN 2
162#define JSY_22x_REGISTER_COUNT 30
163#define JSY_22x_REGISTER_START JSY_22x_REGISTER_VOLTAGE
169#define JSY_333_REGISTER_PHASE_A_VOLTAGE 0x0100
170#define JSY_333_REGISTER_PHASE_B_VOLTAGE 0x0101
171#define JSY_333_REGISTER_PHASE_C_VOLTAGE 0x0102
172#define JSY_333_REGISTER_PHASE_A_CURRENT 0x0103
173#define JSY_333_REGISTER_PHASE_B_CURRENT 0x0104
174#define JSY_333_REGISTER_PHASE_C_CURRENT 0x0105
175#define JSY_333_REGISTER_PHASE_A_ACTIVE_POWER 0x0106
176#define JSY_333_REGISTER_PHASE_B_ACTIVE_POWER 0x0107
177#define JSY_333_REGISTER_PHASE_C_ACTIVE_POWER 0x0108
178#define JSY_333_REGISTER_TOTAL_ACTIVE_POWER 0x0109
179#define JSY_333_REGISTER_PHASE_A_REACTIVE_POWER 0x010B
180#define JSY_333_REGISTER_PHASE_B_REACTIVE_POWER 0x010C
181#define JSY_333_REGISTER_PHASE_C_REACTIVE_POWER 0x010D
182#define JSY_333_REGISTER_TOTAL_REACTIVE_POWER 0x010E
183#define JSY_333_REGISTER_PHASE_A_APPARENT_POWER 0x0110
184#define JSY_333_REGISTER_PHASE_B_APPARENT_POWER 0x0111
185#define JSY_333_REGISTER_PHASE_C_APPARENT_POWER 0x0112
186#define JSY_333_REGISTER_TOTAL_APPARENT_POWER 0x0113
187#define JSY_333_REGISTER_FREQUENCY 0x0115
188#define JSY_333_REGISTER_PHASE_A_POWER_FACTOR 0x0116
189#define JSY_333_REGISTER_PHASE_B_POWER_FACTOR 0x0117
190#define JSY_333_REGISTER_PHASE_C_POWER_FACTOR 0x0118
191#define JSY_333_REGISTER_TOTAL_POWER_FACTOR 0x0119
192#define JSY_333_REGISTER_PHASE_A_ACTIVE_ENERGY 0x011A
193#define JSY_333_REGISTER_PHASE_B_ACTIVE_ENERGY 0x011C
194#define JSY_333_REGISTER_PHASE_C_ACTIVE_ENERGY 0x011E
195#define JSY_333_REGISTER_TOTAL_ACTIVE_ENERGY 0x0120
196#define JSY_333_REGISTER_PHASE_A_REACTIVE_ENERGY 0x0122
197#define JSY_333_REGISTER_PHASE_B_REACTIVE_ENERGY 0x0124
198#define JSY_333_REGISTER_PHASE_C_REACTIVE_ENERGY 0x0126
199#define JSY_333_REGISTER_TOTAL_REACTIVE_ENERGY 0x0128
200#define JSY_333_REGISTER_PHASE_A_APPARENT_ENERGY 0x012A
201#define JSY_333_REGISTER_PHASE_B_APPARENT_ENERGY 0x012C
202#define JSY_333_REGISTER_PHASE_C_APPARENT_ENERGY 0x012E
203#define JSY_333_REGISTER_TOTAL_APPARENT_ENERGY 0x0130
204#define JSY_333_REGISTER_POWER_SIGNS 0x0132
205#define JSY_333_REGISTER_ALARMS 0x0133
206#define JSY_333_REGISTER_PHASE_A_ACTIVE_ENERGY_IMPORTED 0x0134
207#define JSY_333_REGISTER_PHASE_B_ACTIVE_ENERGY_IMPORTED 0x0136
208#define JSY_333_REGISTER_PHASE_C_ACTIVE_ENERGY_IMPORTED 0x0138
209#define JSY_333_REGISTER_TOTAL_ACTIVE_ENERGY_IMPORTED 0x013A
210#define JSY_333_REGISTER_PHASE_A_ACTIVE_ENERGY_RETURNED 0x013C
211#define JSY_333_REGISTER_PHASE_B_ACTIVE_ENERGY_RETURNED 0x013E
212#define JSY_333_REGISTER_PHASE_C_ACTIVE_ENERGY_RETURNED 0x0140
213#define JSY_333_REGISTER_TOTAL_ACTIVE_ENERGY_RETURNED 0x0142
214#define JSY_333_REGISTER_PHASE_A_REACTIVE_ENERGY_IMPORTED 0x0144
215#define JSY_333_REGISTER_PHASE_B_REACTIVE_ENERGY_IMPORTED 0x0146
216#define JSY_333_REGISTER_PHASE_C_REACTIVE_ENERGY_IMPORTED 0x0148
217#define JSY_333_REGISTER_TOTAL_REACTIVE_ENERGY_IMPORTED 0x014A
218#define JSY_333_REGISTER_PHASE_A_REACTIVE_ENERGY_RETURNED 0x014C
219#define JSY_333_REGISTER_PHASE_B_REACTIVE_ENERGY_RETURNED 0x014E
220#define JSY_333_REGISTER_PHASE_C_REACTIVE_ENERGY_RETURNED 0x0150
221#define JSY_333_REGISTER_TOTAL_REACTIVE_ENERGY_RETURNED 0x0152
222#define JSY_333_REGISTER_PHASE_A_L_U 0x0154
223#define JSY_333_REGISTER_PHASE_B_L_U 0x0155
224#define JSY_333_REGISTER_PHASE_C_L_U 0x0156
225#define JSY_333_REGISTER_PHASE_A_PHASE_ANGLE_U 0x0157
226#define JSY_333_REGISTER_PHASE_B_PHASE_ANGLE_U 0x0158
227#define JSY_333_REGISTER_PHASE_C_PHASE_ANGLE_U 0x0159
228#define JSY_333_REGISTER_PHASE_A_PHASE_ANGLE_I 0x015A
229#define JSY_333_REGISTER_PHASE_B_PHASE_ANGLE_I 0x015B
230#define JSY_333_REGISTER_PHASE_C_PHASE_ANGLE_I 0x015C
231#define JSY_333_REGISTER_PHASE_A_PHASE_ANGLE_UI 0x015D
232#define JSY_333_REGISTER_PHASE_B_PHASE_ANGLE_UI 0x015E
233#define JSY_333_REGISTER_PHASE_C_PHASE_ANGLE_UI 0x015F
234#define JSY_333_REGISTER_PHASE_A_THD_U 0x0160
235#define JSY_333_REGISTER_PHASE_B_THD_U 0x0161
236#define JSY_333_REGISTER_PHASE_C_THD_U 0x0162
237#define JSY_333_REGISTER_PHASE_A_THD_I 0x0163
238#define JSY_333_REGISTER_PHASE_B_THD_I 0x0164
239#define JSY_333_REGISTER_PHASE_C_THD_I 0x0165
241#define JSY_333_REGISTER_LEN 2
242#define JSY_333_REGISTER_COUNT 102
243#define JSY_333_REGISTER_START JSY_333_REGISTER_PHASE_A_VOLTAGE
250#define JSY_CMD_READ_REGISTERS 0x03
251#define JSY_CMD_READ_RELAY1 0x01
252#define JSY_CMD_WRITE_REGISTERS 0x10
253#define JSY_CMD_WRITE_RELAY1 0x05
256#define JSY_REQUEST_ADDRESS 0
257#define JSY_REQUEST_CMD 1
258#define JSY_REQUEST_READ_REGISTER_ADDR_HIGH 2
259#define JSY_REQUEST_READ_REGISTER_ADDR_LOW 3
260#define JSY_REQUEST_READ_REGISTER_COUNT_HIGH 4
261#define JSY_REQUEST_READ_REGISTER_COUNT_LOW 5
262#define JSY_REQUEST_SET_ADDRESS 7
263#define JSY_REQUEST_SET_BAUDS 8
264#define JSY_REQUEST_SET_MODE 8
267#define JSY_RESPONSE_ADDRESS 0
268#define JSY_RESPONSE_CMD 1
269#define JSY_RESPONSE_DATA_LEN 2
270#define JSY_RESPONSE_DATA 3
273#define JSY_RESPONSE_SIZE_READ 5
274#define JSY_RESPONSE_SIZE_READ_MODEL JSY_RESPONSE_SIZE_READ + 2
275#define JSY_RESPONSE_SIZE_READ_MODE JSY_RESPONSE_SIZE_READ_MODEL
276#define JSY_RESPONSE_SIZE_RESET_ENERGY 8
277#define JSY_RESPONSE_SIZE_SWITCH_MODE 8
278#define JSY_RESPONSE_SIZE_SET_COM 8
280static constexpr uint8_t JSY_REQUEST_READ_REGISTERS[] = {
281 MYCILA_JSY_ADDRESS_BROADCAST,
282 JSY_CMD_READ_REGISTERS,
290static constexpr size_t JSY_REQUEST_READ_REGISTERS_LEN =
sizeof(JSY_REQUEST_READ_REGISTERS);
292static constexpr uint8_t JSY_REQUEST_READ_MODEL[] = {
293 MYCILA_JSY_ADDRESS_BROADCAST,
294 JSY_CMD_READ_REGISTERS,
295 HIBYTE(JSY_REGISTER_MODEL1),
296 LOBYTE(JSY_REGISTER_MODEL1),
302static constexpr size_t JSY_REQUEST_READ_MODEL_LEN =
sizeof(JSY_REQUEST_READ_MODEL);
304static constexpr uint8_t JSY_REQUEST_READ_MODE[] = {
305 MYCILA_JSY_ADDRESS_BROADCAST,
306 JSY_CMD_READ_REGISTERS,
307 HIBYTE(JSY_REGISTER_MODEL2),
308 LOBYTE(JSY_REGISTER_MODEL2),
314static constexpr size_t JSY_REQUEST_READ_MODE_LEN =
sizeof(JSY_REQUEST_READ_MODE);
316static constexpr uint8_t JSY_REQUEST_RESET_ENERGY[] = {
317 MYCILA_JSY_ADDRESS_BROADCAST,
318 JSY_CMD_WRITE_REGISTERS,
331static constexpr size_t JSY_REQUEST_RESET_ENERGY_LEN =
sizeof(JSY_REQUEST_RESET_ENERGY);
333static constexpr uint8_t JSY_REQUEST_SET_COM[] = {
334 MYCILA_JSY_ADDRESS_BROADCAST,
335 JSY_CMD_WRITE_REGISTERS,
336 HIBYTE(JSY_REGISTER_ID_AND_BAUDS),
337 LOBYTE(JSY_REGISTER_ID_AND_BAUDS),
346static constexpr size_t JSY_REQUEST_SET_COM_LEN =
sizeof(JSY_REQUEST_SET_COM);
348static constexpr uint8_t JSY_REQUEST_SWITCH_MODE[] = {
349 MYCILA_JSY_ADDRESS_BROADCAST,
350 JSY_CMD_WRITE_REGISTERS,
351 HIBYTE(JSY_REGISTER_SWITCH_MODE),
352 LOBYTE(JSY_REGISTER_SWITCH_MODE),
361static constexpr size_t JSY_REQUEST_SWITCH_MODE_LEN =
sizeof(JSY_REQUEST_SWITCH_MODE);
367static constexpr Mycila::JSY::BaudRate AUTO_DETECT_BAUD_RATES[] = {
368 Mycila::JSY::BaudRate::BAUD_4800,
369 Mycila::JSY::BaudRate::BAUD_9600,
370 Mycila::JSY::BaudRate::BAUD_19200,
371 Mycila::JSY::BaudRate::BAUD_38400,
372 Mycila::JSY::BaudRate::BAUD_1200,
373 Mycila::JSY::BaudRate::BAUD_2400,
375static constexpr size_t AUTO_DETECT_BAUD_RATES_COUNT = 6;
382static constexpr uint16_t CRCTable[] = {
383 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
384 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
385 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
386 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
387 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
388 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
389 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
390 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
391 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
392 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
393 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
394 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
395 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
396 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
397 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
398 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040};
408 const BaudRate baudRate,
409 const uint8_t destinationAddress,
410 const uint16_t model,
413 const uint32_t stackSize,
414 const uint32_t pause) {
418 if (GPIO_IS_VALID_GPIO(rxPin)) {
419 _pinRX = (gpio_num_t)rxPin;
421 LOGE(TAG,
"Disable JSY: Invalid Serial RX (JSY TX pin): %" PRId8, rxPin);
422 _pinRX = GPIO_NUM_NC;
426 if (GPIO_IS_VALID_OUTPUT_GPIO(txPin)) {
427 _pinTX = (gpio_num_t)txPin;
429 LOGE(TAG,
"Disable JSY: Invalid Serial TX (JSY RX pin): %" PRId8, txPin);
430 _pinTX = GPIO_NUM_NC;
434 LOGI(TAG,
"Enable JSY @ 0x%02X on Serial RX (JSY TX Pin): %" PRId8
" and Serial TX (JSY RX Pin): %" PRId8, destinationAddress, rxPin, txPin);
439 if (baudRate == BaudRate::UNKNOWN) {
440 _baudRate = _detectBauds(destinationAddress);
442 if (_baudRate == BaudRate::UNKNOWN) {
443 if (_lastAddress == MYCILA_JSY_ADDRESS_UNKNOWN)
444 LOGE(TAG,
"Unable to read any JSY @ 0x%02X at any supported speed.", destinationAddress);
446 LOGE(TAG,
"Unable to read any JSY @ 0x%02X at any supported speed but found one @ 0x%02X.", destinationAddress, _lastAddress);
453 LOGW(TAG,
"JSY @ 0x%02X bauds detection skipped, forcing baud rate: %" PRIu32, destinationAddress, _baudRate);
454 _openSerial(baudRate);
456 _baudRate = BaudRate::UNKNOWN;
457 for (
int j = 0; j < MYCILA_JSY_RETRY_COUNT; j++) {
458 if (_canRead(destinationAddress, baudRate)) {
459 _baudRate = baudRate;
464 if (_baudRate == BaudRate::UNKNOWN) {
465 LOGE(TAG,
"Unable to read any JSY @ 0x%02X at speed: %" PRIu32, destinationAddress, baudRate);
472 _model = model ? model :
readModel(destinationAddress);
474 if (_model != MYCILA_JSY_MK_1031 &&
475 _model != MYCILA_JSY_MK_163 &&
476 _model != MYCILA_JSY_MK_193 &&
477 _model != MYCILA_JSY_MK_194 &&
478 _model != MYCILA_JSY_MK_227 &&
479 _model != MYCILA_JSY_MK_229 &&
480 _model != MYCILA_JSY_MK_333) {
481 LOGE(TAG,
"Unsupported JSY model: JSY-MK-%X", _model);
488 _destinationAddress = destinationAddress;
489 LOGI(TAG,
"Detected JSY-MK-%X @ 0x%02X with speed %" PRIu32
" bauds", _model, _lastAddress, _baudRate);
491 assert(!async || xTaskCreateUniversal(_jsyTask,
"jsyTask", stackSize,
this, MYCILA_JSY_ASYNC_PRIORITY, &_taskHandle, core) == pdPASS);
496 LOGI(TAG,
"Disable JSY @ 0x%02X", _destinationAddress);
498 while (_taskHandle != NULL) {
502 std::lock_guard<std::mutex> lock(_mutex);
503 LOGD(TAG,
"Closing Serial for JSY @ 0x%02X", _destinationAddress);
506 _baudRate = BaudRate::UNKNOWN;
507 _lastAddress = MYCILA_JSY_ADDRESS_UNKNOWN;
508 _model = MYCILA_JSY_MK_UNKNOWN;
517bool Mycila::JSY::_read(
const uint8_t address, uint16_t model) {
521 std::lock_guard<std::mutex> lock(_mutex);
523#ifdef MYCILA_JSY_DEBUG
524 Serial.printf(
"[JSY] read(0x%02X)\n", address);
527 memcpy(_buffer, JSY_REQUEST_READ_REGISTERS, JSY_REQUEST_READ_REGISTERS_LEN);
531 uint16_t registerStart = 0;
532 uint16_t registerCount = 0;
533 uint8_t registerSize = 0;
536 case MYCILA_JSY_MK_1031:
537 registerSize = JSY_1031_REGISTER_LEN;
538 registerStart = JSY_1031_REGISTER_START;
539 registerCount = JSY_1031_REGISTER_COUNT;
542 case MYCILA_JSY_MK_163:
543 registerSize = JSY_163_REGISTER_LEN;
544 registerStart = JSY_163_REGISTER_START;
545 registerCount = JSY_163_REGISTER_COUNT;
548 case MYCILA_JSY_MK_193:
549 registerSize = JSY_193_REGISTER_LEN;
550 registerStart = JSY_193_REGISTER_START;
551 registerCount = JSY_193_REGISTER_COUNT;
554 case MYCILA_JSY_MK_194:
555 registerSize = JSY_194_REGISTER_LEN;
556 registerStart = JSY_194_REGISTER_START;
557 registerCount = JSY_194_REGISTER_COUNT;
560 case MYCILA_JSY_MK_227:
561 case MYCILA_JSY_MK_229:
562 registerSize = JSY_22x_REGISTER_LEN;
563 registerStart = JSY_22x_REGISTER_START;
564 registerCount = JSY_22x_REGISTER_COUNT;
567 case MYCILA_JSY_MK_333:
568 registerSize = JSY_333_REGISTER_LEN;
569 registerStart = JSY_333_REGISTER_START;
570 registerCount = JSY_333_REGISTER_COUNT;
577 _buffer[JSY_REQUEST_READ_REGISTER_ADDR_HIGH] = HIBYTE(registerStart);
578 _buffer[JSY_REQUEST_READ_REGISTER_ADDR_LOW] = LOBYTE(registerStart);
579 _buffer[JSY_REQUEST_READ_REGISTER_COUNT_HIGH] = HIBYTE(registerCount);
580 _buffer[JSY_REQUEST_READ_REGISTER_COUNT_LOW] = LOBYTE(registerCount);
582 _send(address, JSY_REQUEST_READ_REGISTERS_LEN);
583 ReadResult result = _timedRead(address, JSY_RESPONSE_SIZE_READ + registerCount * registerSize, _baudRate);
585 if (result == ReadResult::READ_TIMEOUT) {
589 _callback(EventType::EVT_READ_TIMEOUT, _data);
594 if (result == ReadResult::READ_ERROR_COUNT || result == ReadResult::READ_ERROR_CRC) {
598 _callback(EventType::EVT_READ_ERROR, _data);
603 if (result == ReadResult::READ_ERROR_ADDRESS) {
606 _callback(EventType::EVT_READ_ERROR, _data);
611 assert(result == ReadResult::READ_SUCCESS);
613 _data.address = _buffer[JSY_RESPONSE_ADDRESS];
617 case MYCILA_JSY_MK_1031: {
619 _data._metrics[0].frequency = _register16(_buffer, registerStart, registerSize, JSY_1031_REGISTER_FREQUENCY) * 0.01f;
620 _data._metrics[0].voltage = _register16(_buffer, registerStart, registerSize, JSY_1031_REGISTER_VOLTAGE) * 0.01f;
621 _data._metrics[0].current = _register32(_buffer, registerStart, registerSize, JSY_1031_REGISTER_CURRENT) * 0.0001f;
622 _data._metrics[0].activePower = _register32(_buffer, registerStart, registerSize, JSY_1031_REGISTER_ACTIVE_POWER) * 0.0001f;
623 _data._metrics[0].activeEnergy = _register32(_buffer, registerStart, registerSize, JSY_1031_REGISTER_ACTIVE_ENERGY) * 10;
624 _data._metrics[0].powerFactor = _register16(_buffer, registerStart, registerSize, JSY_1031_REGISTER_POWER_FACTOR) * 0.001f;
625 _data._metrics[0].apparentPower = _register32(_buffer, registerStart, registerSize, JSY_1031_REGISTER_APPARENT_POWER) * 0.0001f;
626 _data._metrics[0].reactivePower = _register32(_buffer, registerStart, registerSize, JSY_1031_REGISTER_REACTIVE_POWER) * 0.0001f;
629 _data.aggregate = _data._metrics[0];
634 case MYCILA_JSY_MK_163: {
638 uint8_t sign = _register8(_buffer, registerStart, registerSize, JSY_163_REGISTER_ACTIVE_POWER_SIGN, 1);
641 _data._metrics[0].frequency = _register16(_buffer, registerStart, registerSize, JSY_163_REGISTER_FREQUENCY) * 0.01f;
642 _data._metrics[0].voltage = _register16(_buffer, registerStart, registerSize, JSY_163_REGISTER_VOLTAGE) * 0.01f;
643 _data._metrics[0].current = _register16(_buffer, registerStart, registerSize, JSY_163_REGISTER_CURRENT) * 0.01f;
644 _data._metrics[0].activePower = _register16(_buffer, registerStart, registerSize, JSY_163_REGISTER_ACTIVE_POWER) * (sign ? -1.0f : 1.0f);
645 _data._metrics[0].activeEnergyImported = _register32(_buffer, registerStart, registerSize, JSY_163_REGISTER_ACTIVE_ENERGY_IMPORTED) * 5.0f / 16.0f;
646 _data._metrics[0].powerFactor = _register16(_buffer, registerStart, registerSize, JSY_163_REGISTER_POWER_FACTOR) * 0.001f;
647 _data._metrics[0].activeEnergyReturned = _register32(_buffer, registerStart, registerSize, JSY_163_REGISTER_ACTIVE_ENERGY_RETURNED) * 5.0f / 16.0f;
651 _data._metrics[0].apparentPower = _data._metrics[0].powerFactor == 0 ? 0 : std::abs(_data._metrics[0].activePower / _data._metrics[0].powerFactor);
653 _data._metrics[0].reactivePower = std::sqrt(_data._metrics[0].apparentPower * _data._metrics[0].apparentPower - _data._metrics[0].activePower * _data._metrics[0].activePower);
655 _data._metrics[0].activeEnergy = _data._metrics[0].activeEnergyImported + _data._metrics[0].activeEnergyReturned;
658 _data.aggregate = _data._metrics[0];
663 case MYCILA_JSY_MK_193: {
665 _data._metrics[0].voltage = _register16(_buffer, registerStart, registerSize, JSY_193_REGISTER_CH1_VOLTAGE) * 0.01f;
666 _data._metrics[0].current = _register16(_buffer, registerStart, registerSize, JSY_193_REGISTER_CH1_CURRENT) * 0.01f;
667 _data._metrics[0].activePower = _register16(_buffer, registerStart, registerSize, JSY_193_REGISTER_CH1_ACTIVE_POWER) * (_register16(_buffer, registerStart, registerSize, JSY_193_REGISTER_CH1_ACTIVE_POWER_SIGN) ? -1.0f : 1.0f);
668 _data._metrics[0].activeEnergyImported = _register32(_buffer, registerStart, registerSize, JSY_193_REGISTER_CH1_ACTIVE_ENERGY_POSITIVE) * 10;
669 _data._metrics[0].activeEnergyReturned = _register32(_buffer, registerStart, registerSize, JSY_193_REGISTER_CH1_ACTIVE_ENERGY_NEGATIVE) * 10;
670 _data._metrics[0].powerFactor = _register16(_buffer, registerStart, registerSize, JSY_193_REGISTER_CH1_POWER_FACTOR) * 0.001f;
671 _data._metrics[0].frequency = _register16(_buffer, registerStart, registerSize, JSY_193_REGISTER_CH1_FREQUENCY) * 0.01f;
674 _data._metrics[1].voltage = _register16(_buffer, registerStart, registerSize, JSY_193_REGISTER_CH2_VOLTAGE) * 0.01f;
675 _data._metrics[1].current = _register16(_buffer, registerStart, registerSize, JSY_193_REGISTER_CH2_CURRENT) * 0.01f;
676 _data._metrics[1].activePower = _register16(_buffer, registerStart, registerSize, JSY_193_REGISTER_CH2_ACTIVE_POWER) * (_register16(_buffer, registerStart, registerSize, JSY_193_REGISTER_CH2_ACTIVE_POWER_SIGN) ? -1.0f : 1.0f);
677 _data._metrics[1].activeEnergyImported = _register32(_buffer, registerStart, registerSize, JSY_193_REGISTER_CH2_ACTIVE_ENERGY_POSITIVE) * 10;
678 _data._metrics[1].activeEnergyReturned = _register32(_buffer, registerStart, registerSize, JSY_193_REGISTER_CH2_ACTIVE_ENERGY_NEGATIVE) * 10;
679 _data._metrics[1].powerFactor = _register16(_buffer, registerStart, registerSize, JSY_193_REGISTER_CH2_POWER_FACTOR) * 0.001f;
680 _data._metrics[1].frequency = _register16(_buffer, registerStart, registerSize, JSY_193_REGISTER_CH2_FREQUENCY) * 0.01f;
684 _data._metrics[0].apparentPower = _data._metrics[0].powerFactor == 0 ? 0 : std::abs(_data._metrics[0].activePower / _data._metrics[0].powerFactor);
685 _data._metrics[1].apparentPower = _data._metrics[1].powerFactor == 0 ? 0 : std::abs(_data._metrics[1].activePower / _data._metrics[1].powerFactor);
687 _data._metrics[0].reactivePower = std::sqrt(_data._metrics[0].apparentPower * _data._metrics[0].apparentPower - _data._metrics[0].activePower * _data._metrics[0].activePower);
688 _data._metrics[1].reactivePower = std::sqrt(_data._metrics[1].apparentPower * _data._metrics[1].apparentPower - _data._metrics[1].activePower * _data._metrics[1].activePower);
690 _data._metrics[0].activeEnergy = _data._metrics[0].activeEnergyImported + _data._metrics[0].activeEnergyReturned;
691 _data._metrics[1].activeEnergy = _data._metrics[1].activeEnergyImported + _data._metrics[1].activeEnergyReturned;
694 _data.aggregate = _data._metrics[0];
695 _data.aggregate += _data._metrics[1];
696 _data.aggregate.voltage = std::max(_data._metrics[0].voltage, _data._metrics[1].voltage);
697 _data.aggregate.frequency = std::max(_data._metrics[0].frequency, _data._metrics[1].frequency);
702 case MYCILA_JSY_MK_194: {
708 uint8_t sign0 = _register8(_buffer, registerStart, registerSize, JSY_194_REGISTER_ACTIVE_POWER_SIGNS, 0);
709 uint8_t sign1 = _register8(_buffer, registerStart, registerSize, JSY_194_REGISTER_ACTIVE_POWER_SIGNS, 1);
712 float frequency = _register32(_buffer, registerStart, registerSize, JSY_194_REGISTER_FREQUENCY) * 0.01f;
715 _data._metrics[0].frequency = frequency;
716 _data._metrics[0].voltage = _register32(_buffer, registerStart, registerSize, JSY_194_REGISTER_CH1_VOLTAGE) * 0.0001f;
717 _data._metrics[0].current = _register32(_buffer, registerStart, registerSize, JSY_194_REGISTER_CH1_CURRENT) * 0.0001f;
718 _data._metrics[0].activePower = _register32(_buffer, registerStart, registerSize, JSY_194_REGISTER_CH1_ACTIVE_POWER) * (sign0 ? -0.0001f : 0.0001f);
719 _data._metrics[0].activeEnergyImported = _register32(_buffer, registerStart, registerSize, JSY_194_REGISTER_CH1_ACTIVE_ENERGY_IMPORTED) * 0.1f;
720 _data._metrics[0].powerFactor = _register32(_buffer, registerStart, registerSize, JSY_194_REGISTER_CH1_POWER_FACTOR) * 0.001f;
721 _data._metrics[0].activeEnergyReturned = _register32(_buffer, registerStart, registerSize, JSY_194_REGISTER_CH1_ACTIVE_ENERGY_RETURNED) * 0.1f;
724 _data._metrics[1].frequency = frequency;
725 _data._metrics[1].voltage = _register32(_buffer, registerStart, registerSize, JSY_194_REGISTER_CH2_VOLTAGE) * 0.0001f;
726 _data._metrics[1].current = _register32(_buffer, registerStart, registerSize, JSY_194_REGISTER_CH2_CURRENT) * 0.0001f;
727 _data._metrics[1].activePower = _register32(_buffer, registerStart, registerSize, JSY_194_REGISTER_CH2_ACTIVE_POWER) * (sign1 ? -0.0001f : 0.0001f);
728 _data._metrics[1].activeEnergyImported = _register32(_buffer, registerStart, registerSize, JSY_194_REGISTER_CH2_ACTIVE_ENERGY_IMPORTED) * 0.1f;
729 _data._metrics[1].powerFactor = _register32(_buffer, registerStart, registerSize, JSY_194_REGISTER_CH2_POWER_FACTOR) * 0.001f;
730 _data._metrics[1].activeEnergyReturned = _register32(_buffer, registerStart, registerSize, JSY_194_REGISTER_CH2_ACTIVE_ENERGY_RETURNED) * 0.1f;
734 _data._metrics[0].apparentPower = _data._metrics[0].powerFactor == 0 ? 0 : std::abs(_data._metrics[0].activePower / _data._metrics[0].powerFactor);
735 _data._metrics[1].apparentPower = _data._metrics[1].powerFactor == 0 ? 0 : std::abs(_data._metrics[1].activePower / _data._metrics[1].powerFactor);
737 _data._metrics[0].reactivePower = std::sqrt(_data._metrics[0].apparentPower * _data._metrics[0].apparentPower - _data._metrics[0].activePower * _data._metrics[0].activePower);
738 _data._metrics[1].reactivePower = std::sqrt(_data._metrics[1].apparentPower * _data._metrics[1].apparentPower - _data._metrics[1].activePower * _data._metrics[1].activePower);
740 _data._metrics[0].activeEnergy = _data._metrics[0].activeEnergyImported + _data._metrics[0].activeEnergyReturned;
741 _data._metrics[1].activeEnergy = _data._metrics[1].activeEnergyImported + _data._metrics[1].activeEnergyReturned;
744 _data.aggregate = _data._metrics[0];
745 _data.aggregate += _data._metrics[1];
746 _data.aggregate.frequency = frequency;
747 _data.aggregate.voltage = std::max(_data._metrics[0].voltage, _data._metrics[1].voltage);
752 case MYCILA_JSY_MK_227:
753 case MYCILA_JSY_MK_229: {
755 _data._metrics[0].voltage = _register32(_buffer, registerStart, registerSize, JSY_22x_REGISTER_VOLTAGE) * 0.0001f;
756 _data._metrics[0].current = _register32(_buffer, registerStart, registerSize, JSY_22x_REGISTER_CURRENT) * 0.0001f;
757 _data._metrics[0].activePower = _register32(_buffer, registerStart, registerSize, JSY_22x_REGISTER_ACTIVE_POWER) * (_register16(_buffer, registerStart, registerSize, JSY_22x_REGISTER_ACTIVE_POWER_SIGN) ? -0.0001f : 0.0001f);
758 _data._metrics[0].reactivePower = _register32(_buffer, registerStart, registerSize, JSY_22x_REGISTER_REACTIVE_POWER) * (_register16(_buffer, registerStart, registerSize, JSY_22x_REGISTER_REACTIVE_POWER_SIGN) ? -0.0001f : 0.0001f);
759 _data._metrics[0].apparentPower = _register32(_buffer, registerStart, registerSize, JSY_22x_REGISTER_APPARENT_POWER) * 0.0001f;
760 _data._metrics[0].powerFactor = _register32(_buffer, registerStart, registerSize, JSY_22x_REGISTER_POWER_FACTOR) * 0.001f;
761 _data._metrics[0].frequency = _register32(_buffer, registerStart, registerSize, JSY_22x_REGISTER_FREQUENCY) * 0.01f;
762 _data._metrics[0].activeEnergy = _register32(_buffer, registerStart, registerSize, JSY_22x_REGISTER_ACTIVE_ENERGY);
763 _data._metrics[0].reactiveEnergy = _register32(_buffer, registerStart, registerSize, JSY_22x_REGISTER_REACTIVE_ENERGY);
764 _data._metrics[0].activeEnergyImported = _register32(_buffer, registerStart, registerSize, JSY_22x_REGISTER_ACTIVE_ENERGY_POSITIVE);
765 _data._metrics[0].activeEnergyReturned = _register32(_buffer, registerStart, registerSize, JSY_22x_REGISTER_ACTIVE_ENERGY_NEGATIVE);
766 _data._metrics[0].reactiveEnergyImported = _register32(_buffer, registerStart, registerSize, JSY_22x_REGISTER_REACTIVE_ENERGY_POSITIVE);
767 _data._metrics[0].reactiveEnergyReturned = _register32(_buffer, registerStart, registerSize, JSY_22x_REGISTER_REACTIVE_ENERGY_NEGATIVE);
770 _data.aggregate = _data._metrics[0];
775 case MYCILA_JSY_MK_333: {
786 uint8_t sign7 = _register8(_buffer, registerStart, registerSize, JSY_333_REGISTER_POWER_SIGNS, 1) & 0x80;
787 uint8_t sign6 = _register8(_buffer, registerStart, registerSize, JSY_333_REGISTER_POWER_SIGNS, 1) & 0x40;
788 uint8_t sign5 = _register8(_buffer, registerStart, registerSize, JSY_333_REGISTER_POWER_SIGNS, 1) & 0x20;
789 uint8_t sign4 = _register8(_buffer, registerStart, registerSize, JSY_333_REGISTER_POWER_SIGNS, 1) & 0x10;
790 uint8_t sign3 = _register8(_buffer, registerStart, registerSize, JSY_333_REGISTER_POWER_SIGNS, 1) & 0x08;
791 uint8_t sign2 = _register8(_buffer, registerStart, registerSize, JSY_333_REGISTER_POWER_SIGNS, 1) & 0x04;
792 uint8_t sign1 = _register8(_buffer, registerStart, registerSize, JSY_333_REGISTER_POWER_SIGNS, 1) & 0x02;
793 uint8_t sign0 = _register8(_buffer, registerStart, registerSize, JSY_333_REGISTER_POWER_SIGNS, 1) & 0x01;
796 float frequency = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_FREQUENCY) * 0.01f;
799 _data._metrics[0].frequency = frequency;
800 _data._metrics[0].voltage = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_VOLTAGE) * 0.01f;
801 _data._metrics[0].current = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_CURRENT) * 0.01f;
802 _data._metrics[0].activePower = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_ACTIVE_POWER) * (sign0 ? -1.0f : 1.0f);
803 _data._metrics[0].reactivePower = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_REACTIVE_POWER) * (sign4 ? -1.0f : 1.0f);
804 _data._metrics[0].apparentPower = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_APPARENT_POWER);
805 _data._metrics[0].powerFactor = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_POWER_FACTOR) * 0.001f;
806 _data._metrics[0].activeEnergy = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_ACTIVE_ENERGY) * 10;
807 _data._metrics[0].reactiveEnergy = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_REACTIVE_ENERGY) * 10;
808 _data._metrics[0].apparentEnergy = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_APPARENT_ENERGY) * 10;
809 _data._metrics[0].activeEnergyImported = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_ACTIVE_ENERGY_IMPORTED) * 10;
810 _data._metrics[0].activeEnergyReturned = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_ACTIVE_ENERGY_RETURNED) * 10;
811 _data._metrics[0].reactiveEnergyImported = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_REACTIVE_ENERGY_IMPORTED) * 10;
812 _data._metrics[0].reactiveEnergyReturned = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_REACTIVE_ENERGY_RETURNED) * 10;
813 _data._metrics[0].phaseAngleU = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_PHASE_ANGLE_U) * 0.01f;
814 _data._metrics[0].phaseAngleI = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_PHASE_ANGLE_I) * 0.01f;
815 _data._metrics[0].phaseAngleUI = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_PHASE_ANGLE_UI) * 0.01f;
816 _data._metrics[0].thdU = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_THD_U) * 0.01f;
817 _data._metrics[0].thdI = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_A_THD_I) * 0.01f;
820 _data._metrics[1].frequency = frequency;
821 _data._metrics[1].voltage = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_VOLTAGE) * 0.01f;
822 _data._metrics[1].current = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_CURRENT) * 0.01f;
823 _data._metrics[1].activePower = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_ACTIVE_POWER) * (sign1 ? -1.0f : 1.0f);
824 _data._metrics[1].reactivePower = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_REACTIVE_POWER) * (sign5 ? -1.0f : 1.0f);
825 _data._metrics[1].apparentPower = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_APPARENT_POWER);
826 _data._metrics[1].powerFactor = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_POWER_FACTOR) * 0.001f;
827 _data._metrics[1].activeEnergy = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_ACTIVE_ENERGY) * 10;
828 _data._metrics[1].reactiveEnergy = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_REACTIVE_ENERGY) * 10;
829 _data._metrics[1].apparentEnergy = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_APPARENT_ENERGY) * 10;
830 _data._metrics[1].activeEnergyImported = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_ACTIVE_ENERGY_IMPORTED) * 10;
831 _data._metrics[1].activeEnergyReturned = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_ACTIVE_ENERGY_RETURNED) * 10;
832 _data._metrics[1].reactiveEnergyImported = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_REACTIVE_ENERGY_IMPORTED) * 10;
833 _data._metrics[1].reactiveEnergyReturned = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_REACTIVE_ENERGY_RETURNED) * 10;
834 _data._metrics[1].phaseAngleU = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_PHASE_ANGLE_U) * 0.01f;
835 _data._metrics[1].phaseAngleI = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_PHASE_ANGLE_I) * 0.01f;
836 _data._metrics[1].phaseAngleUI = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_PHASE_ANGLE_UI) * 0.01f;
837 _data._metrics[1].thdU = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_THD_U) * 0.01f;
838 _data._metrics[1].thdI = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_B_THD_I) * 0.01f;
841 _data._metrics[2].frequency = frequency;
842 _data._metrics[2].voltage = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_VOLTAGE) * 0.01f;
843 _data._metrics[2].current = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_CURRENT) * 0.01f;
844 _data._metrics[2].activePower = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_ACTIVE_POWER) * (sign2 ? -1.0f : 1.0f);
845 _data._metrics[2].reactivePower = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_REACTIVE_POWER) * (sign6 ? -1.0f : 1.0f);
846 _data._metrics[2].apparentPower = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_APPARENT_POWER);
847 _data._metrics[2].powerFactor = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_POWER_FACTOR) * 0.001f;
848 _data._metrics[2].activeEnergy = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_ACTIVE_ENERGY) * 10;
849 _data._metrics[2].reactiveEnergy = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_REACTIVE_ENERGY) * 10;
850 _data._metrics[2].apparentEnergy = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_APPARENT_ENERGY) * 10;
851 _data._metrics[2].activeEnergyImported = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_ACTIVE_ENERGY_IMPORTED) * 10;
852 _data._metrics[2].activeEnergyReturned = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_ACTIVE_ENERGY_RETURNED) * 10;
853 _data._metrics[2].reactiveEnergyImported = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_REACTIVE_ENERGY_IMPORTED) * 10;
854 _data._metrics[2].reactiveEnergyReturned = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_REACTIVE_ENERGY_RETURNED) * 10;
855 _data._metrics[2].phaseAngleU = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_PHASE_ANGLE_U) * 0.01f;
856 _data._metrics[2].phaseAngleI = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_PHASE_ANGLE_I) * 0.01f;
857 _data._metrics[2].phaseAngleUI = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_PHASE_ANGLE_UI) * 0.01f;
858 _data._metrics[2].thdU = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_THD_U) * 0.01f;
859 _data._metrics[2].thdI = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_PHASE_C_THD_I) * 0.01f;
862 _data.aggregate.frequency = frequency;
863 _data.aggregate.activePower = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_TOTAL_ACTIVE_POWER) * (sign3 ? -1.0f : 1.0f);
864 _data.aggregate.reactivePower = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_TOTAL_REACTIVE_POWER) * (sign7 ? -1.0f : 1.0f);
865 _data.aggregate.apparentPower = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_TOTAL_APPARENT_POWER);
866 _data.aggregate.powerFactor = _register16(_buffer, registerStart, registerSize, JSY_333_REGISTER_TOTAL_POWER_FACTOR) * 0.001f;
867 _data.aggregate.activeEnergy = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_TOTAL_ACTIVE_ENERGY) * 10;
868 _data.aggregate.reactiveEnergy = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_TOTAL_REACTIVE_ENERGY) * 10;
869 _data.aggregate.apparentEnergy = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_TOTAL_APPARENT_ENERGY) * 10;
870 _data.aggregate.activeEnergyImported = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_TOTAL_ACTIVE_ENERGY_IMPORTED) * 10;
871 _data.aggregate.activeEnergyReturned = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_TOTAL_ACTIVE_ENERGY_RETURNED) * 10;
872 _data.aggregate.reactiveEnergyImported = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_TOTAL_REACTIVE_ENERGY_IMPORTED) * 10;
873 _data.aggregate.reactiveEnergyReturned = _register32(_buffer, registerStart, registerSize, JSY_333_REGISTER_TOTAL_REACTIVE_ENERGY_RETURNED) * 10;
874 _data.aggregate.current = _data._metrics[0].current + _data._metrics[1].current + _data._metrics[2].current;
875 _data.aggregate.voltage = _data.aggregate.current == 0 ? NAN : _data.aggregate.apparentPower / _data.aggregate.current;
887 _callback(EventType::EVT_READ, _data);
899 return MYCILA_JSY_MK_UNKNOWN;
901 LOGD(TAG,
"readModel(0x%02X)", address);
903 std::lock_guard<std::mutex> lock(_mutex);
905#ifdef MYCILA_JSY_DEBUG
906 Serial.printf(
"[JSY] readModel(0x%02X)\n", address);
909 memcpy(_buffer, JSY_REQUEST_READ_MODEL, JSY_REQUEST_READ_MODEL_LEN);
910 _send(address, JSY_REQUEST_READ_MODEL_LEN);
911 ReadResult result = _timedRead(address, JSY_RESPONSE_SIZE_READ_MODEL, _baudRate);
913 if (result != ReadResult::READ_SUCCESS) {
914 return MYCILA_JSY_MK_UNKNOWN;
917 return (_buffer[JSY_RESPONSE_DATA] << 8) + _buffer[JSY_RESPONSE_DATA + 1];
924Mycila::JSY::Mode Mycila::JSY::_readMode(
const uint8_t address,
const uint16_t model) {
926 return Mode::UNKNOWN;
929 case MYCILA_JSY_MK_163:
930 case MYCILA_JSY_MK_193:
931 case MYCILA_JSY_MK_194:
932 case MYCILA_JSY_MK_333:
934 case MYCILA_JSY_MK_227:
935 case MYCILA_JSY_MK_229:
937 case MYCILA_JSY_MK_1031:
940 return Mode::UNKNOWN;
943 LOGD(TAG,
"readMode(0x%02X)", address);
945 std::lock_guard<std::mutex> lock(_mutex);
947#ifdef MYCILA_JSY_DEBUG
948 Serial.printf(
"[JSY] readMode(0x%02X)\n", address);
951 memcpy(_buffer, JSY_REQUEST_READ_MODE, JSY_REQUEST_READ_MODE_LEN);
952 _send(address, JSY_REQUEST_READ_MODE_LEN);
953 ReadResult result = _timedRead(address, JSY_RESPONSE_SIZE_READ_MODE, _baudRate);
955 if (result != ReadResult::READ_SUCCESS) {
956 return Mode::UNKNOWN;
959 switch (_buffer[JSY_RESPONSE_DATA]) {
965 return Mode::UNKNOWN;
969bool Mycila::JSY::_setMode(
const uint8_t address,
const uint16_t model,
const Mode mode) {
973 if (mode == Mode::UNKNOWN)
977 case MYCILA_JSY_MK_163:
978 case MYCILA_JSY_MK_193:
979 case MYCILA_JSY_MK_194:
980 case MYCILA_JSY_MK_333:
981 return mode == Mode::AC;
982 case MYCILA_JSY_MK_227:
983 case MYCILA_JSY_MK_229:
984 return mode == Mode::DC;
985 case MYCILA_JSY_MK_1031:
991 LOGD(TAG,
"setMode(0x%02X) mode=%s", address, mode == Mode::AC ?
"AC" :
"DC");
993 std::lock_guard<std::mutex> lock(_mutex);
995#ifdef MYCILA_JSY_DEBUG
996 Serial.printf(
"[JSY] setMode(0x%02X, %s)\n", address, mode == Mode::AC ?
"AC" :
"DC");
999 memcpy(_buffer, JSY_REQUEST_SWITCH_MODE, JSY_REQUEST_SWITCH_MODE_LEN);
1001 _buffer[JSY_REQUEST_SET_MODE] = mode == Mode::AC ? JSY_MODE_AC : JSY_MODE_DC;
1003 _send(address, JSY_REQUEST_SWITCH_MODE_LEN);
1004 ReadResult result = _timedRead(address, JSY_RESPONSE_SIZE_SWITCH_MODE, _baudRate);
1006 return result == ReadResult::READ_SUCCESS;
1017 LOGD(TAG,
"resetEnergy(0x%02X)", address);
1019 std::lock_guard<std::mutex> lock(_mutex);
1021#ifdef MYCILA_JSY_DEBUG
1022 Serial.printf(
"[JSY] resetEnergy(0x%02X)\n", address);
1025 memcpy(_buffer, JSY_REQUEST_RESET_ENERGY, JSY_REQUEST_RESET_ENERGY_LEN);
1026 _send(address, JSY_REQUEST_RESET_ENERGY_LEN);
1027 ReadResult result = _timedRead(address, JSY_RESPONSE_SIZE_RESET_ENERGY, _baudRate);
1029 return result == ReadResult::READ_SUCCESS;
1036Mycila::JSY::BaudRate Mycila::JSY::getMinAvailableBaudRate()
const {
1038 return BaudRate::UNKNOWN;
1039 return getMinAvailableBaudRate(_model);
1042Mycila::JSY::BaudRate Mycila::JSY::getMinAvailableBaudRate(uint16_t model) {
1044 case MYCILA_JSY_MK_163:
1045 case MYCILA_JSY_MK_193:
1046 case MYCILA_JSY_MK_194:
1047 case MYCILA_JSY_MK_227:
1048 case MYCILA_JSY_MK_229:
1049 return BaudRate::BAUD_1200;
1050 return BaudRate::BAUD_1200;
1051 case MYCILA_JSY_MK_1031:
1052 case MYCILA_JSY_MK_333:
1053 return BaudRate::BAUD_4800;
1055 return BaudRate::UNKNOWN;
1061 return BaudRate::UNKNOWN;
1067 case MYCILA_JSY_MK_163:
1068 case MYCILA_JSY_MK_227:
1069 case MYCILA_JSY_MK_229:
1070 return BaudRate::BAUD_9600;
1071 case MYCILA_JSY_MK_1031:
1072 case MYCILA_JSY_MK_333:
1073 return BaudRate::BAUD_19200;
1074 case MYCILA_JSY_MK_193:
1075 case MYCILA_JSY_MK_194:
1076 return BaudRate::BAUD_38400;
1078 return BaudRate::UNKNOWN;
1089 return getMinAvailableBaudRate(model) <= baudRate && baudRate <= getMaxAvailableBaudRate(model);
1093 return _set(address, address ? address : (_lastAddress ? _lastAddress : MYCILA_JSY_ADDRESS_DEFAULT), baudRate);
1097 return _set(address, newAddress, _baudRate);
1100bool Mycila::JSY::_set(
const uint8_t address,
const uint8_t newAddress,
const BaudRate newBaudRate) {
1104 if (newBaudRate == BaudRate::UNKNOWN)
1107 if (newAddress == MYCILA_JSY_ADDRESS_UNKNOWN)
1110 LOGD(TAG,
"set(0x%02X) address=0x%02X, bauds=%" PRIu32, address, newAddress, newBaudRate);
1112 std::lock_guard<std::mutex> lock(_mutex);
1114#ifdef MYCILA_JSY_DEBUG
1115 Serial.printf(
"[JSY] _set(0x%02X)\n", address);
1118 memcpy(_buffer, JSY_REQUEST_SET_COM, JSY_REQUEST_SET_COM_LEN);
1121 _buffer[JSY_REQUEST_SET_ADDRESS] = newAddress;
1124 switch (newBaudRate) {
1125 case BaudRate::BAUD_1200:
1126 _buffer[JSY_REQUEST_SET_BAUDS] = 0x03;
1128 case BaudRate::BAUD_2400:
1129 _buffer[JSY_REQUEST_SET_BAUDS] = 0x04;
1131 case BaudRate::BAUD_4800:
1132 _buffer[JSY_REQUEST_SET_BAUDS] = 0x05;
1134 case BaudRate::BAUD_9600:
1135 _buffer[JSY_REQUEST_SET_BAUDS] = 0x06;
1137 case BaudRate::BAUD_19200:
1138 _buffer[JSY_REQUEST_SET_BAUDS] = 0x07;
1140 case BaudRate::BAUD_38400:
1141 _buffer[JSY_REQUEST_SET_BAUDS] = 0x08;
1148 _send(address, JSY_REQUEST_SET_COM_LEN);
1149 ReadResult result = _timedRead(address, JSY_RESPONSE_SIZE_SET_COM, _baudRate);
1152 if (result != ReadResult::READ_SUCCESS && result != ReadResult::READ_ERROR_ADDRESS) {
1157 if (result == ReadResult::READ_ERROR_ADDRESS && _lastAddress != newAddress) {
1161 _openSerial(newBaudRate);
1163 bool success =
false;
1164 for (
int i = 0; i < MYCILA_JSY_RETRY_COUNT; i++) {
1165 if (_canRead(address, newBaudRate)) {
1173 _baudRate = newBaudRate;
1176 if (_destinationAddress != MYCILA_JSY_ADDRESS_BROADCAST && _destinationAddress == address) {
1177 _destinationAddress = newAddress;
1181 LOGE(TAG,
"Unable to read JSY @ 0x%02X at speed: %" PRIu32, address, newBaudRate);
1182 if (_baudRate != BaudRate::UNKNOWN) {
1183 _openSerial(_baudRate);
1194#ifdef MYCILA_JSON_SUPPORT
1195void Mycila::JSY::toJson(
const JsonObject& root)
const {
1196 root[
"enabled"] = _enabled;
1197 root[
"time"] = _time;
1198 root[
"speed"] = _baudRate;
1207bool Mycila::JSY::_canRead(
const uint8_t address, BaudRate baudRate) {
1208#ifdef MYCILA_JSY_DEBUG
1209 Serial.printf(
"[JSY] _canRead(0x%02X)\n", address);
1211 memcpy(_buffer, JSY_REQUEST_READ_MODEL, JSY_REQUEST_READ_MODEL_LEN);
1212 _send(address, JSY_REQUEST_READ_MODEL_LEN);
1213 return _timedRead(address, JSY_RESPONSE_SIZE_READ_MODEL, baudRate) == ReadResult::READ_SUCCESS;
1216Mycila::JSY::ReadResult Mycila::JSY::_timedRead(
const uint8_t expectedAddress,
const size_t expectedLen,
const BaudRate baudRate) {
1218 while (count < expectedLen) {
1219 size_t read = _serial->readBytes(_buffer + count, expectedLen - count);
1227#ifdef MYCILA_JSY_DEBUG
1228 Serial.printf(
"[JSY] timedRead(0x%02X) %d < ", expectedAddress, count);
1229 for (
size_t i = 0; i < count; i++) {
1230 Serial.printf(
"0x%02X ", _buffer[i]);
1239 LOGD(TAG,
"timedRead(0x%02X) timeout", expectedAddress);
1240 return ReadResult::READ_TIMEOUT;
1244 if (count != expectedLen) {
1245 LOGD(TAG,
"timedRead(0x%02X) error: len %d != %d", expectedAddress, count, expectedLen);
1246 return ReadResult::READ_ERROR_COUNT;
1250 uint16_t crc = _crc16(_buffer, expectedLen - 2);
1251 if (_buffer[expectedLen - 2] != LOBYTE(crc) || _buffer[expectedLen - 1] != HIBYTE(crc)) {
1252 LOGD(TAG,
"timedRead(0x%02X) error: bad CRC 0x%02X 0x%02X != 0x%02X 0x%02X", expectedAddress, _buffer[expectedLen - 2], _buffer[expectedLen - 1], LOBYTE(crc), HIBYTE(crc));
1253 return ReadResult::READ_ERROR_CRC;
1256 _lastAddress = _buffer[JSY_RESPONSE_ADDRESS];
1259 if (expectedAddress != MYCILA_JSY_ADDRESS_BROADCAST && expectedAddress != _lastAddress) {
1260 LOGD(TAG,
"timedRead(0x%02X) error: wrong device address 0x%02X", expectedAddress, _lastAddress);
1261 return ReadResult::READ_ERROR_ADDRESS;
1264 return ReadResult::READ_SUCCESS;
1267void Mycila::JSY::_send(
const uint8_t address,
const size_t len) {
1269 _buffer[JSY_REQUEST_ADDRESS] = address;
1272 uint16_t crc = _crc16(_buffer, len - 2);
1273 _buffer[len - 2] = LOBYTE(crc);
1274 _buffer[len - 1] = HIBYTE(crc);
1276#ifdef MYCILA_JSY_DEBUG
1277 Serial.printf(
"[JSY] send(0x%02X) %d > ", address, len);
1278 for (
size_t i = 0; i < len; i++) {
1279 Serial.printf(
"0x%02X ", _buffer[i]);
1284 _serial->flush(
false);
1285 _serial->write(_buffer, len);
1288size_t Mycila::JSY::_drop() {
1290 if (_serial->available()) {
1291#ifdef MYCILA_JSY_DEBUG
1292 Serial.printf(
"[JSY] drop < ");
1294 while (_serial->available()) {
1295#ifdef MYCILA_JSY_DEBUG
1296 Serial.printf(
"0x%02X ", _serial->read());
1302#ifdef MYCILA_JSY_DEBUG
1309void Mycila::JSY::_openSerial(BaudRate baudRate) {
1310 LOGD(TAG,
"openSerial(%" PRIu32
")", baudRate);
1311 _serial->begin(baudRate, SERIAL_8N1, _pinRX, _pinTX);
1312 _serial->setTimeout(MYCILA_JSY_READ_TIMEOUT_MS);
1315 while (!_serial->availableForWrite())
1318 _serial->flush(
false);
1321Mycila::JSY::BaudRate Mycila::JSY::_detectBauds(
const uint8_t address) {
1322 for (
int i = 0; i < AUTO_DETECT_BAUD_RATES_COUNT * 2; i++) {
1323 BaudRate baudRate = AUTO_DETECT_BAUD_RATES[i % AUTO_DETECT_BAUD_RATES_COUNT];
1324 LOGD(TAG,
"find(0x%02X) %" PRIu32
" bauds", address, baudRate);
1325 _openSerial(baudRate);
1326 for (
int j = 0; j < MYCILA_JSY_RETRY_COUNT; j++) {
1327 if (_canRead(address, baudRate)) {
1332 return BaudRate::UNKNOWN;
1341inline uint16_t Mycila::JSY::_crc16(
const uint8_t* data,
size_t len) {
1342 uint16_t crc = 0xFFFF;
1344 uint8_t temp = *(data++) ^ LOBYTE(crc);
1345 crc = (crc >> 8) ^ pgm_read_word_near(CRCTable + temp);
1350uint8_t Mycila::JSY::_register8(
const uint8_t* buffer,
const uint16_t registerStart,
const uint16_t registerSize,
const uint16_t registerAddress, uint8_t index) {
1351 return buffer[JSY_RESPONSE_DATA + (registerAddress - registerStart) * registerSize + index];
1354uint16_t Mycila::JSY::_register16(
const uint8_t* buffer,
const uint16_t registerStart,
const uint16_t registerSize,
const uint16_t registerAddress) {
1355 const size_t start = JSY_RESPONSE_DATA + (registerAddress - registerStart) * registerSize;
1356 return (buffer[start] << 8) + buffer[start + 1];
1359uint32_t Mycila::JSY::_register32(
const uint8_t* buffer,
const uint16_t registerStart,
const uint16_t registerSize,
const uint16_t registerAddress) {
1360 const size_t start = JSY_RESPONSE_DATA + (registerAddress - registerStart) * registerSize;
1361 return (buffer[start] << 24) +
1362 (buffer[start + 1] << 16) +
1363 (buffer[start + 2] << 8) +
1364 (buffer[start + 3]);
1367const char* Mycila::JSY::getModelName(uint16_t model) {
1369 case MYCILA_JSY_MK_1031:
1370 return MYCILA_JSY_MK_1031_NAME;
1371 case MYCILA_JSY_MK_163:
1372 return MYCILA_JSY_MK_163_NAME;
1373 case MYCILA_JSY_MK_193:
1374 return MYCILA_JSY_MK_193_NAME;
1375 case MYCILA_JSY_MK_194:
1376 return MYCILA_JSY_MK_194_NAME;
1377 case MYCILA_JSY_MK_227:
1378 return MYCILA_JSY_MK_227_NAME;
1379 case MYCILA_JSY_MK_229:
1380 return MYCILA_JSY_MK_229_NAME;
1381 case MYCILA_JSY_MK_333:
1382 return MYCILA_JSY_MK_333_NAME;
1384 return emptyString.c_str();
1388void Mycila::JSY::_jsyTask(
void* params) {
1389 JSY* jsy =
reinterpret_cast<JSY*
>(params);
1390 while (jsy->_enabled) {
1392 if (jsy->_pause > 0) {
1397 }
else if (jsy->_pause > 0) {
1403 jsy->_taskHandle = NULL;
bool read()
Read the JSY values.
void begin(HardwareSerial &serial, int8_t rxPin, int8_t txPin, bool async, uint8_t core=MYCILA_JSY_ASYNC_CORE, uint32_t stackSize=MYCILA_JSY_ASYNC_STACK_SIZE, uint32_t pause=MYCILA_JSY_ASYNC_READ_PAUSE_MS)
Initialize the JSY with the given RX and TX pins.
bool setDeviceAddress(uint8_t newAddress)
Set a new address for a device.
bool resetEnergy()
Reset the energy counters of the JSY.
bool setBaudRate(BaudRate baudRate)
Change the baud rate of the JSY.
BaudRate getMaxAvailableBaudRate() const
Get the maximum available baud rate supported by the current JSY model connected.
bool isBaudRateSupported(BaudRate baudRate) const
Check if a baud rate is supported by the current JSY model connected.
void end()
Ends the JSY communication.
uint16_t readModel()
Reads the JSY model.