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

13 Commits
0.2.1 ... 1.0.1

Author SHA1 Message Date
lost
c833dc48ab updated EVT_ID thanks to @Anton_ACE 2021-04-23 01:31:45 +03:00
xyzroe
bc3f698efc Merge pull request #2 from diyruz/hold_btn
long button press
2021-04-23 01:25:13 +03:00
lost
29ff218b19 trying to add long press button event 2021-04-23 00:34:20 +03:00
lost
44087fceb9 changed default timings 2021-04-23 00:30:19 +03:00
xyzroe
a4fe271d30 update images markup 2021-04-16 10:22:14 +03:00
xyzroe
deafb7667e update images links 2021-04-16 09:51:56 +03:00
xyzroe
29c71487ea Merge pull request #1 from aprosvetova/patch-1
Fix the converter link
2021-04-15 21:09:10 +03:00
Anna Prosvetova
5e02f3c97a Fix the converter link 2021-04-15 21:01:58 +03:00
lost
2b89cbc188 updated readme battery mode part
updated external converter
updated some images
2021-04-15 18:01:05 +03:00
lost
23626a37d1 hardware PCB v1.0 2021-04-14 14:03:33 +03:00
xyzroe
468d299e9e Add files via upload 2021-04-13 18:20:05 +03:00
xyzroe
afc1124b64 Update README.md 2021-03-23 21:48:21 +02:00
lost
17fe7c10c1 0.2.2 2021-03-23 21:20:52 +02:00
19 changed files with 103 additions and 101 deletions

View File

@@ -10,25 +10,25 @@
<project>GenericApp</project>
<configuration>Zintercom_Router</configuration>
</member>
<member>
<project>GenericApp</project>
<configuration>Zintercom_Router_PA1</configuration>
</member>
<member>
<project>GenericApp</project>
<configuration>Zintercom_Router_PA2</configuration>
</member>
<member>
<project>GenericApp</project>
<configuration>Zintercom_EndDevice</configuration>
</member>
<member>
<project>GenericApp</project>
<configuration>Zintercom_Router_CC2592</configuration>
<configuration>Zintercom_EndDevice_PA1</configuration>
</member>
<member>
<project>GenericApp</project>
<configuration>Zintercom_EndDevice_CC2592</configuration>
</member>
<member>
<project>GenericApp</project>
<configuration>Zintercom_Router_CC2591</configuration>
</member>
<member>
<project>GenericApp</project>
<configuration>Zintercom_EndDevice_CC2591</configuration>
<configuration>Zintercom_EndDevice_PA2</configuration>
</member>
</batchDefinition>
</batchBuild>

View File

@@ -1,5 +1,21 @@
# Zintercom
## Zigbee Intercom Automator
##### Zigbee Intercom Automator
This device is designed to control the matrix intercom using Zigbee.
Using zigbee2mqtt you can:
1. Receive notification when the intercom rings. (also support **direct bind**)
2. Mute the sound on the intercom handset.
3. Automatically or manually open the door or hang up when the intercom rings.
There are 4 work modes:
1. `Never` - ordinary work mode, use handset to control
2. `Once` - one time open door when intercom rings
3. `Always` - open door when intercom rings
4. `Drop` - hangs up all intercom rings, right after start
You can change the operating mode with z2m or by pressing the button.
After pressing the button, the LED will flash.
The number of flashes indicates the current operating mode.
### How to join
Reset to FN by reboot device 5 times with interval less than 10 seconds.
@@ -7,39 +23,65 @@ Reset to FN by press and hold BTN for 5 seconds.
LED will flash during reset.
![](/images/z2m_dashboard.gif)
### How to add device into zigbe2mqtt
Use [external converters](https://www.zigbee2mqtt.io/information/configuration.html#external-converters-configuration) feature
Converter file located [here](./converters/DIY_Zintercom.js)
Converter file located [here](https://github.com/diyruz/Zintercom/blob/master/converters/DIYRuZ_Zintercom.js)
<img src="./images/z2m_dashboard.png" width="45%">
<img src="./images/z2m_exposes.png" width="90%">
![](/images/z2m_exposes.png)
### Schematic
<img src="./hardware/Schematic_Zintercom.png" width="90%">
![](/hardware/Schematic_Zintercom.png)
### PCB size
`57.5mm x 27.3mm`
<img src="./images/dimensions.png" width="60%">
![](/images/dimensions.png)
### DC Power
Support `router` and `end device` modes.
Install `E18-MS1PA1`, `E18-MS1PA2` or `E18-MS1-PCB`.
<img src="./images/front_side.png" width="70%">
<img src="./images/back_DC_5-9V.png" width="35%">
<img src="./images/back_microUSB.png" width="35%">
Install `E18-MS1PA1`, `E18-MS1PA2` or `E18-MS1-PCB`.
![](/images/front_side.png)
![](/images/back_DC_5-9V.png)
### Battery Power
Support only `end device` mode.
Install `E18-MS1-PCB` only!
<img src="./images/back_2xAAA.png" width="35%">
<img src="./images/back_CR2032.png" width="35%">
Do not turn off `sound` because it turns U2 forever, which will drain the battery much faster.
Since the device is in sleep mode, it cannot receive commands.
But you have the ability to set the button mode or at the time of the call.
If any commands are in the coordinator's queue, they will be executed after a button is pressed or a call is received.
![](/images/back_2xAAA.png)
##### The mode set by the Zigbee command `overwrites` the mode set by the button.
### Binding
The device supports direct binding of an incoming call to the onOff cluster.
For example, you can turn on the light while a call comes to the intercom, for notification in mute mode.
### Files to reproduce
* [Gerbers and BOM](https://github.com/diyruz/Zintercom/tree/master/hardware) by [xyzroe](https://t.me/xyzroe)
* [Firmware](https://github.com/diyruz/Zintercom/releases) by [xyzroe](https://t.me/xyzroe)
### Inspired by
The original scheme of the intercom opener by [Alexander Vaidurov](https://easyeda.com/Alex_AW/domofon-with-battery)
Various hardware solutions by [Jager](https://modkam.ru)
Firmware for different Zigbee devices by [Anonymous](https://github.com/nurikk/)

View File

@@ -242,15 +242,15 @@ extern void MAC_RfFrontendSetup(void);
P1DIR |= BV(0) | BV(1); \
\
/* Set PA/LNA HGM control P0_7 */ \
P0DIR |= BV(7); \
P0DIR |= BV(7); \
\
\
/* setup RF frontend if necessary */ \
HAL_BOARD_RF_FRONTEND_SETUP(); \
LED1_DDR |= LED1_BV; \
LED2_DDR |= LED2_BV; \
LED3_DDR |= LED3_BV;
LED4_DDR |= LED4_BV; \
LED3_DDR |= LED3_BV; \
LED4_DDR |= LED4_BV; \
}
#elif defined (HAL_PA_LNA_CC2592) || defined (HAL_PA_LNA_SE2431L)

View File

@@ -88,8 +88,6 @@ static void zclApp_RingRun(void);
static void zclApp_TalkStart(void);
static void zclApp_RingEnd(void);
//static uint32 pressTime = 0;
/*********************************************************************
* ZCL General Profile Callback table
*/
@@ -141,33 +139,45 @@ static void zclApp_HandleKeys(byte portAndAction, byte keyCode) {
//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_reload_timer(zclApp_TaskID, APP_RING_STOP_EVT, 3000);
if (portAndAction & HAL_KEY_PRESS) {
//osal_pwrmgr_task_state(zclApp_TaskID, PWRMGR_HOLD);
//osal_pwrmgr_task_state(Hal_TaskID, PWRMGR_CONSERVE);
//start ring
if (zclApp_State.RingRunStep == 0) {
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);
afAddrType_t inderect_DstAddr = {.addrMode = (afAddrMode_t)AddrNotPresent, .endPoint = 0, .addr.shortAddr = 0};
zclGeneral_SendOnOff_CmdOn(zclApp_FirstEP.EndPoint, &inderect_DstAddr, FALSE, bdb_getZCLFrameCounter());
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);
afAddrType_t inderect_DstAddr = {.addrMode = (afAddrMode_t)AddrNotPresent, .endPoint = 0, .addr.shortAddr = 0};
zclGeneral_SendOnOff_CmdOn(zclApp_FirstEP.EndPoint, &inderect_DstAddr, FALSE, bdb_getZCLFrameCounter());
}
}
//start new stop timer (ring ends timer)
osal_start_reload_timer(zclApp_TaskID, APP_RING_STOP_EVT, 3000);
}
if (portAndAction & 0x04) { //P2 Btn //S2 P2_0
zclFactoryResetter_HandleKeys(portAndAction, keyCode);
if (portAndAction & HAL_KEY_PRESS) {
LREPMaster("Key pressed\r\n");
osal_start_reload_timer(zclApp_TaskID, APP_BTN_CLICK_EVT, 50);
zclApp_State.pressTime = osal_getClock();
LREP("pressTime = %d\r\n", zclApp_State.pressTime);
}
if (portAndAction & HAL_KEY_RELEASE) {
LREPMaster("Key released\r\n");
uint32 holdTime = osal_getClock() - zclApp_State.pressTime;
LREP("holdTime = %d \r\n", holdTime);
zclApp_State.pressTime = 0;
if (holdTime >= 1) { //seconds
osal_start_reload_timer(zclApp_TaskID, APP_BTN_HOLD_EVT, 50);
}
else {
osal_start_reload_timer(zclApp_TaskID, APP_BTN_CLICK_EVT, 50);
}
}
}
}
@@ -286,7 +296,7 @@ static void zclApp_RingRun(void) {
}
break;
case Droped:
if (zclApp_State.RingRunStep > 3) {
if (zclApp_State.RingRunStep > 1) {
zclApp_RingEnd();
}
break;
@@ -379,9 +389,6 @@ static void zclApp_BtnClick(bool hold) {
currentBtnClickPhase = 0;
break;
}
#if defined( ZIC_BATTERY_MODE )
zclBattery_Report();
#endif
}
static void zclApp_Report(void) {

View File

@@ -21,9 +21,9 @@ extern "C" {
#define APP_SAVE_ATTRS_EVT 0x0002
#define APP_BTN_CLICK_EVT 0x0004
#define APP_RING_RUN_EVT 0x0008
#define APP_BTN_HOLD_EVT 0x0016
#define APP_RING_STOP_EVT 0x0032
#define APP_TALK_START_EVT 0x0064
#define APP_BTN_HOLD_EVT 0x0010
#define APP_RING_STOP_EVT 0x0020
#define APP_TALK_START_EVT 0x0040
/*********************************************************************
* MACROS

View File

@@ -64,8 +64,8 @@ const uint8 zclApp_PowerSource = POWER_SOURCE_DC;
#define DEFAULT_ModeOpen Never
#define DEFAULT_ModeSound TRUE
#define DEFAULT_TimeRing 3 //seconds to ring, before answer
#define DEFAULT_TimeTalk 1 //seconds to talk, before open
#define DEFAULT_TimeRing 7 //seconds to ring, before answer
#define DEFAULT_TimeTalk 3 //seconds to talk, before open
#define DEFAULT_TimeOpen 2 //seconds to hold open
@@ -81,6 +81,7 @@ application_config_t zclApp_Config = {
device_state_t zclApp_State = {
.State = Idle,
.RingRunStep = 0,
.pressTime = 0,
};

View File

@@ -7,11 +7,6 @@ const {
const ep = exposes.presets;
const ea = exposes.access;
const ZCL_DATATYPE_INT16 = 0x29;
const ZCL_DATATYPE_UINT8 = 0x20;
const ZCL_DATATYPE_UINT16 = 0x21;
const ZCL_DATATYPE_BOOLEAN = 0x10;
const ZCL_DATATYPE_INT32 = 0x2b;
const bind = async (endpoint, target, clusters) => {
for (const cluster of clusters) {
await endpoint.bind(cluster, target);
@@ -63,8 +58,6 @@ const repInterval = {
MINUTE: 60,
};
const fz = {
diy_zintercom_config: {
cluster: 'closuresDoorLock',
@@ -150,11 +143,10 @@ const tz = {
const device = {
zigbeeModel: ['DIY_Zintercom'],
model: 'DIY_Zintercom',
vendor: 'xyzroe',
description: '[Intercom Auto Opener]',
supports: '',
//homeassistant: [hass.temperature, hass.presure, hass.humidity, hass.co2],
model: 'DIYRuZ_Zintercom',
vendor: 'DIYRuZ',
description: '[Matrix intercom auto opener](https://diyruz.github.io/posts/zintercom/)',
icon: 'https://github.com/diyruz/Zintercom/blob/master/images/z2m.png?raw=true',
fromZigbee: [
fromZigbeeConverters.battery,
fz.diy_zintercom_config,
@@ -169,37 +161,11 @@ const device = {
configure: async (device, coordinatorEndpoint) => {
const firstEndpoint = device.getEndpoint(1);
//await bind(firstEndpoint, coordinatorEndpoint, ['msCO2', 'closuresDoorLock', 'genOnOff']);
await bind(firstEndpoint, coordinatorEndpoint, ['closuresDoorLock', 'genPowerCfg']);
const overides = {min: 0, max: 3600, change: 0};
await configureReporting.batteryVoltage(firstEndpoint, overides);
await configureReporting.batteryPercentageRemaining(firstEndpoint, overides);
/*
if (device.applicationVersion < 3) { // Legacy PM2 firmwares
const payload = [{
attribute: 'batteryPercentageRemaining',
minimumReportInterval: 0,
maximumReportInterval: 3600,
reportableChange: 0,
}, {
attribute: 'batteryVoltage',
minimumReportInterval: 0,
maximumReportInterval: 3600,
reportableChange: 0,
}];
await firstEndpoint.configureReporting('genPowerCfg', payload);
}
*/
/*
const msBindPayload = [{
attribute: 'measuredValue',
minimumReportInterval: 0,
maximumReportInterval: 3600,
reportableChange: 0,
}];
await firstEndpoint.configureReporting('msCO2', msBindPayload);
*/
const payload = [{
attribute: {
@@ -212,20 +178,6 @@ const device = {
},
];
await firstEndpoint.configureReporting('closuresDoorLock', payload);
/**/
/*
await firstEndpoint.configureReporting('msTemperatureMeasurement', msBindPayload);
await firstEndpoint.configureReporting('msRelativeHumidity', msBindPayload);
const pressureBindPayload = [{
attribute: 'scaledValue',
minimumReportInterval: 0,
maximumReportInterval: 3600,
reportableChange: 0,
}];
await firstEndpoint.configureReporting('msPressureMeasurement', pressureBindPayload);
*/
},
exposes: [

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 330 KiB

After

Width:  |  Height:  |  Size: 313 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 348 KiB

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 347 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 KiB

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 KiB

After

Width:  |  Height:  |  Size: 298 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

After

Width:  |  Height:  |  Size: 198 KiB

BIN
images/z2m.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

BIN
images/z2m_dashboard.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB