Version 1.0.1
Updated some components. Changed main code to support the new major version of zh_config. Reducing the amount of memory used.
This commit is contained in:
parent
56c34dceb9
commit
cc245aa18c
@ -14,7 +14,7 @@
|
||||
#define ZH_OFFLINE false
|
||||
|
||||
#define ZH_NOT_USED 0xFF
|
||||
//***********************************************************************************//
|
||||
|
||||
#define ZH_DEVICE_TYPE \
|
||||
DF(ZHDT_NONE, "") \
|
||||
DF(ZHDT_GATEWAY, "gateway") \
|
||||
@ -29,15 +29,24 @@
|
||||
DF(ZHDT_BINARY_SENSOR, "espnow_sensor") \
|
||||
DF(ZHDT_MAX, "")
|
||||
|
||||
typedef enum zh_device_type_t
|
||||
typedef enum // Enumeration of device types supported by the ESP-NOW gateway.
|
||||
{
|
||||
#define DF(_value, _name) _value,
|
||||
ZH_DEVICE_TYPE
|
||||
#undef DF
|
||||
} zh_device_type_t;
|
||||
|
||||
/**
|
||||
* @brief Get char description from the enumeration zh_device_type_t value.
|
||||
*
|
||||
* @note Used for identificate device type in MQTT topics (example - "homeassistant/espnow_switch/70-03-9F-44-BE-F7").
|
||||
*
|
||||
* @param[in] value Enumeration value of zh_device_type_t.
|
||||
*
|
||||
* @return Pointer to char value
|
||||
*/
|
||||
char *zh_get_device_type_value_name(zh_device_type_t value);
|
||||
//***********************************************************************************//
|
||||
|
||||
#define ZH_PAYLOAD_TYPE \
|
||||
DF(ZHPT_NONE, "") \
|
||||
DF(ZHPT_ATTRIBUTES, "attributes") \
|
||||
@ -62,15 +71,24 @@ char *zh_get_device_type_value_name(zh_device_type_t value);
|
||||
DF(ZHPT_HARDWARE, "hardware") \
|
||||
DF(ZHPT_MAX, "")
|
||||
|
||||
typedef enum zh_payload_type_t
|
||||
typedef enum // Enumeration of payload types supported by the ESP-NOW gateway.
|
||||
{
|
||||
#define DF(_value, _name) _value,
|
||||
ZH_PAYLOAD_TYPE
|
||||
#undef DF
|
||||
} zh_payload_type_t;
|
||||
|
||||
/**
|
||||
* @brief Get char description from the enumeration zh_payload_type_t value.
|
||||
*
|
||||
* @note Used for identificate payload type in MQTT topics (example - "homeassistant/espnow_switch/70-03-9F-44-BE-F7/attributes").
|
||||
*
|
||||
* @param[in] value Enumeration value of zh_payload_type_t.
|
||||
*
|
||||
* @return Pointer to char value
|
||||
*/
|
||||
char *zh_get_payload_type_value_name(zh_payload_type_t value);
|
||||
//***********************************************************************************//
|
||||
|
||||
#define HA_COMPONENT_TYPE \
|
||||
DF(HACT_NONE, "") \
|
||||
DF(HACT_ALARM_CONTROL_PANEL, "alarm_control_panel") \
|
||||
@ -95,15 +113,24 @@ char *zh_get_payload_type_value_name(zh_payload_type_t value);
|
||||
DF(HACT_VACUUM, "vacuum") \
|
||||
DF(HACT_MAX, "")
|
||||
|
||||
typedef enum ha_component_type_t
|
||||
typedef enum // Enumeration of device types supported by the Home Assistant. For details see https://www.home-assistant.io/integrations/mqtt.
|
||||
{
|
||||
#define DF(_value, _name) _value,
|
||||
HA_COMPONENT_TYPE
|
||||
#undef DF
|
||||
} ha_component_type_t;
|
||||
|
||||
/**
|
||||
* @brief Get char description from the enumeration ha_component_type_t value.
|
||||
*
|
||||
* @note Used to prepare a configuration message for Home Assistant MQTT discovery.
|
||||
*
|
||||
* @param[in] value Enumeration value of ha_component_type_t.
|
||||
*
|
||||
* @return Pointer to char value
|
||||
*/
|
||||
char *zh_get_component_type_value_name(ha_component_type_t value);
|
||||
//***********************************************************************************//
|
||||
|
||||
#define HA_BINARY_SENSOR_DEVICE_CLASS \
|
||||
DF(HABSDC_NONE, "") \
|
||||
DF(HABSDC_BATTERY, "battery") \
|
||||
@ -136,15 +163,24 @@ char *zh_get_component_type_value_name(ha_component_type_t value);
|
||||
DF(HABSDC_WINDOW, "window") \
|
||||
DF(HABSDC_MAX, "")
|
||||
|
||||
typedef enum ha_binary_sensor_device_class_t
|
||||
typedef enum // Enumeration of binary sensor types supported by the Home Assistant. For details see https://www.home-assistant.io/integrations/binary_sensor/#device-class.
|
||||
{
|
||||
#define DF(_value, _name) _value,
|
||||
HA_BINARY_SENSOR_DEVICE_CLASS
|
||||
#undef DF
|
||||
} ha_binary_sensor_device_class_t;
|
||||
|
||||
/**
|
||||
* @brief Get char description from the enumeration ha_binary_sensor_device_class_t value.
|
||||
*
|
||||
* @note Used to prepare a configuration message for Home Assistant MQTT discovery.
|
||||
*
|
||||
* @param[in] value Enumeration value of ha_binary_sensor_device_class_t.
|
||||
*
|
||||
* @return Pointer to char value
|
||||
*/
|
||||
char *zh_get_binary_sensor_device_class_value_name(ha_binary_sensor_device_class_t value);
|
||||
//***********************************************************************************//
|
||||
|
||||
#define HA_COVER_DEVICE_CLASS \
|
||||
DF(HACDC_NONE, "") \
|
||||
DF(HACDC_AWNING, "awning") \
|
||||
@ -159,15 +195,24 @@ char *zh_get_binary_sensor_device_class_value_name(ha_binary_sensor_device_class
|
||||
DF(HACDC_WINDOW, "window") \
|
||||
DF(HACDC_MAX, "")
|
||||
|
||||
typedef enum ha_cover_device_class_t
|
||||
typedef enum // Enumeration of cover types supported by the Home Assistant. For details see https://www.home-assistant.io/integrations/cover.
|
||||
{
|
||||
#define DF(_value, _name) _value,
|
||||
HA_COVER_DEVICE_CLASS
|
||||
#undef DF
|
||||
} ha_cover_device_class_t;
|
||||
|
||||
/**
|
||||
* @brief Get char description from the enumeration ha_cover_device_class_t value.
|
||||
*
|
||||
* @note Used to prepare a configuration message for Home Assistant MQTT discovery.
|
||||
*
|
||||
* @param[in] value Enumeration value of ha_cover_device_class_t.
|
||||
*
|
||||
* @return Pointer to char value
|
||||
*/
|
||||
char *zh_get_cover_device_class_value_name(ha_cover_device_class_t value);
|
||||
//***********************************************************************************//
|
||||
|
||||
#define HA_SENSOR_DEVICE_CLASS \
|
||||
DF(HASDC_NONE, "") \
|
||||
DF(HASDC_APPARENT_POWER, "apparent_power") \
|
||||
@ -212,30 +257,48 @@ char *zh_get_cover_device_class_value_name(ha_cover_device_class_t value);
|
||||
DF(HASDC_WIND_SPEED, "wind_speed") \
|
||||
DF(HASDC_MAX, "")
|
||||
|
||||
typedef enum ha_sensor_device_class_t
|
||||
typedef enum // Enumeration of sensor types supported by the Home Assistant. For details see https://www.home-assistant.io/integrations/sensor.
|
||||
{
|
||||
#define DF(_value, _name) _value,
|
||||
HA_SENSOR_DEVICE_CLASS
|
||||
#undef DF
|
||||
} ha_sensor_device_class_t;
|
||||
|
||||
/**
|
||||
* @brief Get char description from the enumeration ha_sensor_device_class_t value.
|
||||
*
|
||||
* @note Used to prepare a configuration message for Home Assistant MQTT discovery.
|
||||
*
|
||||
* @param[in] value Enumeration value of ha_sensor_device_class_t.
|
||||
*
|
||||
* @return Pointer to char value
|
||||
*/
|
||||
char *zh_get_sensor_device_class_value_name(ha_sensor_device_class_t value);
|
||||
//***********************************************************************************//
|
||||
|
||||
#define HA_SWITCH_DEVICE_CLASS \
|
||||
DF(HASWDC_NONE, "") \
|
||||
DF(HASWDC_OUTLET, "outlet") \
|
||||
DF(HASWDC_SWITCH, "switch") \
|
||||
DF(HASWDC_MAX, "")
|
||||
|
||||
typedef enum ha_switch_device_class_t
|
||||
typedef enum // Enumeration of switch types supported by the Home Assistant. For details see https://www.home-assistant.io/integrations/switch.
|
||||
{
|
||||
#define DF(_value, _name) _value,
|
||||
HA_SWITCH_DEVICE_CLASS
|
||||
#undef DF
|
||||
} ha_switch_device_class_t;
|
||||
|
||||
/**
|
||||
* @brief Get char description from the enumeration ha_switch_device_class_t value.
|
||||
*
|
||||
* @note Used to prepare a configuration message for Home Assistant MQTT discovery.
|
||||
*
|
||||
* @param[in] value Enumeration value of ha_switch_device_class_t.
|
||||
*
|
||||
* @return Pointer to char value
|
||||
*/
|
||||
char *zh_get_switch_device_class_value_name(ha_switch_device_class_t value);
|
||||
//***********************************************************************************//
|
||||
|
||||
#define HA_ON_OFF_TYPE \
|
||||
DF(HAONOFT_NONE, "") \
|
||||
DF(HAONOFT_ON, "ON") \
|
||||
@ -252,15 +315,24 @@ char *zh_get_switch_device_class_value_name(ha_switch_device_class_t value);
|
||||
DF(HAONOFT_LEAKAGE, "LEAKAGE") \
|
||||
DF(HAONOFT_MAX, "")
|
||||
|
||||
typedef enum ha_on_off_type_t
|
||||
typedef enum // Enumeration of payload_on / payload_off types supported by gateway.
|
||||
{
|
||||
#define DF(_value, _name) _value,
|
||||
HA_ON_OFF_TYPE
|
||||
#undef DF
|
||||
} ha_on_off_type_t;
|
||||
|
||||
/**
|
||||
* @brief Get char description from the enumeration ha_on_off_type_t value.
|
||||
*
|
||||
* @note Used to prepare a configuration message for Home Assistant MQTT discovery.
|
||||
*
|
||||
* @param[in] value Enumeration value of ha_on_off_type_t.
|
||||
*
|
||||
* @return Pointer to char value
|
||||
*/
|
||||
char *zh_get_on_off_type_value_name(ha_on_off_type_t value);
|
||||
//***********************************************************************************//
|
||||
|
||||
#define HA_CHIP_TYPE \
|
||||
DF(HACHT_NONE, "") \
|
||||
DF(HACHT_ESP32, "ESP32") \
|
||||
@ -272,264 +344,243 @@ char *zh_get_on_off_type_value_name(ha_on_off_type_t value);
|
||||
DF(HACHT_ESP32C6, "ESP32-C6") \
|
||||
DF(HACHT_MAX, "")
|
||||
|
||||
typedef enum ha_chip_type_t
|
||||
typedef enum // Enumeration of ESP module types supported by gateway.
|
||||
{
|
||||
#define DF(_value, _name) _value,
|
||||
HA_CHIP_TYPE
|
||||
#undef DF
|
||||
} ha_chip_type_t;
|
||||
|
||||
/**
|
||||
* @brief Get char description from the enumeration ha_chip_type_t value.
|
||||
*
|
||||
* @note Used to prepare a attribytes message by ESP-NOW gateway.
|
||||
*
|
||||
* @param[in] value Enumeration value of ha_chip_type_t.
|
||||
*
|
||||
* @return Pointer to char value
|
||||
*/
|
||||
char *zh_get_chip_type_value_name(ha_chip_type_t value);
|
||||
//***********************************************************************************//
|
||||
|
||||
#define HA_LED_EFFECT_TYPE \
|
||||
DF(HALET_NONE, "") \
|
||||
DF(HALET_MAX, "")
|
||||
|
||||
typedef enum ha_led_effect_type_t
|
||||
typedef enum // Enumeration of light effect supported by gateway.
|
||||
{
|
||||
#define DF(_value, _name) _value,
|
||||
HA_LED_EFFECT_TYPE
|
||||
#undef DF
|
||||
} ha_led_effect_type_t;
|
||||
//***********************************************************************************//
|
||||
#define HA_LED_TYPE \
|
||||
DF(HALT_NONE, "") \
|
||||
DF(HALT_W, "W") \
|
||||
DF(HALT_WW, "WW") \
|
||||
DF(HALT_RGB, "RGB") \
|
||||
DF(HALT_RGBW, "RGBW") \
|
||||
DF(HALT_RGBWW, "RGBWW") \
|
||||
|
||||
#define HA_LED_TYPE \
|
||||
DF(HALT_NONE, "") \
|
||||
DF(HALT_W, "Cold white or Warm white or one another color") \
|
||||
DF(HALT_WW, "Cold white + Warm white") \
|
||||
DF(HALT_RGB, "Red + Green + Blue colors") \
|
||||
DF(HALT_RGBW, "Red + Green + Blue + Cold white or Warm white colors") \
|
||||
DF(HALT_RGBWW, "Red + Green + Blue + Cold white + Warm white colors") \
|
||||
DF(HALT_MAX, "")
|
||||
|
||||
typedef enum ha_led_type_t
|
||||
typedef enum // Enumeration of led types supported by gateway.
|
||||
{
|
||||
#define DF(_value, _name) _value,
|
||||
HA_LED_TYPE
|
||||
#undef DF
|
||||
} ha_led_type_t;
|
||||
|
||||
char *zh_get_led_type_value_name(ha_led_type_t value);
|
||||
//***********************************************************************************//
|
||||
#define HA_SENSOR_TYPE \
|
||||
DF(HAST_NONE, "") \
|
||||
DF(HAST_DS18B20, "DS18B20") \
|
||||
DF(HAST_DHT11, "DHT11") \
|
||||
DF(HAST_DHT22, "DHT22") \
|
||||
DF(HAST_GATEWAY, "GATEWAY") \
|
||||
DF(HAST_WINDOW, "WINDOW") \
|
||||
DF(HAST_DOOR, "DOOR") \
|
||||
DF(HAST_LEAKAGE, "LEAKAGE") \
|
||||
DF(HAST_GATEWAY, "") \
|
||||
DF(HAST_WINDOW, "") \
|
||||
DF(HAST_DOOR, "") \
|
||||
DF(HAST_LEAKAGE, "") \
|
||||
DF(HAST_MAX, "")
|
||||
|
||||
typedef enum ha_sensor_type_t
|
||||
typedef enum // Enumeration of sensor / binary sensor supported by gateway.
|
||||
{
|
||||
#define DF(_value, _name) _value,
|
||||
HA_SENSOR_TYPE
|
||||
#undef DF
|
||||
} ha_sensor_type_t;
|
||||
|
||||
/**
|
||||
* @brief Get char description from the enumeration ha_sensor_type_t value.
|
||||
*
|
||||
* @note Used to prepare at attributes messages and status messages by ESP-NOW gateway.
|
||||
*
|
||||
* @param[in] value Enumeration value of ha_sensor_type_t.
|
||||
*
|
||||
* @return Pointer to char value
|
||||
*/
|
||||
char *zh_get_sensor_type_value_name(ha_sensor_type_t value);
|
||||
//***********************************************************************************//
|
||||
typedef struct zh_sensor_config_message_t
|
||||
{
|
||||
uint8_t unique_id;
|
||||
ha_sensor_device_class_t sensor_device_class;
|
||||
char unit_of_measurement[5];
|
||||
uint8_t suggested_display_precision;
|
||||
uint16_t expire_after;
|
||||
bool enabled_by_default;
|
||||
bool force_update;
|
||||
uint8_t qos;
|
||||
bool retain;
|
||||
} __attribute__((packed)) zh_sensor_config_message_t;
|
||||
|
||||
typedef struct zh_sensor_hardware_config_message_t
|
||||
typedef struct // Structure for data exchange between ESP-NOW devices.
|
||||
{
|
||||
ha_sensor_type_t sensor_type;
|
||||
uint8_t sensor_pin_1;
|
||||
uint8_t sensor_pin_2;
|
||||
uint8_t power_pin;
|
||||
uint16_t measurement_frequency;
|
||||
bool battery_power;
|
||||
} __attribute__((packed)) zh_sensor_hardware_config_message_t;
|
||||
zh_device_type_t device_type; // Type of ESP-NOW message sender (gateway, switch, led, etc…).
|
||||
zh_payload_type_t payload_type; // Type of payload for indicating to the recipient of the message into which required structure the received data should be converted (if required).
|
||||
union // Main union for data exchange between ESP-NOW devices. @attention Usually not used in this view. According to the device_type data and payload_type data, the ESP-NOW device should convert the payload_data to the required secondary structure/union (excluding the case of having to send an empty message).
|
||||
{
|
||||
struct // Secondary structure of attributes message.
|
||||
{
|
||||
ha_chip_type_t chip_type; // Used ESP module type.
|
||||
ha_sensor_type_t sensor_type; // Used sensor/binary sensor type (if present).
|
||||
char flash_size[5]; // SoC flash memory.
|
||||
uint8_t cpu_frequency; // SoC frequency.
|
||||
uint32_t heap_size; // Current HEAP memory size.
|
||||
uint32_t min_heap_size; // Minimum HEAP memory size.
|
||||
uint8_t reset_reason; // Last reset reason.
|
||||
char app_name[32]; // Firmware application name.
|
||||
char app_version[32]; // Firmware application version.
|
||||
uint32_t uptime; // Uptime work (in seconds).
|
||||
} attributes_message;
|
||||
struct // Secondary structure of keep alive message.
|
||||
{
|
||||
bool online_status; // Current status of ESP-NOW device operation. @note Online (true) / Offline (false).
|
||||
uint8_t message_frequency; // Frequency of transmission of the keep alive message by ESP-NOW device. @note Used by the ESP-NOW gateway to set the offline status of a ESP-NOW node when the message sending time is exceeded.
|
||||
} keep_alive_message;
|
||||
union // Secondary union of structures of any configuration messages. @attention Not used in this view. Should be converted to the required tertiary structure.
|
||||
{
|
||||
struct // Tertiary structure of zh_espnow_binary_sensor node configuration message. @note Used for publish at MQTT zh_espnow_binary_sensor node configuration message.
|
||||
{
|
||||
uint8_t unique_id; // An ID that uniquely identifies this binary sensor device. @note The ID will look like this - "MAC-X" (for example 64-B7-08-31-00-A8-1). @attention If two binary sensors have the same unique ID, Home Assistant will raise an exception.
|
||||
ha_binary_sensor_device_class_t binary_sensor_device_class; // Binary sensor type supported by the Home Assistant. @note Used to prepare a correct configuration message for Home Assistant MQTT discovery. For details see https://www.home-assistant.io/integrations/binary_sensor.
|
||||
ha_on_off_type_t payload_on; // The payload that represents ON state.
|
||||
ha_on_off_type_t payload_off; // The payload that represents OFF state.
|
||||
uint16_t expire_after; // If set, it defines the number of seconds after the sensors state expires, if its not updated. After expiry, the sensors state becomes unavailable.
|
||||
uint16_t off_delay; // For sensors that only send on state updates (like PIRs), this variable sets a delay in seconds after which the sensors state will be updated back to off.
|
||||
bool enabled_by_default; // Flag which defines if the entity should be enabled when first added.
|
||||
bool force_update; // Sends update events (which results in update of state objects last_changed) even if the sensors state hasnt changed. Useful if you want to have meaningful value graphs in history or want to create an automation that triggers on every incoming state message (not only when the sensors new state is different to the current one).
|
||||
uint8_t qos; // The maximum QoS level to be used when receiving and publishing messages.
|
||||
bool retain; // If the published message should have the retain flag on or not.
|
||||
} binary_sensor_config_message;
|
||||
struct // Tertiary structure of zh_espnow_sensor node configuration message. @note Used publish at MQTT zh_espnow_sensor node configuration message.
|
||||
{
|
||||
uint8_t unique_id; // An ID that uniquely identifies this sensor device. @note The ID will look like this - "MAC-X" (for example 64-B7-08-31-00-A8-1). @attention If two sensors have the same unique ID, Home Assistant will raise an exception.
|
||||
ha_sensor_device_class_t sensor_device_class; // Sensor type supported by the Home Assistant. @note Used to prepare a correct configuration message for Home Assistant MQTT discovery. For details see https://www.home-assistant.io/integrations/sensor.
|
||||
char unit_of_measurement[5]; // Defines the units of measurement of the sensor, if any.
|
||||
uint8_t suggested_display_precision; // The number of decimals which should be used in the sensors state after rounding.
|
||||
uint16_t expire_after; // If set, it defines the number of seconds after the sensors state expires, if its not updated. After expiry, the sensors state becomes unavailable.
|
||||
bool enabled_by_default; // Flag which defines if the entity should be enabled when first added.
|
||||
bool force_update; // Sends update events (which results in update of state objects last_changed) even if the sensors state hasnt changed. Useful if you want to have meaningful value graphs in history or want to create an automation that triggers on every incoming state message (not only when the sensors new state is different to the current one).
|
||||
uint8_t qos; // The maximum QoS level to be used when receiving and publishing messages.
|
||||
bool retain; // If the published message should have the retain flag on or not.
|
||||
} sensor_config_message;
|
||||
struct // Tertiary structure of zh_espnow_sensor node hardware configuration message. @note Used for change hardware configuration / publish at MQTT zh_espnow_sensor node hardware configuration message.
|
||||
{
|
||||
ha_sensor_type_t sensor_type; // Sensor types. @note Used in zh_espnow_sensor firmware only.
|
||||
uint8_t sensor_pin_1; // Sensor GPIO number 1. @note Main pin for 1-wire sensors, SDA pin for I2C sensors.
|
||||
uint8_t sensor_pin_2; // Sensor GPIO number 2. @note SCL pin for I2C sensors.
|
||||
uint8_t power_pin; // Power GPIO number (if used sensor power control).
|
||||
uint16_t measurement_frequency; // Measurement frequency (sleep time on battery powering).
|
||||
bool battery_power; // Battery powered. @note Battery powering (true) / external powering (false).
|
||||
} sensor_hardware_config_message;
|
||||
struct // Tertiary structure of zh_espnow_led node configuration message. @note Used for publish at MQTT zh_espnow_led node configuration message.
|
||||
{
|
||||
uint8_t unique_id; // An ID that uniquely identifies this light device. @note The ID will look like this - "MAC-X" (for example 64-B7-08-31-00-A8-1). @attention If two lights have the same unique ID, Home Assistant will raise an exception.
|
||||
ha_led_type_t led_type; // Led type. @note Used to identify the led type by ESP-NOW gateway and prepare a correct configuration message for Home Assistant MQTT discovery.
|
||||
ha_on_off_type_t payload_on; // The payload that represents ON state.
|
||||
ha_on_off_type_t payload_off; // The payload that represents OFF state.
|
||||
bool enabled_by_default; // Flag which defines if the entity should be enabled when first added.
|
||||
bool optimistic; // Flag that defines if led works in optimistic mode.
|
||||
uint8_t qos; // The maximum QoS level to be used when receiving and publishing messages.
|
||||
bool retain; // If the published message should have the retain flag on or not.
|
||||
} led_config_message;
|
||||
struct // Tertiary structure of zh_espnow_led node hardware configuration message. @note Used for change hardware configuration / publish at MQTT zh_espnow_led node hardware configuration message.
|
||||
{
|
||||
ha_led_type_t led_type; // Led types. @note Used in zh_espnow_led firmware only.
|
||||
uint8_t first_white_pin; // First white GPIO number.
|
||||
uint8_t second_white_pin; // Second white GPIO number (if present).
|
||||
uint8_t red_pin; // Red GPIO number (if present).
|
||||
uint8_t green_pin; // Green GPIO number (if present).
|
||||
uint8_t blue_pin; // Blue GPIO number (if present).
|
||||
} led_hardware_config_message;
|
||||
struct // Tertiary structure of zh_espnow_switch node configuration message. @note Used for publish at MQTT zh_espnow_switch node configuration message.
|
||||
{
|
||||
uint8_t unique_id; // An ID that uniquely identifies this switch device. @note The ID will look like this - "MAC-X" (for example 64-B7-08-31-00-A8-1). @attention If two switches have the same unique ID, Home Assistant will raise an exception.
|
||||
ha_switch_device_class_t device_class; // Switch type supported by the Home Assistant. @note Used to prepare a correct configuration message for Home Assistant MQTT discovery. For details see https://www.home-assistant.io/integrations/switch
|
||||
ha_on_off_type_t payload_on; // The payload that represents ON state.
|
||||
ha_on_off_type_t payload_off; // The payload that represents OFF state.
|
||||
bool enabled_by_default; // Flag which defines if the entity should be enabled when first added.
|
||||
bool optimistic; // Flag that defines if switch works in optimistic mode.
|
||||
uint8_t qos; // The maximum QoS level to be used when receiving and publishing messages.
|
||||
bool retain; // If the published message should have the retain flag on or not.
|
||||
} switch_config_message;
|
||||
struct // Tertiary structure of zh_espnow_switch node hardware configuration message. @note Used for change hardware configuration / publish at MQTT zh_espnow_switch node hardware configuration message.
|
||||
{
|
||||
uint8_t relay_pin; // Relay GPIO number.
|
||||
bool relay_on_level; // Relay ON level. @note HIGH (true) / LOW (false).
|
||||
uint8_t led_pin; // Led GPIO number (if present).
|
||||
bool led_on_level; // Led ON level (if present). @note HIGH (true) / LOW (false).
|
||||
uint8_t int_button_pin; // Internal button GPIO number (if present).
|
||||
bool int_button_on_level; // Internal button trigger level (if present). @note HIGH (true) / LOW (false).
|
||||
uint8_t ext_button_pin; // External button GPIO number (if present).
|
||||
bool ext_button_on_level; // External button trigger level (if present). @note HIGH (true) / LOW (false).
|
||||
uint8_t sensor_pin; // Sensor GPIO number (if present).
|
||||
ha_sensor_type_t sensor_type; // Sensor types (if present). @note Used to identify the sensor type by ESP-NOW gateway and send the appropriate sensor status messages to MQTT.
|
||||
} switch_hardware_config_message;
|
||||
} config_message;
|
||||
union // Secondary union of structures of any status messages. @attention Not used in this view. Should be converted to the required tertiary structure.
|
||||
{
|
||||
struct // Tertiary structure of zh_espnow_binary_sensor node status message.
|
||||
{
|
||||
ha_sensor_type_t sensor_type; // Binary sensor types. @note Used to identify the binary sensor type by ESP-NOW gateway and send the appropriate binary sensor status messages to MQTT.
|
||||
ha_on_off_type_t connect; // Event that caused the sensor to be triggered (if present). @note Example - CONNECT @attention Must be same with set on binary_sensor_config_message structure.
|
||||
ha_on_off_type_t open; // Event that caused the sensor to be triggered (if present). @note Example - OPEN / CLOSE @attention Must be same with set on binary_sensor_config_message structure.
|
||||
ha_on_off_type_t battery; // Event that caused the sensor to be triggered (if present). @note Example - HIGH / LOW @attention Must be same with set on binary_sensor_config_message structure.
|
||||
ha_on_off_type_t leakage; // Event that caused the sensor to be triggered (if present). @note Example - DRY / LEAKAGE @attention Must be same with set on binary_sensor_config_message structure.
|
||||
ha_on_off_type_t reserved_1; // Reserved for future development.
|
||||
ha_on_off_type_t reserved_2; // Reserved for future development.
|
||||
ha_on_off_type_t reserved_3; // Reserved for future development.
|
||||
ha_on_off_type_t reserved_4; // Reserved for future development.
|
||||
ha_on_off_type_t reserved_5; // Reserved for future development.
|
||||
} binary_sensor_status_message;
|
||||
struct // Tertiary structure of zh_espnow_sensor node status message.
|
||||
{
|
||||
ha_sensor_type_t sensor_type; // Sensor types. @note Used to identify the sensor type by ESP-NOW gateway and send the appropriate sensor status messages to MQTT.
|
||||
float temperature; // Temperature value (if present).
|
||||
float humidity; // Humidity value (if present).
|
||||
float pressure; // Pressure value (if present).
|
||||
float quality; // Quality value (if present).
|
||||
float voltage; // Voltage value (if present).
|
||||
float reserved_1; // Reserved for future development.
|
||||
float reserved_2; // Reserved for future development.
|
||||
float reserved_3; // Reserved for future development.
|
||||
float reserved_4; // Reserved for future development.
|
||||
float reserved_5; // Reserved for future development.
|
||||
} sensor_status_message;
|
||||
struct // Tertiary structure of zh_espnow_led node status message.
|
||||
{
|
||||
ha_on_off_type_t status; // Status of the zh_espnow_led. @note Example - ON / OFF. @attention Must be same with set on led_config_message structure.
|
||||
uint8_t brightness; // Brightness value.
|
||||
uint16_t temperature; // White color temperature value (if present).
|
||||
uint8_t red; // Red color value (if present).
|
||||
uint8_t green; // Green color value (if present).
|
||||
uint8_t blue; // Blue color value (if present).
|
||||
ha_led_effect_type_t effect; // Reserved for future development.
|
||||
} led_status_message;
|
||||
struct // Tertiary structure of zh_espnow_switch node status message.
|
||||
{
|
||||
ha_on_off_type_t status; // Status of the zh_espnow_switch. @note Example - ON / OFF. @attention Must be same with set on switch_config_message structure.
|
||||
} switch_status_message;
|
||||
} status_message;
|
||||
union // Secondary union of structures of any OTA update messages. @attention Not used in this view. Should be converted to the required tertiary structure.
|
||||
{
|
||||
struct // Tertiary structure for transfer from ESP-NOW node to ESP-NOW gateway system information for OTA update initialization.
|
||||
{
|
||||
char app_name[32]; // Firmware application name.
|
||||
char app_version[32]; // Firmware application version.
|
||||
} espnow_ota_data;
|
||||
struct // Tertiary structure for transfer from ESP-NOW gateway to ESP-NOW node OTA update data.
|
||||
{
|
||||
uint16_t part; // System counter for the number of new firmware sent parts.
|
||||
uint8_t data_len; // Size of sent data @note Except for the last part, the data is transmitted in 200 bytes part size.
|
||||
uint8_t data[200]; // Sent data.
|
||||
} espnow_ota_message;
|
||||
} ota_message;
|
||||
} payload_data;
|
||||
|
||||
typedef struct zh_binary_sensor_config_message_t
|
||||
{
|
||||
uint8_t unique_id;
|
||||
ha_binary_sensor_device_class_t binary_sensor_device_class;
|
||||
ha_on_off_type_t payload_on;
|
||||
ha_on_off_type_t payload_off;
|
||||
uint16_t expire_after;
|
||||
uint16_t off_delay;
|
||||
bool enabled_by_default;
|
||||
bool force_update;
|
||||
uint8_t qos;
|
||||
bool retain;
|
||||
} __attribute__((packed)) zh_binary_sensor_config_message_t;
|
||||
|
||||
typedef struct zh_led_config_message_t
|
||||
{
|
||||
uint8_t unique_id;
|
||||
ha_led_type_t led_type;
|
||||
ha_on_off_type_t payload_on;
|
||||
ha_on_off_type_t payload_off;
|
||||
bool enabled_by_default;
|
||||
bool optimistic;
|
||||
uint8_t qos;
|
||||
bool retain;
|
||||
} __attribute__((packed)) zh_led_config_message_t;
|
||||
|
||||
typedef struct zh_led_hardware_config_message_t
|
||||
{
|
||||
ha_led_type_t led_type;
|
||||
uint8_t first_white_pin;
|
||||
uint8_t second_white_pin;
|
||||
uint8_t red_pin;
|
||||
uint8_t green_pin;
|
||||
uint8_t blue_pin;
|
||||
} __attribute__((packed)) zh_led_hardware_config_message_t;
|
||||
|
||||
typedef struct zh_switch_config_message_t
|
||||
{
|
||||
uint8_t unique_id;
|
||||
ha_switch_device_class_t device_class;
|
||||
ha_on_off_type_t payload_on;
|
||||
ha_on_off_type_t payload_off;
|
||||
bool enabled_by_default;
|
||||
bool optimistic;
|
||||
uint8_t qos;
|
||||
bool retain;
|
||||
} __attribute__((packed)) zh_switch_config_message_t;
|
||||
|
||||
typedef struct zh_switch_hardware_config_message_t
|
||||
{
|
||||
uint8_t relay_pin;
|
||||
bool relay_on_level;
|
||||
uint8_t led_pin;
|
||||
bool led_on_level;
|
||||
uint8_t int_button_pin;
|
||||
bool int_button_on_level;
|
||||
uint8_t ext_button_pin;
|
||||
bool ext_button_on_level;
|
||||
uint8_t sensor_pin;
|
||||
ha_sensor_type_t sensor_type;
|
||||
} __attribute__((packed)) zh_switch_hardware_config_message_t;
|
||||
//***********************************************************************************//
|
||||
typedef struct zh_sensor_status_message_t
|
||||
{
|
||||
ha_sensor_type_t sensor_type;
|
||||
float temperature;
|
||||
float humidity;
|
||||
float pressure;
|
||||
float quality;
|
||||
float voltage;
|
||||
float reserved_1; // Reserved for future development.
|
||||
float reserved_2; // Reserved for future development.
|
||||
float reserved_3; // Reserved for future development.
|
||||
float reserved_4; // Reserved for future development.
|
||||
float reserved_5; // Reserved for future development.
|
||||
} __attribute__((packed)) zh_sensor_status_message_t;
|
||||
|
||||
typedef struct zh_binary_sensor_status_message_t
|
||||
{
|
||||
ha_sensor_type_t sensor_type;
|
||||
ha_on_off_type_t connect;
|
||||
ha_on_off_type_t open;
|
||||
ha_on_off_type_t battery;
|
||||
ha_on_off_type_t leakage;
|
||||
ha_on_off_type_t reserved_1; // Reserved for future development.
|
||||
ha_on_off_type_t reserved_2; // Reserved for future development.
|
||||
ha_on_off_type_t reserved_3; // Reserved for future development.
|
||||
ha_on_off_type_t reserved_4; // Reserved for future development.
|
||||
ha_on_off_type_t reserved_5; // Reserved for future development.
|
||||
} __attribute__((packed)) zh_binary_sensor_status_message_t;
|
||||
|
||||
typedef struct zh_led_status_message_t
|
||||
{
|
||||
ha_on_off_type_t status;
|
||||
uint8_t brightness;
|
||||
uint16_t temperature;
|
||||
uint8_t red;
|
||||
uint8_t green;
|
||||
uint8_t blue;
|
||||
ha_led_effect_type_t effect; // Reserved for future development.
|
||||
} __attribute__((packed)) zh_led_status_message_t;
|
||||
|
||||
typedef struct zh_switch_status_message_t
|
||||
{
|
||||
ha_on_off_type_t status;
|
||||
} __attribute__((packed)) zh_switch_status_message_t;
|
||||
//***********************************************************************************//
|
||||
typedef struct zh_attributes_message_t
|
||||
{
|
||||
ha_chip_type_t chip_type;
|
||||
ha_sensor_type_t sensor_type;
|
||||
char flash_size[5];
|
||||
uint8_t cpu_frequency;
|
||||
uint32_t heap_size;
|
||||
uint32_t min_heap_size;
|
||||
uint8_t reset_reason;
|
||||
char app_name[32];
|
||||
char app_version[32];
|
||||
uint32_t uptime;
|
||||
} __attribute__((packed)) zh_attributes_message_t;
|
||||
|
||||
typedef struct zh_keep_alive_message_t
|
||||
{
|
||||
bool online_status;
|
||||
uint8_t message_frequency;
|
||||
} __attribute__((packed)) zh_keep_alive_message_t;
|
||||
|
||||
typedef union zh_config_message_t
|
||||
{
|
||||
zh_binary_sensor_config_message_t binary_sensor_config_message;
|
||||
zh_sensor_config_message_t sensor_config_message;
|
||||
zh_sensor_hardware_config_message_t sensor_hardware_config_message;
|
||||
zh_led_config_message_t led_config_message;
|
||||
zh_led_hardware_config_message_t led_hardware_config_message;
|
||||
zh_switch_config_message_t switch_config_message;
|
||||
zh_switch_hardware_config_message_t switch_hardware_config_message;
|
||||
} __attribute__((packed)) zh_config_message_t;
|
||||
|
||||
typedef union zh_status_message_t
|
||||
{
|
||||
zh_binary_sensor_status_message_t binary_sensor_status_message;
|
||||
zh_sensor_status_message_t sensor_status_message;
|
||||
zh_led_status_message_t led_status_message;
|
||||
zh_switch_status_message_t switch_status_message;
|
||||
} __attribute__((packed)) zh_status_message_t;
|
||||
|
||||
typedef struct zh_espnow_ota_message_t
|
||||
{
|
||||
ha_chip_type_t chip_type;
|
||||
char app_name[32];
|
||||
char app_version[32];
|
||||
uint16_t part;
|
||||
uint8_t data_len;
|
||||
uint8_t data[128];
|
||||
} __attribute__((packed)) zh_espnow_ota_message_t;
|
||||
|
||||
typedef struct zh_espnow_ota_data_t
|
||||
{
|
||||
ha_chip_type_t chip_type;
|
||||
zh_device_type_t device_type;
|
||||
char app_name[32];
|
||||
char app_version[32];
|
||||
uint8_t mac_addr[6];
|
||||
} __attribute__((packed)) zh_espnow_ota_data_t;
|
||||
|
||||
typedef union zh_payload_data_t
|
||||
{
|
||||
zh_attributes_message_t attributes_message;
|
||||
zh_keep_alive_message_t keep_alive_message;
|
||||
zh_config_message_t config_message;
|
||||
zh_status_message_t status_message;
|
||||
zh_espnow_ota_message_t espnow_ota_message;
|
||||
} __attribute__((packed)) zh_payload_data_t;
|
||||
|
||||
typedef struct zh_espnow_data_t
|
||||
{
|
||||
zh_device_type_t device_type;
|
||||
zh_payload_type_t payload_type;
|
||||
zh_payload_data_t payload_data;
|
||||
} __attribute__((packed)) zh_espnow_data_t;
|
@ -1 +1 @@
|
||||
1.0.0
|
||||
2.0.0
|
@ -144,22 +144,6 @@ char *zh_get_chip_type_value_name(ha_chip_type_t value)
|
||||
return "";
|
||||
}
|
||||
|
||||
char *zh_get_led_type_value_name(ha_led_type_t value)
|
||||
{
|
||||
switch (value)
|
||||
{
|
||||
#define DF(_value, _name) \
|
||||
case _value: \
|
||||
return _name;
|
||||
HA_LED_TYPE
|
||||
#undef DF
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
char *zh_get_sensor_type_value_name(ha_sensor_type_t value)
|
||||
{
|
||||
switch (value)
|
||||
|
@ -1 +1 @@
|
||||
1.0.2
|
||||
1.0.3
|
@ -62,11 +62,22 @@ esp_err_t zh_espnow_init(const zh_espnow_init_config_t *config)
|
||||
ESP_LOGE(TAG, "ESP-NOW initialization fail. WiFi channel.");
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
if (esp_wifi_set_channel(_init_config.wifi_channel, WIFI_SECOND_CHAN_NONE) != ESP_OK)
|
||||
esp_err_t err = esp_wifi_set_channel(_init_config.wifi_channel, WIFI_SECOND_CHAN_NONE);
|
||||
if (err == ESP_ERR_WIFI_NOT_INIT || err == ESP_ERR_WIFI_NOT_STARTED)
|
||||
{
|
||||
ESP_LOGE(TAG, "ESP-NOW initialization fail. WiFi not initialized.");
|
||||
return ESP_ERR_WIFI_NOT_INIT;
|
||||
}
|
||||
else if (err == ESP_FAIL)
|
||||
{
|
||||
uint8_t prim = 0;
|
||||
wifi_second_chan_t sec = 0;
|
||||
esp_wifi_get_channel(&prim, &sec);
|
||||
if (prim != _init_config.wifi_channel)
|
||||
{
|
||||
ESP_LOGW(TAG, "ESP-NOW initialization warning. The device is connected to the router. Channel %d will be used for ESP-NOW.", prim);
|
||||
}
|
||||
}
|
||||
_event_group_handle = xEventGroupCreate();
|
||||
_queue_handle = xQueueCreate(_init_config.queue_size, sizeof(_queue_t));
|
||||
if (esp_now_init() != ESP_OK || esp_now_register_send_cb(_send_cb) != ESP_OK || esp_now_register_recv_cb(_recv_cb) != ESP_OK)
|
||||
|
@ -312,22 +312,20 @@ void zh_send_switch_attributes_message_task(void *pvParameter)
|
||||
{
|
||||
switch_config_t *switch_config = pvParameter;
|
||||
const esp_app_desc_t *app_info = get_app_description();
|
||||
zh_attributes_message_t attributes_message = {0};
|
||||
attributes_message.chip_type = ZH_CHIP_TYPE;
|
||||
strcpy(attributes_message.flash_size, CONFIG_ESPTOOLPY_FLASHSIZE);
|
||||
attributes_message.cpu_frequency = ZH_CPU_FREQUENCY;
|
||||
attributes_message.reset_reason = (uint8_t)esp_reset_reason();
|
||||
strcpy(attributes_message.app_name, app_info->project_name);
|
||||
strcpy(attributes_message.app_version, app_info->version);
|
||||
zh_espnow_data_t data = {0};
|
||||
data.device_type = ZHDT_SWITCH;
|
||||
data.payload_type = ZHPT_ATTRIBUTES;
|
||||
data.payload_data.attributes_message.chip_type = ZH_CHIP_TYPE;
|
||||
strcpy(data.payload_data.attributes_message.flash_size, CONFIG_ESPTOOLPY_FLASHSIZE);
|
||||
data.payload_data.attributes_message.cpu_frequency = ZH_CPU_FREQUENCY;
|
||||
data.payload_data.attributes_message.reset_reason = (uint8_t)esp_reset_reason();
|
||||
strcpy(data.payload_data.attributes_message.app_name, app_info->project_name);
|
||||
strcpy(data.payload_data.attributes_message.app_version, app_info->version);
|
||||
for (;;)
|
||||
{
|
||||
attributes_message.heap_size = esp_get_free_heap_size();
|
||||
attributes_message.min_heap_size = esp_get_minimum_free_heap_size();
|
||||
attributes_message.uptime = esp_timer_get_time() / 1000000;
|
||||
data.payload_data = (zh_payload_data_t)attributes_message;
|
||||
data.payload_data.attributes_message.heap_size = esp_get_free_heap_size();
|
||||
data.payload_data.attributes_message.min_heap_size = esp_get_minimum_free_heap_size();
|
||||
data.payload_data.attributes_message.uptime = esp_timer_get_time() / 1000000;
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
|
||||
vTaskDelay(ZH_SWITCH_ATTRIBUTES_MESSAGE_FREQUENCY * 1000 / portTICK_PERIOD_MS);
|
||||
}
|
||||
@ -336,45 +334,46 @@ void zh_send_switch_attributes_message_task(void *pvParameter)
|
||||
|
||||
void zh_send_switch_config_message(const switch_config_t *switch_config)
|
||||
{
|
||||
zh_switch_config_message_t switch_config_message = {0};
|
||||
switch_config_message.unique_id = 1;
|
||||
switch_config_message.device_class = HASWDC_SWITCH;
|
||||
switch_config_message.payload_on = HAONOFT_ON;
|
||||
switch_config_message.payload_off = HAONOFT_OFF;
|
||||
switch_config_message.enabled_by_default = true;
|
||||
switch_config_message.optimistic = false;
|
||||
switch_config_message.qos = 2;
|
||||
switch_config_message.retain = true;
|
||||
zh_config_message_t config_message = {0};
|
||||
config_message = (zh_config_message_t)switch_config_message;
|
||||
zh_espnow_data_t data = {0};
|
||||
data.device_type = ZHDT_SWITCH;
|
||||
data.payload_type = ZHPT_CONFIG;
|
||||
data.payload_data = (zh_payload_data_t)config_message;
|
||||
data.payload_data.config_message.switch_config_message.unique_id = 1;
|
||||
data.payload_data.config_message.switch_config_message.device_class = HASWDC_SWITCH;
|
||||
data.payload_data.config_message.switch_config_message.payload_on = HAONOFT_ON;
|
||||
data.payload_data.config_message.switch_config_message.payload_off = HAONOFT_OFF;
|
||||
data.payload_data.config_message.switch_config_message.enabled_by_default = true;
|
||||
data.payload_data.config_message.switch_config_message.optimistic = false;
|
||||
data.payload_data.config_message.switch_config_message.qos = 2;
|
||||
data.payload_data.config_message.switch_config_message.retain = true;
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
|
||||
}
|
||||
|
||||
void zh_send_switch_hardware_config_message(const switch_config_t *switch_config)
|
||||
{
|
||||
zh_config_message_t config_message = {0};
|
||||
config_message = (zh_config_message_t)switch_config->hardware_config;
|
||||
zh_espnow_data_t data = {0};
|
||||
data.device_type = ZHDT_SWITCH;
|
||||
data.payload_type = ZHPT_HARDWARE;
|
||||
data.payload_data = (zh_payload_data_t)config_message;
|
||||
data.payload_data.config_message.switch_hardware_config_message.relay_pin = switch_config->hardware_config.relay_pin;
|
||||
data.payload_data.config_message.switch_hardware_config_message.relay_on_level = switch_config->hardware_config.relay_on_level;
|
||||
data.payload_data.config_message.switch_hardware_config_message.led_pin = switch_config->hardware_config.led_pin;
|
||||
data.payload_data.config_message.switch_hardware_config_message.led_on_level = switch_config->hardware_config.led_on_level;
|
||||
data.payload_data.config_message.switch_hardware_config_message.int_button_pin = switch_config->hardware_config.int_button_pin;
|
||||
data.payload_data.config_message.switch_hardware_config_message.int_button_on_level = switch_config->hardware_config.int_button_on_level;
|
||||
data.payload_data.config_message.switch_hardware_config_message.ext_button_pin = switch_config->hardware_config.ext_button_pin;
|
||||
data.payload_data.config_message.switch_hardware_config_message.ext_button_on_level = switch_config->hardware_config.ext_button_on_level;
|
||||
data.payload_data.config_message.switch_hardware_config_message.sensor_pin = switch_config->hardware_config.sensor_pin;
|
||||
data.payload_data.config_message.switch_hardware_config_message.sensor_type = switch_config->hardware_config.sensor_type;
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
|
||||
}
|
||||
|
||||
void zh_send_switch_keep_alive_message_task(void *pvParameter)
|
||||
{
|
||||
switch_config_t *switch_config = pvParameter;
|
||||
zh_keep_alive_message_t keep_alive_message = {0};
|
||||
keep_alive_message.online_status = ZH_ONLINE;
|
||||
keep_alive_message.message_frequency = ZH_SWITCH_KEEP_ALIVE_MESSAGE_FREQUENCY;
|
||||
zh_espnow_data_t data = {0};
|
||||
data.device_type = ZHDT_SWITCH;
|
||||
data.payload_type = ZHPT_KEEP_ALIVE;
|
||||
data.payload_data = (zh_payload_data_t)keep_alive_message;
|
||||
data.payload_data.keep_alive_message.online_status = ZH_ONLINE;
|
||||
data.payload_data.keep_alive_message.message_frequency = ZH_SWITCH_KEEP_ALIVE_MESSAGE_FREQUENCY;
|
||||
for (;;)
|
||||
{
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
|
||||
@ -385,12 +384,10 @@ void zh_send_switch_keep_alive_message_task(void *pvParameter)
|
||||
|
||||
void zh_send_switch_status_message(const switch_config_t *switch_config)
|
||||
{
|
||||
zh_status_message_t status_message = {0};
|
||||
status_message = (zh_status_message_t)switch_config->status;
|
||||
zh_espnow_data_t data = {0};
|
||||
data.device_type = ZHDT_SWITCH;
|
||||
data.payload_type = ZHPT_STATE;
|
||||
data.payload_data = (zh_payload_data_t)status_message;
|
||||
data.payload_data.status_message.switch_status_message.status = switch_config->status.status;
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
|
||||
}
|
||||
|
||||
@ -399,41 +396,33 @@ void zh_send_sensor_config_message(const switch_config_t *switch_config)
|
||||
zh_espnow_data_t data = {0};
|
||||
data.device_type = ZHDT_SENSOR;
|
||||
data.payload_type = ZHPT_CONFIG;
|
||||
zh_config_message_t config_message = {0};
|
||||
zh_sensor_config_message_t sensor_config_message = {0};
|
||||
sensor_config_message.suggested_display_precision = 1;
|
||||
sensor_config_message.expire_after = ZH_SENSOR_STATUS_MESSAGE_FREQUENCY * 3;
|
||||
sensor_config_message.enabled_by_default = true;
|
||||
sensor_config_message.force_update = true;
|
||||
sensor_config_message.qos = 2;
|
||||
sensor_config_message.retain = true;
|
||||
char *unit_of_measurement;
|
||||
data.payload_data.config_message.sensor_config_message.suggested_display_precision = 1;
|
||||
data.payload_data.config_message.sensor_config_message.expire_after = ZH_SENSOR_STATUS_MESSAGE_FREQUENCY * 3;
|
||||
data.payload_data.config_message.sensor_config_message.enabled_by_default = true;
|
||||
data.payload_data.config_message.sensor_config_message.force_update = true;
|
||||
data.payload_data.config_message.sensor_config_message.qos = 2;
|
||||
data.payload_data.config_message.sensor_config_message.retain = true;
|
||||
char *unit_of_measurement = NULL;
|
||||
switch (switch_config->hardware_config.sensor_type)
|
||||
{
|
||||
case HAST_DS18B20:;
|
||||
sensor_config_message.unique_id = 2;
|
||||
sensor_config_message.sensor_device_class = HASDC_TEMPERATURE;
|
||||
data.payload_data.config_message.sensor_config_message.unique_id = 2;
|
||||
data.payload_data.config_message.sensor_config_message.sensor_device_class = HASDC_TEMPERATURE;
|
||||
unit_of_measurement = "°C";
|
||||
strcpy(sensor_config_message.unit_of_measurement, unit_of_measurement);
|
||||
config_message = (zh_config_message_t)sensor_config_message;
|
||||
data.payload_data = (zh_payload_data_t)config_message;
|
||||
strcpy(data.payload_data.config_message.sensor_config_message.unit_of_measurement, unit_of_measurement);
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
|
||||
break;
|
||||
case HAST_DHT11:;
|
||||
case HAST_DHT22:;
|
||||
sensor_config_message.unique_id = 2;
|
||||
sensor_config_message.sensor_device_class = HASDC_TEMPERATURE;
|
||||
data.payload_data.config_message.sensor_config_message.unique_id = 2;
|
||||
data.payload_data.config_message.sensor_config_message.sensor_device_class = HASDC_TEMPERATURE;
|
||||
unit_of_measurement = "°C";
|
||||
strcpy(sensor_config_message.unit_of_measurement, unit_of_measurement);
|
||||
config_message = (zh_config_message_t)sensor_config_message;
|
||||
data.payload_data = (zh_payload_data_t)config_message;
|
||||
strcpy(data.payload_data.config_message.sensor_config_message.unit_of_measurement, unit_of_measurement);
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
|
||||
sensor_config_message.unique_id = 3;
|
||||
sensor_config_message.sensor_device_class = HASDC_HUMIDITY;
|
||||
data.payload_data.config_message.sensor_config_message.unique_id = 3;
|
||||
data.payload_data.config_message.sensor_config_message.sensor_device_class = HASDC_HUMIDITY;
|
||||
unit_of_measurement = "%";
|
||||
strcpy(sensor_config_message.unit_of_measurement, unit_of_measurement);
|
||||
config_message = (zh_config_message_t)sensor_config_message;
|
||||
data.payload_data = (zh_payload_data_t)config_message;
|
||||
strcpy(data.payload_data.config_message.sensor_config_message.unit_of_measurement, unit_of_measurement);
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
|
||||
break;
|
||||
default:
|
||||
@ -445,23 +434,21 @@ void zh_send_sensor_attributes_message_task(void *pvParameter)
|
||||
{
|
||||
switch_config_t *switch_config = pvParameter;
|
||||
const esp_app_desc_t *app_info = get_app_description();
|
||||
zh_attributes_message_t attributes_message = {0};
|
||||
attributes_message.chip_type = ZH_CHIP_TYPE;
|
||||
attributes_message.sensor_type = switch_config->hardware_config.sensor_type;
|
||||
strcpy(attributes_message.flash_size, CONFIG_ESPTOOLPY_FLASHSIZE);
|
||||
attributes_message.cpu_frequency = ZH_CPU_FREQUENCY;
|
||||
attributes_message.reset_reason = (uint8_t)esp_reset_reason();
|
||||
strcpy(attributes_message.app_name, app_info->project_name);
|
||||
strcpy(attributes_message.app_version, app_info->version);
|
||||
zh_espnow_data_t data = {0};
|
||||
data.device_type = ZHDT_SENSOR;
|
||||
data.payload_type = ZHPT_ATTRIBUTES;
|
||||
data.payload_data.attributes_message.chip_type = ZH_CHIP_TYPE;
|
||||
data.payload_data.attributes_message.sensor_type = switch_config->hardware_config.sensor_type;
|
||||
strcpy(data.payload_data.attributes_message.flash_size, CONFIG_ESPTOOLPY_FLASHSIZE);
|
||||
data.payload_data.attributes_message.cpu_frequency = ZH_CPU_FREQUENCY;
|
||||
data.payload_data.attributes_message.reset_reason = (uint8_t)esp_reset_reason();
|
||||
strcpy(data.payload_data.attributes_message.app_name, app_info->project_name);
|
||||
strcpy(data.payload_data.attributes_message.app_version, app_info->version);
|
||||
for (;;)
|
||||
{
|
||||
attributes_message.heap_size = esp_get_free_heap_size();
|
||||
attributes_message.min_heap_size = esp_get_minimum_free_heap_size();
|
||||
attributes_message.uptime = esp_timer_get_time() / 1000000;
|
||||
data.payload_data = (zh_payload_data_t)attributes_message;
|
||||
data.payload_data.attributes_message.heap_size = esp_get_free_heap_size();
|
||||
data.payload_data.attributes_message.min_heap_size = esp_get_minimum_free_heap_size();
|
||||
data.payload_data.attributes_message.uptime = esp_timer_get_time() / 1000000;
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
|
||||
vTaskDelay(ZH_SENSOR_ATTRIBUTES_MESSAGE_FREQUENCY * 1000 / portTICK_PERIOD_MS);
|
||||
}
|
||||
@ -473,12 +460,10 @@ void zh_send_sensor_status_message_task(void *pvParameter)
|
||||
switch_config_t *switch_config = pvParameter;
|
||||
float humidity = 0.0;
|
||||
float temperature = 0.0;
|
||||
zh_sensor_status_message_t sensor_status_message = {0};
|
||||
sensor_status_message.sensor_type = switch_config->hardware_config.sensor_type;
|
||||
zh_status_message_t status_message = {0};
|
||||
zh_espnow_data_t data = {0};
|
||||
data.device_type = ZHDT_SENSOR;
|
||||
data.payload_type = ZHPT_STATE;
|
||||
data.payload_data.status_message.sensor_status_message.sensor_type = switch_config->hardware_config.sensor_type;
|
||||
for (;;)
|
||||
{
|
||||
switch (switch_config->hardware_config.sensor_type)
|
||||
@ -488,7 +473,7 @@ void zh_send_sensor_status_message_task(void *pvParameter)
|
||||
switch (zh_ds18b20_read(NULL, &temperature))
|
||||
{
|
||||
case ESP_OK:
|
||||
sensor_status_message.temperature = temperature;
|
||||
data.payload_data.status_message.sensor_status_message.temperature = temperature;
|
||||
break;
|
||||
case ESP_FAIL:
|
||||
vTaskDelay(10000 / portTICK_PERIOD_MS);
|
||||
@ -508,8 +493,8 @@ void zh_send_sensor_status_message_task(void *pvParameter)
|
||||
switch (zh_dht_read(&switch_config->dht_handle, &humidity, &temperature))
|
||||
{
|
||||
case ESP_OK:
|
||||
sensor_status_message.humidity = humidity;
|
||||
sensor_status_message.temperature = temperature;
|
||||
data.payload_data.status_message.sensor_status_message.humidity = humidity;
|
||||
data.payload_data.status_message.sensor_status_message.temperature = temperature;
|
||||
break;
|
||||
case ESP_ERR_INVALID_RESPONSE:
|
||||
vTaskDelay(10000 / portTICK_PERIOD_MS);
|
||||
@ -530,8 +515,6 @@ void zh_send_sensor_status_message_task(void *pvParameter)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
status_message = (zh_status_message_t)sensor_status_message;
|
||||
data.payload_data = (zh_payload_data_t)status_message;
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
|
||||
vTaskDelay(ZH_SENSOR_STATUS_MESSAGE_FREQUENCY * 1000 / portTICK_PERIOD_MS);
|
||||
}
|
||||
@ -541,7 +524,6 @@ void zh_send_sensor_status_message_task(void *pvParameter)
|
||||
void zh_espnow_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data)
|
||||
{
|
||||
switch_config_t *switch_config = arg;
|
||||
zh_espnow_data_t data = {0};
|
||||
switch (event_id)
|
||||
{
|
||||
#ifdef CONFIG_NETWORK_TYPE_DIRECT
|
||||
@ -559,19 +541,19 @@ void zh_espnow_event_handler(void *arg, esp_event_base_t event_base, int32_t eve
|
||||
goto ZH_NETWORK_EVENT_HANDLER_EXIT;
|
||||
}
|
||||
#endif
|
||||
memcpy(&data, recv_data->data, recv_data->data_len);
|
||||
switch (data.device_type)
|
||||
zh_espnow_data_t *data = (zh_espnow_data_t *)recv_data->data;
|
||||
switch (data->device_type)
|
||||
{
|
||||
case ZHDT_GATEWAY:
|
||||
switch (data.payload_type)
|
||||
switch (data->payload_type)
|
||||
{
|
||||
case ZHPT_KEEP_ALIVE:
|
||||
if (data.payload_data.keep_alive_message.online_status == ZH_ONLINE)
|
||||
if (data->payload_data.keep_alive_message.online_status == ZH_ONLINE)
|
||||
{
|
||||
if (switch_config->gateway_is_available == false)
|
||||
{
|
||||
switch_config->gateway_is_available = true;
|
||||
memcpy(&switch_config->gateway_mac, &recv_data->mac_addr, 6);
|
||||
memcpy(switch_config->gateway_mac, recv_data->mac_addr, 6);
|
||||
zh_send_switch_hardware_config_message(switch_config);
|
||||
if (switch_config->hardware_config.relay_pin != ZH_NOT_USED)
|
||||
{
|
||||
@ -607,35 +589,41 @@ void zh_espnow_event_handler(void *arg, esp_event_base_t event_base, int32_t eve
|
||||
}
|
||||
break;
|
||||
case ZHPT_SET:
|
||||
switch_config->status = data.payload_data.status_message.switch_status_message;
|
||||
switch_config->status.status = data->payload_data.status_message.switch_status_message.status;
|
||||
zh_gpio_set_level(switch_config);
|
||||
zh_save_status(switch_config);
|
||||
zh_send_switch_status_message(switch_config);
|
||||
break;
|
||||
case ZHPT_HARDWARE:
|
||||
switch_config->hardware_config = data.payload_data.config_message.switch_hardware_config_message;
|
||||
switch_config->hardware_config.relay_pin = data->payload_data.config_message.switch_hardware_config_message.relay_pin;
|
||||
switch_config->hardware_config.relay_on_level = data->payload_data.config_message.switch_hardware_config_message.relay_on_level;
|
||||
switch_config->hardware_config.led_pin = data->payload_data.config_message.switch_hardware_config_message.led_pin;
|
||||
switch_config->hardware_config.led_on_level = data->payload_data.config_message.switch_hardware_config_message.led_on_level;
|
||||
switch_config->hardware_config.int_button_pin = data->payload_data.config_message.switch_hardware_config_message.int_button_pin;
|
||||
switch_config->hardware_config.int_button_on_level = data->payload_data.config_message.switch_hardware_config_message.int_button_on_level;
|
||||
switch_config->hardware_config.ext_button_pin = data->payload_data.config_message.switch_hardware_config_message.ext_button_pin;
|
||||
switch_config->hardware_config.ext_button_on_level = data->payload_data.config_message.switch_hardware_config_message.ext_button_on_level;
|
||||
switch_config->hardware_config.sensor_pin = data->payload_data.config_message.switch_hardware_config_message.sensor_pin;
|
||||
switch_config->hardware_config.sensor_type = data->payload_data.config_message.switch_hardware_config_message.sensor_type;
|
||||
zh_save_config(switch_config);
|
||||
esp_restart();
|
||||
break;
|
||||
case ZHPT_UPDATE:;
|
||||
const esp_app_desc_t *app_info = get_app_description();
|
||||
switch_config->update_partition = esp_ota_get_next_update_partition(NULL);
|
||||
zh_espnow_ota_message_t espnow_ota_message = {0};
|
||||
espnow_ota_message.chip_type = ZH_CHIP_TYPE;
|
||||
strcpy(espnow_ota_message.app_version, app_info->version);
|
||||
strcpy(data->payload_data.ota_message.espnow_ota_data.app_version, app_info->version);
|
||||
#ifdef CONFIG_IDF_TARGET_ESP8266
|
||||
char *app_name = (char *)heap_caps_malloc(strlen(app_info->project_name) + 6, MALLOC_CAP_8BIT);
|
||||
memset(app_name, 0, strlen(app_info->project_name) + 6);
|
||||
sprintf(app_name, "%s.app%d", app_info->project_name, switch_config->update_partition->subtype - ESP_PARTITION_SUBTYPE_APP_OTA_0 + 1);
|
||||
strcpy(espnow_ota_message.app_name, app_name);
|
||||
strcpy(data->payload_data.ota_message.espnow_ota_data.app_name, app_name);
|
||||
heap_caps_free(app_name);
|
||||
#else
|
||||
strcpy(espnow_ota_message.app_name, app_info->project_name);
|
||||
strcpy(data->payload_data.ota_message.espnow_ota_data.app_name, app_info->project_name);
|
||||
#endif
|
||||
data.device_type = ZHDT_SWITCH;
|
||||
data.payload_type = ZHPT_UPDATE;
|
||||
data.payload_data = (zh_payload_data_t)espnow_ota_message;
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
|
||||
data->device_type = ZHDT_SWITCH;
|
||||
data->payload_type = ZHPT_UPDATE;
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)data, sizeof(zh_espnow_data_t));
|
||||
break;
|
||||
case ZHPT_UPDATE_BEGIN:
|
||||
#ifdef CONFIG_IDF_TARGET_ESP8266
|
||||
@ -644,19 +632,19 @@ void zh_espnow_event_handler(void *arg, esp_event_base_t event_base, int32_t eve
|
||||
esp_ota_begin(switch_config->update_partition, OTA_SIZE_UNKNOWN, (esp_ota_handle_t *)&switch_config->update_handle);
|
||||
#endif
|
||||
switch_config->ota_message_part_number = 1;
|
||||
data.device_type = ZHDT_SWITCH;
|
||||
data.payload_type = ZHPT_UPDATE_PROGRESS;
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
|
||||
data->device_type = ZHDT_SWITCH;
|
||||
data->payload_type = ZHPT_UPDATE_PROGRESS;
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)data, sizeof(zh_espnow_data_t));
|
||||
break;
|
||||
case ZHPT_UPDATE_PROGRESS:
|
||||
if (switch_config->ota_message_part_number == data.payload_data.espnow_ota_message.part)
|
||||
if (switch_config->ota_message_part_number == data->payload_data.ota_message.espnow_ota_message.part)
|
||||
{
|
||||
++switch_config->ota_message_part_number;
|
||||
esp_ota_write(switch_config->update_handle, (const void *)data.payload_data.espnow_ota_message.data, data.payload_data.espnow_ota_message.data_len);
|
||||
esp_ota_write(switch_config->update_handle, (const void *)data->payload_data.ota_message.espnow_ota_message.data, data->payload_data.ota_message.espnow_ota_message.data_len);
|
||||
}
|
||||
data.device_type = ZHDT_SWITCH;
|
||||
data.payload_type = ZHPT_UPDATE_PROGRESS;
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
|
||||
data->device_type = ZHDT_SWITCH;
|
||||
data->payload_type = ZHPT_UPDATE_PROGRESS;
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)data, sizeof(zh_espnow_data_t));
|
||||
break;
|
||||
case ZHPT_UPDATE_ERROR:
|
||||
esp_ota_end(switch_config->update_handle);
|
||||
@ -664,15 +652,15 @@ void zh_espnow_event_handler(void *arg, esp_event_base_t event_base, int32_t eve
|
||||
case ZHPT_UPDATE_END:
|
||||
if (esp_ota_end(switch_config->update_handle) != ESP_OK)
|
||||
{
|
||||
data.device_type = ZHDT_SWITCH;
|
||||
data.payload_type = ZHPT_UPDATE_FAIL;
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
|
||||
data->device_type = ZHDT_SWITCH;
|
||||
data->payload_type = ZHPT_UPDATE_FAIL;
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)data, sizeof(zh_espnow_data_t));
|
||||
break;
|
||||
}
|
||||
esp_ota_set_boot_partition(switch_config->update_partition);
|
||||
data.device_type = ZHDT_SWITCH;
|
||||
data.payload_type = ZHPT_UPDATE_SUCCESS;
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
|
||||
data->device_type = ZHDT_SWITCH;
|
||||
data->payload_type = ZHPT_UPDATE_SUCCESS;
|
||||
zh_send_message(switch_config->gateway_mac, (uint8_t *)data, sizeof(zh_espnow_data_t));
|
||||
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||
esp_restart();
|
||||
break;
|
||||
|
@ -58,20 +58,35 @@
|
||||
|
||||
typedef struct // Structure of data exchange between tasks, functions and event handlers.
|
||||
{
|
||||
zh_switch_hardware_config_message_t hardware_config; // Storage structure of switch hardware configuration data.
|
||||
zh_switch_status_message_t status; // Storage structure of switch status data.
|
||||
volatile bool gpio_processing; // GPIO processing flag. @note Used to prevent a repeated interrupt from triggering during GPIO processing.
|
||||
volatile bool gateway_is_available; // Gateway availability status flag. @note Used to control the tasks when the gateway connection is established / lost.
|
||||
uint8_t gateway_mac[6]; // Gateway MAC address.
|
||||
zh_dht_handle_t dht_handle; // Unique DTH11/22 sensor handle.
|
||||
TaskHandle_t switch_attributes_message_task; // Unique task handle for zh_send_switsh_attributes_message_task().
|
||||
TaskHandle_t switch_keep_alive_message_task; // Unique task handle for zh_send_switch_keep_alive_message_task().
|
||||
TaskHandle_t sensor_attributes_message_task; // Unique task handle for zh_send_sensor_attributes_message_task().
|
||||
TaskHandle_t sensor_status_message_task; // Unique task handle for zh_send_sensor_status_message_task().
|
||||
SemaphoreHandle_t button_pushing_semaphore; // Unique semaphore handle for GPIO processing tasks.
|
||||
const esp_partition_t *update_partition; // Next update partition.
|
||||
esp_ota_handle_t update_handle; // Unique OTA handle.
|
||||
uint16_t ota_message_part_number; // The sequence number of the firmware upgrade part. @note Used to verify that all parts have been received.
|
||||
struct // Storage structure of switch hardware configuration data.
|
||||
{
|
||||
uint8_t relay_pin; // Relay GPIO number.
|
||||
bool relay_on_level; // Relay ON level. @note HIGH (true) / LOW (false).
|
||||
uint8_t led_pin; // Led GPIO number (if present).
|
||||
bool led_on_level; // Led ON level (if present). @note HIGH (true) / LOW (false).
|
||||
uint8_t int_button_pin; // Internal button GPIO number (if present).
|
||||
bool int_button_on_level; // Internal button trigger level (if present). @note HIGH (true) / LOW (false).
|
||||
uint8_t ext_button_pin; // External button GPIO number (if present).
|
||||
bool ext_button_on_level; // External button trigger level (if present). @note HIGH (true) / LOW (false).
|
||||
uint8_t sensor_pin; // Sensor GPIO number (if present).
|
||||
ha_sensor_type_t sensor_type; // Sensor types (if present). @note Used to identify the sensor type by ESP-NOW gateway and send the appropriate sensor status messages to MQTT.
|
||||
} hardware_config;
|
||||
struct // Storage structure of switch status data.
|
||||
{
|
||||
ha_on_off_type_t status; // Status of the zh_espnow_switch. @note Example - ON / OFF. @attention Must be same with set on switch_config_message structure.
|
||||
} status;
|
||||
volatile bool gpio_processing; // GPIO processing flag. @note Used to prevent a repeated interrupt from triggering during GPIO processing.
|
||||
volatile bool gateway_is_available; // Gateway availability status flag. @note Used to control the tasks when the gateway connection is established / lost.
|
||||
uint8_t gateway_mac[6]; // Gateway MAC address.
|
||||
zh_dht_handle_t dht_handle; // Unique DTH11/22 sensor handle.
|
||||
TaskHandle_t switch_attributes_message_task; // Unique task handle for zh_send_switsh_attributes_message_task().
|
||||
TaskHandle_t switch_keep_alive_message_task; // Unique task handle for zh_send_switch_keep_alive_message_task().
|
||||
TaskHandle_t sensor_attributes_message_task; // Unique task handle for zh_send_sensor_attributes_message_task().
|
||||
TaskHandle_t sensor_status_message_task; // Unique task handle for zh_send_sensor_status_message_task().
|
||||
SemaphoreHandle_t button_pushing_semaphore; // Unique semaphore handle for GPIO processing tasks.
|
||||
const esp_partition_t *update_partition; // Next update partition.
|
||||
esp_ota_handle_t update_handle; // Unique OTA handle.
|
||||
uint16_t ota_message_part_number; // The sequence number of the firmware upgrade part. @note Used to verify that all parts have been received.
|
||||
} switch_config_t;
|
||||
|
||||
/**
|
||||
|
@ -1 +1 @@
|
||||
1.0.0
|
||||
1.0.1
|
Loading…
x
Reference in New Issue
Block a user