iobroker.alias-workbench 0.10.0 → 0.12.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/README.md +58 -98
- package/admin/css/werkbank.css +88 -0
- package/admin/i18n/de.json +766 -1
- package/admin/i18n/en.json +766 -1
- package/admin/i18n/es.json +766 -1
- package/admin/i18n/fr.json +766 -1
- package/admin/i18n/it.json +766 -1
- package/admin/i18n/nl.json +766 -1
- package/admin/i18n/pl.json +766 -1
- package/admin/i18n/pt.json +766 -1
- package/admin/i18n/ru.json +766 -1
- package/admin/i18n/uk.json +766 -1
- package/admin/i18n/zh-cn.json +766 -1
- package/admin/js/ablage.js +118 -0
- package/admin/js/attrappe.js +749 -0
- package/admin/js/baum.js +52 -5
- package/admin/js/detail.js +64 -3
- package/admin/js/entwurf.js +246 -31
- package/admin/js/ergebnis.js +77 -2
- package/admin/js/katalog.js +235 -40
- package/admin/js/mqtt.js +297 -27
- package/admin/js/musternamen.js +70 -26
- package/admin/js/objekte.js +2 -0
- package/admin/js/quellentausch.js +823 -16
- package/admin/js/schreiben.js +3 -2
- package/admin/js/sprache.js +11 -8
- package/admin/js/vorlagen.js +8 -3
- package/admin/js/vorlagenblatt.js +228 -64
- package/admin/js/werte.js +294 -5
- package/admin/js/zielleiste.js +19 -10
- package/admin/js/zuordnung.js +8 -7
- package/admin/js/zustand.js +32 -0
- package/admin/js/zustandsliste.js +9 -2
- package/admin/tab.html +24 -0
- package/admin/vorlagen/hm-dimmer.json +32 -8
- package/admin/vorlagen/hm-fensterkontakt-hm.json +20 -5
- package/admin/vorlagen/hm-fensterkontakt-hmip.json +28 -7
- package/admin/vorlagen/hm-heizgruppe.json +38 -11
- package/admin/vorlagen/hm-heizkoerper.json +42 -12
- package/admin/vorlagen/hm-rollladen.json +28 -7
- package/admin/vorlagen/hm-schaltaktor-lampe.json +24 -6
- package/admin/vorlagen/hm-schaltaktor-mehrfach.json +32 -8
- package/admin/vorlagen/hm-schaltaktor-steckdose.json +24 -6
- package/admin/vorlagen/hm-temperatur-feuchte.json +8 -2
- package/admin/vorlagen/hm-wandthermostat.json +36 -9
- package/admin/vorlagen/messpunkt.json +40 -10
- package/admin/vorlagen/tasmota-lampe.json +48 -12
- package/admin/vorlagen/tasmota-mehrfach.json +40 -10
- package/admin/vorlagen/tasmota-rgb.json +36 -9
- package/admin/vorlagen/tasmota-steckdose.json +56 -14
- package/io-package.json +41 -28
- package/package.json +3 -3
- package/admin/sprachen/de.json +0 -685
- package/admin/sprachen/en.json +0 -685
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/* Was wir uns aus dem Admin holen, einmal ablegen statt jedes Mal suchen.
|
|
2
|
+
|
|
3
|
+
Zwei Stellen zapfen den Admin an: der Aufzaehlungskatalog
|
|
4
|
+
(katalog.js, 58 Raeume und 62 Funktionen mit Namen und Bildern) und
|
|
5
|
+
die Musternamen (musternamen.js, „socket" -> „Steckdose"). Beide
|
|
6
|
+
suchen in denselben Buendeln, und seit Admin 8.0.x steht beides sogar
|
|
7
|
+
in derselben Datei — einem Sammelmodul von 7,9 MB.
|
|
8
|
+
|
|
9
|
+
Gemessen am 07.10.2026: ohne Ablage wurden davon bei **jedem** Oeffnen
|
|
10
|
+
des Reiters 1 727 KB uebertragen und 854 ms gewartet, fuer zusammen
|
|
11
|
+
rund 550 KB Nutzlast. Darum liegt das Ergebnis danach hier.
|
|
12
|
+
|
|
13
|
+
Wann wird neu geholt? Wenn der Admin seine Buendel neu schreibt. Als
|
|
14
|
+
Stempel dienen die Dateinamen aus `index.html` — sie tragen einen
|
|
15
|
+
Hash und wechseln bei jeder Aenderung. Die Versionsnummer taugt dafuer
|
|
16
|
+
nicht: ein Zwischenbau traegt dieselbe.
|
|
17
|
+
|
|
18
|
+
Warum der Dateibereich und nicht etwas anderes: die Adapter-
|
|
19
|
+
konfiguration wird bei jedem Start und bei jedem Oeffnen der
|
|
20
|
+
Einstellungen gelesen und ist heute 26 KB gross; ein Datenpunkt liegt
|
|
21
|
+
auf dem Produktivsystem in Redis, also im Arbeitsspeicher; der
|
|
22
|
+
Browserspeicher haengt am einzelnen Geraet. */
|
|
23
|
+
|
|
24
|
+
import { socket } from './verbindung.js';
|
|
25
|
+
|
|
26
|
+
var ORT = 'alias-workbench.0';
|
|
27
|
+
var DATEI = 'katalog.json';
|
|
28
|
+
var ABLAGE_NAME = { en: 'Alias Workbench — Storage', de: 'Alias-Werkbank — Ablage' };
|
|
29
|
+
|
|
30
|
+
function nameIstAlt(name) {
|
|
31
|
+
return name === 'Alias-Werkbank — Ablage' || name === 'Alias-Werkbank - Ablage';
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Den Dateibereich gibt es nur zu einem Objekt vom Typ `meta`. Adapter
|
|
35
|
+
mit Dienstteil bekommen es vom js-controller; die Werkbank ist
|
|
36
|
+
`onlyWWW`, also gibt es keines — `writeFile` antwortet dann mit
|
|
37
|
+
„alias-workbench.0 is not an object of type meta".
|
|
38
|
+
|
|
39
|
+
`alias-workbench.admin` waere der falsche Platz: dorthin schreibt
|
|
40
|
+
`iobroker upload` die Oberflaechendateien und raeumt dabei alles
|
|
41
|
+
andere weg. Fuer neue Installationen steht das Objekt zusaetzlich in
|
|
42
|
+
io-package.json. */
|
|
43
|
+
function bereit() {
|
|
44
|
+
return new Promise(function (fertig) {
|
|
45
|
+
try {
|
|
46
|
+
socket.emit('getObject', ORT, function (err, o) {
|
|
47
|
+
if (o && o.type === 'meta' && !nameIstAlt(o.common && o.common.name)) { return fertig(true); }
|
|
48
|
+
var neu = (o && o.type === 'meta') ? o : { type: 'meta', native: {} };
|
|
49
|
+
neu.common = neu.common || {};
|
|
50
|
+
neu.common.name = ABLAGE_NAME;
|
|
51
|
+
neu.common.type = 'meta.user';
|
|
52
|
+
socket.emit('setObject', ORT, neu, function (fehler) { fertig(!fehler); });
|
|
53
|
+
});
|
|
54
|
+
} catch { fertig(false); }
|
|
55
|
+
setTimeout(function () { fertig(false); }, 8000);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* Woran man erkennt, dass der Admin seine Buendel neu geschrieben hat. */
|
|
60
|
+
export function stempelAus(html) {
|
|
61
|
+
return (html.match(/assets\/[A-Za-z0-9_\-.]+\.js/g) || []).slice().sort().join(' ');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* Einmal gelesen reicht fuer die ganze Sitzung: beide Leser fragen beim
|
|
65
|
+
Laden kurz hintereinander, und ein zweiter Abruf ueber die Leitung
|
|
66
|
+
braucht es dafuer nicht. */
|
|
67
|
+
var gelesen = null;
|
|
68
|
+
|
|
69
|
+
export function leseAblage() {
|
|
70
|
+
if (gelesen) { return gelesen; }
|
|
71
|
+
gelesen = new Promise(function (fertig) {
|
|
72
|
+
try {
|
|
73
|
+
socket.emit('readFile', ORT, DATEI, function (err, daten) {
|
|
74
|
+
if (err || typeof daten !== 'string') { return fertig(null); }
|
|
75
|
+
try { fertig(JSON.parse(daten)); } catch { fertig(null); }
|
|
76
|
+
});
|
|
77
|
+
} catch { fertig(null); }
|
|
78
|
+
setTimeout(function () { fertig(null); }, 12000);
|
|
79
|
+
});
|
|
80
|
+
return gelesen;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* Den eigenen Teil dazulegen, ohne den des anderen zu verlieren.
|
|
84
|
+
|
|
85
|
+
Katalog und Musternamen schreiben unabhaengig voneinander. Wer stur
|
|
86
|
+
seine eigene Fassung hinlegt, loescht dem anderen den Abschnitt —
|
|
87
|
+
also vorher lesen, zusammenfuehren, dann schreiben. Stimmt der
|
|
88
|
+
Stempel nicht mehr, faengt die Datei von vorn an: was zum alten
|
|
89
|
+
Buendel gehoerte, gilt nicht mehr. */
|
|
90
|
+
export function ergaenzeAblage(stempel, teil) {
|
|
91
|
+
return leseAblage().then(function (alt) {
|
|
92
|
+
var neu = (alt && alt.stempel === stempel) ? alt : { stempel: stempel };
|
|
93
|
+
Object.keys(teil).forEach(function (k) { neu[k] = teil[k]; });
|
|
94
|
+
gelesen = Promise.resolve(neu);
|
|
95
|
+
return bereit().then(function (da) {
|
|
96
|
+
if (!da) { return null; }
|
|
97
|
+
var text = JSON.stringify(neu);
|
|
98
|
+
return new Promise(function (fertig) {
|
|
99
|
+
var erledigt = false;
|
|
100
|
+
var einmal = function () { if (!erledigt) { erledigt = true; fertig(); } };
|
|
101
|
+
try {
|
|
102
|
+
/* `writeFile64` ist der heutige Weg, `writeFile` der alte.
|
|
103
|
+
Welcher antwortet, entscheidet die Admin-Fassung. */
|
|
104
|
+
var b64 = btoa(unescape(encodeURIComponent(text)));
|
|
105
|
+
socket.emit('writeFile64', ORT, DATEI, b64, function (err) {
|
|
106
|
+
if (!err) { return einmal(); }
|
|
107
|
+
try {
|
|
108
|
+
socket.emit('writeFile', ORT, DATEI, text, function () { einmal(); });
|
|
109
|
+
} catch { einmal(); }
|
|
110
|
+
});
|
|
111
|
+
} catch { einmal(); }
|
|
112
|
+
/* Antwortet gar nichts, ist das kein Grund zu warten — die Daten
|
|
113
|
+
stehen ja schon, nur die Abkuerzung fuers naechste Mal fehlt. */
|
|
114
|
+
setTimeout(einmal, 8000);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
})['catch'](function () { return null; });
|
|
118
|
+
}
|