iobroker.alias-workbench 0.9.7 → 0.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -79
- package/admin/i18n/de.json +12 -588
- package/admin/i18n/en.json +12 -588
- package/admin/i18n/es.json +14 -0
- package/admin/i18n/fr.json +14 -0
- package/admin/i18n/it.json +14 -0
- package/admin/i18n/nl.json +14 -0
- package/admin/i18n/pl.json +14 -0
- package/admin/i18n/pt.json +14 -0
- package/admin/i18n/ru.json +14 -0
- package/admin/i18n/uk.json +14 -0
- package/admin/i18n/zh-cn.json +14 -0
- package/admin/js/detail.js +31 -6
- package/admin/js/erkennung.js +87 -0
- package/admin/js/musterwahl.js +30 -6
- package/admin/js/sprache.js +4 -2
- package/admin/js/vorlagenblatt.js +58 -17
- package/admin/jsonConfig.json +13 -157
- package/admin/sprachen/de.json +594 -0
- package/admin/sprachen/en.json +594 -0
- package/io-package.json +37 -102
- package/package.json +2 -2
package/io-package.json
CHANGED
|
@@ -1,98 +1,46 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "alias-workbench",
|
|
4
|
-
"version": "0.9.
|
|
4
|
+
"version": "0.9.9",
|
|
5
5
|
"news": {
|
|
6
|
-
"0.9.
|
|
7
|
-
"en": "
|
|
8
|
-
"de": "
|
|
9
|
-
"ru": "
|
|
10
|
-
"pt": "
|
|
11
|
-
"nl": "
|
|
12
|
-
"fr": "
|
|
13
|
-
"it": "
|
|
14
|
-
"es": "
|
|
15
|
-
"pl": "
|
|
16
|
-
"uk": "
|
|
17
|
-
"zh-cn": "
|
|
18
|
-
},
|
|
19
|
-
"0.9.6": {
|
|
20
|
-
"en": "**Display and flow**\n* “All data points” keeps the output and the manual choice. On a multi-output template at output 2 the rows of output 1 came back while the target still read `…Ausgang_2`; and if automatic matching had found nothing and you picked the template by hand, the click dropped you into raw mode with the choice gone\n* “Differs from the alias” now also shows in alias mode. The marker was handed the target, which is never set there — you are already standing on the alias. So it never appeared exactly where it says the most\n* Switching sources quickly no longer fetches the wrong value. The callback stored the value under whatever source was selected when it arrived — and since only missing values are fetched, it stayed that way\n* The source jump list never appears twice. It hangs off the page body so it survives an automatic redraw; the button is a different one afterwards, and the second click laid a second list over the first\n* A room is suggested even when it is the last segment. With a flat adapter such as `sonoff.0.Wohnzimmer` the search over the source path never ran at all\n* Object names follow the admin language. There were two readers for the same question, one fixed on German before English — so on an English admin, objects, rooms and functions showed up in German. And the name match now looks at every language: “Light” in the system failed to find the function “Licht” and created a duplicate beside it\n\n**MQTT and Tasmota**\n* An empty `custom` entry no longer takes anything down. `common.custom` can hold an entry whose value is `null` — ioBroker does not clean it up when an instance disappears. Reaching into it took the whole result view with it\n* `enabled: false` counts as switched off. The field did not appear in the reader at all: `{ enabled: false, publish: true }` counted as publishable although the instance does not serve that point\n* No more false “cannot publish” for ioBroker.mqtt and sonoff. Their objects carry the topic in `native` only; that was reported as a firm “no” instead of “unknown”, the chip was red, and “allow publishing” wrote the object back unchanged — a message that could not be cleared\n* “Answer received” only for a real answer. A `stat.RESULT` left retained from the day before yesterday was enough for the green feedback, even with the device switched off\n* `Vcc` and `Command` are not commands. `{\"Command\":\"Unknown\"}` — the reply to an unknown command — stood there as a missing command point, with a create button\n* Command names from foreign JSON no longer reach ids and topics unchecked. A key containing `#` would make a wildcard subscription, one containing `.` an extra level\n\n**Templates and devices**\n* The blind gets its STOP. A button press has no state to read, and that case was unknown to template application: without a read path the point dropped out — not a single blind alias ever had a STOP\n* ON_TIME finds its slot. Four templates carried the role `level.timer` while the slot requires `level.timer.off`, so the point ended up in the info device instead of the switching device\n* An explicit formula beats the field. Where a template gives both, the formula was discarded and a new one built from the field\n\n**Subscriptions and tree**\n* What is subscribed is what is read — not half the adapter. The patterns came from the display grouping: on a flat MQTT device that produced `mqtt-client.0.*` with over three hundred objects on a single alias. It is now the channels of the actual sources, branches of the same device folded into one pattern, and where even that is too wide, the sources one by one\n* Adapter and instance roots can no longer be selected. `mqtt-client.0` is not a device; selecting it would have subscribed the whole namespace\n* Dark admin themes are recognised. The detection knew four names; `blue` and `colored` fell through and landed on the system setting\n* A late answer to `system.config` still counts. After 2.5 seconds it carries on without one — the answer arriving later was discarded entirely, and without it every expert object was missing from the tree\n\n**Housekeeping**\n* The checks touch nothing again. One of them wrote an object from inside the drawing path\n* The delete dialog warns about channels of their own below the target. The hint spoke only of “data points below”\n* Four dead language keys removed — and the test now checks both directions, not just code → JSON",
|
|
21
|
-
"de": "**Anzeige und Ablauf**\n* „Alle Datenpunkte“ hält Ausgang und Handwahl fest. An einer Mehrfachvorlage mit Ausgang 2 kamen die Zeilen von Ausgang 1 zurück, während das Ziel weiter `…Ausgang_2` hieß; und hatte die Automatik nichts gefunden und man die Vorlage von Hand gewählt, landete man nach dem Klick im Rohmodus — die Handwahl war weg\n* „Weicht vom Alias ab“ erscheint jetzt auch im Aliasmodus. Die Marke bekam das Ziel, und das ist dort nie gesetzt: Man steht ja schon auf dem Alias. Sie erschien also ausgerechnet dort nie, wo sie am meisten sagt\n* Ein schneller Quellenwechsel holt keinen fremden Wert mehr. Der Nachlade-Rückruf legte den Wert unter der Quelle ab, die beim Eintreffen eingestellt war — und da nur geholt wird, was noch fehlt, blieb es dabei\n* Die Quellen-Sprungliste steht nie doppelt. Sie hängt am Seitenkörper, damit sie ein automatisches Neuzeichnen überlebt; der Knopf ist danach aber ein anderer, und der zweite Klick legte eine zweite Liste über die erste\n* Ein Raum wird auch dann vorgeschlagen, wenn er das letzte Segment ist. Bei einem flachen Adapter wie `sonoff.0.Wohnzimmer` lief die Suche über den Quellenpfad kein einziges Mal\n* Objektnamen folgen der Adminsprache. Es gab zwei Leser für dieselbe Frage, einer nahm fest Deutsch vor Englisch — auf einem englischen Admin standen Objekte, Räume und Funktionen deshalb deutsch da. Und der Namensabgleich sieht jetzt alle Sprachfassungen an: „Light“ im Bestand fand die Funktion „Licht“ nicht und legte einen Doppelgänger daneben\n\n**MQTT und Tasmota**\n* Ein leerer `custom`-Eintrag legt nichts mehr lahm. `common.custom` kann einen Eintrag mit dem Wert `null` tragen — ioBroker räumt ihn nicht weg, wenn eine Instanz verschwindet. Der Zugriff darauf riss die ganze Ergebnisansicht mit\n* `enabled: false` gilt als abgeschaltet. Der Bezeichner kam im Leser gar nicht vor: Ein Eintrag `{ enabled: false, publish: true }` galt als sendefähig, obwohl die Instanz den Punkt nicht bedient\n* Kein falsches „kann nicht senden“ mehr bei ioBroker.mqtt und sonoff. Deren Objekte tragen das Thema nur in `native`; dafür stand fest „nein“ statt „unbekannt“, der Chip war rot, und der Knopf „senden erlauben“ schrieb das Objekt unverändert zurück — eine Meldung, die sich nicht abstellen ließ\n* „Antwort erhalten“ nur bei einer echten Antwort. Ein `stat.RESULT`, das retained von vorgestern dasteht, reichte für die grüne Rückmeldung, auch wenn das Gerät aus ist\n* `Vcc` und `Command` sind keine Befehle. `{\"Command\":\"Unknown\"}` — die Antwort auf einen unbekannten Befehl — stand als fehlender Sendepunkt da, mit Anlegen-Knopf\n* Befehlsnamen aus fremdem JSON kommen nicht mehr ungeprüft in Kennung und Thema. Ein Schlüssel mit `#` ergäbe ein Wildcard-Abo, einer mit `.` eine zusätzliche Ebene\n\n**Vorlagen und Geräte**\n* Der Rollladen bekommt seinen STOP. Ein Tastendruck hat keinen Zustand zum Lesen, und genau diesen Fall kannte das Anwenden nicht: Ohne Lesepfad fiel der Punkt heraus — kein einziger Rollladen-Alias hatte je einen STOP\n* ON_TIME findet seinen Platz. Vier Vorlagen führten die Rolle `level.timer`, der Platz verlangt `level.timer.off`; der Punkt landete deshalb im info-Gerät statt am Schaltgerät\n* Eine ausdrückliche Formel gewinnt gegen das Feld. Wo eine Vorlage beides angibt, wurde die Formel verworfen und aus dem Feld eine neue gebaut\n\n**Abos und Baum**\n* Abonniert wird, was gelesen wird — nicht der halbe Adapter. Die Muster kamen aus der Anzeige-Verteilung: Bei einem flachen MQTT-Gerät wurde daraus `mqtt-client.0.*` mit über dreihundert Objekten an einem einzigen Alias. Jetzt sind es die Kanäle der tatsächlichen Quellen, Sparten desselben Geräts zu einem Muster zusammengefasst, und wo auch das zu breit wäre, die Quellen einzeln\n* Adapter- und Instanzwurzeln sind nicht mehr wählbar. `mqtt-client.0` ist kein Gerät; die Auswahl hätte den ganzen Namensraum abonniert\n* Dunkle Admin-Themen werden erkannt. Die Erkennung kannte vier Namen; `blue` und `colored` fielen durch und landeten bei der Systemeinstellung\n* Eine späte Antwort auf `system.config` gilt trotzdem. Nach 2,5 Sekunden geht es ohne weiter — die Antwort danach wurde ganz verworfen, und ohne sie fehlten alle Expertenobjekte im Baum\n\n**Aufräumen**\n* Die Prüfungen fassen wieder nichts an. Eine von ihnen schrieb aus dem Zeichenpfad heraus ein Objekt\n* Der Löschdialog warnt vor eigenständigen Kanälen unterhalb des Ziels. Der Hinweistext sprach nur von „Datenpunkten darunter“\n* Vier tote Sprachschlüssel entfernt — und der Test prüft jetzt beide Richtungen, nicht nur Code → JSON",
|
|
22
|
-
"ru": "Двадцать две ошибки в отображении, MQTT, шаблонах и подписках: «все точки данных» сохраняют выход и ручной выбор, метка «отличается от алиаса» снова видна в режиме алиасов, пустая запись custom больше ничего не ломает, enabled: false учитывается, ответ Tasmota засчитывается только настоящий, ролик получает свой STOP, ON_TIME находит своё место, подписка охватывает только читаемые источники, а не половину адаптера, корни адаптеров больше не выбираются, тёмные темы админки распознаются.",
|
|
23
|
-
"pt": "Vinte e dois erros na apresentação, MQTT, modelos e subscrições: “todos os pontos de dados” mantêm a saída e a escolha manual, a marca “difere do alias” volta a aparecer no modo alias, uma entrada custom vazia já não derruba nada, enabled: false é respeitado, só uma resposta verdadeira do Tasmota conta, o estore recebe o seu STOP, ON_TIME encontra o seu lugar, subscreve-se o que se lê e não meio adaptador, as raízes de adaptador deixam de ser selecionáveis e os temas escuros do admin são reconhecidos.",
|
|
24
|
-
"nl": "Tweeëntwintig fouten in weergave, MQTT, sjablonen en abonnementen: “alle datapunten” behouden uitgang en handmatige keuze, de markering “wijkt af van de alias” verschijnt weer in aliasmodus, een lege custom-vermelding legt niets meer plat, enabled: false telt, alleen een echt antwoord van Tasmota telt, het rolluik krijgt zijn STOP, ON_TIME vindt zijn plek, er wordt geabonneerd op wat gelezen wordt in plaats van op een halve adapter, adapterwortels zijn niet meer selecteerbaar en donkere adminthema's worden herkend.",
|
|
25
|
-
"fr": "Vingt-deux erreurs dans l'affichage, MQTT, les modèles et les abonnements : « tous les points de données » conservent la sortie et le choix manuel, la marque « diffère de l'alias » réapparaît en mode alias, une entrée custom vide ne casse plus rien, enabled: false est pris en compte, seule une vraie réponse Tasmota compte, le volet reçoit son STOP, ON_TIME trouve sa place, on s'abonne à ce qu'on lit et non à la moitié d'un adaptateur, les racines d'adaptateur ne sont plus sélectionnables et les thèmes sombres de l'admin sont reconnus.",
|
|
26
|
-
"it": "Ventidue errori in visualizzazione, MQTT, modelli e sottoscrizioni: «tutti i punti dati» mantengono uscita e scelta manuale, il segno «differisce dall'alias» torna a comparire in modalita alias, una voce custom vuota non blocca piu nulla, enabled: false viene rispettato, conta solo una vera risposta Tasmota, la tapparella ottiene il suo STOP, ON_TIME trova il suo posto, si sottoscrive cio che si legge e non mezzo adattatore, le radici degli adattatori non sono piu selezionabili e i temi scuri dell'admin vengono riconosciuti.",
|
|
27
|
-
"es": "Veintidos errores en la presentacion, MQTT, plantillas y suscripciones: «todos los puntos de datos» conservan la salida y la eleccion manual, la marca «difiere del alias» vuelve a aparecer en modo alias, una entrada custom vacia ya no tumba nada, enabled: false cuenta, solo una respuesta real de Tasmota cuenta, la persiana recibe su STOP, ON_TIME encuentra su sitio, se suscribe lo que se lee y no medio adaptador, las raices de adaptador ya no son seleccionables y los temas oscuros del admin se reconocen.",
|
|
28
|
-
"pl": "Dwadziescia dwa bledy w wyswietlaniu, MQTT, szablonach i subskrypcjach: 'wszystkie punkty danych' zachowuja wyjscie i wybor reczny, znacznik 'rozni sie od aliasu' znow pojawia sie w trybie aliasow, pusty wpis custom niczego juz nie wywraca, enabled: false jest respektowane, liczy sie tylko prawdziwa odpowiedz Tasmoty, roleta dostaje swoj STOP, ON_TIME znajduje swoje miejsce, subskrybowane jest to, co czytane, a nie pol adaptera, korzenie adapterow nie sa juz wybieralne, a ciemne motywy admina sa rozpoznawane.",
|
|
29
|
-
"uk": "Двадцять дві помилки у відображенні, MQTT, шаблонах і підписках: «усі точки даних» зберігають вихід і ручний вибір, позначка «відрізняється від аліаса» знову видима в режимі аліасів, порожній запис custom більше нічого не ламає, enabled: false враховується, зараховується лише справжня відповідь Tasmota, ролета отримує свій STOP, ON_TIME знаходить своє місце, підписка охоплює лише те, що читається, а не пів адаптера, корені адаптерів більше не вибираються, а темні теми адміна розпізнаються.",
|
|
30
|
-
"zh-cn": "修复了显示、MQTT、模板与订阅中的二十二个问题:“所有数据点”保留输出与手动选择,“与别名不符”标记在别名模式下重新出现,空的 custom 条目不再导致崩溃,enabled: false 生效,只有真实的 Tasmota 应答才算数,卷帘获得它的 STOP,ON_TIME 找到对应槽位,订阅范围只覆盖真正读取的来源而非半个适配器,适配器根节点不再可选,深色管理主题也能被识别。"
|
|
31
|
-
},
|
|
32
|
-
"0.9.5": {
|
|
33
|
-
"en": "* A broken name hint no longer takes down the whole source view. The text was evaluated as a regular expression unchecked, although neither the template sheet nor the save dialog validates it: after saving `Lampe (Bad`, template matching threw on **every** device selection, no caller caught it, and the right-hand side stayed empty — repairable only through the instance configuration by hand. An unusable expression now counts as “no match” and is flagged in red at the field. The same goes for the nested form `(a+)+`, where the expression engine stalls: a measured 3196 ms for one device name, now none\n* The formula of a fallback source survives updating a template. It was stored under `formel` while every reader looks for `leseformel` — so updating from a device silently dropped it. With `tasmota-steckdose` the consequence was that on devices without `stat.POWER` the boolean alias ended up on the raw JSON text of `tele.STATE` instead of on `POWER`\n* A device type this detector does not know no longer throws. The offered pattern list was filtered, the **selected** type was not — it comes from the template unchecked. An imported template naming a pattern from a newer type-detector made the pattern picker throw, and the draft was never drawn at all\n* Importing now checks more than id and states. `erkennung.erforderlich` as a string instead of a list made template matching throw on **every** device afterwards; a missing `name` threw as soon as the sheet opened. And “import and save” was on screen long before that — you could save a template that then made the tab unusable. `erkennung`, `erforderlich`/`verboten`, `inhalt`, `name`, the name hint and the device type are checked now; a single string that unambiguously means a list is turned into one rather than rejected\n* A hand-typed id no longer replaces someone else's template. Ids were only checked for collisions when switching modes, not after typing — and saving replaces without asking on a matching id, in “new” mode even with version 1. An own template at v7 silently became a different one at v1. The reason is now shown in red at the field and saving is blocked\n* The `%N%` placeholder only hits the output number now. Replacement went purely by trailing digit: on a multi-output device at output 2 the IP row from `tele.INFO2` became `tele.INFO%N%` — and at output 1 that same row reported a foreign output, with “drop the others” throwing it out. Only what actually carries the output becomes a placeholder now: what the template already held as `%N%`, the prefix from `kanalname`, and what appears more than once with the same number",
|
|
34
|
-
"de": "* Ein kaputter Namenshinweis legt nicht mehr die ganze Quellenansicht lahm. Der Text wurde ungeprüft als regulärer Ausdruck ausgewertet, obwohl ihn weder das Vorlagenblatt noch der Speichern-Dialog prüft: Nach dem Speichern von `Lampe (Bad` warf die Vorlagenprüfung bei **jeder** Geräteauswahl, kein Aufrufer fing das, und die rechte Seite blieb leer — zu reparieren nur noch über die Instanzkonfiguration von Hand. Jetzt zählt ein unbrauchbarer Ausdruck als „trifft nicht“ und wird im Feld rot gemeldet. Dasselbe gilt für die verschachtelte Form `(a+)+`, an der die Ausdrucks-Maschine hängenbleibt: gemessene 3196 ms für einen Gerätenamen, jetzt keine\n* Die Formel einer Ersatzquelle überlebt das Aktualisieren einer Vorlage. Sie wurde unter `formel` abgelegt, gelesen wird aber `leseformel` — beim Aktualisieren aus einem Gerät ging sie damit still verloren. Folge bei `tasmota-steckdose`: An Geräten ohne `stat.POWER` landete der boolesche Alias danach auf dem rohen JSON-Text von `tele.STATE` statt auf `POWER`\n* Ein Gerätetyp, den dieser Detector nicht kennt, wirft nicht mehr. Die angebotene Musterliste war gefiltert, der **gewählte** Typ nicht — er kommt ungeprüft aus der Vorlage. Eine eingelesene Vorlage mit dem Musternamen eines neueren type-detector ließ die Musterwahl werfen, und der Entwurf wurde gar nicht erst gezeichnet\n* Das Einlesen prüft jetzt mehr als Kennung und Zustände. `erkennung.erforderlich` als Text statt als Liste ließ die Vorlagenprüfung danach an **jedem** Gerät werfen; ein fehlendes `name` warf schon beim Öffnen im Blatt. Und „Einlesen und speichern“ stand zu diesem Zeitpunkt längst da — man konnte eine Vorlage speichern, die den Reiter danach unbrauchbar machte. Geprüft werden jetzt `erkennung`, `erforderlich`/`verboten`, `inhalt`, `name`, der Namenshinweis und der Gerätetyp; ein einzelner Text, der eindeutig eine Liste meint, wird zu einer gemacht statt abgewiesen\n* Eine von Hand eingetippte Kennung ersetzt keine fremde Vorlage mehr. Auf freie Kennungen wurde nur beim Umschalten geprüft, nicht nach der Handeingabe — und gespeichert wird bei gleicher Kennung ohne Rückfrage, im Modus „neu“ sogar mit Version 1. Aus einer eigenen Vorlage v7 wurde so still eine ganz andere v1. Jetzt steht der Grund rot am Feld und das Speichern ist gesperrt\n* Der Platzhalter `%N%` trifft nur noch die Ausgangsnummer. Ersetzt wurde rein nach Endziffer: An einem Mehrfachgerät mit Ausgang 2 wurde damit auch die IP-Zeile aus `tele.INFO2` zu `tele.INFO%N%` — und an Ausgang 1 meldete dieselbe Zeile einen fremden Ausgang, „Andere weglassen“ warf sie hinaus. Zum Platzhalter wird jetzt nur, was den Ausgang trägt: was die Vorlage im Original schon mit `%N%` führte, der Vorspann aus `kanalname` und was mit derselben Nummer mehrfach vorkommt",
|
|
35
|
-
"ru": "Шесть ошибок в логике шаблонов: неверная подсказка по имени больше не выводит из строя весь просмотр источников (включая вложенную форму (a+)+), формула запасного источника переживает обновление шаблона, неизвестный тип устройства не вызывает исключения, импорт проверяет больше, чем идентификатор и состояния, вручную введённый идентификатор не заменяет чужой шаблон, а подстановка %N% затрагивает только номер выхода.",
|
|
36
|
-
"pt": "Seis erros na lógica de modelos: uma dica de nome inválida já não inutiliza toda a vista de fontes (incluindo a forma aninhada (a+)+), a fórmula de uma fonte alternativa sobrevive à atualização do modelo, um tipo de dispositivo desconhecido já não lança erro, a importação verifica mais do que id e estados, um id escrito à mão não substitui um modelo alheio, e o marcador %N% só atinge o número da saída.",
|
|
37
|
-
"nl": "Zes fouten in de sjabloonlogica: een kapotte naamhint legt niet langer de hele bronweergave plat (ook de geneste vorm (a+)+), de formule van een reservebron overleeft het bijwerken van een sjabloon, een onbekend apparaattype gooit geen fout meer, het inlezen controleert meer dan id en toestanden, een met de hand ingetypte id vervangt geen andermans sjabloon, en de plaatshouder %N% raakt alleen het uitgangsnummer.",
|
|
38
|
-
"fr": "Six erreurs dans la logique des modèles : un indice de nom invalide ne paralyse plus toute la vue des sources (y compris la forme imbriquée (a+)+), la formule d'une source de repli survit à la mise à jour d'un modèle, un type d'appareil inconnu ne lève plus d'erreur, l'import vérifie plus que l'identifiant et les états, un identifiant saisi à la main ne remplace plus le modèle d'un autre, et le marqueur %N% ne touche que le numéro de sortie.",
|
|
39
|
-
"it": "Sei errori nella logica dei modelli: un suggerimento di nome rotto non blocca piu l'intera vista delle sorgenti (compresa la forma annidata (a+)+), la formula di una sorgente di riserva sopravvive all'aggiornamento del modello, un tipo di dispositivo sconosciuto non solleva piu eccezioni, l'importazione controlla piu di id e stati, un id digitato a mano non sostituisce il modello altrui, e il segnaposto %N% colpisce solo il numero dell'uscita.",
|
|
40
|
-
"es": "Seis errores en la logica de plantillas: una pista de nombre rota ya no inutiliza toda la vista de fuentes (incluida la forma anidada (a+)+), la formula de una fuente alternativa sobrevive a la actualizacion de la plantilla, un tipo de dispositivo desconocido ya no lanza error, la importacion comprueba mas que el id y los estados, un id escrito a mano no reemplaza la plantilla de otro, y el marcador %N% solo afecta al numero de salida.",
|
|
41
|
-
"pl": "Szesc bledow w logice szablonow: zepsuta wskazowka nazwy nie unieruchamia juz calego widoku zrodel (takze forma zagniezdzona (a+)+), formula zrodla zapasowego przetrwa aktualizacje szablonu, nieznany typ urzadzenia nie rzuca juz wyjatku, wczytywanie sprawdza wiecej niz identyfikator i stany, recznie wpisany identyfikator nie zastepuje cudzego szablonu, a symbol %N% dotyczy tylko numeru wyjscia.",
|
|
42
|
-
"uk": "Шість помилок у логіці шаблонів: зіпсована підказка імені більше не виводить з ладу весь перегляд джерел (зокрема вкладена форма (a+)+), формула запасного джерела переживає оновлення шаблону, невідомий тип пристрою більше не кидає виняток, зчитування перевіряє більше, ніж ідентифікатор і стани, введений вручну ідентифікатор не замінює чужий шаблон, а підстановка %N% стосується лише номера виходу.",
|
|
43
|
-
"zh-cn": "修复了模板逻辑中的六个问题:错误的名称提示不再让整个源视图瘫痪(包括嵌套形式 (a+)+),备用来源的公式在更新模板时不再丢失,未知的设备类型不再抛出异常,导入时的检查不再只看标识和数据点,手工输入的标识不会覆盖他人的模板,占位符 %N% 只作用于输出编号。"
|
|
44
|
-
},
|
|
45
|
-
"0.9.4": {
|
|
46
|
-
"en": "* The tab works again after a dropped connection. It does not load socket.io but the admin's WebSocket shim — and there `connect` fires exactly once per page lifetime, only `reconnect` afterwards. Nobody listened for that, and the shim renews no subscription on its own. After every outage — admin restart, network hiccup, standby — neither object nor state changes arrived, and the dot in the header stayed on “disconnected” although the connection had long been back. `reconnect` is now handled: the display goes back to “connected”, every subscription is renewed and the objects are re-read — anything could have changed while disconnected, and nobody was watching\n* The template mode no longer rebuilds itself every second. Selecting a device with live values and switching to the templates tab rebuilt the whole sheet every 700 ms, including a trial run across all candidates and all templates — the selection deliberately survives the mode switch, but there is no state list on the right any more\n* Where the selection goes, its subscriptions now go too. Unsubscribing only happened when selecting the next node; the four other paths — switching mode, collapsing a branch, leaving expert mode, deleting an alias — unsubscribed from nothing. A subscription then ran on a device no longer shown, and the header counter still claimed “one subscription”\n* Switching nodes while loading no longer leaves the caller hanging. The callback never arrived in that case: “running” stayed on the button forever, and the dry run meant to open after creating missing command points never opened. Twelve seconds of waiting on a SetOption59 query is ample opportunity for that",
|
|
47
|
-
"de": "* Nach einem Verbindungsabbruch arbeitet der Reiter wieder. Er lädt nicht socket.io, sondern den WebSocket-Shim des Admin — und dort feuert `connect` genau einmal pro Seitenleben, danach nur noch `reconnect`. Das hörte niemand, und der Shim erneuert von sich aus kein einziges Abo. Nach jedem Aussetzer — Admin-Neustart, Netzwerkhänger, Standby — kamen weder Objekt- noch Wertänderungen an, und der Punkt in der Kopfzeile blieb auf „getrennt“ stehen, obwohl die Verbindung längst wieder stand. Jetzt wird `reconnect` gehört: die Anzeige geht auf „verbunden“, alle Abos werden erneuert und der Bestand neu gelesen — während der Trennung kann sich alles geändert haben, und mitbekommen hat es niemand\n* Der Vorlagenmodus baut sich nicht mehr im Sekundentakt neu auf. Wer ein Gerät mit laufenden Werten gewählt hatte und in den Vorlagen-Tab wechselte, baute dort alle 700 ms das ganze Blatt neu, samt Probelauf über alle Kandidaten und alle Vorlagen — die Auswahl bleibt beim Moduswechsel absichtlich stehen, aber rechts steht dann gar keine Zustandsliste mehr\n* Wo die Auswahl fällt, fallen jetzt auch ihre Abos. Abgemeldet wurde nur beim Auswählen des nächsten Knotens; die vier anderen Wege — Moduswechsel, Zweig zuklappen, Expertenmodus abschalten, Alias löschen — meldeten nichts ab. Danach lief ein Abo auf ein Gerät, das rechts gar nicht mehr stand, und der Zähler in der Kopfzeile behauptete weiter „ein Abo“\n* Ein Knotenwechsel während des Ladens lässt den Aufrufer nicht mehr hängen. Der Rückruf kam in diesem Fall nie: „läuft“ blieb für immer am Knopf stehen, und der Trockenlauf, der nach dem Anlegen fehlender Sendepunkte aufgehen soll, ging nie auf. Zwölf Sekunden Wartezeit bei einer SetOption59-Abfrage sind reichlich Gelegenheit dafür",
|
|
48
|
-
"ru": "Соединение и подписки: после разрыва связи вкладка снова работает (обрабатывается reconnect, подписки возобновляются, объекты перечитываются), режим шаблонов больше не перестраивается каждую секунду, подписки снимаются везде, где снимается выбор, а смена узла во время загрузки больше не оставляет вызывающего в подвешенном состоянии.",
|
|
49
|
-
"pt": "Ligação e subscrições: após uma quebra de ligação o separador volta a funcionar (reconnect é tratado, as subscrições são renovadas, os objetos relidos), o modo de modelos já não se reconstrói a cada segundo, as subscrições caem onde cai a seleção, e mudar de nó durante o carregamento já não deixa quem chamou à espera.",
|
|
50
|
-
"nl": "Verbinding en abonnementen: na een verbroken verbinding werkt het tabblad weer (reconnect wordt afgehandeld, abonnementen worden vernieuwd, objecten opnieuw gelezen), de sjabloonmodus bouwt zich niet meer elke seconde opnieuw op, abonnementen vervallen waar de selectie vervalt, en van knooppunt wisselen tijdens het laden laat de aanroeper niet meer hangen.",
|
|
51
|
-
"fr": "Connexion et abonnements : après une coupure, l'onglet fonctionne de nouveau (reconnect est traité, les abonnements sont renouvelés, les objets relus), le mode modèles ne se reconstruit plus chaque seconde, les abonnements tombent là où tombe la sélection, et changer de nœud pendant le chargement ne laisse plus l'appelant en attente.",
|
|
52
|
-
"it": "Connessione e sottoscrizioni: dopo un'interruzione la scheda funziona di nuovo (reconnect viene gestito, le sottoscrizioni rinnovate, gli oggetti riletti), la modalita modelli non si ricostruisce piu ogni secondo, le sottoscrizioni cadono dove cade la selezione, e cambiare nodo durante il caricamento non lascia piu appeso il chiamante.",
|
|
53
|
-
"es": "Conexion y suscripciones: tras una caida la pestana vuelve a funcionar (se atiende reconnect, se renuevan las suscripciones, se releen los objetos), el modo de plantillas ya no se reconstruye cada segundo, las suscripciones caen donde cae la seleccion, y cambiar de nodo durante la carga ya no deja colgado a quien llama.",
|
|
54
|
-
"pl": "Polaczenie i subskrypcje: po zerwaniu polaczenia karta znow dziala (reconnect jest obslugiwany, subskrypcje odnawiane, obiekty wczytywane ponownie), tryb szablonow nie przebudowuje sie juz co sekunde, subskrypcje znikaja tam gdzie znika wybor, a zmiana wezla podczas ladowania nie zostawia juz wywolujacego w zawieszeniu.",
|
|
55
|
-
"uk": "З'єднання та підписки: після розриву вкладка знову працює (reconnect обробляється, підписки поновлюються, об'єкти перечитуються), режим шаблонів більше не перебудовується щосекунди, підписки знімаються там, де знімається вибір, а зміна вузла під час завантаження більше не залишає того, хто викликав, у підвішеному стані.",
|
|
56
|
-
"zh-cn": "连接与订阅:断线后标签页恢复工作(处理 reconnect、重新订阅、重新读取对象),模板模式不再每秒重建,选择取消时订阅一并取消,加载期间切换节点不再让调用方永远等待。"
|
|
6
|
+
"0.9.9": {
|
|
7
|
+
"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
|
+
"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",
|
|
9
|
+
"ru": "* Исходники сборки перенесены из `src/` в `src-admin/`. ioBroker закрепил это имя за исходниками интерфейса, которые собираются в `admin/` и никогда не попадают к пользователю, а проверка адаптеров пропускает такие каталоги при поиске отсутствующих зависимостей. Поэтому `@iobroker/type-detector` остаётся в `devDependencies` — именно там ему и место: esbuild встраивает его в `admin/detector.js` при сборке, во время работы его никто не загружает. Пользователь получает готовый файл в 71 КБ, а не пакет в 548 КБ (W5042)\n* Страница настроек берёт переводы из `admin/i18n/` — словаря, который ioBroker читает сам (`\"i18n\": true`) и с которым умеет работать Weblate. Одиннадцать языков, которые она и так несла в себе, переехали туда без изменений: ни одно слово не переводилось заново. У вкладки остаётся свой словарь, теперь в `admin/sprachen/`: 588 ключей на немецком и английском, неизвестный язык откатывается к английскому. Два словаря — две задачи: имя `i18n` проверяет контролёр адаптеров и ждёт там все одиннадцать языков (W5603, W5614, W5015)\n* Записи списка изменений для 0.9.7 и 0.9.8 теперь полны на всех одиннадцати языках. У девяти из них была лишь краткая выжимка: английский текст к 0.9.7 занимает 3 000 знаков с пятью заголовками и 22 пунктами, русский — 480 знаков вовсе без структуры. Новый тест сверяет каждую запись с английским оригиналом по длине, заголовкам и числу пунктов (W1145)\n* Две мелочи для разработки, в самом адаптере невидимые: `.vscode/settings.json` подключает JSON-схемы, так что ошибки в `io-package.json` или `jsonConfig.json` видны уже при наборе, а не только в проверке адаптеров (S4036). А обновление GitHub Actions больше не идёт по `monthly` — это запрос первого числа месяца, одновременно со всеми остальными; расписание cron распределяет нагрузку и сохраняет месячный ритм (S8906)\n* Тип данных теперь следует за ролью. Место в шаблоне задаёт не только роль, но и тип, и оба хранятся в одной записи type-detector — выбирая роль, вы сразу получаете нужный тип. Там, где место допускает несколько типов, не ставится ничего; там, где не задаёт ни одного, любой выбор остаётся верным. Если тип всё же не подходит месту, верстак об этом говорит, а не молчит: в строке («ожидается number»), предупреждением под ней и в поле шаблона, которое теперь называет причину — «✕ CONSUMPTION: тип mixed вместо number» — вместо голого «не подходит». Раньше точка с верной ролью и неверным типом беззвучно выпадала из шаблона, и всё устройство распознавалось как нечто меньшее Если роль попадает на несколько мест, различающихся типом, — направление движения рольставни лежит на DIRECTION как логическое значение и на DIRECTION_ENUM как число, — верстак выбирает то место, чей тип подходит, и обе формы считаются верными.\n* При сохранении шаблона больше не теряются цели записи. Любой исполнитель, ведущий собственное состояние, пишет в ту же точку, которую читает: рольставня, диммер и термостат используют для этого один и тот же 1.LEVEL. Именно в этом случае сохранение выбрасывало путь записи, и построенный алиас показывал положение, но больше не поддавался управлению. Строки, которые только пишут, — STOP рольставни — выпадали целиком. На Tasmota это не проявлялось, так как там читается tele.STATE, а пишется cmnd.POWER. Тип устройства в листе шаблона страдал от второй оплошности: три шаблона называются иначе, чем их тип (blinds/blind, mediaPlayer/media, levelSlider/slider), и рольставня поэтому заявляла, что типа у неё нет вовсе",
|
|
10
|
+
"pt": "* A fonte de compilação passou de `src/` para `src-admin/`. O ioBroker reserva esse nome para fontes de interface que são empacotadas em `admin/` e nunca chegam ao utilizador, e o verificador de adaptadores ignora esses diretórios ao procurar dependências em falta. Por isso `@iobroker/type-detector` permanece em `devDependencies`, que é o seu lugar: o esbuild integra-o em `admin/detector.js` durante a compilação e nada o carrega em tempo de execução. O utilizador recebe o ficheiro pronto de 71 KB, não o pacote de 548 KB (W5042)\n* A página de definições passa a obter as traduções de `admin/i18n/` — o dicionário que o ioBroker lê por si (`\"i18n\": true`) e com o qual o Weblate consegue trabalhar. Os onze idiomas que já continha mudaram-se para lá sem alterações; nem uma palavra foi traduzida de novo. O separador mantém o seu próprio dicionário, agora em `admin/sprachen/`: 588 chaves em alemão e inglês, e um idioma desconhecido recai no inglês. Dois dicionários, duas funções — o nome `i18n` é o que o verificador de adaptadores inspeciona, e aí espera os onze idiomas (W5603, W5614, W5015)\n* As entradas do changelog para 0.9.7 e 0.9.8 estão agora completas nos onze idiomas. Nove delas traziam apenas um resumo curto — o texto inglês da 0.9.7 tem 3000 caracteres com cinco títulos e 22 pontos, o russo tinha 480 sem estrutura nenhuma. Um teste confronta agora cada entrada com o original inglês quanto a comprimento, títulos e número de pontos (W1145)\n* Dois acrescentos do lado do desenvolvimento, invisíveis no próprio adaptador: o `.vscode/settings.json` liga os esquemas JSON, para que erros em `io-package.json` ou `jsonConfig.json` saltem à vista ao escrever e não só no verificador de adaptadores (S4036). E a atualização das GitHub Actions já não corre `monthly` — isso pergunta no primeiro dia do mês, ao mesmo tempo que toda a gente; um horário cron distribui a carga e mantém o ritmo mensal (S8906)\n* O tipo de dados passa a seguir a função. Um lugar do padrão prescreve não só a função mas também o tipo, e ambos estão no mesmo registo do type-detector — ao escolher uma função recebe já o tipo correspondente. Onde um lugar admite vários tipos não se define nada; onde não prescreve nenhum, qualquer escolha continua certa. Se mesmo assim o tipo não servir ao lugar, a bancada di-lo em vez de se calar: na linha («espera number»), como aviso por baixo, e no campo do padrão, que agora indica o motivo — «✕ CONSUMPTION: tipo mixed em vez de number» — em lugar de um simples «não serve». Antes, um ponto com a função certa e o tipo errado caía do padrão em silêncio e o aparelho inteiro era reconhecido como algo menor Quando uma função acerta em vários lugares que diferem no tipo — o sentido de marcha do estore assenta em DIRECTION como booleano e em DIRECTION_ENUM como número —, a bancada escolhe o lugar cujo tipo serve, e ambas as formas valem como certas.\n* Ao guardar um modelo, os destinos de escrita já não se perdem. Todo o atuador que mantém o seu próprio estado escreve no mesmo ponto que lê — estore, dimmer e termóstato usam todos 1.LEVEL para isso. Era exatamente nesse caso que a gravação deitava fora o caminho de escrita, e o alias daí resultante mostrava a posição mas já não se deixava mover. As linhas que só escrevem — o STOP do estore — caíam por completo. Com o Tasmota nunca se notou, porque aí se lê tele.STATE e se escreve cmnd.POWER. O tipo de aparelho na folha do modelo sofria de um segundo lapso: três padrões têm nome diferente do seu tipo (blinds/blind, mediaPlayer/media, levelSlider/slider), pelo que um estore afirmava não ter tipo nenhum",
|
|
11
|
+
"nl": "* De bronbestanden voor de build staan nu in `src-admin/` in plaats van `src/`. ioBroker reserveert die naam voor frontend-bronnen die naar `admin/` worden gebundeld en de gebruiker nooit bereiken; de adaptercontrole slaat zulke mappen over bij het zoeken naar ontbrekende afhankelijkheden. `@iobroker/type-detector` blijft daarom in `devDependencies`, waar hij thuishoort: esbuild bakt hem tijdens de build in `admin/detector.js` en niets laadt hem tijdens runtime. Gebruikers krijgen het kant-en-klare bestand van 71 KB, niet het pakket van 548 KB (W5042)\n* De instellingenpagina haalt haar vertalingen nu uit `admin/i18n/` — het woordenboek dat ioBroker zelf leest (`\"i18n\": true`) en waarmee Weblate overweg kan. De elf talen die zij al bij zich droeg zijn daar ongewijzigd naartoe verhuisd; geen woord is opnieuw vertaald. Het tabblad houdt zijn eigen woordenboek, nu in `admin/sprachen/`: 588 sleutels in het Duits en Engels, een onbekende taal valt terug op Engels. Twee woordenboeken, twee taken — de naam `i18n` bekijkt de adaptercontrole, en daar verwacht zij alle elf talen (W5603, W5614, W5015)\n* De changelog-vermeldingen voor 0.9.7 en 0.9.8 zijn nu volledig in alle elf talen. Negen ervan droegen slechts een korte samenvatting — de Engelse tekst bij 0.9.7 telt 3.000 tekens met vijf kopjes en 22 punten, de Russische had er 480 zonder enige structuur. Een test houdt elke vermelding nu naar lengte, kopjes en aantal punten tegen het Engelse origineel (W1145)\n* Twee toevoegingen voor het ontwikkelen, in de adapter zelf onzichtbaar: `.vscode/settings.json` koppelt de JSON-schema's, zodat fouten in `io-package.json` of `jsonConfig.json` al tijdens het typen opvallen in plaats van pas in de adaptercontrole (S4036). En het bijwerken van de GitHub Actions loopt niet meer `monthly` — dat vraagt op de eerste van de maand, op hetzelfde moment als alle anderen; een cron-schema spreidt de last en houdt het maandelijkse ritme (S8906)\n* Het gegevenstype volgt nu de rol. Een patroonplaats schrijft niet alleen de rol voor maar ook het type, en beide staan in dezelfde record van de type-detector — wie een rol kiest, krijgt het passende type er meteen bij. Waar een plaats meerdere types toelaat wordt niets gezet; waar zij er geen voorschrijft blijft elke keuze goed. Past het type toch niet bij de plaats, dan zegt de werkbank het in plaats van te zwijgen: in de regel («verwacht number»), als waarschuwing eronder, en in het patroonveld, dat nu de reden noemt — «✕ CONSUMPTION: type mixed in plaats van number» — in plaats van een kaal «past niet». Voorheen viel een punt met de juiste rol en het verkeerde type geruisloos uit het patroon, en het hele apparaat werd als iets minders herkend Treft een rol meerdere plaatsen die in type verschillen — de rijrichting van het rolluik zit als booleaan op DIRECTION en als getal op DIRECTION_ENUM — dan kiest de werkbank de plaats waarvan het type past, en beide vormen gelden als juist.\n* Bij het opslaan van een sjabloon gaan de schrijfdoelen niet meer verloren. Elke actor die zijn eigen toestand bijhoudt, schrijft naar hetzelfde punt dat hij leest — rolluik, dimmer en thermostaat gebruiken daarvoor alle 1.LEVEL. Juist in dat geval gooide het opslaan het schrijfpad weg, en het daaruit gebouwde alias toonde de stand maar liet zich niet meer verzetten. Regels die alleen schrijven — de STOP van het rolluik — vielen helemaal weg. Bij Tasmota viel het nooit op, omdat daar tele.STATE wordt gelezen en cmnd.POWER geschreven. Het apparaattype in het sjabloonblad leed aan een tweede vergissing: drie patronen heten anders dan hun type (blinds/blind, mediaPlayer/media, levelSlider/slider), en een rolluik beweerde daardoor helemaal geen type te hebben",
|
|
12
|
+
"fr": "* Les sources de compilation passent de `src/` à `src-admin/`. ioBroker réserve ce nom aux sources d'interface qui sont intégrées dans `admin/` et n'arrivent jamais chez l'utilisateur, et le vérificateur d'adaptateurs ignore ces répertoires lorsqu'il cherche des dépendances manquantes. `@iobroker/type-detector` reste donc dans `devDependencies`, où il a sa place : esbuild l'intègre dans `admin/detector.js` lors de la compilation et rien ne le charge à l'exécution. L'utilisateur reçoit le fichier fini de 71 Ko, pas le paquet de 548 Ko (W5042)\n* La page de réglages tire désormais ses traductions de `admin/i18n/` — le dictionnaire que ioBroker lit lui-même (`\"i18n\": true`) et avec lequel Weblate sait travailler. Les onze langues qu'elle portait déjà y ont déménagé sans changement ; pas un mot n'a été retraduit. L'onglet garde son propre dictionnaire, maintenant dans `admin/sprachen/` : 588 clés en allemand et en anglais, une langue inconnue retombant sur l'anglais. Deux dictionnaires, deux rôles — c'est le nom `i18n` qu'examine le vérificateur d'adaptateurs, et il y attend les onze langues (W5603, W5614, W5015)\n* Les entrées du changelog pour 0.9.7 et 0.9.8 sont désormais complètes dans les onze langues. Neuf d'entre elles ne portaient qu'un résumé — le texte anglais de la 0.9.7 fait 3 000 caractères avec cinq intertitres et 22 points, le russe en comptait 480 sans aucune structure. Un test confronte maintenant chaque entrée à l'original anglais pour la longueur, les intertitres et le nombre de points (W1145)\n* Deux ajouts côté développement, invisibles dans l'adaptateur : `.vscode/settings.json` raccorde les schémas JSON, si bien que les erreurs dans `io-package.json` ou `jsonConfig.json` sautent aux yeux dès la frappe et non seulement chez le vérificateur d'adaptateurs (S4036). Et la mise à jour des GitHub Actions ne tourne plus en `monthly` — cela interroge le premier du mois, au même instant que tout le monde ; un calendrier cron répartit la charge tout en gardant le rythme mensuel (S8906)\n* Le type de données suit désormais le rôle. Une place du motif prescrit non seulement le rôle mais aussi le type, et les deux figurent dans le même enregistrement du type-detector : choisir un rôle installe donc le type correspondant. Là où une place admet plusieurs types, rien n'est posé ; là où elle n'en prescrit aucun, tout choix reste juste. Si le type ne convient malgré tout pas à la place, l'établi le dit au lieu de se taire : dans la ligne (« attend number »), en avertissement dessous, et dans le champ du motif, qui indique maintenant la raison — « ✕ CONSUMPTION : type mixed au lieu de number » — plutôt qu'un simple « ne convient pas ». Auparavant, un point au bon rôle et au mauvais type sortait du motif sans bruit, et l'appareil entier était reconnu comme quelque chose de moindre Lorsqu'un rôle touche plusieurs places qui diffèrent par le type — le sens de marche du volet occupe DIRECTION en booléen et DIRECTION_ENUM en nombre —, l'établi choisit la place dont le type convient, et les deux formes sont tenues pour justes.\n* L'enregistrement d'un modèle ne perd plus les cibles d'écriture. Tout actionneur qui tient son propre état écrit sur le même point qu'il lit : volet, variateur et thermostat utilisent tous 1.LEVEL pour cela. C'est précisément dans ce cas que l'enregistrement jetait le chemin d'écriture, et l'alias obtenu affichait la position sans plus pouvoir être déplacé. Les lignes qui n'écrivent que — le STOP du volet — disparaissaient entièrement. Avec Tasmota cela ne s'est jamais vu, car on y lit tele.STATE et on écrit cmnd.POWER. Le type d'appareil dans la fiche du modèle souffrait d'une seconde méprise : trois motifs portent un nom différent de leur type (blinds/blind, mediaPlayer/media, levelSlider/slider), et un volet prétendait donc n'avoir aucun type",
|
|
13
|
+
"it": "* I sorgenti di build sono passati da `src/` a `src-admin/`. ioBroker riserva questo nome ai sorgenti dell'interfaccia che vengono impacchettati in `admin/` e non raggiungono mai l'utente, e il controllo degli adapter salta queste cartelle quando cerca dipendenze mancanti. `@iobroker/type-detector` resta quindi in `devDependencies`, che è il suo posto: esbuild lo integra in `admin/detector.js` durante la build e nulla lo carica in esecuzione. L'utente riceve il file finito da 71 KB, non il pacchetto da 548 KB (W5042)\n* La pagina delle impostazioni prende ora le traduzioni da `admin/i18n/` — il dizionario che ioBroker legge da sé (`\"i18n\": true`) e con cui Weblate sa lavorare. Le undici lingue che già conteneva vi sono traslocate immutate: non una parola è stata ritradotta. La scheda mantiene il proprio dizionario, ora in `admin/sprachen/`: 588 chiavi in tedesco e inglese, e una lingua sconosciuta ripiega sull'inglese. Due dizionari, due compiti — è il nome `i18n` che il controllo degli adapter esamina, e lì si aspetta tutte e undici le lingue (W5603, W5614, W5015)\n* Le voci del changelog per 0.9.7 e 0.9.8 sono ora complete in tutte e undici le lingue. Nove di esse portavano solo una sintesi — il testo inglese della 0.9.7 conta 3.000 caratteri con cinque titoli e 22 punti, quello russo ne aveva 480 senza alcuna struttura. Un test confronta ora ogni voce con l'originale inglese per lunghezza, titoli e numero di punti (W1145)\n* Due aggiunte lato sviluppo, invisibili nell'adapter stesso: `.vscode/settings.json` aggancia gli schemi JSON, così gli errori in `io-package.json` o `jsonConfig.json` saltano fuori già mentre si scrive e non solo nel controllo degli adapter (S4036). E l'aggiornamento delle GitHub Actions non gira più su `monthly`: quello interroga il primo del mese, nello stesso momento di tutti gli altri; una pianificazione cron distribuisce il carico e mantiene il ritmo mensile (S8906)\n* Il tipo di dato ora segue il ruolo. Un posto del modello prescrive non solo il ruolo ma anche il tipo, ed entrambi stanno nello stesso record del type-detector: scegliendo un ruolo si ottiene subito il tipo corrispondente. Dove un posto ammette più tipi non viene impostato nulla; dove non ne prescrive alcuno, ogni scelta resta giusta. Se il tipo comunque non si adatta al posto, il banco di lavoro lo dice invece di tacere: nella riga («si attende number»), come avviso sotto di essa, e nel campo del modello, che ora indica il motivo — «✕ CONSUMPTION: tipo mixed anziché number» — anziché un secco «non si adatta». Prima un punto con il ruolo giusto e il tipo sbagliato usciva dal modello in silenzio, e l'intero dispositivo veniva riconosciuto come qualcosa di minore Quando un ruolo colpisce più posti che differiscono per tipo — il senso di marcia della tapparella sta su DIRECTION come booleano e su DIRECTION_ENUM come numero —, il banco di lavoro sceglie il posto il cui tipo si adatta, ed entrambe le forme valgono come giuste.\n* Salvando un modello non si perdono più le destinazioni di scrittura. Ogni attuatore che tiene il proprio stato scrive sullo stesso punto che legge: tapparella, dimmer e termostato usano tutti 1.LEVEL. Proprio in questo caso il salvataggio buttava via il percorso di scrittura, e l'alias che ne nasceva mostrava la posizione ma non si lasciava più muovere. Le righe che solo scrivono — lo STOP della tapparella — sparivano del tutto. Con Tasmota non si è mai notato, perché lì si legge tele.STATE e si scrive cmnd.POWER. Il tipo di dispositivo nella scheda del modello soffriva di una seconda svista: tre modelli hanno un nome diverso dal loro tipo (blinds/blind, mediaPlayer/media, levelSlider/slider), e una tapparella sosteneva quindi di non avere alcun tipo",
|
|
14
|
+
"es": "* Las fuentes de compilación pasan de `src/` a `src-admin/`. ioBroker reserva ese nombre para las fuentes de la interfaz que se empaquetan en `admin/` y nunca llegan al usuario, y el verificador de adaptadores omite esos directorios al buscar dependencias que falten. Por eso `@iobroker/type-detector` permanece en `devDependencies`, que es su sitio: esbuild lo integra en `admin/detector.js` durante la compilación y nada lo carga en tiempo de ejecución. El usuario recibe el archivo terminado de 71 KB, no el paquete de 548 KB (W5042)\n* La página de ajustes toma ahora sus traducciones de `admin/i18n/`: el diccionario que ioBroker lee por sí mismo (`\"i18n\": true`) y con el que Weblate puede trabajar. Los once idiomas que ya llevaba se han mudado allí sin cambios; no se ha vuelto a traducir ni una palabra. La pestaña conserva su propio diccionario, ahora en `admin/sprachen/`: 588 claves en alemán e inglés, y un idioma desconocido recae en el inglés. Dos diccionarios, dos cometidos: el nombre `i18n` es el que examina el verificador de adaptadores, y allí espera los once idiomas (W5603, W5614, W5015)\n* Las entradas del changelog para 0.9.7 y 0.9.8 están ahora completas en los once idiomas. Nueve de ellas llevaban solo un resumen: el texto inglés de la 0.9.7 tiene 3.000 caracteres con cinco encabezados y 22 puntos, el ruso tenía 480 sin estructura alguna. Una prueba contrasta ahora cada entrada con el original inglés en longitud, encabezados y número de puntos (W1145)\n* Dos añadidos del lado del desarrollo, invisibles en el propio adaptador: `.vscode/settings.json` engancha los esquemas JSON, de modo que los fallos en `io-package.json` o `jsonConfig.json` se ven ya al escribir y no solo en el verificador de adaptadores (S4036). Y la actualización de las GitHub Actions ya no corre en `monthly`: eso pregunta el día uno de cada mes, en el mismo instante que todos los demás; una programación cron reparte la carga y mantiene el ritmo mensual (S8906)\n* El tipo de dato sigue ahora al rol. Un puesto del patrón prescribe no solo el rol sino también el tipo, y ambos están en el mismo registro del type-detector: al elegir un rol se obtiene ya el tipo correspondiente. Donde un puesto admite varios tipos no se fija ninguno; donde no prescribe ninguno, cualquier elección sigue siendo correcta. Si aun así el tipo no encaja en el puesto, el banco de trabajo lo dice en lugar de callar: en la fila («espera number»), como aviso debajo, y en el campo del patrón, que ahora indica el motivo — «✕ CONSUMPTION: tipo mixed en lugar de number» — en vez de un escueto «no encaja». Antes, un punto con el rol correcto y el tipo equivocado caía del patrón en silencio y el aparato entero se reconocía como algo menor Cuando un rol acierta en varios puestos que difieren en el tipo — el sentido de marcha de la persiana ocupa DIRECTION como booleano y DIRECTION_ENUM como número —, el banco de trabajo elige el puesto cuyo tipo encaja, y ambas formas se consideran correctas.\n* Al guardar una plantilla ya no se pierden los destinos de escritura. Todo actuador que lleva su propio estado escribe en el mismo punto que lee: persiana, atenuador y termostato usan todos 1.LEVEL. Justo en ese caso el guardado tiraba el camino de escritura, y el alias resultante mostraba la posición pero ya no se dejaba mover. Las filas que solo escriben — el STOP de la persiana — desaparecían por completo. Con Tasmota nunca se notó, porque allí se lee tele.STATE y se escribe cmnd.POWER. El tipo de aparato en la hoja de la plantilla sufría un segundo descuido: tres patrones se llaman distinto que su tipo (blinds/blind, mediaPlayer/media, levelSlider/slider), y una persiana afirmaba por eso no tener tipo alguno",
|
|
15
|
+
"pl": "* Źródła kompilacji przeniesiono z `src/` do `src-admin/`. ioBroker rezerwuje tę nazwę dla źródeł interfejsu, które są pakowane do `admin/` i nigdy nie trafiają do użytkownika, a kontrola adapterów pomija takie katalogi przy szukaniu brakujących zależności. Dlatego `@iobroker/type-detector` pozostaje w `devDependencies`, gdzie jest jego miejsce: esbuild wbudowuje go w `admin/detector.js` podczas kompilacji, a w czasie działania nikt go nie ładuje. Użytkownik otrzymuje gotowy plik 71 KB, a nie pakiet 548 KB (W5042)\n* Strona ustawień pobiera teraz tłumaczenia z `admin/i18n/` — słownika, który ioBroker czyta sam (`\"i18n\": true`) i z którym radzi sobie Weblate. Jedenaście języków, które i tak już nosiła, przeniosło się tam bez zmian; ani jedno słowo nie zostało przetłumaczone na nowo. Zakładka zachowuje własny słownik, teraz w `admin/sprachen/`: 588 kluczy po niemiecku i angielsku, a nieznany język wraca do angielskiego. Dwa słowniki, dwa zadania — to nazwę `i18n` sprawdza kontrola adapterów i oczekuje tam wszystkich jedenastu języków (W5603, W5614, W5015)\n* Wpisy changelogu do 0.9.7 i 0.9.8 są teraz kompletne we wszystkich jedenastu językach. Dziewięć z nich niosło tylko skrót — angielski tekst do 0.9.7 liczy 3000 znaków z pięcioma nagłówkami i 22 punktami, rosyjski miał 480 bez żadnej struktury. Test porównuje teraz każdy wpis z angielskim oryginałem pod względem długości, nagłówków i liczby punktów (W1145)\n* Dwa dodatki po stronie programistycznej, w samym adapterze niewidoczne: `.vscode/settings.json` podpina schematy JSON, dzięki czemu błędy w `io-package.json` czy `jsonConfig.json` rzucają się w oczy już podczas pisania, a nie dopiero w kontroli adapterów (S4036). A aktualizacja GitHub Actions nie chodzi już w trybie `monthly` — to pyta pierwszego dnia miesiąca, w tej samej chwili co wszyscy inni; harmonogram cron rozkłada obciążenie i zachowuje miesięczny rytm (S8906)\n* Typ danych podąża teraz za rolą. Miejsce we wzorcu określa nie tylko rolę, ale i typ, a oba znajdują się w tym samym rekordzie type-detectora — wybierając rolę, od razu dostaje się pasujący typ. Tam, gdzie miejsce dopuszcza kilka typów, nie ustawia się nic; tam, gdzie nie określa żadnego, każdy wybór pozostaje słuszny. Jeśli typ mimo to nie pasuje do miejsca, warsztat to mówi, zamiast milczeć: w wierszu („oczekuje number”), jako ostrzeżenie pod nim i w polu wzorca, które teraz podaje powód — „✕ CONSUMPTION: typ mixed zamiast number” — zamiast suchego „nie pasuje”. Wcześniej punkt z właściwą rolą i niewłaściwym typem bezgłośnie wypadał ze wzorca, a całe urządzenie rozpoznawano jako coś mniejszego Gdy rola trafia w kilka miejsc różniących się typem — kierunek jazdy rolety zajmuje DIRECTION jako wartość logiczną, a DIRECTION_ENUM jako liczbę — warsztat wybiera miejsce, którego typ pasuje, a obie postacie uchodzą za właściwe.\n* Przy zapisie szablonu nie giną już cele zapisu. Każdy element wykonawczy, który prowadzi własny stan, zapisuje do tego samego punktu, który odczytuje — roleta, ściemniacz i termostat używają do tego 1.LEVEL. Właśnie w tym przypadku zapis wyrzucał ścieżkę zapisu, a zbudowany z niego alias pokazywał położenie, ale nie dawał się już przestawić. Wiersze, które tylko zapisują — STOP rolety — wypadały całkowicie. Przy Tasmocie nigdy tego nie było widać, bo tam czyta się tele.STATE, a zapisuje cmnd.POWER. Typ urządzenia w arkuszu szablonu cierpiał na drugie przeoczenie: trzy wzorce nazywają się inaczej niż ich typ (blinds/blind, mediaPlayer/media, levelSlider/slider), przez co roleta twierdziła, że nie ma żadnego typu",
|
|
16
|
+
"uk": "* Вихідні файли збірки перенесено з `src/` до `src-admin/`. ioBroker закріпив цю назву за джерелами інтерфейсу, які збираються в `admin/` і ніколи не потрапляють до користувача, а перевірка адаптерів пропускає такі каталоги під час пошуку відсутніх залежностей. Тому `@iobroker/type-detector` залишається в `devDependencies` — саме там йому й місце: esbuild вбудовує його в `admin/detector.js` під час збірки, а під час роботи його ніхто не завантажує. Користувач отримує готовий файл на 71 КБ, а не пакет на 548 КБ (W5042)\n* Сторінка налаштувань бере переклади з `admin/i18n/` — словника, який ioBroker читає сам (`\"i18n\": true`) і з яким уміє працювати Weblate. Одинадцять мов, які вона й так несла, переїхали туди без змін: жодного слова не перекладали заново. Вкладка зберігає власний словник, тепер у `admin/sprachen/`: 588 ключів німецькою та англійською, а невідома мова відкочується до англійської. Два словники — два завдання: саме назву `i18n` перевіряє контролер адаптерів і чекає там усі одинадцять мов (W5603, W5614, W5015)\n* Записи переліку змін до 0.9.7 і 0.9.8 тепер повні всіма одинадцятьма мовами. Дев'ять із них несли лише стислий виклад: англійський текст до 0.9.7 має 3 000 знаків із п'ятьма заголовками та 22 пунктами, російський мав 480 без жодної структури. Новий тест звіряє кожен запис з англійським оригіналом за довжиною, заголовками та кількістю пунктів (W1145)\n* Два доповнення для розробки, у самому адаптері невидимі: `.vscode/settings.json` під'єднує схеми JSON, тож помилки в `io-package.json` чи `jsonConfig.json` впадають в око вже під час набору, а не лише в перевірці адаптерів (S4036). А оновлення GitHub Actions більше не йде за `monthly` — це запит першого числа місяця, тієї самої миті, що й у всіх інших; розклад cron розподіляє навантаження й зберігає місячний ритм (S8906)\n* Тип даних тепер слідує за роллю. Місце в шаблоні задає не лише роль, а й тип, і обидва лежать в одному записі type-detector — обираючи роль, ви одразу отримуєте потрібний тип. Там, де місце допускає кілька типів, не встановлюється нічого; там, де воно не задає жодного, будь-який вибір лишається правильним. Якщо тип усе ж не пасує до місця, верстак про це каже, а не мовчить: у рядку («очікується number»), попередженням під ним і в полі шаблону, яке тепер називає причину — «✕ CONSUMPTION: тип mixed замість number» — замість голого «не пасує». Раніше точка з правильною роллю та хибним типом безшумно випадала з шаблону, і весь пристрій розпізнавався як щось менше Якщо роль влучає в кілька місць, що різняться типом, — напрям руху ролети лежить на DIRECTION як логічне значення і на DIRECTION_ENUM як число, — верстак обирає те місце, чий тип пасує, і обидві форми вважаються правильними.\n* Під час збереження шаблону більше не втрачаються цілі запису. Кожен виконавчий пристрій, що веде власний стан, пише в ту саму точку, яку читає: ролета, димер і термостат використовують для цього 1.LEVEL. Саме в цьому випадку збереження відкидало шлях запису, і побудований аліас показував положення, але вже не піддавався керуванню. Рядки, що лише пишуть, — STOP ролети — випадали повністю. На Tasmota це ніколи не проявлялося, бо там читається tele.STATE, а пишеться cmnd.POWER. Тип пристрою в аркуші шаблону страждав від другого недогляду: три шаблони звуться інакше, ніж їхній тип (blinds/blind, mediaPlayer/media, levelSlider/slider), і ролета через це стверджувала, що типу в неї немає зовсім",
|
|
17
|
+
"zh-cn": "* 构建源码已从 `src/` 移至 `src-admin/`。ioBroker 用这个名称专指那些会被打包进 `admin/`、从不随适配器分发给用户的前端源码,适配器检查器在查找缺失依赖时会跳过这类目录。因此 `@iobroker/type-detector` 保留在 `devDependencies` 中,这正是它应在的位置:esbuild 在构建时将它内联进 `admin/detector.js`,运行时没有任何代码会加载它。用户拿到的是 71 KB 的成品文件,而不是 548 KB 的整个软件包(W5042)\n* 设置页面现在从 `admin/i18n/` 取用翻译——这是 ioBroker 自己读取的词典(`\"i18n\": true`),Weblate 也能处理它。页面原本就携带的十一种语言原封不动地迁了过去,没有一个词是重新翻译的。选项卡保留自己的词典,现位于 `admin/sprachen/`:588 个键,德语和英语,遇到未知语言则回退为英语。两个词典,两种职责——适配器检查器查看的正是 `i18n` 这个名字,并期望其中有全部十一种语言(W5603、W5614、W5015)\n* 0.9.7 和 0.9.8 的更新日志条目现已在全部十一种语言中补全。其中九种此前只有一段简短摘要——0.9.7 的英文正文有 3000 个字符、五个小标题和 22 个条目,俄文版却只有 480 个字符,毫无层次。现在有一项测试会按长度、小标题和条目数量,将每条记录与英文原文逐一比对(W1145)\n* 两项面向开发的补充,在适配器本身完全看不到:`.vscode/settings.json` 接入了 JSON 模式,`io-package.json` 或 `jsonConfig.json` 中的错误在输入时就会显现,而不必等到适配器检查器(S4036)。另外 GitHub Actions 的更新不再使用 `monthly`——那会在每月一号、和所有人同一时刻发起询问;改用 cron 计划既分散了负载,又保持每月一次的节奏(S8906)\n* 数据类型现在跟随角色。模式中的位置不仅规定角色,也规定类型,两者就存放在 type-detector 的同一条记录里——因此选定角色时会一并设好对应的类型。位置允许多种类型时不作设定;位置未规定类型时,任何选择都仍然正确。若类型终究与位置不符,工作台会明说而不再沉默:在该行显示「需要 number」,其下给出警告,模式字段也会说明原因——「✕ CONSUMPTION:类型 mixed 而非 number」——而不再只是干巴巴的「不匹配」。此前,角色正确而类型错误的数据点会悄无声息地掉出模式,整台设备也随之被识别为更次要的类型当同一角色命中多个类型不同的位置时——卷帘的行进方向在 DIRECTION 上是布尔值,在 DIRECTION_ENUM 上是数字——工作台会挑选类型相符的那个位置,两种形式都算正确。\n* 保存模板时不再丢失写入目标。凡是自己维护状态的执行器,写入的正是它读取的那个点——卷帘、调光器和恒温器都用 1.LEVEL。恰恰在这种情况下,保存会把写入路径丢掉,由此生成的别名只能显示位置、再也无法调节。只写不读的行——卷帘的 STOP——则整行消失。在 Tasmota 上从未暴露,因为那里读的是 tele.STATE、写的是 cmnd.POWER。模板页中的设备类型还有第二处疏忽:有三个模式的名称与其类型不同(blinds/blind、mediaPlayer/media、levelSlider/slider),因此卷帘一直声称自己没有任何类型"
|
|
57
18
|
},
|
|
58
|
-
"0.9.
|
|
59
|
-
"en": "*
|
|
60
|
-
"de": "*
|
|
61
|
-
"ru": "
|
|
62
|
-
"pt": "
|
|
63
|
-
"nl": "
|
|
64
|
-
"fr": "
|
|
65
|
-
"it": "
|
|
66
|
-
"es": "
|
|
67
|
-
"pl": "
|
|
68
|
-
"uk": "
|
|
69
|
-
"zh-cn": "
|
|
19
|
+
"0.9.8": {
|
|
20
|
+
"en": "* The changelog only lists versions that actually exist on npm. The entries 0.9.1 to 0.9.6 were local intermediate steps and were never published; their content is now summarised under 0.9.7. Found by the repochecker (E2004, E1032)\n* The README no longer describes how to add the adapter by hand — in the official repository it is picked from the adapter list (E6013)\n* `dependabot.yml` gets a seven-day cooldown for npm packages: what appears today is proposed a week later. If a compromised release is pulled within that time, it never arrives here (E8915). And `@types/node` stays on its major version — the types must match the Node release the adapter runs on (E8917)",
|
|
21
|
+
"de": "* Der Changelog nennt nur noch Fassungen, die es auf npm wirklich gibt. Die Einträge 0.9.1 bis 0.9.6 waren lokale Zwischenstände und wurden nie veröffentlicht; ihr Inhalt steht jetzt zusammengefasst bei 0.9.7. Gefunden vom Repochecker (E2004, E1032)\n* Die README beschreibt nicht mehr, wie man den Adapter von Hand hinzufügt — im offiziellen Repository wählt man ihn aus der Adapterliste (E6013)\n* `dependabot.yml` bekommt eine Abkühlzeit von sieben Tagen für npm-Pakete: Was heute erscheint, wird erst in einer Woche vorgeschlagen. Wird eine kompromittierte Fassung in dieser Zeit zurückgezogen, kommt sie hier nie an (E8915). Und `@types/node` bleibt bei seiner Hauptversion — die Typen müssen zu der Node-Fassung passen, unter der der Adapter läuft (E8917)",
|
|
22
|
+
"ru": "* В списке изменений теперь указаны только те версии, которые действительно существуют на npm. Записи с 0.9.1 по 0.9.6 были локальными промежуточными шагами и никогда не публиковались; их содержимое собрано в 0.9.7. Найдено проверкой репозитория (E2004, E1032)\n* README больше не описывает, как добавить адаптер вручную — в официальном репозитории его выбирают из списка адаптеров (E6013)\n* `dependabot.yml` получает семидневную выдержку для npm-пакетов: то, что вышло сегодня, будет предложено лишь через неделю. Если скомпрометированный выпуск за это время отзовут, сюда он так и не попадёт (E8915). А `@types/node` остаётся на своей мажорной версии — типы должны соответствовать той версии Node, под которой работает адаптер (E8917)",
|
|
23
|
+
"pt": "* O changelog lista apenas versões que existem mesmo no npm. As entradas 0.9.1 a 0.9.6 foram passos intermédios locais e nunca foram publicadas; o seu conteúdo está agora resumido em 0.9.7. Detetado pelo verificador do repositório (E2004, E1032)\n* O README já não descreve como adicionar o adaptador à mão — no repositório oficial escolhe-se a partir da lista de adaptadores (E6013)\n* O `dependabot.yml` passa a ter sete dias de arrefecimento para pacotes npm: o que aparece hoje só é proposto uma semana depois. Se uma versão comprometida for retirada nesse período, nunca chega aqui (E8915). E o `@types/node` mantém-se na sua versão maior — os tipos têm de corresponder à versão do Node em que o adaptador corre (E8917)",
|
|
24
|
+
"nl": "* De changelog noemt alleen nog versies die echt op npm staan. De vermeldingen 0.9.1 tot 0.9.6 waren lokale tussenstappen en zijn nooit gepubliceerd; hun inhoud staat nu samengevat bij 0.9.7. Gevonden door de repochecker (E2004, E1032)\n* De README beschrijft niet langer hoe je de adapter met de hand toevoegt — in het officiële repository kies je hem uit de adapterlijst (E6013)\n* `dependabot.yml` krijgt een afkoeltijd van zeven dagen voor npm-pakketten: wat vandaag verschijnt, wordt pas een week later voorgesteld. Wordt een gecompromitteerde versie binnen die tijd teruggetrokken, dan komt zij hier nooit aan (E8915). En `@types/node` blijft op zijn hoofdversie — de typen moeten passen bij de Node-versie waaronder de adapter draait (E8917)",
|
|
25
|
+
"fr": "* Le changelog ne cite plus que des versions qui existent vraiment sur npm. Les entrées 0.9.1 à 0.9.6 étaient des étapes intermédiaires locales et n'ont jamais été publiées ; leur contenu est désormais résumé sous 0.9.7. Détecté par le vérificateur de dépôt (E2004, E1032)\n* Le README n'explique plus comment ajouter l'adaptateur à la main — dans le dépôt officiel, on le choisit dans la liste des adaptateurs (E6013)\n* `dependabot.yml` reçoit un délai de refroidissement de sept jours pour les paquets npm : ce qui paraît aujourd'hui n'est proposé qu'une semaine plus tard. Si une version compromise est retirée pendant ce délai, elle n'arrive jamais ici (E8915). Et `@types/node` reste sur sa version majeure — les types doivent correspondre à la version de Node sous laquelle tourne l'adaptateur (E8917)",
|
|
26
|
+
"it": "* Il changelog elenca solo versioni che esistono davvero su npm. Le voci da 0.9.1 a 0.9.6 erano passi intermedi locali e non sono mai state pubblicate; il loro contenuto è ora riassunto sotto 0.9.7. Rilevato dal controllo del repository (E2004, E1032)\n* Il README non descrive più come aggiungere l'adapter a mano — nel repository ufficiale lo si sceglie dall'elenco degli adapter (E6013)\n* `dependabot.yml` riceve sette giorni di raffreddamento per i pacchetti npm: ciò che esce oggi viene proposto solo una settimana dopo. Se una versione compromessa viene ritirata in quel periodo, qui non arriva mai (E8915). E `@types/node` resta alla sua versione maggiore: i tipi devono corrispondere alla versione di Node su cui gira l'adapter (E8917)",
|
|
27
|
+
"es": "* El changelog solo menciona versiones que existen realmente en npm. Las entradas 0.9.1 a 0.9.6 fueron pasos intermedios locales y nunca se publicaron; su contenido está ahora resumido en 0.9.7. Detectado por el verificador del repositorio (E2004, E1032)\n* El README ya no describe cómo añadir el adaptador a mano: en el repositorio oficial se elige de la lista de adaptadores (E6013)\n* `dependabot.yml` recibe un enfriamiento de siete días para los paquetes npm: lo que aparece hoy se propone una semana después. Si una versión comprometida se retira en ese plazo, aquí no llega nunca (E8915). Y `@types/node` se queda en su versión mayor: los tipos deben coincidir con la versión de Node bajo la que corre el adaptador (E8917)",
|
|
28
|
+
"pl": "* Changelog wymienia już tylko wersje, które naprawdę istnieją w npm. Wpisy od 0.9.1 do 0.9.6 były lokalnymi krokami pośrednimi i nigdy nie zostały opublikowane; ich treść jest teraz zebrana w 0.9.7. Wykryte przez kontrolę repozytorium (E2004, E1032)\n* README nie opisuje już, jak dodać adapter ręcznie — w oficjalnym repozytorium wybiera się go z listy adapterów (E6013)\n* `dependabot.yml` otrzymuje siedmiodniowy okres wystudzenia dla pakietów npm: to, co ukazuje się dziś, zostanie zaproponowane dopiero za tydzień. Jeśli w tym czasie wycofa się naruszone wydanie, nigdy tu nie trafi (E8915). A `@types/node` pozostaje przy swojej wersji głównej — typy muszą pasować do wersji Node, pod którą działa adapter (E8917)",
|
|
29
|
+
"uk": "* У переліку змін тепер лишилися тільки версії, які справді є на npm. Записи від 0.9.1 до 0.9.6 були локальними проміжними кроками й ніколи не публікувалися; їхній зміст зібрано в 0.9.7. Виявлено перевіркою репозиторію (E2004, E1032)\n* README більше не описує, як додати адаптер вручну — в офіційному репозиторії його обирають зі списку адаптерів (E6013)\n* `dependabot.yml` отримує семиденну витримку для npm-пакетів: те, що виходить сьогодні, пропонується лише через тиждень. Якщо скомпрометований випуск за цей час відкличуть, сюди він так і не потрапить (E8915). А `@types/node` лишається на своїй мажорній версії — типи мають відповідати тій версії Node, під якою працює адаптер (E8917)",
|
|
30
|
+
"zh-cn": "* 更新日志现在只列出 npm 上确实存在的版本。0.9.1 至 0.9.6 这些条目只是本地的中间步骤,从未发布过;它们的内容已归入 0.9.7。由仓库检查器发现(E2004、E1032)\n* README 不再说明如何手动添加适配器——在官方仓库中,直接从适配器列表里选取即可(E6013)\n* `dependabot.yml` 为 npm 包设置了七天冷却期:今天发布的版本,一周后才会被提议采用。若某个被植入后门的版本在这段时间内被撤回,它就永远不会到达这里(E8915)。另外 `@types/node` 保持在当前主版本——类型必须与适配器实际运行的 Node 版本相匹配(E8917)"
|
|
70
31
|
},
|
|
71
|
-
"0.9.
|
|
72
|
-
"en": "
|
|
73
|
-
"de": "
|
|
74
|
-
"ru": "
|
|
75
|
-
"pt": "
|
|
76
|
-
"nl": "
|
|
77
|
-
"fr": "
|
|
78
|
-
"it": "
|
|
79
|
-
"es": "
|
|
80
|
-
"pl": "
|
|
81
|
-
"uk": "
|
|
82
|
-
"zh-cn": "
|
|
83
|
-
},
|
|
84
|
-
"0.9.1": {
|
|
85
|
-
"en": "* A load error on the enumerations can no longer overwrite one: until now a failed `getObjectView` set the store to empty and kept quiet about it. After that the workbench considered every enumeration absent, the catalogue kept offering them because the duplicate filter had nothing to check against, and on writing `setObject` replaced the existing object with a fresh one holding a single member — measured, a room lost three of its four members that way and was given the origin mark that makes it deletable later on. The previous state is now kept, no enumeration is touched, and both the field and the dry run say why room and function are not being written. The alias itself is still created, and a hiccup heals itself after three attempts\n* An enumeration deleted from outside is no longer resurrected: the subscription compared against `objects`, where enumerations never live — on deletion old and new value were therefore both empty and the branch that removes it from the store was never reached. The next alias using that room recreated it with all its old members, including the foreign ones\n* “Create all” now gives every channel its room and its function. The partial drafts carried neither, so not a single channel got an entry — the single route set it, the bulk route did not. A second object for the same enumeration was also discarded, so even then only the first channel would have made it in. And for a channel other than the one shown the assignment counted as empty: if its alias already sat in a room, the bulk route took it **out**. Every channel now keeps what it has, all others get what is set, and members are merged instead of discarded",
|
|
86
|
-
"de": "* Ein Ladefehler der Aufzählungen kann keine mehr überschreiben: Bisher setzte ein fehlgeschlagenes `getObjectView` den Vorrat auf leer und verschwieg es. Danach hielt die Werkbank jede Aufzählung für nicht vorhanden, der Katalog bot sie weiter an, weil der Dublettenfilter gegen nichts prüfte, und beim Schreiben ersetzte `setObject` das vorhandene Objekt durch ein frisches mit einem einzigen Mitglied — gemessen verlor ein Raum dabei drei von vier Mitgliedern und bekam obendrein die Herkunftsmarke, die ihn später löschbar macht. Jetzt bleibt der alte Stand stehen, es wird keine Aufzählung angefasst, und Feld wie Trockenlauf sagen, warum Raum und Funktion gerade nicht geschrieben werden. Der Alias selbst entsteht weiterhin, und ein Aussetzer heilt sich nach drei Versuchen selbst\n* Eine von außen gelöschte Aufzählung wird nicht mehr wiederbelebt: Das Abo verglich gegen `objects`, wo Aufzählungen nie liegen — beim Löschen waren alter und neuer Wert deshalb beide leer, und der Zweig, der sie aus dem Vorrat nimmt, wurde nie erreicht. Der nächste Alias mit diesem Raum legte sie samt aller alten Mitglieder wieder an, auch der fremden\n* „Alle erzeugen“ gibt jedem Kanal seinen Raum und seine Funktion. Die Teil-Entwürfe trugen keinen von beiden, also entstand für keinen einzigen Kanal ein Eintrag — der Einzelweg setzte ihn, der Sammelweg nicht. Ein zweites Objekt derselben Aufzählung wurde zudem verworfen, sodass selbst dann nur der erste Kanal hineingekommen wäre. Und für einen fremden Ausgang galt die Zuordnung als leer: Stand sein Alias schon in einem Raum, trug ihn der Sammelweg dort **aus**. Jetzt behält jeder Kanal, was er hat, alle übrigen bekommen das Eingestellte, und die Mitglieder werden vereinigt statt verworfen",
|
|
87
|
-
"ru": "Исправлены три ошибки в перечислениях: сбой загрузки больше не может перезаписать существующее перечисление, удалённое извне перечисление больше не воскресает, а «Создать все» теперь задаёт комнату и функцию каждому каналу, не отнимая их у чужих выходов.",
|
|
88
|
-
"pt": "Três erros nas enumerações corrigidos: uma falha de carregamento já não pode sobrescrever uma existente, uma enumeração apagada externamente já não ressuscita, e «Criar todos» atribui agora sala e função a cada canal sem as retirar a saídas alheias.",
|
|
89
|
-
"nl": "Drie fouten in de opsommingen verholpen: een laadfout kan een bestaande niet meer overschrijven, een van buitenaf verwijderde opsomming herrijst niet meer, en «Alle aanmaken» geeft nu elk kanaal zijn ruimte en functie zonder ze van andere uitgangen af te nemen.",
|
|
90
|
-
"fr": "Trois erreurs sur les énumérations corrigées : une erreur de chargement ne peut plus en écraser une existante, une énumération supprimée de l'extérieur ne ressuscite plus, et « Tout créer » attribue désormais pièce et fonction à chaque canal sans les retirer aux autres sorties.",
|
|
91
|
-
"it": "Corretti tre errori sulle enumerazioni: un errore di caricamento non può più sovrascriverne una esistente, un'enumerazione eliminata dall'esterno non risorge più e «Crea tutti» assegna ora stanza e funzione a ogni canale senza toglierle alle altre uscite.",
|
|
92
|
-
"es": "Tres errores en las enumeraciones corregidos: un fallo de carga ya no puede sobrescribir una existente, una enumeración borrada desde fuera ya no resucita, y «Crear todos» asigna ahora habitación y función a cada canal sin quitárselas a otras salidas.",
|
|
93
|
-
"pl": "Naprawiono trzy błędy w wyliczeniach: błąd wczytywania nie może już nadpisać istniejącego, wyliczenie usunięte z zewnątrz już nie zmartwychwstaje, a «Utwórz wszystkie» nadaje teraz każdemu kanałowi pokój i funkcję, nie odbierając ich innym wyjściom.",
|
|
94
|
-
"uk": "Виправлено три помилки в переліках: збій завантаження більше не може перезаписати наявний, видалений ззовні перелік більше не воскресає, а «Створити всі» тепер задає кімнату й функцію кожному каналу, не забираючи їх у чужих виходів.",
|
|
95
|
-
"zh-cn": "修复了枚举中的三个错误:加载失败不再会覆盖已有枚举,从外部删除的枚举不再复活,「全部创建」现在会为每个通道设置房间和功能,且不会夺走其他输出的归属。"
|
|
32
|
+
"0.9.7": {
|
|
33
|
+
"en": "Seven packages from a code review — 45 fixes between 0.9.0 and this release. The intermediate steps 0.9.1 to 0.9.6 stayed local and were never published; they are summarised here.\n\n**Data loss and failure paths**\n* An enumeration error now stops a move. Previously the old alias was deleted anyway — and afterwards it was gone while the new one sat in no enumeration at all\n* A partial failure while deleting no longer turns the retry button into a prop: only what really went is dropped\n* Orphaned points are deleted on the second attempt too\n* A load error on the enumerations leaves the previous state standing instead of emptying it — and while they are unknown, nothing is written. Before, one hiccup could drop an alias out of every room and function\n* A load error on your own templates is reported instead of swallowed; otherwise the next save would have replaced an existing template with version 1\n\n**Connection and display**\n* The tab works again after a dropped connection. The admin's WebSocket fires `connect` once per page lifetime and `reconnect` afterwards — nobody listened, and neither object nor state changes arrived\n* Template mode no longer rebuilds itself every second, and where the selection goes, its subscriptions go too\n* “Differs from the alias” now also shows in alias mode — where it says the most\n* Switching sources quickly no longer fetches the wrong value; the source jump list never appears twice\n* Object names follow the admin language; the function match looks at every language and no longer creates a duplicate\n\n**Templates**\n* A broken name hint no longer takes down the whole source view — including the nested form `(a+)+` where the expression engine stalls\n* The formula of a fallback source survives updating, an unknown device type no longer throws\n* Importing checks more than id and states; a hand-typed id no longer replaces someone else's template\n* The `%N%` placeholder only hits the output number now, not every trailing digit\n* The blind gets its STOP: a button press has no state to read, and that case was unknown to template application — **not a single** blind alias ever had one\n* ON_TIME finds its slot (four templates carried the wrong role)\n\n**MQTT and Tasmota**\n* An empty `custom` entry no longer takes anything down, `enabled: false` counts as switched off\n* No more false “cannot publish” for ioBroker.mqtt and sonoff — there, publishing capability is simply unknown, not denied\n* “Answer received” only for a real answer; `Vcc` and `Command` are not commands\n\n**Speed, measured on a production system with 24,786 objects**\n* The search box no longer blocks: **236 ms per keystroke → 0**, the whole tree **263 → 67 ms**\n* A redraw no longer costs half a second — binary search instead of linear scans: drawing a source **15.8 → 1.6 ms**, an alias with 50 points **51.9 → 14.2 ms**\n* A read formula can no longer freeze the tab for good\n* What is subscribed is what is read — before, a single alias could subscribe to half an adapter",
|
|
34
|
+
"de": "Sieben Pakete aus einem Code-Review — 45 behobene Fehler zwischen 0.9.0 und dieser Fassung. Die Zwischenstände 0.9.1 bis 0.9.6 waren lokal und wurden nie veröffentlicht; hier stehen sie zusammengefasst.\n\n**Datenverlust und Fehlerpfade**\n* Ein Fehler an den Aufzählungen hält das Verlegen jetzt auf. Vorher lief das Löschen des alten Alias trotzdem — danach war er weg und der neue stand in keiner Aufzählung mehr\n* Ein Teilfehler beim Löschen macht den Wiederholen-Knopf nicht mehr zur Attrappe: Es wird nur ausgetragen, was wirklich weg ist\n* Verwaiste Punkte werden auch beim zweiten Anlauf gelöscht\n* Ein Ladefehler bei den Aufzählungen lässt den alten Stand stehen, statt ihn zu leeren — und solange sie unbekannt sind, wird nichts geschrieben. Vorher konnte ein Aussetzer beim Laden dazu führen, dass ein Alias aus allen Räumen und Funktionen fiel\n* Ein Ladefehler bei den eigenen Vorlagen wird gemeldet statt verschwiegen; vorher hätte das nächste Speichern eine vorhandene Vorlage mit Version 1 ersetzt\n\n**Verbindung und Anzeige**\n* Nach einem Verbindungsabbruch arbeitet der Reiter wieder. Der WebSocket des Admin feuert `connect` nur einmal pro Seitenleben, danach `reconnect` — das hörte niemand, und es kamen weder Objekt- noch Wertänderungen an\n* Der Vorlagenmodus baut sich nicht mehr im Sekundentakt neu auf, und wo die Auswahl fällt, fallen auch ihre Abos\n* „Weicht vom Alias ab“ erscheint jetzt auch im Aliasmodus — dort, wo die Marke am meisten sagt\n* Ein schneller Quellenwechsel holt keinen fremden Wert mehr, die Quellen-Sprungliste steht nie doppelt\n* Objektnamen folgen der Adminsprache; der Funktionsabgleich sieht alle Sprachfassungen an und legt keinen Doppelgänger mehr an\n\n**Vorlagen**\n* Ein kaputter Namenshinweis legt nicht mehr die ganze Quellenansicht lahm — samt der verschachtelten Form `(a+)+`, an der die Ausdrucks-Maschine hängenbleibt\n* Die Formel einer Ersatzquelle überlebt das Aktualisieren, ein unbekannter Gerätetyp wirft nicht mehr\n* Das Einlesen prüft mehr als Kennung und Zustände; eine von Hand eingetippte Kennung ersetzt keine fremde Vorlage mehr\n* Der Platzhalter `%N%` trifft nur noch die Ausgangsnummer, nicht jede Endziffer\n* Der Rollladen bekommt seinen STOP: Ein Tastendruck hat keinen Zustand zum Lesen, und diesen Fall kannte das Anwenden nicht — **kein einziger** Rollladen-Alias hatte je einen\n* ON_TIME findet seinen Platz (vier Vorlagen trugen die falsche Rolle)\n\n**MQTT und Tasmota**\n* Ein leerer `custom`-Eintrag legt nichts mehr lahm, `enabled: false` gilt als abgeschaltet\n* Kein falsches „kann nicht senden“ mehr bei ioBroker.mqtt und sonoff — dort ist die Sendefähigkeit schlicht unbekannt, nicht verneint\n* „Antwort erhalten“ nur noch bei einer echten Antwort; `Vcc` und `Command` sind keine Befehle\n\n**Tempo, am Produktivsystem mit 24.786 Objekten gemessen**\n* Das Suchfeld blockiert nicht mehr: **236 ms je Anschlag → 0**, der ganze Baum **263 → 67 ms**\n* Ein Neuzeichnen kostet keine halbe Sekunde mehr — Binärsuche statt linearer Scans: Zeichnen einer Quelle **15,8 → 1,6 ms**, eines Alias mit 50 Punkten **51,9 → 14,2 ms**\n* Eine Leseformel kann den Reiter nicht mehr dauerhaft einfrieren\n* Abonniert wird, was gelesen wird — vorher konnte ein einziger Alias den halben Adapter abonnieren",
|
|
35
|
+
"ru": "Семь пакетов из код-ревью — 45 исправлений между 0.9.0 и этим выпуском. Промежуточные шаги с 0.9.1 по 0.9.6 остались локальными и никогда не публиковались; здесь они собраны вместе.\n\n**Потеря данных и пути отказа**\n* Ошибка в перечислениях теперь останавливает перенос. Раньше старый алиас всё равно удалялся — и после этого его не было, а новый не значился ни в одном перечислении\n* Частичный сбой при удалении больше не превращает кнопку повтора в бутафорию: снимается только то, что действительно исчезло\n* Осиротевшие точки удаляются и со второй попытки\n* Ошибка загрузки перечислений оставляет прежнее состояние на месте, вместо того чтобы его очистить, — и пока они неизвестны, ничего не записывается. Раньше одна заминка могла выбросить алиас из всех комнат и функций\n* Об ошибке загрузки собственных шаблонов теперь сообщается, а не умалчивается; иначе следующее сохранение заменило бы существующий шаблон версией 1\n\n**Соединение и отображение**\n* После обрыва связи вкладка снова работает. WebSocket админки выдаёт `connect` один раз за время жизни страницы, а дальше только `reconnect` — этого никто не слушал, и не приходили ни изменения объектов, ни изменения значений\n* Режим шаблонов больше не перестраивается ежесекундно, и вместе с выбором переезжают его подписки\n* «Отличается от алиаса» показывается теперь и в режиме алиаса — там, где эта пометка говорит больше всего\n* Быстрое переключение источников больше не подтягивает чужое значение; список перехода по источникам не появляется дважды\n* Имена объектов следуют языку админки; сопоставление функций смотрит на все языковые варианты и больше не создаёт двойников\n\n**Шаблоны**\n* Сломанная подсказка имени больше не выводит из строя весь вид источника — включая вложенную форму `(a+)+`, на которой застревает движок выражений\n* Формула запасного источника переживает обновление, неизвестный тип устройства больше не приводит к ошибке\n* Импорт проверяет не только идентификатор и состояния; идентификатор, введённый вручную, больше не заменяет чужой шаблон\n* Подстановка `%N%` попадает только в номер выхода, а не в любую последнюю цифру\n* Рольставня получает свой STOP: у нажатия кнопки нет состояния для чтения, и этот случай применение шаблонов не знало — **ни у одного** алиаса рольставни его никогда не было\n* ON_TIME находит своё место (четыре шаблона несли неверную роль)\n\n**MQTT и Tasmota**\n* Пустая запись `custom` больше ничего не ломает, `enabled: false` считается выключением\n* Больше никаких ложных «не может отправлять» для ioBroker.mqtt и sonoff — там способность к отправке просто неизвестна, а не отрицается\n* «Ответ получен» — только при настоящем ответе; `Vcc` и `Command` не являются командами\n\n**Скорость, измерено на боевой системе с 24 786 объектами**\n* Поле поиска больше не блокирует: **236 мс на нажатие → 0**, всё дерево **263 → 67 мс**\n* Перерисовка больше не стоит полсекунды — бинарный поиск вместо линейных проходов: отрисовка источника **15,8 → 1,6 мс**, алиаса с 50 точками **51,9 → 14,2 мс**\n* Формула чтения больше не может намертво подвесить вкладку\n* Подписываемся на то, что читаем, — раньше один-единственный алиас мог подписаться на половину адаптера",
|
|
36
|
+
"pt": "Sete pacotes de uma revisão de código — 45 correções entre 0.9.0 e esta versão. Os passos intermédios 0.9.1 a 0.9.6 ficaram locais e nunca foram publicados; estão aqui resumidos.\n\n**Perda de dados e caminhos de falha**\n* Um erro nas enumerações passa a interromper a mudança. Antes o alias antigo era apagado à mesma — e depois tinha desaparecido, enquanto o novo não constava de enumeração nenhuma\n* Uma falha parcial ao apagar já não transforma o botão de repetir num adereço: só é retirado o que realmente desapareceu\n* Os pontos órfãos são apagados também à segunda tentativa\n* Um erro ao carregar as enumerações deixa o estado anterior de pé em vez de o esvaziar — e enquanto forem desconhecidas, nada é escrito. Antes, um soluço podia deixar um alias fora de todas as divisões e funções\n* Um erro ao carregar os modelos próprios é comunicado em vez de silenciado; caso contrário, a gravação seguinte teria substituído um modelo existente pela versão 1\n\n**Ligação e apresentação**\n* O separador volta a funcionar depois de uma quebra de ligação. O WebSocket do Admin dispara `connect` uma única vez por vida da página e `reconnect` depois disso — ninguém escutava, e não chegavam alterações nem de objetos nem de valores\n* O modo de modelos já não se reconstrói a cada segundo, e onde vai a seleção vão também as suas subscrições\n* «Difere do alias» aparece agora também no modo de alias — onde a marca diz mais\n* Trocar de fonte rapidamente já não vai buscar o valor errado; a lista de salto entre fontes nunca aparece duas vezes\n* Os nomes dos objetos seguem o idioma do Admin; a correspondência de funções olha para todos os idiomas e já não cria um duplicado\n\n**Modelos**\n* Uma dica de nome avariada já não derruba a vista de fontes inteira — incluindo a forma aninhada `(a+)+`, onde o motor de expressões encrava\n* A fórmula de uma fonte de reserva sobrevive à atualização, um tipo de dispositivo desconhecido já não rebenta\n* A importação verifica mais do que o id e os estados; um id escrito à mão já não substitui o modelo de outra pessoa\n* O marcador `%N%` só acerta no número da saída, já não em qualquer dígito final\n* O estore recebe o seu STOP: premir um botão não tem estado para ler, e esse caso era desconhecido da aplicação de modelos — **nenhum** alias de estore alguma vez teve um\n* O ON_TIME encontra o seu lugar (quatro modelos levavam a função errada)\n\n**MQTT e Tasmota**\n* Uma entrada `custom` vazia já não derruba nada, `enabled: false` conta como desligado\n* Acabaram os falsos «não consegue publicar» no ioBroker.mqtt e no sonoff — aí a capacidade de publicar é simplesmente desconhecida, não negada\n* «Resposta recebida» apenas para uma resposta a sério; `Vcc` e `Command` não são comandos\n\n**Velocidade, medida num sistema de produção com 24 786 objetos**\n* A caixa de pesquisa deixou de bloquear: **236 ms por tecla → 0**, a árvore inteira **263 → 67 ms**\n* Redesenhar já não custa meio segundo — pesquisa binária em vez de varrimentos lineares: desenhar uma fonte **15,8 → 1,6 ms**, um alias com 50 pontos **51,9 → 14,2 ms**\n* Uma fórmula de leitura já não pode congelar o separador de vez\n* Subscreve-se o que se lê — antes, um único alias podia subscrever meio adaptador",
|
|
37
|
+
"nl": "Zeven pakketten uit een codereview — 45 correcties tussen 0.9.0 en deze versie. De tussenstappen 0.9.1 tot 0.9.6 bleven lokaal en zijn nooit gepubliceerd; hier staan ze samengevat.\n\n**Gegevensverlies en foutpaden**\n* Een fout bij de opsommingen houdt het verplaatsen nu tegen. Voorheen werd het oude alias toch verwijderd — en daarna was het weg, terwijl het nieuwe in geen enkele opsomming stond\n* Een gedeeltelijke fout bij het verwijderen maakt van de herhaalknop geen decorstuk meer: alleen wat echt weg is, wordt uitgeschreven\n* Verweesde punten worden ook bij de tweede poging verwijderd\n* Een laadfout bij de opsommingen laat de vorige stand staan in plaats van hem te legen — en zolang ze onbekend zijn, wordt er niets geschreven. Eerder kon één hapering een alias uit alle ruimtes en functies laten vallen\n* Een laadfout bij de eigen sjablonen wordt gemeld in plaats van ingeslikt; anders had de volgende keer opslaan een bestaand sjabloon door versie 1 vervangen\n\n**Verbinding en weergave**\n* Na een verbroken verbinding werkt het tabblad weer. De WebSocket van de Admin vuurt `connect` één keer per paginaleven af en daarna `reconnect` — daar luisterde niemand naar, en er kwamen object- noch waardewijzigingen binnen\n* De sjabloonmodus bouwt zichzelf niet meer elke seconde opnieuw op, en waar de selectie heen gaat, gaan haar abonnementen mee\n* «Wijkt af van het alias» verschijnt nu ook in de aliasmodus — daar waar het het meest zegt\n* Snel van bron wisselen haalt geen verkeerde waarde meer op; de spronglijst van bronnen staat nooit dubbel\n* Objectnamen volgen de Admin-taal; de functievergelijking kijkt naar alle taalvarianten en maakt geen dubbelganger meer aan\n\n**Sjablonen**\n* Een kapotte naamhint legt niet meer de hele bronweergave plat — inclusief de geneste vorm `(a+)+`, waarop de expressiemachine vastloopt\n* De formule van een vervangende bron overleeft het bijwerken, een onbekend apparaattype gooit geen fout meer\n* Het inlezen controleert meer dan id en toestanden; een met de hand getypt id vervangt niet langer andermans sjabloon\n* De plaatshouder `%N%` raakt nu alleen het uitgangsnummer, niet elk eindcijfer\n* Het rolluik krijgt zijn STOP: een toetsdruk heeft geen toestand om te lezen, en dat geval kende het toepassen van sjablonen niet — **geen enkel** rolluik-alias heeft er ooit een gehad\n* ON_TIME vindt zijn plek (vier sjablonen droegen de verkeerde rol)\n\n**MQTT en Tasmota**\n* Een lege `custom`-vermelding legt niets meer plat, `enabled: false` geldt als uitgeschakeld\n* Geen vals «kan niet verzenden» meer bij ioBroker.mqtt en sonoff — daar is het verzendvermogen simpelweg onbekend, niet ontkend\n* «Antwoord ontvangen» alleen nog bij een echt antwoord; `Vcc` en `Command` zijn geen commando's\n\n**Snelheid, gemeten op een productiesysteem met 24.786 objecten**\n* Het zoekveld blokkeert niet meer: **236 ms per toetsaanslag → 0**, de hele boom **263 → 67 ms**\n* Opnieuw tekenen kost geen halve seconde meer — binair zoeken in plaats van lineair scannen: een bron tekenen **15,8 → 1,6 ms**, een alias met 50 punten **51,9 → 14,2 ms**\n* Een leesformule kan het tabblad niet meer blijvend bevriezen\n* Er wordt geabonneerd op wat gelezen wordt — eerder kon één enkel alias zich op een halve adapter abonneren",
|
|
38
|
+
"fr": "Sept lots issus d'une revue de code — 45 corrections entre 0.9.0 et cette version. Les étapes intermédiaires 0.9.1 à 0.9.6 sont restées locales et n'ont jamais été publiées ; elles sont résumées ici.\n\n**Perte de données et chemins d'erreur**\n* Une erreur sur les énumérations interrompt désormais le déplacement. Auparavant l'ancien alias était supprimé quand même — et ensuite il avait disparu, tandis que le nouveau ne figurait dans aucune énumération\n* Un échec partiel lors de la suppression ne transforme plus le bouton « réessayer » en décor : seul ce qui est réellement parti est retiré\n* Les points orphelins sont supprimés aussi à la deuxième tentative\n* Une erreur de chargement des énumérations laisse l'état précédent en place au lieu de le vider — et tant qu'elles sont inconnues, rien n'est écrit. Avant, un seul hoquet pouvait faire tomber un alias hors de toutes les pièces et fonctions\n* Une erreur de chargement de vos propres modèles est signalée au lieu d'être avalée ; sinon l'enregistrement suivant aurait remplacé un modèle existant par la version 1\n\n**Connexion et affichage**\n* L'onglet refonctionne après une coupure de connexion. Le WebSocket de l'Admin émet `connect` une seule fois par vie de page, puis `reconnect` — personne n'écoutait, et ni les changements d'objets ni ceux de valeurs n'arrivaient\n* Le mode modèles ne se reconstruit plus chaque seconde, et là où va la sélection vont aussi ses abonnements\n* « Diffère de l'alias » s'affiche maintenant aussi en mode alias — là où la mention dit le plus\n* Changer de source rapidement ne récupère plus une valeur étrangère ; la liste de saut entre sources n'apparaît jamais en double\n* Les noms d'objets suivent la langue de l'Admin ; la correspondance des fonctions examine toutes les langues et ne crée plus de doublon\n\n**Modèles**\n* Une indication de nom cassée ne met plus à terre toute la vue des sources — y compris la forme imbriquée `(a+)+`, sur laquelle le moteur d'expressions se bloque\n* La formule d'une source de secours survit à la mise à jour, un type d'appareil inconnu ne lève plus d'erreur\n* L'import vérifie plus que l'identifiant et les états ; un identifiant saisi à la main ne remplace plus le modèle d'autrui\n* Le marqueur `%N%` ne touche plus que le numéro de sortie, et non chaque chiffre final\n* Le volet obtient son STOP : un appui sur un bouton n'a aucun état à lire, et ce cas était inconnu de l'application des modèles — **aucun** alias de volet n'en a jamais eu\n* ON_TIME trouve sa place (quatre modèles portaient le mauvais rôle)\n\n**MQTT et Tasmota**\n* Une entrée `custom` vide ne met plus rien à terre, `enabled: false` compte comme désactivé\n* Plus de faux « ne peut pas publier » pour ioBroker.mqtt et sonoff — là, la capacité de publication est simplement inconnue, et non refusée\n* « Réponse reçue » uniquement pour une vraie réponse ; `Vcc` et `Command` ne sont pas des commandes\n\n**Rapidité, mesurée sur un système de production de 24 786 objets**\n* Le champ de recherche ne bloque plus : **236 ms par frappe → 0**, l'arbre entier **263 → 67 ms**\n* Un redessin ne coûte plus une demi-seconde — recherche binaire au lieu de parcours linéaires : dessiner une source **15,8 → 1,6 ms**, un alias de 50 points **51,9 → 14,2 ms**\n* Une formule de lecture ne peut plus figer l'onglet durablement\n* On s'abonne à ce qu'on lit — auparavant, un seul alias pouvait s'abonner à la moitié d'un adaptateur",
|
|
39
|
+
"it": "Sette pacchetti da una revisione del codice — 45 correzioni tra la 0.9.0 e questa versione. I passi intermedi dalla 0.9.1 alla 0.9.6 sono rimasti locali e non sono mai stati pubblicati; qui sono riassunti.\n\n**Perdita di dati e percorsi d'errore**\n* Un errore sulle enumerazioni ora ferma lo spostamento. Prima il vecchio alias veniva comunque cancellato — e dopo non c'era più, mentre il nuovo non compariva in nessuna enumerazione\n* Un fallimento parziale durante la cancellazione non riduce più il pulsante «riprova» a una finta: viene tolto solo ciò che è davvero sparito\n* I punti orfani vengono cancellati anche al secondo tentativo\n* Un errore di caricamento delle enumerazioni lascia in piedi lo stato precedente invece di svuotarlo — e finché sono sconosciute non viene scritto nulla. Prima bastava un singhiozzo perché un alias cadesse fuori da tutte le stanze e le funzioni\n* Un errore di caricamento dei modelli propri viene segnalato anziché ingoiato; altrimenti il salvataggio successivo avrebbe sostituito un modello esistente con la versione 1\n\n**Connessione e visualizzazione**\n* Dopo un'interruzione della connessione la scheda torna a funzionare. Il WebSocket dell'Admin emette `connect` una sola volta per vita della pagina e poi `reconnect` — nessuno lo ascoltava, e non arrivavano né modifiche di oggetti né di valori\n* La modalità modelli non si ricostruisce più ogni secondo, e dove va la selezione vanno anche le sue sottoscrizioni\n* «Differisce dall'alias» compare ora anche in modalità alias — dove il segno dice di più\n* Cambiare sorgente rapidamente non recupera più un valore altrui; l'elenco di salto tra sorgenti non appare mai due volte\n* I nomi degli oggetti seguono la lingua dell'Admin; il confronto delle funzioni guarda tutte le lingue e non crea più un doppione\n\n**Modelli**\n* Un suggerimento di nome rotto non manda più in blocco l'intera vista delle sorgenti — compresa la forma annidata `(a+)+`, sulla quale il motore delle espressioni si inchioda\n* La formula di una sorgente di riserva sopravvive all'aggiornamento, un tipo di dispositivo sconosciuto non solleva più errori\n* L'importazione controlla più di id e stati; un id digitato a mano non sostituisce più il modello di qualcun altro\n* Il segnaposto `%N%` colpisce solo il numero dell'uscita, non ogni cifra finale\n* La tapparella ottiene il suo STOP: la pressione di un tasto non ha stato da leggere, e l'applicazione dei modelli non conosceva questo caso — **nemmeno un** alias di tapparella ne ha mai avuto uno\n* ON_TIME trova il suo posto (quattro modelli portavano il ruolo sbagliato)\n\n**MQTT e Tasmota**\n* Una voce `custom` vuota non manda più in blocco nulla, `enabled: false` vale come spento\n* Niente più falsi «non può pubblicare» per ioBroker.mqtt e sonoff — lì la capacità di pubblicare è semplicemente sconosciuta, non negata\n* «Risposta ricevuta» solo per una risposta vera; `Vcc` e `Command` non sono comandi\n\n**Velocità, misurata su un sistema di produzione con 24 786 oggetti**\n* La casella di ricerca non blocca più: **236 ms per battuta → 0**, l'intero albero **263 → 67 ms**\n* Un ridisegno non costa più mezzo secondo — ricerca binaria invece di scansioni lineari: disegnare una sorgente **15,8 → 1,6 ms**, un alias con 50 punti **51,9 → 14,2 ms**\n* Una formula di lettura non può più congelare la scheda per sempre\n* Si sottoscrive ciò che si legge — prima un singolo alias poteva sottoscrivere mezzo adapter",
|
|
40
|
+
"es": "Siete paquetes de una revisión de código: 45 correcciones entre la 0.9.0 y esta versión. Los pasos intermedios 0.9.1 a 0.9.6 quedaron en local y nunca se publicaron; aquí están resumidos.\n\n**Pérdida de datos y caminos de error**\n* Un error en las enumeraciones detiene ahora el traslado. Antes el alias antiguo se borraba igualmente, y después ya no estaba, mientras el nuevo no figuraba en ninguna enumeración\n* Un fallo parcial al borrar ya no convierte el botón de reintento en un decorado: solo se retira lo que realmente desapareció\n* Los puntos huérfanos se borran también al segundo intento\n* Un error al cargar las enumeraciones deja en pie el estado anterior en lugar de vaciarlo, y mientras sean desconocidas no se escribe nada. Antes, un solo tropiezo podía dejar un alias fuera de todas las habitaciones y funciones\n* Un error al cargar las plantillas propias se comunica en vez de silenciarse; de lo contrario, el siguiente guardado habría sustituido una plantilla existente por la versión 1\n\n**Conexión y presentación**\n* Tras una caída de la conexión, la pestaña vuelve a funcionar. El WebSocket del Admin lanza `connect` una sola vez por vida de la página y `reconnect` después; nadie escuchaba, y no llegaban ni cambios de objetos ni de valores\n* El modo de plantillas ya no se reconstruye cada segundo, y adonde va la selección van también sus suscripciones\n* «Difiere del alias» aparece ahora también en el modo alias, que es donde más dice\n* Cambiar de fuente rápidamente ya no trae un valor ajeno; la lista de salto entre fuentes nunca aparece dos veces\n* Los nombres de objeto siguen el idioma del Admin; la comparación de funciones mira todos los idiomas y ya no crea un duplicado\n\n**Plantillas**\n* Una pista de nombre rota ya no tumba toda la vista de fuentes, incluida la forma anidada `(a+)+`, en la que el motor de expresiones se atasca\n* La fórmula de una fuente de reserva sobrevive a la actualización, un tipo de dispositivo desconocido ya no lanza error\n* La importación comprueba más que el id y los estados; un id escrito a mano ya no sustituye la plantilla de otra persona\n* El marcador `%N%` solo acierta en el número de salida, no en cualquier dígito final\n* La persiana recibe su STOP: pulsar un botón no tiene estado que leer, y ese caso era desconocido para la aplicación de plantillas: **ni un solo** alias de persiana lo tuvo nunca\n* ON_TIME encuentra su sitio (cuatro plantillas llevaban el rol equivocado)\n\n**MQTT y Tasmota**\n* Una entrada `custom` vacía ya no tumba nada, `enabled: false` cuenta como apagado\n* Se acabaron los falsos «no puede publicar» en ioBroker.mqtt y sonoff: allí la capacidad de publicar es simplemente desconocida, no denegada\n* «Respuesta recibida» solo ante una respuesta de verdad; `Vcc` y `Command` no son comandos\n\n**Velocidad, medida en un sistema de producción con 24 786 objetos**\n* El cuadro de búsqueda ya no bloquea: **236 ms por pulsación → 0**, el árbol entero **263 → 67 ms**\n* Un redibujado ya no cuesta medio segundo: búsqueda binaria en lugar de recorridos lineales; dibujar una fuente **15,8 → 1,6 ms**, un alias con 50 puntos **51,9 → 14,2 ms**\n* Una fórmula de lectura ya no puede congelar la pestaña para siempre\n* Se suscribe lo que se lee: antes, un único alias podía suscribir medio adaptador",
|
|
41
|
+
"pl": "Siedem pakietów z przeglądu kodu — 45 poprawek między 0.9.0 a tym wydaniem. Kroki pośrednie od 0.9.1 do 0.9.6 pozostały lokalne i nigdy nie zostały opublikowane; tutaj są zebrane razem.\n\n**Utrata danych i ścieżki błędów**\n* Błąd przy wyliczeniach zatrzymuje teraz przenoszenie. Wcześniej stary alias i tak był usuwany — a potem już go nie było, podczas gdy nowy nie figurował w żadnym wyliczeniu\n* Częściowe niepowodzenie przy usuwaniu nie zamienia już przycisku ponowienia w atrapę: wypisywane jest tylko to, co naprawdę zniknęło\n* Osierocone punkty są usuwane także przy drugim podejściu\n* Błąd wczytywania wyliczeń pozostawia poprzedni stan, zamiast go opróżniać — a dopóki są nieznane, nic nie jest zapisywane. Wcześniej jedno potknięcie mogło wyrzucić alias ze wszystkich pomieszczeń i funkcji\n* Błąd wczytywania własnych szablonów jest zgłaszany, a nie przemilczany; w przeciwnym razie kolejny zapis zastąpiłby istniejący szablon wersją 1\n\n**Połączenie i wyświetlanie**\n* Po zerwaniu połączenia zakładka znowu działa. WebSocket Admina wysyła `connect` tylko raz na czas życia strony, a potem `reconnect` — nikt tego nie słuchał i nie docierały ani zmiany obiektów, ani wartości\n* Tryb szablonów nie przebudowuje się już co sekundę, a wraz z wyborem przenoszą się jego subskrypcje\n* „Różni się od aliasu\" pojawia się teraz także w trybie aliasu — tam, gdzie mówi najwięcej\n* Szybka zmiana źródła nie pobiera już obcej wartości; lista skoków między źródłami nigdy nie pojawia się podwójnie\n* Nazwy obiektów podążają za językiem Admina; dopasowanie funkcji patrzy na wszystkie wersje językowe i nie tworzy już sobowtóra\n\n**Szablony**\n* Zepsuta podpowiedź nazwy nie unieruchamia już całego widoku źródeł — łącznie z zagnieżdżoną postacią `(a+)+`, na której zacina się silnik wyrażeń\n* Formuła źródła zastępczego przeżywa aktualizację, nieznany typ urządzenia nie wyrzuca już błędu\n* Wczytywanie sprawdza więcej niż identyfikator i stany; ręcznie wpisany identyfikator nie zastępuje już cudzego szablonu\n* Wypełniacz `%N%` trafia tylko w numer wyjścia, a nie w każdą końcową cyfrę\n* Roleta dostaje swój STOP: naciśnięcie przycisku nie ma stanu do odczytu, a tego przypadku stosowanie szablonów nie znało — **ani jeden** alias rolety nigdy go nie miał\n* ON_TIME znajduje swoje miejsce (cztery szablony niosły niewłaściwą rolę)\n\n**MQTT i Tasmota**\n* Pusty wpis `custom` już niczego nie unieruchamia, `enabled: false` liczy się jako wyłączone\n* Koniec z fałszywym „nie może wysyłać\" przy ioBroker.mqtt i sonoff — tam zdolność wysyłania jest po prostu nieznana, a nie zaprzeczona\n* „Odpowiedź otrzymana\" tylko przy prawdziwej odpowiedzi; `Vcc` i `Command` nie są poleceniami\n\n**Szybkość, zmierzona na systemie produkcyjnym z 24 786 obiektami**\n* Pole wyszukiwania już nie blokuje: **236 ms na naciśnięcie → 0**, całe drzewo **263 → 67 ms**\n* Przerysowanie nie kosztuje już pół sekundy — wyszukiwanie binarne zamiast przebiegów liniowych: narysowanie źródła **15,8 → 1,6 ms**, aliasu z 50 punktami **51,9 → 14,2 ms**\n* Formuła odczytu nie może już trwale zamrozić zakładki\n* Subskrybowane jest to, co czytane — wcześniej pojedynczy alias potrafił zasubskrybować pół adaptera",
|
|
42
|
+
"uk": "Сім пакетів із код-рев'ю — 45 виправлень між 0.9.0 і цим випуском. Проміжні кроки з 0.9.1 до 0.9.6 лишилися локальними й ніколи не публікувалися; тут вони зібрані разом.\n\n**Втрата даних і шляхи відмов**\n* Помилка в переліках тепер зупиняє перенесення. Раніше старий аліас усе одно видалявся — і після цього його не було, а новий не значився в жодному переліку\n* Часткова невдача під час видалення більше не перетворює кнопку повтору на бутафорію: знімається лише те, що справді зникло\n* Осиротілі точки видаляються й з другої спроби\n* Помилка завантаження переліків лишає попередній стан на місці, замість того щоб його спорожнити, — і поки вони невідомі, нічого не записується. Раніше одна затримка могла викинути аліас з усіх кімнат і функцій\n* Про помилку завантаження власних шаблонів тепер повідомляють, а не замовчують; інакше наступне збереження замінило б наявний шаблон версією 1\n\n**З'єднання та відображення**\n* Після обриву зв'язку вкладка знову працює. WebSocket адмінки видає `connect` лише раз за час життя сторінки, а далі тільки `reconnect` — цього ніхто не слухав, і не надходили ні зміни об'єктів, ні зміни значень\n* Режим шаблонів більше не перебудовується щосекунди, і разом з вибором переїжджають його підписки\n* «Відрізняється від аліаса» показується тепер і в режимі аліаса — там, де ця позначка каже найбільше\n* Швидке перемикання джерел більше не підтягує чуже значення; список переходу між джерелами ніколи не з'являється двічі\n* Імена об'єктів ідуть за мовою адмінки; зіставлення функцій дивиться на всі мовні варіанти й більше не створює двійника\n\n**Шаблони**\n* Зламана підказка імені більше не виводить з ладу весь вигляд джерела — разом із вкладеною формою `(a+)+`, на якій застрягає рушій виразів\n* Формула запасного джерела переживає оновлення, невідомий тип пристрою більше не спричиняє помилку\n* Імпорт перевіряє не лише ідентифікатор і стани; ідентифікатор, введений вручну, більше не заміняє чужий шаблон\n* Підстановка `%N%` влучає лише в номер виходу, а не в будь-яку останню цифру\n* Ролета отримує свій STOP: натискання кнопки не має стану для читання, і цього випадку застосування шаблонів не знало — **жоден** аліас ролети його ніколи не мав\n* ON_TIME знаходить своє місце (чотири шаблони несли хибну роль)\n\n**MQTT і Tasmota**\n* Порожній запис `custom` більше нічого не ламає, `enabled: false` вважається вимкненим\n* Більше жодних хибних «не може надсилати» для ioBroker.mqtt і sonoff — там здатність надсилати просто невідома, а не заперечена\n* «Відповідь отримано» — лише за справжньої відповіді; `Vcc` і `Command` не є командами\n\n**Швидкість, виміряно на робочій системі з 24 786 об'єктами**\n* Поле пошуку більше не блокує: **236 мс на натискання → 0**, усе дерево **263 → 67 мс**\n* Перемальовування більше не коштує пів секунди — двійковий пошук замість лінійних проходів: малювання джерела **15,8 → 1,6 мс**, аліаса з 50 точками **51,9 → 14,2 мс**\n* Формула читання більше не може назавжди заморозити вкладку\n* Підписуємося на те, що читаємо, — раніше один-єдиний аліас міг підписатися на половину адаптера",
|
|
43
|
+
"zh-cn": "一次代码评审带来的七个修复包——0.9.0 到本版本之间共 45 处修正。中间版本 0.9.1 至 0.9.6 只留在本地、从未发布,其内容汇总于此。\n\n**数据丢失与故障路径**\n* 枚举出错时现在会中止迁移。此前旧别名照样被删除——之后它已不存在,而新别名却不属于任何枚举\n* 删除过程中的部分失败不再把「重试」按钮变成摆设:只有真正消失的条目才会被注销\n* 孤立的数据点在第二次尝试时同样会被删除\n* 枚举加载失败时保留原有状态,而不是将其清空——并且在枚举未知期间不写入任何内容。以前一次卡顿就可能让某个别名从所有房间和功能中掉出去\n* 自建模板加载失败会被报告而非吞掉;否则下一次保存就会用版本 1 覆盖已有模板\n\n**连接与显示**\n* 连接中断后选项卡可以继续工作。Admin 的 WebSocket 在每个页面生命周期内只触发一次 `connect`,之后只有 `reconnect`——此前无人监听,对象变更和值变更都收不到\n* 模板模式不再每秒重建一次,选择移到哪里,它的订阅就跟到哪里\n* 「与别名不一致」现在在别名模式下同样显示——那正是这个标记最有意义的地方\n* 快速切换源不再取到别处的值;源跳转列表不会重复出现\n* 对象名称跟随 Admin 语言;功能比对会查看所有语言版本,不再创建重复项\n\n**模板**\n* 损坏的名称提示不再拖垮整个源视图——包括嵌套形式 `(a+)+`,表达式引擎会在它上面卡死\n* 备用源的公式在更新后得以保留,未知设备类型不再抛出异常\n* 导入时检查的不只是 id 和状态;手动输入的 id 不会再覆盖他人的模板\n* 占位符 `%N%` 现在只匹配输出编号,而不是任意末尾数字\n* 卷帘拿到了它的 STOP:按键动作没有可读取的状态,而模板应用此前并不认识这种情况——**没有一个**卷帘别名曾经有过\n* ON_TIME 找到了自己的位置(四个模板带着错误的角色)\n\n**MQTT 与 Tasmota**\n* 空的 `custom` 条目不再拖垮任何东西,`enabled: false` 视为已关闭\n* ioBroker.mqtt 和 sonoff 不再出现错误的「无法发送」——在那里发送能力只是未知,而非被否定\n* 只有收到真正的回复才显示「已收到回复」;`Vcc` 和 `Command` 并不是命令\n\n**速度,在拥有 24 786 个对象的生产系统上实测**\n* 搜索框不再阻塞:**每次按键 236 毫秒 → 0**,整棵树 **263 → 67 毫秒**\n* 重绘不再耗费半秒——以二分查找取代线性扫描:绘制一个源 **15.8 → 1.6 毫秒**,含 50 个数据点的别名 **51.9 → 14.2 毫秒**\n* 读取公式不会再让选项卡永久冻结\n* 订阅的正是要读取的内容——此前单个别名就可能订阅半个适配器"
|
|
96
44
|
},
|
|
97
45
|
"0.9.0": {
|
|
98
46
|
"en": "Several sources behind one alias are now visible: a chip names their count, every row its origin, and the way back leads from each source to the alias. The fields “reads from” and “writes to” show the full id, the pattern names now come from the admin, and values keep running in the alias view. A complete run on the production system brought four findings: the role list was half empty because the detector delivers its slot expressions as text with slashes — 210 roles instead of 232, and BRIGHTNESS without a role in six patterns; and a point the template lists under a different name now keeps its role and its caption at the source.",
|
|
@@ -145,19 +93,6 @@
|
|
|
145
93
|
"pl": "Publikacja przez npm trusted publishing (OIDC) — wydania są od teraz podpisywane z poświadczeniem pochodzenia. Bez zmian funkcjonalnych.",
|
|
146
94
|
"uk": "Публікація через npm trusted publishing (OIDC) — випуски тепер підписані з підтвердженням походження. Функціональних змін немає.",
|
|
147
95
|
"zh-cn": "通过 npm 可信发布(OIDC)发布——此后的版本均带有来源签名。无功能变更。"
|
|
148
|
-
},
|
|
149
|
-
"0.8.0": {
|
|
150
|
-
"en": "Ready for the repository: settings page in eleven languages, ESLint and a CI workshop, checks that run before every commit. The buttons at the bottom now follow the mode. New description.",
|
|
151
|
-
"de": "Bereit fürs Repository: Einstellungsseite in elf Sprachen, ESLint und eine CI-Werkstatt, Prüfungen vor jedem Commit. Die Knöpfe unten richten sich jetzt nach dem Modus. Neue Beschreibung.",
|
|
152
|
-
"ru": "Готово для репозитория: страница настроек на одиннадцати языках, ESLint и CI-мастерская, проверки перед каждым коммитом. Кнопки внизу теперь зависят от режима. Новое описание.",
|
|
153
|
-
"pt": "Pronto para o repositório: página de definições em onze idiomas, ESLint e uma oficina de CI, verificações antes de cada commit. Os botões em baixo seguem agora o modo. Nova descrição.",
|
|
154
|
-
"nl": "Klaar voor de repository: instellingenpagina in elf talen, ESLint en een CI-werkplaats, controles voor elke commit. De knoppen onderaan volgen nu de modus. Nieuwe beschrijving.",
|
|
155
|
-
"fr": "Prêt pour le dépôt : page de réglages en onze langues, ESLint et un atelier CI, vérifications avant chaque commit. Les boutons du bas suivent désormais le mode. Nouvelle description.",
|
|
156
|
-
"it": "Pronto per il repository: pagina delle impostazioni in undici lingue, ESLint e un’officina CI, controlli prima di ogni commit. I pulsanti in basso seguono ora la modalità. Nuova descrizione.",
|
|
157
|
-
"es": "Listo para el repositorio: página de ajustes en once idiomas, ESLint y un taller de CI, comprobaciones antes de cada commit. Los botones de abajo ahora siguen el modo. Nueva descripción.",
|
|
158
|
-
"pl": "Gotowe do repozytorium: strona ustawień w jedenastu językach, ESLint i warsztat CI, sprawdzenia przed każdym commitem. Przyciski na dole podążają teraz za trybem. Nowy opis.",
|
|
159
|
-
"uk": "Готово до репозиторію: сторінка налаштувань одинадцятьма мовами, ESLint і CI-майстерня, перевірки перед кожним комітом. Кнопки внизу тепер залежать від режиму. Новий опис.",
|
|
160
|
-
"zh-cn": "已为仓库做好准备:十一种语言的设置页面、ESLint 与 CI 工作流、每次提交前的检查。底部按钮现在会随模式变化。全新的说明文字。"
|
|
161
96
|
}
|
|
162
97
|
},
|
|
163
98
|
"titleLang": {
|