1
0
mirror of https://github.com/Utyff/Zintercom.git synced 2026-01-12 17:27:42 +03:00

11 Commits

Author SHA1 Message Date
Utyf
2707f5c987 support battery and old LED 2022-03-16 01:11:52 +03:00
Utyf
1fd4c7b2fa fix button press 2022-03-13 05:19:50 +03:00
Utyf
b786d8bfdd remove led timer 2022-03-05 22:53:36 +03:00
Utyf
4fbab14965 RGB and UART works 2022-02-26 00:34:49 +03:00
Utyf
17ee0a7588 modify RGB 2022-02-23 19:20:53 +03:00
Utyf
6fe29470ec set old led 2022-02-20 20:15:06 +03:00
Utyf
07f7ac2147 cleanup 2022-02-20 16:35:16 +03:00
Utyf
b2ac615230 Merge branch 'rgb_led' into master
# Conflicts:
#	Source/preinclude.h
#	Source/zcl_app.c
2022-02-20 12:28:51 +03:00
lost
d5e35b9e49 Small fix :) 2022-02-16 23:37:42 +02:00
lost
921e8c1309 Add binary switches for different modes 2022-02-16 23:13:05 +02:00
lost
23e04d3571 Add RGB led support
Rework button actions (single, double, hold)
Detail description can be found in hardware/Домофон zintercom.docx
2022-02-16 22:09:22 +02:00
6 changed files with 291 additions and 143 deletions

View File

@@ -61,30 +61,44 @@
#define HAL_LED_BLINK_DELAY() st( { volatile uint32 i; for (i=0; i<0x5800; i++) { }; } )
#if defined(HAL_BOARD_TARGET)
//led
#define LED1_BV BV(4)
#define LED1_SBIT P0_4
#define LED1_DDR P0DIR
// blue
#define LED1_BV BV(7)
#define LED1_SBIT P1_7
#define LED1_DDR P1DIR
#define LED1_POLARITY ACTIVE_HIGH
//catch
#define LED2_BV BV(1)
#define LED2_SBIT P0_1
#define LED2_DDR P0DIR
// green
#define LED2_BV BV(6)
#define LED2_SBIT P1_6
#define LED2_DDR P1DIR
#define LED2_POLARITY ACTIVE_HIGH
//answer
#define LED3_BV BV(2)
#define LED3_SBIT P0_2
#define LED3_DDR P0DIR
// red
#define LED3_BV BV(5)
#define LED3_SBIT P1_5
#define LED3_DDR P1DIR
#define LED3_POLARITY ACTIVE_HIGH
//handset
#define LED4_BV BV(3)
#define LED4_SBIT P0_3
// old led
#define LED4_BV BV(4)
#define LED4_SBIT P0_4
#define LED4_DDR P0DIR
#define LED4_POLARITY ACTIVE_HIGH
// Catch control pin
#define CATCH_BV BV(1)
#define CATCH_PIN P0_1
#define CATCH_DDR P0DIR
#define CATCH_SSR P0SEL
// Answer control pin
#define ANSWER_BV BV(2)
#define ANSWER_PIN P0_2
#define ANSWER_DDR P0DIR
#define ANSWER_SSR P0SEL
// Handset control pin
#define HANDSET_BV BV(3)
#define HANDSET_PIN P0_3
#define HANDSET_DDR P0DIR
#define HANDSET_SSR P0SEL
#elif defined(HAL_BOARD_CHDTECH_DEV)
//blue//d3
//blue//d3
#define LED1_BV BV(4)
#define LED1_SBIT P1_4
#define LED1_DDR P1DIR
@@ -100,13 +114,33 @@
#define LED3_DDR P1DIR
#define LED3_POLARITY ACTIVE_LOW
//ex
#define LED4_BV BV(5)
#define LED4_SBIT P1_5
#define LED4_DDR P1DIR
#define LED4_POLARITY ACTIVE_LOW
#define LED4_BV BV(4)
#define LED4_SBIT P0_4
#define LED4_DDR P0DIR
#define LED4_POLARITY ACTIVE_HIGH
// Catch control pin
#define CATCH_BV BV(1)
#define CATCH_PIN P0_1
#define CATCH_DDR P0DIR
#define CATCH_SSR P0SEL
// Answer control pin
#define ANSWER_BV BV(2)
#define ANSWER_PIN P1_2
#define ANSWER_DDR P1DIR
#define ANSWER_SSR P1SEL
// Handset control pin
#define HANDSET_BV BV(3)
#define HANDSET_PIN P1_3
#define HANDSET_DDR P1DIR
#define HANDSET_SSR P1SEL
#endif
#define BLUE_LED HAL_LED_1
#define GREEN_LED HAL_LED_2
#define RED_LED HAL_LED_3
#define OLD_LED HAL_LED_4
#define INFO_LED HAL_LED_1 | HAL_LED_4
/* ------------------------------------------------------------------------------------------------
* Push Button Configuration

View File

@@ -64,11 +64,11 @@
#define INT_HEAP_LEN 2060
#endif
#define BTN_HOLD_TIME 1000
#define FACTORY_RESET_HOLD_TIME_LONG 5000
#define BTN_HOLD_TIME 2000
#define FACTORY_RESET_HOLD_TIME_LONG 10000
#if defined( DO_DEBUG_UART )
#define HAL_UART_ISR 2
#define HAL_UART_ISR 0
#define HAL_UART TRUE
#define HAL_UART_DMA 1
#endif

View File

@@ -58,6 +58,14 @@
* GLOBAL VARIABLES
*/
byte zclApp_TaskID;
#if defined( ZIC_BATTERY_MODE )
static byte isRingOn = false;
static byte isLedOn = false;
#endif
// for Old LED
static byte showMode = false;
static byte showSound = false;
/*********************************************************************
* GLOBAL FUNCTIONS
@@ -68,7 +76,6 @@ byte zclApp_TaskID;
* LOCAL VARIABLES
*/
static uint8 currentBtnClickPhase = 0;
/*********************************************************************
* LOCAL FUNCTIONS
@@ -78,16 +85,17 @@ static void zclApp_BasicResetCB(void);
static void zclApp_RestoreAttributesFromNV(void);
static void zclApp_SaveAttributesToNV(void);
static void zclApp_HandleKeys(byte portAndAction, byte keyCode);
static void zclApp_ControlPinsInit(void);
static ZStatus_t zclApp_ReadWriteAuthCB(afAddrType_t *srcAddr, zclAttrRec_t *pAttr, uint8 oper);
static void zclApp_Report(void);
static void zclApp_OneReport(void);
static void zclApp_ConfigInit(bool restart);
static void zclApp_BtnClick(bool hold);
static void zclApp_BtnClicks(byte count);
static void zclApp_RingRun(void);
static void zclApp_TalkStart(void);
static void zclApp_RingEnd(void);
static void zclApp_WorkWithLEDs(void);
/*********************************************************************
* ZCL General Profile Callback table
@@ -102,9 +110,8 @@ static zclGeneral_AppCallbacks_t zclApp_CmdCallbacks = {
NULL, // RSSI Location command
NULL // RSSI Location Response command
};
void zclApp_Init(byte task_id) {
//HalLedSet(HAL_LED_ALL, HAL_LED_MODE_BLINK);
void zclApp_Init(byte task_id) {
zclApp_RestoreAttributesFromNV();
zclApp_TaskID = task_id;
@@ -123,6 +130,8 @@ void zclApp_Init(byte task_id) {
zclApp_ConfigInit(TIMER_START);
zclApp_ControlPinsInit();
IO_IMODE_PORT_PIN(0,0,IO_TRI);
#if defined( ZIC_BATTERY_MODE )
@@ -130,68 +139,71 @@ void zclApp_Init(byte task_id) {
#endif
}
static void zclApp_ControlPinsInit (void) {
CATCH_SSR &= ~CATCH_BV; // Set PIN as general I/O port functions
CATCH_DDR |= CATCH_BV; // Set the port transmission mode for PIN to output
ANSWER_SSR &= ~ANSWER_BV;
ANSWER_DDR |= ANSWER_BV;
HANDSET_SSR &= ~HANDSET_BV;
HANDSET_DDR |= HANDSET_BV;
P0SEL &= ~0x01; // Set P0_0 as general I/O port function
P0DIR &= ~0x01; // Set the port transmission mode of P0_0 to input
// ? P0INP &= ~0x01; //Set the port input mode of P0_0 to: pull up/down
}
static void zclApp_HandleKeys(byte portAndAction, byte keyCode) {
//LREP("zclApp_HandleKeys portAndAction=0x%X keyCode=0x%X\r\n", portAndAction, keyCode);
//zclCommissioning_HandleKeys(portAndAction, keyCode);
if (portAndAction & KEY_INCOME_PORT) { //P0 Ring //S1 P0_1 TODO add check Income pin
//exit old stop timer
osal_stop_timerEx(zclApp_TaskID, APP_RING_STOP_EVT);
//osal_clear_event(zclApp_TaskID, APP_RING_STOP_EVT);
//start new stop timer (ring ends timer)
//osal_start_timerEx(zclApp_TaskID, APP_RING_STOP_EVT, 3000);
//zclApp_Config.TimeRing
uint32 TimeBell = (uint32)zclApp_Config.TimeBell *(uint32)1000;
osal_start_timerEx(zclApp_TaskID, APP_RING_STOP_EVT, (uint32)TimeBell);
if (portAndAction & HAL_KEY_PRESS) {
//start ring
if (zclApp_State.RingRunStep == 0) {
#if defined( ZIC_BATTERY_MODE )
osal_pwrmgr_task_state(zclApp_TaskID, PWRMGR_HOLD);
isRingOn = true;
#endif
LREPMaster("Ring start\r\n");
//HalLedSet(LED_PIN, HAL_LED_MODE_BLINK);
zclApp_State.RingRunStep = 1;
//osal_start_reload_timer(zclApp_TaskID, APP_RING_RUN_EVT, 500);
osal_start_timerEx(zclApp_TaskID, APP_RING_RUN_EVT, 500);
afAddrType_t inderect_DstAddr = {.addrMode = (afAddrMode_t)AddrNotPresent, .endPoint = 0, .addr.shortAddr = 0};
zclGeneral_SendOnOff_CmdOn(zclApp_FirstEP.EndPoint, &inderect_DstAddr, FALSE, bdb_getZCLFrameCounter());
}
}
}
if (portAndAction & KEY1_PORT) { //P2 Btn //S2 P2_0 TODO add check BUTTON pin
zclFactoryResetter_HandleKeys(portAndAction, keyCode);
if (portAndAction & HAL_KEY_PRESS) {
LREPMaster("Key pressed\r\n");
zclApp_State.pressTime = osal_GetSystemClock();
LREP("pressTime = %ld\r\n", zclApp_State.pressTime);
LREP("Key pressed. Clicks - %d\r\n", zclApp_State.clicks);
if (zclApp_State.clicks < 2) {
zclApp_State.clicks++;
}
osal_start_timerEx(zclApp_TaskID, APP_BTN_HOLD_EVT, BTN_HOLD_TIME);
osal_stop_timerEx(zclApp_TaskID, APP_BTN_CLICK_EVT);
}
if (portAndAction & HAL_KEY_RELEASE) {
LREPMaster("Key released\r\n");
uint32 holdTime = osal_GetSystemClock() - zclApp_State.pressTime;
LREP("holdTime = %ld \r\n", holdTime);
if (zclApp_State.pressTime != 0 && holdTime >= BTN_HOLD_TIME) { // check release without press and hold milliseconds
osal_start_timerEx(zclApp_TaskID, APP_BTN_HOLD_EVT, 50);
osal_stop_timerEx(zclApp_TaskID, APP_BTN_HOLD_EVT);
if (zclApp_State.clicks == 1) {
osal_start_timerEx(zclApp_TaskID, APP_BTN_CLICK_EVT, 250);
}
else {
osal_start_timerEx(zclApp_TaskID, APP_BTN_CLICK_EVT, 50);
if (zclApp_State.clicks == 2) {
osal_start_timerEx(zclApp_TaskID, APP_BTN_DOUBLE_EVT, 50);
}
zclApp_State.pressTime = 0;
}
}
}
uint16 zclApp_event_loop(uint8 task_id, uint16 events) {
LREP("events 0x%x \r\n", events);
if (events & SYS_EVENT_MSG) {
@@ -221,7 +233,7 @@ uint16 zclApp_event_loop(uint8 task_id, uint16 events) {
}
if (events & APP_REPORT_EVT) {
LREPMaster("APP_REPORT_EVT\r\n");
zclApp_Report();
zclApp_OneReport();
return (events ^ APP_REPORT_EVT);
}
@@ -234,7 +246,7 @@ uint16 zclApp_event_loop(uint8 task_id, uint16 events) {
if (events & APP_BTN_CLICK_EVT) {
LREPMaster("APP_BTN_CLICK_EVT\r\n");
zclApp_BtnClick(false);
zclApp_BtnClicks(1);
return (events ^ APP_BTN_CLICK_EVT);
}
@@ -256,13 +268,26 @@ uint16 zclApp_event_loop(uint8 task_id, uint16 events) {
return (events ^ APP_TALK_START_EVT);
}
if (events & APP_WORK_LED_EVT) {
LREPMaster("APP_WORK_LED_EVT\r\n");
zclApp_WorkWithLEDs();
return (events ^ APP_WORK_LED_EVT);
}
if (events & APP_BTN_HOLD_EVT) {
LREPMaster("APP_BTN_HOLD_EVT\r\n");
#if !defined( ZIC_BATTERY_MODE )
zclApp_BtnClick(true);
#endif
//#if !defined( ZIC_BATTERY_MODE )
zclApp_BtnClicks(255);
//#endif
return (events ^ APP_BTN_HOLD_EVT);
}
if (events & APP_BTN_DOUBLE_EVT) {
LREPMaster("APP_BTN_DOUBLE_EVT\r\n");
zclApp_BtnClicks(2);
return (events ^ APP_BTN_DOUBLE_EVT);
}
return 0;
}
@@ -273,7 +298,7 @@ static void zclApp_RingRun(void) {
LREP("zclApp_State.State %d\r\n", zclApp_State.State);
osal_start_timerEx(zclApp_TaskID, APP_RING_RUN_EVT, 500);
osal_start_timerEx(zclApp_TaskID, APP_WORK_LED_EVT, 50);
switch (zclApp_State.State) {
case Idle:
@@ -297,7 +322,7 @@ static void zclApp_RingRun(void) {
if ((zclApp_Config.ModeOpen == Once) || (zclApp_Config.ModeOpen == Always)){
if (zclApp_State.RingRunStep > ((zclApp_Config.TimeRing + zclApp_Config.TimeTalk) * 2)) {
zclApp_State.State = Open;
HalLedSet(ANSWER_PIN, HAL_LED_MODE_OFF);
ANSWER_PIN = 0;
zclApp_OneReport();
}
}
@@ -322,27 +347,23 @@ static void zclApp_RingRun(void) {
static void zclApp_TalkStart(void) {
LREPMaster("Talk start\r\n");
//osal_stop_timerEx(zclApp_TaskID, APP_RING_STOP_EVT);
//osal_clear_event(zclApp_TaskID, APP_RING_STOP_EVT);
zclApp_OneReport();
HalLedSet(ANSWER_PIN, HAL_LED_MODE_ON);
ANSWER_PIN = 1;
if (zclApp_Config.ModeSound == true) {
HalLedSet(HANDSET_PIN, HAL_LED_MODE_ON);
HANDSET_PIN = 1;
}
else {
HalLedSet(CATCH_PIN, HAL_LED_MODE_OFF);
CATCH_PIN = 0;
}
}
static void zclApp_RingEnd(void) {
LREPMaster("Ring end\r\n");
HalLedSet(CATCH_PIN, !zclApp_Config.ModeSound);
HalLedSet(HANDSET_PIN, !zclApp_Config.ModeSound);
HalLedSet(ANSWER_PIN, HAL_LED_MODE_OFF);
CATCH_PIN = !zclApp_Config.ModeSound;
HANDSET_PIN = !zclApp_Config.ModeSound;
ANSWER_PIN = 0;
osal_stop_timerEx(zclApp_TaskID, APP_RING_RUN_EVT);
//osal_clear_event(zclApp_TaskID, APP_RING_RUN_EVT);
//osal_stop_timerEx(zclApp_TaskID, APP_RING_STOP_EVT);
//osal_clear_event(zclApp_TaskID, APP_RING_STOP_EVT);
osal_start_timerEx(zclApp_TaskID, APP_WORK_LED_EVT, 50);
zclApp_State.RingRunStep = 0;
zclApp_State.State = Idle;
@@ -356,74 +377,125 @@ static void zclApp_RingEnd(void) {
#if defined( ZIC_BATTERY_MODE )
zclBattery_Report();
isRingOn = false;
if (isLedOn == false) {
osal_pwrmgr_task_state(zclApp_TaskID, PWRMGR_CONSERVE);
}
#endif
}
static void zclApp_BtnClick(bool hold) {
LREP("currentBtnClickPhase %d\r\n", currentBtnClickPhase);
switch (currentBtnClickPhase++) {
case 0:
if (hold) {
zclApp_Config.ModeSound = !zclApp_Config.ModeSound;
HalLedSet(HANDSET_PIN, !zclApp_Config.ModeSound);
HalLedSet(CATCH_PIN, !zclApp_Config.ModeSound);
static void zclApp_WorkWithLEDs(void) {
#if defined( ZIC_BATTERY_MODE )
if (isLedOn != false) { // Off LEDs and goto sleep
isLedOn = false;
HalLedSet(HAL_LED_ALL, HAL_LED_MODE_OFF);
if (isRingOn == false) {
osal_pwrmgr_task_state(zclApp_TaskID, PWRMGR_CONSERVE);
}
return;
}
// On LEDs and hold power 2 sec.
isLedOn = true;
osal_pwrmgr_task_state(zclApp_TaskID, PWRMGR_HOLD);
osal_start_timerEx(zclApp_TaskID, APP_WORK_LED_EVT, 2000);
#endif
if (showSound & showMode) {
showSound = false;
showMode = false;
HalLedBlink(OLD_LED, 1, 99, 2000);
} else if (showSound) {
showSound = false;
HalLedBlink(OLD_LED, zclApp_Config.ModeSound + 1, 50, 750);
} else if (showMode) {
showMode = false;
HalLedBlink(OLD_LED, zclApp_Config.ModeOpen + 1, 50, 250);
}
if (zclApp_Config.ModeOpen == Always) {
HalLedSet(GREEN_LED, HAL_LED_MODE_ON);
}
if (zclApp_Config.ModeOpen != Always) {
HalLedSet(GREEN_LED, HAL_LED_MODE_OFF);
}
if (zclApp_Config.ModeOpen == Once) {
HalLedBlink(GREEN_LED, 0, 95, 500);
}
if (zclApp_Config.ModeOpen == Drop) {
HalLedSet(RED_LED, HAL_LED_MODE_ON);
}
if (zclApp_Config.ModeOpen != Drop) {
HalLedSet(RED_LED, HAL_LED_MODE_OFF);
}
if (zclApp_State.State != Idle) {
HalLedSet(RED_LED, HAL_LED_MODE_BLINK);
}
if (zclApp_Config.ModeSound == true) {
HalLedSet(BLUE_LED, HAL_LED_MODE_OFF);
}
else {
HalLedSet(BLUE_LED, HAL_LED_MODE_ON);
}
}
static void zclApp_BtnClicks(byte count) {
zclApp_State.clicks = 0;
osal_start_timerEx(zclApp_TaskID, APP_WORK_LED_EVT, 50);
switch (count) {
case 1:
LREPMaster("Button click\r\n");
if (zclApp_State.State == Idle) {
if (zclApp_Config.ModeOpen < Drop) {
zclApp_Config.ModeOpen++;
}
else {
zclApp_Config.ModeOpen = Never;
}
}
break;
case 1:
zclApp_OneReport();
}
else {
zclApp_Config.ModeOpen = Once;
}
showMode = true;
break;
case 2:
if (hold) {
HalLedBlink(LED_PIN, zclApp_Config.ModeSound+1, 50, 750);
}
else {
HalLedBlink(LED_PIN, zclApp_Config.ModeOpen+1, 50, 250);
}
break;
default:
/*
if (hold) {
osal_stop_timerEx(zclApp_TaskID, APP_BTN_HOLD_EVT);
osal_clear_event(zclApp_TaskID, APP_BTN_HOLD_EVT);
}
else {
osal_stop_timerEx(zclApp_TaskID, APP_BTN_CLICK_EVT);
osal_clear_event(zclApp_TaskID, APP_BTN_CLICK_EVT);
}
*/
currentBtnClickPhase = 0;
break;
}
if (currentBtnClickPhase != 0) {
if (hold) {
osal_start_timerEx(zclApp_TaskID, APP_BTN_HOLD_EVT, 50);
}
else {
osal_start_timerEx(zclApp_TaskID, APP_BTN_CLICK_EVT, 50);
}
}
}
static void zclApp_Report(void) {
LREPMaster("Button double\r\n");
if (zclApp_State.State == Idle) {
zclApp_Config.ModeSound = !zclApp_Config.ModeSound;
HANDSET_PIN = !zclApp_Config.ModeSound;
CATCH_PIN = !zclApp_Config.ModeSound;
zclApp_OneReport();
}
showSound = true;
break;
case 255:
LREPMaster("Button hold\r\n");
if (zclApp_State.State == Idle) {
zclApp_Config.ModeSound = true;
HANDSET_PIN = !zclApp_Config.ModeSound;
CATCH_PIN = !zclApp_Config.ModeSound;
zclApp_Config.ModeOpen = Never;
zclApp_OneReport();
}
else {
zclApp_State.State = Droped;
zclApp_TalkStart();
osal_start_timerEx(zclApp_TaskID, APP_RING_STOP_EVT, 250);
}
showMode = true;
showSound = true;
break;
}
}
static void zclApp_OneReport(void) {
HalLedSet(LED_PIN, HAL_LED_MODE_BLINK);
//HalLedSet(BLUE_LED, HAL_LED_MODE_BLINK);
bdb_RepChangedAttrValue(zclApp_FirstEP.EndPoint, ZCL_INTERCOM, ATTRID_STATE);
bdb_RepChangedAttrValue(zclApp_FirstEP.EndPoint, ZCL_INTERCOM, ATTRID_MODEOPEN);
#if !defined( ZIC_BATTERY_MODE )
// #if !defined( ZIC_BATTERY_MODE )
bdb_RepChangedAttrValue(zclApp_FirstEP.EndPoint, ZCL_INTERCOM, ATTRID_MODESOUND);
#endif
// #endif
}
@@ -435,7 +507,7 @@ static void zclApp_BasicResetCB(void) {
static ZStatus_t zclApp_ReadWriteAuthCB(afAddrType_t *srcAddr, zclAttrRec_t *pAttr, uint8 oper) {
LREPMaster("AUTH CB called\r\n");
osal_start_timerEx(zclApp_TaskID, APP_SAVE_ATTRS_EVT, 2000);
osal_start_timerEx(zclApp_TaskID, APP_SAVE_ATTRS_EVT, 200);
return ZSuccess;
}
@@ -453,10 +525,11 @@ static void zclApp_ConfigInit(bool restart) {
uint32 ReportInterval = (uint32)zclApp_Config.TimeReport * (uint32)60;
LREP("Start report with interval %d seconds\r\n", ReportInterval);
osal_start_reload_timer(zclApp_TaskID, APP_REPORT_EVT, ((uint32)ReportInterval*(uint32)1000));
osal_start_timerEx(zclApp_TaskID, APP_WORK_LED_EVT, 50);
HalLedSet(HANDSET_PIN, !zclApp_Config.ModeSound);
HalLedSet(CATCH_PIN, !zclApp_Config.ModeSound);
HalLedSet(ANSWER_PIN, HAL_LED_MODE_OFF);
HANDSET_PIN = !zclApp_Config.ModeSound;
CATCH_PIN = !zclApp_Config.ModeSound;
ANSWER_PIN = 0;
}
static void zclApp_RestoreAttributesFromNV(void) {

View File

@@ -24,6 +24,8 @@ extern "C" {
#define APP_BTN_HOLD_EVT 0x0010
#define APP_RING_STOP_EVT 0x0020
#define APP_TALK_START_EVT 0x0040
#define APP_WORK_LED_EVT 0x0080
#define APP_BTN_DOUBLE_EVT 0x0100
/*********************************************************************
* MACROS
@@ -56,11 +58,6 @@ extern "C" {
#define ATTRID_TIMEBELL 0x0057
#define ATTRID_TIMEREPORT 0x0056
#define LED_PIN HAL_LED_1
#define CATCH_PIN HAL_LED_2
#define ANSWER_PIN HAL_LED_3
#define HANDSET_PIN HAL_LED_4
#define TIMER_RESTART TRUE
#define TIMER_START FALSE
@@ -116,6 +113,7 @@ typedef struct {
WorkState_t State;
uint8 RingRunStep;
uint32 pressTime;
byte clicks;
} device_state_t;

View File

@@ -14,10 +14,6 @@ const bind = async (endpoint, target, clusters) => {
};
const configureReporting = {
currentPositionLiftPercentage: async (endpoint, overrides) => {
const payload = configureReportingPayload('currentPositionLiftPercentage', 1, repInterval.MAX, 1, overrides);
await endpoint.configureReporting('closuresWindowCovering', payload);
},
batteryPercentageRemaining: async (endpoint, overrides) => {
const payload = configureReportingPayload(
'batteryPercentageRemaining', repInterval.HOUR, repInterval.MAX, 0, overrides,
@@ -69,6 +65,18 @@ const fz = {
}
if (msg.data.hasOwnProperty(0x0051)) {
result.mode = ['Never', 'Once', 'Always', 'Drop'][msg.data[0x0051]];
result.once = 'OFF';
result.always = 'OFF';
result.drop = 'OFF';
if (msg.data[0x0051] == 1) {
result.once = 'ON';
}
if (msg.data[0x0051] == 2) {
result.always = 'ON';
}
if (msg.data[0x0051] == 3) {
result.drop = 'ON';
}
}
if (msg.data.hasOwnProperty(0x0052)) {
result.sound = ['OFF', 'ON'][msg.data[0x0052]];
@@ -95,11 +103,11 @@ const fz = {
const tz = {
diy_zintercom_config: {
key: ['state', 'mode', 'sound', 'time_ring', 'time_talk', 'time_open', 'time_bell', 'time_report'],
key: ['state', 'mode', 'sound', 'once', 'always', 'drop', 'time_ring', 'time_talk', 'time_open', 'time_bell', 'time_report'],
convertSet: async (entity, key, rawValue, meta) => {
const lookup = {
'OFF': 0x00,
'ON': 0x01,
'OFF': '0',
'ON': '1',
};
const modeOpenLookup = {
'Never': '0',
@@ -115,9 +123,24 @@ const tz = {
value = modeOpenLookup.hasOwnProperty(rawValue) ? modeOpenLookup[rawValue] : parseInt(rawValue, 10);
}
if (key == 'once') {
value = (rawValue == 'ON') ? 1 : 0;
}
if (key == 'always') {
value = (rawValue == 'ON') ? 2 : 0;
}
if (key == 'drop') {
value = (rawValue == 'ON') ? 3 : 0;
}
const payloads = {
mode: {0x0051: {value, type: 0x30}},
sound: {0x0052: {value, type: 0x10}},
once: {0x0051: {value, type: 0x30}},
always: {0x0051: {value, type: 0x30}},
drop: {0x0051: {value, type: 0x30}},
time_ring: {0x0053: {value, type: 0x20}},
time_talk: {0x0054: {value, type: 0x20}},
time_open: {0x0055: {value, type: 0x20}},
@@ -126,6 +149,17 @@ const tz = {
};
await entity.write('closuresDoorLock', payloads[key]);
if (key == 'once' || key == 'always' || key == 'drop' || key == 'mode') {
const payloads = {
mode: ['closuresDoorLock', 0x0051],
once: ['closuresDoorLock', 0x0051],
always: ['closuresDoorLock', 0x0051],
drop: ['closuresDoorLock', 0x0051],
};
await entity.read(payloads[key][0], [payloads[key][1]]);
}
return {
state: {[key]: rawValue},
};
@@ -135,6 +169,9 @@ const tz = {
state: ['closuresDoorLock', 0x0050],
mode: ['closuresDoorLock', 0x0051],
sound: ['closuresDoorLock', 0x0052],
once: ['closuresDoorLock', 0x0051],
always: ['closuresDoorLock', 0x0051],
drop: ['closuresDoorLock', 0x0051],
time_ring: ['closuresDoorLock', 0x0053],
time_talk: ['closuresDoorLock', 0x0054],
time_open: ['closuresDoorLock', 0x0055],
@@ -192,6 +229,12 @@ const device = {
.withDescription('Select open mode'),
exposes.binary('sound', ea.ALL, 'ON', 'OFF').withProperty('sound')
.withDescription('Enable or disable sound'),
exposes.binary('once', ea.ALL, 'ON', 'OFF').withProperty('once')
.withDescription('Enable or disable once mode'),
exposes.binary('always', ea.ALL, 'ON', 'OFF').withProperty('always')
.withDescription('Enable or disable always mode'),
exposes.binary('drop', ea.ALL, 'ON', 'OFF').withProperty('drop')
.withDescription('Enable or disable drop mode'),
exposes.numeric('time_ring', ea.ALL).withUnit('sec')
.withDescription('Time to ring before answer'),
exposes.numeric('time_talk', ea.ALL).withUnit('sec')

Binary file not shown.