node-red-contrib-alice 0.6.4 → 0.6.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -22
- package/nodes/alice-sensor.js +10 -5
- package/nodes/alice.html +30 -17
- package/nodes/alice.js +16 -4
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -35,28 +35,6 @@ npm install node-red-contrib-alice
|
|
|
35
35
|
Для того, что бы устройство ответило Алисе, что комманда выполнена успешно, на вход должно прийти соответсвующее значение.
|
|
36
36
|
Если ваше устройство отвечает дольше или совсем не возвращает подтверждение просто добавьте оставьте галочку Response включенной
|
|
37
37
|
|
|
38
|
-
### Поддерживаемые устройства
|
|
39
|
-
Тип | Описание | Пример устройства
|
|
40
|
-
---|---|---
|
|
41
|
-
devices.types.light | Устройство, которое имеет управляемые светящиеся элементы. | Лампочка, светильник, ночник, люстра.
|
|
42
|
-
devices.types.socket | Розетка. | Умная розетка.
|
|
43
|
-
devices.types.switch | Выключатель. | Настенный выключатель света, тумблер, автомат в электрическом щитке, умное реле.
|
|
44
|
-
devices.types.thermostat | Устройство с возможностью регулирования температуры. | Водонагреватель, теплый пол, обогреватель, электровентилятор. Для кондиционера рекомендуется использовать отдельный тип devices.types.thermostat.ac.
|
|
45
|
-
devices.types.thermostat.ac | стройство, управляющее микроклиматом в помещении, с возможностью регулирования температуры и режима работы. | Кондиционер.
|
|
46
|
-
devices.types.media_device | Аудио, видео, мультимедиа техника. Устройства, которые умеют воспроизводить звук и видео. | DVD-плеер, ресивер, медиаприставка и другие медиаустройства. Для телевизора рекомендуется использовать отдельный тип devices.types.media_device.tv.
|
|
47
|
-
devices.types.media_device.tv | Устройство для просмотра видеоконтента. На устройстве можно изменять громкость и переключать каналы. | Умный телевизор, ИК-пульт от телевизора, медиа-приставка, ресивер.
|
|
48
|
-
devices.types.media_device.tv_box | Устройство, подключаемое к телевизору или дисплею, для просмотра видеоконтента. На устройстве можно управлять громкостью воспроизведения и переключать каналы. | ИК-пульт от тв-приставки, умная тв-приставка.
|
|
49
|
-
devices.types.media_device.receiver | Устройство, подключаемое к телевизору или дисплею, для просмотра видеоконтента. На устройстве можно изменять громкость, переключать каналы и источники аудио-/видеосигнала. | ИК-пульт от ресивера, AV-ресивер, спутниковый ресивер.
|
|
50
|
-
devices.types.cooking | Различная умная кухонная техника. | Холодильник, духовой шкаф, кофеварка, мультиварка. Для чайника рекомендуется использовать отдельный тип devices.types.cooking.kettle, для кофеварки — devices.types.cooking.coffee_maker.
|
|
51
|
-
devices.types.cooking.coffee_maker | стройство, которое умеет делать кофе. | Кофеварка, кофемашина.
|
|
52
|
-
devices.types.cooking.kettle | Устройство, которое умеет кипятить воду и/или делать чай. | Умный чайник, термопот.
|
|
53
|
-
devices.types.openable | Устройство, которое умеет открываться и/или закрываться. | Дверь, ворота, окно, ставни. Для штор и жалюзи рекомендуется использовать отдельный тип devices.types.openable.curtain.
|
|
54
|
-
devices.types.openable.curtain | Устройство, которое выполняет функцию штор. | Шторы, жалюзи.
|
|
55
|
-
devices.types.humidifier | Устройство, которое умеет изменять влажность в помещении. | Увлажнитель воздуха.
|
|
56
|
-
devices.types.purifier | Устройство с функцией очистки воздуха. | Очиститель воздуха, мойка воздуха.
|
|
57
|
-
devices.types.vacuum_cleaner | Устройство, которое выполняет функцию пылесоса. | Робот-пылесос.
|
|
58
|
-
devices.types.washing_machine | Устройство для стирки белья. | Стиральная машина.
|
|
59
|
-
devices.types.other | Остальные устройства. | Остальные устройства, не подходящие под типы выше.
|
|
60
38
|
|
|
61
39
|
## Instruction (ENG - Google Translate)
|
|
62
40
|
The module allows you to use Node-Red together with the Yandex.Alice voice assistant service (voice control of smart home devices)
|
package/nodes/alice-sensor.js
CHANGED
|
@@ -57,16 +57,21 @@ function AliceSensor(config){
|
|
|
57
57
|
});
|
|
58
58
|
|
|
59
59
|
this.on('input', (msg, send, done)=>{
|
|
60
|
-
if (this.stype =='devices.properties.bool' && typeof msg.payload != 'boolean'){
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
};
|
|
60
|
+
// if (this.stype =='devices.properties.bool' && typeof msg.payload != 'boolean'){
|
|
61
|
+
// this.error("Wrong type! msg.payload must be boolean.");
|
|
62
|
+
// if (done) {done();}
|
|
63
|
+
// return;
|
|
64
|
+
// };
|
|
65
65
|
if (this.stype =='devices.properties.float' && typeof msg.payload != 'number'){
|
|
66
66
|
this.error("Wrong type! msg.payload must be number.");
|
|
67
67
|
if (done) {done();}
|
|
68
68
|
return;
|
|
69
69
|
};
|
|
70
|
+
if (this.unit == 'unit.percent'){
|
|
71
|
+
msg.payload = +msg.payload.toFixed(0);
|
|
72
|
+
}else {
|
|
73
|
+
msg.payload = +msg.payload.toFixed(2);
|
|
74
|
+
};
|
|
70
75
|
if (msg.payload === this.value){
|
|
71
76
|
this.debug("Value not changed. Cancel update");
|
|
72
77
|
if (done) {done();}
|
package/nodes/alice.html
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
|
|
2
|
-
<script defer src="https://www.gstatic.com/firebasejs/7.14.5/firebase-app.js"></script>
|
|
2
|
+
<!-- <script defer src="https://www.gstatic.com/firebasejs/7.14.5/firebase-app.js"></script>
|
|
3
3
|
<script defer src="https://www.gstatic.com/firebasejs/7.14.5/firebase-auth.js"></script>
|
|
4
|
-
<script defer src="https://www.gstatic.com/firebasejs/7.14.5/firebase-firestore.js"></script>
|
|
4
|
+
<script defer src="https://www.gstatic.com/firebasejs/7.14.5/firebase-firestore.js"></script> -->
|
|
5
|
+
|
|
6
|
+
<script src="https://www.gstatic.com/firebasejs/9.0.2/firebase-app-compat.js"></script>
|
|
7
|
+
<script src="https://www.gstatic.com/firebasejs/9.0.2/firebase-firestore-compat.js"></script>
|
|
8
|
+
<script src="https://www.gstatic.com/firebasejs/9.0.2/firebase-auth-compat.js"></script>
|
|
5
9
|
|
|
6
10
|
<script type="text/javascript">
|
|
7
11
|
const firebaseConfig = {
|
|
@@ -14,6 +18,9 @@
|
|
|
14
18
|
appId: "1:1049686868440:web:e5f5ef6a70ead338b6f2ad",
|
|
15
19
|
measurementId: "G-MD0L6R9N79"
|
|
16
20
|
};
|
|
21
|
+
var firebaseApp;
|
|
22
|
+
var firebaseDb;
|
|
23
|
+
var firebaseAuth;
|
|
17
24
|
RED.nodes.registerType('alice-service',{
|
|
18
25
|
category: 'config',
|
|
19
26
|
defaults: {
|
|
@@ -26,6 +33,11 @@
|
|
|
26
33
|
label: function() {
|
|
27
34
|
return this.name || "Alice-Credentials";
|
|
28
35
|
},
|
|
36
|
+
oneditprepare:function(){
|
|
37
|
+
firebaseApp = firebase.initializeApp(firebaseConfig);
|
|
38
|
+
firebaseDb = firebaseApp.firestore();
|
|
39
|
+
firebaseAuth = firebaseApp.auth();
|
|
40
|
+
},
|
|
29
41
|
oneditsave: function(){
|
|
30
42
|
nodename = $('#node-config-input-email').val();
|
|
31
43
|
$('#node-config-input-name').val(nodename);
|
|
@@ -60,12 +72,13 @@
|
|
|
60
72
|
};
|
|
61
73
|
function SingUp(){
|
|
62
74
|
// Initialize Firebase
|
|
63
|
-
if (!firebase.apps.length) {
|
|
64
|
-
firebase.initializeApp(firebaseConfig);
|
|
65
|
-
};
|
|
75
|
+
// if (!firebase.apps.length) {
|
|
76
|
+
// firebase.initializeApp(firebaseConfig);
|
|
77
|
+
// };
|
|
78
|
+
|
|
66
79
|
var email = document.getElementById("register_email").value;
|
|
67
80
|
var password = document.getElementById("register_password").value;
|
|
68
|
-
|
|
81
|
+
firebaseAuth.createUserWithEmailAndPassword(email, password)
|
|
69
82
|
.then(function(r){
|
|
70
83
|
document.getElementById("node-config-input-email").value = email;
|
|
71
84
|
document.getElementById("node-config-input-password").value = password;
|
|
@@ -77,12 +90,12 @@
|
|
|
77
90
|
})
|
|
78
91
|
};
|
|
79
92
|
function Restore(){
|
|
80
|
-
// Initialize Firebase
|
|
81
|
-
if (!firebase.apps.length) {
|
|
82
|
-
|
|
83
|
-
};
|
|
93
|
+
// // Initialize Firebase
|
|
94
|
+
// if (!firebase.apps.length) {
|
|
95
|
+
// firebase.initializeApp(firebaseConfig);
|
|
96
|
+
// };
|
|
84
97
|
var emailAddress = document.getElementById("restore_email").value;
|
|
85
|
-
|
|
98
|
+
firebaseAuth.sendPasswordResetEmail(emailAddress).then(function() {
|
|
86
99
|
RED.notify("Password recovery email was sent successfully! Please check your email.", 'info');
|
|
87
100
|
Activete();
|
|
88
101
|
}).catch(function(error) {
|
|
@@ -90,16 +103,16 @@
|
|
|
90
103
|
});
|
|
91
104
|
}
|
|
92
105
|
function DeleteAllDevices() {
|
|
93
|
-
if (!firebase.apps.length) {
|
|
94
|
-
|
|
95
|
-
};
|
|
96
|
-
var db = firebase.firestore();
|
|
106
|
+
// if (!firebase.apps.length) {
|
|
107
|
+
// firebase.initializeApp(firebaseConfig);
|
|
108
|
+
// };
|
|
109
|
+
// var db = firebase.firestore();
|
|
97
110
|
var email = document.getElementById("delete_email").value;
|
|
98
111
|
var password = document.getElementById("delete_password").value;
|
|
99
|
-
|
|
112
|
+
firebaseAuth.signInWithEmailAndPassword(email, password)
|
|
100
113
|
.then((res)=>{
|
|
101
114
|
var user = res.user;
|
|
102
|
-
|
|
115
|
+
firebaseDb.collection('users').doc(user.uid).collection('devices').get()
|
|
103
116
|
.then(querySnapshot=>{
|
|
104
117
|
querySnapshot.forEach(doc=>{
|
|
105
118
|
doc.ref.collection('capabilities').get().then(capabSnapshot=>{
|
package/nodes/alice.js
CHANGED
|
@@ -9,9 +9,10 @@ module.exports = function(RED) {
|
|
|
9
9
|
var firebase = require('firebase/compat/app');
|
|
10
10
|
require('firebase/compat/auth');
|
|
11
11
|
require('firebase/compat/firestore');
|
|
12
|
-
|
|
13
12
|
var mqtt = require('mqtt');
|
|
13
|
+
|
|
14
14
|
var fb;
|
|
15
|
+
var auth;
|
|
15
16
|
const email = this.credentials.email;
|
|
16
17
|
const password = this.credentials.password;
|
|
17
18
|
const firebaseConfig = {
|
|
@@ -33,19 +34,21 @@ module.exports = function(RED) {
|
|
|
33
34
|
|
|
34
35
|
try {
|
|
35
36
|
this.debug("Initialize firebase App ...");
|
|
36
|
-
fb = firebase.initializeApp(firebaseConfig,this.id);
|
|
37
|
+
fb = firebase.initializeApp(firebaseConfig,this.id);
|
|
38
|
+
auth = fb.auth();
|
|
37
39
|
} catch (error) {
|
|
38
40
|
if (error.code == 'app/duplicate-app'){
|
|
39
41
|
this.debug("Dublicated firebase app");
|
|
40
42
|
fb = firebase.app(this.id);
|
|
43
|
+
auth = fb.auth();
|
|
41
44
|
}else{
|
|
42
45
|
this.error(error);
|
|
43
46
|
}
|
|
44
47
|
}
|
|
45
|
-
|
|
48
|
+
|
|
46
49
|
this.signIn = ()=>{
|
|
47
50
|
this.debug("SignIn to firebase ...");
|
|
48
|
-
|
|
51
|
+
auth.signInWithEmailAndPassword(email, password)
|
|
49
52
|
.then(u=>{
|
|
50
53
|
this.emit('online');
|
|
51
54
|
this.debug("SignIn to firebase Success. Send signal to online");
|
|
@@ -53,6 +56,11 @@ module.exports = function(RED) {
|
|
|
53
56
|
})
|
|
54
57
|
.catch(err=>{
|
|
55
58
|
this.error(err.message);
|
|
59
|
+
this.debug("Firebase Auth error: "+err.code);
|
|
60
|
+
if (err.code == 'auth/network-request-failed'){
|
|
61
|
+
this.debug("Authentication failed, retry after 10 seconds");
|
|
62
|
+
setTimeout(this.signIn, 10000);
|
|
63
|
+
}
|
|
56
64
|
this.emit('offline');
|
|
57
65
|
});
|
|
58
66
|
}
|
|
@@ -145,6 +153,10 @@ module.exports = function(RED) {
|
|
|
145
153
|
|
|
146
154
|
this.on('online', ()=>{
|
|
147
155
|
this.isOnline = true;
|
|
156
|
+
fb.auth().currentUser.getIdToken(/* forceRefresh */ true)
|
|
157
|
+
.then(token=>{
|
|
158
|
+
this.trace("New firebase token:"+token);
|
|
159
|
+
})
|
|
148
160
|
})
|
|
149
161
|
|
|
150
162
|
this.on('close',(done)=>{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-red-contrib-alice",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.8",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "alice.js",
|
|
6
6
|
"scripts": {
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
},
|
|
36
36
|
"homepage": "https://github.com/efa2000/node-red-contrib-alice#readme",
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"firebase": "9.
|
|
38
|
+
"firebase": "9.1.2",
|
|
39
39
|
"mqtt": "^4.2.6"
|
|
40
40
|
}
|
|
41
41
|
}
|