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,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' });