iobroker.sprinklecontrol 0.2.14 → 0.2.16
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 +9 -8
- package/admin/i18n/de/translations.json +3 -1
- package/admin/i18n/en/translations.json +3 -1
- package/admin/i18n/es/translations.json +3 -1
- package/admin/i18n/fr/translations.json +3 -1
- package/admin/i18n/it/translations.json +3 -1
- package/admin/i18n/nl/translations.json +3 -1
- package/admin/i18n/pl/translations.json +3 -1
- package/admin/i18n/pt/translations.json +3 -1
- package/admin/i18n/ru/translations.json +3 -1
- package/admin/i18n/uk/translations.json +3 -1
- package/admin/i18n/zh-cn/translations.json +3 -1
- package/admin/index_m.html +11 -1
- package/admin/words.js +134 -133
- package/io-package.json +29 -27
- package/lib/evaporation.js +16 -4
- package/lib/myConfig.js +10 -11
- package/lib/valveControl.js +57 -26
- package/main.js +87 -83
- package/package.json +6 -6
package/main.js
CHANGED
|
@@ -132,7 +132,7 @@ function startAdapter(options) {
|
|
|
132
132
|
// Signale zum bestätigen (ack = true) - signals for confirmation
|
|
133
133
|
if (state?.ack === false) {
|
|
134
134
|
// wenn (Holiday == true) ist, soll das Wochenendprogramm gefahren werden.
|
|
135
|
-
if (id === `${adapter.namespace
|
|
135
|
+
if (id === `${adapter.namespace}.control.Holiday`) {
|
|
136
136
|
// @ts-ignore
|
|
137
137
|
holidayStr = state.val;
|
|
138
138
|
adapter.setState(id, {
|
|
@@ -150,7 +150,7 @@ function startAdapter(options) {
|
|
|
150
150
|
});
|
|
151
151
|
}
|
|
152
152
|
// wenn (autoOnOff == false) so werden alle Sprenger nicht mehr automatisch gestartet.
|
|
153
|
-
if ((id === `${adapter.namespace
|
|
153
|
+
if ((id === `${adapter.namespace}.control.autoOnOff`)) {
|
|
154
154
|
autoOnOffStr = state.val;
|
|
155
155
|
adapter.log.info(`startAdapter: control.autoOnOff: ${state.val}`);
|
|
156
156
|
adapter.setState(id, {
|
|
@@ -423,7 +423,10 @@ function checkStates() {
|
|
|
423
423
|
*/
|
|
424
424
|
adapter.getState('control.Holiday', (err, state) => {
|
|
425
425
|
if (state && (state.val == null)) {
|
|
426
|
-
adapter.setState('control.Holiday', {
|
|
426
|
+
adapter.setState('control.Holiday', {
|
|
427
|
+
val: false,
|
|
428
|
+
ack: true
|
|
429
|
+
});
|
|
427
430
|
}
|
|
428
431
|
});
|
|
429
432
|
/**
|
|
@@ -532,10 +535,10 @@ async function checkActualStates () {
|
|
|
532
535
|
weatherForecastTodayNum = 0;
|
|
533
536
|
adapter.log.info(`checkActualStates => Wettervorhersage state.val ( ${_weatherForInstanceToday.val}); ${typeof _weatherForInstanceToday.val} kann nicht als Number verarbeitet werden`);
|
|
534
537
|
}
|
|
535
|
-
await adapter.setStateAsync('info.rainToday',
|
|
536
|
-
weatherForecastTodayNum,
|
|
537
|
-
true
|
|
538
|
-
);
|
|
538
|
+
await adapter.setStateAsync('info.rainToday', {
|
|
539
|
+
val: weatherForecastTodayNum,
|
|
540
|
+
ack: true
|
|
541
|
+
});
|
|
539
542
|
}
|
|
540
543
|
|
|
541
544
|
/**
|
|
@@ -547,11 +550,10 @@ async function checkActualStates () {
|
|
|
547
550
|
).catch((e) => adapter.log.warn(e));
|
|
548
551
|
if (_weatherForInstance && _weatherForInstance.val) {
|
|
549
552
|
weatherForecastTomorrowNum = _weatherForInstance.val;
|
|
550
|
-
await adapter.setStateAsync(
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
);
|
|
553
|
+
await adapter.setStateAsync('info.rainTomorrow', {
|
|
554
|
+
val: weatherForecastTomorrowNum,
|
|
555
|
+
ack: true
|
|
556
|
+
});
|
|
555
557
|
}
|
|
556
558
|
}
|
|
557
559
|
|
|
@@ -570,13 +572,35 @@ async function checkActualStates () {
|
|
|
570
572
|
*/
|
|
571
573
|
const _autoOn = await adapter.getForeignStateAsync(
|
|
572
574
|
res.autoOnID
|
|
573
|
-
)
|
|
575
|
+
);
|
|
574
576
|
if (_autoOn && typeof _autoOn.val === 'boolean') {
|
|
575
577
|
res.autoOn = _autoOn.val;
|
|
576
578
|
if (_autoOn.val === false) {
|
|
577
579
|
adapter.log.info(`get ${res.objectName}.autoOn = ${res.autoOn}`);
|
|
578
580
|
}
|
|
579
581
|
}
|
|
582
|
+
|
|
583
|
+
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
|
|
584
|
+
// +++++ Zustände der States aktualisieren +++++ //
|
|
585
|
+
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
|
|
586
|
+
|
|
587
|
+
// .countdown beim Start auf '0' setzen
|
|
588
|
+
adapter.setStateAsync(`sprinkle.${res.objectName}.countdown`,{
|
|
589
|
+
val:'0',
|
|
590
|
+
ack:true
|
|
591
|
+
});
|
|
592
|
+
|
|
593
|
+
// .runningTime beim Start auf '00:00' setzen
|
|
594
|
+
adapter.setStateAsync(`sprinkle.${res.objectName}.runningTime`,{
|
|
595
|
+
val:'00:00',
|
|
596
|
+
ack:true
|
|
597
|
+
});
|
|
598
|
+
|
|
599
|
+
// .countdown beim Start auf '0' für (off) setzen
|
|
600
|
+
adapter.setStateAsync(`sprinkle.${res.objectName}.sprinklerState`,{
|
|
601
|
+
val:0,
|
|
602
|
+
ack:true
|
|
603
|
+
});
|
|
580
604
|
}
|
|
581
605
|
}
|
|
582
606
|
|
|
@@ -629,14 +653,26 @@ const calcPos = schedule.scheduleJob('calcPosTimer', '5 0 * * *', function() {
|
|
|
629
653
|
const objectName = result[i].objectName;
|
|
630
654
|
adapter.getState(`sprinkle.${objectName}.history.curCalWeekConsumed`, (err, state) => {
|
|
631
655
|
if (state) {
|
|
632
|
-
adapter.setState(`sprinkle.${objectName}.history.lastCalWeekConsumed`, {
|
|
633
|
-
|
|
656
|
+
adapter.setState(`sprinkle.${objectName}.history.lastCalWeekConsumed`, {
|
|
657
|
+
val: state.val,
|
|
658
|
+
ack: true
|
|
659
|
+
});
|
|
660
|
+
adapter.setState(`sprinkle.${objectName}.history.curCalWeekConsumed`, {
|
|
661
|
+
val: 0,
|
|
662
|
+
ack: true
|
|
663
|
+
});
|
|
634
664
|
}
|
|
635
665
|
});
|
|
636
666
|
adapter.getState(`sprinkle.${objectName}.history.curCalWeekRunningTime`, (err, state) => {
|
|
637
667
|
if (state) {
|
|
638
|
-
adapter.setState(`sprinkle.${objectName}.history.lastCalWeekRunningTime`, {
|
|
639
|
-
|
|
668
|
+
adapter.setState(`sprinkle.${objectName}.history.lastCalWeekRunningTime`, {
|
|
669
|
+
val: state.val,
|
|
670
|
+
ack: true
|
|
671
|
+
});
|
|
672
|
+
adapter.setState(`sprinkle.${objectName}.history.curCalWeekRunningTime`, {
|
|
673
|
+
val: '00:00',
|
|
674
|
+
ack: true
|
|
675
|
+
});
|
|
640
676
|
}
|
|
641
677
|
});
|
|
642
678
|
}
|
|
@@ -718,11 +754,11 @@ function addStartTimeSprinkle() {
|
|
|
718
754
|
case 'bistable': {
|
|
719
755
|
if (res.soilMoisture.bool) {
|
|
720
756
|
messageText += `<b>${res.objectName}</b> (${res.soilMoisture.bool})\n`
|
|
721
|
-
+ ` START => ${addTime(res.addWateringTime, '')}\n`;
|
|
757
|
+
+ ` START => ${addTime(Math.round(60 * res.addWateringTime), '')}\n`;
|
|
722
758
|
memAddList.push({
|
|
723
759
|
auto: true,
|
|
724
760
|
sprinkleID: res.sprinkleID,
|
|
725
|
-
wateringTime: res.addWateringTime
|
|
761
|
+
wateringTime: Math.round(60 * res.addWateringTime)
|
|
726
762
|
});
|
|
727
763
|
}
|
|
728
764
|
break;
|
|
@@ -1747,41 +1783,6 @@ async function createSprinklers() {
|
|
|
1747
1783
|
adapter.log.info(`sprinkleControl [sprinkle.${objectName}] was created`);
|
|
1748
1784
|
}
|
|
1749
1785
|
|
|
1750
|
-
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
|
|
1751
|
-
// +++++ zustände der States aktualisieren +++++ //
|
|
1752
|
-
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
|
|
1753
|
-
|
|
1754
|
-
//
|
|
1755
|
-
if(await _countdownNotExist){
|
|
1756
|
-
const _countdown = await adapter.getStateAsync(`${objPfad}.countdown`).catch((e) => adapter.log.warn(`${objectName}.countdown ${e}`));
|
|
1757
|
-
if (_countdown && _countdown.val !== '0') {
|
|
1758
|
-
adapter.setStateAsync(
|
|
1759
|
-
`${objPfad}.countdown`,
|
|
1760
|
-
'0',
|
|
1761
|
-
true
|
|
1762
|
-
).catch((e) => adapter.log.warn(e));
|
|
1763
|
-
}
|
|
1764
|
-
}
|
|
1765
|
-
//
|
|
1766
|
-
if (_runningTimeNotExist) {
|
|
1767
|
-
const _runningTime = await adapter.getStateAsync(`${objPfad}.runningTime`).catch((e) => adapter.log.warn(`${objectName}.runningTime ${e}`));
|
|
1768
|
-
if (_runningTime && _runningTime.val !== '00:00') {
|
|
1769
|
-
adapter.setStateAsync(`${objPfad}.runningTime`,
|
|
1770
|
-
'00:00',
|
|
1771
|
-
true
|
|
1772
|
-
).catch((e) => adapter.log.warn(e));
|
|
1773
|
-
}
|
|
1774
|
-
}
|
|
1775
|
-
//
|
|
1776
|
-
if (_sprinklerStateNotExists){
|
|
1777
|
-
const _sprinklerState = await adapter.getStateAsync(`${objPfad}.sprinklerState`).catch((e) => adapter.log.warn(`${objectName}.sprinklerState ${e}`));
|
|
1778
|
-
if (_sprinklerState && _sprinklerState.val !== 0) {
|
|
1779
|
-
await adapter.setStateAsync(`${objPfad}.sprinklerState`,
|
|
1780
|
-
0,
|
|
1781
|
-
true
|
|
1782
|
-
).catch((e) => adapter.log.warn(`${objectName}.sprinklerState ${e}`));
|
|
1783
|
-
}
|
|
1784
|
-
}
|
|
1785
1786
|
// Festlegen des Schaltpunktes für den nächsten Start
|
|
1786
1787
|
switch (myConfig.config[j].methodControlSM) {
|
|
1787
1788
|
case 'bistable': {
|
|
@@ -1794,10 +1795,10 @@ async function createSprinklers() {
|
|
|
1794
1795
|
adapter.log.warn(`The bistable sensor ${myConfig.config[j].triggerSM} in ${objectName} does not deliver correct values!`);
|
|
1795
1796
|
}
|
|
1796
1797
|
|
|
1797
|
-
adapter.setStateAsync(`${objPfad}.triggerPoint`,
|
|
1798
|
-
'-',
|
|
1799
|
-
true
|
|
1800
|
-
).catch((e) => adapter.log.warn(`${objectName}.triggerPoint ${e}`));
|
|
1798
|
+
adapter.setStateAsync(`${objPfad}.triggerPoint`, {
|
|
1799
|
+
val: '-',
|
|
1800
|
+
ack: true
|
|
1801
|
+
}).catch((e) => adapter.log.warn(`${objectName}.triggerPoint ${e}`));
|
|
1801
1802
|
break;
|
|
1802
1803
|
}
|
|
1803
1804
|
|
|
@@ -1807,16 +1808,16 @@ async function createSprinklers() {
|
|
|
1807
1808
|
if (_triggerSMAnalog && (typeof _triggerSMAnalog.val === 'number' || typeof _triggerSMAnalog.val === 'string')) {
|
|
1808
1809
|
myConfig.setSoilMoistPct(myConfig.config[j].sprinkleID, _triggerSMAnalog.val);
|
|
1809
1810
|
} else {
|
|
1810
|
-
await adapter.setStateAsync(`${objPfad}.actualSoilMoisture`,
|
|
1811
|
-
50,
|
|
1812
|
-
true
|
|
1813
|
-
);
|
|
1811
|
+
await adapter.setStateAsync(`${objPfad}.actualSoilMoisture`, {
|
|
1812
|
+
val: 50,
|
|
1813
|
+
ack: true
|
|
1814
|
+
});
|
|
1814
1815
|
adapter.log.warn(`The analoge sensor ${myConfig.config[j].triggerSM} in ${objectName} does not deliver correct values!`);
|
|
1815
1816
|
}
|
|
1816
|
-
adapter.setStateAsync(`${objPfad}.triggerPoint`,
|
|
1817
|
-
(myConfig.config[j].soilMoisture.pctTriggerIrrigation).toString(),
|
|
1818
|
-
true
|
|
1819
|
-
).catch((e) => adapter.log.warn(`${objectName}.triggerPoint setState ${e}`));
|
|
1817
|
+
adapter.setStateAsync(`${objPfad}.triggerPoint`, {
|
|
1818
|
+
val: (myConfig.config[j].soilMoisture.pctTriggerIrrigation).toString(),
|
|
1819
|
+
ack: true
|
|
1820
|
+
}).catch((e) => adapter.log.warn(`${objectName}.triggerPoint setState ${e}`));
|
|
1820
1821
|
break;
|
|
1821
1822
|
}
|
|
1822
1823
|
|
|
@@ -1861,10 +1862,10 @@ async function createSprinklers() {
|
|
|
1861
1862
|
curNextFixDay(myConfig.config[j].sprinkleID, false);
|
|
1862
1863
|
}
|
|
1863
1864
|
|
|
1864
|
-
adapter.setStateAsync(`${objPfad}.triggerPoint`,
|
|
1865
|
-
'-',
|
|
1866
|
-
true
|
|
1867
|
-
).catch((e) => adapter.log.warn(`${objectName}.triggerPoint fixDay setState ${e}`));
|
|
1865
|
+
adapter.setStateAsync(`${objPfad}.triggerPoint`, {
|
|
1866
|
+
val: '-',
|
|
1867
|
+
ack: true
|
|
1868
|
+
}).catch((e) => adapter.log.warn(`${objectName}.triggerPoint fixDay setState ${e}`));
|
|
1868
1869
|
break;
|
|
1869
1870
|
}
|
|
1870
1871
|
|
|
@@ -1872,10 +1873,10 @@ async function createSprinklers() {
|
|
|
1872
1873
|
const _actualSoilMoisture = await adapter.getStateAsync(`${objPfad}.actualSoilMoisture`).catch((e) => adapter.log.warn(e));
|
|
1873
1874
|
if (_actualSoilMoisture) {
|
|
1874
1875
|
if (await _actualSoilMoisture && typeof _actualSoilMoisture.val !== 'number' || _actualSoilMoisture.val === 0) {
|
|
1875
|
-
adapter.setStateAsync(`${objPfad}.actualSoilMoisture`,
|
|
1876
|
-
myConfig.config[j].soilMoisture.pct,
|
|
1877
|
-
true
|
|
1878
|
-
).catch((e) => adapter.log.warn(e));
|
|
1876
|
+
adapter.setStateAsync(`${objPfad}.actualSoilMoisture`, {
|
|
1877
|
+
val: myConfig.config[j].soilMoisture.pct,
|
|
1878
|
+
ack: true
|
|
1879
|
+
}).catch((e) => adapter.log.warn(e));
|
|
1879
1880
|
} else {
|
|
1880
1881
|
// num Wert der Bodenfeuchte berechnen und in der config speichern, wenn Wert zwischen 0 und max liegt
|
|
1881
1882
|
if ((0 < _actualSoilMoisture.val) && (_actualSoilMoisture.val <= (myConfig.config[j]).soilMoisture.maxRain*100/myConfig.config[j].soilMoisture.maxIrrigation)) {
|
|
@@ -1883,18 +1884,18 @@ async function createSprinklers() {
|
|
|
1883
1884
|
myConfig.config[j].soilMoisture.pct = _actualSoilMoisture.val;
|
|
1884
1885
|
} else {
|
|
1885
1886
|
// Wert aus config übernehmen
|
|
1886
|
-
adapter.setStateAsync(`${objPfad}.actualSoilMoisture`,
|
|
1887
|
-
myConfig.config[j].soilMoisture.pct,
|
|
1888
|
-
true
|
|
1889
|
-
).catch((e) => adapter.log.warn(e));
|
|
1887
|
+
adapter.setStateAsync(`${objPfad}.actualSoilMoisture`, {
|
|
1888
|
+
val: myConfig.config[j].soilMoisture.pct,
|
|
1889
|
+
ack: true
|
|
1890
|
+
}).catch((e) => adapter.log.warn(e));
|
|
1890
1891
|
}
|
|
1891
1892
|
}
|
|
1892
1893
|
}
|
|
1893
1894
|
|
|
1894
|
-
adapter.setStateAsync(`${objPfad}.triggerPoint`,
|
|
1895
|
-
(myConfig.config[j].soilMoisture.pctTriggerIrrigation).toString(),
|
|
1896
|
-
true
|
|
1897
|
-
).catch((e) => adapter.log.warn(e));
|
|
1895
|
+
adapter.setStateAsync(`${objPfad}.triggerPoint`, {
|
|
1896
|
+
val: (myConfig.config[j].soilMoisture.pctTriggerIrrigation).toString(),
|
|
1897
|
+
ack: true
|
|
1898
|
+
}).catch((e) => adapter.log.warn(e));
|
|
1898
1899
|
break;
|
|
1899
1900
|
}
|
|
1900
1901
|
}
|
|
@@ -2025,7 +2026,10 @@ function main(adapter) {
|
|
|
2025
2026
|
if (adapter.config.actualValueLevel !== '') {
|
|
2026
2027
|
adapter.subscribeForeignStates(adapter.config.actualValueLevel);
|
|
2027
2028
|
} else {
|
|
2028
|
-
adapter.setState('info.cisternState', {
|
|
2029
|
+
adapter.setState('info.cisternState', {
|
|
2030
|
+
val: 'The level sensor of the water cistern is not specified',
|
|
2031
|
+
ack: true
|
|
2032
|
+
});
|
|
2029
2033
|
}
|
|
2030
2034
|
}
|
|
2031
2035
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.sprinklecontrol",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.16",
|
|
4
4
|
"description": "Control of several sprinklers depending on weather conditions and pump performance.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Dirk Peter",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"url": "https://github.com/Dirk-Peter-md/ioBroker.sprinklecontrol"
|
|
27
27
|
},
|
|
28
28
|
"engines": {
|
|
29
|
-
"node": ">=
|
|
29
|
+
"node": ">= 20"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@iobroker/adapter-core": "^3.2.3",
|
|
@@ -39,12 +39,12 @@
|
|
|
39
39
|
"@alcalzone/release-script-plugin-license": "^3.7.0",
|
|
40
40
|
"@alcalzone/release-script-plugin-manual-review": "^3.7.0",
|
|
41
41
|
"@iobroker/adapter-dev": "^1.4.0",
|
|
42
|
-
"@iobroker/eslint-config": "^2.0.
|
|
43
|
-
"@iobroker/testing": "^5.0.
|
|
42
|
+
"@iobroker/eslint-config": "^2.0.2",
|
|
43
|
+
"@iobroker/testing": "^5.0.4",
|
|
44
44
|
"chai": "^5.2.0",
|
|
45
45
|
"chai-as-promised": "^8.0.1",
|
|
46
|
-
"mocha": "^11.
|
|
47
|
-
"sinon": "^
|
|
46
|
+
"mocha": "^11.5.0",
|
|
47
|
+
"sinon": "^20.0.0",
|
|
48
48
|
"sinon-chai": "^4.0.0"
|
|
49
49
|
},
|
|
50
50
|
"main": "main.js",
|