iobroker.alias-workbench 0.8.0

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.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +516 -0
  3. package/admin/alias-workbench.png +0 -0
  4. package/admin/css/werkbank.css +916 -0
  5. package/admin/detector.js +1 -0
  6. package/admin/geraetewissen/tasmota-befehle.json +116 -0
  7. package/admin/i18n/de.json +552 -0
  8. package/admin/i18n/en.json +552 -0
  9. package/admin/js/aufzaehlungen.js +332 -0
  10. package/admin/js/basis.js +36 -0
  11. package/admin/js/baum.js +453 -0
  12. package/admin/js/detail.js +335 -0
  13. package/admin/js/einstellungen.js +40 -0
  14. package/admin/js/entwurf.js +908 -0
  15. package/admin/js/enums.js +23 -0
  16. package/admin/js/ergebnis.js +934 -0
  17. package/admin/js/erkennung.js +126 -0
  18. package/admin/js/katalog.js +313 -0
  19. package/admin/js/mqtt.js +885 -0
  20. package/admin/js/musternamen.js +94 -0
  21. package/admin/js/musterwahl.js +334 -0
  22. package/admin/js/objekte.js +243 -0
  23. package/admin/js/pruefungen.js +130 -0
  24. package/admin/js/quellentausch.js +570 -0
  25. package/admin/js/rollenwahl.js +199 -0
  26. package/admin/js/schreiben.js +1537 -0
  27. package/admin/js/sprache.js +137 -0
  28. package/admin/js/start.js +39 -0
  29. package/admin/js/verbindung.js +10 -0
  30. package/admin/js/vorlagen.js +572 -0
  31. package/admin/js/vorlagenblatt.js +1907 -0
  32. package/admin/js/vorschlagen.js +391 -0
  33. package/admin/js/werte.js +193 -0
  34. package/admin/js/zielleiste.js +339 -0
  35. package/admin/js/zuordnung.js +695 -0
  36. package/admin/js/zustand.js +47 -0
  37. package/admin/js/zustandsliste.js +515 -0
  38. package/admin/jsonConfig.json +249 -0
  39. package/admin/tab.html +148 -0
  40. package/admin/vorlagen/hm-dimmer.json +204 -0
  41. package/admin/vorlagen/hm-fensterkontakt-hm.json +176 -0
  42. package/admin/vorlagen/hm-fensterkontakt-hmip.json +191 -0
  43. package/admin/vorlagen/hm-heizgruppe.json +214 -0
  44. package/admin/vorlagen/hm-heizkoerper.json +236 -0
  45. package/admin/vorlagen/hm-rollladen.json +190 -0
  46. package/admin/vorlagen/hm-schaltaktor-lampe.json +197 -0
  47. package/admin/vorlagen/hm-schaltaktor-mehrfach.json +203 -0
  48. package/admin/vorlagen/hm-schaltaktor-steckdose.json +197 -0
  49. package/admin/vorlagen/hm-temperatur-feuchte.json +166 -0
  50. package/admin/vorlagen/hm-wandthermostat.json +228 -0
  51. package/admin/vorlagen/index.json +21 -0
  52. package/admin/vorlagen/messpunkt.json +225 -0
  53. package/admin/vorlagen/tasmota-lampe.json +263 -0
  54. package/admin/vorlagen/tasmota-mehrfach.json +203 -0
  55. package/admin/vorlagen/tasmota-rgb.json +239 -0
  56. package/admin/vorlagen/tasmota-steckdose.json +265 -0
  57. package/io-package.json +122 -0
  58. package/package.json +48 -0
@@ -0,0 +1,130 @@
1
+ /* Die sieben Pruefungen - laufen immer mit, fassen nichts an. */
2
+
3
+ import { S } from './zustand.js';
4
+ import { $, el } from './basis.js';
5
+ import { tr } from './sprache.js';
6
+ import { wertVon } from './werte.js';
7
+ import './erkennung.js';
8
+ import { sofortRueckmeldung, mqttEinstellung } from './mqtt.js';
9
+
10
+
11
+ /* Kommt die Rueckmeldung sofort oder erst mit der naechsten Telemetrie?
12
+
13
+ Ein Punkt, der nach cmnd schreibt und aus tele liest, zeigt nach dem
14
+ Schalten minutenlang den alten Wert. Tasmota antwortet zwar sofort
15
+ auf stat/RESULT, aber dort steht nur der eine geaenderte Schluessel —
16
+ als Lesequelle waere das unbrauchbar, weil der Punkt nach jedem
17
+ anderen Befehl leer liefe. Wer stat/POWER liest, ist fein raus: das
18
+ kommt bei jeder Schaltung.
19
+
20
+ Am Geraet gemessen: cmnd/Scheme geschrieben, stat/RESULT war sofort
21
+ da, tele/STATE kam erst nach der naechsten Telemetrie — bei
22
+ TelePeriod 300 also bis zu fuenf Minuten spaeter. */
23
+ export function pruefungRueckmeldung(e) {
24
+ var lahm = e.states.filter(function (x) {
25
+ if (!x.on || !x.srcW || !x.srcR) { return false; }
26
+ return /\.tele\./.test(x.srcR) && /\.cmnd\./.test(x.srcW);
27
+ });
28
+ if (!lahm.length) { return { s: 'ok', t: tr('check.feedback'), d: tr('check.feedbackFine') }; }
29
+ /* Nur warnen, wenn es wirklich langsam ist. Mit SetOption59 meldet
30
+ das Geraet jede Aenderung sofort — dann ist die Bauform zwar
31
+ dieselbe, aber kein Problem. Gemessen: drei Sekunden. */
32
+ var sofort = sofortRueckmeldung(e.kanal);
33
+ var namen = lahm.map(function (x) { return x.n; }).join(', ');
34
+ if (sofort === true) { return { s: 'ok', t: tr('check.feedback'), d: tr('check.feedbackFast') }; }
35
+ if (sofort === null) { return { s: 'mut', t: tr('check.feedback'), d: tr('check.feedbackUnknown', namen) }; }
36
+ return { s: 'warn', t: tr('check.feedback'), d: tr('check.feedbackSlow', namen) };
37
+ }
38
+
39
+ /* Zeigen zwei Punkte auf genau dasselbe?
40
+
41
+ Das passiert beim Wechsel der Vorlage: die alte nannte den Schalter
42
+ ON, die neue nennt ihn SET — hinterher stehen beide im Alias, auf
43
+ derselben Quelle, mit derselben Formel. Das Geraet hat dann zwei
44
+ Schalter, die sich gegenseitig nachziehen.
45
+
46
+ SET und ACTUAL zaehlen nicht als Dopplung: sie lesen zwar denselben
47
+ Punkt, aber nur einer schreibt. Und zwei Messwerte aus demselben
48
+ JSON sind verschieden, solange ihre Formeln es sind. */
49
+ export function pruefungDopplung(e) {
50
+ var nach = {};
51
+ e.states.forEach(function (s) {
52
+ if (!s.on || !s.n || !s.srcR) { return; }
53
+ var k = s.srcR + '|' + (s.f || '') + ' → ' + (s.srcW || '') + '|' + (s.fw || '');
54
+ (nach[k] = nach[k] || []).push(s.n);
55
+ });
56
+ var doppelt = [];
57
+ Object.keys(nach).forEach(function (k) {
58
+ if (nach[k].length > 1) { doppelt.push(nach[k].join(' = ')); }
59
+ });
60
+ if (!doppelt.length) { return { s: 'ok', t: tr('check.duplicate'), d: tr('check.duplicateNone') }; }
61
+ return { s: 'warn', t: tr('check.duplicate'), d: tr('check.duplicateSome', doppelt.join(', ')) };
62
+ }
63
+
64
+ /* Kann der Schreibweg ueberhaupt senden? Bei MQTT sitzt der Schalter
65
+ am einzelnen Objekt. Steht er auf falsch, sieht der Alias tadellos
66
+ aus und schaltet trotzdem nichts — auf der Produktivanlage betraf das
67
+ einen von 25 Aliasen. Reine Objektlektuere, es wird nichts gesendet. */
68
+ export function pruefungSenden(e) {
69
+ var ziele = e.states.filter(function (x) { return x.on && x.srcW; });
70
+ if (!ziele.length) { return { s: 'mut', t: tr('check.publish'), d: tr('check.noWritePath') }; }
71
+ var mqtt = [], stumm = [], fehlt = [];
72
+ ziele.forEach(function (x) {
73
+ /* Drei Faelle, nicht zwei: den Punkt gibt es gar nicht, es gibt ihn
74
+ und er ist stumm, oder er sendet. Der erste kam dazu, seit die
75
+ Erkennung sich auf Befehle stuetzen darf, die das Geraet kennt. */
76
+ if (!S.objects[x.srcW]) { fehlt.push(x.n); return; }
77
+ var m = mqttEinstellung(x.srcW);
78
+ if (!m) { return; }
79
+ mqtt.push(x);
80
+ if (!m.publish) { stumm.push(x.n); }
81
+ });
82
+ if (fehlt.length) { return { s: 'bad', t: tr('check.publish'), d: tr('check.sendPointMissing', fehlt.join(', ')) }; }
83
+ if (!mqtt.length) { return { s: 'mut', t: tr('check.publish'), d: tr('check.notMqtt') }; }
84
+ if (stumm.length) { return { s: 'bad', t: tr('check.publish'), d: tr('check.cannotSend', stumm.join(', ')) }; }
85
+ return { s: 'ok', t: tr('check.publish'), d: tr('check.canSend', mqtt.length) };
86
+ }
87
+
88
+
89
+ export function baueChecks(e, haupt, pflichtFehlt) {
90
+ var an = e.states.filter(function (s) { return s.on; });
91
+ var ohneQuelle = an.filter(function (s) { return s.srcR && !S.objects[s.srcR]; });
92
+ var ohneWert = an.filter(function (s) { return s.srcR && S.objects[s.srcR] && !S.werte[s.srcR]; });
93
+ var formelKaputt = an.filter(function (s) { var a = wertVon(s); return s.srcR && !a.ok && (a.fehler || a.leer); });
94
+
95
+ var items = [
96
+ { s: ohneQuelle.length ? 'bad' : 'ok', t: tr('check.sourceExists'),
97
+ d: ohneQuelle.length ? ohneQuelle.map(function (x) { return x.n; }).join(', ') : tr('check.checked', an.length) },
98
+ { s: ohneWert.length ? 'bad' : 'ok', t: tr('check.sourceHasValue'),
99
+ d: ohneWert.length ? ohneWert.map(function (x) { return x.n; }).join(', ') : tr('check.allDeliver') },
100
+ { s: formelKaputt.length ? 'bad' : 'ok', t: tr('check.formulaYields'),
101
+ d: formelKaputt.length ? formelKaputt.map(function (x) { return x.n; }).join(', ') : tr('check.allFine') },
102
+ { s: haupt && !pflichtFehlt.length ? 'ok' : 'bad', t: tr('check.rolesMakeDevice'),
103
+ d: haupt ? (pflichtFehlt.length
104
+ ? tr('pattern.missing', pflichtFehlt.map(function (x) { return x.name; }).join(', '))
105
+ : haupt.type) : tr('check.noPatternFits') },
106
+ pruefungSenden(e),
107
+ pruefungRueckmeldung(e),
108
+ pruefungDopplung(e)
109
+ ];
110
+
111
+ var ul = $('#checklist');
112
+ ul.textContent = '';
113
+ var schlecht = 0;
114
+ items.forEach(function (c) {
115
+ if (c.s === 'bad') { schlecht++; }
116
+ var li = el('li');
117
+ li.appendChild(el('span', 'm ' + c.s,
118
+ c.s === 'ok' ? '✓' : (c.s === 'mut' ? '·' : (c.s === 'warn' ? '!' : '✕'))));
119
+ li.appendChild(el('span', null, c.t));
120
+ li.appendChild(el('span', 'det', c.d));
121
+ ul.appendChild(li);
122
+ });
123
+ /* Der Zaehler stand fest auf vier, obwohl es inzwischen sechs
124
+ Pruefungen sind — und die Warnstufe kannte er gar nicht. */
125
+ var warnungen = items.filter(function (c) { return c.s === 'warn'; }).length;
126
+ var chip = $('#checkchip');
127
+ chip.className = 'chip ' + (schlecht ? 'bad' : (warnungen ? 'warn' : 'ok'));
128
+ chip.textContent = schlecht ? tr('check.openCount', schlecht)
129
+ : (warnungen ? tr('check.hintCount', warnungen) : tr('check.allOk', items.length));
130
+ }