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/io-package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "sprinklecontrol",
4
- "version": "0.2.14",
4
+ "version": "0.2.16",
5
5
  "titleLang": {
6
6
  "en": "Sprinkler Control",
7
7
  "de": "Sprinklersteuerung",
@@ -19,6 +19,32 @@
19
19
  "Dirk Peter <dirk.peter@freenet.de>"
20
20
  ],
21
21
  "news": {
22
+ "0.2.16": {
23
+ "en": "issue #95 Pump lead time added",
24
+ "de": "ausgabe #95 Pumpe Lieferzeit hinzugefügt",
25
+ "ru": "#95 Время работы насоса добавлено",
26
+ "pt": "número de edição #95 Tempo de lançamento da bomba adicionado",
27
+ "nl": "nummer #95 Pump doorlooptijd toegevoegd",
28
+ "fr": "numéro 95 Temps d'avance de la pompe ajouté",
29
+ "it": "numero #95 Pump lead time aggiunto",
30
+ "es": "#95 Tiempo de inicio de bomba añadido",
31
+ "pl": "wydanie # 95 Dodany czas ołowiu pompy",
32
+ "uk": "problem #95 Насос додано час",
33
+ "zh-cn": "增加了泵前准备时间"
34
+ },
35
+ "0.2.15": {
36
+ "en": "Readme updated\nFixed an error when switching off with autoOnOff\nioBroker-Bot [W028]",
37
+ "de": "Reader aktualisiert\nFehler beim Ausschalten mit autoOnOff behoben\nioBroker-Bot [W028]",
38
+ "ru": "Readme обновлено\nИсправлена ошибка при выключении с помощью autoOnOff\nioBroker-Bot [W028]",
39
+ "pt": "Readme atualizado\nCorrigido um erro ao desligar com autoOnOff\nioBroker-Bot [W028]",
40
+ "nl": "Readme bijgewerkt\nEen fout hersteld bij het uitschakelen met autoOnOff\nioBroker-Bot [W028]",
41
+ "fr": "Lire mise à jour\nCorrection d'une erreur lors de l'arrêt automatique\nioBoker-Bot [W028]",
42
+ "it": "Readme aggiornato\nRisolto un errore durante l'accensione con autoOnOff\nioBroker-Bot [W028]",
43
+ "es": "Readme updated\nSe corrigió un error al apagarse con autoOnOff\nioBroker-Bot [W028]",
44
+ "pl": "Readme zaktualizowany\nNaprawiono błąd podczas wyłączania autoOnOff\njoBroker- Bot [W028]",
45
+ "uk": "Читати далі\nВиправлено помилку при вимкненні з автоматичноOnOff\nioBroker-Bot [W028]",
46
+ "zh-cn": "更新我\n用 autoOnOff 关闭时修补错误\nioBroker-Bot [W028] (英语)"
47
+ },
22
48
  "0.2.14": {
23
49
  "en": "eslint-config added\nDependencies updated\nUpdate License\nissue #92 Sprinkler im Gewächshaus solved\nadd Button control.autoStart",
24
50
  "de": "eslint-config hinzugefügt\nAusgaben aktualisiert\nLizenz aktualisieren\nausgabe #92 Sprinkler im Gewächshaus gelöst\nbutton Control.autoStart",
@@ -83,32 +109,6 @@
83
109
  "pl": "- nawadnianie ręczne ograniczone do maksymalnie 100%; - Naprawiono błąd wiadomości WhatsApp",
84
110
  "uk": "- ручний полив обмежений максимум на 100%; - Виправлено повідомлення про помилку WhatsApp",
85
111
  "zh-cn": "- 手动浇水限制为最大 100%; - 错误whatsapp消息已修复"
86
- },
87
- "0.2.9": {
88
- "en": "Bug initialization routine",
89
- "de": "Bug-Initialisierungsroutine",
90
- "ru": "Процедура инициализации ошибки",
91
- "pt": "Rotina de inicialização de bugs",
92
- "nl": "Bug initialisatie routine",
93
- "fr": "Routine d'initialisation de bogue",
94
- "it": "Routine di inizializzazione dei bug",
95
- "es": "Rutina de inicialización de errores",
96
- "pl": "Procedura inicjowania błędów",
97
- "uk": "Процедура ініціалізації помилок",
98
- "zh-cn": "错误初始化例程"
99
- },
100
- "0.2.8": {
101
- "en": "Adaptation for js controller 4; switched main.js to async",
102
- "de": "Anpassung für js-Controller 4; main.js auf async umgestellt",
103
- "ru": "Адаптация для js контроллера 4; переключил main.js на асинхронный",
104
- "pt": "Adaptação para controlador js 4; mudou main.js para assíncrono",
105
- "nl": "Aanpassing voor js-controller 4; main.js overgeschakeld naar async",
106
- "fr": "Adaptation pour le contrôleur js 4 ; a basculé main.js en asynchrone",
107
- "it": "Adattamento per js controller 4; cambiato main.js in asincrono",
108
- "es": "Adaptación para controlador js 4; cambió main.js a asíncrono",
109
- "pl": "Adaptacja pod kontroler js 4; przełączył main.js na asynchroniczny",
110
- "uk": "Адаптація під js контролер 4; переключив main.js на асинхронний",
111
- "zh-cn": "适配js控制器4;将 main.js 切换为异步"
112
112
  }
113
113
  },
114
114
  "desc": {
@@ -172,9 +172,11 @@
172
172
  "switchingDistance": "300",
173
173
  "triggerMainPump": "hm-rpc.0.MEQ1234567.1.STATE",
174
174
  "triggerMainPumpPower": "2000",
175
+ "mainPumpLeadTime": "15",
175
176
  "cisternSettings": false,
176
177
  "triggerCisternPump": "",
177
178
  "triggerCisternPumpPower": "1800",
179
+ "cisternPumpLeadTime": "10",
178
180
  "actualValueLevel": "",
179
181
  "triggerMinCisternLevel": "25",
180
182
  "wateringStartTime": "livingGoldenHourEnd",
@@ -194,7 +194,10 @@ function calcEvaporation (timeDifference) {
194
194
  */
195
195
  const eTp = (( m6 * m5 + 0.65 * m7 * ( m1 - m2 )) / ( m6 + 0.65 )) - 0.5;
196
196
 
197
- adapter.setState('evaporation.ETpCurrent', { val: Math.round(eTp * 10000) / 10000, ack: true });
197
+ adapter.setState('evaporation.ETpCurrent', {
198
+ val: Math.round(eTp * 10000) / 10000,
199
+ ack: true
200
+ });
198
201
 
199
202
  addEvaporation(eTp * timeDifference);
200
203
  }
@@ -203,7 +206,10 @@ function addEvaporation (value) {
203
206
  if (value < 2) { // um Fehler in der Auswertung beim Neustart zu löschen
204
207
  ETpTodayNum += value;
205
208
  }
206
- adapter.setState('evaporation.ETpToday', { val: Math.round(ETpTodayNum * 10000) / 10000, ack: true });
209
+ adapter.setState('evaporation.ETpToday', {
210
+ val: Math.round(ETpTodayNum * 10000) / 10000,
211
+ ack: true
212
+ });
207
213
 
208
214
  myConfig.applyEvaporation (value);
209
215
  }
@@ -419,9 +425,15 @@ const evaporation = {
419
425
  setNewDay () {
420
426
  extraTerStr();
421
427
  setTimeout(() => {
422
- adapter.setState('evaporation.ETpYesterday', { val: Math.round(ETpTodayNum * 10000) / 10000, ack: true });
428
+ adapter.setState('evaporation.ETpYesterday', {
429
+ val: Math.round(ETpTodayNum * 10000) / 10000,
430
+ ack: true
431
+ });
423
432
  ETpTodayNum = 0;
424
- adapter.setState('evaporation.ETpToday', { val: 0, ack: true });
433
+ adapter.setState('evaporation.ETpToday', {
434
+ val: 0,
435
+ ack: true
436
+ });
425
437
  }, 100);
426
438
  },
427
439
  /**
package/lib/myConfig.js CHANGED
@@ -164,9 +164,9 @@ const myConfig = {
164
164
  booster: res.booster,
165
165
  endIrrigation: res.endIrrigation,
166
166
  autoOn: true,
167
- autoOnID: `${adapter.namespace }.sprinkle.${ objectName }.autoOn`, // sprinklecontrol.0.sprinkle.Rasenumrandung.autoOnID
167
+ autoOnID: `${adapter.namespace}.sprinkle.${objectName}.autoOn`, // sprinklecontrol.0.sprinkle.Rasenumrandung.autoOnID
168
168
  objectName: objectName, // z.B. Rasenumrandung
169
- objectID: `${adapter.namespace }.sprinkle.${ objectName }.runningTime`, // sprinklecontrol.0.sprinkle.Rasenumrandung.runningTime
169
+ objectID: `${adapter.namespace}.sprinkle.${objectName}.runningTime`, // sprinklecontrol.0.sprinkle.Rasenumrandung.runningTime
170
170
  idState: res.name, // "hm-rpc.0.MEQ1234567.3.STATE"
171
171
  updateStateTimerID: null, // Timer wird gelöscht wenn Rückmeldung erfolgte
172
172
  sprinkleID: myConfig.config.length, // Array[0...]
@@ -251,7 +251,7 @@ const myConfig = {
251
251
  setSoilMoistPct100: (mySprinkleID) => {
252
252
  myConfig.config[mySprinkleID].soilMoisture.val = myConfig.config[mySprinkleID].soilMoisture.maxIrrigation;
253
253
  myConfig.config[mySprinkleID].soilMoisture.pct = 100;
254
- adapter.setState(`sprinkle.${ myConfig.config[mySprinkleID].objectName }.actualSoilMoisture`, {
254
+ adapter.setState(`sprinkle.${myConfig.config[mySprinkleID].objectName}.actualSoilMoisture`, {
255
255
  val: myConfig.config[mySprinkleID].soilMoisture.pct,
256
256
  ack: true
257
257
  });
@@ -266,7 +266,7 @@ const myConfig = {
266
266
  if (myConfig.config[mySprinkleID].methodControlSM === 'bistable') {
267
267
  if (typeof newVal === 'boolean') {
268
268
  myConfig.config[mySprinkleID].soilMoisture.bool = newVal;
269
- adapter.setState(`sprinkle.${ [myConfig.config[mySprinkleID].objectName] }.actualSoilMoisture`, {
269
+ adapter.setState(`sprinkle.${[myConfig.config[mySprinkleID].objectName]}.actualSoilMoisture`, {
270
270
  val: myConfig.config[mySprinkleID].soilMoisture.bool,
271
271
  ack: true
272
272
  });
@@ -313,7 +313,7 @@ const myConfig = {
313
313
  }
314
314
 
315
315
  myConfig.config[mySprinkleID].soilMoisture.pct = Math.round(10 * trend(myConfig.config[mySprinkleID].analogZPct, myConfig.config[mySprinkleID].analogOHPct, 0, 100, myVal)) / 10;
316
- adapter.setState(`sprinkle.${ [myConfig.config[mySprinkleID].objectName] }.actualSoilMoisture`, {
316
+ adapter.setState(`sprinkle.${[myConfig.config[mySprinkleID].objectName]}.actualSoilMoisture`, {
317
317
  val: myConfig.config[mySprinkleID].soilMoisture.pct,
318
318
  ack: true
319
319
  });
@@ -340,7 +340,7 @@ const myConfig = {
340
340
 
341
341
  myConfig.config[mySprinkleID].soilMoisture.pct = Math.round(1000 * myConfig.config[mySprinkleID].soilMoisture.val
342
342
  / myConfig.config[mySprinkleID].soilMoisture.maxIrrigation) / 10; // Berechnung in %
343
- adapter.setState(`sprinkle.${ myConfig.config[mySprinkleID].objectName }.actualSoilMoisture`, {
343
+ adapter.setState(`sprinkle.${myConfig.config[mySprinkleID].objectName}.actualSoilMoisture`, {
344
344
  val: myConfig.config[mySprinkleID].soilMoisture.pct,
345
345
  ack: true
346
346
  });
@@ -361,11 +361,10 @@ const myConfig = {
361
361
  myConfig.config[mySprinkleID].startFixDay[curDay] = false;
362
362
  nextDay = (+ curDay + 1 > 6) ? (+ curDay-6) : (+ curDay+1);
363
363
  myConfig.config[mySprinkleID].startFixDay[nextDay] = true;
364
- adapter.setStateAsync(
365
- `${id}`,
366
- nextDay,
367
- true
368
- ).catch((e) => adapter.log.warn(`postponeByOneDay setStateAsync: ${e}`));
364
+ adapter.setStateAsync(`${id}`, {
365
+ val: nextDay,
366
+ ack: true
367
+ }).catch((e) => adapter.log.warn(`postponeByOneDay setStateAsync: ${e}`));
369
368
  }
370
369
  }
371
370
  }
@@ -176,12 +176,15 @@ function boostKill (sprinkleID) {
176
176
 
177
177
  /**
178
178
  * Schaltintervall der Ventile, Schaltabstand ist in der Config hinterlegt
179
+ *
180
+ * @param delay wenn keine Zeit eingegeben ist, wird der Schaltabstand der Config verwendet
179
181
  */
180
- const valveDelay = () => {
182
+ const valveDelay = (delay = parseInt(adapter.config.switchingDistance)) => {
181
183
  return new Promise (
182
- resolve => setTimeout (resolve, parseInt(adapter.config.switchingDistance))
184
+ resolve => setTimeout (resolve, delay)
183
185
  );
184
186
  };
187
+
185
188
  /**
186
189
  * Ausschalten der Ventile mit Schaltabstand
187
190
  *
@@ -219,7 +222,7 @@ const switchTheValvesOffOn = async (threadList, parallel) => {
219
222
  }
220
223
  }
221
224
  if (currentPumpUse.pumpName !== '') {
222
- setPumpOnOff(parallel > 0);
225
+ await setPumpOnOff(parallel > 0);
223
226
  await valveDelay ();
224
227
  }
225
228
  if (adapter.config.triggerControlVoltage) {
@@ -306,8 +309,8 @@ function updateList () {
306
309
  }
307
310
  entry.count ++;
308
311
  if ((entry.count < entry.wateringTime) // Zeit noch nicht abgelaufen?
309
- && (!entry.calcOn // Vergleich nur bei Berechnung der Verdunstung
310
- || !entry.autoOn // Vergleich nur bei Automatik
312
+ && (!entry.calcOn // alles ausser Berechnung der Verdunstung
313
+ || !entry.autoOn // Handbetrieb
311
314
  || (myConfig.config[entry.sprinkleID].soilMoisture.val < myConfig.config[entry.sprinkleID].soilMoisture.maxIrrigation)) // Bodenfeuchte noch nicht erreicht? (z.B. beim Regen)
312
315
  ) { /* Zeit läuft */
313
316
  adapter.setState(`sprinkle.${entry.sprinkleName}.countdown`, {
@@ -322,7 +325,7 @@ function updateList () {
322
325
  }
323
326
  /* Intervall-Beregnung wenn angegeben (onOffTime > 0) */
324
327
  if ((entry.onOffTime > 0) && !(entry.count % entry.onOffTime)) {
325
- adapter.log.info(`Intervall-Beregnung, onOffTime: ${entry.onOffTime}, count: ${entry.count}, count % onOffTime: ${entry.count % entry.onOffTime}`);
328
+ adapter.log.info(`Intervall-Beregnung, onOffTime: ${entry.onOffTime}, count: ${entry.count}`);
326
329
  entry.enabled = false;
327
330
  entry.myBreak = true;
328
331
  /* Zustand des Ventils im Thread < 0 > off, < 1 > wait, < 2 > on, <<< 3 >>> break, < 4 > Boost(on), < 5 > off(Boost) */
@@ -496,6 +499,7 @@ function setActualPump () {
496
499
  currentPumpUse.pumpCistern = false;
497
500
  currentPumpUse.pumpName = adapter.config.triggerMainPump || '';
498
501
  currentPumpUse.pumpPower = parseInt(adapter.config.triggerMainPumpPower);
502
+ currentPumpUse.leadTime = parseInt(adapter.config.mainPumpLeadTime)*1000 || 1000;
499
503
  adapter.setForeignState(currentPumpUse.pumpName, {
500
504
  val: true,
501
505
  ack: false
@@ -531,6 +535,7 @@ function setActualPump () {
531
535
  currentPumpUse.pumpCistern = true;
532
536
  currentPumpUse.pumpName = adapter.config.triggerCisternPump || '';
533
537
  currentPumpUse.pumpPower = parseInt(adapter.config.triggerCisternPumpPower);
538
+ currentPumpUse.leadTime = parseInt(adapter.config.cisternPumpLeadTime)*1000 || 1000;
534
539
  adapter.setState('control.restFlow', {
535
540
  val: `${currentPumpUse.pumpPower} (${currentPumpUse.pumpPower} Zisterne)`,
536
541
  ack: true
@@ -544,6 +549,7 @@ function setActualPump () {
544
549
  currentPumpUse.pumpCistern = false;
545
550
  currentPumpUse.pumpName = adapter.config.triggerMainPump || '';
546
551
  currentPumpUse.pumpPower = parseInt(adapter.config.triggerMainPumpPower);
552
+ currentPumpUse.leadTime = parseInt(adapter.config.mainPumpLeadTime)*1000 || 1000;
547
553
  adapter.setState('control.restFlow', {
548
554
  val: `${currentPumpUse.pumpPower} (${currentPumpUse.pumpPower} Grundwasser)`,
549
555
  ack: true
@@ -568,21 +574,23 @@ function setActualPump () {
568
574
  *
569
575
  * @param pumpOnOff ; Pumpe on = true
570
576
  */
571
- function setPumpOnOff(pumpOnOff) {
577
+ const setPumpOnOff = async (pumpOnOff) => {
572
578
  if (currentPumpUse.pumpName !== '') {
573
- adapter.getForeignState(currentPumpUse.pumpName, (err, state) => {
574
- if (state) {
579
+ try {
580
+ const curPumpState = await adapter.getForeignStateAsync(currentPumpUse.pumpName);
581
+ if (curPumpState) {
575
582
  if (pumpOnOff) {
576
- if (state.val === false) {
583
+ if (curPumpState.val === false) {
577
584
  adapter.setForeignState(currentPumpUse.pumpName, {
578
585
  val: true,
579
586
  ack: false
580
587
  });
581
588
  currentPumpUse.enable = true;
582
589
  adapter.log.info('Set (pump) on');
590
+ await valveDelay(currentPumpUse.leadTime);
583
591
  }
584
592
  } else {
585
- if (state.val !== false) {
593
+ if (curPumpState.val !== false) {
586
594
  adapter.setForeignState(currentPumpUse.pumpName, {
587
595
  val: false,
588
596
  ack: false
@@ -591,10 +599,10 @@ function setPumpOnOff(pumpOnOff) {
591
599
  adapter.log.info('Set (pump) off');
592
600
  }
593
601
  }
594
- } else if (err) {
595
- adapter.log.error(`triggerMainPump ${currentPumpUse.pumpName} is not available (ist nicht erreichbar): ${err}`);
596
602
  }
597
- });
603
+ } catch (error) {
604
+ adapter.log.error(`triggerMainPump ${currentPumpUse.pumpName} is not available (ist nicht erreichbar): ${error}`);
605
+ }
598
606
  }
599
607
  } // End setPumpOnOff
600
608
 
@@ -690,6 +698,7 @@ const valveControl = {
690
698
  currentPumpUse.pumpCistern = false;
691
699
  currentPumpUse.pumpName = adapter.config.triggerMainPump || '';
692
700
  currentPumpUse.pumpPower = parseInt(adapter.config.triggerMainPumpPower) || 0;
701
+ currentPumpUse.leadTime = parseInt(adapter.config.mainPumpLeadTime)*1000 || 1000;
693
702
  maxParallel = parseInt(adapter.config.maximumParallelValves);
694
703
  /* Objekt control.restFlow befüllen */
695
704
  adapter.setState('control.restFlow', {
@@ -701,11 +710,22 @@ const valveControl = {
701
710
  val: `0 : ${adapter.config.maximumParallelValves}`,
702
711
  ack: true
703
712
  });
713
+ /* 24V ausschalter, wenn vorhanden */
714
+ if (adapter.config.triggerControlVoltage !== '') {
715
+ adapter.getForeignState('adapter.config.triggerControlVoltage', (err, state) => {
716
+ if (state && state.val === true) {
717
+ adapter.setForeignState(adapter.config.triggerControlVoltage, {
718
+ val: false,
719
+ ack: false
720
+ });
721
+ }
722
+ });
723
+ }
704
724
  /* Pumpe ausschalter, wenn vorhanden */
705
725
  if (adapter.config.triggerMainPump !== '') {
706
- adapter.getState('adapter.config.triggerMainPump', (err, state) => {
707
- if (state) {
708
- adapter.setState(adapter.config.triggerMainPump, {
726
+ adapter.getForeignState('adapter.config.triggerMainPump', (err, state) => {
727
+ if (state && state.val === true) {
728
+ adapter.setForeignState(adapter.config.triggerMainPump, {
709
729
  val: false,
710
730
  ack: false
711
731
  });
@@ -714,9 +734,9 @@ const valveControl = {
714
734
  }
715
735
  /* Pumpe (Zisterne) ausschalter, wenn vorhanden */
716
736
  if (adapter.config.triggerCisternPump !== '') {
717
- adapter.getState('adapter.config.triggerCisternPump', (err, state) => {
718
- if (state) {
719
- adapter.setState(adapter.config.triggerCisternPump, {
737
+ adapter.getForeignState('adapter.config.triggerCisternPump', (err, state) => {
738
+ if (state && state.val === true) {
739
+ adapter.setForeignState(adapter.config.triggerCisternPump, {
720
740
  val: false,
721
741
  ack: false
722
742
  });
@@ -727,9 +747,9 @@ const valveControl = {
727
747
  const result = adapter.config.events;
728
748
  if (result) {
729
749
  for (const res of result) {
730
- adapter.getState(res.name, (err, state) => {
731
- if (state) {
732
- adapter.setState(res.name, {
750
+ adapter.getForeignState(res.name, (err, state) => {
751
+ if (state && state.val === true) {
752
+ adapter.setForeignState(res.name, {
733
753
  val: false,
734
754
  ack: false
735
755
  });
@@ -772,6 +792,15 @@ const valveControl = {
772
792
  });
773
793
  addDone = true; // Sprinkle found
774
794
  adapter.log.debug(`update ID: ${entry.sprinkleName} new time: ${addTime(res.wateringTime)}`);
795
+ // Wenn aktueller Spränger im BoostOn ausgeschaltet werden soll (ersten 30s)
796
+ if (boostOn
797
+ && myConfig.config[res.sprinkleID].booster
798
+ && entry.wateringTime <= 0
799
+ ) {
800
+ boostKill(res.sprinkleID);
801
+ boostReady = true;
802
+ adapter.log.debug(`ID: ${res.sprinkleName} BoostKill Sprinkle Off: boostReady = ${boostReady}`);
803
+ }
775
804
  break;
776
805
  }
777
806
  }
@@ -820,8 +849,8 @@ const valveControl = {
820
849
  soilMoisture15s: 15 * (myConfig.config[res.sprinkleID].soilMoisture.maxIrrigation - myConfig.config[res.sprinkleID].soilMoisture.triggersIrrigation)
821
850
  / (60 * myConfig.config[res.sprinkleID].wateringTime),
822
851
  times: {
823
- boostTime1: null, // boost start
824
- boostTime2: null, // boost ende
852
+ boostTime1: null, // boost start in die Zwangspause schicken in 0,25s
853
+ boostTime2: null, // boost ende aus der Zwangspause holen nach 31s
825
854
  }, // hinterlegen der verschiedenen Zeiten von timeout für gezieltes späteres löschen
826
855
  id: threadList.length || 0,
827
856
  };
@@ -849,6 +878,8 @@ const valveControl = {
849
878
  setVoltageOnOff(false);
850
879
  setPumpOnOff(false);
851
880
  if (boostListTimer) {
881
+ boostReady = true;
882
+ boostOn = false;
852
883
  clearTimeout(boostListTimer);
853
884
  }
854
885
  // let bValveFound = false; // Ventil gefunden
@@ -860,7 +891,7 @@ const valveControl = {
860
891
  adapter.log.info(`Set Valve (SprinkleControl: off) ID: ${entry.sprinkleName}, value: false`);
861
892
  adapter.setForeignState(entry.idState, {
862
893
  val: false,
863
- ack: true
894
+ ack: false
864
895
  });
865
896
  }
866
897
  /* Zustand des Ventils im Thread <<< 0 >>> off, < 1 > wait, < 2 > on, < 3 > break, < 4 > Boost(on), < 5 > off(Boost) */