iobroker.alias-workbench 0.9.9 → 0.9.10
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 +1 -1
- package/README.md +15 -0
- package/admin/css/werkbank.css +8 -3
- package/admin/js/entwurf.js +47 -17
- package/admin/js/ergebnis.js +49 -4
- package/admin/js/erkennung.js +46 -2
- package/admin/js/musterwahl.js +12 -2
- package/admin/js/quellentausch.js +179 -19
- package/admin/js/schreiben.js +98 -3
- package/admin/js/sprache.js +6 -1
- package/admin/js/vorlagen.js +12 -2
- package/admin/js/vorlagenblatt.js +65 -3
- package/admin/js/werte.js +63 -1
- package/admin/js/zuordnung.js +29 -35
- package/admin/js/zustandsliste.js +37 -4
- package/admin/sprachen/de.json +13 -0
- package/admin/sprachen/en.json +13 -0
- package/admin/vorlagen/messpunkt.json +2 -1
- package/admin/vorlagen/tasmota-lampe.json +2 -1
- package/admin/vorlagen/tasmota-mehrfach.json +2 -1
- package/admin/vorlagen/tasmota-rgb.json +2 -1
- package/admin/vorlagen/tasmota-steckdose.json +2 -1
- package/io-package.json +14 -14
- package/package.json +1 -1
package/admin/sprachen/en.json
CHANGED
|
@@ -130,6 +130,7 @@
|
|
|
130
130
|
"enums.members": "{0} in it",
|
|
131
131
|
"enums.newSuffix": "new",
|
|
132
132
|
"enums.noMatch": "nothing found for \"{0}\"",
|
|
133
|
+
"enums.nowEmpty": "is empty afterwards and will be removed",
|
|
133
134
|
"enums.placeholder": "empty = no assignment",
|
|
134
135
|
"enums.removeFrom": "is taken out",
|
|
135
136
|
"enums.room": "Room",
|
|
@@ -288,6 +289,7 @@
|
|
|
288
289
|
"pattern.manualInstead": "by hand instead of {0}",
|
|
289
290
|
"pattern.missing": "{0} missing",
|
|
290
291
|
"pattern.noMatch": "no pattern matches \"{0}\"",
|
|
292
|
+
"pattern.noPlaceBecauseType": "The {0} pattern does not apply right now: {1} requires {2}, but {3} is set. That is why no row has a slot.",
|
|
291
293
|
"pattern.noPlaceLegend": "Rows shaded like this have no slot in the {0} pattern",
|
|
292
294
|
"pattern.noPlaceLong": "no slot in the {0} pattern — the point is still created and fully usable, only Alexa and friends count it separately",
|
|
293
295
|
"pattern.notDetected": "not detected",
|
|
@@ -326,14 +328,19 @@
|
|
|
326
328
|
"roles.slot": "slot {0} in the {1} pattern",
|
|
327
329
|
"roles.slotFree": "free",
|
|
328
330
|
"roles.slotTaken": "taken by {0}",
|
|
331
|
+
"swap.blocked": "Decide first — these points cannot come along: {0}. Either remove them during the swap or leave the swap be; a point that is meant to write needs a write target.",
|
|
329
332
|
"swap.button": "Swap source …",
|
|
330
333
|
"swap.diffRange": "range {0} → {1}",
|
|
331
334
|
"swap.diffType": "type {0} → {1}",
|
|
332
335
|
"swap.diffUnit": "unit {0} → {1}",
|
|
333
336
|
"swap.done": "Swapped. The alias now reads from {0}.",
|
|
334
337
|
"swap.from": "Currently reads from:",
|
|
338
|
+
"swap.goHigher": "use the level above",
|
|
335
339
|
"swap.gone": "This device no longer exists — which is exactly what this is for.",
|
|
336
340
|
"swap.guessHint": "Rows marked “guessed” were matched by name or role — please check those individually.",
|
|
341
|
+
"swap.guessedByName": "Guessed from the point name: something under the new source is also called \"{0}\". That can be far off — please check.",
|
|
342
|
+
"swap.guessedByRole": "Guessed from the role: a point under the new source carries the same role \"{0}\". Please check.",
|
|
343
|
+
"swap.higherLevel": "One level up ({0}) finds a target for {1} of {2} points, here only {3}.",
|
|
337
344
|
"swap.keeps": "The alias keeps its id, names, roles and formulas, its history in the database and its room and function. Only where each point reads from and writes to changes.",
|
|
338
345
|
"swap.mapping": "Mapping",
|
|
339
346
|
"swap.mind": "Watch out:",
|
|
@@ -432,6 +439,12 @@
|
|
|
432
439
|
"tpls.json": "This is what gets stored",
|
|
433
440
|
"tpls.loadFailed": "own templates not loaded",
|
|
434
441
|
"tpls.loadFailedHint": "The instance configuration did not answer or reported an error. Your own templates are not gone — they are only missing from this view. While this notice stands, saving may overwrite an existing template: reload first.",
|
|
442
|
+
"tpls.lockBadHint": "The name hint is not a usable expression",
|
|
443
|
+
"tpls.lockIdTaken": "The id already belongs to \"{0}\"",
|
|
444
|
+
"tpls.lockNoId": "The id is missing",
|
|
445
|
+
"tpls.lockNoRequired": "No point is ticked as required — the template would match nothing",
|
|
446
|
+
"tpls.lockNoRows": "No row is left",
|
|
447
|
+
"tpls.lockedWhy": "Saving is locked:",
|
|
435
448
|
"tpls.losesTo": "loses to {0}",
|
|
436
449
|
"tpls.multiple": "This device has several outputs",
|
|
437
450
|
"tpls.multipleHelp": "The {0} in the paths is replaced by %N% — only at the end of a segment, so ENERGY.Power stays intact.",
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "alias-workbench",
|
|
4
|
-
"version": "0.9.
|
|
4
|
+
"version": "0.9.10",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.9.10": {
|
|
7
|
+
"en": "* Four things from the full test run. **A channel identifier** was not sanitised in the multi-output path: from the channel name “Licht, Bar” the js-controller quietly made `Licht_ Bar`, while the workbench displayed “Licht, Bar” and wrote it into the enumerations — an identifier that never existed, and after deleting the alias it stayed there as a leftover. `ausgangName` now sanitises itself, and where two channels produce the same name the second gets a `_2`. **The caption** differed between the two views: where the point's name equals the row name, “Edit alias” showed it and “Create alias” an empty field. **The row list** now counts like the tree — `POWER2` before `POWER10`. And **an enumeration the workbench created itself** now also disappears when it becomes empty through a change of function, not only when the alias is deleted\n* Tidying: \"turn an alias object into a draft row\" was written out five times — each with the same write-source rule and slightly different surroundings. Four bugs in this version came from exactly that: the lost write source on the roller shutter, a switching point that became a read-only one, the missing caption on `alias.0.Solar.Netz`, and a deviation the workbench had produced itself. The reading now lives in one place; what the four callers do with it — compare, create, overwrite — stays with them. Behaviour is unchanged\n* Three small things spotted during the run. **RSSI** was pre-ticked in the five Tasmota and measuring-point templates but not in the eleven Homematic ones — the same device property, two answers depending on the vendor; it is now unticked everywhere, like the rest of the diagnostics. **The `MAP_URL` slot** in the vacuum pattern got no role because its expression starts without `^` and the derivation demanded both anchors; a missing start anchor no longer counts against a slot. **And the \"guessed\" tag** in the swap dialog looked like text stuck to the point name — its styling hung on three parent levels that do not exist there. It is now a pill like in the state list and says in its tooltip whether the guess came from the point name or from the role\n* The save button in the template dialog now also checks when pressed, not only when drawn. It is re-evaluated when a field is left — typing an open bracket into the name hint and clicking \"Save template\" without leaving the field left you with a blue button and saved a template with a broken expression. The five lock reasons now live in one place that drawing and saving share\n* Three places now say why they cannot. **The save button in the template dialog** was greyed out and silent — five reasons can lock it and none of them was shown; every applicable one now appears on the button and as a box in the dialog. **The error dialog when deleting** only gave a count (\"1 operations failed\") and not which id is stuck; writing has had that list all along. **And the reason a send point could not be created** hung on a button that the same callback threw away 120 ms later — it now sits at the top of the dry run and survives the rebuild\n* If a point's type does not match its pattern slot, all three places now say so — not just the expanded row. If the slot was **required**, the pattern stops applying altogether, and the whole list showed up tinted: on the Bastelzimmer_Licht, switching SET from `boolean` to `mixed` was enough for eight of eight rows to count as \"no slot\", while the pattern field reported \"✕ SET missing\" — SET was right there. It now reads \"✕ SET: type mixed instead of boolean\", and above the list: \"The light pattern does not apply right now: SET requires boolean, but mixed is set. That is why no row has a slot.\" Only the row that causes it is tinted now — the whole list used to light up, which showed the consequence instead of the cause.\n* A late answer to `system.config` now really does carry the expert mode over. The tab gives up after 2.5 seconds and continues with the browser language; if the answer arrives later, the language stays as it is (switching after the labels are drawn would be worse), the expert mode is adopted and the tree is redrawn once. That had long been built — but above it sat a guard from the time before, which bailed out in exactly this case. Without the mode, every node under `system.*` and `enum.*` was missing, with nothing saying why\n* The swap dialog notices when one level up fits better. The picker lets you choose any node with data points underneath — it has to, because on a flat adapter the channel is the device. With MQTT, though, `stat`, `tele` and `cmnd` are topic folders: landing there finds fewer points, and the lock would ask you to remove some. The workbench now also computes the parent level and says so — \"One level up (…) finds a target for 7 of 7 points, here only 5\" — with a button that switches the selection. Nothing is forbidden\n* The device list in the swap dialog keeps its position. Scrolling down a long list and picking a device used to jump back to the top, with the freshly picked entry out of sight — picking rebuilds the dialog, and the tree is a different element afterwards. If the selected row still ends up outside, it is brought into view. A new search and a freshly opened dialog still start at the top\n* When swapping the source, a write target no longer counts if it coincides with the read source. The search tries the bare point name as its last form, so `cmnd.POWER` found a status point that also ends in `POWER` — the alias would then have written to its own read source. Guessing already caught this, matching by path did not; it showed when the new source was picked as a sub-node instead of the device\n* When swapping the source, a point that cannot come along now stops the swap instead of letting it fail halfway. A point with separate sources — reads from `stat.POWER`, writes to `cmnd.POWER` — needs both at the new source. If the write target is missing, ioBroker has **no** form that means \"reads, writes nowhere\": a plain id means \"write to the status point\", `{read: X}` without `write` is rejected by the js-controller, and `common.write: false` does not protect the source (measured: writing to such an alias overwrote the read source). So the user decides — the checkbox \"remove this point when swapping\" now appears in this case as well, and \"Swap now\" stays disabled until someone has decided; the reason shows on the button and as a line in the dialog. Before, the swap started, failed at the controller and left the alias half on the old and half on the new source\n* If a write fails during the swap, **nothing** is deleted. The deletions used to run anyway, so an alias that was already half migrated lost points on top of it. Moving an alias has followed that rule for a long time\n* \"All data points of the device\" no longer moves the storage location. For a device with several outputs the workbench creates a folder with one channel per output. The button rebuilds the draft and passed on only the **finished target**; `setzeZiel` reads its last segment as the device name — with several outputs that segment is the output, and it ended up in the folder as well. Every press pushed the location one level deeper, and that is where it was written, too: three clicks produced four folders instead of one (`…Garten-Ventilinsel.POWER2.POWER2.POWER2.POWER2`). The button now passes folder and name separately, the way the output selector next to it has always done. A single-output device was never affected",
|
|
8
|
+
"de": "* Vier Sachen aus dem kompletten Durchlauf. **Eine Kanalkennung** wurde im Mehrfach-Pfad nicht gesäubert: aus dem Kanalnamen „Licht, Bar\" machte der js-controller still `Licht_ Bar`, während die Werkbank „Licht, Bar\" anzeigte und in die Aufzählungen eintrug — eine Kennung, die es nie gab, und nach dem Löschen blieb sie dort als Leiche stehen. Jetzt säubert `ausgangName` selbst, und wo zwei Kanäle denselben Namen ergeben, bekommt der zweite ein `_2`. **Die Beschriftung** stand in beiden Ansichten verschieden: wo der Name des Punktes dem Zeilennamen gleicht, zeigte „Alias bearbeiten\" ihn und „Alias anlegen\" ein leeres Feld. **Die Zeilenliste** zählt jetzt wie der Baum — `POWER2` vor `POWER10`. Und **eine Aufzählung, die die Werkbank selbst angelegt hat**, verschwindet auch dann, wenn sie durch einen Wechsel der Funktion leer wird, nicht nur beim Löschen des Alias\n* Aufgeräumt: „Aus einem Alias-Objekt wird eine Entwurfszeile\" war fünfmal ausprogrammiert — jedes Mal mit derselben Schreibquellenregel und leicht anderem Drumherum. Vier Fehler dieser Version stammten genau daher: die verlorene Schreibquelle am Rollladen, ein schaltender Punkt der zum lesenden wurde, die fehlende Beschriftung an `alias.0.Solar.Netz` und eine Abweichung, die die Werkbank selbst erzeugt hatte. Die Ablesung steht jetzt an einer Stelle; was die vier Aufrufer damit tun — vergleichen, anlegen, überschreiben — bleibt bei ihnen. Am Verhalten ändert sich nichts\n* Drei Kleinigkeiten, die beim Durchgang aufgefallen sind. **RSSI** war in den fünf Tasmota- und Messpunkt-Vorlagen vorgehakt, in den elf Homematic-Vorlagen nicht — dasselbe Gerätemerkmal, zwei Antworten je nach Hersteller; jetzt ist es überall abgewählt wie die übrige Diagnose. **Der Platz `MAP_URL`** im Staubsauger-Muster bekam keine Rolle, weil sein Ausdruck ohne `^` beginnt und die Ableitung beide Anker verlangte; der fehlende Anfangsanker zählt nicht mehr gegen den Platz. **Und die Marke „vermutet\"** im Tausch-Dialog sah aus wie Text, der am Punktnamen klebt — die Gestalt hing an drei Elternebenen, die es dort nicht gibt. Sie ist jetzt eine Pille wie in der Zustandsliste und sagt im Tooltip, ob über den Punktnamen oder über die Rolle geraten wurde\n* Der Speichern-Knopf im Vorlagendialog prüft jetzt auch beim Drücken, nicht nur beim Zeichnen. Er wird beim Verlassen eines Feldes neu bewertet — wer eine offene Klammer in den Namenshinweis schrieb und ohne Umweg auf „Vorlage speichern\" klickte, hatte einen blauen Knopf vor sich und speicherte eine Vorlage mit kaputtem Ausdruck. Die fünf Sperrgründe stehen dafür jetzt an einer Stelle, die Zeichnen und Speichern gemeinsam nutzen\n* Drei Stellen sagen jetzt, warum sie nicht können. **Der Speichern-Knopf im Vorlagendialog** war grau und schwieg — fünf Gründe können ihn sperren, und keiner stand dabei; jetzt stehen alle zutreffenden am Knopf und als Kasten im Dialog. **Der Fehlerdialog beim Löschen** nannte nur eine Zahl („1 Vorgänge gingen schief\") und nicht, welche Kennung hängt; beim Schreiben gab es die Liste längst. **Und die Begründung eines fehlgeschlagenen Sendepunkts** hing an einem Knopf, den derselbe Rückruf 120 ms später wegwarf — sie steht jetzt oben im Trockenlauf und überlebt dessen Neuaufbau\n* Passt der Typ eines Punktes nicht zu seinem Musterplatz, sagen das jetzt alle drei Stellen — und nicht mehr nur die aufgeklappte Zeile. War der Platz eine **Pflicht**, greift das Muster danach gar nicht mehr, und dann stand die ganze Liste getönt da: am Bastelzimmer_Licht reichte ein Wechsel an SET von `boolean` auf `mixed`, und acht von acht Zeilen galten als „ohne Platz\", während das Musterfeld „✕ SET fehlt\" meldete — SET war aber da. Jetzt steht im Musterfeld „✕ SET: Typ mixed statt boolean\" und über der Liste „Das Licht-Muster greift gerade nicht: SET verlangt boolean, eingestellt ist mixed. Deshalb hat keine Zeile einen Platz.\" Getönt wird dabei nur die Zeile, an der es hängt — vorher leuchtete die ganze Liste auf, und damit zeigte die Tönung die Folge statt der Ursache.\n* Eine späte Antwort auf `system.config` zieht den Expertenmodus jetzt wirklich nach. Der Reiter gibt nach 2,5 Sekunden auf und arbeitet mit der Browsersprache weiter; kommt die Antwort danach, bleibt die Sprache stehen (ein Sprung nach dem Beschriften wäre schlimmer), der Expertenmodus wird übernommen und der Baum einmal neu gezeichnet. Gebaut war das längst — nur stand darüber noch ein Wächter aus der Zeit davor, der genau in diesem Fall ausstieg. Ohne den Modus fehlten alle Knoten unter `system.*` und `enum.*`, ohne dass irgendwo stand, warum\n* Der Tausch-Dialog merkt, wenn eine Ebene höher besser passt. Der Auswahlbaum lässt jeden Knoten wählen, unter dem Datenpunkte hängen — das muss so sein, weil bei einem flachen Adapter der Kanal das Gerät ist. Bei MQTT sind `stat`, `tele` und `cmnd` aber Themenordner: wer dort landet, findet weniger Punkte wieder und würde von der Sperre aufgefordert, welche zu entfernen. Jetzt rechnet die Werkbank die Elternebene mit und sagt es — „Eine Ebene höher (…) finden 7 von 7 Punkten ein Ziel, hier nur 5\" —, mit einem Knopf, der die Wahl umstellt. Verboten wird nichts\n* Die Geräteliste im Tausch-Dialog bleibt stehen, wo sie stand. Wer in einer langen Liste nach unten scrollte und ein Gerät anklickte, landete danach wieder am Anfang und sah seinen eben gewählten Eintrag nicht mehr — das Wählen baut den Dialog neu auf, und der Baum ist danach ein anderes Element. Liegt die gewählte Zeile trotzdem ausserhalb, wird sie hereingeholt. Eine neue Suche und ein frisch geöffneter Dialog fangen weiterhin oben an\n* Beim Quellentausch zählt ein Schreibziel nicht mehr, wenn es mit der Lesequelle zusammenfällt. Die Suche probiert als letzte Form den blossen Punktnamen, und `cmnd.POWER` fand so einen Melder, der hinten auch `POWER` heisst — der Alias hätte danach auf seine eigene Lesequelle geschrieben. Beim Raten wurde das abgefangen, beim Pfadtreffer nicht; sichtbar wurde es, wenn man als neue Quelle einen Unterknoten statt des Geräts wählte\n* Beim Quellentausch hält ein Punkt, der nicht mitziehen kann, den Tausch jetzt auf, statt ihn mittendrin scheitern zu lassen. Ein Punkt mit getrennten Quellen — liest aus `stat.POWER`, schreibt nach `cmnd.POWER` — braucht an der neuen Quelle beides. Fehlt das Schreibziel, gibt es in ioBroker **keine** Form, die „liest, schreibt nirgendwohin\" ausdrückt: eine blosse Kennung heisst „schreib auf den Melder\", `{read: X}` ohne `write` weist der js-controller ab, und `common.write: false` schützt die Quelle nicht (gemessen: ein Schreibvorgang darauf hat die Lesequelle überschrieben). Deshalb entscheidet jetzt der Nutzer — das Kästchen „diesen Punkt beim Tauschen entfernen\" steht auch in diesem Fall da, und „Jetzt tauschen\" bleibt gesperrt, solange niemand entschieden hat; der Grund steht am Knopf und als Zeile im Dialog. Vorher lief der Tausch los, scheiterte am Controller und liess den Alias halb auf der alten und halb auf der neuen Quelle zurück\n* Schlägt beim Tauschen ein Schreibvorgang fehl, wird **nichts** gelöscht. Bisher liefen die Löschungen trotzdem, und an einem Alias, der noch halb umgestellt war, fehlten danach auch noch Punkte. Dieselbe Regel gilt beim Verlegen längst\n* „Alle Datenpunkte des Geräts\" verschiebt den Ablageort nicht mehr. Bei einem Gerät mit mehreren Ausgängen legt die Werkbank einen Ordner an und darin je Ausgang einen Kanal. Der Knopf baut den Entwurf neu auf und gab ihm dabei nur das **fertige Ziel** mit; `setzeZiel` liest dessen letztes Segment als Gerätenamen — bei mehreren Ausgängen ist das aber der Ausgang, und er landete zusätzlich im Ordner. Jeder Druck schob den Ablageort eine Ebene tiefer, und geschrieben wurde er auch so: nach drei Klicks entstanden vier Ordner statt einem (`…Garten-Ventilinsel.POWER2.POWER2.POWER2.POWER2`). Jetzt gibt der Knopf Ordner und Namen getrennt weiter, wie es der Ausgangswechsel daneben seit jeher tut. Bei einem Gerät mit einem Ausgang trat es nie auf",
|
|
9
|
+
"ru": "* Четыре пункта из полного тестового прогона. **Идентификатор канала** не очищался в пути с несколькими выходами: из имени канала «Licht, Bar» js-controller молча делал `Licht_ Bar`, тогда как верстак показывал «Licht, Bar» и записывал это в перечисления — идентификатор, которого никогда не существовало, и после удаления алиаса он оставался там мусором. Теперь `ausgangName` очищает имя сам, а если два канала дают одно и то же имя, второй получает `_2`. **Подпись** различалась в двух представлениях: там, где имя точки совпадает с именем строки, «Изменить алиас» показывал его, а «Создать алиас» — пустое поле. **Список строк** теперь считает как дерево — `POWER2` перед `POWER10`. И **перечисление, созданное самим верстаком**, теперь исчезает и тогда, когда пустеет из-за смены функции, а не только при удалении алиаса\n* Уборка: «превратить объект алиаса в строку черновика» было написано пять раз — каждый раз с тем же правилом источника записи и слегка разным окружением. Четыре ошибки этой версии происходили именно оттуда: потерянный источник записи у рольставни, переключаемая точка, ставшая доступной только для чтения, отсутствующая подпись у `alias.0.Solar.Netz` и расхождение, которое верстак создал сам. Теперь чтение живёт в одном месте; что с ним делают четыре вызывающие стороны — сравнивают, создают, перезаписывают — остаётся за ними. Поведение не изменилось\n* Три мелочи, замеченные во время прогона. **RSSI** был предварительно отмечен в пяти шаблонах Tasmota и измерительных точек, но не в одиннадцати шаблонах Homematic — одно и то же свойство устройства, два ответа в зависимости от производителя; теперь он снят везде, как и остальная диагностика. **Место `MAP_URL`** в шаблоне пылесоса не получало роли, потому что его выражение начинается без `^`, а вывод требовал обоих якорей; отсутствие начального якоря больше не идёт в минус месту. **А метка «предположено»** в диалоге замены выглядела как текст, приклеенный к имени точки — её оформление опиралось на три родительских уровня, которых там нет. Теперь это такая же пилюля, как в списке состояний, и в подсказке сказано, по имени точки или по роли сделано предположение\n* Кнопка сохранения в диалоге шаблонов теперь проверяет и при нажатии, а не только при отрисовке. Она переоценивается при выходе из поля — кто вписывал открывающую скобку в подсказку имени и без промежуточного шага нажимал «Сохранить шаблон», видел перед собой синюю кнопку и сохранял шаблон с испорченным выражением. Пять причин блокировки теперь лежат в одном месте, общем для отрисовки и сохранения\n* Три места теперь говорят, почему они не могут. **Кнопка сохранения в диалоге шаблонов** была серой и молчала — заблокировать её могут пять причин, и ни одна не показывалась; теперь все подходящие стоят у кнопки и в виде рамки в диалоге. **Диалог ошибок при удалении** называл только число («1 операций не удалось»), а не то, какой идентификатор застрял; при записи такой список был давно. **А причина, по которой не удалось создать точку отправки**, висела на кнопке, которую тот же обратный вызов выбрасывал через 120 мс — теперь она стоит вверху пробного прогона и переживает его перестроение\n* Если тип точки не подходит к её месту в образце, об этом теперь говорят все три места, а не только развёрнутая строка. Если место было **обязательным**, образец перестаёт действовать вовсе, и весь список стоял подсвеченным: на Bastelzimmer_Licht хватило смены SET с `boolean` на `mixed`, и восемь строк из восьми считались «без места», тогда как поле образца сообщало «✕ SET отсутствует» — а SET был на месте. Теперь там написано «✕ SET: тип mixed вместо boolean», а над списком: «Образец света сейчас не действует: SET требует boolean, а установлено mixed. Поэтому ни у одной строки нет места.» Подсвечивается при этом только та строка, из-за которой всё висит — раньше загорался весь список, и подсветка показывала следствие вместо причины.\n* Поздний ответ на `system.config` теперь действительно переносит режим эксперта. Вкладка сдаётся через 2,5 секунды и работает дальше с языком браузера; если ответ приходит позже, язык остаётся как есть (переключение после отрисовки подписей было бы хуже), режим эксперта перенимается, а дерево один раз перерисовывается. Всё это было построено давно — но над ним сидел сторож из прежних времён, который выходил именно в этом случае. Без режима отсутствовали все узлы под `system.*` и `enum.*`, и нигде не было сказано почему\n* Диалог замены замечает, когда уровнем выше подходит лучше. Выбор позволяет взять любой узел, под которым есть точки данных — иначе нельзя, потому что у плоского адаптера канал и есть устройство. Но у MQTT `stat`, `tele` и `cmnd` — это папки тем: кто попадёт туда, найдёт меньше точек, и блокировка предложит какие-то удалить. Теперь верстак считает и родительский уровень и говорит об этом — «Уровнем выше (…) цель находят 7 из 7 точек, здесь только 5» — с кнопкой, которая переключает выбор. Ничего не запрещается\n* Список устройств в диалоге замены остаётся там, где стоял. Кто прокручивал длинный список вниз и щёлкал по устройству, оказывался снова в начале и не видел только что выбранную запись — выбор перестраивает диалог, и дерево после этого другой элемент. Если выбранная строка всё же оказывается за пределами, её подводят в поле зрения. Новый поиск и только что открытый диалог по-прежнему начинаются сверху\n* При замене источника цель записи больше не засчитывается, если она совпадает с источником чтения. Поиск пробует последней формой голое имя точки, и `cmnd.POWER` находил так точку состояния, которая сзади тоже зовётся `POWER` — алиас после этого писал бы в собственный источник чтения. При угадывании это перехватывалось, при совпадении по пути — нет; становилось видно, если новым источником выбирали подузел вместо устройства\n* При замене источника точка, которая не может переехать, теперь останавливает замену, а не даёт ей сорваться на середине. Точке с раздельными источниками — читает из `stat.POWER`, пишет в `cmnd.POWER` — на новом источнике нужно и то и другое. Если цели записи нет, в ioBroker **нет** формы, которая означала бы «читает, не пишет никуда»: голый идентификатор значит «пиши в точку состояния», `{read: X}` без `write` js-controller отклоняет, а `common.write: false` источник не защищает (измерено: запись в такой алиас перезаписала источник чтения). Поэтому решает пользователь — галочка «удалить эту точку при замене» теперь стоит и в этом случае, а «Заменить сейчас» остаётся заблокированной, пока никто не решил; причина видна у кнопки и строкой в диалоге. Раньше замена стартовала, срывалась на контроллере и оставляла алиас наполовину на старом, наполовину на новом источнике\n* Если при замене срывается запись, **ничего** не удаляется. Раньше удаления шли всё равно, и у алиаса, переведённого лишь наполовину, вдобавок пропадали точки. При переносе это правило действует уже давно\n* «Все точки данных устройства» больше не сдвигает место хранения. Для устройства с несколькими выходами верстак создаёт папку, а в ней по каналу на каждый выход. Кнопка перестраивает черновик и передавала при этом только **готовую цель**; `setzeZiel` читает её последний сегмент как имя устройства — но при нескольких выходах это выход, и он дополнительно попадал в папку. Каждое нажатие сдвигало место хранения на уровень глубже, и так же оно записывалось: после трёх щелчков возникали четыре папки вместо одной (`…Garten-Ventilinsel.POWER2.POWER2.POWER2.POWER2`). Теперь кнопка передаёт папку и имя по отдельности, как это давно делает переключатель выходов рядом. У устройства с одним выходом такого не случалось никогда",
|
|
10
|
+
"pt": "* Quatro coisas vindas da execução de teste completa. **Um identificador de canal** não era limpo no caminho de várias saídas: do nome de canal «Licht, Bar» o js-controller fazia silenciosamente `Licht_ Bar`, enquanto a bancada mostrava «Licht, Bar» e o inscrevia nas enumerações — um identificador que nunca existiu, e depois de apagar o alias ele ficava lá como resto. Agora `ausgangName` limpa por si, e onde dois canais dão o mesmo nome o segundo recebe um `_2`. **A legenda** diferia nas duas vistas: onde o nome do ponto é igual ao nome da linha, «Editar alias» mostrava-o e «Criar alias» deixava o campo vazio. **A lista de linhas** conta agora como a árvore — `POWER2` antes de `POWER10`. E **uma enumeração criada pela própria bancada** também desaparece quando fica vazia por uma mudança de função, e não só ao apagar o alias\n* Arrumação: «transformar um objeto alias numa linha de rascunho» estava escrito cinco vezes — de cada vez com a mesma regra de fonte de escrita e um enquadramento ligeiramente diferente. Quatro erros desta versão vinham exatamente daí: a fonte de escrita perdida no estore, um ponto comutável que passou a ser só de leitura, a legenda em falta em `alias.0.Solar.Netz` e um desvio que a bancada tinha produzido ela mesma. A leitura vive agora num único sítio; o que os quatro chamadores fazem com ela — comparar, criar, sobrescrever — fica com eles. O comportamento não muda\n* Três pequenas coisas notadas durante a execução. **RSSI** estava pré-marcado nos cinco modelos Tasmota e de pontos de medição, mas não nos onze modelos Homematic — a mesma característica do aparelho, duas respostas conforme o fabricante; agora está desmarcado em todo o lado, como o resto do diagnóstico. **O lugar `MAP_URL`** no padrão do aspirador não recebia papel porque a sua expressão começa sem `^` e a dedução exigia ambas as âncoras; a âncora inicial em falta já não conta contra o lugar. **E a marca «suposto»** no diálogo de troca parecia texto colado ao nome do ponto — a sua forma dependia de três níveis superiores que ali não existem. Agora é uma pastilha como na lista de estados e diz na dica se a suposição veio do nome do ponto ou do papel\n* O botão de guardar no diálogo de modelos verifica agora também ao ser premido, não só ao ser desenhado. É reavaliado ao sair de um campo — quem escrevia um parêntese aberto na dica de nome e clicava diretamente em «Guardar modelo» tinha à frente um botão azul e guardava um modelo com uma expressão partida. Os cinco motivos de bloqueio vivem agora num único sítio partilhado pelo desenho e pelo guardar\n* Três sítios dizem agora porque não conseguem. **O botão de guardar no diálogo de modelos** estava cinzento e calado — cinco motivos podem bloqueá-lo e nenhum era indicado; agora todos os aplicáveis aparecem no botão e como caixa no diálogo. **O diálogo de erro ao apagar** dava apenas um número («1 operações falharam») e não qual o identificador preso; na escrita essa lista já existia há muito. **E o motivo por que um ponto de envio não pôde ser criado** estava pendurado num botão que a mesma chamada de retorno deitava fora 120 ms depois — agora fica no topo da simulação e sobrevive à sua reconstrução\n* Se o tipo de um ponto não combina com o seu lugar no padrão, agora dizem-no os três sítios — e não só a linha aberta. Se o lugar era **obrigatório**, o padrão deixa de se aplicar por completo, e a lista inteira ficava tingida: no Bastelzimmer_Licht bastava mudar SET de `boolean` para `mixed` para que oito de oito linhas contassem como «sem lugar», enquanto o campo do padrão dizia «✕ SET em falta» — mas SET estava lá. Agora lê-se «✕ SET: tipo mixed em vez de boolean» e, por cima da lista: «O padrão de luz não se aplica neste momento: SET exige boolean, está definido mixed. Por isso nenhuma linha tem lugar.» Tinge-se apenas a linha de que depende — antes acendia-se a lista toda, e assim o tom mostrava a consequência em vez da causa.\n* Uma resposta tardia a `system.config` passa agora mesmo o modo perito. O separador desiste ao fim de 2,5 segundos e continua com a língua do navegador; se a resposta chegar depois, a língua fica como está (mudar depois das etiquetas seria pior), o modo perito é adotado e a árvore é redesenhada uma vez. Isso estava construído há muito — mas por cima estava um guarda de outros tempos, que saía exatamente neste caso. Sem o modo faltavam todos os nós sob `system.*` e `enum.*`, sem que em lado nenhum se dissesse porquê\n* O diálogo de troca repara quando um nível acima assenta melhor. O seletor deixa escolher qualquer nó sob o qual haja pontos de dados — tem de ser assim, porque num adaptador plano o canal é o aparelho. Com MQTT, porém, `stat`, `tele` e `cmnd` são pastas de tópicos: quem aterra ali encontra menos pontos, e o bloqueio pediria para remover alguns. A bancada calcula agora também o nível superior e di-lo — «Um nível acima (…) 7 de 7 pontos encontram destino, aqui só 5» — com um botão que muda a escolha. Nada é proibido\n* A lista de aparelhos no diálogo de troca fica onde estava. Quem descia numa lista longa e clicava num aparelho voltava ao início e já não via a entrada acabada de escolher — escolher reconstrói o diálogo, e a árvore passa a ser outro elemento. Se a linha selecionada ficar mesmo assim de fora, é trazida à vista. Uma nova pesquisa e um diálogo acabado de abrir continuam a começar em cima\n* Na troca da fonte, um destino de escrita já não conta se coincidir com a fonte de leitura. A procura tenta como última forma o nome nu do ponto, e `cmnd.POWER` encontrava assim um ponto de estado que também acaba em `POWER` — o alias teria depois escrito na sua própria fonte de leitura. Ao adivinhar isso era apanhado, na correspondência por caminho não; via-se quando como nova fonte se escolhia um subnó em vez do aparelho\n* Na troca da fonte, um ponto que não pode acompanhar trava agora a troca em vez de a deixar falhar a meio. Um ponto com fontes separadas — lê de `stat.POWER`, escreve em `cmnd.POWER` — precisa de ambas na nova fonte. Se faltar o destino de escrita, o ioBroker **não** tem forma que exprima «lê, não escreve em lado nenhum»: um identificador nu significa «escreve no ponto de estado», `{read: X}` sem `write` é recusado pelo js-controller, e `common.write: false` não protege a fonte (medido: escrever num tal alias sobrescreveu a fonte de leitura). Por isso decide o utilizador — a caixa «remover este ponto ao trocar» aparece também neste caso, e «Trocar agora» fica bloqueado enquanto ninguém decidir; o motivo consta no botão e como linha no diálogo. Antes a troca arrancava, falhava no controlador e deixava o alias metade na fonte antiga e metade na nova\n* Se durante a troca uma escrita falhar, **nada** é apagado. Até agora as eliminações corriam à mesma, e a um alias convertido só até meio faltavam ainda pontos. Na mudança de sítio essa regra vale há muito\n* «Todos os pontos de dados do aparelho» já não desloca o local de arrumação. Para um aparelho com várias saídas a bancada cria uma pasta e, dentro dela, um canal por saída. O botão reconstrói o rascunho e passava-lhe apenas o **destino pronto**; `setzeZiel` lê o seu último segmento como nome do aparelho — mas com várias saídas esse segmento é a saída, e ia parar também à pasta. Cada pressão empurrava o local um nível mais fundo, e assim era também escrito: após três cliques nasciam quatro pastas em vez de uma (`…Garten-Ventilinsel.POWER2.POWER2.POWER2.POWER2`). O botão passa agora pasta e nome em separado, como o seletor de saída ao lado sempre fez. Num aparelho com uma só saída isto nunca aconteceu",
|
|
11
|
+
"nl": "* Vier dingen uit de volledige testronde. **Een kanaalidentificatie** werd in het pad met meerdere uitgangen niet opgeschoond: van de kanaalnaam «Licht, Bar» maakte de js-controller stilletjes `Licht_ Bar`, terwijl de werkbank «Licht, Bar» toonde en het in de opsommingen schreef — een identificatie die nooit bestaan heeft, en na het wissen van de alias bleef ze daar als restant staan. Nu schoont `ausgangName` zelf op, en waar twee kanalen dezelfde naam opleveren, krijgt de tweede een `_2`. **Het opschrift** verschilde tussen de twee weergaven: waar de naam van het punt gelijk is aan de rijnaam, toonde «Alias bewerken» hem en «Alias aanmaken» een leeg veld. **De rijenlijst** telt nu als de boom — `POWER2` vóór `POWER10`. En **een opsomming die de werkbank zelf heeft aangelegd** verdwijnt nu ook wanneer ze door een functiewissel leeg raakt, niet alleen bij het wissen van de alias\n* Opgeruimd: «van een aliasobject een ontwerpregel maken» stond vijf keer uitgeschreven — telkens met dezelfde schrijfbronregel en een iets andere omgeving. Vier fouten van deze versie kwamen precies daarvandaan: de verloren schrijfbron bij het rolluik, een schakelend punt dat lezend werd, het ontbrekende opschrift bij `alias.0.Solar.Netz` en een afwijking die de werkbank zelf had gemaakt. Het uitlezen staat nu op één plek; wat de vier aanroepers ermee doen — vergelijken, aanmaken, overschrijven — blijft bij hen. Aan het gedrag verandert niets\n* Drie kleinigheden die tijdens de ronde opvielen. **RSSI** stond in de vijf Tasmota- en meetpuntsjablonen vooraf aangevinkt, in de elf Homematic-sjablonen niet — dezelfde apparaateigenschap, twee antwoorden naargelang de fabrikant; nu is het overal uitgevinkt, zoals de rest van de diagnose. **De plek `MAP_URL`** in het stofzuigerpatroon kreeg geen rol omdat de uitdrukking zonder `^` begint en de afleiding beide ankers eiste; het ontbrekende beginanker telt niet meer tegen de plek. **En het merkteken «vermoed»** in het wisseldialoogvenster zag eruit als tekst die aan de puntnaam plakt — de vormgeving hing aan drie ouderniveaus die daar niet bestaan. Het is nu een pil zoals in de toestandenlijst en zegt in de tooltip of er via de puntnaam of via de rol geraden is\n* De opslaanknop in het sjabloondialoogvenster controleert nu ook bij het indrukken, niet alleen bij het tekenen. Hij wordt opnieuw beoordeeld bij het verlaten van een veld — wie een openende haak in de naamhint schreef en meteen op «Sjabloon opslaan» klikte, had een blauwe knop voor zich en sloeg een sjabloon met een kapotte uitdrukking op. De vijf blokkeerredenen staan daarvoor nu op één plek, gedeeld door tekenen en opslaan\n* Drie plekken zeggen nu waarom ze niet kunnen. **De opslaanknop in het sjabloondialoogvenster** was grijs en zweeg — vijf redenen kunnen hem blokkeren en geen ervan werd getoond; nu staan alle toepasselijke bij de knop en als kader in het dialoogvenster. **Het foutdialoogvenster bij het wissen** noemde alleen een aantal («1 bewerkingen mislukt») en niet welke identificatie vastzit; bij het schrijven bestond die lijst al lang. **En de reden waarom een zendpunt niet kon worden aangemaakt** hing aan een knop die dezelfde callback 120 ms later weggooide — ze staat nu bovenaan de proefdraai en overleeft de heropbouw\n* Past het type van een punt niet bij zijn plek in het patroon, dan zeggen alle drie de plekken dat nu — en niet meer alleen de uitgeklapte rij. Was de plek **verplicht**, dan grijpt het patroon helemaal niet meer, en stond de hele lijst getint: bij de Bastelzimmer_Licht volstond het SET van `boolean` op `mixed` te zetten, en acht van de acht rijen golden als «zonder plek», terwijl het patroonveld «✕ SET ontbreekt» meldde — SET was er wel degelijk. Nu staat er «✕ SET: type mixed in plaats van boolean», en boven de lijst: «Het lichtpatroon grijpt momenteel niet: SET vereist boolean, ingesteld is mixed. Daarom heeft geen enkele rij een plek.» Getint wordt daarbij alleen de rij waar het aan ligt — vroeger lichtte de hele lijst op, en zo toonde de tint het gevolg in plaats van de oorzaak.\n* Een laat antwoord op `system.config` neemt de expertmodus nu werkelijk over. Het tabblad geeft het na 2,5 seconden op en werkt verder met de browsertaal; komt het antwoord daarna, dan blijft de taal staan (een sprong na het benoemen zou erger zijn), de expertmodus wordt overgenomen en de boom wordt eenmaal opnieuw getekend. Dat was allang gebouwd — alleen zat er nog een wachter uit de tijd daarvóór boven, die er juist in dit geval uitstapte. Zonder de modus ontbraken alle knopen onder `system.*` en `enum.*`, zonder dat ergens stond waarom\n* Het wisseldialoogvenster merkt wanneer een niveau hoger beter past. De keuzeboom laat elke knoop kiezen waaronder datapunten hangen — dat moet, want bij een platte adapter is het kanaal het apparaat. Bij MQTT zijn `stat`, `tele` en `cmnd` echter onderwerpmappen: wie daar belandt, vindt minder punten terug, en de vergrendeling zou vragen er enkele te verwijderen. De werkbank rekent nu ook het ouderniveau mee en zegt het — «Eén niveau hoger (…) vinden 7 van de 7 punten een doel, hier maar 5» — met een knop die de keuze omzet. Verboden wordt niets\n* De apparatenlijst in het wisseldialoogvenster blijft staan waar ze stond. Wie in een lange lijst naar beneden scrolde en een apparaat aanklikte, kwam daarna weer bovenaan uit en zag het zojuist gekozen item niet meer — kiezen bouwt het dialoogvenster opnieuw op, en de boom is daarna een ander element. Ligt de gekozen rij toch buiten beeld, dan wordt ze in beeld gehaald. Een nieuwe zoekopdracht en een net geopend dialoogvenster beginnen nog steeds bovenaan\n* Bij het wisselen van bron telt een schrijfdoel niet meer mee als het samenvalt met de leesbron. De zoektocht probeert als laatste vorm de kale puntnaam, en `cmnd.POWER` vond zo een statuspunt dat achteraan ook `POWER` heet — de alias zou daarna op zijn eigen leesbron hebben geschreven. Bij het raden werd dat opgevangen, bij een padtreffer niet; het werd zichtbaar wanneer men als nieuwe bron een onderknoop in plaats van het apparaat koos\n* Bij het wisselen van bron houdt een punt dat niet mee kan de wissel nu tegen, in plaats van hem halverwege te laten mislukken. Een punt met gescheiden bronnen — leest uit `stat.POWER`, schrijft naar `cmnd.POWER` — heeft bij de nieuwe bron beide nodig. Ontbreekt het schrijfdoel, dan kent ioBroker **geen** vorm die «leest, schrijft nergens heen» uitdrukt: een kale identificatie betekent «schrijf op het statuspunt», `{read: X}` zonder `write` wijst de js-controller af, en `common.write: false` beschermt de bron niet (gemeten: een schrijfactie daarop overschreef de leesbron). Daarom beslist nu de gebruiker — het vakje «dit punt bij het wisselen verwijderen» staat er ook in dit geval, en «Nu wisselen» blijft geblokkeerd zolang niemand beslist heeft; de reden staat bij de knop en als regel in het dialoogvenster. Voorheen startte de wissel, mislukte bij de controller en liet de alias half op de oude en half op de nieuwe bron achter\n* Mislukt tijdens het wisselen een schrijfactie, dan wordt er **niets** gewist. Tot nu toe liepen de verwijderingen toch door, en bij een alias die pas half was omgezet ontbraken daarna ook nog punten. Bij het verplaatsen geldt die regel al lang\n* «Alle datapunten van het apparaat» verschuift de bergplaats niet meer. Bij een apparaat met meerdere uitgangen legt de werkbank een map aan en daarin per uitgang een kanaal. De knop bouwt het ontwerp opnieuw op en gaf het daarbij alleen het **kant-en-klare doel** mee; `setzeZiel` leest het laatste segment daarvan als apparaatnaam — bij meerdere uitgangen is dat echter de uitgang, en die belandde ook nog in de map. Elke druk schoof de bergplaats een niveau dieper, en zo werd ze ook geschreven: na drie klikken ontstonden vier mappen in plaats van één (`…Garten-Ventilinsel.POWER2.POWER2.POWER2.POWER2`). De knop geeft map en naam nu apart door, zoals de uitgangskeuze ernaast dat altijd al deed. Bij een apparaat met één uitgang trad het nooit op",
|
|
12
|
+
"fr": "* Quatre choses issues du parcours de test complet. **Un identifiant de canal** n'était pas nettoyé dans le chemin à sorties multiples : à partir du nom de canal « Licht, Bar », le js-controller faisait silencieusement `Licht_ Bar`, alors que l'établi affichait « Licht, Bar » et l'inscrivait dans les énumérations — un identifiant qui n'a jamais existé, et après la suppression de l'alias il y restait comme résidu. Désormais `ausgangName` nettoie lui-même, et là où deux canaux donnent le même nom, le second reçoit un `_2`. **Le libellé** différait entre les deux vues : là où le nom du point est identique au nom de la ligne, « Modifier l'alias » l'affichait et « Créer un alias » montrait un champ vide. **La liste des lignes** compte maintenant comme l'arbre — `POWER2` avant `POWER10`. Et **une énumération créée par l'établi lui-même** disparaît aussi lorsqu'elle se vide par un changement de fonction, et non plus seulement à la suppression de l'alias\n* Rangement : « transformer un objet alias en ligne de brouillon » était écrit cinq fois — chaque fois avec la même règle de source d'écriture et un entourage légèrement différent. Quatre bogues de cette version venaient précisément de là : la source d'écriture perdue sur le volet roulant, un point commutable devenu point de lecture, le libellé manquant sur `alias.0.Solar.Netz` et un écart que l'établi avait produit lui-même. La lecture vit désormais à un seul endroit ; ce que les quatre appelants en font — comparer, créer, écraser — leur reste. Le comportement est inchangé\n* Trois petites choses repérées pendant le parcours. **RSSI** était coché d'avance dans les cinq modèles Tasmota et points de mesure, mais pas dans les onze modèles Homematic — la même propriété d'appareil, deux réponses selon le fabricant ; il est maintenant décoché partout, comme le reste du diagnostic. **L'emplacement `MAP_URL`** du motif aspirateur n'obtenait aucun rôle parce que son expression commence sans `^` et que la déduction exigeait les deux ancres ; l'ancre de début manquante ne compte plus contre l'emplacement. **Et la marque « supposé »** dans la boîte de dialogue d'échange ressemblait à du texte collé au nom du point — sa mise en forme dépendait de trois niveaux parents qui n'existent pas là. C'est désormais une pastille comme dans la liste d'états, et l'infobulle indique si la supposition vient du nom du point ou du rôle\n* Le bouton d'enregistrement de la boîte de dialogue des modèles vérifie maintenant aussi à l'appui, et pas seulement au dessin. Il est réévalué quand on quitte un champ — qui écrivait une parenthèse ouvrante dans l'indice de nom et cliquait directement sur « Enregistrer le modèle » avait devant lui un bouton bleu et enregistrait un modèle avec une expression cassée. Les cinq motifs de blocage vivent désormais à un seul endroit, partagé par le dessin et l'enregistrement\n* Trois endroits disent maintenant pourquoi ils ne peuvent pas. **Le bouton d'enregistrement de la boîte de dialogue des modèles** était grisé et muet — cinq motifs peuvent le bloquer et aucun n'était indiqué ; tous ceux qui s'appliquent figurent à présent sur le bouton et dans un encadré du dialogue. **La boîte d'erreur à la suppression** ne donnait qu'un nombre (« 1 opérations ont échoué ») et non l'identifiant bloqué ; à l'écriture, cette liste existait depuis longtemps. **Et la raison pour laquelle un point d'envoi n'a pas pu être créé** pendait à un bouton que le même rappel jetait 120 ms plus tard — elle se trouve maintenant en haut de l'essai à blanc et survit à sa reconstruction\n* Si le type d'un point ne correspond pas à son emplacement dans le motif, les trois endroits le disent désormais — et plus seulement la ligne dépliée. Si l'emplacement était **obligatoire**, le motif ne s'applique plus du tout, et toute la liste apparaissait teintée : sur le Bastelzimmer_Licht, il suffisait de passer SET de `boolean` à `mixed` pour que huit lignes sur huit comptent comme « sans emplacement », tandis que le champ du motif signalait « ✕ SET manquant » — alors que SET était bien là. On lit maintenant « ✕ SET : type mixed au lieu de boolean », et au-dessus de la liste : « Le motif lumière ne s'applique pas actuellement : SET exige boolean, mixed est réglé. C'est pourquoi aucune ligne n'a d'emplacement. » Seule la ligne en cause est teintée — auparavant toute la liste s'allumait, ce qui montrait la conséquence au lieu de la cause.\n* Une réponse tardive à `system.config` reporte maintenant vraiment le mode expert. L'onglet abandonne après 2,5 secondes et continue avec la langue du navigateur ; si la réponse arrive ensuite, la langue reste telle quelle (changer après l'étiquetage serait pire), le mode expert est repris et l'arbre est redessiné une fois. Tout cela était construit depuis longtemps — mais au-dessus siégeait un garde d'avant, qui sortait exactement dans ce cas. Sans le mode, tous les nœuds sous `system.*` et `enum.*` manquaient, sans que rien n'en dise la raison\n* La boîte de dialogue d'échange remarque quand un niveau plus haut convient mieux. Le sélecteur laisse choisir n'importe quel nœud sous lequel pendent des points de données — il le faut, car sur un adaptateur plat le canal est l'appareil. Avec MQTT, en revanche, `stat`, `tele` et `cmnd` sont des dossiers de sujets : qui atterrit là retrouve moins de points, et le verrou demanderait d'en retirer. L'établi calcule maintenant aussi le niveau parent et le dit — « Un niveau plus haut (…) 7 points sur 7 trouvent une cible, ici seulement 5 » — avec un bouton qui change la sélection. Rien n'est interdit\n* La liste des appareils dans la boîte de dialogue d'échange reste où elle était. Qui faisait défiler une longue liste et cliquait sur un appareil se retrouvait au début et ne voyait plus l'entrée qu'il venait de choisir — le choix reconstruit le dialogue, et l'arbre est ensuite un autre élément. Si la ligne sélectionnée se retrouve malgré tout en dehors, elle est ramenée dans le champ de vision. Une nouvelle recherche et un dialogue fraîchement ouvert commencent toujours en haut\n* Lors de l'échange de source, une cible d'écriture ne compte plus si elle coïncide avec la source de lecture. La recherche essaie en dernière forme le simple nom du point, et `cmnd.POWER` trouvait ainsi un point d'état qui se termine aussi par `POWER` — l'alias aurait alors écrit dans sa propre source de lecture. À la devinette, c'était intercepté ; à la correspondance par chemin, non ; cela se voyait quand on choisissait comme nouvelle source un sous-nœud au lieu de l'appareil\n* Lors de l'échange de source, un point qui ne peut pas suivre arrête désormais l'échange au lieu de le laisser échouer en cours de route. Un point à sources séparées — lit depuis `stat.POWER`, écrit vers `cmnd.POWER` — a besoin des deux à la nouvelle source. Si la cible d'écriture manque, ioBroker n'a **aucune** forme qui exprime « lit, n'écrit nulle part » : un simple identifiant signifie « écris sur le point d'état », `{read: X}` sans `write` est rejeté par le js-controller, et `common.write: false` ne protège pas la source (mesuré : une écriture sur un tel alias a écrasé la source de lecture). C'est donc l'utilisateur qui décide — la case « retirer ce point lors de l'échange » apparaît aussi dans ce cas, et « Échanger maintenant » reste bloqué tant que personne n'a décidé ; la raison figure sur le bouton et comme ligne dans le dialogue. Auparavant, l'échange démarrait, échouait au contrôleur et laissait l'alias moitié sur l'ancienne, moitié sur la nouvelle source\n* Si une écriture échoue pendant l'échange, **rien** n'est supprimé. Jusqu'ici les suppressions se faisaient quand même, et un alias à moitié migré perdait en plus des points. Pour le déplacement, cette règle vaut depuis longtemps\n* « Tous les points de données de l'appareil » ne déplace plus l'emplacement de rangement. Pour un appareil à plusieurs sorties, l'établi crée un dossier et, dedans, un canal par sortie. Le bouton reconstruit le brouillon et ne lui transmettait que la **cible finie** ; `setzeZiel` lit son dernier segment comme nom d'appareil — mais avec plusieurs sorties, c'est la sortie, et elle atterrissait en plus dans le dossier. Chaque appui poussait l'emplacement d'un niveau plus profond, et c'est ainsi qu'il était écrit : après trois clics, quatre dossiers naissaient au lieu d'un (`…Garten-Ventilinsel.POWER2.POWER2.POWER2.POWER2`). Le bouton transmet maintenant le dossier et le nom séparément, comme le fait depuis toujours le sélecteur de sortie à côté. Sur un appareil à une seule sortie, cela n'est jamais arrivé",
|
|
13
|
+
"it": "* Quattro cose emerse dal giro di prova completo. **Un identificativo di canale** non veniva ripulito nel percorso a più uscite: dal nome di canale «Licht, Bar» il js-controller ricavava silenziosamente `Licht_ Bar`, mentre il banco di lavoro mostrava «Licht, Bar» e lo iscriveva nelle enumerazioni — un identificativo che non è mai esistito, e dopo la cancellazione dell'alias restava lì come residuo. Ora `ausgangName` ripulisce da sé, e dove due canali producono lo stesso nome il secondo riceve un `_2`. **La didascalia** era diversa nelle due viste: dove il nome del punto coincide con il nome della riga, «Modifica alias» lo mostrava e «Crea alias» lasciava il campo vuoto. **L'elenco delle righe** ora conta come l'albero — `POWER2` prima di `POWER10`. E **un'enumerazione creata dal banco di lavoro stesso** sparisce anche quando si svuota per un cambio di funzione, non solo alla cancellazione dell'alias\n* Riordino: «da un oggetto alias a una riga di bozza» era scritto cinque volte — ogni volta con la stessa regola della sorgente di scrittura e un contorno leggermente diverso. Quattro errori di questa versione venivano proprio da lì: la sorgente di scrittura persa sulla tapparella, un punto commutabile diventato di sola lettura, la didascalia mancante su `alias.0.Solar.Netz` e uno scostamento che il banco di lavoro aveva prodotto da sé. La lettura ora vive in un solo posto; ciò che i quattro chiamanti ne fanno — confrontare, creare, sovrascrivere — resta a loro. Il comportamento non cambia\n* Tre piccolezze notate durante il giro. **RSSI** era spuntato in anticipo nei cinque modelli Tasmota e dei punti di misura, ma non negli undici modelli Homematic — la stessa caratteristica del dispositivo, due risposte a seconda del produttore; ora è deselezionato ovunque, come il resto della diagnostica. **Il posto `MAP_URL`** nello schema aspirapolvere non riceveva alcun ruolo perché la sua espressione inizia senza `^` e la deduzione pretendeva entrambe le ancore; l'ancora iniziale mancante non conta più contro il posto. **E il contrassegno «supposto»** nella finestra di scambio sembrava testo incollato al nome del punto — la sua forma dipendeva da tre livelli superiori che lì non esistono. Ora è una pillola come nell'elenco degli stati e nel suggerimento dice se la supposizione viene dal nome del punto o dal ruolo\n* Il pulsante di salvataggio nella finestra dei modelli ora controlla anche alla pressione, non solo al disegno. Viene rivalutato quando si lascia un campo — chi scriveva una parentesi aperta nel suggerimento di nome e cliccava direttamente su «Salva modello» si trovava davanti un pulsante blu e salvava un modello con un'espressione rotta. I cinque motivi di blocco stanno ora in un unico posto, condiviso da disegno e salvataggio\n* Tre punti dicono ora perché non possono. **Il pulsante di salvataggio nella finestra dei modelli** era grigio e muto — cinque motivi possono bloccarlo e nessuno era indicato; ora tutti quelli applicabili compaiono sul pulsante e come riquadro nella finestra. **La finestra di errore alla cancellazione** dava solo un numero («1 operazioni non riuscite») e non quale identificativo fosse bloccato; in scrittura quell'elenco c'era da tempo. **E il motivo per cui un punto di invio non è stato creato** era appeso a un pulsante che la stessa callback buttava via 120 ms dopo — ora sta in cima alla prova a vuoto e sopravvive alla sua ricostruzione\n* Se il tipo di un punto non si adatta al suo posto nello schema, ora lo dicono tutti e tre i posti — non più solo la riga aperta. Se il posto era **obbligatorio**, lo schema non si applica più affatto, e l'intero elenco appariva colorato: sul Bastelzimmer_Licht bastava cambiare SET da `boolean` a `mixed` perché otto righe su otto valessero come «senza posto», mentre il campo dello schema segnalava «✕ SET manca» — ma SET c'era. Ora si legge «✕ SET: tipo mixed invece di boolean», e sopra l'elenco: «Lo schema luce al momento non si applica: SET richiede boolean, è impostato mixed. Per questo nessuna riga ha un posto.» Viene colorata solo la riga da cui dipende — prima si illuminava tutto l'elenco, e così la colorazione mostrava la conseguenza invece della causa.\n* Una risposta tardiva a `system.config` ora riporta davvero la modalità esperto. La scheda si arrende dopo 2,5 secondi e prosegue con la lingua del browser; se la risposta arriva dopo, la lingua resta com'è (cambiarla dopo le etichette sarebbe peggio), la modalità esperto viene assunta e l'albero ridisegnato una volta. Tutto ciò era costruito da tempo — ma sopra sedeva un guardiano di prima, che usciva esattamente in questo caso. Senza la modalità mancavano tutti i nodi sotto `system.*` ed `enum.*`, senza che da nessuna parte fosse detto perché\n* La finestra di scambio si accorge quando un livello più in alto va meglio. Il selettore lascia scegliere qualsiasi nodo sotto cui pendano punti dati — deve essere così, perché in un adattatore piatto il canale è il dispositivo. Con MQTT, però, `stat`, `tele` e `cmnd` sono cartelle di argomenti: chi finisce lì ritrova meno punti, e il blocco chiederebbe di rimuoverne. Ora il banco di lavoro calcola anche il livello superiore e lo dice — «Un livello più in alto (…) 7 punti su 7 trovano una destinazione, qui solo 5» — con un pulsante che cambia la scelta. Nulla viene vietato\n* L'elenco dei dispositivi nella finestra di scambio resta dov'era. Chi scorreva in basso in un elenco lungo e cliccava un dispositivo si ritrovava di nuovo all'inizio e non vedeva più la voce appena scelta — la scelta ricostruisce la finestra, e l'albero dopo è un altro elemento. Se la riga selezionata finisce comunque fuori, viene riportata in vista. Una nuova ricerca e una finestra appena aperta cominciano ancora dall'alto\n* Nello scambio della sorgente una destinazione di scrittura non conta più se coincide con la sorgente di lettura. La ricerca prova come ultima forma il semplice nome del punto, e `cmnd.POWER` trovava così un punto di stato che in coda si chiama anch'esso `POWER` — l'alias avrebbe poi scritto sulla propria sorgente di lettura. Nell'indovinare veniva intercettato, nella corrispondenza per percorso no; si vedeva quando come nuova sorgente si sceglieva un sottonodo invece del dispositivo\n* Nello scambio della sorgente, un punto che non può seguire ora ferma lo scambio invece di lasciarlo fallire a metà. Un punto con sorgenti separate — legge da `stat.POWER`, scrive su `cmnd.POWER` — alla nuova sorgente ha bisogno di entrambe. Se manca la destinazione di scrittura, in ioBroker **non** esiste forma che esprima «legge, non scrive da nessuna parte»: un identificativo nudo significa «scrivi sul punto di stato», `{read: X}` senza `write` viene respinto dal js-controller, e `common.write: false` non protegge la sorgente (misurato: una scrittura su un tale alias ha sovrascritto la sorgente di lettura). Perciò decide l'utente — la casella «rimuovi questo punto allo scambio» compare anche in questo caso, e «Scambia ora» resta bloccato finché nessuno ha deciso; il motivo sta sul pulsante e come riga nella finestra. Prima lo scambio partiva, falliva al controller e lasciava l'alias metà sulla vecchia e metà sulla nuova sorgente\n* Se durante lo scambio una scrittura fallisce, **non** viene cancellato nulla. Finora le cancellazioni partivano lo stesso, e a un alias già convertito a metà mancavano poi anche dei punti. Nello spostamento questa regola vale da tempo\n* «Tutti i punti dati del dispositivo» non sposta più il luogo di archiviazione. Per un dispositivo con più uscite il banco di lavoro crea una cartella e dentro un canale per ogni uscita. Il pulsante ricostruisce la bozza e le passava solo la **destinazione finita**; `setzeZiel` legge il suo ultimo segmento come nome del dispositivo — con più uscite però quello è l'uscita, e finiva in più nella cartella. Ogni pressione spingeva il luogo di archiviazione un livello più in basso, e così veniva anche scritto: dopo tre clic nascevano quattro cartelle invece di una (`…Garten-Ventilinsel.POWER2.POWER2.POWER2.POWER2`). Ora il pulsante passa cartella e nome separatamente, come fa da sempre il selettore di uscita accanto. Su un dispositivo con una sola uscita non è mai successo",
|
|
14
|
+
"es": "* Cuatro cosas salidas del recorrido de prueba completo. **Un identificador de canal** no se depuraba en la ruta de varias salidas: del nombre de canal «Licht, Bar» el js-controller hacía en silencio `Licht_ Bar`, mientras el banco de trabajo mostraba «Licht, Bar» y lo inscribía en las enumeraciones — un identificador que nunca existió, y tras borrar el alias se quedaba allí como resto. Ahora `ausgangName` depura por sí mismo, y donde dos canales dan el mismo nombre, el segundo recibe un `_2`. **El rótulo** difería entre las dos vistas: donde el nombre del punto coincide con el nombre de la fila, «Editar alias» lo mostraba y «Crear alias» dejaba el campo vacío. **La lista de filas** cuenta ahora como el árbol — `POWER2` antes que `POWER10`. Y **una enumeración creada por el propio banco de trabajo** desaparece también cuando se queda vacía por un cambio de función, no solo al borrar el alias\n* Orden: «convertir un objeto alias en una fila de borrador» estaba escrito cinco veces — cada vez con la misma regla de fuente de escritura y un entorno algo distinto. Cuatro fallos de esta versión venían justo de ahí: la fuente de escritura perdida en la persiana, un punto conmutable que pasó a ser de solo lectura, el rótulo ausente en `alias.0.Solar.Netz` y una desviación que el banco de trabajo había producido él mismo. La lectura vive ahora en un solo sitio; lo que los cuatro llamantes hagan con ella — comparar, crear, sobrescribir — queda de su parte. El comportamiento no cambia\n* Tres pequeñeces detectadas durante el recorrido. **RSSI** estaba marcado de antemano en las cinco plantillas de Tasmota y de puntos de medida, pero no en las once de Homematic — la misma característica del aparato, dos respuestas según el fabricante; ahora está desmarcado en todas partes, como el resto del diagnóstico. **El puesto `MAP_URL`** del patrón de aspiradora no recibía rol porque su expresión empieza sin `^` y la deducción exigía ambas anclas; el ancla inicial ausente ya no cuenta en contra del puesto. **Y la marca «supuesto»** en el diálogo de intercambio parecía texto pegado al nombre del punto — su forma dependía de tres niveles superiores que allí no existen. Ahora es una píldora como en la lista de estados y dice en la ayuda emergente si la suposición vino del nombre del punto o del rol\n* El botón de guardar del diálogo de plantillas comprueba ahora también al pulsarlo, no solo al dibujarse. Se reevalúa al abandonar un campo — quien escribía un paréntesis abierto en la pista de nombre y pulsaba directamente «Guardar plantilla» tenía delante un botón azul y guardaba una plantilla con una expresión rota. Los cinco motivos de bloqueo están ahora en un único sitio que comparten dibujo y guardado\n* Tres sitios dicen ahora por qué no pueden. **El botón de guardar del diálogo de plantillas** estaba gris y callado — cinco motivos pueden bloquearlo y ninguno se mostraba; ahora todos los que aplican aparecen en el botón y como recuadro en el diálogo. **El diálogo de error al borrar** solo daba un número («1 operaciones fallaron») y no qué identificador está atascado; al escribir esa lista existía desde hace tiempo. **Y el motivo por el que no se pudo crear un punto de envío** colgaba de un botón que la misma retrollamada tiraba 120 ms después — ahora está arriba en la marcha en seco y sobrevive a su reconstrucción\n* Si el tipo de un punto no encaja con su puesto en el patrón, ahora lo dicen los tres sitios — y no solo la fila desplegada. Si el puesto era **obligatorio**, el patrón deja de aplicarse del todo, y la lista entera aparecía teñida: en el Bastelzimmer_Licht bastaba cambiar SET de `boolean` a `mixed` para que ocho de ocho filas contaran como «sin puesto», mientras el campo del patrón informaba «✕ falta SET» — pero SET estaba ahí. Ahora pone «✕ SET: tipo mixed en lugar de boolean», y sobre la lista: «El patrón de luz no se aplica ahora mismo: SET exige boolean y está puesto mixed. Por eso ninguna fila tiene puesto.» Se tiñe solo la fila de la que depende — antes se encendía la lista entera, y así el tinte mostraba la consecuencia en vez de la causa.\n* Una respuesta tardía a `system.config` traspasa ahora de verdad el modo experto. La pestaña se rinde tras 2,5 segundos y sigue con el idioma del navegador; si la respuesta llega después, el idioma se queda como está (cambiarlo tras rotular sería peor), el modo experto se adopta y el árbol se redibuja una vez. Eso estaba construido desde hacía tiempo — pero encima había un guardián de la época anterior que se salía justo en este caso. Sin el modo faltaban todos los nodos bajo `system.*` y `enum.*`, sin que en ningún sitio se dijera por qué\n* El diálogo de intercambio nota cuándo un nivel más arriba encaja mejor. El selector deja elegir cualquier nodo bajo el que cuelguen puntos de datos — tiene que ser así, porque en un adaptador plano el canal es el aparato. Con MQTT, en cambio, `stat`, `tele` y `cmnd` son carpetas de temas: quien aterriza ahí encuentra menos puntos, y el bloqueo pediría quitar alguno. El banco de trabajo calcula ahora también el nivel superior y lo dice — «Un nivel más arriba (…) 7 de 7 puntos encuentran destino, aquí solo 5» — con un botón que cambia la elección. No se prohíbe nada\n* La lista de aparatos del diálogo de intercambio se queda donde estaba. Quien bajaba por una lista larga y pulsaba un aparato volvía al principio y ya no veía la entrada recién elegida — elegir reconstruye el diálogo, y el árbol es después otro elemento. Si la fila seleccionada queda aun así fuera, se trae a la vista. Una búsqueda nueva y un diálogo recién abierto siguen empezando arriba\n* Al intercambiar la fuente, un destino de escritura ya no cuenta si coincide con la fuente de lectura. La búsqueda prueba como última forma el nombre desnudo del punto, y `cmnd.POWER` encontraba así un punto de estado que también termina en `POWER` — el alias habría escrito luego sobre su propia fuente de lectura. Al adivinar se interceptaba; al coincidir por ruta, no; se veía cuando como nueva fuente se elegía un subnodo en vez del aparato\n* Al intercambiar la fuente, un punto que no puede acompañar detiene ahora el intercambio en vez de dejar que fracase a medias. Un punto con fuentes separadas — lee de `stat.POWER`, escribe en `cmnd.POWER` — necesita ambas en la nueva fuente. Si falta el destino de escritura, en ioBroker **no** hay forma que exprese «lee, no escribe en ninguna parte»: un identificador desnudo significa «escribe en el punto de estado», `{read: X}` sin `write` lo rechaza el js-controller, y `common.write: false` no protege la fuente (medido: escribir en semejante alias sobrescribió la fuente de lectura). Por eso decide el usuario — la casilla «quitar este punto al intercambiar» aparece también en este caso, y «Intercambiar ahora» queda bloqueado mientras nadie haya decidido; el motivo consta en el botón y como línea en el diálogo. Antes el intercambio arrancaba, fracasaba en el controlador y dejaba el alias mitad en la fuente vieja y mitad en la nueva\n* Si durante el intercambio falla una escritura, **no** se borra nada. Hasta ahora los borrados se ejecutaban igualmente, y a un alias convertido a medias le faltaban además puntos. Al trasladar, esa regla rige desde hace tiempo\n* «Todos los puntos de datos del aparato» ya no desplaza el lugar de almacenamiento. Para un aparato con varias salidas el banco de trabajo crea una carpeta y dentro un canal por salida. El botón reconstruye el borrador y le pasaba solo el **destino terminado**; `setzeZiel` lee su último segmento como nombre del aparato — pero con varias salidas ese segmento es la salida, y acababa además en la carpeta. Cada pulsación empujaba el lugar un nivel más hondo, y así se escribía también: tras tres clics nacían cuatro carpetas en vez de una (`…Garten-Ventilinsel.POWER2.POWER2.POWER2.POWER2`). Ahora el botón pasa carpeta y nombre por separado, como hace desde siempre el selector de salida de al lado. En un aparato con una sola salida nunca ocurrió",
|
|
15
|
+
"pl": "* Cztery rzeczy z pełnego przebiegu testowego. **Identyfikator kanału** nie był oczyszczany na ścieżce z wieloma wyjściami: z nazwy kanału „Licht, Bar” js-controller po cichu robił `Licht_ Bar`, podczas gdy warsztat pokazywał „Licht, Bar” i wpisywał to do wyliczeń — identyfikator, którego nigdy nie było, a po usunięciu aliasu zostawał tam jako pozostałość. Teraz `ausgangName` oczyszcza sam, a gdy dwa kanały dają tę samą nazwę, drugi dostaje `_2`. **Podpis** różnił się w obu widokach: tam, gdzie nazwa punktu jest równa nazwie wiersza, „Edytuj alias” ją pokazywał, a „Utwórz alias” zostawiał puste pole. **Lista wierszy** liczy teraz jak drzewo — `POWER2` przed `POWER10`. A **wyliczenie założone przez sam warsztat** znika też wtedy, gdy opustoszeje wskutek zmiany funkcji, a nie tylko przy usunięciu aliasu\n* Porządki: „z obiektu aliasu zrób wiersz szkicu” było rozpisane pięć razy — za każdym razem z tą samą regułą źródła zapisu i nieco innym otoczeniem. Cztery błędy tej wersji brały się dokładnie stąd: utracone źródło zapisu przy rolecie, punkt przełączający, który stał się odczytowym, brakujący podpis przy `alias.0.Solar.Netz` i rozbieżność, którą warsztat sam wytworzył. Odczyt mieszka teraz w jednym miejscu; co robią z nim cztery miejsca wywołujące — porównują, zakładają, nadpisują — zostaje po ich stronie. Zachowanie się nie zmienia\n* Trzy drobiazgi zauważone w trakcie przebiegu. **RSSI** był wstępnie zaznaczony w pięciu szablonach Tasmota i punktów pomiarowych, ale nie w jedenastu szablonach Homematic — ta sama cecha urządzenia, dwie odpowiedzi zależnie od producenta; teraz jest wszędzie odznaczony, jak reszta diagnostyki. **Miejsce `MAP_URL`** we wzorcu odkurzacza nie dostawało roli, bo jego wyrażenie zaczyna się bez `^`, a wyprowadzenie wymagało obu kotwic; brakująca kotwica początkowa nie liczy się już przeciw miejscu. **A znacznik „domyślone”** w oknie zamiany wyglądał jak tekst przyklejony do nazwy punktu — jego wygląd wisiał na trzech poziomach nadrzędnych, których tam nie ma. Teraz jest pigułką jak na liście stanów i w podpowiedzi mówi, czy domysł wziął się z nazwy punktu, czy z roli\n* Przycisk zapisu w oknie szablonów sprawdza teraz także przy naciśnięciu, nie tylko przy rysowaniu. Jest ponownie oceniany przy opuszczeniu pola — kto wpisał otwierający nawias w podpowiedź nazwy i bez zwłoki kliknął „Zapisz szablon”, miał przed sobą niebieski przycisk i zapisywał szablon z zepsutym wyrażeniem. Pięć powodów blokady leży teraz w jednym miejscu, wspólnym dla rysowania i zapisu\n* Trzy miejsca mówią teraz, dlaczego nie mogą. **Przycisk zapisu w oknie szablonów** był szary i milczał — zablokować go może pięć powodów i żaden nie był podany; teraz wszystkie pasujące stoją przy przycisku i jako ramka w oknie. **Okno błędu przy usuwaniu** podawało tylko liczbę („1 operacji nie powiodło się”), a nie który identyfikator zawadza; przy zapisie taka lista była od dawna. **A powód, dla którego nie udało się utworzyć punktu wysyłki**, wisiał na przycisku, który to samo wywołanie zwrotne wyrzucało 120 ms później — teraz stoi u góry próby na sucho i przeżywa jej przebudowę\n* Jeśli typ punktu nie pasuje do jego miejsca we wzorcu, mówią to teraz wszystkie trzy miejsca — a nie tylko rozwinięty wiersz. Jeśli miejsce było **obowiązkowe**, wzorzec przestaje działać w ogóle i cała lista stała podbarwiona: przy Bastelzimmer_Licht wystarczyła zmiana SET z `boolean` na `mixed`, by osiem z ośmiu wierszy liczyło się jako „bez miejsca”, podczas gdy pole wzorca meldowało „✕ brak SET” — a SET tam był. Teraz stoi tam „✕ SET: typ mixed zamiast boolean”, a nad listą: „Wzorzec światła w tej chwili nie działa: SET wymaga boolean, ustawione jest mixed. Dlatego żaden wiersz nie ma miejsca.” Podbarwiany jest przy tym tylko ten wiersz, na którym to wisi — wcześniej rozświetlała się cała lista, a więc podbarwienie pokazywało skutek zamiast przyczyny.\n* Późna odpowiedź na `system.config` naprawdę przenosi teraz tryb eksperta. Zakładka poddaje się po 2,5 sekundy i pracuje dalej z językiem przeglądarki; jeśli odpowiedź przyjdzie później, język zostaje, jak jest (skok po opisaniu byłby gorszy), tryb eksperta zostaje przejęty, a drzewo raz przerysowane. To było zbudowane od dawna — tylko nad tym siedział strażnik z czasów wcześniejszych, który wychodził dokładnie w tym przypadku. Bez trybu brakowało wszystkich węzłów pod `system.*` i `enum.*`, a nigdzie nie było powiedziane, dlaczego\n* Okno zamiany zauważa, kiedy poziom wyżej pasuje lepiej. Drzewo wyboru pozwala wybrać każdy węzeł, pod którym wiszą punkty danych — tak być musi, bo przy płaskim adapterze kanał jest urządzeniem. W MQTT `stat`, `tele` i `cmnd` to jednak foldery tematów: kto tam wyląduje, odnajdzie mniej punktów, a blokada poprosi o usunięcie części. Warsztat liczy teraz także poziom nadrzędny i to mówi — „Poziom wyżej (…) cel znajduje 7 z 7 punktów, tutaj tylko 5” — z przyciskiem, który przestawia wybór. Nic nie jest zabronione\n* Lista urządzeń w oknie zamiany zostaje tam, gdzie była. Kto przewinął długą listę w dół i kliknął urządzenie, lądował z powrotem na początku i nie widział właśnie wybranej pozycji — wybór przebudowuje okno, a drzewo jest potem innym elementem. Jeśli wybrany wiersz mimo to wypadnie poza kadr, zostaje przyciągnięty do widoku. Nowe wyszukiwanie i świeżo otwarte okno nadal zaczynają od góry\n* Przy zamianie źródła cel zapisu nie liczy się już, jeśli pokrywa się ze źródłem odczytu. Wyszukiwanie próbuje jako ostatniej formy gołej nazwy punktu i `cmnd.POWER` znajdowało tak punkt stanu, który z tyłu też nazywa się `POWER` — alias pisałby potem na własne źródło odczytu. Przy zgadywaniu było to wyłapywane, przy trafieniu po ścieżce nie; ujawniało się, gdy jako nowe źródło wybrano podwęzeł zamiast urządzenia\n* Przy zamianie źródła punkt, który nie może pójść razem, zatrzymuje teraz zamianę, zamiast dać jej się załamać w połowie. Punkt z rozdzielonymi źródłami — czyta z `stat.POWER`, pisze do `cmnd.POWER` — potrzebuje przy nowym źródle obu. Gdy brakuje celu zapisu, ioBroker **nie** ma postaci, która wyrażałaby „czyta, nie pisze nigdzie”: goły identyfikator znaczy „pisz na punkt stanu”, `{read: X}` bez `write` js-controller odrzuca, a `common.write: false` nie chroni źródła (zmierzone: zapis na taki alias nadpisał źródło odczytu). Dlatego decyduje użytkownik — pole „usuń ten punkt przy zamianie” stoi także w tym przypadku, a „Zamień teraz” pozostaje zablokowane, dopóki nikt nie zdecydował; powód widnieje przy przycisku i jako wiersz w oknie. Wcześniej zamiana ruszała, załamywała się na kontrolerze i zostawiała alias w połowie na starym, a w połowie na nowym źródle\n* Jeśli przy zamianie zapis się nie powiedzie, **nic** nie zostaje usunięte. Dotąd usunięcia szły mimo to, a aliasowi przestawionemu dopiero w połowie brakowało potem jeszcze punktów. Przy przenoszeniu ta reguła obowiązuje od dawna\n* „Wszystkie punkty danych urządzenia” nie przesuwa już miejsca odkładania. Dla urządzenia z wieloma wyjściami warsztat zakłada folder, a w nim po kanale na każde wyjście. Przycisk buduje szkic od nowa i przekazywał mu przy tym tylko **gotowy cel**; `setzeZiel` czyta jego ostatni segment jako nazwę urządzenia — przy wielu wyjściach jest to jednak wyjście i lądowało dodatkowo w folderze. Każde naciśnięcie spychało miejsce odkładania o poziom głębiej i tak też było zapisywane: po trzech kliknięciach powstawały cztery foldery zamiast jednego (`…Garten-Ventilinsel.POWER2.POWER2.POWER2.POWER2`). Przycisk przekazuje teraz folder i nazwę osobno, tak jak od zawsze robi to przełącznik wyjść obok. Przy urządzeniu z jednym wyjściem nigdy to nie wystąpiło",
|
|
16
|
+
"uk": "* Чотири пункти з повного тестового прогону. **Ідентифікатор каналу** не очищався на шляху з кількома виходами: з імені каналу «Licht, Bar» js-controller мовчки робив `Licht_ Bar`, тоді як верстак показував «Licht, Bar» і вписував це до переліків — ідентифікатор, якого ніколи не було, і після видалення аліаса він залишався там як сміття. Тепер `ausgangName` очищає сам, а якщо два канали дають однакове ім'я, другий отримує `_2`. **Підпис** відрізнявся у двох поданнях: там, де ім'я точки збігається з іменем рядка, «Редагувати аліас» його показував, а «Створити аліас» лишав поле порожнім. **Список рядків** тепер рахує як дерево — `POWER2` перед `POWER10`. І **перелік, який верстак створив сам**, зникає й тоді, коли порожніє через зміну функції, а не лише при видаленні аліаса\n* Прибирання: «зробити з об'єкта аліаса рядок чернетки» було розписано п'ять разів — щоразу з тим самим правилом джерела запису та дещо іншим обрамленням. Чотири помилки цієї версії походили саме звідти: втрачене джерело запису на ролеті, перемикальна точка, що стала лише читальною, відсутній підпис у `alias.0.Solar.Netz` і розбіжність, яку верстак створив сам. Зчитування тепер живе в одному місці; що з ним роблять чотири викликачі — порівнюють, створюють, перезаписують — лишається за ними. Поведінка не змінилася\n* Три дрібниці, помічені під час прогону. **RSSI** був заздалегідь позначений у п'яти шаблонах Tasmota та точок вимірювання, але не в одинадцяти шаблонах Homematic — та сама властивість пристрою, дві відповіді залежно від виробника; тепер його знято скрізь, як і решту діагностики. **Місце `MAP_URL`** у зразку пилососа не отримувало ролі, бо його вираз починається без `^`, а виведення вимагало обох якорів; відсутній початковий якір більше не рахується проти місця. **А позначка «припущено»** у діалозі заміни виглядала як текст, приклеєний до імені точки — її оформлення трималося на трьох батьківських рівнях, яких там немає. Тепер це така сама пігулка, як у списку станів, і в підказці сказано, чи припущення зроблено за іменем точки, чи за роллю\n* Кнопка збереження в діалозі шаблонів тепер перевіряє й при натисканні, а не лише при малюванні. Її переоцінюють при виході з поля — хто вписував відкриту дужку в підказку імені й одразу тиснув «Зберегти шаблон», мав перед собою синю кнопку і зберігав шаблон із зіпсованим виразом. П'ять причин блокування лежать тепер в одному місці, спільному для малювання і збереження\n* Три місця тепер кажуть, чому вони не можуть. **Кнопка збереження в діалозі шаблонів** була сірою і мовчала — заблокувати її можуть п'ять причин, і жодної не було видно; тепер усі доречні стоять біля кнопки і як рамка в діалозі. **Діалог помилки при видаленні** називав лише число («1 операцій не вдалося»), а не те, який ідентифікатор застряг; при записі такий список був давно. **А причина, чому не вдалося створити точку надсилання**, висіла на кнопці, яку той самий зворотний виклик викидав за 120 мс — тепер вона стоїть угорі пробного прогону і переживає його перебудову\n* Якщо тип точки не пасує до її місця у зразку, про це тепер кажуть усі три місця — а не лише розгорнутий рядок. Якщо місце було **обов'язковим**, зразок перестає діяти зовсім, і весь список стояв підсвіченим: на Bastelzimmer_Licht вистачило змінити SET з `boolean` на `mixed`, і вісім рядків з восьми вважалися «без місця», тоді як поле зразка повідомляло «✕ SET бракує» — а SET був на місці. Тепер там написано «✕ SET: тип mixed замість boolean», а над списком: «Зразок світла зараз не діє: SET вимагає boolean, а встановлено mixed. Тому в жодного рядка немає місця.» Підсвічується при цьому лише той рядок, через який усе стоїть — раніше засвічувався весь список, і підсвітка показувала наслідок замість причини.\n* Пізня відповідь на `system.config` тепер справді переносить режим експерта. Вкладка здається за 2,5 секунди і працює далі з мовою браузера; якщо відповідь приходить пізніше, мова лишається як є (перемикання після підписів було б гірше), режим експерта переймається, а дерево один раз перемальовується. Це було збудовано давно — але над ним сидів вартовий із давніших часів, який виходив саме в цьому випадку. Без режиму бракувало всіх вузлів під `system.*` та `enum.*`, і ніде не було сказано чому\n* Діалог заміни помічає, коли рівнем вище пасує краще. Дерево вибору дозволяє взяти будь-який вузол, під яким висять точки даних — інакше не можна, бо в пласкому адаптері канал і є пристроєм. Але в MQTT `stat`, `tele` і `cmnd` — це теки тем: хто потрапить туди, знайде менше точок, і блокування попросить якісь прибрати. Верстак тепер рахує і батьківський рівень та каже про це — «Рівнем вище (…) ціль знаходять 7 із 7 точок, тут лише 5» — з кнопкою, яка перемикає вибір. Нічого не забороняється\n* Список пристроїв у діалозі заміни лишається там, де стояв. Хто прокручував довгий список униз і клацав пристрій, опинявся знову на початку і не бачив щойно обраного запису — вибір перебудовує діалог, і дерево після цього інший елемент. Якщо обраний рядок усе ж опиняється поза межами, його підводять у поле зору. Новий пошук і щойно відкритий діалог і далі починаються згори\n* При заміні джерела ціль запису більше не зараховується, якщо вона збігається з джерелом читання. Пошук пробує останньою формою голе ім'я точки, і `cmnd.POWER` знаходив так точку стану, яка ззаду теж зветься `POWER` — аліас після цього писав би у власне джерело читання. При вгадуванні це перехоплювалося, при збігу за шляхом — ні; ставало видно, коли новим джерелом обирали підвузол замість пристрою\n* При заміні джерела точка, яка не може перейти, тепер зупиняє заміну, а не дає їй зірватися посередині. Точці з роздільними джерелами — читає з `stat.POWER`, пише в `cmnd.POWER` — на новому джерелі потрібні обидва. Якщо цілі запису немає, в ioBroker **немає** форми, яка означала б «читає, не пише нікуди»: голий ідентифікатор значить «пиши на точку стану», `{read: X}` без `write` js-controller відхиляє, а `common.write: false` джерело не захищає (виміряно: запис у такий аліас перезаписав джерело читання). Тому вирішує користувач — галочка «видалити цю точку при заміні» стоїть і в цьому випадку, а «Замінити зараз» лишається заблокованою, доки ніхто не вирішив; причина видна біля кнопки і рядком у діалозі. Раніше заміна стартувала, зривалася на контролері й лишала аліас наполовину на старому, наполовину на новому джерелі\n* Якщо під час заміни зривається запис, **нічого** не видаляється. Досі видалення йшли попри це, і в аліаса, переведеного лише наполовину, ще й бракувало точок. При перенесенні це правило діє вже давно\n* «Усі точки даних пристрою» більше не зсуває місце зберігання. Для пристрою з кількома виходами верстак створює теку, а в ній по каналу на кожен вихід. Кнопка перебудовує чернетку і передавала при цьому лише **готову ціль**; `setzeZiel` читає її останній сегмент як ім'я пристрою — але за кількох виходів це вихід, і він додатково потрапляв до теки. Кожне натискання зсувало місце зберігання на рівень глибше, і так само воно й записувалося: після трьох клацань виникали чотири теки замість однієї (`…Garten-Ventilinsel.POWER2.POWER2.POWER2.POWER2`). Тепер кнопка передає теку та ім'я окремо, як це давно робить перемикач виходів поруч. У пристрою з одним виходом такого не траплялося ніколи",
|
|
17
|
+
"zh-cn": "* 完整测试流程带来的四件事。**通道标识**在多输出路径下没有被清理:对于通道名“Licht, Bar”,js-controller 悄悄生成 `Licht_ Bar`,而工作台显示的是“Licht, Bar”,并把它写进了枚举——一个从未存在过的标识;删除别名后,它还作为残留留在那里。现在 `ausgangName` 自己清理,若两个通道得出同一个名字,第二个会加上 `_2`。**标注**在两个视图中不一致:当数据点的名称与行名相同时,“编辑别名”显示它,“新建别名”却是空白字段。**行列表**现在与树排序一致——`POWER2` 排在 `POWER10` 之前。而**工作台自己建立的枚举**,在因功能变更而变空时也会一并删除,不再只限于删除别名时\n* 整理:“把别名对象变成草稿行”曾被写了五遍——每次都是同一条写入源规则,外围略有不同。本版本的四个错误正源于此:卷帘上丢失的写入源、一个从可开关变成只读的数据点、`alias.0.Solar.Netz` 缺失的标注,以及工作台自己制造的一处偏差。读取现在只在一处;四个调用方拿它做什么——比较、新建、覆盖——仍归它们自己。行为没有变化\n* 流程中发现的三件小事。**RSSI** 在五个 Tasmota 与测量点模板中默认勾选,在十一个 Homematic 模板中却没有——同一项设备属性,因厂商不同而有两种答案;现在与其余诊断项一样,处处不勾选。**吸尘器模式中的 `MAP_URL` 位置**得不到角色,因为它的表达式不以 `^` 开头,而推导要求两端锚点;缺少起始锚点不再算作该位置的减分。**而交换对话框中的“推测”标记**看上去像黏在点名后面的文字——它的样式依赖于三层父级,而那里并不存在。现在它和状态列表中一样是一枚药丸标签,并在提示中说明推测来自点名还是角色\n* 模板对话框中的保存按钮现在按下时也会检查,而不只在绘制时。离开字段时会重新判定——在名称提示里写下一个左括号后径直点击“保存模板”的人,面前是一个蓝色按钮,于是保存了一个表达式损坏的模板。五条锁定理由因此集中到一处,绘制与保存共用\n* 三处地方现在会说明为什么不行。**模板对话框中的保存按钮**原本灰着且沉默——有五条理由可以锁住它,却一条也没显示;现在所有适用的理由都出现在按钮旁,并以方框形式显示在对话框中。**删除时的错误对话框**只给出一个数字(“1 个操作失败”),没说是哪个标识卡住了;写入时早就有这份清单。**而发送点未能建立的原因**挂在一个按钮上,同一个回调 120 毫秒后就把它丢掉了——现在它位于试运行的顶部,并能挺过重建\n* 若某个数据点的类型与它在样板中的位置不符,现在三处地方都会说明——不再只有展开的那一行。若该位置是**必需**的,样板便完全不再生效,于是整份列表都被着色:在 Bastelzimmer_Licht 上,只要把 SET 从 `boolean` 改成 `mixed`,八行中就有八行算作“无位置”,而样板字段却报告“✕ 缺少 SET”——可 SET 明明在那里。现在写的是“✕ SET:类型为 mixed 而非 boolean”,列表上方则写着:“灯光样板目前不生效:SET 要求 boolean,而设置的是 mixed。因此没有任何一行有位置。”着色的只有真正出问题的那一行——从前整份列表都亮起来,于是着色显示的是结果而非原因。\n* 对 `system.config` 的迟到回答现在真的会把专家模式带过来。标签页在 2.5 秒后放弃,并继续使用浏览器语言;若回答随后才到,语言保持原样(在标注完成后再跳变会更糟),专家模式被接受,树重绘一次。这一切早就写好了——只是上面还坐着一个更早时期的守卫,恰好在这种情况下退出。没有该模式,`system.*` 与 `enum.*` 下的所有节点都会缺失,却没有任何地方说明原因\n* 交换对话框会注意到上一层更合适的情况。选择树允许选中任何其下挂有数据点的节点——必须如此,因为在扁平适配器中通道就是设备。但在 MQTT 中,`stat`、`tele` 和 `cmnd` 是主题文件夹:落到那里能找回的点更少,锁定机制便会要求移除一些。工作台现在也一并计算父级层级并加以说明——“上一层(…)7 个点中有 7 个能找到目标,这里只有 5 个”——并附带一个切换选择的按钮。什么都不禁止\n* 交换对话框中的设备列表会停在原处。在长列表中向下滚动并点击设备的人,之前会回到顶部,看不到刚选中的条目——选择会重建对话框,之后的树是另一个元素。若所选行仍落在视野之外,会把它带入视野。新的搜索和刚打开的对话框仍从顶部开始\n* 交换源时,写入目标若与读取源重合,便不再算数。搜索的最后一种形式是裸的点名,`cmnd.POWER` 因此会找到一个末尾同样叫 `POWER` 的状态点——别名随后就会写到自己的读取源上。猜测时已经拦住了,按路径命中时却没有;当新源选的是子节点而非设备时,这一点便会显现\n* 交换源时,无法一同迁移的数据点现在会中止交换,而不是让它中途失败。源分离的数据点——从 `stat.POWER` 读取、向 `cmnd.POWER` 写入——在新源处两者都需要。若缺少写入目标,ioBroker 中**没有**任何形式能表达“读取,但不写往任何地方”:裸标识意味着“写到状态点上”,不带 `write` 的 `{read: X}` 会被 js-controller 拒绝,而 `common.write: false` 并不能保护源(实测:对这样的别名写入会覆盖读取源)。因此由用户决定——“交换时移除该点”复选框在这种情况下也会出现,且在无人决定之前“立即交换”保持禁用;理由显示在按钮旁,并作为一行出现在对话框中。此前交换会启动、在控制器处失败,并让别名一半留在旧源、一半留在新源\n* 若交换过程中某次写入失败,将**不会**删除任何东西。此前删除仍会照常执行,于是一个才迁移了一半的别名还会丢失数据点。移动别名早就遵循这条规则\n* “设备的全部数据点”不再移动存放位置。对于有多个输出的设备,工作台会建立一个文件夹,并在其中为每个输出建立一个通道。该按钮会重建草稿,而当时只把**完整目标**传了过去;`setzeZiel` 把其最后一段读作设备名——但在多输出时那一段是输出,于是它又进了文件夹一层。每按一次,存放位置就深一级,写入时也是如此:点击三次便生成四个文件夹而不是一个(`…Garten-Ventilinsel.POWER2.POWER2.POWER2.POWER2`)。现在按钮分别传递文件夹和名称,就像旁边的输出切换一向所做的那样。单输出设备从未出现过这种情况"
|
|
18
|
+
},
|
|
6
19
|
"0.9.9": {
|
|
7
20
|
"en": "* The build source moved from `src/` to `src-admin/`. ioBroker reserves that name for frontend sources that are bundled into `admin/` and never reach the user, and the adapter checker skips such directories when it looks for missing dependencies. `@iobroker/type-detector` therefore stays in `devDependencies`, which is where it belongs: esbuild bakes it into `admin/detector.js` at build time and nothing loads it at runtime. Users receive the finished 71 KB file, not the 548 KB package (W5042)\n* The settings page now takes its translations from `admin/i18n/` — the dictionary ioBroker reads itself (`\"i18n\": true`) and that Weblate can work with. The eleven languages it already carried moved there unchanged; not a word was retranslated. The tab keeps its own dictionary, now at `admin/sprachen/`: 588 keys in German and English, with an unknown language falling back to English. Two dictionaries, two jobs — the name `i18n` is the one the adapter checker inspects, and it expects all eleven languages there (W5603, W5614, W5015)\n* The changelog entries for 0.9.7 and 0.9.8 are now complete in all eleven languages. Nine of them carried only a short summary — the English text for 0.9.7 ran to 3,000 characters with five headings and 22 items, the Russian one to 480 without any structure. A test now checks every entry for length, headings and item count against the English original (W1145)\n* Two developer-side additions, invisible in the adapter itself: `.vscode/settings.json` wires up the JSON schemas, so mistakes in `io-package.json` or `jsonConfig.json` show up while typing instead of in the adapter checker (S4036). And the GitHub Actions updates no longer run `monthly` — that would ask on the first of every month, at the same moment as everyone else; a cron schedule spreads the load while keeping the monthly rhythm (S8906)\n* The data type now follows the role. A pattern slot prescribes not only the role but also the type, and both sit in the same type-detector record — so picking a role sets the matching type as well. Where a slot allows several types nothing is set, and where it prescribes none any choice stays right. If the type does not fit the slot after all, the workbench says so instead of staying quiet: in the row (\"expects number\"), as a warning underneath, and in the pattern field, which now gives the reason — \"✕ CONSUMPTION: type mixed instead of number\" — rather than a bare \"does not fit\". Before, a state with the right role and the wrong type dropped out of the pattern silently, and the whole device was recognised as something lesser Where a role matches several slots that differ in type — the blind's travel direction sits on DIRECTION as a boolean and on DIRECTION_ENUM as a number — the workbench picks the slot whose type fits, and both forms count as right.\n* Saving a template no longer loses the write targets. Every actuator that keeps its own state writes to the same point it reads - a blind, a dimmer and a thermostat all use 1.LEVEL for both. Saving dropped the write path in exactly that case, and the resulting alias showed the position but could no longer be moved. Rows that only write, like the blind's STOP, disappeared altogether. With Tasmota it never showed, because there tele.STATE is read and cmnd.POWER is written. The device type in the template sheet was affected by a second slip: three patterns are named differently from their type (blinds/blind, mediaPlayer/media, levelSlider/slider), so a blind always claimed to have no type at all",
|
|
8
21
|
"de": "* Die Bauvorlage liegt jetzt in `src-admin/` statt in `src/`. Diesen Namen hat ioBroker für Frontend-Quellen vorgesehen, die nach `admin/` gebacken werden und beim Nutzer nie ankommen; der Adapterprüfer überspringt solche Ordner bei der Suche nach fehlenden Abhängigkeiten. `@iobroker/type-detector` bleibt deshalb in `devDependencies`, und dort gehört er hin: esbuild backt ihn beim Bauen in `admin/detector.js` ein, zur Laufzeit lädt ihn niemand. Ausgeliefert werden die fertigen 71 KB, nicht das 548-KB-Paket (W5042)\n* Die Einstellungsseite nimmt ihre Übersetzungen jetzt aus `admin/i18n/` — dem Wörterbuch, das ioBroker selbst liest (`\"i18n\": true`) und mit dem Weblate arbeiten kann. Die elf Sprachen, die sie ohnehin schon trug, sind unverändert dorthin umgezogen; kein Wort wurde neu übersetzt. Der Reiter behält sein eigenes Wörterbuch, jetzt unter `admin/sprachen/`: 588 Schlüssel auf Deutsch und Englisch, eine unbekannte Sprache fällt auf Englisch zurück. Zwei Wörterbücher, zwei Aufgaben — den Namen `i18n` sieht sich der Adapterprüfer an und erwartet dort alle elf Sprachen (W5603, W5614, W5015)\n* Die Changelog-Einträge zu 0.9.7 und 0.9.8 stehen jetzt vollständig in allen elf Sprachen. Neun davon trugen nur eine Kurzfassung — der englische Text zu 0.9.7 hat 3.000 Zeichen mit fünf Überschriften und 22 Punkten, der russische hatte 480 ohne jede Gliederung. Ein Test hält jeden Eintrag nun nach Länge, Überschriften und Punktzahl gegen das englische Original (W1145)\n* Zwei Zutaten für die Entwicklung, im Adapter selbst unsichtbar: `.vscode/settings.json` hängt die JSON-Schemata ein, sodass Fehler in `io-package.json` oder `jsonConfig.json` schon beim Tippen auffallen statt erst im Adapterprüfer (S4036). Und die Aktualisierung der GitHub Actions läuft nicht mehr `monthly` — das fragt am Monatsersten an, im selben Moment wie alle anderen; ein cron-Takt verteilt die Last und behält den monatlichen Rhythmus (S8906)\n* Der Datentyp folgt jetzt der Rolle. Ein Musterplatz gibt nicht nur die Rolle vor, sondern auch den Typ, und beides steht im selben Datensatz des type-detector — wer eine Rolle wählt, bekommt den passenden Typ also gleich mit. Wo ein Platz mehrere Typen zulässt, wird nichts gesetzt; wo er keinen vorgibt, bleibt jede Wahl richtig. Passt der Typ trotzdem nicht zum Platz, sagt es die Werkbank, statt zu schweigen: in der Zeile („erwartet number“), als Warnung darunter, und im Musterfeld, das jetzt den Grund nennt — „✕ CONSUMPTION: Typ mixed statt number“ — statt eines blanken „passt nicht“. Vorher fiel ein Punkt mit richtiger Rolle und falschem Typ lautlos aus dem Muster, und das ganze Gerät wurde als etwas Geringeres erkannt Trifft eine Rolle mehrere Plätze, die sich im Typ unterscheiden — die Fahrtrichtung des Rollladens sitzt als Wahrheitswert auf DIRECTION und als Zahl auf DIRECTION_ENUM —, wählt die Werkbank den Platz, dessen Typ passt, und beide Formen gelten als richtig.\n* Beim Speichern einer Vorlage gehen die Schreibziele nicht mehr verloren. Jeder Aktor, der seinen eigenen Zustand führt, schreibt auf denselben Punkt, den er liest — Rollladen, Dimmer und Thermostat benutzen dafür alle 1.LEVEL. Genau in diesem Fall warf das Speichern den Schreibweg weg, und der daraus gebaute Alias zeigte die Stellung an, liess sich aber nicht mehr verstellen. Zeilen, die nur schreiben — der STOP des Rollladens — fielen ganz heraus. Bei Tasmota fiel es nie auf, weil dort tele.STATE gelesen und cmnd.POWER geschrieben wird. Der Gerätetyp im Vorlagenblatt litt an einem zweiten Versehen: Drei Muster heissen anders als ihr Typ (blinds/blind, mediaPlayer/media, levelSlider/slider), und ein Rollladen behauptete deshalb, gar keinen Typ zu haben",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "Drugi alias na to samo źródło jest teraz zapowiadany, a nie tworzony po cichu — obok przycisk, który zamiast tego przenosi istniejący. Przełączenie na szablon, który nic nie znajduje, teraz działa. Zmienione role są oznaczone i można je cofnąć. Escape odrzuca w każdym polu paska celu. Nowa ikona adaptera.",
|
|
81
94
|
"uk": "Другий аліас на те саме джерело тепер оголошується, а не створюється мовчки — поруч кнопка, щоб натомість перенести наявний. Перемикання на шаблон, який нічого не знаходить, тепер працює. Змінені ролі позначені й їх можна повернути. Escape скасовує в кожному полі цільового рядка. Нова піктограма адаптера.",
|
|
82
95
|
"zh-cn": "同一数据源上的第二个别名现在会有提示,而不是被静默创建——旁边有按钮可改为移动已有的别名。切换到没有匹配项的模板现在也能生效。被调整过的角色会被标记,并可撤回。Escape 在目标栏的每个字段中都会放弃输入。新的适配器图标。"
|
|
83
|
-
},
|
|
84
|
-
"0.8.1": {
|
|
85
|
-
"en": "Published through npm trusted publishing (OIDC) — releases are signed with provenance from now on. No functional changes.",
|
|
86
|
-
"de": "Veröffentlichung über npm Trusted Publishing (OIDC) — Ausgaben sind ab jetzt mit Herkunftsnachweis signiert. Keine funktionalen Änderungen.",
|
|
87
|
-
"ru": "Публикация через npm trusted publishing (OIDC) — выпуски теперь подписаны с подтверждением происхождения. Функциональных изменений нет.",
|
|
88
|
-
"pt": "Publicação através de npm trusted publishing (OIDC) — as versões passam a ser assinadas com proveniência. Sem alterações funcionais.",
|
|
89
|
-
"nl": "Publicatie via npm trusted publishing (OIDC) — releases worden voortaan ondertekend met herkomst. Geen functionele wijzigingen.",
|
|
90
|
-
"fr": "Publication via npm trusted publishing (OIDC) — les versions sont désormais signées avec provenance. Aucun changement fonctionnel.",
|
|
91
|
-
"it": "Pubblicazione tramite npm trusted publishing (OIDC) — le versioni sono ora firmate con provenienza. Nessuna modifica funzionale.",
|
|
92
|
-
"es": "Publicación mediante npm trusted publishing (OIDC): las versiones se firman con procedencia a partir de ahora. Sin cambios funcionales.",
|
|
93
|
-
"pl": "Publikacja przez npm trusted publishing (OIDC) — wydania są od teraz podpisywane z poświadczeniem pochodzenia. Bez zmian funkcjonalnych.",
|
|
94
|
-
"uk": "Публікація через npm trusted publishing (OIDC) — випуски тепер підписані з підтвердженням походження. Функціональних змін немає.",
|
|
95
|
-
"zh-cn": "通过 npm 可信发布(OIDC)发布——此后的版本均带有来源签名。无功能变更。"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.alias-workbench",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.10",
|
|
4
4
|
"description": "Creates aliases the comfortable way — devices that vis, Alexa and the device adapter understand. Templates do the work: shipped ones for HomeMatic and Tasmota, your own for everything else. Live values while you build, dry run before anything is written.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Ricardo Hipp",
|