-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
111 lines (100 loc) · 3.67 KB
/
script.js
File metadata and controls
111 lines (100 loc) · 3.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// ####################################################################
// Definition of ioBroker datapoints
// ####################################################################
var myTimeout;
const mowerState = 'CHANGE_ME'; // emitted by smartgarden adapter
const batteryLevelState = 'CHANGE_ME'; // emitted by smartgarden adapter
const shellyState = 'CHANGE_ME'; // accessed through shelly adapter
const doorStateGlobal = 'CHANGE_ME'; // local state created by JS adapter
const mowerTimeplanState = 'CHANGE_ME'; // emitted by gardena adapter
// ####################################################################
// Functions to open/close roller shutter through shelly relais
// ####################################################################
function openDoor() {
let doorState = getState(doorStateGlobal).val;
if (doorState == 'closed') {
console.log('[# DOOR #] Opening...');
setState(shellyState + '.Open', true);
setState('javascript.0.nextOpen', 'open');
} else {
console.log('[# DOOR #] Already open');
}
}
function closeDoor() {
let doorState = getState(doorStateGlobal).val;
if (doorState == 'open') {
setState(shellyState + '.Close', true);
console.log('[# DOOR #] Closing...');
setState('javascript.0.nextOpen', 'closed');
} else {
console.log('[# DOOR #] Already closed');
}
}
function setNextOpenTime(mowerStartTime, delta) {
let openTime = new Date(mowerStartTime - 1000 * delta);
console.log(
'[# DOOR-SCHEDULER #] Next open at ' +
openTime +
' scheduled by Mower timeplan change'
);
clearTimeout(myTimeout);
myTimeout = setTimeout(openDoor, openTime.getTime() - Date.now());
}
// ###########################################################################################
// Listeners to events emited from gardena mower API (accessed through smartgarden adapter)
// ###########################################################################################
// Set new open time if mower changed next start time
on(mowerTimeplanState, function (obj) {
if (obj.state.val != '1969-12-31T22:00Z') {
let time = new Date(obj.state.val);
setNextOpenTime(time, 10);
}
});
// Initialize next open time if script restarted
if (getState(mowerTimeplanState).val != '1969-12-31T22:00Z') {
let time = new Date(getState(mowerTimeplanState).val);
setNextOpenTime(time, 10);
}
on(batteryLevelState, function (obj) {
let currentMowerState = getState(mowerState).val;
if (obj.state.val == '99' && currentMowerState == 'OK_CHARGING') {
console.log(
'[# DOOR-SCHEDULER #] Mower battery state 99%. Leaving soon. Opening door.'
);
openDoor();
}
});
on(mowerState, function (obj) {
if (obj.state.val == 'OK_LEAVING') {
console.log(
'[# DOOR-SCHEDULER #] Mower left. Closing door in 10s [' +
obj.state.val +
']'
);
setTimeout(closeDoor, 10 * 1000);
}
if (obj.state.val == 'OK_SEARCHING') {
console.log(
'[# DOOR-SCHEDULER #] Mower is coming back. Opening door [' +
obj.state.val +
']'
);
openDoor();
}
if (
obj.state.val == 'PARKED_TIMER' ||
obj.state.val == 'PARKED_PARK_SELECTED' ||
obj.state.val == 'PARKED_AUTOTIMER' ||
obj.state.val == 'OK_CHARGING'
) {
console.log(
'[# DOOR-SCHEDULER #] Mower is parked. Closing door [' +
obj.state.val +
']'
);
closeDoor();
}
if (obj.state.val == 'OK_CUTTING') {
clearTimeout(myTimeout);
}
});