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,137 @@
|
|
|
1
|
+
/* Woerterbuch und Sprachwahl.
|
|
2
|
+
|
|
3
|
+
`sprache` und `expertenVorgabe` sind lebende Bindungen: wer sie
|
|
4
|
+
importiert, sieht den jeweils aktuellen Wert. Geschrieben werden sie
|
|
5
|
+
nur hier - `ladeSprache` fragt system.config einmal ab und beantwortet
|
|
6
|
+
damit beides, Sprache und Expertenmodus. */
|
|
7
|
+
|
|
8
|
+
import { socket } from './verbindung.js';
|
|
9
|
+
import { $ } from './basis.js';
|
|
10
|
+
|
|
11
|
+
export var expertenVorgabe = false;
|
|
12
|
+
|
|
13
|
+
/* ================== Sprachen ==================
|
|
14
|
+
Woerterbuch als flache Schluessel-Text-Karte unter admin/i18n/.
|
|
15
|
+
Neue Sprache = neue Datei, sonst nichts. Faellt eine Uebersetzung
|
|
16
|
+
aus, greift Englisch, danach der Schluessel selbst — so bleibt die
|
|
17
|
+
Oberflaeche bedienbar statt leer. */
|
|
18
|
+
export var SPRACHEN = ['de', 'en'];
|
|
19
|
+
var woerter = {};
|
|
20
|
+
var woerterEn = {};
|
|
21
|
+
export var sprache = 'en';
|
|
22
|
+
|
|
23
|
+
export function tr(schluessel) {
|
|
24
|
+
var text = woerter[schluessel];
|
|
25
|
+
if (text === undefined) { text = woerterEn[schluessel]; }
|
|
26
|
+
if (text === undefined) { text = schluessel; }
|
|
27
|
+
if (arguments.length > 1) {
|
|
28
|
+
for (var i = 1; i < arguments.length; i++) {
|
|
29
|
+
text = text.split('{' + (i - 1) + '}').join(String(arguments[i]));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return text;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function ladeSprache(fertig) {
|
|
36
|
+
/* Die Systemsprache steht in system.config; bis die Antwort da ist,
|
|
37
|
+
nehmen wir die des Browsers. */
|
|
38
|
+
var vorgabe = (navigator.language || 'en').slice(0, 2).toLowerCase();
|
|
39
|
+
|
|
40
|
+
function hole(code, ziel, danach) {
|
|
41
|
+
fetch('./i18n/' + code + '.json')
|
|
42
|
+
.then(function (r) { return r.ok ? r.json() : {}; })
|
|
43
|
+
.then(function (d) { Object.keys(d).forEach(function (k) { ziel[k] = d[k]; }); danach(); })
|
|
44
|
+
.catch(function () { danach(); });
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
var weiter = function (code) {
|
|
48
|
+
sprache = (SPRACHEN.indexOf(code) > -1) ? code : 'en';
|
|
49
|
+
hole('en', woerterEn, function () {
|
|
50
|
+
if (sprache === 'en') { woerter = woerterEn; return fertig(); }
|
|
51
|
+
hole(sprache, woerter, fertig);
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
var beantwortet = false;
|
|
56
|
+
socket.emit('getObject', 'system.config', function (err, obj) {
|
|
57
|
+
if (beantwortet) { return; }
|
|
58
|
+
beantwortet = true;
|
|
59
|
+
/* Der Expertenmodus steht an derselben Stelle — einmal fragen reicht
|
|
60
|
+
fuer beides. */
|
|
61
|
+
expertenVorgabe = !!(!err && obj && obj.common && obj.common.expertMode);
|
|
62
|
+
var l = (!err && obj && obj.common && obj.common.language) || vorgabe;
|
|
63
|
+
weiter(l);
|
|
64
|
+
});
|
|
65
|
+
setTimeout(function () {
|
|
66
|
+
if (!beantwortet) { beantwortet = true; weiter(vorgabe); }
|
|
67
|
+
}, 2500);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/* Beschriftungen im festen HTML nachziehen. */
|
|
71
|
+
export function beschrifteHtml() {
|
|
72
|
+
document.title = tr('app.title');
|
|
73
|
+
var setz = function (wahl, text) {
|
|
74
|
+
var el2 = document.querySelector(wahl);
|
|
75
|
+
if (el2) { el2.textContent = text; }
|
|
76
|
+
};
|
|
77
|
+
setz('header.top h1', tr('app.title'));
|
|
78
|
+
setz('#m-quellen', tr('tree.sources'));
|
|
79
|
+
setz('#m-aliase', tr('tree.aliases'));
|
|
80
|
+
setz('#m-vorlagen', tr('tree.templates'));
|
|
81
|
+
setz('.pickpane .panehead .lbl', tr('app.objectsCount', '').trim());
|
|
82
|
+
setz('.respane .panehead .lbl', tr('result.header'));
|
|
83
|
+
var q = $('#q');
|
|
84
|
+
if (q) {
|
|
85
|
+
q.placeholder = tr('tree.filter');
|
|
86
|
+
/* Auch die Vorlesehilfe: sie stand fest verdrahtet in tab.html und
|
|
87
|
+
blieb als einziger Text neben „Einlesen …" deutsch, wenn der
|
|
88
|
+
Admin auf Englisch steht (26.08.2026). */
|
|
89
|
+
q.setAttribute('aria-label', tr('tree.filterAria'));
|
|
90
|
+
}
|
|
91
|
+
setz('#btn-einlesen', tr('tv.importFile'));
|
|
92
|
+
setz('#btn-dry', tr('write.createAlias'));
|
|
93
|
+
setz('#btn-dry-alle', tr('write.createAll', ''));
|
|
94
|
+
var bc = $('#btn-checks');
|
|
95
|
+
if (bc) { bc.childNodes[0].nodeValue = tr('check.button') + ' '; }
|
|
96
|
+
setz('#dry-titel', tr('write.dryTitleCreate'));
|
|
97
|
+
setz('#btn-tpl', tr('tpls.button'));
|
|
98
|
+
var bA = $('#btn-auf'), bZ = $('#btn-zu');
|
|
99
|
+
if (bA) { bA.title = tr('tree.expandAll'); bA.setAttribute('aria-label', tr('tree.expandAll')); }
|
|
100
|
+
if (bZ) { bZ.title = tr('tree.collapseAll'); bZ.setAttribute('aria-label', tr('tree.collapseAll')); }
|
|
101
|
+
setz('#btn-move', tr('move.button'));
|
|
102
|
+
setz('#btn-swap', tr('swap.button'));
|
|
103
|
+
setz('#swap-titel', tr('swap.title'));
|
|
104
|
+
setz('#btn-swap-go', tr('swap.now'));
|
|
105
|
+
setz('#move-titel', tr('move.title'));
|
|
106
|
+
setz('#btn-move-go', tr('move.now'));
|
|
107
|
+
setz('#btn-del', tr('del.button'));
|
|
108
|
+
setz('#del-titel', tr('del.title'));
|
|
109
|
+
setz('#btn-del-go', tr('del.now'));
|
|
110
|
+
setz('#tpl-titel', tr('tpls.title', ''));
|
|
111
|
+
setz('#btn-tpl-save', tr('tpls.saveNew'));
|
|
112
|
+
setz('#mqtt-titel', tr('mq.dialogTitle'));
|
|
113
|
+
setz('#guess-titel', tr('guess.tplTitle'));
|
|
114
|
+
setz('#btn-guess-go', tr('guess.tplGo'));
|
|
115
|
+
setz('#tree .empty', tr('tree.loading'));
|
|
116
|
+
/* Startmodus ist das Anlegen - bis das erste Zeichnen laeuft. */
|
|
117
|
+
setz('#res .empty', tr('help.sources'));
|
|
118
|
+
setz('#btn-dry-write', tr('write.now'));
|
|
119
|
+
setz('#dlg-checks h3', tr('check.title'));
|
|
120
|
+
document.querySelectorAll('dialog [data-close]').forEach(function (b) {
|
|
121
|
+
b.textContent = tr('write.close');
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/* Vorlagennamen duerfen je Sprache anders lauten: entweder eine
|
|
126
|
+
Zeichenkette oder ein Objekt wie { de: '...', en: '...' }. */
|
|
127
|
+
export function sprachtext(v) {
|
|
128
|
+
if (v === undefined || v === null) { return ''; }
|
|
129
|
+
if (typeof v === 'object') { return v[sprache] || v.en || v.de || Object.values(v)[0] || ''; }
|
|
130
|
+
return String(v);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export function txt(v) {
|
|
134
|
+
if (v === undefined || v === null) { return ''; }
|
|
135
|
+
if (typeof v === 'object') { return v.de || v.en || ''; }
|
|
136
|
+
return String(v);
|
|
137
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/* Der Anlauf: sobald die Verbindung steht, laedt alles in fester
|
|
2
|
+
Reihenfolge - Sprache, Geraetewissen, Vorlagen, Objekte. */
|
|
3
|
+
|
|
4
|
+
import { zeichneErgebnis } from './ergebnis.js';
|
|
5
|
+
import { socket } from './verbindung.js';
|
|
6
|
+
import { $ } from './basis.js';
|
|
7
|
+
import { tr, ladeSprache, beschrifteHtml } from './sprache.js';
|
|
8
|
+
import { ladeObjekte } from './objekte.js';
|
|
9
|
+
import { ladeBefehlswissen } from './mqtt.js';
|
|
10
|
+
import { ladeVorlagen, setzeMeta } from './vorlagen.js';
|
|
11
|
+
import { ladeMusterNamen } from './musternamen.js';
|
|
12
|
+
import { S } from './zustand.js';
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
/* ================== Verbindung ================== */
|
|
16
|
+
socket.on('connect', function () {
|
|
17
|
+
var c = $('#conn');
|
|
18
|
+
c.className = 'conn on';
|
|
19
|
+
/* Erst nach dem Laden beschriften — vorher gaebe tr() nur den
|
|
20
|
+
Schluessel zurueck, das Woerterbuch ist noch leer. */
|
|
21
|
+
ladeSprache(function () {
|
|
22
|
+
c.textContent = tr('app.connected');
|
|
23
|
+
beschrifteHtml();
|
|
24
|
+
/* Nebenlaeufig - wer schneller ist als der Katalog, sieht kurz die
|
|
25
|
+
rohen Namen, das naechste Zeichnen traegt die Beinamen nach. */
|
|
26
|
+
ladeMusterNamen(function () { if (S.current) { zeichneErgebnis(); } });
|
|
27
|
+
ladeBefehlswissen(function () {
|
|
28
|
+
ladeVorlagen(function () {
|
|
29
|
+
setzeMeta();
|
|
30
|
+
ladeObjekte();
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
socket.on('disconnect', function () {
|
|
36
|
+
var c = $('#conn');
|
|
37
|
+
c.className = 'conn off';
|
|
38
|
+
c.textContent = tr('app.disconnected');
|
|
39
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/* Die Socket-Verbindung zum Admin.
|
|
2
|
+
|
|
3
|
+
`io` kommt als klassisches Skript aus socket.io.js und liegt als
|
|
4
|
+
globale Variable vor - Module sehen sie ueber den globalen
|
|
5
|
+
Gueltigkeitsbereich. */
|
|
6
|
+
|
|
7
|
+
var parts = location.pathname.split('/');
|
|
8
|
+
parts.splice(-3);
|
|
9
|
+
if (location.pathname.match(/^\/admin\//)) { parts = []; }
|
|
10
|
+
export var socket = io.connect('/', { path: parts.join('/') + '/socket.io' });
|