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

6 Commits
Utyf ... master

Author SHA1 Message Date
xyzroe
5b2db2f803 Create FUNDING.yml 2024-03-30 00:26:10 +02:00
xyzroe
07114547b4 Update converter to support z2m v1.35 2024-01-07 15:49:38 +02:00
xyzroe
abc32f88fa Update README.md 2023-09-06 12:20:31 +03:00
xyzroe
eb86a39868 Update README.md 2022-07-05 01:31:01 +03:00
xyzroe
8995c3bd33 Update README.md 2022-05-19 19:51:09 +03:00
xyzroe
c4e44672ad Merge pull request #8 from Utyff/Utyf
Support RGB Led and One Led, some small fixes, add RBG scheme and Gerber files
2022-05-19 19:40:11 +03:00
3 changed files with 42 additions and 55 deletions

14
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,14 @@
# These are supported funding model platforms
github: xyzroe
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
polar: # Replace with a single Polar username
buy_me_a_coffee: xyzroe
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

View File

@@ -1,4 +1,7 @@
# Zintercom # Zintercom
[![GitHub version](https://img.shields.io/github/release/xyzroe/Zintercom.svg)](https://github.com/xyzroe/Zintercom/releases)
[![GitHub download](https://img.shields.io/github/downloads/xyzroe/Zintercom/total.svg)](https://github.com/xyzroe/Zintercom/latest)
[![License](https://img.shields.io/github/license/xyzroe/Zintercom.svg)](LICENSE.txt)
## How to compile ## How to compile
Follow this article https://zigdevwiki.github.io/Begin/IAR_install/ Follow this article https://zigdevwiki.github.io/Begin/IAR_install/
@@ -25,6 +28,14 @@ You can control sound mode using z2m or by long-press the button. (1000ms < X <
After pressing the button, the LED will flash at 1.5 Hz. After pressing the button, the LED will flash at 1.5 Hz.
One flash - OFF, two flashes - ON. One flash - OFF, two flashes - ON.
## Hardware v2.0
New version of the board with RGB led support.
All known bugs and shortcomings have been fixed.
Thanks [@Utyff](https://github.com/Utyff)
### [More info](https://github.com/diyruz/Zintercom/blob/master/README-RGB.md)
## Important info ## Important info
@@ -116,6 +127,10 @@ For example, you can turn on the light while a call comes to the intercom, for n
![](https://cdn.thingiverse.com/assets/0b/2f/09/d3/37/large_display_2021-05-22_22-55-43.JPG) ![](https://cdn.thingiverse.com/assets/0b/2f/09/d3/37/large_display_2021-05-22_22-55-43.JPG)
### Like ♥️?
[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/xyzroe)
### Inspired by ### Inspired by
The original scheme of the intercom opener by [Alexander Vaidurov](https://easyeda.com/Alex_AW/domofon-with-battery) 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) Various hardware solutions by [Jager](https://modkam.ru)

View File

@@ -1,11 +1,12 @@
const { const zigbeeHerdsmanConverters = require('zigbee-herdsman-converters');
fromZigbeeConverters,
toZigbeeConverters, const exposes = zigbeeHerdsmanConverters['exposes'] || require("zigbee-herdsman-converters/lib/exposes");
exposes
} = require('zigbee-herdsman-converters');
const ep = exposes.presets; const ep = exposes.presets;
const ea = exposes.access; const ea = exposes.access;
const fromZigbeeConverters = zigbeeHerdsmanConverters.fromZigbeeConverters || zigbeeHerdsmanConverters.fromZigbee;
const toZigbeeConverters = zigbeeHerdsmanConverters.toZigbeeConverters || zigbeeHerdsmanConverters.toZigbee;
const bind = async (endpoint, target, clusters) => { const bind = async (endpoint, target, clusters) => {
for (const cluster of clusters) { for (const cluster of clusters) {
@@ -14,6 +15,10 @@ const bind = async (endpoint, target, clusters) => {
}; };
const configureReporting = { const configureReporting = {
currentPositionLiftPercentage: async (endpoint, overrides) => {
const payload = configureReportingPayload('currentPositionLiftPercentage', 1, repInterval.MAX, 1, overrides);
await endpoint.configureReporting('closuresWindowCovering', payload);
},
batteryPercentageRemaining: async (endpoint, overrides) => { batteryPercentageRemaining: async (endpoint, overrides) => {
const payload = configureReportingPayload( const payload = configureReportingPayload(
'batteryPercentageRemaining', repInterval.HOUR, repInterval.MAX, 0, overrides, 'batteryPercentageRemaining', repInterval.HOUR, repInterval.MAX, 0, overrides,
@@ -65,18 +70,6 @@ const fz = {
} }
if (msg.data.hasOwnProperty(0x0051)) { if (msg.data.hasOwnProperty(0x0051)) {
result.mode = ['Never', 'Once', 'Always', 'Drop'][msg.data[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)) { if (msg.data.hasOwnProperty(0x0052)) {
result.sound = ['OFF', 'ON'][msg.data[0x0052]]; result.sound = ['OFF', 'ON'][msg.data[0x0052]];
@@ -103,11 +96,11 @@ const fz = {
const tz = { const tz = {
diy_zintercom_config: { diy_zintercom_config: {
key: ['state', 'mode', 'sound', 'once', 'always', 'drop', 'time_ring', 'time_talk', 'time_open', 'time_bell', 'time_report'], key: ['state', 'mode', 'sound', 'time_ring', 'time_talk', 'time_open', 'time_bell', 'time_report'],
convertSet: async (entity, key, rawValue, meta) => { convertSet: async (entity, key, rawValue, meta) => {
const lookup = { const lookup = {
'OFF': '0', 'OFF': 0x00,
'ON': '1', 'ON': 0x01,
}; };
const modeOpenLookup = { const modeOpenLookup = {
'Never': '0', 'Never': '0',
@@ -123,24 +116,9 @@ const tz = {
value = modeOpenLookup.hasOwnProperty(rawValue) ? modeOpenLookup[rawValue] : parseInt(rawValue, 10); 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 = { const payloads = {
mode: {0x0051: {value, type: 0x30}}, mode: {0x0051: {value, type: 0x30}},
sound: {0x0052: {value, type: 0x10}}, 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_ring: {0x0053: {value, type: 0x20}},
time_talk: {0x0054: {value, type: 0x20}}, time_talk: {0x0054: {value, type: 0x20}},
time_open: {0x0055: {value, type: 0x20}}, time_open: {0x0055: {value, type: 0x20}},
@@ -149,17 +127,6 @@ const tz = {
}; };
await entity.write('closuresDoorLock', payloads[key]); 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 { return {
state: {[key]: rawValue}, state: {[key]: rawValue},
}; };
@@ -169,9 +136,6 @@ const tz = {
state: ['closuresDoorLock', 0x0050], state: ['closuresDoorLock', 0x0050],
mode: ['closuresDoorLock', 0x0051], mode: ['closuresDoorLock', 0x0051],
sound: ['closuresDoorLock', 0x0052], sound: ['closuresDoorLock', 0x0052],
once: ['closuresDoorLock', 0x0051],
always: ['closuresDoorLock', 0x0051],
drop: ['closuresDoorLock', 0x0051],
time_ring: ['closuresDoorLock', 0x0053], time_ring: ['closuresDoorLock', 0x0053],
time_talk: ['closuresDoorLock', 0x0054], time_talk: ['closuresDoorLock', 0x0054],
time_open: ['closuresDoorLock', 0x0055], time_open: ['closuresDoorLock', 0x0055],
@@ -229,12 +193,6 @@ const device = {
.withDescription('Select open mode'), .withDescription('Select open mode'),
exposes.binary('sound', ea.ALL, 'ON', 'OFF').withProperty('sound') exposes.binary('sound', ea.ALL, 'ON', 'OFF').withProperty('sound')
.withDescription('Enable or disable 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') exposes.numeric('time_ring', ea.ALL).withUnit('sec')
.withDescription('Time to ring before answer'), .withDescription('Time to ring before answer'),
exposes.numeric('time_talk', ea.ALL).withUnit('sec') exposes.numeric('time_talk', ea.ALL).withUnit('sec')