cogito/esphome_dev/esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.h

217 lines
6.9 KiB
C++

#pragma once
#include "esphome/core/component.h"
#include "esphome/core/defines.h"
#ifdef USE_BINARY_SENSOR
#include "esphome/components/binary_sensor/binary_sensor.h"
#endif
#ifdef USE_SENSOR
#include "esphome/components/sensor/sensor.h"
#endif
#ifdef USE_NUMBER
#include "esphome/components/number/number.h"
#endif
#ifdef USE_SWITCH
#include "esphome/components/switch/switch.h"
#endif
#ifdef USE_BUTTON
#include "esphome/components/button/button.h"
#endif
#ifdef USE_SELECT
#include "esphome/components/select/select.h"
#endif
#ifdef USE_TEXT_SENSOR
#include "esphome/components/text_sensor/text_sensor.h"
#endif
#include "esphome/components/uart/uart.h"
#include "esphome/core/automation.h"
#include "esphome/core/helpers.h"
#include "seeed_mr24hpc1_constants.h"
#include <map>
namespace esphome {
namespace seeed_mr24hpc1 {
enum FrameState {
FRAME_IDLE,
FRAME_HEADER2,
FRAME_CTL_WORD,
FRAME_CMD_WORD,
FRAME_DATA_LEN_H,
FRAME_DATA_LEN_L,
FRAME_DATA_BYTES,
FRAME_DATA_CRC,
FRAME_TAIL1,
FRAME_TAIL2,
};
enum PollingState {
STANDARD_FUNCTION_QUERY_PRODUCT_MODE = 0,
STANDARD_FUNCTION_QUERY_PRODUCT_ID,
STANDARD_FUNCTION_QUERY_FIRMWARE_VERSION,
STANDARD_FUNCTION_QUERY_HARDWARE_MODE, // Above is the equipment information
STANDARD_FUNCTION_QUERY_SCENE_MODE,
STANDARD_FUNCTION_QUERY_SENSITIVITY,
STANDARD_FUNCTION_QUERY_UNMANNED_TIME,
STANDARD_FUNCTION_QUERY_HUMAN_STATUS,
STANDARD_FUNCTION_QUERY_HUMAN_MOTION_INF,
STANDARD_FUNCTION_QUERY_BODY_MOVE_PARAMETER,
STANDARD_FUNCTION_QUERY_KEEPAWAY_STATUS,
STANDARD_QUERY_CUSTOM_MODE,
STANDARD_FUNCTION_QUERY_HEARTBEAT_STATE, // Above is the basic function
CUSTOM_FUNCTION_QUERY_EXISTENCE_BOUNDARY,
CUSTOM_FUNCTION_QUERY_MOTION_BOUNDARY,
CUSTOM_FUNCTION_QUERY_EXISTENCE_THRESHOLD,
CUSTOM_FUNCTION_QUERY_MOTION_THRESHOLD,
CUSTOM_FUNCTION_QUERY_MOTION_TRIGGER_TIME,
CUSTOM_FUNCTION_QUERY_MOTION_TO_REST_TIME,
CUSTOM_FUNCTION_QUERY_TIME_OF_ENTER_UNMANNED,
UNDERLY_FUNCTION_QUERY_HUMAN_STATUS,
UNDERLY_FUNCTION_QUERY_SPATIAL_STATIC_VALUE,
UNDERLY_FUNCTION_QUERY_SPATIAL_MOTION_VALUE,
UNDERLY_FUNCTION_QUERY_DISTANCE_OF_STATIC_OBJECT,
UNDERLY_FUNCTION_QUERY_DISTANCE_OF_MOVING_OBJECT,
UNDERLY_FUNCTION_QUERY_TARGET_MOVEMENT_SPEED,
};
enum OutputSwitch {
OUTPUT_SWITCH_INIT,
OUTPUT_SWITCH_ON,
OUTPUT_SWTICH_OFF,
};
static const char *const S_SCENE_STR[5] = {"None", "Living Room", "Bedroom", "Washroom", "Area Detection"};
static const bool S_SOMEONE_EXISTS_STR[2] = {false, true};
static const char *const S_MOTION_STATUS_STR[3] = {"None", "Motionless", "Active"};
static const char *const S_KEEP_AWAY_STR[3] = {"None", "Close", "Away"};
static const char *const S_UNMANNED_TIME_STR[9] = {"None", "10s", "30s", "1min", "2min",
"5min", "10min", "30min", "60min"};
static const char *const S_BOUNDARY_STR[10] = {"0.5m", "1.0m", "1.5m", "2.0m", "2.5m",
"3.0m", "3.5m", "4.0m", "4.5m", "5.0m"}; // uint: m
static const float S_PRESENCE_OF_DETECTION_RANGE_STR[7] = {0.0f, 0.5f, 1.0f, 1.5f, 2.0f, 2.5f, 3.0f}; // uint: m
class MR24HPC1Component : public Component,
public uart::UARTDevice { // The class name must be the name defined by text_sensor.py
#ifdef USE_TEXT_SENSOR
SUB_TEXT_SENSOR(heartbeat_state)
SUB_TEXT_SENSOR(product_model)
SUB_TEXT_SENSOR(product_id)
SUB_TEXT_SENSOR(hardware_model)
SUB_TEXT_SENSOR(firware_version)
SUB_TEXT_SENSOR(keep_away)
SUB_TEXT_SENSOR(motion_status)
SUB_TEXT_SENSOR(custom_mode_end)
#endif
#ifdef USE_BINARY_SENSOR
SUB_BINARY_SENSOR(has_target)
#endif
#ifdef USE_SENSOR
SUB_SENSOR(custom_presence_of_detection)
SUB_SENSOR(movement_signs)
SUB_SENSOR(custom_motion_distance)
SUB_SENSOR(custom_spatial_static_value)
SUB_SENSOR(custom_spatial_motion_value)
SUB_SENSOR(custom_motion_speed)
SUB_SENSOR(custom_mode_num)
#endif
#ifdef USE_SWITCH
SUB_SWITCH(underlying_open_function)
#endif
#ifdef USE_BUTTON
SUB_BUTTON(restart)
SUB_BUTTON(custom_set_end)
#endif
#ifdef USE_SELECT
SUB_SELECT(scene_mode)
SUB_SELECT(unman_time)
SUB_SELECT(existence_boundary)
SUB_SELECT(motion_boundary)
#endif
#ifdef USE_NUMBER
SUB_NUMBER(sensitivity)
SUB_NUMBER(custom_mode)
SUB_NUMBER(existence_threshold)
SUB_NUMBER(motion_threshold)
SUB_NUMBER(motion_trigger)
SUB_NUMBER(motion_to_rest)
SUB_NUMBER(custom_unman_time)
#endif
protected:
char c_product_mode_[PRODUCT_BUF_MAX_SIZE + 1];
char c_product_id_[PRODUCT_BUF_MAX_SIZE + 1];
char c_hardware_model_[PRODUCT_BUF_MAX_SIZE + 1];
char c_firmware_version_[PRODUCT_BUF_MAX_SIZE + 1];
uint8_t s_output_info_switch_flag_;
uint8_t sg_recv_data_state_;
uint8_t sg_frame_len_;
uint8_t sg_data_len_;
uint8_t sg_frame_buf_[FRAME_BUF_MAX_SIZE];
uint8_t sg_frame_prase_buf_[FRAME_BUF_MAX_SIZE];
int sg_start_query_data_;
bool check_dev_inf_sign_;
bool poll_time_base_func_check_;
void update_();
void r24_split_data_frame_(uint8_t value);
void r24_parse_data_frame_(uint8_t *data, uint8_t len);
void r24_frame_parse_open_underlying_information_(uint8_t *data);
void r24_frame_parse_work_status_(uint8_t *data);
void r24_frame_parse_product_information_(uint8_t *data);
void r24_frame_parse_human_information_(uint8_t *data);
void send_query_(const uint8_t *query, size_t string_length);
public:
float get_setup_priority() const override { return esphome::setup_priority::LATE; }
void setup() override;
void dump_config() override;
void loop() override;
void get_heartbeat_packet();
void get_radar_output_information_switch();
void get_product_mode();
void get_product_id();
void get_hardware_model();
void get_firmware_version();
void get_human_status();
void get_human_motion_info();
void get_body_motion_params();
void get_keep_away();
void get_scene_mode();
void get_sensitivity();
void get_unmanned_time();
void get_custom_mode();
void get_existence_boundary();
void get_motion_boundary();
void get_spatial_static_value();
void get_spatial_motion_value();
void get_distance_of_static_object();
void get_distance_of_moving_object();
void get_target_movement_speed();
void get_existence_threshold();
void get_motion_threshold();
void get_motion_trigger_time();
void get_motion_to_rest_time();
void get_custom_unman_time();
void set_scene_mode(uint8_t value);
void set_underlying_open_function(bool enable);
void set_sensitivity(uint8_t value);
void set_restart();
void set_unman_time(uint8_t value);
void set_custom_mode(uint8_t mode);
void set_custom_end_mode();
void set_existence_boundary(uint8_t value);
void set_motion_boundary(uint8_t value);
void set_existence_threshold(uint8_t value);
void set_motion_threshold(uint8_t value);
void set_motion_trigger_time(uint8_t value);
void set_motion_to_rest_time(uint16_t value);
void set_custom_unman_time(uint16_t value);
};
} // namespace seeed_mr24hpc1
} // namespace esphome