Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions cores/esp32/ColorFormat.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,10 +119,10 @@ espHsvColor_t espRgbColorToHsvColor(espRgbColor_t rgb) {
}

espRgbColor_t espXYColorToRgbColor(uint8_t Level, espXyColor_t xy) {
return espXYToRgbColor(Level, xy.x, xy.y);
return espXYToRgbColor(Level, xy.x, xy.y, true);
}

espRgbColor_t espXYToRgbColor(uint8_t Level, uint16_t current_X, uint16_t current_Y) {
espRgbColor_t espXYToRgbColor(uint8_t Level, uint16_t current_X, uint16_t current_Y, bool addXYZScaling) {
// convert xyY color space to RGB

// https://www.easyrgb.com/en/math.php
Expand Down Expand Up @@ -156,9 +156,11 @@ espRgbColor_t espXYToRgbColor(uint8_t Level, uint16_t current_X, uint16_t curren
// X, Y and Z input refer to a D65/2° standard illuminant.
// sR, sG and sB (standard RGB) output range = 0 ÷ 255
// convert XYZ to RGB - CIE XYZ to sRGB
X = X / 100.0f;
Y = Y / 100.0f;
Z = Z / 100.0f;
if (addXYZScaling) {
X = X / 100.0f;
Y = Y / 100.0f;
Z = Z / 100.0f;
}

r = (X * 3.2406f) - (Y * 1.5372f) - (Z * 0.4986f);
g = -(X * 0.9689f) + (Y * 1.8758f) + (Z * 0.0415f);
Expand Down
3 changes: 2 additions & 1 deletion cores/esp32/ColorFormat.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#pragma once

#include <stdint.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
Expand Down Expand Up @@ -49,7 +50,7 @@ typedef struct HsvColor_t espHsvColor_t;
typedef struct XyColor_t espXyColor_t;
typedef struct CtColor_t espCtColor_t;

espRgbColor_t espXYToRgbColor(uint8_t Level, uint16_t current_X, uint16_t current_Y);
espRgbColor_t espXYToRgbColor(uint8_t Level, uint16_t current_X, uint16_t current_Y, bool addXYZScaling);
espRgbColor_t espXYColorToRgb(uint8_t Level, espXyColor_t xy);
espXyColor_t espRgbColorToXYColor(espRgbColor_t rgb);
espXyColor_t espRgbToXYColor(uint8_t r, uint8_t g, uint8_t b);
Expand Down
133 changes: 133 additions & 0 deletions docs/en/zigbee/ep_fan_control.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
################
ZigbeeFanControl
################

About
-----

The ``ZigbeeFanControl`` class provides a Zigbee endpoint for controlling fan devices in a Home Automation (HA) network. This endpoint implements the Fan Control cluster and allows for controlling fan modes and sequences.

**Features:**
* Fan mode control (OFF, LOW, MEDIUM, HIGH, ON, AUTO, SMART)
* Fan mode sequence configuration
* State change callbacks
* Zigbee HA standard compliance

**Use Cases:**
* Smart ceiling fans
* HVAC system fans
* Exhaust fans
* Any device requiring fan speed control

API Reference
-------------

Constructor
***********

ZigbeeFanControl
^^^^^^^^^^^^^^^^

Creates a new Zigbee fan control endpoint.

.. code-block:: arduino

ZigbeeFanControl(uint8_t endpoint);

* ``endpoint`` - Endpoint number (1-254)

Fan Mode Enums
**************

ZigbeeFanMode
^^^^^^^^^^^^^

Available fan modes for controlling the fan speed and operation.

.. code-block:: arduino

enum ZigbeeFanMode {
FAN_MODE_OFF, // Fan is off
FAN_MODE_LOW, // Low speed
FAN_MODE_MEDIUM, // Medium speed
FAN_MODE_HIGH, // High speed
FAN_MODE_ON, // Fan is on (full speed)
FAN_MODE_AUTO, // Automatic mode
FAN_MODE_SMART, // Smart mode
};

ZigbeeFanModeSequence
^^^^^^^^^^^^^^^^^^^^^

Available fan mode sequences that define which modes are available for the fan.

.. code-block:: arduino

enum ZigbeeFanModeSequence {
FAN_MODE_SEQUENCE_LOW_MED_HIGH, // Low -> Medium -> High
FAN_MODE_SEQUENCE_LOW_HIGH, // Low -> High
FAN_MODE_SEQUENCE_LOW_MED_HIGH_AUTO, // Low -> Medium -> High -> Auto
FAN_MODE_SEQUENCE_LOW_HIGH_AUTO, // Low -> High -> Auto
FAN_MODE_SEQUENCE_ON_AUTO, // On -> Auto
};

API Methods
***********

setFanModeSequence
^^^^^^^^^^^^^^^^^^

Sets the fan mode sequence and initializes the fan control.

.. code-block:: arduino

bool setFanModeSequence(ZigbeeFanModeSequence sequence);

* ``sequence`` - The fan mode sequence to set

This function will return ``true`` if successful, ``false`` otherwise.

getFanMode
^^^^^^^^^^

Gets the current fan mode.

.. code-block:: arduino

ZigbeeFanMode getFanMode();

This function will return current fan mode.

getFanModeSequence
^^^^^^^^^^^^^^^^^^

Gets the current fan mode sequence.

.. code-block:: arduino

ZigbeeFanModeSequence getFanModeSequence();

This function will return current fan mode sequence.

Event Handling
**************

onFanModeChange
^^^^^^^^^^^^^^^

Sets a callback function to be called when the fan mode changes.

.. code-block:: arduino

void onFanModeChange(void (*callback)(ZigbeeFanMode mode));

* ``callback`` - Function to call when fan mode changes

Example
-------

Fan Control Implementation
**************************

.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Fan_Control/Zigbee_Fan_Control.ino
:language: arduino
13 changes: 13 additions & 0 deletions docs/en/zigbee/zigbee_core.rst
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,19 @@ Performs a factory reset, clearing all network settings.

* ``restart`` - ``true`` to restart after reset (default: ``true``)

onGlobalDefaultResponse
^^^^^^^^^^^^^^^^^^^^^^^

Sets a global callback for default response messages.

.. code-block:: arduino

void onGlobalDefaultResponse(void (*callback)(zb_cmd_type_t resp_to_cmd, esp_zb_zcl_status_t status, uint8_t endpoint, uint16_t cluster));

* ``callback`` - Function pointer to the callback function

This callback will be called for all endpoints when a default response is received.

Utility Functions
*****************

Expand Down
13 changes: 13 additions & 0 deletions docs/en/zigbee/zigbee_ep.rst
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,19 @@ Sets a callback function for identify events.
* ``callback`` - Function to call when identify event occurs
* ``time`` - Identify time in seconds

onDefaultResponse
^^^^^^^^^^^^^^^^^

Sets a callback for default response messages for this endpoint.

.. code-block:: arduino

void onDefaultResponse(void (*callback)(zb_cmd_type_t resp_to_cmd, esp_zb_zcl_status_t status));

* ``callback`` - Function pointer to the callback function

This callback will be called when a default response is received for this specific endpoint.

Supported Endpoints
-------------------

Expand Down
5 changes: 2 additions & 3 deletions libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,22 +76,21 @@ void ZigbeeColorDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_me
return;
} else {
log_w("Received message ignored. Attribute ID: %d not supported for Level Control", message->attribute.id);
//TODO: implement more attributes -> includes/zcl/esp_zigbee_zcl_level.h
}
} else if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL) {
if (message->attribute.id == ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_X_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_U16) {
uint16_t light_color_x = (*(uint16_t *)message->attribute.data.value);
uint16_t light_color_y = getCurrentColorY();
//calculate RGB from XY and call setColor()
_current_color = espXYToRgbColor(255, light_color_x, light_color_y); //TODO: Check if level is correct
_current_color = espXYToRgbColor(255, light_color_x, light_color_y, false);
lightChanged();
return;

} else if (message->attribute.id == ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_Y_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_U16) {
uint16_t light_color_x = getCurrentColorX();
uint16_t light_color_y = (*(uint16_t *)message->attribute.data.value);
//calculate RGB from XY and call setColor()
_current_color = espXYToRgbColor(255, light_color_x, light_color_y); //TODO: Check if level is correct
_current_color = espXYToRgbColor(255, light_color_x, light_color_y, false);
lightChanged();
return;
} else if (message->attribute.id == ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_HUE_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_U8) {
Expand Down
1 change: 1 addition & 0 deletions variants/tamc_termod_s3/pins_arduino.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define Pins_Arduino_h

#include <stdint.h>
#include <stdbool.h>

#define USB_VID 0x303a
#define USB_PID 0x1001
Expand Down
1 change: 1 addition & 0 deletions variants/tamc_termod_s3/variant.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "Arduino.h"
#include "pins_arduino.h"

float getBatteryVoltage() {
int analogVolt = analogReadMilliVolts(1);
Expand Down