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.
- package/LICENSE +21 -0
- package/README.md +516 -0
- package/admin/alias-workbench.png +0 -0
- package/admin/css/werkbank.css +916 -0
- package/admin/detector.js +1 -0
- package/admin/geraetewissen/tasmota-befehle.json +116 -0
- package/admin/i18n/de.json +552 -0
- package/admin/i18n/en.json +552 -0
- package/admin/js/aufzaehlungen.js +332 -0
- package/admin/js/basis.js +36 -0
- package/admin/js/baum.js +453 -0
- package/admin/js/detail.js +335 -0
- package/admin/js/einstellungen.js +40 -0
- package/admin/js/entwurf.js +908 -0
- package/admin/js/enums.js +23 -0
- package/admin/js/ergebnis.js +934 -0
- package/admin/js/erkennung.js +126 -0
- package/admin/js/katalog.js +313 -0
- package/admin/js/mqtt.js +885 -0
- package/admin/js/musternamen.js +94 -0
- package/admin/js/musterwahl.js +334 -0
- package/admin/js/objekte.js +243 -0
- package/admin/js/pruefungen.js +130 -0
- package/admin/js/quellentausch.js +570 -0
- package/admin/js/rollenwahl.js +199 -0
- package/admin/js/schreiben.js +1537 -0
- package/admin/js/sprache.js +137 -0
- package/admin/js/start.js +39 -0
- package/admin/js/verbindung.js +10 -0
- package/admin/js/vorlagen.js +572 -0
- package/admin/js/vorlagenblatt.js +1907 -0
- package/admin/js/vorschlagen.js +391 -0
- package/admin/js/werte.js +193 -0
- package/admin/js/zielleiste.js +339 -0
- package/admin/js/zuordnung.js +695 -0
- package/admin/js/zustand.js +47 -0
- package/admin/js/zustandsliste.js +515 -0
- package/admin/jsonConfig.json +249 -0
- package/admin/tab.html +148 -0
- package/admin/vorlagen/hm-dimmer.json +204 -0
- package/admin/vorlagen/hm-fensterkontakt-hm.json +176 -0
- package/admin/vorlagen/hm-fensterkontakt-hmip.json +191 -0
- package/admin/vorlagen/hm-heizgruppe.json +214 -0
- package/admin/vorlagen/hm-heizkoerper.json +236 -0
- package/admin/vorlagen/hm-rollladen.json +190 -0
- package/admin/vorlagen/hm-schaltaktor-lampe.json +197 -0
- package/admin/vorlagen/hm-schaltaktor-mehrfach.json +203 -0
- package/admin/vorlagen/hm-schaltaktor-steckdose.json +197 -0
- package/admin/vorlagen/hm-temperatur-feuchte.json +166 -0
- package/admin/vorlagen/hm-wandthermostat.json +228 -0
- package/admin/vorlagen/index.json +21 -0
- package/admin/vorlagen/messpunkt.json +225 -0
- package/admin/vorlagen/tasmota-lampe.json +263 -0
- package/admin/vorlagen/tasmota-mehrfach.json +203 -0
- package/admin/vorlagen/tasmota-rgb.json +239 -0
- package/admin/vorlagen/tasmota-steckdose.json +265 -0
- package/io-package.json +122 -0
- 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
|
+
}
|