535 lines
19 KiB
C
Raw Normal View History

2024-06-06 11:43:20 +03:00
#pragma once
#include "stdio.h"
#include "stdint.h"
#include "stdbool.h"
#define ZH_HIGH true
#define ZH_LOW false
#define ZH_ON true
#define ZH_OFF false
#define ZH_ONLINE true
#define ZH_OFFLINE false
#define ZH_NOT_USED 0xFF
//***********************************************************************************//
#define ZH_DEVICE_TYPE \
DF(ZHDT_NONE, "") \
DF(ZHDT_GATEWAY, "gateway") \
DF(ZHDT_SWITCH, "espnow_switch") \
DF(ZHDT_LED, "espnow_led") \
DF(ZHDT_SENSOR, "espnow_sensor") \
DF(ZHDT_RF_GATEWAY, "espnow_rf_gateway") \
DF(ZHDT_CONTROL_PANEL, "espnow_control_panel") \
DF(ZHDT_DIMMER, "espnow_dimmer") \
DF(ZHDT_TERRARIUM, "espnow_terrarium") \
DF(ZHDT_RF_SENSOR, "rf_sensor") \
DF(ZHDT_BINARY_SENSOR, "espnow_sensor") \
DF(ZHDT_MAX, "")
typedef enum zh_device_type_t
{
#define DF(_value, _name) _value,
ZH_DEVICE_TYPE
#undef DF
} zh_device_type_t;
char *zh_get_device_type_value_name(zh_device_type_t value);
//***********************************************************************************//
#define ZH_PAYLOAD_TYPE \
DF(ZHPT_NONE, "") \
DF(ZHPT_ATTRIBUTES, "attributes") \
DF(ZHPT_KEEP_ALIVE, "status") \
DF(ZHPT_SET, "set") \
DF(ZHPT_STATE, "state") \
DF(ZHPT_UPDATE, "update") \
DF(ZHPT_RESTART, "restart") \
DF(ZHPT_SYSTEM, "system") \
DF(ZHPT_CONFIG, "config") \
DF(ZHPT_FORWARD, "forward") \
DF(ZHPT_UPDATE_BEGIN, "") \
DF(ZHPT_UPDATE_PROGRESS, "") \
DF(ZHPT_UPDATE_END, "") \
DF(ZHPT_UPDATE_ERROR, "") \
DF(ZHPT_UPDATE_FAIL, "") \
DF(ZHPT_UPDATE_SUCCESS, "") \
DF(ZHPT_BRIGHTNESS, "brightness") \
DF(ZHPT_TEMPERATURE, "temperature") \
DF(ZHPT_RGB, "rgb") \
DF(ZHPT_EFFECT, "effect") \
DF(ZHPT_HARDWARE, "hardware") \
DF(ZHPT_MAX, "")
typedef enum zh_payload_type_t
{
#define DF(_value, _name) _value,
ZH_PAYLOAD_TYPE
#undef DF
} zh_payload_type_t;
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") \
DF(HACT_BINARY_SENSOR, "binary_sensor") \
DF(HACT_BUTTON, "button") \
DF(HACT_CAMERA, "camera") \
DF(HACT_COVER, "cover") \
DF(HACT_DEVICE_TRACKER, "device_tracker") \
DF(HACT_FAN, "fan") \
DF(HACT_HUMIDIFIER, "humidifier") \
DF(HACT_CLIMATE_HVAC, "climate") \
DF(HACT_LIGHT, "light") \
DF(HACT_LOCK, "lock") \
DF(HACT_NUMBER, "number") \
DF(HACT_SCENE, "scene") \
DF(HACT_SELECT, "select") \
DF(HACT_SENSOR, "sensor") \
DF(HACT_SIREN, "siren") \
DF(HACT_SWITCH, "switch") \
DF(HACT_UPDATE, "update") \
DF(HACT_TEXT, "text") \
DF(HACT_VACUUM, "vacuum") \
DF(HACT_MAX, "")
typedef enum ha_component_type_t
{
#define DF(_value, _name) _value,
HA_COMPONENT_TYPE
#undef DF
} ha_component_type_t;
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") \
DF(HABSDC_BATTERY_CHARGING, "battery_charging") \
DF(HABSDC_CARBON_MONOXIDE, "carbon_monoxide") \
DF(HABSDC_COLD, "cold") \
DF(HABSDC_CONNECTIVITY, "connectivity") \
DF(HABSDC_DOOR, "door") \
DF(HABSDC_GARAGE_DOOR, "garage_door") \
DF(HABSDC_GAS, "gas") \
DF(HABSDC_HEAT, "heat") \
DF(HABSDC_LIGHT, "light") \
DF(HABSDC_LOCK, "lock") \
DF(HABSDC_MOISTURE, "moisture") \
DF(HABSDC_MOTION, "motion") \
DF(HABSDC_MOVING, "moving") \
DF(HABSDC_OCCUPANCY, "occupancy") \
DF(HABSDC_OPENING, "opening") \
DF(HABSDC_PLUG, "plug") \
DF(HABSDC_POWER, "power") \
DF(HABSDC_PRESENCE, "presence") \
DF(HABSDC_PROBLEM, "problem") \
DF(HABSDC_RUNNING, "running") \
DF(HABSDC_SAFETY, "safety") \
DF(HABSDC_SMOKE, "smoke") \
DF(HABSDC_SOUND, "sound") \
DF(HABSDC_TAMPER, "tamper") \
DF(HABSDC_UPDATE, "update") \
DF(HABSDC_VIBRATION, "vibration") \
DF(HABSDC_WINDOW, "window") \
DF(HABSDC_MAX, "")
typedef enum ha_binary_sensor_device_class_t
{
#define DF(_value, _name) _value,
HA_BINARY_SENSOR_DEVICE_CLASS
#undef DF
} ha_binary_sensor_device_class_t;
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") \
DF(HACDC_BLIND, "blind") \
DF(HACDC_CURTAIN, "curtain") \
DF(HACDC_DAMPER, "damper") \
DF(HACDC_DOOR, "door") \
DF(HACDC_GARAGE, "garage") \
DF(HACDC_GATE, "gate") \
DF(HACDC_SHADE, "shade") \
DF(HACDC_SHUTTER, "shutter") \
DF(HACDC_WINDOW, "window") \
DF(HACDC_MAX, "")
typedef enum ha_cover_device_class_t
{
#define DF(_value, _name) _value,
HA_COVER_DEVICE_CLASS
#undef DF
} ha_cover_device_class_t;
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") \
DF(HASDC_AQI, "aqi") \
DF(HASDC_BATTERY, "battery") \
DF(HASDC_CARBON_DIOXIDE, "carbon_dioxide") \
DF(HASDC_CARBON_MONOXIDE, "carbon_monoxide") \
DF(HASDC_CURRENT, "current") \
DF(HASDC_DATE, "date") \
DF(HASDC_DISTANCE, "distance") \
DF(HASDC_DURATION, "duration") \
DF(HASDC_ENERGY, "energy") \
DF(HASDC_FREQUENCY, "frequency") \
DF(HASDC_GAS, "gas") \
DF(HASDC_HUMIDITY, "humidity") \
DF(HASDC_ILLUMINANCE, "illuminance") \
DF(HASDC_MOISTURE, "moisture") \
DF(HASDC_MONETARY, "monetar") \
DF(HASDC_NITROGEN_DIOXIDE, "nitrogen_dioxide") \
DF(HASDC_NITROGEN_MONOXIDE, "nitrogen_monoxide") \
DF(HASDC_NITROUS_OXIDE, "nitrous_oxide") \
DF(HASDC_OZONE, "ozone") \
DF(HASDC_PM1, "pm1") \
DF(HASDC_PM10, "pm10") \
DF(HASDC_PM25, "pm25") \
DF(HASDC_POWER_FACTOR, "power_factor") \
DF(HASDC_POWER, "power") \
DF(HASDC_PRECIPITATION, "precipitation") \
DF(HASDC_PRECIPITATION_INTENSITY, "precipitation_intensity") \
DF(HASDC_PRESSURE, "pressure") \
DF(HASDC_REACTIVE_POWER, "reactive_power") \
DF(HASDC_SIGNAL_STRENGTH, "signal_strength") \
DF(HASDC_SPEED, "speed") \
DF(HASDC_SULPHUR_DIOXIDE, "sulphur_dioxide") \
DF(HASDC_TEMPERATURE, "temperature") \
DF(HASDC_TIMESTAMP, "timestamp") \
DF(HASDC_VOLATILE_ORGANIC_COMPOUNDS, "volatile_organic_compounds") \
DF(HASDC_VOLTAGE, "voltage") \
DF(HASDC_VOLUME, "volume") \
DF(HASDC_WATER, "water") \
DF(HASDC_WEIGHT, "weight") \
DF(HASDC_WIND_SPEED, "wind_speed") \
DF(HASDC_MAX, "")
typedef enum ha_sensor_device_class_t
{
#define DF(_value, _name) _value,
HA_SENSOR_DEVICE_CLASS
#undef DF
} ha_sensor_device_class_t;
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
{
#define DF(_value, _name) _value,
HA_SWITCH_DEVICE_CLASS
#undef DF
} ha_switch_device_class_t;
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") \
DF(HAONOFT_OFF, "OFF") \
DF(HAONOFT_OPEN, "OPEN") \
DF(HAONOFT_CLOSE, "CLOSE") \
DF(HAONOFT_LOW, "LOW") \
DF(HAONOFT_MID, "MID") \
DF(HAONOFT_HIGH, "HIGH") \
DF(HAONOFT_ALARM, "ALARM") \
DF(HAONOFT_DRY, "DRY") \
DF(HAONOFT_MOTION, "MOTION") \
DF(HAONOFT_CONNECT, "CONNECT") \
DF(HAONOFT_LEAKAGE, "LEAKAGE") \
DF(HAONOFT_MAX, "")
typedef enum ha_on_off_type_t
{
#define DF(_value, _name) _value,
HA_ON_OFF_TYPE
#undef DF
} ha_on_off_type_t;
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") \
DF(HACHT_ESP8266, "ESP8266") \
DF(HACHT_ESP32S2, "ESP32-S2") \
DF(HACHT_ESP32S3, "ESP32-S3") \
DF(HACHT_ESP32C2, "ESP32-C2") \
DF(HACHT_ESP32C3, "ESP32-C3") \
DF(HACHT_ESP32C6, "ESP32-C6") \
DF(HACHT_MAX, "")
typedef enum ha_chip_type_t
{
#define DF(_value, _name) _value,
HA_CHIP_TYPE
#undef DF
} ha_chip_type_t;
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
{
#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") \
DF(HALT_MAX, "")
typedef enum ha_led_type_t
{
#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_MAX, "")
typedef enum ha_sensor_type_t
{
#define DF(_value, _name) _value,
HA_SENSOR_TYPE
#undef DF
} ha_sensor_type_t;
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
{
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;
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;