forked from osmocom/wireshark
![Dario Lombardo](/assets/img/avatar_default.png)
Change-Id: I92c94448e6641716d03158a5f332c8b53709423a Reviewed-on: https://code.wireshark.org/review/25756 Petri-Dish: Dario Lombardo <lomato@gmail.com> Reviewed-by: Anders Broman <a.broman58@gmail.com>
1686 lines
93 KiB
C
1686 lines
93 KiB
C
/* packet-solaredge.c
|
|
* Dissector routines for the SolarEdge monitoring protocol
|
|
* By Erik de Jong <erikdejong@gmail.com>
|
|
* Copyright 2017 Erik de Jong
|
|
*
|
|
* Wireshark - Network traffic analyzer
|
|
* By Gerald Combs <gerald@wireshark.org>
|
|
* Copyright 1998 Gerald Combs
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include <epan/conversation.h>
|
|
#include <epan/expert.h>
|
|
#include <epan/packet.h>
|
|
#include <epan/prefs.h>
|
|
#include <epan/strutil.h>
|
|
#include <range.h>
|
|
#include <wiretap/wtap.h>
|
|
#include <wsutil/crc16-plain.h>
|
|
#include <wsutil/pint.h>
|
|
#include <wsutil/wsgcrypt.h>
|
|
|
|
#define SOLAREDGE_MAGIC_NUMBER 0x79563412
|
|
#define SOLAREDGE_ENCRYPTION_KEY_LENGTH 16
|
|
#define SOLAREDGE_HEADER_LENGTH 20
|
|
#define SOLAREDGE_POST_HEADER_LENGTH 8
|
|
|
|
#define SOLAREDGE_COMMAND_PARAMS_RESET 0x0010
|
|
#define SOLAREDGE_COMMAND_PARAMS_SET_SINGLE 0x0011
|
|
#define SOLAREDGE_COMMAND_PARAMS_GET_SINGLE 0x0012
|
|
#define SOLAREDGE_COMMAND_PARAMS_GET_INFO 0x0013
|
|
#define SOLAREDGE_COMMAND_PARAMS_GET_NAME 0x0014
|
|
#define SOLAREDGE_COMMAND_PARAMS_GET_NUM 0x0015
|
|
#define SOLAREDGE_COMMAND_PARAMS_GET_ALL 0x0016
|
|
#define SOLAREDGE_COMMAND_PARAMS_SET_ALL 0x0017
|
|
#define SOLAREDGE_COMMAND_PARAMS_SET_SINGLE_NOSAVE 0x0018
|
|
#define SOLAREDGE_COMMAND_PARAMS_SAVE 0x0019
|
|
#define SOLAREDGE_COMMAND_PARAMS_POLICY_ENABLE 0x001a
|
|
#define SOLAREDGE_COMMAND_PARAMS_POLICY_DISABLE 0x001b
|
|
#define SOLAREDGE_COMMAND_PARAMS_POLICY_DISABLE_VOLATILE 0x001c
|
|
#define SOLAREDGE_COMMAND_PARAMS_SET_POLICY_PASSWORD 0x001d
|
|
#define SOLAREDGE_COMMAND_PARAMS_GET_VOLATILE 0x001e
|
|
#define SOLAREDGE_COMMAND_PARAMS_SET_VOLATILE 0x001f
|
|
#define SOLAREDGE_COMMAND_UPGRADE_START 0x0020
|
|
#define SOLAREDGE_COMMAND_UPGRADE_WRITE 0x0021
|
|
#define SOLAREDGE_COMMAND_UPGRADE_FINISH 0x0022
|
|
#define SOLAREDGE_COMMAND_UPGRADE_READ_DATA 0x0023
|
|
#define SOLAREDGE_COMMAND_UPGRADE_READ_SIZE 0x0024
|
|
#define SOLAREDGE_COMMAND_MISC_RESET 0x0030
|
|
#define SOLAREDGE_COMMAND_MISC_STOP 0x0031
|
|
#define SOLAREDGE_COMMAND_MISC_DUMMY 0x0032
|
|
#define SOLAREDGE_COMMAND_MISC_GET_VER 0x0033
|
|
#define SOLAREDGE_COMMAND_MISC_GET_TYPE 0x0034
|
|
#define SOLAREDGE_COMMAND_MISC_PAYLOAD 0x0035
|
|
#define SOLAREDGE_COMMAND_MISC_SET_ID 0x0036
|
|
#define SOLAREDGE_COMMAND_MISC_READ_MEMORY 0x0037
|
|
#define SOLAREDGE_COMMAND_MISC_PARAMS_PARTIAL_RESET 0x0038
|
|
#define SOLAREDGE_COMMAND_MISC_GET_MAX_PACKET_SIZE 0x0039
|
|
#define SOLAREDGE_COMMAND_MISC_ENCRYPTED 0x003d
|
|
#define SOLAREDGE_COMMAND_PARAMS_SMART_LOAD_PARAMS 0x0040
|
|
#define SOLAREDGE_COMMAND_MISC_PARAMS_PARTIAL_RESET2 0x0041
|
|
#define SOLAREDGE_COMMAND_PARAMS_IGNORE_PARAMS_LIST 0x0042
|
|
#define SOLAREDGE_COMMAND_PARAMS_PARTIAL_RESET_AS_LEVEL 0x0043
|
|
#define SOLAREDGE_COMMAND_PARAMS_PARTIAL_RESET_PCB_LEVEL 0x0044
|
|
#define SOLAREDGE_COMMAND_RESP_ACK 0x0080
|
|
#define SOLAREDGE_COMMAND_RESP_NACK 0x0081
|
|
#define SOLAREDGE_COMMAND_RESP_PARAMS_SINGLE 0x0090
|
|
#define SOLAREDGE_COMMAND_RESP_PARAMS_INFO 0x0091
|
|
#define SOLAREDGE_COMMAND_RESP_PARAMS_NAME 0x0092
|
|
#define SOLAREDGE_COMMAND_RESP_PARAMS_NUM 0x0093
|
|
#define SOLAREDGE_COMMAND_RESP_PARAMS_ALL 0x0094
|
|
#define SOLAREDGE_COMMAND_RESP_PARAMS_INCORRECT_PASSWORD 0x0095
|
|
#define SOLAREDGE_COMMAND_RESP_UPGRADE_DATA 0x00a0
|
|
#define SOLAREDGE_COMMAND_RESP_UPGRADE_SIZE 0x00a1
|
|
#define SOLAREDGE_COMMAND_RESP_MISC_GET_VER 0x00b0
|
|
#define SOLAREDGE_COMMAND_RESP_MISC_GET_TYPE 0x00b1
|
|
#define SOLAREDGE_COMMAND_RESP_MISC_PAYLOAD 0x00b2
|
|
#define SOLAREDGE_COMMAND_RESP_MISC_READ_MEMORY 0x00b3
|
|
#define SOLAREDGE_COMMAND_RESP_MISC_GET_MAX_PACKET_SIZE 0x00b4
|
|
#define SOLAREDGE_COMMAND_MERCURY_PWM_SET 0x0100
|
|
#define SOLAREDGE_COMMAND_MERCURY_PWM_ENABLE 0x0101
|
|
#define SOLAREDGE_COMMAND_MERCURY_A2D_SAMPLE 0x0102
|
|
#define SOLAREDGE_COMMAND_MERCURY_KA 0x0103
|
|
#define SOLAREDGE_COMMAND_MERCURY_SET_VIREF 0x0104
|
|
#define SOLAREDGE_COMMAND_MERCURY_SET_VOMAXREF 0x0105
|
|
#define SOLAREDGE_COMMAND_MERCURY_SET_VOMINREF 0x0106
|
|
#define SOLAREDGE_COMMAND_MERCURY_READ_MEAS 0x0107
|
|
#define SOLAREDGE_COMMAND_MERCURY_CLOSED_LOOP_START 0x0108
|
|
#define SOLAREDGE_COMMAND_MERCURY_OPEN_LOOP_START 0x0109
|
|
#define SOLAREDGE_COMMAND_MERCURY_OPEN_LOOP_SET 0x010a
|
|
#define SOLAREDGE_COMMAND_MERCURY_SET_12V_10V 0x010b
|
|
#define SOLAREDGE_COMMAND_MERCURY_SET_5V_35V 0x010c
|
|
#define SOLAREDGE_COMMAND_MERCURY_SET_VO_RANGE 0x010d
|
|
#define SOLAREDGE_COMMAND_MERCURY_START_MPPT 0x010e
|
|
#define SOLAREDGE_COMMAND_MERCURY_TX_ENABLE 0x010f
|
|
#define SOLAREDGE_COMMAND_MERCURY_TX_TEST 0x0110
|
|
#define SOLAREDGE_COMMAND_MERCURY_RX_TEST 0x0111
|
|
#define SOLAREDGE_COMMAND_MERCURY_FORCE_TELEM 0x0112
|
|
#define SOLAREDGE_COMMAND_MERCURY_READ_SAMPLES_DIRECT 0x0113
|
|
#define SOLAREDGE_COMMAND_MERCURY_SET_OTP_BLOCK 0x0114
|
|
#define SOLAREDGE_COMMAND_MERCURY_SET_CAL_MODE 0x0115
|
|
#define SOLAREDGE_COMMAND_MERCURY_SET_VI_RANGE 0x0116
|
|
#define SOLAREDGE_COMMAND_MERCURY_AVG_SAMPLE 0x0117
|
|
#define SOLAREDGE_COMMAND_MERCURY_GET_TELEM 0x0118
|
|
#define SOLAREDGE_COMMAND_MERCURY_DISABLE_PROTECTION 0x0119
|
|
#define SOLAREDGE_COMMAND_MERCURY_BYPASS_MODE 0x011a
|
|
#define SOLAREDGE_COMMAND_MERCURY_SET_TEMP_CAL_PIN 0x011b
|
|
#define SOLAREDGE_COMMAND_MERCURY_SAVE_VOLATILE 0x011c
|
|
#define SOLAREDGE_COMMAND_MERCURY_BBB_MODE 0x011d
|
|
#define SOLAREDGE_COMMAND_MERCURY_GET_REG 0x011e
|
|
#define SOLAREDGE_COMMAND_MERCURY_SET_RES_CIRC_GPIOS 0x011f
|
|
#define SOLAREDGE_COMMAND_MERCURY_GET_SNR 0x0120
|
|
#define SOLAREDGE_COMMAND_MERCURY_GET_LOOP_MODE 0x0121
|
|
#define SOLAREDGE_COMMAND_MERCURY_SET_REG 0x0122
|
|
#define SOLAREDGE_COMMAND_MERCURY_DFT 0x0123
|
|
#define SOLAREDGE_COMMAND_MERCURY_SET_COMM_SW 0x0124
|
|
#define SOLAREDGE_COMMAND_MERCURY_GET_SPI_SAMPLES 0x0125
|
|
#define SOLAREDGE_COMMAND_MERCURY_SET_DT 0x0126
|
|
#define SOLAREDGE_COMMAND_MERCURY_GET_DFT_AVG 0x0127
|
|
#define SOLAREDGE_COMMAND_MERCURY_CONTROL_TEST 0x0128
|
|
#define SOLAREDGE_COMMAND_MERCURY_GET_STATUS_REG 0x0129
|
|
#define SOLAREDGE_COMMAND_MERCURY_RESET_STATUS_REG 0x012a
|
|
#define SOLAREDGE_COMMAND_MERCURY_SET_DPWM_FREQ 0x012b
|
|
#define SOLAREDGE_COMMAND_RESP_MERCURY_SAMPLES 0x0180
|
|
#define SOLAREDGE_COMMAND_RESP_MERCURY_MON 0x0181
|
|
#define SOLAREDGE_COMMAND_RESP_MERCURY_TELEM 0x0182
|
|
#define SOLAREDGE_COMMAND_RESP_MERCURY_MEAS 0x0183
|
|
#define SOLAREDGE_COMMAND_RESP_MERCURY_RX_TEST_RES 0x0184
|
|
#define SOLAREDGE_COMMAND_RESP_MERCURY_SAMPLES_DIRECT 0x0185
|
|
#define SOLAREDGE_COMMAND_RESP_MERCURY_AVG_SAMPLE 0x0186
|
|
#define SOLAREDGE_COMMAND_RESP_MERCURY_GET_TELEM 0x0187
|
|
#define SOLAREDGE_COMMAND_RESP_MERCURY_CONTROL_TEST 0x0188
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_READ_ISE_MEAS1 0x0200
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_READ_ISE_MEAS2 0x0201
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_READ_SE_MEAS 0x0202
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_START_INVERTER 0x0203
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_ISE_DUTY_CYCLE 0x0204
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_GET_SYS_STATUS 0x0205
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_GET_TELEM 0x0206
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_RX_TEST_INIT 0x0207
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_RX_TEST 0x0208
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_TX_TEST_START 0x0209
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_TX_TEST_STOP 0x020a
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_SET_TX_ENABLE 0x020b
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_ENABLE_ISE_WD 0x020c
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_DISABLE_ISE_WD 0x020d
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_GET_COUNTRY_CODE 0x020e
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_SET_COUNTRY 0x020f
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_PRIVILEGED_MODE 0x0210
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_PRIVILEGED_SET_PARAM 0x0211
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_PRIVILEGED_GET_EVENT 0x0212
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_PRIVILEGED_GET_STATUS 0x0213
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_CURRENT_MODEM_START 0x0214
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_CURRENT_MODEM_SEND 0x0215
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_CURRENT_MODEM_SEND_PAIRING 0x0216
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_CURRENT_MODEM_GET_STATUS 0x0217
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_KA_DATA_SEND 0x0218
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_CURRENT_MODEM_END_PAIRING 0x0219
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_FORCE_GRID_MON 0x021a
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_FORCE_SKIP_GRID_MON 0x021b
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_START_SUPERVISE 0x021c
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_READ_A2D_MEAS 0x021d
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_GET_COUNTRY_DEFAULTS 0x021e
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_SET_PRODUCT_MODEL 0x021f
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_GET_PRODUCT_MODEL 0x0220
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_SET_DYNAMIC_INVPWR_PARAM 0x0221
|
|
#define SOLAREDGE_COMMAND_INVERTER_ENTER_BURN_INVPWR_MODE 0x0222
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_MPPT_TRAVEL 0x0223
|
|
#define SOLAREDGE_COMMAND_VENUSMNGR_SET_PWR_PARAM 0x0224
|
|
#define SOLAREDGE_COMMAND_INVERTER_CURRENT_MODEM_SET_DATA_BIT 0x0225
|
|
#define SOLAREDGE_COMMAND_RESP_VENUSMNGR_READ_ISE_MEAS1 0x0280
|
|
#define SOLAREDGE_COMMAND_RESP_VENUSMNGR_READ_ISE_MEAS2 0x0281
|
|
#define SOLAREDGE_COMMAND_RESP_VENUSMNGR_READ_SE_MEAS 0x0282
|
|
#define SOLAREDGE_COMMAND_RESP_VENUSMNGR_GET_SYS_STATUS 0x0283
|
|
#define SOLAREDGE_COMMAND_RESP_VENUSMNGR_GET_TELEM 0x0284
|
|
#define SOLAREDGE_COMMAND_RESP_VENUSMNGR_RX_TEST 0x0285
|
|
#define SOLAREDGE_COMMAND_RESP_VENUSMNGR_GET_COUNTRY_CODE 0x0286
|
|
#define SOLAREDGE_COMMAND_RESP_VENUSMNGR_PRIVILEGED_GET_EVENT 0x0287
|
|
#define SOLAREDGE_COMMAND_RESP_VENUSMNGR_PRIVILEGED_GET_STATUS 0x0288
|
|
#define SOLAREDGE_COMMAND_RESP_VENUSMNGR_CURRENT_MODEM_GET_STATUS 0x0289
|
|
#define SOLAREDGE_COMMAND_RESP_VENUSMNGR_READ_A2D_MEAS 0x028a
|
|
#define SOLAREDGE_COMMAND_RESP_VENUSMNGR_GET_COUNTRY_DEFAULTS 0x028b
|
|
#define SOLAREDGE_COMMAND_RESP_VENUSMNGR_GET_PRODUCT_MODEL 0x028c
|
|
#define SOLAREDGE_COMMAND_RESP_VENUSMNGR_SET_DYNAMIC_ISE_PARAM 0x028d
|
|
#define SOLAREDGE_COMMAND_POLESTAR_TELEMS_START 0x0300
|
|
#define SOLAREDGE_COMMAND_POLESTAR_TELEMS_STOP 0x0301
|
|
#define SOLAREDGE_COMMAND_POLESTAR_MASTER_GRANT 0x0302
|
|
#define SOLAREDGE_COMMAND_POLESTAR_RTC_SET 0x0303
|
|
#define SOLAREDGE_COMMAND_POLESTAR_TEST_RAM 0x0304
|
|
#define SOLAREDGE_COMMAND_POLESTAR_TEST_FLASH 0x0305
|
|
#define SOLAREDGE_COMMAND_POLESTAR_MAC_ADDR_GET 0x0306
|
|
#define SOLAREDGE_COMMAND_POLESTAR_IP_ADDR_GET 0x0307
|
|
#define SOLAREDGE_COMMAND_POLESTAR_SLAVE_ID_DETECT_INIT 0x0308
|
|
#define SOLAREDGE_COMMAND_POLESTAR_SLAVE_ID_DETECT_GET_ID 0x0309
|
|
#define SOLAREDGE_COMMAND_POLESTAR_SLAVE_ID_DETECT_STOP 0x030a
|
|
#define SOLAREDGE_COMMAND_POLESTAR_UART_ZB_BRIDGE 0x030b
|
|
#define SOLAREDGE_COMMAND_POLESTAR_SEND_PING 0x030c
|
|
#define SOLAREDGE_COMMAND_POLESTAR_LCD_TEST_MODE 0x030d
|
|
#define SOLAREDGE_COMMAND_POLESTAR_CONFTOOL_START 0x030e
|
|
#define SOLAREDGE_COMMAND_POLESTAR_ETHERNET_STAT 0x030f
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_FIFO_FLASH_INFO 0x0310
|
|
#define SOLAREDGE_COMMAND_POLESTAR_RESET_FIFO_FLASH 0x0311
|
|
#define SOLAREDGE_COMMAND_POLESTAR_RESET_FLASH 0x0312
|
|
#define SOLAREDGE_COMMAND_POLESTAR_RS485_MSTR_SLV_DET_START 0x0313
|
|
#define SOLAREDGE_COMMAND_POLESTAR_RS485_MSTR_SLV_DET_STATUS 0x0314
|
|
#define SOLAREDGE_COMMAND_POLESTAR_UART_ZB_SET 0x0315
|
|
#define SOLAREDGE_COMMAND_POLESTAR_TCP_TEST 0x0316
|
|
#define SOLAREDGE_COMMAND_POLESTAR_TIMER_ADVANCE 0x0317
|
|
#define SOLAREDGE_COMMAND_POLESTAR_ERASE_FLASH_FIFO_FAST 0x0318
|
|
#define SOLAREDGE_COMMAND_POLESTAR_SELF_KA 0x0319
|
|
#define SOLAREDGE_COMMAND_POLESTAR_ISE_BRIDGE 0x031a
|
|
#define SOLAREDGE_COMMAND_POLESTAR_ERASE_STATISTICS 0x031b
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_POK_STATUS 0x031c
|
|
#define SOLAREDGE_COMMAND_POLESTAR_INVERTER_HW_RESET 0x031d
|
|
#define SOLAREDGE_COMMAND_POLESTAR_ZB_PRESENT_STATUS 0x031e
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_ALL_SUPPORTED_LANGUAGES_INDEXES 0x031f
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_ALL_SUPPORTED_GSM_MODEMS_INDEXES 0x0320
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_S_OK_STATUS 0x0321
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_ENERGY_STATISTICS_STATUS 0x0322
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_GSM_PRESENT_STATUS 0x0323
|
|
#define SOLAREDGE_COMMAND_POLESTAR_SET_STATISTICS_ELEMENT 0x0324
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GEMINI_RS485_MSTR_SLV_DET_START 0x0325
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GEMINI_RS485_MSTR_SLV_DET_STATUS 0x0326
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_GEMINI_GFD_STATUS 0x0327
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_ERROR_LOG 0x0328
|
|
#define SOLAREDGE_COMMAND_POLESTAR_BLOCK_SERVER_CONTROL 0x0329
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_SERVER_CONTROL_STATUS 0x032a
|
|
#define SOLAREDGE_COMMAND_POLESTAR_TEST_SD_FLASH 0x032b
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_WARNING_LOG 0x032c
|
|
#define SOLAREDGE_COMMAND_POLESTAR_RESET_MODBUS_DEVICE_DATA 0x032d
|
|
#define SOLAREDGE_COMMAND_POLESTAR_TURN_OFF_INTERNAL_SRAM_BATTERY_BACKUP 0x032e
|
|
#define SOLAREDGE_COMMAND_POLESTAR_WRITE_LCD 0x032f
|
|
#define SOLAREDGE_COMMAND_POLESTAR_READ_LAST_BUTTONS 0x0330
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_STATISTICS_ELEMENT 0x0331
|
|
#define SOLAREDGE_COMMAND_POLESTAR_SEND_POWER_REDUCER_SLAVE_PACKET 0x0332
|
|
#define SOLAREDGE_COMMAND_POLESTAR_SEND_POWER_REDUCER_MASTER_PACKET 0x0333
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_WIFI_PRESENT_STATUS 0x0334
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_PORT_EXPANDER_GPIO_DATA 0x0335
|
|
#define SOLAREDGE_COMMAND_POLESTAR_SET_PORT_EXPANDER_GPIO_DATA 0x0336
|
|
#define SOLAREDGE_COMMAND_POLESTAR_READ_LCD 0x0337
|
|
#define SOLAREDGE_COMMAND_POLESTAR_SIMULATE_BUTTON_PRESSING 0x0338
|
|
#define SOLAREDGE_COMMAND_POLESTAR_INV_ACTIVATE 0x0339
|
|
#define SOLAREDGE_COMMAND_POLESTAR_MODBUS_SLAVE_PACKET 0x033a
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_BUTTON_STATE 0x033b
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_A2D_VALS 0x033c
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_OPMODE 0x033d
|
|
#define SOLAREDGE_COMMAND_POLESTAR_SET_BACKLIGHT 0x033e
|
|
#define SOLAREDGE_COMMAND_POLESTAR_READ_FIFO_PAGE 0x033f
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_CURRENT_SCREEN_INDEX 0x0340
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_IDENTITY 0x0341
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_SUPPORTED_COMMANDS 0x0342
|
|
#define SOLAREDGE_COMMAND_POLESTAR_PAIRING_START 0x0343
|
|
#define SOLAREDGE_COMMAND_POLESTAR_PAIRING_STATUS 0x0344
|
|
#define SOLAREDGE_COMMAND_POLESTAR_PRODUCT_RESET 0x0345
|
|
#define SOLAREDGE_COMMAND_POLESTAR_PLC_CMD_EXECUTE 0x0346
|
|
#define SOLAREDGE_COMMAND_POLESTAR_GET_STATUS 0x0347
|
|
#define SOLAREDGE_COMMAND_POLESTAR_FIRE_SAFETY_LOCK_MASTER 0x0348
|
|
#define SOLAREDGE_COMMAND_POLESTAR_FIRE_SAFETY_LOCK_SLAVE 0x0349
|
|
#define SOLAREDGE_COMMAND_POLESTAR_FIRE_SAFETY_REPORT 0x034a
|
|
#define SOLAREDGE_COMMAND_POLESTAR_UART_BRIDGE_INIT 0x034b
|
|
#define SOLAREDGE_COMMAND_POLESTAR_SEND_UART_DATA 0x034c
|
|
#define SOLAREDGE_COMMAND_POLESTAR_LED_TEST 0x034d
|
|
#define SOLAREDGE_COMMAND_POLESTAR_SEND_FAKE_TELEMS 0x034e
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_RTC_SET 0x0380
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_MAC_ADDR_GET 0x0381
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_IP_ADDR_GET 0x0382
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_SEND_PING 0x0383
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_ETHERNET_STAT 0x0384
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_FIFO_FLASH_INFO 0x0385
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_RS485_MSTR_SLV_DET_STATUS 0x0386
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_TCP_TEST_RESP 0x0387
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_POK_STATUS 0x0388
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_INVERTER_HW_RESET 0x0389
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_ALL_SUPPORTED_LANGUAGES_INDEXES 0x038a
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_ALL_SUPPORTED_GSM_MODEMS_INDEXES 0x038b
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_S_OK_STATUS 0x038c
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_ENERGY_STATISTICS_STATUS 0x038d
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_GSM_PRESENT_STATUS 0x038e
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GEMINI_RS485_MSTR_SLV_DET_STATUS 0x038f
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_GEMINI_GFD_STATUS 0x0390
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_ERROR_LOG 0x0391
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_SERVER_CONTROL_STATUS 0x0392
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_WARNING_LOG 0x0393
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_READ_LAST_BUTTONS 0x0394
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_STATISTICS_ELEMENT 0x0395
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_WIFI_PRESENT_STATUS 0x0396
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_PORT_EXPANDER_GPIO_DATA 0x0397
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_READ_LCD 0x0398
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_MODBUS_SLAVE_PACKET 0x0399
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_MASTER_GRANT_ACK 0x039a
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_IDENTITY 0x039b
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_SUPPORTED_COMMANDS 0x039c
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_PAIRING_START 0x039d
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_PAIRING_STATUS 0x039e
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_GET_STATUS 0x039f
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_FIRE_SAFETY_REPORT 0x03a0
|
|
#define SOLAREDGE_COMMAND_RESP_POLESTAR_SEND_UART_DATA 0x03a1
|
|
#define SOLAREDGE_COMMAND_SUNTRACER_READ_FLASH 0x0400
|
|
#define SOLAREDGE_COMMAND_SUNTRACER_START 0x0401
|
|
#define SOLAREDGE_COMMAND_SUNTRACER_SET_RTC 0x0402
|
|
#define SOLAREDGE_COMMAND_SUNTRACER_DEL_FLASH 0x0403
|
|
#define SOLAREDGE_COMMAND_SUNTRACER_DEL_FLASH_SECTOR 0x0404
|
|
#define SOLAREDGE_COMMAND_RESP_SUNTRACER_TRACE 0x0480
|
|
#define SOLAREDGE_COMMAND_RESP_SUNTRACER_FLASH 0x0481
|
|
#define SOLAREDGE_COMMAND_SERVER_POST_DATA 0x0500
|
|
#define SOLAREDGE_COMMAND_SERVER_GET_GMT 0x0501
|
|
#define SOLAREDGE_COMMAND_SERVER_GET_NAME 0x0502
|
|
#define SOLAREDGE_COMMAND_SERVER_SET_KEY 0x0503
|
|
#define SOLAREDGE_COMMAND_RESP_SERVER_GMT 0x0580
|
|
#define SOLAREDGE_COMMAND_RESP_SERVER_NAME 0x0581
|
|
#define SOLAREDGE_COMMAND_RESP_CONFTOOL_PLC_DATA 0x0680
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_READ_JUPPWR_MEAS1 0x0800
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_READ_JUPPWR_MEAS2 0x0801
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_READ_JUPPWR_MEAS3 0x0802
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_READ_JUPPWR_MEAS4 0x0803
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_READ_JUPPWR_MEAS5 0x0804
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_READ_MEAS 0x0805
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_GET_SYS_STATUS 0x0806
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_GET_TELEM 0x0807
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_GET_COUNTRY_CODE 0x0808
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_SET_COUNTRY 0x0809
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_GET_COUNTRY_DEFAULTS 0x080a
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_PRIVILEGED_MODE 0x080b
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_PRIVILEGED_SET_PARAM 0x080c
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_PRIVILEGED_GET_EVENT 0x080d
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_PRIVILEGED_GET_STATUS 0x080e
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_SET_PRODUCT_MODEL 0x080f
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_GET_PRODUCT_MODEL 0x0810
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_DYNAMIC_SET_INVPWR_PARAM 0x0811
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_GET_INVPWR_PARAM_TYPE 0x0812
|
|
#define SOLAREDGE_COMMAND_JUPMNGR_GET_FANS_STATUS 0x0813
|
|
#define SOLAREDGE_COMMAND_RESP_JUPMNGR_READ_JUPPWR_MEAS1 0x0880
|
|
#define SOLAREDGE_COMMAND_RESP_JUPMNGR_READ_JUPPWR_MEAS2 0x0881
|
|
#define SOLAREDGE_COMMAND_RESP_JUPMNGR_READ_JUPPWR_MEAS3 0x0882
|
|
#define SOLAREDGE_COMMAND_RESP_JUPMNGR_READ_JUPPWR_MEAS4 0x0883
|
|
#define SOLAREDGE_COMMAND_RESP_JUPMNGR_READ_JUPPWR_MEAS5 0x0884
|
|
#define SOLAREDGE_COMMAND_RESP_JUPMNGR_READ_MEAS 0x0885
|
|
#define SOLAREDGE_COMMAND_RESP_JUPMNGR_GET_SYS_STATUS 0x0886
|
|
#define SOLAREDGE_COMMAND_RESP_JUPMNGR_GET_TELEM 0x0887
|
|
#define SOLAREDGE_COMMAND_RESP_JUPMNGR_GET_COUNTRY_CODE 0x0888
|
|
#define SOLAREDGE_COMMAND_RESP_JUPMNGR_GET_COUNTRY_DEFAULTS 0x0889
|
|
#define SOLAREDGE_COMMAND_RESP_JUPMNGR_PRIVILEGED_GET_EVENT 0x088a
|
|
#define SOLAREDGE_COMMAND_RESP_JUPMNGR_PRIVILEGED_GET_STATUS 0x088b
|
|
#define SOLAREDGE_COMMAND_RESP_JUPMNGR_GET_PRODUCT_MODEL 0x088c
|
|
#define SOLAREDGE_COMMAND_RESP_JUPMNGR_GET_INVPWR_PARAM_TYPE 0x088d
|
|
#define SOLAREDGE_COMMAND_RESP_JUPMNGR_GET_FANS_STATUS 0x088e
|
|
#define SOLAREDGE_COMMAND_INVERTER_TURN_15V_ON 0x0900
|
|
#define SOLAREDGE_COMMAND_INVERTER_TURN_15V_OFF 0x0901
|
|
#define SOLAREDGE_COMMAND_INVERTER_ENABLE_RELAYS 0x0902
|
|
#define SOLAREDGE_COMMAND_INVERTER_DISABLE_RELAYS 0x0903
|
|
#define SOLAREDGE_COMMAND_INVERTER_DYNAMIC_POWER_LIMIT 0x0904
|
|
#define SOLAREDGE_COMMAND_INVERTER_IVTRACE_START 0x0905
|
|
#define SOLAREDGE_COMMAND_INVERTER_GRID_TRIP_TEST 0x0906
|
|
#define SOLAREDGE_COMMAND_INVERTER_SET_LMVGC_PARAMS1 0x0907
|
|
#define SOLAREDGE_COMMAND_INVERTER_GET_LMVGC_PARAMS1 0x0908
|
|
#define SOLAREDGE_COMMAND_INVERTER_SET_PWR_GAIN_PARAMS 0x0909
|
|
#define SOLAREDGE_COMMAND_INVERTER_SET_LMVGC_PARAMS2 0x090a
|
|
#define SOLAREDGE_COMMAND_INVERTER_GET_LMVGC_PARAMS2 0x090b
|
|
#define SOLAREDGE_COMMAND_INVERTER_SET_LMVGC_PARAMS3 0x090c
|
|
#define SOLAREDGE_COMMAND_INVERTER_GET_LMVGC_PARAMS3 0x090d
|
|
#define SOLAREDGE_COMMAND_INVERTER_LOCK_IN 0x090e
|
|
#define SOLAREDGE_COMMAND_INVERTER_LOCK_OUT 0x090f
|
|
#define SOLAREDGE_COMMAND_INVERTER_GET_VDC 0x0910
|
|
#define SOLAREDGE_COMMAND_INVERTER_PAIRING_DO_NOTHING 0x0911
|
|
#define SOLAREDGE_COMMAND_INVERTER_PAIRING_DO_SAFETY 0x0912
|
|
#define SOLAREDGE_COMMAND_RESP_INVERTER_DYNAMIC_POWER_LIMIT 0x0980
|
|
#define SOLAREDGE_COMMAND_RESP_INVERTER_GET_LMVGC_PARAMS 0x0981
|
|
#define SOLAREDGE_COMMAND_VEGA_READ_MEAS 0x0a00
|
|
#define SOLAREDGE_COMMAND_VEGA_GET_SYS_STATUS 0x0a01
|
|
#define SOLAREDGE_COMMAND_VEGA_GET_TELEM 0x0a02
|
|
#define SOLAREDGE_COMMAND_VEGA_GET_MAX_VDC_VALUE 0x0a03
|
|
#define SOLAREDGE_COMMAND_VEGA_SET_MAX_VDC_VALUE 0x0a04
|
|
#define SOLAREDGE_COMMAND_VEGA_RELAY_SET 0x0a05
|
|
#define SOLAREDGE_COMMAND_VEGA_SET_OPMODE 0x0a06
|
|
#define SOLAREDGE_COMMAND_VEGA_GET_OPMODE 0x0a07
|
|
#define SOLAREDGE_COMMAND_VEGA_SET_RANGE 0x0a08
|
|
#define SOLAREDGE_COMMAND_RESP_VEGA_READ_MEAS 0x0a80
|
|
#define SOLAREDGE_COMMAND_RESP_VEGA_GET_SYS_STATUS 0x0a81
|
|
#define SOLAREDGE_COMMAND_RESP_VEGA_GET_TELEM 0x0a82
|
|
#define SOLAREDGE_COMMAND_RESP_VEGA_GET_MAX_VDC_VALUE 0x0a83
|
|
#define SOLAREDGE_COMMAND_COMBI_PAUSE_MONITORING 0x0b00
|
|
#define SOLAREDGE_COMMAND_COMBI_SET_TIME_STAMP 0x0b01
|
|
#define SOLAREDGE_COMMAND_COMBI_RCD_CALIBRATION 0x0b02
|
|
#define SOLAREDGE_COMMAND_COMBI_GET_TELEM 0x0b03
|
|
#define SOLAREDGE_COMMAND_COMBI_FORCE_TELEM 0x0b04
|
|
#define SOLAREDGE_COMMAND_COMBI_SWITCHES_CONNECT 0x0b05
|
|
#define SOLAREDGE_COMMAND_COMBI_SWITCHES_DISCONNECT 0x0b06
|
|
#define SOLAREDGE_COMMAND_COMBI_SWITCHES_CONNECT_ALL 0x0b07
|
|
#define SOLAREDGE_COMMAND_COMBI_SWITCHES_DISCONNECT_ALL 0x0b08
|
|
#define SOLAREDGE_COMMAND_COMBI_RCD_TEST_EXECUTE 0x0b09
|
|
#define SOLAREDGE_COMMAND_COMBI_RELAYS_TEST_EXECUTE 0x0b0a
|
|
#define SOLAREDGE_COMMAND_COMBI_GET_COMBISTRING_PARAM 0x0b0b
|
|
#define SOLAREDGE_COMMAND_COMBI_SET_COMBISTRING_PARAM 0x0b0c
|
|
#define SOLAREDGE_COMMAND_COMBI_GET_ALL_COMBISTRING_PARAMS 0x0b0d
|
|
#define SOLAREDGE_COMMAND_COMBI_GET_ALL_COMBI_PARAMS 0x0b0e
|
|
#define SOLAREDGE_COMMAND_COMBI_READ_MEASUREMENTS 0x0b0f
|
|
#define SOLAREDGE_COMMAND_COMBI_GET_STRING_STATUS 0x0b10
|
|
#define SOLAREDGE_COMMAND_COMBI_GET_COMBI_STATUS 0x0b11
|
|
#define SOLAREDGE_COMMAND_COMBI_GET_ACTIVE_STRINGS 0x0b12
|
|
#define SOLAREDGE_COMMAND_COMBI_FWD_STRING_TELEM 0x0b13
|
|
#define SOLAREDGE_COMMAND_COMBI_FWD_COMBI_TELEM 0x0b14
|
|
#define SOLAREDGE_COMMAND_COMBI_GET_UNIFIED_STRING_STATUS 0x0b15
|
|
#define SOLAREDGE_COMMAND_COMBI_GET_UNIFIED_COMBI_STATUS 0x0b16
|
|
#define SOLAREDGE_COMMAND_COMBI_CHECK_INNER_PROTOCOL 0x0b17
|
|
#define SOLAREDGE_COMMAND_COMBI_SWITCHES_CONNECT_RELAY 0x0b18
|
|
#define SOLAREDGE_COMMAND_COMBI_SWITCHES_DISCONNECT_RELAY 0x0b19
|
|
#define SOLAREDGE_COMMAND_COMBI_GET_GEMINI_STRING_IDS 0x0b1a
|
|
#define SOLAREDGE_COMMAND_COMBI_GET_ALL_SWITCHES_STATUS 0x0b1b
|
|
#define SOLAREDGE_COMMAND_COMBI_SET_RCD_TEST_PIN 0x0b1c
|
|
#define SOLAREDGE_COMMAND_COMBI_RELAYS_TEST_CHECK_CONDS 0x0b1d
|
|
#define SOLAREDGE_COMMAND_RESP_COMBI_GET_TELEM 0x0b80
|
|
#define SOLAREDGE_COMMAND_RESP_COMBI_GET_STRING_STATUS 0x0b81
|
|
#define SOLAREDGE_COMMAND_RESP_COMBI_GET_COMBI_STATUS 0x0b82
|
|
#define SOLAREDGE_COMMAND_RESP_COMBI_GET_ACTIVE_STRINGS 0x0b83
|
|
#define SOLAREDGE_COMMAND_RESP_COMBI_GET_UNIFIED_STRING_STATUS 0x0b84
|
|
#define SOLAREDGE_COMMAND_RESP_COMBI_GET_UNIFIED_COMBI_STATUS 0x0b85
|
|
#define SOLAREDGE_COMMAND_RESP_COMBI_GET_GEMINI_STRING_IDS 0x0b86
|
|
#define SOLAREDGE_COMMAND_INVPWR_GET_ERROR_STATUS 0x0c00
|
|
#define SOLAREDGE_COMMAND_INVPWR_GET_STATUS 0x0c01
|
|
#define SOLAREDGE_COMMAND_INVPWR_GO 0x0c02
|
|
#define SOLAREDGE_COMMAND_INVPWR_HALT 0x0c03
|
|
#define SOLAREDGE_COMMAND_INVPWR_CONST_DUTY_CYCLE 0x0c04
|
|
#define SOLAREDGE_COMMAND_INVPWR_DUMY_ERROR 0x0c05
|
|
#define SOLAREDGE_COMMAND_INVPWR_PAIRING_SET_STATE 0x0c06
|
|
#define SOLAREDGE_COMMAND_INVPWR_TEST_IAC_CONTROL 0x0c07
|
|
#define SOLAREDGE_COMMAND_RESP_INVPWR_GET_ERROR_STATUS 0x0c80
|
|
#define SOLAREDGE_COMMAND_RESP_INVPWR_GET_STATUS 0x0c81
|
|
#define SOLAREDGE_COMMAND_RESP_INVPWR_GO 0x0c82
|
|
#define SOLAREDGE_COMMAND_RESP_INVPWR_HALT 0x0c83
|
|
#define SOLAREDGE_COMMAND_RESP_INVPWR_CONST_DUTY_CYCLE 0x0c84
|
|
#define SOLAREDGE_COMMAND_RESP_INVPWR_DUMY_ERROR 0x0c85
|
|
#define SOLAREDGE_COMMAND_BOOTLOADER_SECURE 0x1400
|
|
#define SOLAREDGE_COMMAND_BOOTLOADER_UNSECURE 0x1401
|
|
#define SOLAREDGE_COMMAND_ACTIVATOR_ACTIVATE 0x1500
|
|
#define SOLAREDGE_COMMAND_ACTIVATOR_GET_ADC_SAMPLES 0x1501
|
|
#define SOLAREDGE_COMMAND_ACTIVATOR_SET_VO_RANGE 0x1502
|
|
#define SOLAREDGE_COMMAND_ACTIVATOR_GET_AVG_SAMPLES 0x1503
|
|
#define SOLAREDGE_COMMAND_ACTIVATOR_TX_TEST 0x1504
|
|
#define SOLAREDGE_COMMAND_ACTIVATOR_LCD_TEST 0x1505
|
|
#define SOLAREDGE_COMMAND_ACTIVATOR_BUTTONS_TEST 0x1506
|
|
#define SOLAREDGE_COMMAND_FANCONTROL_SET_PWM 0x1600
|
|
#define SOLAREDGE_COMMAND_FANCONTROL_GET_PWM 0x1601
|
|
#define SOLAREDGE_COMMAND_FANCONTROL_GET_ALL_PWM 0x1602
|
|
#define SOLAREDGE_COMMAND_FANCONTROL_SHUT_ALL_PWM 0x1603
|
|
#define SOLAREDGE_COMMAND_FANCONTROL_RES 0x1680
|
|
#define SOLAREDGE_COMMAND_DISPLAY_BOARD_LCD_WRITE 0x1700
|
|
#define SOLAREDGE_COMMAND_DISPLAY_BOARD_LED_SET 0x1701
|
|
|
|
#define SOLAREDGE_DEVICETYPE_OPTIMIZER 0x0000
|
|
#define SOLAREDGE_DEVICETYPE_INVERTER_1PHASE 0x0010
|
|
#define SOLAREDGE_DEVICETYPE_INVERTER_3PHASE 0x0011
|
|
#define SOLAREDGE_DEVICETYPE_OPTIMIZER2 0x0080
|
|
#define SOLAREDGE_DEVICETYPE_EVENT 0x0300
|
|
|
|
typedef struct solaredge_packet_header {
|
|
guint16 length;
|
|
guint16 length_inverse;
|
|
guint16 sequence_number;
|
|
guint32 source_address;
|
|
guint32 destination_address;
|
|
guint16 command_type;
|
|
} t_solaredge_packet_header;
|
|
|
|
typedef struct solaredge_device_header {
|
|
guint16 type;
|
|
guint32 id;
|
|
guint16 device_length;
|
|
} t_solaredge_device_header;
|
|
|
|
typedef struct solaredge_conversion_data {
|
|
gboolean session_key_found;
|
|
gcry_cipher_hd_t cipher_hd_session;
|
|
guint16 expected_sequence_number;
|
|
} t_solaredge_conversion_data;
|
|
|
|
void proto_reg_handoff_solaredge(void);
|
|
void proto_register_solaredge(void);
|
|
|
|
static gboolean global_show_unknown_fields = TRUE;
|
|
|
|
static expert_field ei_solaredge_invalid_length = EI_INIT;
|
|
static expert_field ei_solaredge_invalid_crc = EI_INIT;
|
|
|
|
static int proto_solaredge = -1;
|
|
|
|
static int hf_solaredge_length_type = -1;
|
|
static int hf_solaredge_length_inverse_type = -1;
|
|
static int hf_solaredge_sequence_number_type = -1;
|
|
static int hf_solaredge_source_address_type = -1;
|
|
static int hf_solaredge_destination_address_type = -1;
|
|
static int hf_solaredge_command_type = -1;
|
|
static int hf_solaredge_crc_type = -1;
|
|
static int hf_solaredge_crc_status_type = -1;
|
|
|
|
static int hf_solaredge_payload_type = -1;
|
|
|
|
static int hf_solaredge_session_key_type = -1;
|
|
|
|
static int hf_solaredge_post_type = -1;
|
|
static int hf_solaredge_post_device_type = -1;
|
|
static int hf_solaredge_post_device_type_type = -1;
|
|
static int hf_solaredge_post_device_id_type = -1;
|
|
static int hf_solaredge_post_length_type = -1;
|
|
|
|
static int hf_solaredge_post_padding_uint32_type = -1;
|
|
static int hf_solaredge_post_padding_float_type = -1;
|
|
|
|
static int hf_solaredge_post_singlephase_inverter_timestamp_type = -1;
|
|
static int hf_solaredge_post_singlephase_inverter_uptime_type = -1;
|
|
static int hf_solaredge_post_singlephase_inverter_interval_type = -1;
|
|
static int hf_solaredge_post_singlephase_inverter_temperature_type = -1;
|
|
static int hf_solaredge_post_singlephase_inverter_energy_day_type = -1;
|
|
static int hf_solaredge_post_singlephase_inverter_energy_interval_type = -1;
|
|
static int hf_solaredge_post_singlephase_inverter_ac_voltage_type = -1;
|
|
static int hf_solaredge_post_singlephase_inverter_ac_current_type = -1;
|
|
static int hf_solaredge_post_singlephase_inverter_ac_frequency_type = -1;
|
|
static int hf_solaredge_post_singlephase_inverter_dc_voltage_type = -1;
|
|
static int hf_solaredge_post_singlephase_inverter_energy_total_type = -1;
|
|
static int hf_solaredge_post_singlephase_inverter_power_max_type = -1;
|
|
static int hf_solaredge_post_singlephase_inverter_ac_power_type = -1;
|
|
|
|
static int hf_solaredge_post_optimizer_inverter_type = -1;
|
|
static int hf_solaredge_post_optimizer_uptime_type = -1;
|
|
static int hf_solaredge_post_optimizer_dc_current_panel_type = -1;
|
|
static int hf_solaredge_post_optimizer_timestamp_type = -1;
|
|
static int hf_solaredge_post_optimizer_uptime_short_type = -1;
|
|
static int hf_solaredge_post_optimizer_dc_voltage_panel_type = -1;
|
|
static int hf_solaredge_post_optimizer_dc_voltage_optimzer_type = -1;
|
|
static int hf_solaredge_post_optimizer_dc_current_optimzer_type = -1;
|
|
static int hf_solaredge_post_optimizer_energy_day_type = -1;
|
|
static int hf_solaredge_post_optimizer_temperature_type = -1;
|
|
|
|
static int hf_solaredge_post_event_timestamp_type = -1;
|
|
static int hf_solaredge_post_event_type_type = -1;
|
|
static int hf_solaredge_post_event_event_start_timestamp_type = -1;
|
|
static int hf_solaredge_post_event_event_timezone_offset_type = -1;
|
|
static int hf_solaredge_post_event_event_end_timestamp_type = -1;
|
|
|
|
static gint ett_solaredge_packet = -1;
|
|
static gint ett_solaredge_packet_decrypted = -1;
|
|
static gint ett_solaredge_packet_post = -1;
|
|
static gint ett_solaredge_packet_post_device = -1;
|
|
|
|
static const value_string solaredge_packet_commandtypes[] = {
|
|
{ SOLAREDGE_COMMAND_PARAMS_RESET, "PARAMS_RESET" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_SET_SINGLE, "PARAMS_SET_SINGLE" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_GET_SINGLE, "PARAMS_GET_SINGLE" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_GET_INFO, "PARAMS_GET_INFO" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_GET_NAME, "PARAMS_GET_NAME" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_GET_NUM, "PARAMS_GET_NUM" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_GET_ALL, "PARAMS_GET_ALL" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_SET_ALL, "PARAMS_SET_ALL" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_SET_SINGLE_NOSAVE, "PARAMS_SET_SINGLE_NOSAVE" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_SAVE, "PARAMS_SAVE" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_POLICY_ENABLE, "PARAMS_POLICY_ENABLE" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_POLICY_DISABLE, "PARAMS_POLICY_DISABLE" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_POLICY_DISABLE_VOLATILE, "PARAMS_POLICY_DISABLE_VOLATILE" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_SET_POLICY_PASSWORD, "PARAMS_SET_POLICY_PASSWORD" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_GET_VOLATILE, "PARAMS_GET_VOLATILE" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_SET_VOLATILE, "PARAMS_SET_VOLATILE" },
|
|
{ SOLAREDGE_COMMAND_UPGRADE_START, "UPGRADE_START" },
|
|
{ SOLAREDGE_COMMAND_UPGRADE_WRITE, "UPGRADE_WRITE" },
|
|
{ SOLAREDGE_COMMAND_UPGRADE_FINISH, "UPGRADE_FINISH" },
|
|
{ SOLAREDGE_COMMAND_UPGRADE_READ_DATA, "UPGRADE_READ_DATA" },
|
|
{ SOLAREDGE_COMMAND_UPGRADE_READ_SIZE, "UPGRADE_READ_SIZE" },
|
|
{ SOLAREDGE_COMMAND_MISC_RESET, "MISC_RESET" },
|
|
{ SOLAREDGE_COMMAND_MISC_STOP, "MISC_STOP" },
|
|
{ SOLAREDGE_COMMAND_MISC_DUMMY, "MISC_DUMMY" },
|
|
{ SOLAREDGE_COMMAND_MISC_GET_VER, "MISC_GET_VER" },
|
|
{ SOLAREDGE_COMMAND_MISC_GET_TYPE, "MISC_GET_TYPE" },
|
|
{ SOLAREDGE_COMMAND_MISC_PAYLOAD, "MISC_PAYLOAD" },
|
|
{ SOLAREDGE_COMMAND_MISC_SET_ID, "MISC_SET_ID" },
|
|
{ SOLAREDGE_COMMAND_MISC_READ_MEMORY, "MISC_READ_MEMORY" },
|
|
{ SOLAREDGE_COMMAND_MISC_PARAMS_PARTIAL_RESET, "MISC_PARAMS_PARTIAL_RESET" },
|
|
{ SOLAREDGE_COMMAND_MISC_GET_MAX_PACKET_SIZE, "MISC_GET_MAX_PACKET_SIZE" },
|
|
{ SOLAREDGE_COMMAND_MISC_ENCRYPTED, "MISC_ENCRYPTED" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_SMART_LOAD_PARAMS, "PARAMS_SMART_LOAD_PARAMS" },
|
|
{ SOLAREDGE_COMMAND_MISC_PARAMS_PARTIAL_RESET2, "MISC_PARAMS_PARTIAL_RESET2" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_IGNORE_PARAMS_LIST, "PARAMS_IGNORE_PARAMS_LIST" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_PARTIAL_RESET_AS_LEVEL, "PARAMS_PARTIAL_RESET_AS_LEVEL" },
|
|
{ SOLAREDGE_COMMAND_PARAMS_PARTIAL_RESET_PCB_LEVEL, "PARAMS_PARTIAL_RESET_PCB_LEVEL" },
|
|
{ SOLAREDGE_COMMAND_RESP_ACK, "RESP_ACK" },
|
|
{ SOLAREDGE_COMMAND_RESP_NACK, "RESP_NACK" },
|
|
{ SOLAREDGE_COMMAND_RESP_PARAMS_SINGLE, "RESP_PARAMS_SINGLE" },
|
|
{ SOLAREDGE_COMMAND_RESP_PARAMS_INFO, "RESP_PARAMS_INFO" },
|
|
{ SOLAREDGE_COMMAND_RESP_PARAMS_NAME, "RESP_PARAMS_NAME" },
|
|
{ SOLAREDGE_COMMAND_RESP_PARAMS_NUM, "RESP_PARAMS_NUM" },
|
|
{ SOLAREDGE_COMMAND_RESP_PARAMS_ALL, "RESP_PARAMS_ALL" },
|
|
{ SOLAREDGE_COMMAND_RESP_PARAMS_INCORRECT_PASSWORD, "RESP_PARAMS_INCORRECT_PASSWORD" },
|
|
{ SOLAREDGE_COMMAND_RESP_UPGRADE_DATA, "RESP_UPGRADE_DATA" },
|
|
{ SOLAREDGE_COMMAND_RESP_UPGRADE_SIZE, "RESP_UPGRADE_SIZE" },
|
|
{ SOLAREDGE_COMMAND_RESP_MISC_GET_VER, "RESP_MISC_GET_VER" },
|
|
{ SOLAREDGE_COMMAND_RESP_MISC_GET_TYPE, "RESP_MISC_GET_TYPE" },
|
|
{ SOLAREDGE_COMMAND_RESP_MISC_PAYLOAD, "RESP_MISC_PAYLOAD" },
|
|
{ SOLAREDGE_COMMAND_RESP_MISC_READ_MEMORY, "RESP_MISC_READ_MEMORY" },
|
|
{ SOLAREDGE_COMMAND_RESP_MISC_GET_MAX_PACKET_SIZE, "RESP_MISC_GET_MAX_PACKET_SIZE" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_PWM_SET, "MERCURY_PWM_SET" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_PWM_ENABLE, "MERCURY_PWM_ENABLE" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_A2D_SAMPLE, "MERCURY_A2D_SAMPLE" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_KA, "MERCURY_KA" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_SET_VIREF, "MERCURY_SET_VIREF" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_SET_VOMAXREF, "MERCURY_SET_VOMAXREF" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_SET_VOMINREF, "MERCURY_SET_VOMINREF" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_READ_MEAS, "MERCURY_READ_MEAS" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_CLOSED_LOOP_START, "MERCURY_CLOSED_LOOP_START" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_OPEN_LOOP_START, "MERCURY_OPEN_LOOP_START" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_OPEN_LOOP_SET, "MERCURY_OPEN_LOOP_SET" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_SET_12V_10V, "MERCURY_SET_12V_10V" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_SET_5V_35V, "MERCURY_SET_5V_35V" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_SET_VO_RANGE, "MERCURY_SET_VO_RANGE" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_START_MPPT, "MERCURY_START_MPPT" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_TX_ENABLE, "MERCURY_TX_ENABLE" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_TX_TEST, "MERCURY_TX_TEST" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_RX_TEST, "MERCURY_RX_TEST" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_FORCE_TELEM, "MERCURY_FORCE_TELEM" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_READ_SAMPLES_DIRECT, "MERCURY_READ_SAMPLES_DIRECT" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_SET_OTP_BLOCK, "MERCURY_SET_OTP_BLOCK" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_SET_CAL_MODE, "MERCURY_SET_CAL_MODE" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_SET_VI_RANGE, "MERCURY_SET_VI_RANGE" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_AVG_SAMPLE, "MERCURY_AVG_SAMPLE" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_GET_TELEM, "MERCURY_GET_TELEM" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_DISABLE_PROTECTION, "MERCURY_DISABLE_PROTECTION" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_BYPASS_MODE, "MERCURY_BYPASS_MODE" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_SET_TEMP_CAL_PIN, "MERCURY_SET_TEMP_CAL_PIN" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_SAVE_VOLATILE, "MERCURY_SAVE_VOLATILE" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_BBB_MODE, "MERCURY_BBB_MODE" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_GET_REG, "MERCURY_GET_REG" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_SET_RES_CIRC_GPIOS, "MERCURY_SET_RES_CIRC_GPIOS" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_GET_SNR, "MERCURY_GET_SNR" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_GET_LOOP_MODE, "MERCURY_GET_LOOP_MODE" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_SET_REG, "MERCURY_SET_REG" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_DFT, "MERCURY_DFT" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_SET_COMM_SW, "MERCURY_SET_COMM_SW" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_GET_SPI_SAMPLES, "MERCURY_GET_SPI_SAMPLES" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_SET_DT, "MERCURY_SET_DT" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_GET_DFT_AVG, "MERCURY_GET_DFT_AVG" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_CONTROL_TEST, "MERCURY_CONTROL_TEST" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_GET_STATUS_REG, "MERCURY_GET_STATUS_REG" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_RESET_STATUS_REG, "MERCURY_RESET_STATUS_REG" },
|
|
{ SOLAREDGE_COMMAND_MERCURY_SET_DPWM_FREQ, "MERCURY_SET_DPWM_FREQ" },
|
|
{ SOLAREDGE_COMMAND_RESP_MERCURY_SAMPLES, "RESP_MERCURY_SAMPLES" },
|
|
{ SOLAREDGE_COMMAND_RESP_MERCURY_MON, "RESP_MERCURY_MON" },
|
|
{ SOLAREDGE_COMMAND_RESP_MERCURY_TELEM, "RESP_MERCURY_TELEM" },
|
|
{ SOLAREDGE_COMMAND_RESP_MERCURY_MEAS, "RESP_MERCURY_MEAS" },
|
|
{ SOLAREDGE_COMMAND_RESP_MERCURY_RX_TEST_RES, "RESP_MERCURY_RX_TEST_RES" },
|
|
{ SOLAREDGE_COMMAND_RESP_MERCURY_SAMPLES_DIRECT, "RESP_MERCURY_SAMPLES_DIRECT" },
|
|
{ SOLAREDGE_COMMAND_RESP_MERCURY_AVG_SAMPLE, "RESP_MERCURY_AVG_SAMPLE" },
|
|
{ SOLAREDGE_COMMAND_RESP_MERCURY_GET_TELEM, "RESP_MERCURY_GET_TELEM" },
|
|
{ SOLAREDGE_COMMAND_RESP_MERCURY_CONTROL_TEST, "RESP_MERCURY_CONTROL_TEST" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_READ_ISE_MEAS1, "VENUSMNGR_READ_ISE_MEAS1" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_READ_ISE_MEAS2, "VENUSMNGR_READ_ISE_MEAS2" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_READ_SE_MEAS, "VENUSMNGR_READ_SE_MEAS" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_START_INVERTER, "VENUSMNGR_START_INVERTER" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_ISE_DUTY_CYCLE, "VENUSMNGR_ISE_DUTY_CYCLE" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_GET_SYS_STATUS, "VENUSMNGR_GET_SYS_STATUS" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_GET_TELEM, "VENUSMNGR_GET_TELEM" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_RX_TEST_INIT, "VENUSMNGR_RX_TEST_INIT" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_RX_TEST, "VENUSMNGR_RX_TEST" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_TX_TEST_START, "VENUSMNGR_TX_TEST_START" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_TX_TEST_STOP, "VENUSMNGR_TX_TEST_STOP" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_SET_TX_ENABLE, "VENUSMNGR_SET_TX_ENABLE" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_ENABLE_ISE_WD, "VENUSMNGR_ENABLE_ISE_WD" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_DISABLE_ISE_WD, "VENUSMNGR_DISABLE_ISE_WD" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_GET_COUNTRY_CODE, "VENUSMNGR_GET_COUNTRY_CODE" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_SET_COUNTRY, "VENUSMNGR_SET_COUNTRY" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_PRIVILEGED_MODE, "VENUSMNGR_PRIVILEGED_MODE" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_PRIVILEGED_SET_PARAM, "VENUSMNGR_PRIVILEGED_SET_PARAM" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_PRIVILEGED_GET_EVENT, "VENUSMNGR_PRIVILEGED_GET_EVENT" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_PRIVILEGED_GET_STATUS, "VENUSMNGR_PRIVILEGED_GET_STATUS" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_CURRENT_MODEM_START, "VENUSMNGR_CURRENT_MODEM_START" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_CURRENT_MODEM_SEND, "VENUSMNGR_CURRENT_MODEM_SEND" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_CURRENT_MODEM_SEND_PAIRING, "VENUSMNGR_CURRENT_MODEM_SEND_PAIRING" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_CURRENT_MODEM_GET_STATUS, "VENUSMNGR_CURRENT_MODEM_GET_STATUS" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_KA_DATA_SEND, "VENUSMNGR_KA_DATA_SEND" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_CURRENT_MODEM_END_PAIRING, "VENUSMNGR_CURRENT_MODEM_END_PAIRING" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_FORCE_GRID_MON, "VENUSMNGR_FORCE_GRID_MON" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_FORCE_SKIP_GRID_MON, "VENUSMNGR_FORCE_SKIP_GRID_MON" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_START_SUPERVISE, "VENUSMNGR_START_SUPERVISE" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_READ_A2D_MEAS, "VENUSMNGR_READ_A2D_MEAS" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_GET_COUNTRY_DEFAULTS, "VENUSMNGR_GET_COUNTRY_DEFAULTS" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_SET_PRODUCT_MODEL, "VENUSMNGR_SET_PRODUCT_MODEL" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_GET_PRODUCT_MODEL, "VENUSMNGR_GET_PRODUCT_MODEL" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_SET_DYNAMIC_INVPWR_PARAM, "VENUSMNGR_SET_DYNAMIC_INVPWR_PARAM" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_ENTER_BURN_INVPWR_MODE, "INVERTER_ENTER_BURN_INVPWR_MODE" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_MPPT_TRAVEL, "VENUSMNGR_MPPT_TRAVEL" },
|
|
{ SOLAREDGE_COMMAND_VENUSMNGR_SET_PWR_PARAM, "VENUSMNGR_SET_PWR_PARAM" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_CURRENT_MODEM_SET_DATA_BIT, "INVERTER_CURRENT_MODEM_SET_DATA_BIT" },
|
|
{ SOLAREDGE_COMMAND_RESP_VENUSMNGR_READ_ISE_MEAS1, "RESP_VENUSMNGR_READ_ISE_MEAS1" },
|
|
{ SOLAREDGE_COMMAND_RESP_VENUSMNGR_READ_ISE_MEAS2, "RESP_VENUSMNGR_READ_ISE_MEAS2" },
|
|
{ SOLAREDGE_COMMAND_RESP_VENUSMNGR_READ_SE_MEAS, "RESP_VENUSMNGR_READ_SE_MEAS" },
|
|
{ SOLAREDGE_COMMAND_RESP_VENUSMNGR_GET_SYS_STATUS, "RESP_VENUSMNGR_GET_SYS_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_VENUSMNGR_GET_TELEM, "RESP_VENUSMNGR_GET_TELEM" },
|
|
{ SOLAREDGE_COMMAND_RESP_VENUSMNGR_RX_TEST, "RESP_VENUSMNGR_RX_TEST" },
|
|
{ SOLAREDGE_COMMAND_RESP_VENUSMNGR_GET_COUNTRY_CODE, "RESP_VENUSMNGR_GET_COUNTRY_CODE" },
|
|
{ SOLAREDGE_COMMAND_RESP_VENUSMNGR_PRIVILEGED_GET_EVENT, "RESP_VENUSMNGR_PRIVILEGED_GET_EVENT" },
|
|
{ SOLAREDGE_COMMAND_RESP_VENUSMNGR_PRIVILEGED_GET_STATUS, "RESP_VENUSMNGR_PRIVILEGED_GET_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_VENUSMNGR_CURRENT_MODEM_GET_STATUS, "RESP_VENUSMNGR_CURRENT_MODEM_GET_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_VENUSMNGR_READ_A2D_MEAS, "RESP_VENUSMNGR_READ_A2D_MEAS" },
|
|
{ SOLAREDGE_COMMAND_RESP_VENUSMNGR_GET_COUNTRY_DEFAULTS, "RESP_VENUSMNGR_GET_COUNTRY_DEFAULTS" },
|
|
{ SOLAREDGE_COMMAND_RESP_VENUSMNGR_GET_PRODUCT_MODEL, "RESP_VENUSMNGR_GET_PRODUCT_MODEL" },
|
|
{ SOLAREDGE_COMMAND_RESP_VENUSMNGR_SET_DYNAMIC_ISE_PARAM, "RESP_VENUSMNGR_SET_DYNAMIC_ISE_PARAM" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_TELEMS_START, "POLESTAR_TELEMS_START" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_TELEMS_STOP, "POLESTAR_TELEMS_STOP" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_MASTER_GRANT, "POLESTAR_MASTER_GRANT" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_RTC_SET, "POLESTAR_RTC_SET" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_TEST_RAM, "POLESTAR_TEST_RAM" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_TEST_FLASH, "POLESTAR_TEST_FLASH" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_MAC_ADDR_GET, "POLESTAR_MAC_ADDR_GET" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_IP_ADDR_GET, "POLESTAR_IP_ADDR_GET" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_SLAVE_ID_DETECT_INIT, "POLESTAR_SLAVE_ID_DETECT_INIT" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_SLAVE_ID_DETECT_GET_ID, "POLESTAR_SLAVE_ID_DETECT_GET_ID" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_SLAVE_ID_DETECT_STOP, "POLESTAR_SLAVE_ID_DETECT_STOP" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_UART_ZB_BRIDGE, "POLESTAR_UART_ZB_BRIDGE" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_SEND_PING, "POLESTAR_SEND_PING" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_LCD_TEST_MODE, "POLESTAR_LCD_TEST_MODE" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_CONFTOOL_START, "POLESTAR_CONFTOOL_START" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_ETHERNET_STAT, "POLESTAR_ETHERNET_STAT" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_FIFO_FLASH_INFO, "POLESTAR_GET_FIFO_FLASH_INFO" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_RESET_FIFO_FLASH, "POLESTAR_RESET_FIFO_FLASH" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_RESET_FLASH, "POLESTAR_RESET_FLASH" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_RS485_MSTR_SLV_DET_START, "POLESTAR_RS485_MSTR_SLV_DET_START" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_RS485_MSTR_SLV_DET_STATUS, "POLESTAR_RS485_MSTR_SLV_DET_STATUS" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_UART_ZB_SET, "POLESTAR_UART_ZB_SET" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_TCP_TEST, "POLESTAR_TCP_TEST" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_TIMER_ADVANCE, "POLESTAR_TIMER_ADVANCE" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_ERASE_FLASH_FIFO_FAST, "POLESTAR_ERASE_FLASH_FIFO_FAST" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_SELF_KA, "POLESTAR_SELF_KA" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_ISE_BRIDGE, "POLESTAR_ISE_BRIDGE" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_ERASE_STATISTICS, "POLESTAR_ERASE_STATISTICS" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_POK_STATUS, "POLESTAR_GET_POK_STATUS" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_INVERTER_HW_RESET, "POLESTAR_INVERTER_HW_RESET" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_ZB_PRESENT_STATUS, "POLESTAR_ZB_PRESENT_STATUS" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_ALL_SUPPORTED_LANGUAGES_INDEXES, "POLESTAR_GET_ALL_SUPPORTED_LANGUAGES_INDEXES" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_ALL_SUPPORTED_GSM_MODEMS_INDEXES, "POLESTAR_GET_ALL_SUPPORTED_GSM_MODEMS_INDEXES" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_S_OK_STATUS, "POLESTAR_GET_S_OK_STATUS" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_ENERGY_STATISTICS_STATUS, "POLESTAR_GET_ENERGY_STATISTICS_STATUS" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_GSM_PRESENT_STATUS, "POLESTAR_GET_GSM_PRESENT_STATUS" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_SET_STATISTICS_ELEMENT, "POLESTAR_SET_STATISTICS_ELEMENT" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GEMINI_RS485_MSTR_SLV_DET_START, "POLESTAR_GEMINI_RS485_MSTR_SLV_DET_START" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GEMINI_RS485_MSTR_SLV_DET_STATUS, "POLESTAR_GEMINI_RS485_MSTR_SLV_DET_STATUS" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_GEMINI_GFD_STATUS, "POLESTAR_GET_GEMINI_GFD_STATUS" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_ERROR_LOG, "POLESTAR_GET_ERROR_LOG" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_BLOCK_SERVER_CONTROL, "POLESTAR_BLOCK_SERVER_CONTROL" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_SERVER_CONTROL_STATUS, "POLESTAR_GET_SERVER_CONTROL_STATUS" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_TEST_SD_FLASH, "POLESTAR_TEST_SD_FLASH" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_WARNING_LOG, "POLESTAR_GET_WARNING_LOG" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_RESET_MODBUS_DEVICE_DATA, "POLESTAR_RESET_MODBUS_DEVICE_DATA" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_TURN_OFF_INTERNAL_SRAM_BATTERY_BACKUP, "POLESTAR_TURN_OFF_INTERNAL_SRAM_BATTERY_BACKUP" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_WRITE_LCD, "POLESTAR_WRITE_LCD" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_READ_LAST_BUTTONS, "POLESTAR_READ_LAST_BUTTONS" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_STATISTICS_ELEMENT, "POLESTAR_GET_STATISTICS_ELEMENT" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_SEND_POWER_REDUCER_SLAVE_PACKET, "POLESTAR_SEND_POWER_REDUCER_SLAVE_PACKET" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_SEND_POWER_REDUCER_MASTER_PACKET, "POLESTAR_SEND_POWER_REDUCER_MASTER_PACKET" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_WIFI_PRESENT_STATUS, "POLESTAR_GET_WIFI_PRESENT_STATUS" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_PORT_EXPANDER_GPIO_DATA, "POLESTAR_GET_PORT_EXPANDER_GPIO_DATA" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_SET_PORT_EXPANDER_GPIO_DATA, "POLESTAR_SET_PORT_EXPANDER_GPIO_DATA" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_READ_LCD, "POLESTAR_READ_LCD" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_SIMULATE_BUTTON_PRESSING, "POLESTAR_SIMULATE_BUTTON_PRESSING" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_INV_ACTIVATE, "POLESTAR_INV_ACTIVATE" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_MODBUS_SLAVE_PACKET, "POLESTAR_MODBUS_SLAVE_PACKET" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_BUTTON_STATE, "POLESTAR_GET_BUTTON_STATE" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_A2D_VALS, "POLESTAR_GET_A2D_VALS" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_OPMODE, "POLESTAR_GET_OPMODE" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_SET_BACKLIGHT, "POLESTAR_SET_BACKLIGHT" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_READ_FIFO_PAGE, "POLESTAR_READ_FIFO_PAGE" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_CURRENT_SCREEN_INDEX, "POLESTAR_GET_CURRENT_SCREEN_INDEX" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_IDENTITY, "POLESTAR_GET_IDENTITY" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_SUPPORTED_COMMANDS, "POLESTAR_GET_SUPPORTED_COMMANDS" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_PAIRING_START, "POLESTAR_PAIRING_START" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_PAIRING_STATUS, "POLESTAR_PAIRING_STATUS" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_PRODUCT_RESET, "POLESTAR_PRODUCT_RESET" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_PLC_CMD_EXECUTE, "POLESTAR_PLC_CMD_EXECUTE" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_GET_STATUS, "POLESTAR_GET_STATUS" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_FIRE_SAFETY_LOCK_MASTER, "POLESTAR_FIRE_SAFETY_LOCK_MASTER" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_FIRE_SAFETY_LOCK_SLAVE, "POLESTAR_FIRE_SAFETY_LOCK_SLAVE" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_FIRE_SAFETY_REPORT, "POLESTAR_FIRE_SAFETY_REPORT" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_UART_BRIDGE_INIT, "POLESTAR_UART_BRIDGE_INIT" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_SEND_UART_DATA, "POLESTAR_SEND_UART_DATA" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_LED_TEST, "POLESTAR_LED_TEST" },
|
|
{ SOLAREDGE_COMMAND_POLESTAR_SEND_FAKE_TELEMS, "POLESTAR_SEND_FAKE_TELEMS" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_RTC_SET, "RESP_POLESTAR_RTC_SET" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_MAC_ADDR_GET, "RESP_POLESTAR_MAC_ADDR_GET" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_IP_ADDR_GET, "RESP_POLESTAR_IP_ADDR_GET" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_SEND_PING, "RESP_POLESTAR_SEND_PING" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_ETHERNET_STAT, "RESP_POLESTAR_ETHERNET_STAT" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_FIFO_FLASH_INFO, "RESP_POLESTAR_GET_FIFO_FLASH_INFO" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_RS485_MSTR_SLV_DET_STATUS, "RESP_POLESTAR_RS485_MSTR_SLV_DET_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_TCP_TEST_RESP, "RESP_POLESTAR_TCP_TEST_RESP" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_POK_STATUS, "RESP_POLESTAR_GET_POK_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_INVERTER_HW_RESET, "RESP_POLESTAR_INVERTER_HW_RESET" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_ALL_SUPPORTED_LANGUAGES_INDEXES, "RESP_POLESTAR_GET_ALL_SUPPORTED_LANGUAGES_INDEXES" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_ALL_SUPPORTED_GSM_MODEMS_INDEXES, "RESP_POLESTAR_GET_ALL_SUPPORTED_GSM_MODEMS_INDEXES" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_S_OK_STATUS, "RESP_POLESTAR_GET_S_OK_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_ENERGY_STATISTICS_STATUS, "RESP_POLESTAR_GET_ENERGY_STATISTICS_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_GSM_PRESENT_STATUS, "RESP_POLESTAR_GET_GSM_PRESENT_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GEMINI_RS485_MSTR_SLV_DET_STATUS, "RESP_POLESTAR_GEMINI_RS485_MSTR_SLV_DET_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_GEMINI_GFD_STATUS, "RESP_POLESTAR_GET_GEMINI_GFD_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_ERROR_LOG, "RESP_POLESTAR_GET_ERROR_LOG" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_SERVER_CONTROL_STATUS, "RESP_POLESTAR_GET_SERVER_CONTROL_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_WARNING_LOG, "RESP_POLESTAR_GET_WARNING_LOG" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_READ_LAST_BUTTONS, "RESP_POLESTAR_READ_LAST_BUTTONS" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_STATISTICS_ELEMENT, "RESP_POLESTAR_GET_STATISTICS_ELEMENT" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_WIFI_PRESENT_STATUS, "RESP_POLESTAR_GET_WIFI_PRESENT_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_PORT_EXPANDER_GPIO_DATA, "RESP_POLESTAR_GET_PORT_EXPANDER_GPIO_DATA" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_READ_LCD, "RESP_POLESTAR_READ_LCD" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_MODBUS_SLAVE_PACKET, "RESP_POLESTAR_MODBUS_SLAVE_PACKET" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_MASTER_GRANT_ACK, "RESP_POLESTAR_MASTER_GRANT_ACK" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_IDENTITY, "RESP_POLESTAR_GET_IDENTITY" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_SUPPORTED_COMMANDS, "RESP_POLESTAR_GET_SUPPORTED_COMMANDS" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_PAIRING_START, "RESP_POLESTAR_PAIRING_START" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_PAIRING_STATUS, "RESP_POLESTAR_PAIRING_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_GET_STATUS, "RESP_POLESTAR_GET_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_FIRE_SAFETY_REPORT, "RESP_POLESTAR_FIRE_SAFETY_REPORT" },
|
|
{ SOLAREDGE_COMMAND_RESP_POLESTAR_SEND_UART_DATA, "RESP_POLESTAR_SEND_UART_DATA" },
|
|
{ SOLAREDGE_COMMAND_SUNTRACER_READ_FLASH, "SUNTRACER_READ_FLASH" },
|
|
{ SOLAREDGE_COMMAND_SUNTRACER_START, "SUNTRACER_START" },
|
|
{ SOLAREDGE_COMMAND_SUNTRACER_SET_RTC, "SUNTRACER_SET_RTC" },
|
|
{ SOLAREDGE_COMMAND_SUNTRACER_DEL_FLASH, "SUNTRACER_DEL_FLASH" },
|
|
{ SOLAREDGE_COMMAND_SUNTRACER_DEL_FLASH_SECTOR, "SUNTRACER_DEL_FLASH_SECTOR" },
|
|
{ SOLAREDGE_COMMAND_RESP_SUNTRACER_TRACE, "RESP_SUNTRACER_TRACE" },
|
|
{ SOLAREDGE_COMMAND_RESP_SUNTRACER_FLASH, "RESP_SUNTRACER_FLASH" },
|
|
{ SOLAREDGE_COMMAND_SERVER_POST_DATA, "SERVER_POST_DATA" },
|
|
{ SOLAREDGE_COMMAND_SERVER_GET_GMT, "SERVER_GET_GMT" },
|
|
{ SOLAREDGE_COMMAND_SERVER_GET_NAME, "SERVER_GET_NAME" },
|
|
{ SOLAREDGE_COMMAND_SERVER_SET_KEY, "SERVER_SET_KEY" },
|
|
{ SOLAREDGE_COMMAND_RESP_SERVER_GMT, "RESP_SERVER_GMT" },
|
|
{ SOLAREDGE_COMMAND_RESP_SERVER_NAME, "RESP_SERVER_NAME" },
|
|
{ SOLAREDGE_COMMAND_RESP_CONFTOOL_PLC_DATA, "RESP_CONFTOOL_PLC_DATA" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_READ_JUPPWR_MEAS1, "JUPMNGR_READ_JUPPWR_MEAS1" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_READ_JUPPWR_MEAS2, "JUPMNGR_READ_JUPPWR_MEAS2" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_READ_JUPPWR_MEAS3, "JUPMNGR_READ_JUPPWR_MEAS3" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_READ_JUPPWR_MEAS4, "JUPMNGR_READ_JUPPWR_MEAS4" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_READ_JUPPWR_MEAS5, "JUPMNGR_READ_JUPPWR_MEAS5" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_READ_MEAS, "JUPMNGR_READ_MEAS" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_GET_SYS_STATUS, "JUPMNGR_GET_SYS_STATUS" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_GET_TELEM, "JUPMNGR_GET_TELEM" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_GET_COUNTRY_CODE, "JUPMNGR_GET_COUNTRY_CODE" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_SET_COUNTRY, "JUPMNGR_SET_COUNTRY" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_GET_COUNTRY_DEFAULTS, "JUPMNGR_GET_COUNTRY_DEFAULTS" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_PRIVILEGED_MODE, "JUPMNGR_PRIVILEGED_MODE" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_PRIVILEGED_SET_PARAM, "JUPMNGR_PRIVILEGED_SET_PARAM" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_PRIVILEGED_GET_EVENT, "JUPMNGR_PRIVILEGED_GET_EVENT" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_PRIVILEGED_GET_STATUS, "JUPMNGR_PRIVILEGED_GET_STATUS" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_SET_PRODUCT_MODEL, "JUPMNGR_SET_PRODUCT_MODEL" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_GET_PRODUCT_MODEL, "JUPMNGR_GET_PRODUCT_MODEL" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_DYNAMIC_SET_INVPWR_PARAM, "JUPMNGR_DYNAMIC_SET_INVPWR_PARAM" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_GET_INVPWR_PARAM_TYPE, "JUPMNGR_GET_INVPWR_PARAM_TYPE" },
|
|
{ SOLAREDGE_COMMAND_JUPMNGR_GET_FANS_STATUS, "JUPMNGR_GET_FANS_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_JUPMNGR_READ_JUPPWR_MEAS1, "RESP_JUPMNGR_READ_JUPPWR_MEAS1" },
|
|
{ SOLAREDGE_COMMAND_RESP_JUPMNGR_READ_JUPPWR_MEAS2, "RESP_JUPMNGR_READ_JUPPWR_MEAS2" },
|
|
{ SOLAREDGE_COMMAND_RESP_JUPMNGR_READ_JUPPWR_MEAS3, "RESP_JUPMNGR_READ_JUPPWR_MEAS3" },
|
|
{ SOLAREDGE_COMMAND_RESP_JUPMNGR_READ_JUPPWR_MEAS4, "RESP_JUPMNGR_READ_JUPPWR_MEAS4" },
|
|
{ SOLAREDGE_COMMAND_RESP_JUPMNGR_READ_JUPPWR_MEAS5, "RESP_JUPMNGR_READ_JUPPWR_MEAS5" },
|
|
{ SOLAREDGE_COMMAND_RESP_JUPMNGR_READ_MEAS, "RESP_JUPMNGR_READ_MEAS" },
|
|
{ SOLAREDGE_COMMAND_RESP_JUPMNGR_GET_SYS_STATUS, "RESP_JUPMNGR_GET_SYS_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_JUPMNGR_GET_TELEM, "RESP_JUPMNGR_GET_TELEM" },
|
|
{ SOLAREDGE_COMMAND_RESP_JUPMNGR_GET_COUNTRY_CODE, "RESP_JUPMNGR_GET_COUNTRY_CODE" },
|
|
{ SOLAREDGE_COMMAND_RESP_JUPMNGR_GET_COUNTRY_DEFAULTS, "RESP_JUPMNGR_GET_COUNTRY_DEFAULTS" },
|
|
{ SOLAREDGE_COMMAND_RESP_JUPMNGR_PRIVILEGED_GET_EVENT, "RESP_JUPMNGR_PRIVILEGED_GET_EVENT" },
|
|
{ SOLAREDGE_COMMAND_RESP_JUPMNGR_PRIVILEGED_GET_STATUS, "RESP_JUPMNGR_PRIVILEGED_GET_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_JUPMNGR_GET_PRODUCT_MODEL, "RESP_JUPMNGR_GET_PRODUCT_MODEL" },
|
|
{ SOLAREDGE_COMMAND_RESP_JUPMNGR_GET_INVPWR_PARAM_TYPE, "RESP_JUPMNGR_GET_INVPWR_PARAM_TYPE" },
|
|
{ SOLAREDGE_COMMAND_RESP_JUPMNGR_GET_FANS_STATUS, "RESP_JUPMNGR_GET_FANS_STATUS" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_TURN_15V_ON, "INVERTER_TURN_15V_ON" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_TURN_15V_OFF, "INVERTER_TURN_15V_OFF" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_ENABLE_RELAYS, "INVERTER_ENABLE_RELAYS" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_DISABLE_RELAYS, "INVERTER_DISABLE_RELAYS" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_DYNAMIC_POWER_LIMIT, "INVERTER_DYNAMIC_POWER_LIMIT" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_IVTRACE_START, "INVERTER_IVTRACE_START" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_GRID_TRIP_TEST, "INVERTER_GRID_TRIP_TEST" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_SET_LMVGC_PARAMS1, "INVERTER_SET_LMVGC_PARAMS1" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_GET_LMVGC_PARAMS1, "INVERTER_GET_LMVGC_PARAMS1" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_SET_PWR_GAIN_PARAMS, "INVERTER_SET_PWR_GAIN_PARAMS" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_SET_LMVGC_PARAMS2, "INVERTER_SET_LMVGC_PARAMS2" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_GET_LMVGC_PARAMS2, "INVERTER_GET_LMVGC_PARAMS2" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_SET_LMVGC_PARAMS3, "INVERTER_SET_LMVGC_PARAMS3" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_GET_LMVGC_PARAMS3, "INVERTER_GET_LMVGC_PARAMS3" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_LOCK_IN, "INVERTER_LOCK_IN" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_LOCK_OUT, "INVERTER_LOCK_OUT" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_GET_VDC, "INVERTER_GET_VDC" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_PAIRING_DO_NOTHING, "INVERTER_PAIRING_DO_NOTHING" },
|
|
{ SOLAREDGE_COMMAND_INVERTER_PAIRING_DO_SAFETY, "INVERTER_PAIRING_DO_SAFETY" },
|
|
{ SOLAREDGE_COMMAND_RESP_INVERTER_DYNAMIC_POWER_LIMIT, "RESP_INVERTER_DYNAMIC_POWER_LIMIT" },
|
|
{ SOLAREDGE_COMMAND_RESP_INVERTER_GET_LMVGC_PARAMS, "RESP_INVERTER_GET_LMVGC_PARAMS" },
|
|
{ SOLAREDGE_COMMAND_VEGA_READ_MEAS, "VEGA_READ_MEAS" },
|
|
{ SOLAREDGE_COMMAND_VEGA_GET_SYS_STATUS, "VEGA_GET_SYS_STATUS" },
|
|
{ SOLAREDGE_COMMAND_VEGA_GET_TELEM, "VEGA_GET_TELEM" },
|
|
{ SOLAREDGE_COMMAND_VEGA_GET_MAX_VDC_VALUE, "VEGA_GET_MAX_VDC_VALUE" },
|
|
{ SOLAREDGE_COMMAND_VEGA_SET_MAX_VDC_VALUE, "VEGA_SET_MAX_VDC_VALUE" },
|
|
{ SOLAREDGE_COMMAND_VEGA_RELAY_SET, "VEGA_RELAY_SET" },
|
|
{ SOLAREDGE_COMMAND_VEGA_SET_OPMODE, "VEGA_SET_OPMODE" },
|
|
{ SOLAREDGE_COMMAND_VEGA_GET_OPMODE, "VEGA_GET_OPMODE" },
|
|
{ SOLAREDGE_COMMAND_VEGA_SET_RANGE, "VEGA_SET_RANGE" },
|
|
{ SOLAREDGE_COMMAND_RESP_VEGA_READ_MEAS, "RESP_VEGA_READ_MEAS" },
|
|
{ SOLAREDGE_COMMAND_RESP_VEGA_GET_SYS_STATUS, "RESP_VEGA_GET_SYS_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_VEGA_GET_TELEM, "RESP_VEGA_GET_TELEM" },
|
|
{ SOLAREDGE_COMMAND_RESP_VEGA_GET_MAX_VDC_VALUE, "RESP_VEGA_GET_MAX_VDC_VALUE" },
|
|
{ SOLAREDGE_COMMAND_COMBI_PAUSE_MONITORING, "COMBI_PAUSE_MONITORING" },
|
|
{ SOLAREDGE_COMMAND_COMBI_SET_TIME_STAMP, "COMBI_SET_TIME_STAMP" },
|
|
{ SOLAREDGE_COMMAND_COMBI_RCD_CALIBRATION, "COMBI_RCD_CALIBRATION" },
|
|
{ SOLAREDGE_COMMAND_COMBI_GET_TELEM, "COMBI_GET_TELEM" },
|
|
{ SOLAREDGE_COMMAND_COMBI_FORCE_TELEM, "COMBI_FORCE_TELEM" },
|
|
{ SOLAREDGE_COMMAND_COMBI_SWITCHES_CONNECT, "COMBI_SWITCHES_CONNECT" },
|
|
{ SOLAREDGE_COMMAND_COMBI_SWITCHES_DISCONNECT, "COMBI_SWITCHES_DISCONNECT" },
|
|
{ SOLAREDGE_COMMAND_COMBI_SWITCHES_CONNECT_ALL, "COMBI_SWITCHES_CONNECT_ALL" },
|
|
{ SOLAREDGE_COMMAND_COMBI_SWITCHES_DISCONNECT_ALL, "COMBI_SWITCHES_DISCONNECT_ALL" },
|
|
{ SOLAREDGE_COMMAND_COMBI_RCD_TEST_EXECUTE, "COMBI_RCD_TEST_EXECUTE" },
|
|
{ SOLAREDGE_COMMAND_COMBI_RELAYS_TEST_EXECUTE, "COMBI_RELAYS_TEST_EXECUTE" },
|
|
{ SOLAREDGE_COMMAND_COMBI_GET_COMBISTRING_PARAM, "COMBI_GET_COMBISTRING_PARAM" },
|
|
{ SOLAREDGE_COMMAND_COMBI_SET_COMBISTRING_PARAM, "COMBI_SET_COMBISTRING_PARAM" },
|
|
{ SOLAREDGE_COMMAND_COMBI_GET_ALL_COMBISTRING_PARAMS, "COMBI_GET_ALL_COMBISTRING_PARAMS" },
|
|
{ SOLAREDGE_COMMAND_COMBI_GET_ALL_COMBI_PARAMS, "COMBI_GET_ALL_COMBI_PARAMS" },
|
|
{ SOLAREDGE_COMMAND_COMBI_READ_MEASUREMENTS, "COMBI_READ_MEASUREMENTS" },
|
|
{ SOLAREDGE_COMMAND_COMBI_GET_STRING_STATUS, "COMBI_GET_STRING_STATUS" },
|
|
{ SOLAREDGE_COMMAND_COMBI_GET_COMBI_STATUS, "COMBI_GET_COMBI_STATUS" },
|
|
{ SOLAREDGE_COMMAND_COMBI_GET_ACTIVE_STRINGS, "COMBI_GET_ACTIVE_STRINGS" },
|
|
{ SOLAREDGE_COMMAND_COMBI_FWD_STRING_TELEM, "COMBI_FWD_STRING_TELEM" },
|
|
{ SOLAREDGE_COMMAND_COMBI_FWD_COMBI_TELEM, "COMBI_FWD_COMBI_TELEM" },
|
|
{ SOLAREDGE_COMMAND_COMBI_GET_UNIFIED_STRING_STATUS, "COMBI_GET_UNIFIED_STRING_STATUS" },
|
|
{ SOLAREDGE_COMMAND_COMBI_GET_UNIFIED_COMBI_STATUS, "COMBI_GET_UNIFIED_COMBI_STATUS" },
|
|
{ SOLAREDGE_COMMAND_COMBI_CHECK_INNER_PROTOCOL, "COMBI_CHECK_INNER_PROTOCOL" },
|
|
{ SOLAREDGE_COMMAND_COMBI_SWITCHES_CONNECT_RELAY, "COMBI_SWITCHES_CONNECT_RELAY" },
|
|
{ SOLAREDGE_COMMAND_COMBI_SWITCHES_DISCONNECT_RELAY, "COMBI_SWITCHES_DISCONNECT_RELAY" },
|
|
{ SOLAREDGE_COMMAND_COMBI_GET_GEMINI_STRING_IDS, "COMBI_GET_GEMINI_STRING_IDS" },
|
|
{ SOLAREDGE_COMMAND_COMBI_GET_ALL_SWITCHES_STATUS, "COMBI_GET_ALL_SWITCHES_STATUS" },
|
|
{ SOLAREDGE_COMMAND_COMBI_SET_RCD_TEST_PIN, "COMBI_SET_RCD_TEST_PIN" },
|
|
{ SOLAREDGE_COMMAND_COMBI_RELAYS_TEST_CHECK_CONDS, "COMBI_RELAYS_TEST_CHECK_CONDS" },
|
|
{ SOLAREDGE_COMMAND_RESP_COMBI_GET_TELEM, "RESP_COMBI_GET_TELEM" },
|
|
{ SOLAREDGE_COMMAND_RESP_COMBI_GET_STRING_STATUS, "RESP_COMBI_GET_STRING_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_COMBI_GET_COMBI_STATUS, "RESP_COMBI_GET_COMBI_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_COMBI_GET_ACTIVE_STRINGS, "RESP_COMBI_GET_ACTIVE_STRINGS" },
|
|
{ SOLAREDGE_COMMAND_RESP_COMBI_GET_UNIFIED_STRING_STATUS, "RESP_COMBI_GET_UNIFIED_STRING_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_COMBI_GET_UNIFIED_COMBI_STATUS, "RESP_COMBI_GET_UNIFIED_COMBI_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_COMBI_GET_GEMINI_STRING_IDS, "RESP_COMBI_GET_GEMINI_STRING_IDS" },
|
|
{ SOLAREDGE_COMMAND_INVPWR_GET_ERROR_STATUS, "INVPWR_GET_ERROR_STATUS" },
|
|
{ SOLAREDGE_COMMAND_INVPWR_GET_STATUS, "INVPWR_GET_STATUS" },
|
|
{ SOLAREDGE_COMMAND_INVPWR_GO, "INVPWR_GO" },
|
|
{ SOLAREDGE_COMMAND_INVPWR_HALT, "INVPWR_HALT" },
|
|
{ SOLAREDGE_COMMAND_INVPWR_CONST_DUTY_CYCLE, "INVPWR_CONST_DUTY_CYCLE" },
|
|
{ SOLAREDGE_COMMAND_INVPWR_DUMY_ERROR, "INVPWR_DUMY_ERROR" },
|
|
{ SOLAREDGE_COMMAND_INVPWR_PAIRING_SET_STATE, "INVPWR_PAIRING_SET_STATE" },
|
|
{ SOLAREDGE_COMMAND_INVPWR_TEST_IAC_CONTROL, "INVPWR_TEST_IAC_CONTROL" },
|
|
{ SOLAREDGE_COMMAND_RESP_INVPWR_GET_ERROR_STATUS, "RESP_INVPWR_GET_ERROR_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_INVPWR_GET_STATUS, "RESP_INVPWR_GET_STATUS" },
|
|
{ SOLAREDGE_COMMAND_RESP_INVPWR_GO, "RESP_INVPWR_GO" },
|
|
{ SOLAREDGE_COMMAND_RESP_INVPWR_HALT, "RESP_INVPWR_HALT" },
|
|
{ SOLAREDGE_COMMAND_RESP_INVPWR_CONST_DUTY_CYCLE, "RESP_INVPWR_CONST_DUTY_CYCLE" },
|
|
{ SOLAREDGE_COMMAND_RESP_INVPWR_DUMY_ERROR, "RESP_INVPWR_DUMY_ERROR" },
|
|
{ SOLAREDGE_COMMAND_BOOTLOADER_SECURE, "BOOTLOADER_SECURE" },
|
|
{ SOLAREDGE_COMMAND_BOOTLOADER_UNSECURE, "BOOTLOADER_UNSECURE" },
|
|
{ SOLAREDGE_COMMAND_ACTIVATOR_ACTIVATE, "ACTIVATOR_ACTIVATE" },
|
|
{ SOLAREDGE_COMMAND_ACTIVATOR_GET_ADC_SAMPLES, "ACTIVATOR_GET_ADC_SAMPLES" },
|
|
{ SOLAREDGE_COMMAND_ACTIVATOR_SET_VO_RANGE, "ACTIVATOR_SET_VO_RANGE" },
|
|
{ SOLAREDGE_COMMAND_ACTIVATOR_GET_AVG_SAMPLES, "ACTIVATOR_GET_AVG_SAMPLES" },
|
|
{ SOLAREDGE_COMMAND_ACTIVATOR_TX_TEST, "ACTIVATOR_TX_TEST" },
|
|
{ SOLAREDGE_COMMAND_ACTIVATOR_LCD_TEST, "ACTIVATOR_LCD_TEST" },
|
|
{ SOLAREDGE_COMMAND_ACTIVATOR_BUTTONS_TEST, "ACTIVATOR_BUTTONS_TEST" },
|
|
{ SOLAREDGE_COMMAND_FANCONTROL_SET_PWM, "FANCONTROL_SET_PWM" },
|
|
{ SOLAREDGE_COMMAND_FANCONTROL_GET_PWM, "FANCONTROL_GET_PWM" },
|
|
{ SOLAREDGE_COMMAND_FANCONTROL_GET_ALL_PWM, "FANCONTROL_GET_ALL_PWM" },
|
|
{ SOLAREDGE_COMMAND_FANCONTROL_SHUT_ALL_PWM, "FANCONTROL_SHUT_ALL_PWM" },
|
|
{ SOLAREDGE_COMMAND_FANCONTROL_RES, "FANCONTROL_RES" },
|
|
{ SOLAREDGE_COMMAND_DISPLAY_BOARD_LCD_WRITE, "DISPLAY_BOARD_LCD_WRITE" },
|
|
{ SOLAREDGE_COMMAND_DISPLAY_BOARD_LED_SET, "DISPLAY_BOARD_LED_SET" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string solaredge_data_devicetypes[] = {
|
|
{ SOLAREDGE_DEVICETYPE_OPTIMIZER, "Optimizer" },
|
|
{ SOLAREDGE_DEVICETYPE_INVERTER_1PHASE, "Single phase inverter"},
|
|
{ SOLAREDGE_DEVICETYPE_INVERTER_3PHASE, "Three phase inverter"},
|
|
{ SOLAREDGE_DEVICETYPE_OPTIMIZER2, "Optimizer" },
|
|
{ SOLAREDGE_DEVICETYPE_EVENT, "Wake/sleep event" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static gcry_cipher_hd_t cipher_hd_system;
|
|
static const gchar *global_system_encryption_key = NULL;
|
|
|
|
static
|
|
guint16 calculate_crc(t_solaredge_packet_header *header, const guint8 *data, gint length)
|
|
{
|
|
/* Concatenate in network endinaness header items followed by unmodified data */
|
|
guint16 crc = 0x5a5a;
|
|
guint16 sequence_number = g_htons(header->sequence_number);
|
|
guint32 source_address = g_htonl(header->source_address);
|
|
guint32 destination_address = g_htonl(header->destination_address);
|
|
guint16 command_type = g_htons(header->command_type);
|
|
crc = crc16_plain_update(crc, (unsigned char *)&sequence_number, 2);
|
|
crc = crc16_plain_update(crc, (unsigned char *)&source_address, 4);
|
|
crc = crc16_plain_update(crc, (unsigned char *)&destination_address, 4);
|
|
crc = crc16_plain_update(crc, (unsigned char *)&command_type, 2);
|
|
return crc16_plain_update(crc, data, length);
|
|
}
|
|
|
|
static
|
|
void solaredge_decrypt(const guint8 *in, gint length, guint8 *out, gcry_cipher_hd_t cipher)
|
|
{
|
|
guint8 rand1[SOLAREDGE_ENCRYPTION_KEY_LENGTH];
|
|
guint8 rand2[SOLAREDGE_ENCRYPTION_KEY_LENGTH];
|
|
gint payload_length = length - SOLAREDGE_ENCRYPTION_KEY_LENGTH;
|
|
guint8 *payload = (guint8 *) wmem_alloc(wmem_packet_scope(), payload_length);
|
|
guint8 *intermediate_decrypted_payload = (guint8 *) wmem_alloc(wmem_packet_scope(), payload_length);
|
|
gint i = 0, posa = 0, posb = 0, posc = 0;
|
|
memcpy(rand2, in, SOLAREDGE_ENCRYPTION_KEY_LENGTH);
|
|
memcpy(payload, in + SOLAREDGE_ENCRYPTION_KEY_LENGTH, payload_length);
|
|
gcry_cipher_encrypt(cipher, rand1, SOLAREDGE_ENCRYPTION_KEY_LENGTH, rand2, SOLAREDGE_ENCRYPTION_KEY_LENGTH);
|
|
|
|
for (posb = 0; posb < payload_length; posb++) {
|
|
intermediate_decrypted_payload[posb] = payload[posb] ^ rand1[posa++];
|
|
if (posa == 16) {
|
|
posa = 0;
|
|
for (posc = 15; posc >= 0; posc--) {
|
|
rand2[posc] = (rand2[posc] + 1) & 0xFF;
|
|
if (rand2[posc]) {
|
|
break;
|
|
}
|
|
}
|
|
gcry_cipher_encrypt(cipher, rand1, SOLAREDGE_ENCRYPTION_KEY_LENGTH, rand2, SOLAREDGE_ENCRYPTION_KEY_LENGTH);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < payload_length; i++) {
|
|
out[i] = intermediate_decrypted_payload[i + 6] ^ intermediate_decrypted_payload[2+(i&3)];
|
|
}
|
|
}
|
|
|
|
static int
|
|
dissect_solaredge_devicedata(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset, gint length)
|
|
{
|
|
gint current_offset;
|
|
t_solaredge_device_header device_header;
|
|
proto_item *post_item;
|
|
proto_tree *post_tree;
|
|
const guint8 *optimizer_data;
|
|
gfloat dc_voltage_panel;
|
|
gfloat dc_voltage_optimizer;
|
|
gfloat dc_current_optimizer;
|
|
gfloat energy_day_optimizer;
|
|
gfloat temperature_optimizer;
|
|
guint32 event_type;
|
|
|
|
device_header.type = tvb_get_letohs(tvb, offset);
|
|
device_header.id = tvb_get_letohl(tvb, offset + 2);
|
|
device_header.device_length = tvb_get_letohs(tvb, offset + 6);
|
|
post_item = proto_tree_add_item(tree, hf_solaredge_post_device_type, tvb, offset, device_header.device_length + SOLAREDGE_POST_HEADER_LENGTH, ENC_NA);
|
|
post_tree = proto_item_add_subtree(post_item, ett_solaredge_packet_post_device);
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_device_type_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_device_id_type, tvb, offset + 2, 4, ENC_LITTLE_ENDIAN);
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_length_type, tvb, offset + 6, 2, ENC_LITTLE_ENDIAN);
|
|
current_offset = offset + SOLAREDGE_POST_HEADER_LENGTH;
|
|
col_append_str(pinfo->cinfo, COL_INFO, " ");
|
|
|
|
switch(device_header.type) {
|
|
case SOLAREDGE_DEVICETYPE_OPTIMIZER:
|
|
col_append_str(pinfo->cinfo, COL_INFO, "Optimizer");
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_optimizer_timestamp_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_optimizer_inverter_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
if (global_show_unknown_fields == TRUE) {
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_padding_uint32_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
}
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_optimizer_uptime_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_optimizer_dc_voltage_panel_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_optimizer_dc_voltage_optimzer_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_optimizer_dc_current_panel_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_optimizer_energy_day_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_optimizer_temperature_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
break;
|
|
case SOLAREDGE_DEVICETYPE_INVERTER_1PHASE:
|
|
col_append_str(pinfo->cinfo, COL_INFO, "Single phase inverter");
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_singlephase_inverter_timestamp_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_singlephase_inverter_uptime_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_singlephase_inverter_interval_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_singlephase_inverter_temperature_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_singlephase_inverter_energy_day_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_singlephase_inverter_energy_interval_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_singlephase_inverter_ac_voltage_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_singlephase_inverter_ac_current_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_singlephase_inverter_ac_frequency_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
if (global_show_unknown_fields == TRUE) {
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_padding_uint32_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
}
|
|
current_offset += 4;
|
|
if (global_show_unknown_fields == TRUE) {
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_padding_uint32_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
}
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_singlephase_inverter_dc_voltage_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
if (global_show_unknown_fields == TRUE) {
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_padding_uint32_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
}
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_singlephase_inverter_energy_total_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
if (global_show_unknown_fields == TRUE) {
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_padding_float_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
}
|
|
current_offset += 4;
|
|
if (global_show_unknown_fields == TRUE) {
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_padding_uint32_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
}
|
|
current_offset += 4;
|
|
if (global_show_unknown_fields == TRUE) {
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_padding_float_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
}
|
|
current_offset += 4;
|
|
if (global_show_unknown_fields == TRUE) {
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_padding_float_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
}
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_singlephase_inverter_power_max_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
if (global_show_unknown_fields == TRUE) {
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_padding_float_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
}
|
|
current_offset += 4;
|
|
if (global_show_unknown_fields == TRUE) {
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_padding_float_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
}
|
|
current_offset += 4;
|
|
if (global_show_unknown_fields == TRUE) {
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_padding_uint32_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
}
|
|
current_offset += 4;
|
|
if (global_show_unknown_fields == TRUE) {
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_padding_uint32_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
}
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_singlephase_inverter_ac_power_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
if (global_show_unknown_fields == TRUE) {
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_padding_float_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
}
|
|
current_offset += 4;
|
|
if (global_show_unknown_fields == TRUE) {
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_padding_uint32_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
}
|
|
current_offset += 4;
|
|
break;
|
|
case SOLAREDGE_DEVICETYPE_INVERTER_3PHASE:
|
|
col_append_str(pinfo->cinfo, COL_INFO, "Three phase inverter");
|
|
current_offset += device_header.device_length;
|
|
// Not implemented yet
|
|
break;
|
|
case SOLAREDGE_DEVICETYPE_OPTIMIZER2:
|
|
col_append_str(pinfo->cinfo, COL_INFO, "Optimizer");
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_optimizer_timestamp_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_optimizer_uptime_short_type, tvb, current_offset, 2, ENC_LITTLE_ENDIAN);
|
|
current_offset += 2;
|
|
optimizer_data = tvb_get_ptr(tvb, current_offset, 6);
|
|
dc_voltage_panel = (gfloat)(0.125 * (gfloat)(optimizer_data[0] | (optimizer_data[1] << 8 & 0x300)));
|
|
proto_tree_add_float_format_value(post_tree, hf_solaredge_post_optimizer_dc_voltage_panel_type, tvb, current_offset, 6, dc_voltage_panel, "%.2f", dc_voltage_panel);
|
|
dc_voltage_optimizer = (gfloat)(0.125 * (gfloat)(optimizer_data[1] >> 2 | (optimizer_data[2] << 6 & 0x3c0)));
|
|
proto_tree_add_float_format_value(post_tree, hf_solaredge_post_optimizer_dc_voltage_optimzer_type, tvb, current_offset, 6, dc_voltage_optimizer, "%.2f", dc_voltage_optimizer);
|
|
dc_current_optimizer = (gfloat)(0.00625 * (gfloat)(optimizer_data[3] <<4 | (optimizer_data[2] >>4 & 0xf)));
|
|
proto_tree_add_float_format_value(post_tree, hf_solaredge_post_optimizer_dc_current_optimzer_type, tvb, current_offset, 6, dc_current_optimizer, "%.2f", dc_current_optimizer);
|
|
energy_day_optimizer = (gfloat)(0.25 * (gfloat)(optimizer_data[6] <<8 | optimizer_data[5]));
|
|
proto_tree_add_float_format_value(post_tree, hf_solaredge_post_optimizer_energy_day_type, tvb, current_offset, 6, energy_day_optimizer, "%.2f", energy_day_optimizer);
|
|
current_offset += 6;
|
|
temperature_optimizer = (gfloat)(2.0 * (gfloat)tvb_get_guint8(tvb, current_offset));
|
|
proto_tree_add_float_format_value(post_tree, hf_solaredge_post_optimizer_temperature_type, tvb, current_offset, 2, temperature_optimizer, "%.2f", temperature_optimizer);
|
|
current_offset++;
|
|
break;
|
|
case SOLAREDGE_DEVICETYPE_EVENT:
|
|
col_append_str(pinfo->cinfo, COL_INFO, "Wake/sleep event");
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_event_timestamp_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
event_type = tvb_get_guint32(tvb, current_offset, ENC_LITTLE_ENDIAN);
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_event_type_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_event_event_start_timestamp_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
if (event_type == 1) {
|
|
/* Timezone offset, then end time*/
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_event_event_timezone_offset_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_event_event_end_timestamp_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
} else {
|
|
/* End time, then unused */
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_event_event_end_timestamp_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 8;
|
|
}
|
|
if (global_show_unknown_fields == TRUE) {
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_padding_uint32_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
}
|
|
current_offset += 4;
|
|
if (global_show_unknown_fields == TRUE) {
|
|
proto_tree_add_item(post_tree, hf_solaredge_post_padding_uint32_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
}
|
|
current_offset += 4;
|
|
break;
|
|
default:
|
|
col_append_str(pinfo->cinfo, COL_INFO, "Unknown device");
|
|
current_offset += device_header.device_length;
|
|
break;
|
|
}
|
|
|
|
if (current_offset < length) {
|
|
col_append_str(pinfo->cinfo, COL_INFO, ", ");
|
|
dissect_solaredge_devicedata(tvb, pinfo, tree, current_offset, length);
|
|
}
|
|
return current_offset;
|
|
}
|
|
|
|
static int
|
|
dissect_solaredge_recursive(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, void *data _U_, gint ett, conversation_t *conv)
|
|
{
|
|
proto_item *ti;
|
|
proto_tree *solaredge_header_tree;
|
|
proto_item *solaredge_payload_item;
|
|
proto_tree *solaredge_payload_tree;
|
|
gint32 current_offset = 0;
|
|
t_solaredge_packet_header header;
|
|
GByteArray *system_key;
|
|
guint8 session_key_message_part1[SOLAREDGE_ENCRYPTION_KEY_LENGTH];
|
|
guint8 session_key_message_part2[SOLAREDGE_ENCRYPTION_KEY_LENGTH];
|
|
guint8 session_key_intermediate[SOLAREDGE_ENCRYPTION_KEY_LENGTH];
|
|
guint i;
|
|
t_solaredge_conversion_data *conv_data;
|
|
gboolean system_key_valid;
|
|
|
|
/* Starts with magic number */
|
|
if ( tvb_get_guint32(tvb, 0, ENC_LITTLE_ENDIAN) != SOLAREDGE_MAGIC_NUMBER) {
|
|
return 0;
|
|
}
|
|
col_set_str(pinfo->cinfo, COL_PROTOCOL, "SolarEdge");
|
|
col_clear(pinfo->cinfo,COL_INFO);
|
|
ti = proto_tree_add_item(tree, proto_solaredge, tvb, 0, -1, ENC_NA);
|
|
current_offset += 4;
|
|
solaredge_header_tree = proto_item_add_subtree(ti, ett);
|
|
|
|
header.length = tvb_get_guint16(tvb, current_offset, ENC_LITTLE_ENDIAN);
|
|
proto_tree_add_item(solaredge_header_tree, hf_solaredge_length_type, tvb, current_offset, 2, ENC_LITTLE_ENDIAN);
|
|
current_offset += 2;
|
|
header.length_inverse = tvb_get_guint16(tvb, current_offset, ENC_LITTLE_ENDIAN);
|
|
if (header.length_inverse != (G_MAXUINT16 - header.length)) {
|
|
proto_tree_add_expert_format(solaredge_header_tree, pinfo, &ei_solaredge_invalid_length, tvb, current_offset - 2, current_offset + 2, "Invalid length: inverse length %d not matching length %d", header.length_inverse, header.length);
|
|
}
|
|
proto_tree_add_item(solaredge_header_tree, hf_solaredge_length_inverse_type, tvb, current_offset, 2, ENC_LITTLE_ENDIAN);
|
|
current_offset += 2;
|
|
header.sequence_number = tvb_get_guint16(tvb, current_offset, ENC_LITTLE_ENDIAN);
|
|
proto_tree_add_item(solaredge_header_tree, hf_solaredge_sequence_number_type, tvb, current_offset, 2, ENC_LITTLE_ENDIAN);
|
|
current_offset += 2;
|
|
header.source_address = tvb_get_guint32(tvb, current_offset, ENC_LITTLE_ENDIAN);
|
|
proto_tree_add_item(solaredge_header_tree, hf_solaredge_source_address_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
header.destination_address = tvb_get_guint32(tvb, current_offset, ENC_LITTLE_ENDIAN);
|
|
proto_tree_add_item(solaredge_header_tree, hf_solaredge_destination_address_type, tvb, current_offset, 4, ENC_LITTLE_ENDIAN);
|
|
current_offset += 4;
|
|
header.command_type = tvb_get_guint16(tvb, current_offset, ENC_LITTLE_ENDIAN);
|
|
proto_tree_add_item(solaredge_header_tree, hf_solaredge_command_type, tvb, current_offset, 2, ENC_LITTLE_ENDIAN);
|
|
current_offset += 2;
|
|
col_append_str(pinfo->cinfo, COL_INFO, val_to_str(header.command_type, solaredge_packet_commandtypes,"Unknown command"));
|
|
|
|
switch (header.command_type) {
|
|
case SOLAREDGE_COMMAND_MISC_ENCRYPTED:
|
|
proto_tree_add_item(solaredge_header_tree, hf_solaredge_payload_type, tvb, current_offset, header.length, BASE_NONE);
|
|
conv_data = (t_solaredge_conversion_data *)conversation_get_proto_data(conv, proto_solaredge);
|
|
if ((conv_data != NULL) && (conv_data->session_key_found == TRUE)) {
|
|
guint8 *decrypted_buffer = (guint8*)wmem_alloc(pinfo->pool, header.length);
|
|
solaredge_decrypt(tvb_get_ptr(tvb, current_offset, header.length), header.length, decrypted_buffer, conv_data->cipher_hd_session);
|
|
tvbuff_t *next_tvb = tvb_new_child_real_data(tvb, decrypted_buffer, header.length, header.length);
|
|
if ( tvb_get_guint32(next_tvb, 0, ENC_LITTLE_ENDIAN) == SOLAREDGE_MAGIC_NUMBER) {
|
|
add_new_data_source(pinfo, next_tvb, "Decrypted Packet");
|
|
dissect_solaredge_recursive(next_tvb, pinfo, tree, data, ett_solaredge_packet_decrypted, conv);
|
|
}
|
|
}
|
|
current_offset += header.length;
|
|
break;
|
|
case SOLAREDGE_COMMAND_SERVER_POST_DATA:
|
|
solaredge_payload_item = proto_tree_add_item(solaredge_header_tree, hf_solaredge_post_type, tvb, current_offset, header.length, ENC_NA);
|
|
solaredge_payload_tree = proto_item_add_subtree(solaredge_payload_item, ett_solaredge_packet_post);
|
|
dissect_solaredge_devicedata(tvb, pinfo, solaredge_payload_tree, current_offset, header.length);
|
|
break;
|
|
case SOLAREDGE_COMMAND_SERVER_SET_KEY:
|
|
proto_tree_add_item(solaredge_header_tree, hf_solaredge_session_key_type, tvb, current_offset, header.length, BASE_NONE);
|
|
if (!gcry_cipher_open(&cipher_hd_system, GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_ECB, 0)) {
|
|
/* Load the system key to generate session key */
|
|
system_key = g_byte_array_new();
|
|
system_key_valid = hex_str_to_bytes(global_system_encryption_key, system_key, FALSE);
|
|
if ((system_key_valid == TRUE) && (system_key->len == SOLAREDGE_ENCRYPTION_KEY_LENGTH)) {
|
|
if (!gcry_cipher_setkey(cipher_hd_system, system_key->data, SOLAREDGE_ENCRYPTION_KEY_LENGTH)) {
|
|
/* Read first part of message */
|
|
tvb_memcpy(tvb, session_key_message_part1, current_offset, SOLAREDGE_ENCRYPTION_KEY_LENGTH);
|
|
current_offset += SOLAREDGE_ENCRYPTION_KEY_LENGTH;
|
|
/* Read second part of message */
|
|
tvb_memcpy(tvb, session_key_message_part2, current_offset, SOLAREDGE_ENCRYPTION_KEY_LENGTH);
|
|
current_offset += SOLAREDGE_ENCRYPTION_KEY_LENGTH;
|
|
/* Encrypt first part with system key */
|
|
gcry_cipher_encrypt(cipher_hd_system, session_key_intermediate, SOLAREDGE_ENCRYPTION_KEY_LENGTH, session_key_message_part1, SOLAREDGE_ENCRYPTION_KEY_LENGTH);
|
|
/* XOR result with second part to obtain session key */
|
|
for (i = 0; i < SOLAREDGE_ENCRYPTION_KEY_LENGTH; i++) {
|
|
session_key_message_part2[i] = session_key_intermediate[i] ^ session_key_message_part2[i];
|
|
}
|
|
conv_data = (t_solaredge_conversion_data *)conversation_get_proto_data(conv, proto_solaredge);
|
|
if (!gcry_cipher_open(&conv_data->cipher_hd_session, GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_ECB, 0)) {
|
|
/* Load the session key */
|
|
if (!gcry_cipher_setkey(conv_data->cipher_hd_session, session_key_message_part2, SOLAREDGE_ENCRYPTION_KEY_LENGTH)) {
|
|
conv_data->session_key_found = TRUE;
|
|
} else {
|
|
gcry_cipher_close(conv_data->cipher_hd_session);
|
|
}
|
|
}
|
|
}
|
|
gcry_cipher_close(cipher_hd_system);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
/* If not implemented, skip command */
|
|
current_offset += header.length;
|
|
break;
|
|
}
|
|
|
|
/* Validate CRC */
|
|
proto_tree_add_checksum(solaredge_header_tree, tvb, SOLAREDGE_HEADER_LENGTH + header.length, hf_solaredge_crc_type, hf_solaredge_crc_status_type, &ei_solaredge_invalid_crc, pinfo, calculate_crc(&header, tvb_get_ptr(tvb, SOLAREDGE_HEADER_LENGTH, header.length), header.length), ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY);
|
|
current_offset += 2;
|
|
return current_offset;
|
|
}
|
|
|
|
static int
|
|
dissect_solaredge(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, void *data _U_)
|
|
{
|
|
conversation_t *conv = find_or_create_conversation(pinfo);
|
|
t_solaredge_conversion_data *conv_data;
|
|
if (conversation_get_proto_data(conv, proto_solaredge) == NULL) {
|
|
/* Setup empty encryption key */
|
|
conv_data = wmem_new(wmem_file_scope(), t_solaredge_conversion_data);
|
|
conv_data->session_key_found = FALSE;
|
|
conversation_add_proto_data(conv, proto_solaredge, conv_data);
|
|
}
|
|
return dissect_solaredge_recursive(tvb, pinfo, tree, data, ett_solaredge_packet, conv);
|
|
}
|
|
|
|
void
|
|
proto_reg_handoff_solaredge(void)
|
|
{
|
|
static dissector_handle_t solaredge_handle;
|
|
solaredge_handle = create_dissector_handle(dissect_solaredge, proto_solaredge);
|
|
dissector_add_for_decode_as("tcp.port", solaredge_handle);
|
|
}
|
|
|
|
void
|
|
proto_register_solaredge(void)
|
|
{
|
|
static hf_register_info hf[] = {
|
|
{ &hf_solaredge_length_type,
|
|
{ "Length", "solaredge.length",
|
|
FT_UINT16, BASE_DEC,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_length_inverse_type,
|
|
{ "Length inverse", "solaredge.length_inverse",
|
|
FT_UINT16, BASE_DEC,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_sequence_number_type,
|
|
{ "Sequence number", "solaredge.sequence_number",
|
|
FT_UINT16, BASE_DEC,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_source_address_type,
|
|
{ "Source address", "solaredge.source_address",
|
|
FT_UINT32, BASE_HEX,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_destination_address_type,
|
|
{ "Destination address", "solaredge.destination_address",
|
|
FT_UINT32, BASE_HEX,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_command_type,
|
|
{ "Command Type", "solaredge.command",
|
|
FT_UINT16, BASE_HEX,
|
|
VALS(solaredge_packet_commandtypes), 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_crc_type,
|
|
{ "CRC", "solaredge.crc",
|
|
FT_UINT16, BASE_HEX,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_crc_status_type,
|
|
{ "CRC Status", "solaredge.crc.status",
|
|
FT_UINT8, BASE_NONE,
|
|
VALS(proto_checksum_vals), 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_payload_type,
|
|
{ "Payload", "solaredge.payload",
|
|
FT_BYTES, BASE_NONE,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_session_key_type,
|
|
{ "Session key", "solaredge.session_key",
|
|
FT_BYTES, BASE_NONE,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_type,
|
|
{ "Post data", "solaredge.post",
|
|
FT_NONE, BASE_NONE,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_device_type,
|
|
{ "Device", "solaredge.post.device",
|
|
FT_NONE, BASE_NONE,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_device_type_type,
|
|
{ "Device Type", "solaredge.post.device.type",
|
|
FT_UINT16, BASE_HEX,
|
|
VALS(solaredge_data_devicetypes), 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_device_id_type,
|
|
{ "Device ID", "solaredge.post.device.id",
|
|
FT_UINT32, BASE_HEX,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_length_type,
|
|
{ "Length", "solaredge.post.device.length",
|
|
FT_UINT16, BASE_DEC,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_padding_uint32_type,
|
|
{ "Padding (uint32)", "solaredge.post.device.padding_uint32",
|
|
FT_UINT32, BASE_HEX,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_padding_float_type,
|
|
{ "Padding (float)", "solaredge.post.device.padding_float",
|
|
FT_FLOAT, BASE_NONE,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_singlephase_inverter_timestamp_type,
|
|
{ "Timestamp", "solaredge.post.device.singlephase_inverter.timestamp",
|
|
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_singlephase_inverter_uptime_type,
|
|
{ "Uptime", "solaredge.post.device.singlephase_inverter.uptime",
|
|
FT_RELATIVE_TIME, BASE_NONE,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_singlephase_inverter_interval_type,
|
|
{ "Interval", "solaredge.post.device.singlephase_inverter.interval",
|
|
FT_UINT32, BASE_DEC,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_singlephase_inverter_temperature_type,
|
|
{ "Temperature", "solaredge.post.device.singlephase_inverter.temperature",
|
|
FT_FLOAT, BASE_NONE|BASE_UNIT_STRING,
|
|
&units_degree_celsius, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_singlephase_inverter_energy_day_type,
|
|
{ "Energy current day", "solaredge.post.device.singlephase_inverter.energy_day",
|
|
FT_FLOAT, BASE_NONE|BASE_UNIT_STRING,
|
|
&units_watthour, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_singlephase_inverter_energy_interval_type,
|
|
{ "Energy current interval", "solaredge.post.device.singlephase_inverter.energy_interval",
|
|
FT_FLOAT, BASE_NONE|BASE_UNIT_STRING,
|
|
&units_watthour, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_singlephase_inverter_ac_voltage_type,
|
|
{ "AC Voltage", "solaredge.post.device.singlephase_inverter.ac_voltage",
|
|
FT_FLOAT, BASE_NONE|BASE_UNIT_STRING,
|
|
&units_volt, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_singlephase_inverter_ac_current_type,
|
|
{ "AC Current", "solaredge.post.device.singlephase_inverter.ac_current",
|
|
FT_FLOAT, BASE_NONE|BASE_UNIT_STRING,
|
|
&units_amp, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_singlephase_inverter_ac_frequency_type,
|
|
{ "AC Frequency", "solaredge.post.device.singlephase_inverter.ac_frequency",
|
|
FT_FLOAT, BASE_NONE|BASE_UNIT_STRING,
|
|
&units_hz, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_singlephase_inverter_dc_voltage_type,
|
|
{ "DC Voltage", "solaredge.post.device.singlephase_inverter.dc_voltage",
|
|
FT_FLOAT, BASE_NONE|BASE_UNIT_STRING,
|
|
&units_volt, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_singlephase_inverter_energy_total_type,
|
|
{ "Energy total", "solaredge.post.device.singlephase_inverter.energy_total",
|
|
FT_FLOAT, BASE_NONE|BASE_UNIT_STRING,
|
|
&units_watthour, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_singlephase_inverter_power_max_type,
|
|
{ "Power Max", "solaredge.post.device.singlephase_inverter.power_max",
|
|
FT_FLOAT, BASE_NONE|BASE_UNIT_STRING,
|
|
&units_watt, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_singlephase_inverter_ac_power_type,
|
|
{ "AC Power", "solaredge.post.device.singlephase_inverter.ac_power",
|
|
FT_FLOAT, BASE_NONE|BASE_UNIT_STRING,
|
|
&units_watt, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_optimizer_inverter_type,
|
|
{ "Inverter ID", "solaredge.post.device.optimizer.inverter",
|
|
FT_UINT32, BASE_HEX,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_optimizer_dc_current_panel_type,
|
|
{ "DC Current Panel", "solaredge.post.device.optimizer.panel_dc_current",
|
|
FT_FLOAT, BASE_NONE|BASE_UNIT_STRING,
|
|
&units_amp, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_optimizer_timestamp_type,
|
|
{ "Timestamp", "solaredge.post.device.optimizer.timestamp",
|
|
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_optimizer_uptime_type,
|
|
{ "Uptime", "solaredge.post.device.optimizer.uptime",
|
|
FT_RELATIVE_TIME, BASE_NONE,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_optimizer_uptime_short_type,
|
|
{ "Uptime (short format)", "solaredge.post.device.optimizer.uptime_short",
|
|
FT_UINT16, BASE_DEC,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_optimizer_dc_voltage_panel_type,
|
|
{ "DC Voltage Panel", "solaredge.post.device.optimizer.panel_dc_voltage",
|
|
FT_FLOAT, BASE_NONE|BASE_UNIT_STRING,
|
|
&units_volt, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_optimizer_dc_voltage_optimzer_type,
|
|
{ "DC Voltage Optimizer", "solaredge.post.device.optimizer.optimizer_dc_voltage",
|
|
FT_FLOAT, BASE_NONE|BASE_UNIT_STRING,
|
|
&units_volt, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_optimizer_dc_current_optimzer_type,
|
|
{ "DC Current Optimizer", "solaredge.post.device.optimizer.optimizer_dc_current",
|
|
FT_FLOAT, BASE_NONE|BASE_UNIT_STRING,
|
|
&units_amp, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_optimizer_energy_day_type,
|
|
{ "Energy current day", "solaredge.post.device.optimizer.energy_day",
|
|
FT_FLOAT, BASE_NONE|BASE_UNIT_STRING,
|
|
&units_watthour, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_optimizer_temperature_type,
|
|
{ "Temperature", "solaredge.post.device.optimizer.temperature",
|
|
FT_FLOAT, BASE_NONE|BASE_UNIT_STRING,
|
|
&units_degree_celsius, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_event_timestamp_type,
|
|
{ "Timestamp", "solaredge.post.device.event.timestamp",
|
|
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_event_type_type,
|
|
{ "Type", "solaredge.post.device.event.type",
|
|
FT_UINT32, BASE_HEX,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_event_event_start_timestamp_type,
|
|
{ "Event start", "solaredge.post.device.event.start",
|
|
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_event_event_timezone_offset_type,
|
|
{ "Timezone offset", "solaredge.post.device.event.timezone_offset",
|
|
FT_INT32, BASE_DEC,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_solaredge_post_event_event_end_timestamp_type,
|
|
{ "Event stop", "solaredge.post.device.event.stop",
|
|
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL,
|
|
NULL, 0x0,
|
|
NULL, HFILL }
|
|
},
|
|
};
|
|
|
|
static ei_register_info ei[] = {
|
|
{ &ei_solaredge_invalid_length, { "solaredge.invalid_length", PI_MALFORMED, PI_WARN, "Inverse length field not matching length field", EXPFILL }},
|
|
{ &ei_solaredge_invalid_crc, { "solaredge.invalid_crc", PI_CHECKSUM, PI_WARN, "CRC does not match data", EXPFILL }}
|
|
};
|
|
|
|
expert_module_t* expert_solaredge;
|
|
|
|
/* Setup protocol subtree array */
|
|
static gint *ett[] = {
|
|
&ett_solaredge_packet,
|
|
&ett_solaredge_packet_decrypted,
|
|
&ett_solaredge_packet_post,
|
|
&ett_solaredge_packet_post_device
|
|
};
|
|
|
|
proto_solaredge = proto_register_protocol (
|
|
"SolarEdge monitoring protocol",
|
|
"SolarEdge",
|
|
"solaredge"
|
|
);
|
|
|
|
module_t * module_solaredge = prefs_register_protocol(proto_solaredge, proto_reg_handoff_solaredge);
|
|
prefs_register_bool_preference(module_solaredge, "unknown", "Show unknown fields", "Show unidentified fields (\"padding\") in packet dissections", &global_show_unknown_fields);
|
|
prefs_register_string_preference(module_solaredge, "system_encryption_key", "System encryption key", "Inverter system encryption key", &global_system_encryption_key);
|
|
|
|
proto_register_field_array(proto_solaredge, hf, array_length(hf));
|
|
proto_register_subtree_array(ett, array_length(ett));
|
|
|
|
expert_solaredge = expert_register_protocol(proto_solaredge);
|
|
expert_register_field_array(expert_solaredge, ei, array_length(ei));
|
|
}
|
|
|
|
/*
|
|
* Editor modelines - http://www.wireshark.org/tools/modelines.html
|
|
*
|
|
* Local variables:
|
|
* c-basic-offset: 8
|
|
* tab-width: 8
|
|
* indent-tabs-mode: t
|
|
* End:
|
|
*
|
|
* vi: set shiftwidth=8 tabstop=8 noexpandtab:
|
|
* :indentSize=8:tabSize=8:noTabs=false:
|
|
*/
|