iobroker.alias-workbench 0.8.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -44,6 +44,63 @@ which pattern slots are filled and which are still free.
44
44
 
45
45
  *One row opened: where it reads from, which JSON field, the read function, the role — and the pattern slot that role fills.*
46
46
 
47
+ **JSON is unpacked without you writing a formula.** Many devices do not deliver
48
+ their readings as separate datapoints but as a single JSON — a Tasmota puts
49
+ everything into `tele/SENSOR`. Where the workbench finds valid JSON in a
50
+ source, it takes it apart and offers its fields in a drop-down:
51
+ `ENERGY.Power`, `ENERGY.Total`, `Wifi.Signal`. One click is enough, the
52
+ matching formula appears by itself — and in the guarded form:
53
+
54
+ ```js
55
+ JSON.parse(val)?.ENERGY?.Power ?? null
56
+ ```
57
+
58
+ The `?.` is not decoration. `tele/SENSOR` is a catch-all whose contents differ
59
+ from device to device and from message to message; the bare
60
+ `JSON.parse(val).ENERGY.Power` fails the moment `ENERGY` is absent — the alias
61
+ then delivers nothing at all and the controller writes a warning to the log.
62
+ With `?.` the result is simply `null`. And if the field is `0`, `0` is what
63
+ you get, not "no value": `??` only steps in for `null` and `undefined`.
64
+
65
+ It works in both directions. Where a row already carries a formula, the
66
+ workbench reads it back and shows the field it means instead of "custom
67
+ formula" — including the bare spelling without `?.`. Only something that
68
+ really does more than access a field (`JSON.parse(val)?.POWER === "ON"`) stays
69
+ a custom formula and is left alone. And what you wrote yourself stays: if your
70
+ formula differs from the one the template proposes, the row says so — it is
71
+ changed only when you ask for it.
72
+
73
+ **Role, room and function are kept in order too.** An alias is more than a
74
+ bundle of datapoints, and the workbench maintains the three things that make a
75
+ device recognisable as a device in ioBroker:
76
+
77
+ - **The roles of the points** come from the template or the pattern, and they
78
+ follow along when you switch the pattern — `switch.light` does not fit a
79
+ `socket` SET. The role picker is grouped by pattern slot and shows which
80
+ slot a role would fill and whether it is still free. Where a slot accepts
81
+ several spellings, all of them are offered: `LOWBAT` takes
82
+ `indicator.lowbat` just as well as `indicator.maintenance.lowbat` — so
83
+ whatever your own hardware writes is among them. Deprecated spellings stay
84
+ out.
85
+ - **The role of the channel** is the device type itself (`light`, `blind`,
86
+ `thermostat`), the way the admin's device adapter keeps it — that is what
87
+ other adapters recognise it by.
88
+ - **Room and function** do not live on the object but in `enum.rooms.*` and
89
+ `enum.functions.*`. The workbench proposes both — the room from the source,
90
+ its name or the target folder, the function from the template or the
91
+ detected device type — enters the alias there when writing, and takes it out
92
+ again when you change the assignment. Move the alias and the assignment
93
+ moves with it; other members of the same enumeration are left untouched.
94
+ - **And their pictures.** The admin ships ready-made room and function
95
+ templates with icons. Where an existing enumeration has none — ones mirrored
96
+ from a Homematic CCU never do — the workbench fills it in. Next to the field
97
+ you see beforehand what is going to happen. See
98
+ [Room and function](#room-and-function).
99
+
100
+ None of this happens out of sight: every one of these changes appears in the
101
+ dry run before anything is written — including the ones to enumerations, which
102
+ are, after all, other people's objects.
103
+
47
104
  **Templates.** A template describes how a device source becomes a finished alias
48
105
  device. Templates are plain JSON files, one per template — see
49
106
  [Template format](#template-format). Sixteen ship with the adapter: four for
@@ -510,6 +567,26 @@ imported, and that both language files carry the same keys.
510
567
 
511
568
  ## Changelog
512
569
 
570
+ ### 0.9.0
571
+ * The role list is complete again: the detector hands out the expressions of its slots as text WITH slashes (`/^indicator…$/`), not as a regular expression. Take the slashes for part of the expression and you find neither start nor end afterwards — 210 roles instead of 232, and `indicator.lowbat` of all things was missing, the role every Homematic device writes. In the role picker, no slot of the pattern was offered at all any more, only the line "show all roles"
572
+ * From the same cause, BRIGHTNESS lost its role in six colour-light patterns — the slot could be added over and over and could not be filled by any route. Seven places in the code read a slot expression; they all go through one function now, and a test checks the role list against what the detector actually delivers instead of against hand-written expressions
573
+ * The deviation card tells the truth again when a point is deselected: it claimed "would not have counted anyway" even for points that do have a slot in the pattern (same cause)
574
+ * A point the template lists under a different name now keeps its role and its caption at the source: the workbench has two functions for the same job, and the second one bailed out when a template had matched. At the alias it said `state` and "Lavalampe ACTUAL", at the source `sensor.light` and nothing at all — updating would have overwritten both. What the template wanted instead now shows as a mark on the row, as everywhere else, and can be taken over field by field
575
+ * On load, the workbench no longer fetches two files that do not exist: it searched the admin's directory for file names and put `assets/` in front, although whole paths are listed there — and two entries expressly do not live in that folder (`"path": ""`). That produced two 404s in the browser console. It now looks for paths instead of names and strips a leading `./`: the manifest writes `assets/…`, the `index.html` `./assets/…`, and without that step the same file would sit twice in a list that ends after 25 entries
576
+ * The readme now mentions two things it used to keep quiet about: that the workbench proposes the read formula itself from recognised JSON — guarded against missing fields, and readable in both directions — and that it maintains roles, the channel role, room and function along with their pictures
577
+ * Values now keep running in the alias view: the workbench subscribed to the alias points but displays the values of their sources, so the numbers were fetched once and then stood still. It now subscribes to the sources as well. The header shows how many subscriptions are running — a subscription covers a whole branch, and its tooltip lists them, so it is visible right away if one is ever left behind
578
+ * The caption of a row now lives in a tooltip on its id instead of standing next to it — with the marks a row can carry, it had become so crowded that role and value were pushed off to the right. A dotted underline shows where a tooltip waits
579
+ * An alias whose points read from more than one node now says so: a chip "n sources" next to "to the source", listing every node with its number of points; the jump button asks where to go instead of silently taking the majority; and the individual rows that read from elsewhere carry a mark naming their adapter. Before, the only way to notice was to open every row. The way back holds too: from a secondary source, "to the alias" is there again — it used to require being at the majority source. Spartas of one and the same device (a Tasmota `stat` and `tele`) do not count as a second source. The choice appears only under "to the source" — jumping to the alias has exactly one destination. Spartas next to each other are merged as well now, not just against the main source — a Tasmota read through `stat` and `tele` counted as two. And both the way back and the row marks now go by the source you are standing at: "to the alias" is there at every source of an alias, including the device above a sparte, and a row is marked when it does not come from here. At the alias itself every row carries its tag — there is no place you are standing, so no source is the normal one; a tie no longer decides anything. The tag names the source, not the adapter, and no entry in the list is highlighted
580
+ * Nodes without datapoints are no longer left out of the tree: a channel, device or folder that exists but is empty now stands there greyed out, without a count and not clickable, with a tooltip saying so. Left out, it looked like the node did not exist at all — while in truth the adapter had not created its datapoints. They do not count as hits when filtering
581
+
582
+ ### 0.8.3
583
+ * The dry run now shows enumerations as a comparison as well: the "before" column stayed empty for them, because enumerations live in their own store and the dry run only looked in the object store. Everything appeared as new, so it was impossible to see that eleven of twelve members were already there
584
+ * …and the interface no longer announces a creation where it changes: on such an alias the chip said "will be newly created", the button offered "create alias", the dry run was titled "what would come into being", the room and function were guessed instead of read, orphaned points went unnoticed and move/swap/remove did nothing. All of them asked whether the channel is an object instead of whether the alias exists
585
+ * An alias whose channel exists only as an id, not as an object — the usual result of adding points by hand in the admin — is now compared against the stored state at all. Before, the whole comparison bailed out there, and updating would have replaced captions with the bare point names and dropped roles, formulas and write direction along with them
586
+ * The same rule was missing a third time, for aliases where several points read from one and the same source datapoint — a blind, where OPEN, CLOSE, SET and pct all go to `level`. Only the first of them kept its write source; the others lost it, and updating would have made the blind unreachable through its alias
587
+ * Updating an existing alias no longer overwrites its caption with the bare row name, and no longer turns a read-only alias into a writable one: the function that takes the stored alias over into the draft was missing both rules its twin already had. The false "differs from the stored alias" mark that came with it is gone too
588
+ * A line that comes from the stored alias and reads from a source outside the selected node now gets its value: the values were fetched before that line even existed, so it claimed "source delivers nothing" while the alias was working fine. Only showed on aliases assembled from several adapters, and only until the node was clicked a second time
589
+
513
590
  ### 0.8.2
514
591
  * A source that already has an alias now says so when the target points elsewhere: "This source already has alias.0.… — that one stays where it is", with a button "move it instead …" that opens the move dialog prefilled. Nothing is forbidden — two aliases on one source remain possible, they are no longer silent
515
592
  * The same line appears in the dry run, right above what cannot be written
@@ -185,6 +185,11 @@
185
185
  .tree .node.pick:hover:not(.sel) .grp { color:inherit; opacity:.85; }
186
186
  .tree .node.pick:hover:not(.sel) .kind { background:rgba(255,255,255,.3); color:inherit; }
187
187
  .tree .node.pick:hover:not(.sel) .geraetepunkt { color:inherit; }
188
+ /* Ein Knoten ohne Datenpunkte: da, aber nichts drin. Gedaempft und
189
+ ohne Zahl - er soll die Luecke zeigen, nicht um Aufmerksamkeit
190
+ bitten. Kein Zeiger, kein Hover: waehlbar ist er ohnehin nicht. */
191
+ .tree .node.leer { opacity:.45; font-style:italic; }
192
+ .tree .node.leer .kind { background:transparent; border:1px solid var(--line); }
188
193
  .tree .node.sel { background:var(--accent); color:var(--accent-ink); font-weight:600; }
189
194
  .tree .node.sel .kind { background:rgba(255,255,255,.22); color:inherit; }
190
195
  /* Die Vorlagenliste benutzt dieselben Knotenzeilen, hat aber statt
@@ -390,6 +395,24 @@
390
395
 
391
396
  /* „Vorlage: x" an einer Zeile, deren Bestand von der Vorlage abweicht -
392
397
  gedaempfter als die Marke „geaendert", es ist ja nur ein Angebot. */
398
+ /* Die Quelle dieses Punktes liegt woanders als die der uebrigen.
399
+
400
+ Keine Warnung, eine Auskunft: gedeckte Farbe, gestrichelter Rahmen -
401
+ unterscheidbar von „geaendert" (Akzent) und „weicht ab" (Warnung),
402
+ und vertraeglich mit der Toenung „kein Platz im Muster", die
403
+ unabhaengig davon an derselben Zeile stehen kann. */
404
+ .erow .geae.fremdquelle {
405
+ color:var(--ink-2); background:transparent;
406
+ border-style:dashed; border-color:var(--line-strong);
407
+ }
408
+ /* Der Kopfchip „n Quellen" und die Auswahlliste am Sprungknopf. */
409
+ .chip.quellenzahl { cursor:help; }
410
+ .sprungwahl { position:relative; display:inline-flex; }
411
+ .vorschlaege.sprungliste { min-width:300px; max-width:520px; z-index:60; }
412
+ .vorschlaege .vzkopf {
413
+ padding:4px 9px; font-size:11px; color:var(--ink-3);
414
+ border-bottom:1px solid var(--line);
415
+ }
393
416
  .erow .geae.tplabw { color:var(--ink-3); background:var(--surface-2); }
394
417
  .leerhilfe .lh2 { margin-top:11px; font-size:12px; color:var(--ink-3); }
395
418
 
@@ -495,18 +518,34 @@
495
518
  .erow.ohneplatz { background:color-mix(in srgb, var(--warn-soft) 80%, transparent); }
496
519
  .erow.ohneplatz:hover, .erow.ohneplatz.open {
497
520
  background:color-mix(in srgb, var(--warn-soft) 100%, transparent); }
498
- .listbar .legende { display:inline-flex; align-items:center; gap:5px;
499
- font-size:11px; color:var(--ink-3); white-space:nowrap; }
500
- /* Dasselbe Feld wie die Zeile, nur klein — die Legende zeigt die Farbe,
501
- nach der man in der Liste sucht. */
502
- .listbar .legende .lgmarke { width:14px; height:11px; border-radius:3px;
503
- border:1px solid var(--line);
504
- background:color-mix(in srgb, var(--warn-soft) 80%, transparent);
505
- display:inline-block; }
521
+ /* Die Legende steht in der Liste, nicht in der Leiste: dieselbe
522
+ Toenung wie die Zeilen, dieselbe Breite, unmittelbar ueber der
523
+ ersten. Sie beschreibt die Toenung nicht — sie ist ein Stueck
524
+ davon. Zwei blassere Anlaeufe davor scheiterten daran, dass
525
+ niemand sie mit den Zeilen darunter verband (Ricardo, 08.09.2026).
526
+ Der Zeiger zeigt einen Hinweis: der lange Text haengt daran. */
527
+ .legendenzeile { display:flex; align-items:center; gap:8px;
528
+ padding:5px 15px; border-bottom:1px solid var(--line);
529
+ font-size:11.5px; color:var(--warn);
530
+ background:color-mix(in srgb, var(--warn-soft) 80%, transparent); }
531
+ /* Das „i" oeffnet die lange Erklaerung als Dialog. Als Tooltip wurde
532
+ sie ueber zehn Zeilen hoch und legte sich ueber die Liste, die man
533
+ gerade lesen wollte (Ricardo, 08.09.2026). */
534
+ .legendenzeile .infoknopf {
535
+ width:15px; height:15px; flex:0 0 15px; padding:0; border-radius:50%;
536
+ border:1px solid color-mix(in srgb, var(--warn) 55%, transparent);
537
+ background:transparent; color:var(--warn); cursor:pointer;
538
+ font-family:var(--sans); font-size:10px; font-weight:700; font-style:italic;
539
+ line-height:1; display:inline-flex; align-items:center; justify-content:center; }
540
+ .legendenzeile .infoknopf:hover { background:var(--warn); color:var(--surface); }
506
541
  .erow input[type="checkbox"] { accent-color:var(--accent); cursor:pointer; margin:0; }
507
542
  .erow .mk2 { text-align:center; font-size:11px; }
508
543
  .erow .mk2.ok { color:var(--ok); } .erow .mk2.bad { color:var(--bad); } .erow .mk2.out { color:var(--ink-3); }
509
544
  .erow .nm3 { font-family:var(--mono); font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
545
+ /* Traegt die Kennung eine Beschriftung, sagt der Mauszeiger es an:
546
+ ein zarter Unterstrich, wie bei einer Abkuerzung. Sonst raet
547
+ niemand, dass dort ein Hinweis haengt. */
548
+ .erow .nm3[title] { text-decoration:underline dotted var(--line-strong); text-underline-offset:3px; }
510
549
  .erow .nm3 em { font-style:normal; font-weight:400; color:var(--ink-3); font-size:10.5px; margin-left:6px; }
511
550
  .erow .nm3 .hand { font-family:var(--sans); font-size:8px; font-weight:700; letter-spacing:.05em;
512
551
  text-transform:uppercase; background:var(--surface-3); color:var(--ink-3);
@@ -554,6 +593,16 @@
554
593
 
555
594
  /* ---- Bearbeitungsfelder im Detail ---- */
556
595
  .detail .fields { display:flex; gap:12px; flex-wrap:wrap; align-items:flex-end; }
596
+ /* Feld plus die volle Kennung darunter. Ein `select` zeigt zugeklappt
597
+ nur den Text seiner Option, und der traegt die Instanz nicht — die
598
+ steht sonst allein in der Gruppenueberschrift, die man erst beim
599
+ Aufklappen sieht (Ricardo, 08.09.2026). Hier darf sie umbrechen,
600
+ also gibt es keine Breitengrenze. */
601
+ .detail .feldstapel { display:flex; flex-direction:column; gap:3px; }
602
+ .detail .vollid { font-family:var(--mono); font-size:10.5px; color:var(--ink-3);
603
+ overflow-wrap:anywhere; line-height:1.35; }
604
+ .detail .vollid:empty { display:none; }
605
+
557
606
  .detail .fld { display:flex; flex-direction:column; gap:2px; }
558
607
  .detail .fld > span { font-family:var(--sans); font-size:8.5px; letter-spacing:.06em;
559
608
  text-transform:uppercase; color:var(--ink-3); font-weight:700; }
package/admin/detector.js CHANGED
@@ -1 +1 @@
1
- (()=>{var $e=Object.create;var le=Object.defineProperty;var qe=Object.getOwnPropertyDescriptor;var Ie=Object.getOwnPropertyNames;var Ae=Object.getPrototypeOf,Ue=Object.prototype.hasOwnProperty;var Ce=(a,r,l)=>()=>{if(l)throw l[0];try{return a&&(r=a(a=0)),r}catch(i){throw l=[i],i}};var G=(a,r)=>()=>{try{return r||a((r={exports:{}}).exports,r),r.exports}catch(l){throw r=0,l}};var Pe=(a,r,l,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of Ie(r))!Ue.call(a,n)&&n!==l&&le(a,n,{get:()=>r[n],enumerable:!(i=qe(r,n))||i.enumerable});return a};var ie=(a,r,l)=>(l=a!=null?$e(Ae(a)):{},Pe(r||!a||!a.__esModule?le(l,"default",{value:a,enumerable:!0}):l,a));var X=G(H=>{"use strict";Object.defineProperty(H,"__esModule",{value:!0});H.StateType=H.Types=void 0;var ne;(function(a){a.unknown="unknown",a.airCondition="airCondition",a.airPurifier="airPurifier",a.airQuality="airQuality",a.blind="blind",a.blindButtons="blindButtons",a.button="button",a.buttonSensor="buttonSensor",a.camera="camera",a.chart="chart",a.coAlarm="coAlarm",a.contact="contact",a.cie="cie",a.ct="ct",a.dimmer="dimmer",a.electricity="electricity",a.door="door",a.fan="fan",a.fireAlarm="fireAlarm",a.floodAlarm="floodAlarm",a.gate="gate",a.hue="hue",a.humidity="humidity",a.illuminance="illuminance",a.image="image",a.info="info",a.instance="instance",a.light="light",a.location="location",a.locationOne="locationOne",a.lock="lock",a.media="media",a.motion="motion",a.percentage="percentage",a.pump="pump",a.rgb="rgb",a.rgbSingle="rgbSingle",a.rgbwSingle="rgbwSingle",a.slider="slider",a.socket="socket",a.temperature="temperature",a.fillLevel="fillLevel",a.flow="flow",a.pressure="pressure",a.thermostat="thermostat",a.vacuumCleaner="vacuumCleaner",a.volume="volume",a.volumeGroup="volumeGroup",a.warning="warning",a.weatherCurrent="weatherCurrent",a.weatherForecast="weatherForecast",a.window="window",a.windowTilt="windowTilt"})(ne||(H.Types=ne={}));var oe;(function(a){a.Number="number",a.String="string",a.Boolean="boolean"})(oe||(H.StateType=oe={}))});var z=G(O=>{"use strict";Object.defineProperty(O,"__esModule",{value:!0});O.checkEnum=ue;O.roleOrEnum=j;O.roleOrEnumLight=_e;O.roleOrEnumBlind=Be;O.roleOrEnumGate=Le;O.roleOrEnumWindow=De;O.roleOrEnumDoor=Me;O.getEnums=ke;O.getAllStatesInChannel=We;O.getAllStatesInDevice=Fe;O.getObjectsBelowId=be;O.getFunctionEnums=Ge;O.getParentId=He;function ue(a,r){let l=!1;return a&&a.forEach(i=>{let n=i.lastIndexOf(".");n!==-1&&(i=i.substring(n+1));for(let u in r)if(Object.prototype.hasOwnProperty.call(r,u)&&r[u].find(o=>o.test(i)))return l=!0,!1}),l}function j(a,r,l,i){return a.common.role&&(l!=null&&l.includes(a.common.role))?!0:ue(r,i)}var se={en:[/lights?/i,/lamps?/i,/ceilings?/i],de:[/licht(er)?/i,/lampen?/i,/beleuchtung(en)?/i],ru:[/свет/i,/ламп[аы]/i,/торшеры?/,/подсветк[аи]/i,/лампочк[аи]/i,/светильники?/i]},de=["switch.light","dimmer","value.dimmer","level.dimmer","sensor.light","state.light"];function _e(a,r){return j(a,r,de,se)}var J={en:[/blinds?/i,/windows?/i,/shutters?/i],de:[/rollladen?/i,/fenstern?/i,/beschattung(en)?/i,/jalousien?/i],ru:[/ставни/i,/рольставни/i,/окна|окно/,/жалюзи/i]},fe=["blind","level.blind","value.blind","action.stop","button.stop","button.stop.blind","button.open.blind","button.close.blind","level.tilt","value.tilt","button.tilt.open","button.tilt.close","button.tilt.stop"];function Be(a,r){return j(a,r,fe,J)}var ce={en:[/gates?/i],de:[/^toren$/i,/^tor$/i],ru:[/ворота/i]},me=["gate","value.gate","switch.gate","action.stop","button.stop"];function Le(a,r){return j(a,r,me,ce)}var pe=["window","state.window","sensor.window","value.window"];function De(a,r){return j(a,r,pe,J)}var ye={en:[/doors?/i,/gates?/i,/wickets?/i,/entry|entries/i],de:[/^türe?/i,/^tuere?/i,/^tore?$/i,/einfahrt(en)?/i,/pforten?/i],ru:[/двери|дверь/i,/ворота/i,/калитка|калитки/,/въезды?/i,/входы?/i]},Te=["door","state.door","sensor.door"];function Me(a,r){return j(a,r,Te,ye)}function ke(){return{door:{roles:Te,words:ye},window:{roles:pe,words:J},blind:{roles:fe,words:J},gate:{roles:me,words:ce},light:{roles:de,words:se}}}function Se(a){return a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function We(a,r){let l=[],i=new RegExp(`^${Se(r)}\\.[^.]+$`);return a.forEach(n=>i.test(n)&&l.push(n)),l}function Fe(a,r){let l=[],i=new RegExp(`^${Se(r)}\\.[^.]+\\.[^.]+$`);return a.forEach(n=>i.test(n)&&l.push(n)),l}function be(a,r){let l=[];r+=".";let i=0,n=a.length-1,u=-1;for(;i<=n;){let o=Math.floor((i+n)/2);a[o]<r?i=o+1:(u=o,n=o-1)}if(u===-1||u>=a.length)return l;for(let o=u;o<a.length;o++){let c=a[o];if(c===r||c.startsWith(r))l.push(c);else break}return l}function Ge(a,r){var l,i,n;let u=[],o=/^enum\.functions\./,c=be(r,"enum");for(let d of c)Object.prototype.hasOwnProperty.call(a,d)&&o.test(d)&&((l=a[d])===null||l===void 0?void 0:l.type)==="enum"&&(!((n=(i=a[d].common)===null||i===void 0?void 0:i.members)===null||n===void 0)&&n.length)&&u.push(d);return u}function He(a){let r=a.lastIndexOf(".");return r!==-1?a.substring(0,r):a}});var ae=G(ee=>{"use strict";Object.defineProperty(ee,"__esModule",{value:!0});ee.patterns=void 0;var e=X(),y=z(),f=/^[^.]+\.setting\./,we=/^[^.]+\.setting\.|^level\.temperature\.(heating|cooling)$/,Z={heating:{role:/^level\.temperature\.heating$/,indicator:!1,write:!0,type:e.StateType.Number,name:"SET_HEATING",requiredOneOf:"setpoint",defaultRole:"level.temperature.heating",defaultUnit:"\xB0C",ignoreRole:f},cooling:{role:/^level\.temperature\.cooling$/,indicator:!1,write:!0,type:e.StateType.Number,name:"SET_COOLING",requiredOneOf:"setpoint",defaultRole:"level.temperature.cooling",defaultUnit:"\xB0C",ignoreRole:f}},t={working:{role:/^indicator\.working$/,indicator:!0,notSingle:!0,name:"WORKING",required:!1,defaultRole:"indicator.working",defaultType:e.StateType.Boolean},unreach:{role:/^indicator(\.maintenance)?\.unreach$/,indicator:!0,type:e.StateType.Boolean,notSingle:!0,name:"UNREACH",required:!1,defaultRole:"indicator.maintenance.unreach"},lowbat:{role:/^indicator(\.maintenance)?\.(lowbat|battery)$/,indicator:!0,type:e.StateType.Boolean,notSingle:!0,name:"LOWBAT",required:!1,defaultRole:"indicator.maintenance.lowbat"},maintain:{role:/^indicator\.maintenance$/,indicator:!0,type:e.StateType.Boolean,notSingle:!0,name:"MAINTAIN",required:!1,defaultRole:"indicator.maintenance"},error:{role:/^indicator\.error$/,indicator:!0,notSingle:!0,name:"ERROR",required:!1,defaultRole:"indicator.error",defaultType:e.StateType.String},direction:{role:/^indicator\.direction$/,indicator:!0,type:e.StateType.Boolean,notSingle:!0,name:"DIRECTION",required:!1,defaultRole:"indicator.direction"},direction_enum:{role:/^(indicator|value)\.direction$/,type:e.StateType.Number,notSingle:!0,name:"DIRECTION_ENUM",required:!1,defaultStates:{0:"None",1:"Up/Open",2:"Down/Close",3:"Unknown"},defaultRole:"value.direction"},reachable:{role:/^indicator\.reachable$/,indicator:!0,type:e.StateType.Boolean,notSingle:!0,name:"CONNECTED",required:!1,defaultRole:"indicator.reachable",inverted:!0},rssi:{role:/^value\.rssi$/,indicator:!1,write:!1,type:e.StateType.Number,notSingle:!0,name:"RSSI",required:!1,defaultRole:"value.rssi",defaultUnit:"dBm"},onTime:{role:/^level\.timer\.off$/,indicator:!1,write:!0,type:e.StateType.Number,name:"ON_TIME",required:!1,defaultRole:"level.timer.off",defaultUnit:"s",ignoreRole:f},battery:{role:/^value\.battery$/,indicator:!1,type:e.StateType.Number,write:!1,name:"BATTERY",required:!1,defaultRole:"value.battery",defaultUnit:"%"}},$={power:{role:/^value\.power$/,indicator:!1,type:e.StateType.Number,write:!1,name:"ELECTRIC_POWER",required:!1,defaultRole:"value.power",defaultUnit:"W"},current:{role:/^value\.current$/,indicator:!1,type:e.StateType.Number,write:!1,name:"CURRENT",required:!1,defaultRole:"value.current",defaultUnit:"mA"},voltage:{role:/^value\.voltage$/,indicator:!1,type:e.StateType.Number,write:!1,name:"VOLTAGE",required:!1,defaultRole:"value.voltage",defaultUnit:"V"},consumption:{role:/^value\.power\.consumption$/,indicator:!1,type:e.StateType.Number,write:!1,name:"CONSUMPTION",required:!1,defaultRole:"value.power.consumption",defaultUnit:"Wh"},frequency:{role:/^value\.frequency$/,indicator:!1,type:e.StateType.Number,write:!1,name:"FREQUENCY",required:!1,defaultRole:"value.frequency",defaultUnit:"Hz"}},v={speed:{role:/(speed|mode)\.fan$/,indicator:!1,write:!0,type:e.StateType.Number,name:"SPEED",required:!1,defaultRole:"level.mode.fan",defaultStates:{0:"AUTO",1:"HIGH",2:"LOW",3:"MEDIUM",4:"QUIET",5:"TURBO"},ignoreRole:f},power:{role:/^switch(\.power)?$/,indicator:!1,write:!0,type:[e.StateType.Boolean,e.StateType.Number],searchInParent:!0,name:"POWER",required:!1,defaultRole:"switch.power"},speedLevel:{role:/^level\.speed$/,indicator:!1,write:!0,type:e.StateType.Number,name:"SPEED_LEVEL",required:!1,defaultRole:"level.speed",defaultUnit:"%",ignoreRole:f},swing:{role:/swing$/,indicator:!1,write:!0,type:e.StateType.Number,searchInParent:!0,name:"SWING",required:!1,defaultRole:"level.mode.swing",defaultStates:{0:"AUTO",1:"HORIZONTAL",2:"STATIONARY",3:"VERTICAL"},ignoreRole:f},swingBoolean:{role:/swing$/,indicator:!1,write:!0,type:e.StateType.Boolean,searchInParent:!0,name:"SWING",required:!1,defaultRole:"switch.mode.swing",ignoreRole:f},airflowDirection:{role:/^level\.mode\.airflow$/,indicator:!1,write:!0,type:e.StateType.Number,name:"AIRFLOW_DIRECTION",required:!1,defaultRole:"level.mode.airflow",defaultStates:{0:"FORWARD",1:"REVERSE"},ignoreRole:f}},je={0:"UNKNOWN",1:"LOW",2:"MEDIUM",3:"HIGH",4:"CRITICAL"};function A(a,r,l){return[{role:new RegExp(`^value\\.${r}$`),indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:a,required:!1,defaultRole:`value.${r}`,defaultUnit:l},{role:new RegExp(`^value\\.${r}\\.level$`),indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:`${a}_LEVEL`,required:!1,defaultRole:`value.${r}.level`,defaultStates:je}]}var he={thermostat:{role:/^value\.mode\.thermostat$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"WORKING_MODE",required:!1,defaultRole:"value.mode.thermostat",defaultStates:{0:"OFF",1:"HEAT",2:"COOL"}},airCondition:{role:/^value\.mode\.airconditioner$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"WORKING_MODE",required:!1,defaultRole:"value.mode.airconditioner",defaultStates:{0:"IDLE",1:"HEAT",2:"COOL"}}},x={condition:{role:/^value\.filter$/,indicator:!1,write:!1,type:e.StateType.Number,name:"FILTER_CONDITION",required:!1,defaultRole:"value.filter",defaultUnit:"%"},conditionCarbon:{role:/^value\.filter\.carbon$/,indicator:!1,write:!1,type:e.StateType.Number,name:"FILTER_CONDITION_CARBON",required:!1,defaultRole:"value.filter.carbon",defaultUnit:"%"},change:{role:/^indicator\.maintenance\.filter$/,indicator:!0,type:e.StateType.Boolean,name:"FILTER_CHANGE",required:!1,defaultRole:"indicator.maintenance.filter"}},Y={severity:{role:/^value\.severity$/,indicator:!1,write:!1,type:e.StateType.Number,name:"SEVERITY",required:!1,defaultRole:"value.severity",defaultStates:{0:"NORMAL",1:"WARNING",2:"CRITICAL"}},muted:{role:/^indicator\.alarm\.muted$/,indicator:!0,type:e.StateType.Boolean,name:"MUTED",required:!1,defaultRole:"indicator.alarm.muted"},test:{role:/^indicator\.working\.test$/,indicator:!0,type:e.StateType.Boolean,name:"TEST",required:!1,defaultRole:"indicator.working.test"}};ee.patterns={chart:{states:[{objectType:"chart",name:"CHART"}],type:e.Types.chart},mediaPlayer:{states:[{role:/^media\.state(\..*)?$/,indicator:!1,type:[e.StateType.Boolean,e.StateType.Number],name:"STATE",required:!0,defaultRole:"media.state"},{role:/^(button|action)\.play(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Boolean,name:"PLAY",required:!1,noSubscribe:!0,defaultRole:"button.play"},{role:/^(button|action)\.pause(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Boolean,name:"PAUSE",required:!1,noSubscribe:!0,defaultRole:"button.pause"},{role:/^(button|action)\.stop(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Boolean,name:"STOP",required:!1,noSubscribe:!0,defaultRole:"button.stop"},{role:/^(button|action)\.next(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Boolean,name:"NEXT",required:!1,noSubscribe:!0,defaultRole:"button.next"},{role:/^(button|action)\.prev(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Boolean,name:"PREV",required:!1,noSubscribe:!0,defaultRole:"button.prev"},{role:/^media\.mode\.shuffle(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Boolean,name:"SHUFFLE",required:!1,defaultRole:"media.mode.shuffle"},{role:/^media\.mode\.repeat(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Number,name:"REPEAT",required:!1,defaultRole:"media.mode.repeat"},{role:/^media\.artist(\..*)?$/,indicator:!1,write:!1,type:e.StateType.String,name:"ARTIST",required:!1,defaultRole:"media.artist"},{role:/^media\.album(\..*)?$/,indicator:!1,write:!1,type:e.StateType.String,name:"ALBUM",required:!1,defaultRole:"media.album"},{role:/^media\.title(\..*)?$/,indicator:!1,write:!1,type:e.StateType.String,name:"TITLE",required:!1,defaultRole:"media.title"},{role:/^media\.cover(\.big)?$/,indicator:!1,write:!1,type:e.StateType.String,name:"COVER",required:!1,notSingle:!0,defaultRole:"media.cover"},{role:/^media\.cover(\..*)$/,indicator:!1,write:!1,type:e.StateType.String,name:"COVER",required:!1,notSingle:!0},{role:/^media\.duration(\..*)?$/,indicator:!1,write:!1,type:e.StateType.Number,name:"DURATION",required:!1,defaultRole:"media.duration",defaultUnit:"sec"},{role:/^media\.elapsed(\..*)?$/,indicator:!1,type:e.StateType.Number,name:"ELAPSED",required:!1,defaultRole:"media.elapsed",defaultUnit:"sec"},{role:/^media\.seek(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Number,name:"SEEK",required:!1,defaultRole:"media.seek"},{role:/^media\.track(\..*)?$/,indicator:!1,type:e.StateType.String,name:"TRACK",required:!1,defaultRole:"media.track"},{role:/^media\.episode(\..*)?$/,indicator:!1,type:e.StateType.String,name:"EPISODE",required:!1,defaultRole:"media.episode"},{role:/^media\.season(\..*)?$/,indicator:!1,type:e.StateType.String,name:"SEASON",required:!1,defaultRole:"media.season"},{role:/^level(\.volume)?$/,indicator:!1,type:e.StateType.Number,min:e.StateType.Number,max:e.StateType.Number,write:!0,name:"VOLUME",required:!1,notSingle:!0,defaultRole:"level.volume",defaultUnit:"%"},{role:/^value(\.volume)?$/,indicator:!1,type:e.StateType.Number,min:e.StateType.Number,max:e.StateType.Number,write:!1,name:"VOLUME_ACTUAL",required:!1,notSingle:!0,defaultRole:"value.volume",defaultUnit:"%"},{role:/^media(\.mute)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"MUTE",required:!1,notSingle:!0,defaultRole:"media.mute"},{role:/^media\.player\.name$/,indicator:!1,type:e.StateType.String,name:"PLAYER_NAME",required:!1,notSingle:!0,defaultRole:"media.player.name"},{role:/^media\.player\.type/,indicator:!1,type:e.StateType.String,write:!1,name:"PLAYER_TYPE",required:!1,notSingle:!0,defaultRole:"media.player.type"},{stateName:/\.(paused|playerState)$/,indicator:!1,name:"IGNORE",required:!1,multiple:!0,noSubscribe:!0},t.reachable,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.media},weatherForecast:{states:[{role:/^weather\.icon(\.forecast\.0)?$/,indicator:!1,type:e.StateType.String,name:"ICON",required:!0,defaultRole:"weather.icon.forecast.0"},{role:/^value\.temperature\.min\.forecast\.0$/,indicator:!1,type:e.StateType.Number,name:"TEMP_MIN",required:!0,defaultRole:"value.temperature.min.forecast.0"},{role:/^value\.temperature\.max\.forecast\.0$/,indicator:!1,type:e.StateType.Number,name:"TEMP_MAX",required:!0,defaultRole:"value.temperature.max.forecast.0"},{role:/^value\.precipitation(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"PRECIPITATION_CHANCE",unit:"%",required:!1,defaultRole:"value.precipitation.forecast.0"},{role:/^value\.precipitation(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"PRECIPITATION",unit:"mm",required:!1,defaultRole:"value.precipitation.forecast.0"},{role:/^date(\.forecast\.0)?$/,indicator:!1,type:e.StateType.String,name:"DATE",required:!1,defaultRole:"date.forecast.0"},{role:/^dayofweek(\.forecast\.0)?$/,indicator:!1,type:e.StateType.String,name:"DOW",required:!1,defaultRole:"dayofweek.forecast.0"},{role:/^weather\.state(\.forecast\.0)?$/,indicator:!1,type:e.StateType.String,name:"STATE",required:!1,defaultRole:"weather.state.forecast.0"},{role:/^value\.temperature(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"TEMP",required:!1,defaultRole:"value.temperature.forecast.0"},{role:/^value\.pressure(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"PRESSURE",required:!1,defaultRole:"value.pressure.forecast.0"},{role:/^value\.humidity(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"HUMIDITY",required:!1,defaultRole:"value.humidity.forecast.0"},{role:/^(?:date|time)\.sunrise(?:\.forecast\.0)?$/,indicator:!1,type:[e.StateType.String,e.StateType.Number],name:"TIME_SUNRISE",required:!1,defaultRole:"date.sunrise"},{role:/^(?:date|time)\.sunset(?:\.forecast\.0)?$/,indicator:!1,type:[e.StateType.String,e.StateType.Number],name:"TIME_SUNSET",required:!1,defaultRole:"date.sunset"},{role:/^value\.temperature\.windchill(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"WIND_CHILL",required:!1,defaultRole:"value.temperature.windchill.forecast.0"},{role:/^value\.temperature\.feelslike(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"FEELS_LIKE",required:!1,defaultRole:"value.temperature.feelslike.forecast.0"},{role:/^value\.speed\.wind(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"WIND_SPEED",required:!1,defaultRole:"value.speed.wind.forecast.0"},{role:/^value\.direction\.wind(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"WIND_DIRECTION",required:!1,defaultRole:"value.direction.wind.forecast.0"},{role:/^weather\.direction\.wind(\.forecast\.0)?$/,indicator:!1,type:e.StateType.String,name:"WIND_DIRECTION_STR",required:!1,defaultRole:"weather.direction.wind.forecast.0"},{role:/^weather\.icon\.wind(\.forecast\.0)?$/,indicator:!1,type:e.StateType.String,name:"WIND_ICON",required:!1,defaultRole:"weather.icon.wind.forecast.0"},{role:/^weather\.chart\.url$/,indicator:!1,type:e.StateType.String,name:"HISTORY_CHART",required:!1,noSubscribe:!0,defaultRole:"weather.chart.url"},{role:/^weather\.chart\.url\.forecast$/,indicator:!1,type:e.StateType.String,name:"FORECAST_CHART",required:!1,noSubscribe:!0,defaultRole:"weather.chart.url.forecast"},{role:/^location$/,indicator:!1,type:e.StateType.String,name:"LOCATION",required:!1,defaultRole:"location"},{role:/^weather\.icon\.forecast.(\d+)$/,indicator:!1,type:e.StateType.String,name:"ICON%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0,notSingle:!0},{role:/^value\.temperature\.min\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,name:"TEMP_MIN%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.temperature\.max\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,name:"TEMP_MAX%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^date\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.String,name:"DATE%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^dayofweek\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.String,name:"DOW%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^weather\.state\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.String,name:"STATE%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.temperature\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,name:"TEMP%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.pressure\.forecast\.(\d+)?$/,indicator:!1,type:e.StateType.Number,name:"PRESSURE%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.humidity\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,name:"HUMIDITY%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.humidity\.max\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,name:"HUMIDITY_MAX%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.precipitation\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,unit:"%",name:"PRECIPITATION_CHANCE%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.precipitation\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,unit:"mm",name:"PRECIPITATION%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.speed\.wind\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,name:"WIND_SPEED%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.direction\.wind\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,name:"WIND_DIRECTION%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^weather\.direction\.wind\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.String,name:"WIND_DIRECTION_STR%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^weather\.icon\.wind\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.String,name:"WIND_ICON%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^(?:date|time)\.sunrise(?:\.forecast\.(\d+))?$/,indicator:!1,type:[e.StateType.String,e.StateType.Number],name:"TIME_SUNRISE%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^(?:date|time)\.sunset(?:\.forecast\.(\d+))?$/,indicator:!1,type:[e.StateType.String,e.StateType.Number],name:"TIME_SUNSET%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0}],type:e.Types.weatherForecast},rgb:{states:[{role:/^level\.color\.red$/,indicator:!1,type:e.StateType.Number,write:!0,name:"RED",required:!0,defaultRole:"level.color.red"},{role:/^level\.color\.green$/,indicator:!1,type:e.StateType.Number,write:!0,name:"GREEN",required:!0,defaultRole:"level.color.green"},{role:/^level\.color\.blue$/,indicator:!1,type:e.StateType.Number,write:!0,name:"BLUE",required:!0,defaultRole:"level.color.blue"},{role:/^level\.color\.white$/,indicator:!1,type:e.StateType.Number,write:!0,name:"WHITE",required:!1,defaultRole:"level.color.white"},{role:/^level\.dimmer$/,indicator:!1,type:e.StateType.Number,write:!0,name:"DIMMER",required:!1,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:e.StateType.Number,write:!0,name:"BRIGHTNESS",required:!1},{role:/^level\.color\.temperature$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TEMPERATURE",required:!1,defaultRole:"level.color.temperature",defaultUnit:"\xB0K"},{role:/^level\.effect$/,indicator:!1,type:[e.StateType.Number,e.StateType.String],write:!0,statesDefined:!0,name:"EFFECT",required:!1,defaultRole:"level.effect",defaultStates:{0:"None"}},{role:/^switch(\.light)?$|^state$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^(state|switch|sensor)\.light$|^switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light",ignoreRole:f},{role:/^time\.(span|interval)$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TRANSITION_TIME",required:!1,defaultRole:"time.span",defaultUnit:"ms"},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.rgb},rgbwSingle:{states:[{role:/^level\.color\.rgbw$/,indicator:!1,type:e.StateType.String,write:!0,name:"RGBW",required:!0,defaultRole:"level.color.rgbw"},{role:/^level\.dimmer$/,indicator:!1,type:e.StateType.Number,write:!0,name:"DIMMER",required:!1,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:e.StateType.Number,write:!0,name:"BRIGHTNESS",required:!1,defaultUnit:"%"},{role:/^level\.color\.temperature$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TEMPERATURE",required:!1,defaultRole:"level.color.temperature",defaultUnit:"\xB0K"},{role:/^level\.effect$/,indicator:!1,type:[e.StateType.Number,e.StateType.String],write:!0,statesDefined:!0,name:"EFFECT",required:!1,defaultRole:"level.effect",defaultStates:{0:"None"}},{role:/^switch(\.light)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^(state|switch|sensor)\.light$|^switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light",ignoreRole:f},{role:/^time\.(span|interval)$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TRANSITION_TIME",required:!1,defaultRole:"time.span",defaultUnit:"ms"},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.rgbwSingle},rgbSingle:{states:[{role:/^level\.color\.rgb$/,indicator:!1,type:e.StateType.String,write:!0,name:"RGB",required:!0,defaultRole:"level.color.rgb"},{role:/^level\.dimmer$/,indicator:!1,type:e.StateType.Number,write:!0,name:"DIMMER",required:!1,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:e.StateType.Number,write:!0,name:"BRIGHTNESS",required:!1,defaultUnit:"%"},{role:/^level\.color\.temperature$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TEMPERATURE",required:!1,defaultRole:"level.color.temperature",defaultUnit:"\xB0K"},{role:/^level\.effect$/,indicator:!1,type:[e.StateType.Number,e.StateType.String],write:!0,statesDefined:!0,name:"EFFECT",required:!1,defaultRole:"level.effect",defaultStates:{0:"None"}},{role:/^switch(\.light)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^(state|switch|sensor)\.light$|^switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light",ignoreRole:f},{role:/^time\.(span|interval)$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TRANSITION_TIME",required:!1,defaultRole:"time.span",defaultUnit:"ms"},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.rgbSingle},cie:{states:[{role:/^level\.color\.cie$/,indicator:!1,type:e.StateType.String,write:!0,name:"CIE",required:!0,defaultRole:"level.color.cie"},{role:/^level\.dimmer$/,indicator:!1,type:e.StateType.Number,write:!0,name:"DIMMER",required:!1,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:e.StateType.Number,write:!0,name:"BRIGHTNESS",required:!1,defaultUnit:"%"},{role:/^level\.color\.temperature$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TEMPERATURE",required:!1,defaultRole:"level.color.temperature",defaultUnit:"\xB0K"},{role:/^level\.effect$/,indicator:!1,type:[e.StateType.Number,e.StateType.String],write:!0,statesDefined:!0,name:"EFFECT",required:!1,defaultRole:"level.effect",defaultStates:{0:"None"}},{role:/^switch(\.light)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^(state|switch|sensor)\.light$|^switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light",ignoreRole:f},{role:/^time\.(span|interval)$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TRANSITION_TIME",required:!1,defaultRole:"time.span",defaultUnit:"ms"},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.cie},hue:{states:[{role:/^level\.color\.hue$/,indicator:!1,type:e.StateType.Number,write:!0,name:"HUE",required:!0,defaultRole:"level.color.hue",defaultUnit:"\xB0"},{role:/^level\.dimmer$/,indicator:!1,type:e.StateType.Number,write:!0,name:"DIMMER",required:!1,searchInParent:!0,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:e.StateType.Number,write:!0,name:"BRIGHTNESS",required:!1},{role:/^level\.color\.saturation$/,indicator:!1,type:e.StateType.Number,write:!0,name:"SATURATION",required:!1,defaultRole:"level.color.saturation",defaultUnit:"%"},{role:/^level\.color\.temperature$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TEMPERATURE",required:!1,defaultRole:"level.color.temperature",defaultUnit:"\xB0K"},{role:/^level\.effect$/,indicator:!1,type:[e.StateType.Number,e.StateType.String],write:!0,statesDefined:!0,name:"EFFECT",required:!1,defaultRole:"level.effect",defaultStates:{0:"None"}},{role:/^switch(\.light)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^(state|switch|sensor)\.light$|^switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light",ignoreRole:f},{role:/^time\.(span|interval)$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TRANSITION_TIME",required:!1,defaultRole:"time.span",defaultUnit:"ms"},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.hue},ct:{states:[{role:/^level\.color\.temperature$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TEMPERATURE",required:!0,defaultRole:"level.color.temperature",defaultUnit:"\xB0K"},{role:/^level\.dimmer$/,indicator:!1,type:e.StateType.Number,write:!0,name:"DIMMER",required:!1,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:e.StateType.Number,write:!0,name:"BRIGHTNESS",required:!1},{role:/^switch(\.light)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^(state|switch|sensor)\.light$|^switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light",ignoreRole:f},{role:/^level\.effect$/,indicator:!1,type:[e.StateType.Number,e.StateType.String],write:!0,statesDefined:!0,name:"EFFECT",required:!1,defaultRole:"level.effect",defaultStates:{0:"None"}},{role:/^time\.(span|interval)$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TRANSITION_TIME",required:!1,defaultRole:"time.span",defaultUnit:"ms"},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.ct},warning:{states:[{role:/^value\.warning$/,indicator:!1,name:"LEVEL",required:!0,defaultRole:"value.warning"},{role:/^weather\.title\.short$/,indicator:!1,type:e.StateType.String,name:"TITLE",required:!1,defaultRole:"weather.title.short"},{role:/^weather\.title$/,indicator:!1,type:e.StateType.String,name:"INFO",required:!1,defaultRole:"weather.title"},{role:/^date\.start$/,indicator:!1,type:e.StateType.String,name:"START",required:!1,defaultRole:"date.start"},{role:/^date\.end$/,indicator:!1,type:e.StateType.String,name:"END",required:!1,defaultRole:"date.end"},{role:/^date$/,indicator:!1,type:e.StateType.String,name:"START",required:!1},{role:/^weather\.chart\.url/,indicator:!1,type:e.StateType.String,name:"ICON",required:!1,defaultRole:"weather.chart.url"},{role:/^weather\.state$/,indicator:!1,type:e.StateType.String,name:"DESC",required:!1,noSubscribe:!0,defaultRole:"weather.state"}],type:e.Types.warning},airCondition:{states:[{role:/temperature(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Number,name:"SET",requiredOneOf:"setpoint",defaultRole:"level.temperature",defaultUnit:"\xB0C",ignoreRole:we},Z.heating,Z.cooling,{role:/(level\.mode\.)?airconditioner$/,indicator:!1,write:!0,type:e.StateType.Number,searchInParent:!0,name:"MODE",required:!0,defaultRole:"level.mode.airconditioner",defaultStates:{0:"AUTO",3:"COOL",4:"DRY",5:"ECO",6:"FAN_ONLY",7:"HEAT",8:"OFF"},ignoreRole:f},he.airCondition,v.speed,v.speedLevel,v.power,{role:/temperature(\..*)?$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"ACTUAL",required:!1,defaultRole:"value.temperature",defaultUnit:"\xB0C",ignoreRole:f},{role:/humidity(\..*)?$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"HUMIDITY",required:!1,defaultRole:"value.humidity",defaultUnit:"%",ignoreRole:f},{role:/^switch\.boost(\..*)?$/,indicator:!1,write:!0,type:[e.StateType.Boolean,e.StateType.Number],searchInParent:!0,name:"BOOST",required:!1,defaultRole:"switch.boost"},v.swing,v.swingBoolean,v.airflowDirection,x.condition,x.conditionCarbon,x.change,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.rssi,t.battery],type:e.Types.airCondition},airPurifier:{states:[{...v.speed,required:!0},v.power,v.speedLevel,v.swing,v.swingBoolean,v.airflowDirection,{...x.condition,requiredOneOf:"filter"},{...x.conditionCarbon,requiredOneOf:"filter"},x.change,t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.airPurifier},fan:{states:[{...v.speed,required:!0},v.power,v.speedLevel,v.swing,v.swingBoolean,v.airflowDirection,t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.fan},thermostat:{states:[{role:/temperature(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Number,name:"SET",requiredOneOf:"setpoint",defaultRole:"level.temperature",defaultUnit:"\xB0C",ignoreRole:we},Z.heating,Z.cooling,{role:/temperature(\..*)?$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"ACTUAL",required:!1,defaultRole:"value.temperature",defaultUnit:"\xB0C",ignoreRole:f},{role:/humidity(\..*)?$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"HUMIDITY",required:!1,defaultRole:"value.humidity",defaultUnit:"%",ignoreRole:f},{role:/^switch(\.mode)?\.boost(\..*)?$/,indicator:!1,write:!0,type:[e.StateType.Boolean,e.StateType.Number],searchInParent:!0,name:"BOOST",required:!1,defaultRole:"switch.mode.boost"},{role:/^switch(\.power)?$/,indicator:!1,write:!0,type:[e.StateType.Boolean,e.StateType.Number],searchInParent:!0,name:"POWER",required:!1,defaultRole:"switch.power"},{role:/^switch(\.mode)?\.party$/,indicator:!1,write:!0,type:[e.StateType.Boolean,e.StateType.Number],searchInParent:!0,name:"PARTY",required:!1,defaultRole:"switch.mode.party"},{role:/^level(\.mode)?\.thermostat$/,indicator:!1,write:!0,type:e.StateType.Number,searchInParent:!0,name:"MODE",required:!1,defaultRole:"level.mode.thermostat",defaultStates:{0:"AUTO",1:"MANUAL"}},{role:/^(value|level)\.valve$/,indicator:!1,type:e.StateType.Number,searchInParent:!0,name:"VALVE",required:!1,defaultRole:"value.valve",defaultUnit:"%",ignoreRole:f},he.thermostat,{role:/^(state|sensor)\.window$/,indicator:!1,write:!1,type:e.StateType.Boolean,name:"WINDOW",required:!1,defaultRole:"sensor.window"},...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.thermostat},vacuumCleaner:{states:[{role:/^switch\.power$/,indicator:!1,write:!0,type:[e.StateType.Boolean,e.StateType.Number],searchInParent:!0,name:"POWER",required:!0,defaultRole:"switch.power"},{role:/mode\.cleanup$/,indicator:!1,write:!0,type:e.StateType.Number,searchInParent:!0,name:"MODE",requiredOneOf:"vacuumMode",defaultRole:"level.mode.cleanup",defaultStates:{0:"AUTO",1:"NORMAL",2:"QUIET",3:"ECO",4:"EXPRESS"},ignoreRole:f},{role:/vacuum\.map\.base64$/,indicator:!1,write:!1,type:e.StateType.String,searchInParent:!0,name:"MAP_BASE64",required:!1,defaultRole:"vacuum.map.base64",ignoreRole:f},{role:/vacuum\.map\.url$/,indicator:!1,write:!1,type:e.StateType.String,searchInParent:!0,name:"MAP_URL",required:!1,ignoreRole:f},{role:/mode\.work$/,indicator:!1,write:!0,type:e.StateType.Number,searchInParent:!0,name:"WORK_MODE",required:!1,defaultRole:"level.mode.work",defaultStates:{0:"AUTO",1:"FAST",2:"MEDIUM",3:"SLOW",4:"TURBO"},ignoreRole:f},{role:/^value\.water$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,unit:"%",name:"WATER",required:!1,defaultRole:"value.water",defaultUnit:"%"},{role:/^value\.waste$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,unit:"%",name:"WASTE",required:!1,defaultRole:"value.waste",defaultUnit:"%"},{role:/^value\.battery$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,unit:"%",name:"BATTERY",required:!1,defaultRole:"value.battery",defaultUnit:"%"},{role:/^value\.state$/,indicator:!1,write:!1,type:[e.StateType.Number,e.StateType.String],searchInParent:!0,name:"STATE",required:!1,defaultRole:"value.state"},{role:/^switch\.pause$/,indicator:!1,write:!0,type:e.StateType.Boolean,searchInParent:!0,name:"PAUSE",required:!1,defaultRole:"switch.pause"},{role:/^indicator(\.maintenance)?\.waste$|^indicator(\.alarm)?\.waste/,indicator:!0,type:e.StateType.Boolean,searchInParent:!0,name:"WASTE_ALARM",required:!1,defaultRole:"indicator.maintenance.waste"},{role:/^indicator(\.maintenance)?\.water$|^indicator(\.alarm)?\.water/,indicator:!0,type:e.StateType.Boolean,searchInParent:!0,name:"WATER_ALARM",required:!1,defaultRole:"indicator.maintenance.water"},{role:/^value(\.usage)?\.filter/,indicator:!0,type:e.StateType.Number,searchInParent:!0,name:"FILTER",required:!1,defaultRole:"value.usage.filter",defaultUnit:"%"},{role:/^value(\.usage)?\.brush/,indicator:!0,type:e.StateType.Number,searchInParent:!0,name:"BRUSH",required:!1,defaultRole:"value.usage.brush",defaultUnit:"%"},{role:/^value(\.usage)?\.sensors/,indicator:!0,type:e.StateType.Number,searchInParent:!0,name:"SENSORS",required:!1,defaultRole:"value.usage.sensors",defaultUnit:"%"},{role:/^value(\.usage)?\.brush\.side/,indicator:!0,type:e.StateType.Number,searchInParent:!0,name:"SIDE_BRUSH",required:!1,defaultRole:"value.usage.brush.side",defaultUnit:"%"},{role:/^(button|action)\.home$/,indicator:!1,write:!0,type:e.StateType.Boolean,name:"HOME",required:!1,noSubscribe:!0,defaultRole:"button.home"},{role:/^level\.mode\.vacuum$/,indicator:!1,write:!0,type:e.StateType.Number,name:"RUN_MODE",requiredOneOf:"vacuumMode",defaultRole:"level.mode.vacuum",defaultStates:{0:"IDLE",1:"CLEANING",2:"MAPPING"},ignoreRole:f},{role:/^value\.progress$/,indicator:!1,write:!1,type:e.StateType.Number,name:"PROGRESS",required:!1,defaultRole:"value.progress",defaultUnit:"%"},{role:/^value\.vacuum\.phase$/,indicator:!1,write:!1,type:e.StateType.String,name:"PHASE",required:!1,defaultRole:"value.vacuum.phase"},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.vacuumCleaner},blinds:{states:[{role:/^level(\.blind)?$/,indicator:!1,type:e.StateType.Number,write:!0,enums:y.roleOrEnumBlind,name:"SET",required:!0,defaultRole:"level.blind",defaultUnit:"%"},{role:/^value(\.blind)?$/,indicator:!1,type:e.StateType.Number,enums:y.roleOrEnumBlind,name:"ACTUAL",required:!1,defaultRole:"value.blind",defaultUnit:"%"},{role:/^(button|action)\.stop(\.blind)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"STOP",required:!1,noSubscribe:!0,defaultRole:"button.stop.blind"},{role:/^(button|action)\.open(\.blind)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"OPEN",required:!1,noSubscribe:!0,defaultRole:"button.open.blind"},{role:/^(button|action)\.close(\.blind)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"CLOSE",required:!1,noSubscribe:!0,defaultRole:"button.close.blind"},{role:/^level(\.open)?\.tilt$/,indicator:!1,type:e.StateType.Number,write:!0,enums:y.roleOrEnumBlind,name:"TILT_SET",required:!1,defaultRole:"level.tilt"},{role:/^value(\.open)?\.tilt$/,indicator:!1,type:e.StateType.Number,enums:y.roleOrEnumBlind,name:"TILT_ACTUAL",required:!1,defaultRole:"value.tilt"},{role:/^(button|action)\.stop\.tilt$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"TILT_STOP",required:!1,noSubscribe:!0,defaultRole:"button.stop.tilt"},{role:/^(button|action)\.open\.tilt$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"TILT_OPEN",required:!1,noSubscribe:!0,defaultRole:"button.open.tilt"},{role:/^(button|action)\.close\.tilt$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"TILT_CLOSE",required:!1,noSubscribe:!0,defaultRole:"button.close.tilt"},t.direction,t.direction_enum,t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.blind},blindButtons:{states:[{role:/^(button|action)\.stop(\.blind)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"STOP",required:!0,noSubscribe:!0,defaultRole:"button.stop.blind"},{role:/^(button|action)\.open(\.blind)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"OPEN",required:!0,noSubscribe:!0,defaultRole:"button.open.blind"},{role:/^(button|action)\.close(\.blind)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"CLOSE",required:!0,noSubscribe:!0,defaultRole:"button.close.blind"},{role:/^level\.tilt$/,indicator:!1,type:e.StateType.Number,write:!0,enums:y.roleOrEnumBlind,name:"TILT_SET",required:!1,defaultRole:"level.tilt"},{role:/^value\.tilt$/,indicator:!1,type:e.StateType.Number,enums:y.roleOrEnumBlind,name:"TILT_ACTUAL",required:!1,defaultRole:"value.tilt"},{role:/^(button|action)\.stop\.tilt$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"TILT_STOP",required:!1,noSubscribe:!0,defaultRole:"button.stop.tilt"},{role:/^(button|action)\.open\.tilt$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"TILT_OPEN",required:!1,noSubscribe:!0,defaultRole:"button.open.tilt"},{role:/^(button|action)\.close\.tilt$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"TILT_CLOSE",required:!1,noSubscribe:!0,defaultRole:"button.close.tilt"},t.direction,t.direction_enum,t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.blindButtons},gate:{states:[{role:/^switch(\.gate)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumGate,name:"SET",required:!0,defaultRole:"switch.gate"},{role:/^value(\.(position|gate))?$/,indicator:!1,type:e.StateType.Number,enums:y.roleOrEnumGate,name:"ACTUAL",required:!1,defaultRole:"value.blind",defaultUnit:"%",ignoreRole:f},{role:/^(button|action)\.stop$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumGate,name:"STOP",required:!1,noSubscribe:!0,defaultRole:"button.stop"},{role:/^indicator\.opened$/,indicator:!0,type:e.StateType.Boolean,name:"OPENED",required:!1,defaultRole:"indicator.opened"},{role:/^indicator\.closed$/,indicator:!0,type:e.StateType.Boolean,name:"CLOSED",required:!1,defaultRole:"indicator.closed"},t.direction,t.direction_enum,t.working,t.unreach,t.maintain,t.error,t.rssi],type:e.Types.gate},weatherCurrent:{states:[{role:/^value(\.temperature)?$/,indicator:!1,type:e.StateType.Number,name:"ACTUAL",required:!0,defaultRole:"value.temperature",defaultUnit:"\xB0C"},{role:/^weather\.icon$/,indicator:!1,name:"ICON",required:!0,defaultRole:"weather.icon"},{role:/^value\.precipitation\.chance$/,indicator:!1,type:e.StateType.Number,name:"PRECIPITATION_CHANCE",defaultRole:"value.precipitation.chance",defaultUnit:"%"},{role:/^value\.precipitation\.type$/,indicator:!1,type:e.StateType.Number,name:"PRECIPITATION_TYPE",defaultRole:"value.precipitation.type",defaultStates:{0:"NO",1:"RAIN",2:"SNOW",3:"HAIL"}},{role:/^value\.pressure$/,indicator:!1,type:e.StateType.Number,name:"PRESSURE",defaultRole:"value.pressure",defaultUnit:"mbar"},{role:/^value\.pressure\.tendency$/,indicator:!1,type:e.StateType.String,name:"PRESSURE_TENDENCY",defaultRole:"value.pressure.tendency"},{role:/^value\.temperature\.windchill$/,indicator:!1,type:e.StateType.Number,name:"REAL_FEEL_TEMPERATURE",defaultRole:"value.temperature.windchill",defaultUnit:"\xB0C"},{role:/^value\.humidity$/,indicator:!1,type:e.StateType.Number,name:"HUMIDITY",defaultRole:"value.humidity",defaultUnit:"%"},{role:/^value\.uv$/,indicator:!1,type:e.StateType.Number,name:"UV",defaultRole:"value.uv"},{role:/^weather\.state$/,indicator:!1,type:e.StateType.String,name:"WEATHER",defaultRole:"weather.state"},{role:/^value\.direction\.wind$/,indicator:!1,type:e.StateType.String,name:"WIND_DIRECTION",defaultRole:"value.direction.wind",defaultUnit:"\xB0"},{role:/^value\.speed\.wind\.gust$/,indicator:!1,type:e.StateType.Number,name:"WIND_GUST",defaultRole:"value.speed.wind.gust",defaultUnit:"km/h"},{role:/^value\.speed\.wind$/,indicator:!1,type:e.StateType.Number,name:"WIND_SPEED",defaultRole:"value.speed.wind",defaultUnit:"km/h"},t.lowbat,t.unreach,t.maintain,t.error,t.battery],type:e.Types.weatherCurrent},camera:{states:[{role:/^link\.camera(\.\w+)?$/,indicator:!1,type:e.StateType.String,name:"URL",required:!0,defaultRole:"link.camera"},{role:/^switch(\.camera)?\.autofocus$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"AUTOFOCUS",required:!1,defaultRole:"switch.camera.autofocus"},{role:/^switch(\.camera)?\.autowhitebalance$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"AUTOWHITEBALANCE",required:!1,defaultRole:"switch.camera.autowhitebalance"},{role:/^switch(\.camera)?\.brightness$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"BRIGHTNESS",required:!1,defaultRole:"switch.camera.brightness"},{role:/^switch(\.camera)?\.nightmode$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"NIGHTMODE",required:!1,defaultRole:"switch.camera.nightmode"},{role:/^level(\.camera)?\.position$|^level(\.camera)?(\.ptz)$/,indicator:!1,type:e.StateType.Number,write:!0,name:"PTZ",required:!1,defaultRole:"level.camera.position"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.camera,enumRequired:!1},lock:{states:[{role:/^switch\.lock$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"SET",required:!0,defaultRole:"switch.lock"},{role:/^state$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ACTUAL",required:!1,defaultRole:"state"},{indicator:!1,type:e.StateType.Boolean,write:!0,read:!1,name:"OPEN",required:!1,noSubscribe:!0,defaultRole:"button",ignoreRole:f},{role:/^(state|sensor)(\.door)?$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"DOOR_STATE",required:!1,defaultRole:"sensor.door",ignoreRole:f},t.direction,t.direction_enum,t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.lock},motion:{states:[{role:/^(state\.)?motion$|^sensor\.motion$/,indicator:!1,type:e.StateType.Boolean,name:"ACTUAL",required:!0,defaultRole:"sensor.motion",ignoreRole:f},{role:/brightness$/,indicator:!1,type:e.StateType.Number,name:"SECOND",required:!1,defaultRole:"value.brightness",defaultUnit:"lux",ignoreRole:f},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.motion},contact:{states:[{role:/^sensor\.contact$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ACTUAL",required:!0,defaultRole:"sensor.contact",defaultChannelRole:"sensor.contact"},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.contact,enumRequired:!1},window:{states:[{role:/^(state|sensor)(\.window)?/,indicator:!1,type:e.StateType.Boolean,enums:y.roleOrEnumWindow,write:!1,name:"ACTUAL",required:!0,defaultRole:"sensor.window",ignoreRole:f},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.window},windowTilt:{states:[{role:/^state$|^value(\.window)?$/,indicator:!1,type:e.StateType.Number,write:!1,enums:y.roleOrEnumWindow,name:"ACTUAL",required:!0,defaultRole:"value.window"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.windowTilt},fireAlarm:{states:[{role:/^(state|sensor|indicator)(\.alarm)?\.fire$/,indicator:!1,type:e.StateType.Boolean,name:"ACTUAL",required:!0,defaultRole:"sensor.alarm.fire",defaultChannelRole:"sensor.alarm.fire"},{role:/^(state|sensor)(\.alarm)?\.co$/,indicator:!1,type:e.StateType.Boolean,name:"CO",required:!1,defaultRole:"sensor.alarm.co"},Y.severity,Y.muted,Y.test,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.fireAlarm,enumRequired:!1},coAlarm:{states:[{role:/^(state|sensor)(\.alarm)?\.co$/,indicator:!1,type:e.StateType.Boolean,name:"ACTUAL",required:!0,defaultRole:"sensor.alarm.co",defaultChannelRole:"sensor.alarm.co"},Y.severity,Y.muted,Y.test,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.coAlarm,enumRequired:!1},floodAlarm:{states:[{role:/^(state|sensor|indicator)(\.alarm)?\.flood$/,indicator:!1,type:e.StateType.Boolean,name:"ACTUAL",required:!0,defaultRole:"sensor.alarm.flood",defaultChannelRole:"sensor.alarm.flood"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.floodAlarm},door:{states:[{role:/^(state|sensor)(\.door)?/,indicator:!1,type:e.StateType.Boolean,write:!1,enums:y.roleOrEnumDoor,name:"ACTUAL",required:!0,defaultRole:"sensor.door"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.door},dimmer:{states:[{role:/^level(\.dimmer)?$|^level\.brightness$/,indicator:!1,type:e.StateType.Number,write:!0,enums:y.roleOrEnumLight,name:"SET",required:!0,defaultRole:"level.dimmer",ignoreRole:/^level\.dimspeed$/,defaultUnit:"%"},{role:/^value(\.dimmer)?$/,indicator:!1,type:e.StateType.Number,write:!1,enums:y.roleOrEnumLight,name:"ACTUAL",required:!1,defaultRole:"value.dimmer",defaultUnit:"%"},{role:/^switch(\.light)?$|^state$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumLight,name:"ON_SET",required:!1,defaultRole:"switch.light"},{role:/^level\.effect$/,indicator:!1,type:[e.StateType.Number,e.StateType.String],write:!0,statesDefined:!0,name:"EFFECT",required:!1,defaultRole:"level.effect",defaultStates:{0:"None"}},{role:/^(state|switch|sensor)\.light$|^switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,enums:y.roleOrEnumLight,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light",ignoreRole:f},{role:/^time\.(span|interval)$/,indicator:!1,type:e.StateType.Number,write:!0,enums:y.roleOrEnumLight,name:"TRANSITION_TIME",required:!1,defaultRole:"time.span",defaultUnit:"ms"},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.dimmer},light:{states:[{role:/^switch(\.light)?$|^state$/,enums:y.roleOrEnumLight,indicator:!1,type:e.StateType.Boolean,write:!0,name:"SET",required:!0,defaultRole:"switch.light"},{role:/^(state|switch|sensor)\.light$|^switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,enums:y.roleOrEnumLight,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light",ignoreRole:f},{role:/^level\.effect$/,indicator:!1,type:[e.StateType.Number,e.StateType.String],write:!0,statesDefined:!0,name:"EFFECT",required:!1,defaultRole:"level.effect",defaultStates:{0:"None"}},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.light},volume:{states:[{role:/^level\.volume$/,indicator:!1,type:e.StateType.Number,min:e.StateType.Number,max:e.StateType.Number,write:!0,name:"SET",required:!0,defaultRole:"level.volume",defaultUnit:"%"},{role:/^value\.volume$/,indicator:!1,type:e.StateType.Number,min:e.StateType.Number,max:e.StateType.Number,write:!1,name:"ACTUAL",required:!1,defaultRole:"value.volume",defaultUnit:"%"},{role:/^media\.mute$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"MUTE",required:!1,defaultRole:"media.mute"},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.volume},locationOne:{states:[{role:/^value\.gps$/,indicator:!1,type:e.StateType.String,write:!1,name:"GPS",required:!0,defaultRole:"value.gps"},{role:/^value\.gps\.elevation$/,indicator:!1,type:e.StateType.Number,write:!1,name:"ELEVATION",required:!1,defaultRole:"value.gps.elevation"},{role:/^value(\.gps)?\.radius$/,indicator:!1,type:e.StateType.Number,write:!1,name:"RADIUS",required:!1,defaultRole:"value.gps.radius"},{role:/^value(\.gps)?\.accuracy$/,indicator:!1,type:e.StateType.Number,write:!1,name:"ACCURACY",required:!1,defaultRole:"value.gps.accuracy"},t.unreach,t.lowbat,t.maintain,t.error,t.battery],type:e.Types.locationOne},location:{states:[{role:/^value(\.gps)?\.longitude$/,indicator:!1,type:e.StateType.Number,write:!1,name:"LONGITUDE",required:!0,defaultRole:"value.gps.longitude",defaultUnit:"\xB0"},{role:/^value(\.gps)?\.latitude$/,indicator:!1,type:e.StateType.Number,write:!1,name:"LATITUDE",required:!0,defaultRole:"value.gps.latitude",defaultUnit:"\xB0"},{role:/^value(\.gps)?\.elevation$/,indicator:!1,type:e.StateType.Number,write:!1,name:"ELEVATION",required:!1,defaultRole:"value.gps.elevation"},{role:/^value(\.gps)?\.radius$/,indicator:!1,type:e.StateType.Number,write:!1,name:"RADIUS",required:!1,defaultRole:"value.gps.radius"},{role:/^value(\.gps)?\.accuracy$/,indicator:!1,type:e.StateType.Number,write:!1,name:"ACCURACY",required:!1,defaultRole:"value.gps.accuracy"},t.unreach,t.lowbat,t.maintain,t.error,t.battery],type:e.Types.location},volumeGroup:{states:[{role:/^level\.volume\.group?$/,indicator:!1,type:e.StateType.Number,min:e.StateType.Number,max:e.StateType.Number,write:!0,name:"SET",required:!0,defaultRole:"level.volume.group",defaultUnit:"%"},{role:/^value\.volume\.group$/,indicator:!1,type:e.StateType.Number,min:e.StateType.Number,max:e.StateType.Number,write:!1,name:"ACTUAL",required:!1,defaultRole:"value.volume.group",defaultUnit:"%"},{role:/^media\.mute\.group$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"MUTE",required:!1,defaultRole:"media.mute.group"},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.volumeGroup},pump:{states:[{role:/^switch\.pump$/,indicator:!1,write:!0,type:[e.StateType.Boolean,e.StateType.Number],name:"POWER",required:!0,defaultRole:"switch.pump"},{role:/^level\.pump$/,indicator:!1,write:!0,type:e.StateType.Number,name:"LEVEL",required:!1,defaultRole:"level.pump",defaultUnit:"%",ignoreRole:f},{role:/temperature(\..*)?$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"TEMPERATURE",required:!1,defaultRole:"value.temperature",defaultUnit:"\xB0C",ignoreRole:f},{role:/^value\.pressure$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"PRESSURE",required:!1,defaultRole:"value.pressure",defaultUnit:"mbar"},{role:/^value\.flow$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"FLOW",required:!1,defaultRole:"value.flow",defaultUnit:"m\xB3/h"},...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.pump},percentage:{states:[{role:/^level(\..*)?$/,indicator:!1,type:e.StateType.Number,write:!0,unit:"%",name:"SET",required:!0,defaultRole:"level",defaultUnit:"%",ignoreRole:f},{role:/^value(\..*)?$/,indicator:!1,type:e.StateType.Number,write:!1,name:"ACTUAL",required:!1,defaultRole:"value",defaultUnit:"%",ignoreRole:f},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.percentage},levelSlider:{states:[{role:/^level(\..*)?$/,indicator:!1,type:e.StateType.Number,min:e.StateType.Number,max:e.StateType.Number,write:!0,name:"SET",required:!0,defaultRole:"level",defaultUnit:"%",ignoreRole:f},{role:/^switch(\.active)?$/,indicator:!1,write:!0,type:e.StateType.Boolean,name:"ON",required:!1,defaultRole:"switch"},{role:/^state\.active$|^sensor\.switch$/,indicator:!1,write:!1,type:e.StateType.Boolean,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.switch"},{role:/^value(\..*)?$/,indicator:!1,type:e.StateType.Number,min:e.StateType.Number,max:e.StateType.Number,write:!1,name:"ACTUAL",required:!1,defaultRole:"value",defaultUnit:"%",ignoreRole:f},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.slider},socket:{states:[{role:/^switch(\.active)?$|^state$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"SET",required:!0,defaultRole:"switch"},{role:/^state\.active$|^sensor\.switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ACTUAL",required:!1,defaultRole:"sensor.switch"},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.rssi],type:e.Types.socket},button:{states:[{role:/^(button|action)(\.[.\w]+)?$/,indicator:!1,type:e.StateType.Boolean,read:!1,write:!0,name:"SET",required:!0,noSubscribe:!0,defaultRole:"button"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.button},buttonSensor:{states:[{role:/^button(\.[.\w]+)?$/,indicator:!1,type:e.StateType.Boolean,read:!0,write:!1,name:"PRESS",required:!0,defaultRole:"button.press"},{role:/^button\.long/,indicator:!1,type:e.StateType.Boolean,read:!0,write:!1,name:"PRESS_LONG",required:!1,defaultRole:"button.long"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.buttonSensor},airQuality:{states:[{role:/^value\.airquality$/,indicator:!1,write:!1,type:e.StateType.Number,name:"AQI",required:!0,defaultRole:"value.airquality",defaultStates:{0:"UNKNOWN",1:"GOOD",2:"FAIR",3:"MODERATE",4:"POOR",5:"VERY_POOR",6:"EXTREMELY_POOR"}},{role:/^switch(\.power)?$/,indicator:!1,write:!0,type:e.StateType.Boolean,searchInParent:!0,name:"POWER",required:!1,defaultRole:"switch.power"},...A("CO2","co2","ppm"),...A("TVOC","tvoc"),...A("PM1","pm1","\xB5g/m\xB3"),...A("PM25","pm25","\xB5g/m\xB3"),...A("PM10","pm10","\xB5g/m\xB3"),...A("CO","co","ppm"),...A("NO2","no2"),...A("O3","o3"),...A("CH2O","ch2o","\xB5g/m\xB3"),...A("RN","rn","Bq/m\xB3"),...A("SO2","so2"),{role:/^value\.pressure$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"PRESSURE",required:!1,defaultRole:"value.pressure",defaultUnit:"mbar"},{role:/temperature(\..*)?$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"ACTUAL",required:!1,defaultRole:"value.temperature",defaultUnit:"\xB0C",ignoreRole:f},{role:/humidity(\..*)?$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"HUMIDITY",required:!1,defaultRole:"value.humidity",defaultUnit:"%",ignoreRole:f},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.airQuality},temperature:{states:[{role:/\.temperature$/,indicator:!1,write:!1,type:e.StateType.Number,name:"ACTUAL",required:!0,defaultRole:"value.temperature",defaultUnit:"\xB0C"},{role:/\.humidity$/,indicator:!1,write:!1,type:e.StateType.Number,name:"SECOND",required:!1,defaultRole:"value.humidity",defaultUnit:"%"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.temperature},humidity:{states:[{role:/\.humidity$/,indicator:!1,write:!1,type:e.StateType.Number,name:"ACTUAL",required:!0,defaultRole:"value.humidity",defaultUnit:"%"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.humidity},illuminance:{states:[{role:/\.brightness$/,indicator:!1,write:!1,type:e.StateType.Number,name:"ACTUAL",required:!0,defaultRole:"value.brightness",defaultUnit:"lux"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.illuminance},pressure:{states:[{role:/^value\.pressure$/,indicator:!1,write:!1,type:e.StateType.Number,name:"PRESSURE",required:!0,defaultRole:"value.pressure",defaultUnit:"mbar"},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.pressure},flow:{states:[{role:/^value\.flow$/,indicator:!1,write:!1,type:e.StateType.Number,name:"FLOW",required:!0,defaultRole:"value.flow",defaultUnit:"m\xB3/h"},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.flow},fillLevel:{states:[{role:/^value\.fill(\.[-.\w]+)?$/,indicator:!1,write:!1,type:e.StateType.Number,name:"ACTUAL",required:!0,defaultRole:"value.fill",defaultUnit:"%"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.fillLevel},image:{states:[{role:/\.icon$|^icon$|^icon\.|\.icon\.|\.chart\.url\.|\.chart\.url$|^url.icon$/,indicator:!1,write:!1,type:e.StateType.String,name:"URL",defaultRole:"icon",required:!0,ignoreRole:f},t.unreach,t.lowbat,t.maintain,t.error,t.battery],type:e.Types.image},electricity:{states:[...Object.values($).map(a=>({...a,requiredOneOf:"electricity"})),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.electricity},info:{states:[{indicator:!1,name:"ACTUAL",required:!0,multiple:!0,noDeviceDetection:!0,ignoreRole:/\.inhibit$/,defaultRole:"state"},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.info}}});var Re=G(re=>{"use strict";Object.defineProperty(re,"__esModule",{value:!0});re.ChannelDetector=void 0;var P=X(),L=z(),B=ae(),te=class a{constructor(){this.enums=null,this.cache={}}_applyPattern(r,l,i,n,u){var o,c;if(!((o=r[l])===null||o===void 0)&&o.common){let d=null;if(i.role&&(d=i.role.test(r[l].common.role||""),d&&i.channelRole)){let T=(0,L.getParentId)(l),w=((c=r[T])===null||c===void 0?void 0:c.common.role)||"";w&&(r[T].type==="channel"||r[T].type==="device")?d=i.channelRole.test(w):d=!1}if(d===!1)return!1;if(i.type){if(typeof i.type=="string"){if(i.type!==r[l].common.type)return!1}else if(Array.isArray(i.type)){let T=!1;for(let w=0;w<i.type.length;w++)if(i.type[w]===r[l].common.type){T=!0;break}if(!T)return!1}}if(i.objectType&&r[l].type!==i.objectType||i.stateName&&!i.stateName.test(l)||i.unit&&i.unit!==r[l].common.unit)return!1;if(i.ignoreRole){let T=r[l].common.role||"";if(T&&i.ignoreRole.test(T))return!1}if(i.indicator===!1&&(r[l].common.role||"").match(/^indicator(\.[.\w]+)?$/))return!1;if(i.state){let T=l.split(".").pop()||"";if(T&&!i.state.test(T))return!1}let R=i.defaultRole&&r[l].common.role===i.defaultRole,m=i.defaultUnit?r[l].common.unit===i.defaultUnit:!1;if(i.min===P.StateType.Number&&typeof r[l].common.min!==P.StateType.Number&&(!m||r[l].common.unit!=="%")||i.max===P.StateType.Number&&typeof r[l].common.max!==P.StateType.Number&&(!m||r[l].common.unit!=="%")||i.statesDefined===!0&&typeof r[l].common.states!="object")return!1;if(!R){if(i.write!==void 0&&i.write!==!!r[l].common.write||i.read!==void 0&&i.read!==(r[l].common.read===void 0?!0:r[l].common.read))return!1;if(typeof i.enums=="function"){let T=this._getEnumsForId(r,l,u);if(!n&&!i.enums(r[l],T||[]))return!1}}return!0}return!1}_getEnumsForId(r,l,i){var n;this.enums||(this.enums=(0,L.getFunctionEnums)(r,i));let u=[];if(this.enums.forEach(o=>{r[o].common.members.includes(l)&&u.push(o)}),!u.length&&((n=r[l])===null||n===void 0?void 0:n.type)==="state"){let o=(0,L.getParentId)(l);r[o]&&(r[o].type==="channel"||r[o].type==="device")&&this.enums.forEach(c=>{r[c].common.members.includes(o)&&u.push(c)})}return u.length?u:null}static copyState(r,l){let i=l||JSON.parse(JSON.stringify(r));return i.original=r.original||r,"enums"in r&&r.enums&&(i.enums=r.enums),"role"in r&&r.role&&(i.role=r.role),"channelRole"in r&&r.channelRole&&(i.channelRole=r.channelRole),i}_testOneState(r){var l,i,n,u,o,c;let d=r.objects,R=r.pattern,m=r.state,T=r.channelStates,w=r.usedIds,E=r.usedInCurrentDevice,U=r.ignoreIndicators,k=r.ignoreEnums,K=r.sortedKeys,p=r.result,D=!1;for(let h of T)if(!(m.name==="COVER"&&(p!=null&&p.states.find(C=>C.id&&C.name==="COVER")))){if(m.indicator&&U){let s=h.split(".").pop()||"";if(s&&U.includes(s))continue}if(!m.indicator){if(E.includes(h))continue;if(!m.notSingle){if(!r.detectAllPossibleDevices){if(w.includes(h))continue}}}if(this._applyPattern(d,h,m,k,K)){p||(p=JSON.parse(JSON.stringify(B.patterns[R])),r.result=p,p==null||p.states.forEach((s,q)=>a.copyState(B.patterns[R].states[q],s)));let C=!1;if(p.states.find(({id:s})=>s===h))C=!0;else for(let s of p.states)if(s.name===m.name&&a.stateTypeMatches(s,d[h])){if(s.id){let S;r.favorId&&(h===r.favorId?S=!0:s.id===r.favorId&&(S=!1));let _=(n=(i=(l=d[s.id])===null||l===void 0?void 0:l.common)===null||i===void 0?void 0:i.role)!==null&&n!==void 0?n:"",W=(c=(o=(u=d[h])===null||u===void 0?void 0:u.common)===null||o===void 0?void 0:o.role)!==null&&c!==void 0?c:"",F=s.defaultRole;if(F&&S===void 0&&(W===F?S=!0:_===F&&(S=!1)),S===void 0){let b=W.split("."),I=b.length,N=_.split("."),M=N.length;W===""||b[0]==="state"&&N[0]!=="state"?S=!1:b[0]!=="state"&&N[0]==="state"||I>M?S=!0:I<M?S=!1:S=b[0]!=="state"}if(!S)break}let q=s.id;if(s.id=h,C=!0,q&&!m.indicator){for(let S=E.length-1;S>=0;S--)E[S]===q&&E.splice(S,1);r.rejectedInCurrentDevice.push(q)}break}if(!C)D&&!m.indicator&&r.rejectedInCurrentDevice.push(h);else if(D=!0,m.indicator||E.push(h),m.multiple&&T.length>1){for(let s of T)if(s!==h&&(m.indicator||!E.includes(s)&&!r.rejectedInCurrentDevice.includes(s)&&(m.notSingle||!w.includes(s)))&&this._applyPattern(d,s,m,k,K))if(m.indicator||E.push(s),Array.isArray(m)){let q=a.copyState(m[0]);q.id=s,p.states.push(q)}else{let q=a.copyState(m);q.id=s,p.states.push(q)}}}}return D}static findParentChannelOrDevice(r,l,i){if(!r[l])return;let n=l.split("."),u=l;if(r[l].type==="state"&&(n.pop(),l=n.join(".")),n.length<=2)return l;let o=r[l];if((o==null?void 0:o.type)==="device"||i&&(o==null?void 0:o.type)==="channel")return l;if(i)return;n.pop();let c=n.join("."),d=r[c];if(!d)return o?l:u;if(d.type==="device"||n.length<=2)return c;if((o==null?void 0:o.type)==="channel")return l;n.pop();let R=n.join("."),m=r[R];return!m||m.type!=="device"&&m.type!=="channel"?c:R}static getChannelOrDeviceStates(r,l,i,n=!1,u=!1){var o;let c=(o=r[l])===null||o===void 0?void 0:o.type;switch(c){case void 0:return[...(0,L.getObjectsBelowId)(i,l)];case"state":case"channel":case"device":case"folder":if(n&&c!=="device"){let d=a.findParentChannelOrDevice(r,l);return d&&d!==l?[...(0,L.getObjectsBelowId)(i,d)]:[l]}if(c!=="state")return[...(0,L.getObjectsBelowId)(i,l)];if(u){let d=a.findParentChannelOrDevice(r,l,!0);return d&&d!==l?[...(0,L.getObjectsBelowId)(i,d)]:[l]}return[l];default:return[l]}}static patternIsAllowed(r,l,i){if(!r)return!1;if(Array.isArray(r.type)){for(let n=0;n<r.type.length;n++)if(l&&!l.includes(r.type[n])||i&&i.includes(r.type[n]))return!1;return!0}return l&&!l.includes(r.type)?!1:!i||!i.includes(r.type)}static stateTypeMatches(r,l){var i;if(!r.type)return!0;let n=(i=l==null?void 0:l.common)===null||i===void 0?void 0:i.type;return n?Array.isArray(r.type)?r.type.includes(n):r.type===n:!0}static allRequiredStatesFound(r){if(!r.result)return!1;let l=r.result.states,i=new Map;for(let n=0;n<l.length;n++){let u=l[n].requiredOneOf;if(u)i.set(u,i.get(u)||!!l[n].id);else if(l[n].required&&!l[n].id)return!1}for(let n of i.values())if(!n)return!1;return!0}static cleanState(r,l){var i,n;let u=((n=(i=l[r.id])===null||i===void 0?void 0:i.common)===null||n===void 0?void 0:n.role)||"";if(r.name.includes("%d")&&r.role&&r.id&&u){let o=r.role.exec(u);o&&(r.name=r.name.replace("%d",o[1]))}r.role&&delete r.role,r.enums&&delete r.enums,r.original&&delete r.original}sortTypes(r,l){return l.forEach(([i,n])=>{let u=r.indexOf(i),o=r.indexOf(n);if(u===-1||o===-1)return;let c=r.splice(u,1);r.splice(o,0,...c)}),r}_detectNext(r){var l,i,n,u,o,c;let{objects:d,id:R,_usedIdsOptional:m=[],ignoreIndicators:T,prioritizedTypes:w,detectParent:E,detectOnlyChannel:U,allowedTypes:k,excludedTypes:K,_keysOptional:p,detectAllPossibleDevices:D}=r,{_patternList:h}=r;r._usedIdsOptional=m;let C=a.getChannelOrDeviceStates(d,R,p||[],E,U);if(!(!((l=d[R])===null||l===void 0)&&l.common)&&!C.length)return null;if((i=r._checkedPatterns)!==null&&i!==void 0||(r._checkedPatterns=[]),!h){let S=Object.keys(B.patterns).filter(_=>a.patternIsAllowed(B.patterns[_],k,K));h=w?this.sortTypes(S,w):S,r._patternList=h}let s={objects:d,channelStates:C,usedIds:m,ignoreIndicators:T||[],pattern:"unknown",usedInCurrentDevice:[],rejectedInCurrentDevice:[],state:{},ignoreEnums:!!r.ignoreEnums,sortedKeys:p,favorId:r.detectParent?void 0:R,detectAllPossibleDevices:D},q=(n=d[R])===null||n===void 0?void 0:n.type;for(let S of h){if(r._checkedPatterns.includes(S))continue;r._checkedPatterns.push(S),delete s.result,s.pattern=S,s.usedInCurrentDevice=[],s.rejectedInCurrentDevice=[];let _=new Map;for(let b of B.patterns[S].states)b.requiredOneOf&&_.set(b.requiredOneOf,((u=_.get(b.requiredOneOf))!==null&&u!==void 0?u:0)+1);let W=new Set;for(let b of B.patterns[S].states){let I=!1;s.state=b,this._testOneState(s)&&(I=!0);let N=b.requiredOneOf;if(N){I&&W.add(N);let M=((o=_.get(N))!==null&&o!==void 0?o:0)-1;if(_.set(N,M),M<=0&&!W.has(N)){delete s.result;break}}else if(b.required&&!I){delete s.result;break}}if(!a.allRequiredStatesFound(s))continue;s.usedInCurrentDevice.forEach(b=>m.push(b)),s.rejectedInCurrentDevice.forEach(b=>!m.includes(b)&&m.push(b));let F;if(q!=="device"){let b=(c=a.findParentChannelOrDevice(d,R))!==null&&c!==void 0?c:R;if(d[b]&&(d[b].type==="channel"||d[b].type==="device")){F=(0,L.getObjectsBelowId)(p,b);for(let I of F)s.result.states.forEach((N,M)=>{!N.id&&(N.indicator||N.searchInParent)&&!N.noDeviceDetection&&this._applyPattern(d,I,N.original,!!r.ignoreEnums,s.sortedKeys)&&s.result&&(s.result.states[M].id=I)})}}if(s.result.states.forEach(b=>a.cleanState(b,s.objects)),r.limitTypesToOneOf){for(let b of r.limitTypesToOneOf)if(b.includes(S))for(let I of b)I===S||r._checkedPatterns.includes(I)||r._checkedPatterns.push(I)}return s.result}return null}detect(r){var l;let{objects:i,id:n,ignoreCache:u,detectAllPossibleDevices:o}=r,{_keysOptional:c,_usedIdsOptional:d}=r;if(!u&&this.cache[n]){let{allowedTypes:T=[],excludedTypes:w=[]}=r;if(!T.length&&!w.length)return this.cache[n];let E=this.cache[n].filter(({type:U})=>T.includes(U)&&!w.includes(U));if(E.length)return E}c?r._keysOptionalSorted||c.sort():(c=Object.keys(i),c.sort(),r._keysOptional=c),d&&!r.detectParent&&(d=[],r._usedIdsOptional=d),r.ignoreEnums===void 0&&((l=r.allowedTypes)===null||l===void 0?void 0:l.length)===1&&(r.ignoreEnums=!0),o&&(r.excludedTypes||(r.excludedTypes=[]),r.excludedTypes.includes(P.Types.info)||r.excludedTypes.push(P.Types.info)),r._checkedPatterns=[];let R=[],m;for(;m=this._detectNext(r);)R.push(m),r.detectAllPossibleDevices&&(r._usedIdsOptional=[]);return R.sort((T,w)=>{if(T.type===P.Types.info&&w.type!==P.Types.info)return 1;if(w.type===P.Types.info&&T.type!==P.Types.info)return-1;let E=T.states.find(p=>p.id===n&&(p.required||p.requiredOneOf))?1:0,U=w.states.find(p=>p.id===n&&(p.required||p.requiredOneOf))?1:0;if(E!==U)return U-E;if(!E){let p=T.states.find(h=>h.id===n)?1:0,D=w.states.find(h=>h.id===n)?1:0;if(p!==D)return D-p}let k=T.states.filter(p=>p.id).length;return w.states.filter(p=>p.id).length-k}),this.cache[n]=R.length?R:null,this.cache[n]}static getPatterns(){let r={};return Object.keys(B.patterns).forEach(l=>{let i=JSON.parse(JSON.stringify(B.patterns[l]));i.states.forEach((n,u)=>{let o=B.patterns[l].states[u];o.role&&(i.states[u].role=o.role.toString()),o.enums&&(i.states[u].enums=!0)}),r[l]=i}),r}};re.ChannelDetector=te;te.getEnums=L.getEnums});var ge=G(g=>{"use strict";Object.defineProperty(g,"__esModule",{value:!0});g.StateType=g.Types=g.roleOrEnumGate=g.roleOrEnumDoor=g.roleOrEnumWindow=g.roleOrEnumBlind=g.roleOrEnumLight=void 0;var xe=Re(),Q=z();Object.defineProperty(g,"roleOrEnumLight",{enumerable:!0,get:function(){return Q.roleOrEnumLight}});Object.defineProperty(g,"roleOrEnumBlind",{enumerable:!0,get:function(){return Q.roleOrEnumBlind}});Object.defineProperty(g,"roleOrEnumWindow",{enumerable:!0,get:function(){return Q.roleOrEnumWindow}});Object.defineProperty(g,"roleOrEnumDoor",{enumerable:!0,get:function(){return Q.roleOrEnumDoor}});Object.defineProperty(g,"roleOrEnumGate",{enumerable:!0,get:function(){return Q.roleOrEnumGate}});g.default=xe.ChannelDetector;var ve=X();Object.defineProperty(g,"Types",{enumerable:!0,get:function(){return ve.Types}});Object.defineProperty(g,"StateType",{enumerable:!0,get:function(){return ve.StateType}})});var Ne,Ee=Ce(()=>{Ne={name:"@iobroker/type-detector",version:"6.0.0",description:"Detects devices in ioBroker for Material, Google home, Homekit, ...",author:{name:"bluefox",email:"dogafox@gmail.com"},publishConfig:{access:"public"},homepage:"https://github.com/ioBroker/ioBroker.type-detector",keywords:["ioBroker","types","devices"],repository:{type:"git",url:"git+https://github.com/ioBroker/ioBroker.type-detector.git"},dependencies:{},devDependencies:{"@alcalzone/release-script":"^5.2.1","@alcalzone/release-script-plugin-license":"^5.2.0","@iobroker/types":"^7.2.2","@iobroker/eslint-config":"^2.3.4",mocha:"^11.7.6",typescript:"~6.0.3"},bugs:{url:"https://github.com/ioBroker/ioBroker.type-detector/issues"},main:"build/index.js",files:["LICENSE","build/"],scripts:{test:"mocha --exit","test:integration":"mocha --exit","test:package":`node -e "console.log('Not applicable')"`,lint:"eslint -c eslint.config.mjs",watch:"mocha --watch","build:ts":"tsc -p tsconfig.build.json","build:doc":"node lib/createMd",build:"npm run build:ts && npm run build:doc",release:"release-script --noPush -y",npm:"npm i -f && cd src-test-gui && npm i -f"},license:"MIT",readmeFilename:"README.md"}});var Ve=G(()=>{var V=ie(ge()),Oe=ie(ae());Ee();window.AWDetector={ChannelDetector:V.default,Types:V.Types,StateType:V.StateType,patterns:Oe.patterns,version:Ne.version}});Ve();})();
1
+ (()=>{var Ee=Object.create;var ae=Object.defineProperty;var Ne=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var $e=Object.getPrototypeOf,qe=Object.prototype.hasOwnProperty;var K=(a,r)=>()=>{try{return r||a((r={exports:{}}).exports,r),r.exports}catch(l){throw r=0,l}};var Ie=(a,r,l,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of Oe(r))!qe.call(a,n)&&n!==l&&ae(a,n,{get:()=>r[n],enumerable:!(i=Ne(r,n))||i.enumerable});return a};var Ae=(a,r,l)=>(l=a!=null?Ee($e(a)):{},Ie(r||!a||!a.__esModule?ae(l,"default",{value:a,enumerable:!0}):l,a));var X=K(H=>{"use strict";Object.defineProperty(H,"__esModule",{value:!0});H.StateType=H.Types=void 0;var le;(function(a){a.unknown="unknown",a.airCondition="airCondition",a.airPurifier="airPurifier",a.airQuality="airQuality",a.blind="blind",a.blindButtons="blindButtons",a.button="button",a.buttonSensor="buttonSensor",a.camera="camera",a.chart="chart",a.coAlarm="coAlarm",a.contact="contact",a.cie="cie",a.ct="ct",a.dimmer="dimmer",a.electricity="electricity",a.door="door",a.fan="fan",a.fireAlarm="fireAlarm",a.floodAlarm="floodAlarm",a.gate="gate",a.hue="hue",a.humidity="humidity",a.illuminance="illuminance",a.image="image",a.info="info",a.instance="instance",a.light="light",a.location="location",a.locationOne="locationOne",a.lock="lock",a.media="media",a.motion="motion",a.percentage="percentage",a.pump="pump",a.rgb="rgb",a.rgbSingle="rgbSingle",a.rgbwSingle="rgbwSingle",a.slider="slider",a.socket="socket",a.temperature="temperature",a.fillLevel="fillLevel",a.flow="flow",a.pressure="pressure",a.thermostat="thermostat",a.vacuumCleaner="vacuumCleaner",a.volume="volume",a.volumeGroup="volumeGroup",a.warning="warning",a.weatherCurrent="weatherCurrent",a.weatherForecast="weatherForecast",a.window="window",a.windowTilt="windowTilt"})(le||(H.Types=le={}));var ie;(function(a){a.Number="number",a.String="string",a.Boolean="boolean"})(ie||(H.StateType=ie={}))});var z=K(O=>{"use strict";Object.defineProperty(O,"__esModule",{value:!0});O.checkEnum=ne;O.roleOrEnum=j;O.roleOrEnumLight=Ue;O.roleOrEnumBlind=Ce;O.roleOrEnumGate=Pe;O.roleOrEnumWindow=_e;O.roleOrEnumDoor=Be;O.getEnums=Le;O.getAllStatesInChannel=De;O.getAllStatesInDevice=Me;O.getObjectsBelowId=Te;O.getFunctionEnums=ke;O.getParentId=We;function ne(a,r){let l=!1;return a&&a.forEach(i=>{let n=i.lastIndexOf(".");n!==-1&&(i=i.substring(n+1));for(let u in r)if(Object.prototype.hasOwnProperty.call(r,u)&&r[u].find(o=>o.test(i)))return l=!0,!1}),l}function j(a,r,l,i){return a.common.role&&(l!=null&&l.includes(a.common.role))?!0:ne(r,i)}var oe={en:[/lights?/i,/lamps?/i,/ceilings?/i],de:[/licht(er)?/i,/lampen?/i,/beleuchtung(en)?/i],ru:[/свет/i,/ламп[аы]/i,/торшеры?/,/подсветк[аи]/i,/лампочк[аи]/i,/светильники?/i]},ue=["switch.light","dimmer","value.dimmer","level.dimmer","sensor.light","state.light"];function Ue(a,r){return j(a,r,ue,oe)}var J={en:[/blinds?/i,/windows?/i,/shutters?/i],de:[/rollladen?/i,/fenstern?/i,/beschattung(en)?/i,/jalousien?/i],ru:[/ставни/i,/рольставни/i,/окна|окно/,/жалюзи/i]},se=["blind","level.blind","value.blind","action.stop","button.stop","button.stop.blind","button.open.blind","button.close.blind","level.tilt","value.tilt","button.tilt.open","button.tilt.close","button.tilt.stop"];function Ce(a,r){return j(a,r,se,J)}var de={en:[/gates?/i],de:[/^toren$/i,/^tor$/i],ru:[/ворота/i]},fe=["gate","value.gate","switch.gate","action.stop","button.stop"];function Pe(a,r){return j(a,r,fe,de)}var ce=["window","state.window","sensor.window","value.window"];function _e(a,r){return j(a,r,ce,J)}var me={en:[/doors?/i,/gates?/i,/wickets?/i,/entry|entries/i],de:[/^türe?/i,/^tuere?/i,/^tore?$/i,/einfahrt(en)?/i,/pforten?/i],ru:[/двери|дверь/i,/ворота/i,/калитка|калитки/,/въезды?/i,/входы?/i]},pe=["door","state.door","sensor.door"];function Be(a,r){return j(a,r,pe,me)}function Le(){return{door:{roles:pe,words:me},window:{roles:ce,words:J},blind:{roles:se,words:J},gate:{roles:fe,words:de},light:{roles:ue,words:oe}}}function ye(a){return a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function De(a,r){let l=[],i=new RegExp(`^${ye(r)}\\.[^.]+$`);return a.forEach(n=>i.test(n)&&l.push(n)),l}function Me(a,r){let l=[],i=new RegExp(`^${ye(r)}\\.[^.]+\\.[^.]+$`);return a.forEach(n=>i.test(n)&&l.push(n)),l}function Te(a,r){let l=[];r+=".";let i=0,n=a.length-1,u=-1;for(;i<=n;){let o=Math.floor((i+n)/2);a[o]<r?i=o+1:(u=o,n=o-1)}if(u===-1||u>=a.length)return l;for(let o=u;o<a.length;o++){let c=a[o];if(c===r||c.startsWith(r))l.push(c);else break}return l}function ke(a,r){var l,i,n;let u=[],o=/^enum\.functions\./,c=Te(r,"enum");for(let d of c)Object.prototype.hasOwnProperty.call(a,d)&&o.test(d)&&((l=a[d])===null||l===void 0?void 0:l.type)==="enum"&&(!((n=(i=a[d].common)===null||i===void 0?void 0:i.members)===null||n===void 0)&&n.length)&&u.push(d);return u}function We(a){let r=a.lastIndexOf(".");return r!==-1?a.substring(0,r):a}});var we=K(ee=>{"use strict";Object.defineProperty(ee,"__esModule",{value:!0});ee.patterns=void 0;var e=X(),y=z(),f=/^[^.]+\.setting\./,Se=/^[^.]+\.setting\.|^level\.temperature\.(heating|cooling)$/,Z={heating:{role:/^level\.temperature\.heating$/,indicator:!1,write:!0,type:e.StateType.Number,name:"SET_HEATING",requiredOneOf:"setpoint",defaultRole:"level.temperature.heating",defaultUnit:"\xB0C",ignoreRole:f},cooling:{role:/^level\.temperature\.cooling$/,indicator:!1,write:!0,type:e.StateType.Number,name:"SET_COOLING",requiredOneOf:"setpoint",defaultRole:"level.temperature.cooling",defaultUnit:"\xB0C",ignoreRole:f}},t={working:{role:/^indicator\.working$/,indicator:!0,notSingle:!0,name:"WORKING",required:!1,defaultRole:"indicator.working",defaultType:e.StateType.Boolean},unreach:{role:/^indicator(\.maintenance)?\.unreach$/,indicator:!0,type:e.StateType.Boolean,notSingle:!0,name:"UNREACH",required:!1,defaultRole:"indicator.maintenance.unreach"},lowbat:{role:/^indicator(\.maintenance)?\.(lowbat|battery)$/,indicator:!0,type:e.StateType.Boolean,notSingle:!0,name:"LOWBAT",required:!1,defaultRole:"indicator.maintenance.lowbat"},maintain:{role:/^indicator\.maintenance$/,indicator:!0,type:e.StateType.Boolean,notSingle:!0,name:"MAINTAIN",required:!1,defaultRole:"indicator.maintenance"},error:{role:/^indicator\.error$/,indicator:!0,notSingle:!0,name:"ERROR",required:!1,defaultRole:"indicator.error",defaultType:e.StateType.String},direction:{role:/^indicator\.direction$/,indicator:!0,type:e.StateType.Boolean,notSingle:!0,name:"DIRECTION",required:!1,defaultRole:"indicator.direction"},direction_enum:{role:/^(indicator|value)\.direction$/,type:e.StateType.Number,notSingle:!0,name:"DIRECTION_ENUM",required:!1,defaultStates:{0:"None",1:"Up/Open",2:"Down/Close",3:"Unknown"},defaultRole:"value.direction"},reachable:{role:/^indicator\.reachable$/,indicator:!0,type:e.StateType.Boolean,notSingle:!0,name:"CONNECTED",required:!1,defaultRole:"indicator.reachable",inverted:!0},rssi:{role:/^value\.rssi$/,indicator:!1,write:!1,type:e.StateType.Number,notSingle:!0,name:"RSSI",required:!1,defaultRole:"value.rssi",defaultUnit:"dBm"},onTime:{role:/^level\.timer\.off$/,indicator:!1,write:!0,type:e.StateType.Number,name:"ON_TIME",required:!1,defaultRole:"level.timer.off",defaultUnit:"s",ignoreRole:f},battery:{role:/^value\.battery$/,indicator:!1,type:e.StateType.Number,write:!1,name:"BATTERY",required:!1,defaultRole:"value.battery",defaultUnit:"%"}},$={power:{role:/^value\.power$/,indicator:!1,type:e.StateType.Number,write:!1,name:"ELECTRIC_POWER",required:!1,defaultRole:"value.power",defaultUnit:"W"},current:{role:/^value\.current$/,indicator:!1,type:e.StateType.Number,write:!1,name:"CURRENT",required:!1,defaultRole:"value.current",defaultUnit:"mA"},voltage:{role:/^value\.voltage$/,indicator:!1,type:e.StateType.Number,write:!1,name:"VOLTAGE",required:!1,defaultRole:"value.voltage",defaultUnit:"V"},consumption:{role:/^value\.power\.consumption$/,indicator:!1,type:e.StateType.Number,write:!1,name:"CONSUMPTION",required:!1,defaultRole:"value.power.consumption",defaultUnit:"Wh"},frequency:{role:/^value\.frequency$/,indicator:!1,type:e.StateType.Number,write:!1,name:"FREQUENCY",required:!1,defaultRole:"value.frequency",defaultUnit:"Hz"}},v={speed:{role:/(speed|mode)\.fan$/,indicator:!1,write:!0,type:e.StateType.Number,name:"SPEED",required:!1,defaultRole:"level.mode.fan",defaultStates:{0:"AUTO",1:"HIGH",2:"LOW",3:"MEDIUM",4:"QUIET",5:"TURBO"},ignoreRole:f},power:{role:/^switch(\.power)?$/,indicator:!1,write:!0,type:[e.StateType.Boolean,e.StateType.Number],searchInParent:!0,name:"POWER",required:!1,defaultRole:"switch.power"},speedLevel:{role:/^level\.speed$/,indicator:!1,write:!0,type:e.StateType.Number,name:"SPEED_LEVEL",required:!1,defaultRole:"level.speed",defaultUnit:"%",ignoreRole:f},swing:{role:/swing$/,indicator:!1,write:!0,type:e.StateType.Number,searchInParent:!0,name:"SWING",required:!1,defaultRole:"level.mode.swing",defaultStates:{0:"AUTO",1:"HORIZONTAL",2:"STATIONARY",3:"VERTICAL"},ignoreRole:f},swingBoolean:{role:/swing$/,indicator:!1,write:!0,type:e.StateType.Boolean,searchInParent:!0,name:"SWING",required:!1,defaultRole:"switch.mode.swing",ignoreRole:f},airflowDirection:{role:/^level\.mode\.airflow$/,indicator:!1,write:!0,type:e.StateType.Number,name:"AIRFLOW_DIRECTION",required:!1,defaultRole:"level.mode.airflow",defaultStates:{0:"FORWARD",1:"REVERSE"},ignoreRole:f}},Fe={0:"UNKNOWN",1:"LOW",2:"MEDIUM",3:"HIGH",4:"CRITICAL"};function A(a,r,l){return[{role:new RegExp(`^value\\.${r}$`),indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:a,required:!1,defaultRole:`value.${r}`,defaultUnit:l},{role:new RegExp(`^value\\.${r}\\.level$`),indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:`${a}_LEVEL`,required:!1,defaultRole:`value.${r}.level`,defaultStates:Fe}]}var be={thermostat:{role:/^value\.mode\.thermostat$/,indicator:!1,write:!1,type:[e.StateType.Number,e.StateType.String],searchInParent:!0,name:"WORKING_MODE",required:!1,defaultRole:"value.mode.thermostat",defaultStates:{0:"OFF",1:"HEAT",2:"COOL"}},airCondition:{role:/^value\.mode\.airconditioner$/,indicator:!1,write:!1,type:[e.StateType.Number,e.StateType.String],searchInParent:!0,name:"WORKING_MODE",required:!1,defaultRole:"value.mode.airconditioner",defaultStates:{0:"IDLE",1:"HEAT",2:"COOL"}}},x={condition:{role:/^value\.filter$/,indicator:!1,write:!1,type:e.StateType.Number,name:"FILTER_CONDITION",required:!1,defaultRole:"value.filter",defaultUnit:"%"},conditionCarbon:{role:/^value\.filter\.carbon$/,indicator:!1,write:!1,type:e.StateType.Number,name:"FILTER_CONDITION_CARBON",required:!1,defaultRole:"value.filter.carbon",defaultUnit:"%"},change:{role:/^indicator\.maintenance\.filter$/,indicator:!0,type:e.StateType.Boolean,name:"FILTER_CHANGE",required:!1,defaultRole:"indicator.maintenance.filter"}},Y={severity:{role:/^value\.severity$/,indicator:!1,write:!1,type:e.StateType.Number,name:"SEVERITY",required:!1,defaultRole:"value.severity",defaultStates:{0:"NORMAL",1:"WARNING",2:"CRITICAL"}},muted:{role:/^indicator\.alarm\.muted$/,indicator:!0,type:e.StateType.Boolean,name:"MUTED",required:!1,defaultRole:"indicator.alarm.muted"},test:{role:/^indicator\.working\.test$/,indicator:!0,type:e.StateType.Boolean,name:"TEST",required:!1,defaultRole:"indicator.working.test"}};ee.patterns={chart:{states:[{objectType:"chart",name:"CHART"}],type:e.Types.chart},mediaPlayer:{states:[{role:/^media\.state(\..*)?$/,indicator:!1,type:[e.StateType.Boolean,e.StateType.Number],name:"STATE",required:!0,defaultRole:"media.state"},{role:/^(button|action)\.play(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Boolean,name:"PLAY",required:!1,noSubscribe:!0,defaultRole:"button.play"},{role:/^(button|action)\.pause(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Boolean,name:"PAUSE",required:!1,noSubscribe:!0,defaultRole:"button.pause"},{role:/^(button|action)\.stop(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Boolean,name:"STOP",required:!1,noSubscribe:!0,defaultRole:"button.stop"},{role:/^(button|action)\.next(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Boolean,name:"NEXT",required:!1,noSubscribe:!0,defaultRole:"button.next"},{role:/^(button|action)\.prev(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Boolean,name:"PREV",required:!1,noSubscribe:!0,defaultRole:"button.prev"},{role:/^media\.mode\.shuffle(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Boolean,name:"SHUFFLE",required:!1,defaultRole:"media.mode.shuffle"},{role:/^media\.mode\.repeat(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Number,name:"REPEAT",required:!1,defaultRole:"media.mode.repeat"},{role:/^media\.artist(\..*)?$/,indicator:!1,write:!1,type:e.StateType.String,name:"ARTIST",required:!1,defaultRole:"media.artist"},{role:/^media\.album(\..*)?$/,indicator:!1,write:!1,type:e.StateType.String,name:"ALBUM",required:!1,defaultRole:"media.album"},{role:/^media\.title(\..*)?$/,indicator:!1,write:!1,type:e.StateType.String,name:"TITLE",required:!1,defaultRole:"media.title"},{role:/^media\.cover(\.big)?$/,indicator:!1,write:!1,type:e.StateType.String,name:"COVER",required:!1,notSingle:!0,defaultRole:"media.cover"},{role:/^media\.cover(\..*)$/,indicator:!1,write:!1,type:e.StateType.String,name:"COVER",required:!1,notSingle:!0},{role:/^media\.duration(\..*)?$/,indicator:!1,write:!1,type:e.StateType.Number,name:"DURATION",required:!1,defaultRole:"media.duration",defaultUnit:"sec"},{role:/^media\.elapsed(\..*)?$/,indicator:!1,type:e.StateType.Number,name:"ELAPSED",required:!1,defaultRole:"media.elapsed",defaultUnit:"sec"},{role:/^media\.seek(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Number,name:"SEEK",required:!1,defaultRole:"media.seek"},{role:/^media\.track(\..*)?$/,indicator:!1,type:e.StateType.String,name:"TRACK",required:!1,defaultRole:"media.track"},{role:/^media\.episode(\..*)?$/,indicator:!1,type:e.StateType.String,name:"EPISODE",required:!1,defaultRole:"media.episode"},{role:/^media\.season(\..*)?$/,indicator:!1,type:e.StateType.String,name:"SEASON",required:!1,defaultRole:"media.season"},{role:/^level(\.volume)?$/,indicator:!1,type:e.StateType.Number,min:e.StateType.Number,max:e.StateType.Number,write:!0,name:"VOLUME",required:!1,notSingle:!0,defaultRole:"level.volume",defaultUnit:"%"},{role:/^value(\.volume)?$/,indicator:!1,type:e.StateType.Number,min:e.StateType.Number,max:e.StateType.Number,write:!1,name:"VOLUME_ACTUAL",required:!1,notSingle:!0,defaultRole:"value.volume",defaultUnit:"%"},{role:/^media(\.mute)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"MUTE",required:!1,notSingle:!0,defaultRole:"media.mute"},{role:/^media\.player\.name$/,indicator:!1,type:e.StateType.String,name:"PLAYER_NAME",required:!1,notSingle:!0,defaultRole:"media.player.name"},{role:/^media\.player\.type/,indicator:!1,type:e.StateType.String,write:!1,name:"PLAYER_TYPE",required:!1,notSingle:!0,defaultRole:"media.player.type"},{stateName:/\.(paused|playerState)$/,indicator:!1,name:"IGNORE",required:!1,multiple:!0,noSubscribe:!0},t.reachable,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.media},weatherForecast:{states:[{role:/^weather\.icon(\.forecast\.0)?$/,indicator:!1,type:e.StateType.String,name:"ICON",required:!0,defaultRole:"weather.icon.forecast.0"},{role:/^value\.temperature\.min\.forecast\.0$/,indicator:!1,type:e.StateType.Number,name:"TEMP_MIN",required:!0,defaultRole:"value.temperature.min.forecast.0"},{role:/^value\.temperature\.max\.forecast\.0$/,indicator:!1,type:e.StateType.Number,name:"TEMP_MAX",required:!0,defaultRole:"value.temperature.max.forecast.0"},{role:/^value\.precipitation(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"PRECIPITATION_CHANCE",unit:"%",required:!1,defaultRole:"value.precipitation.forecast.0"},{role:/^value\.precipitation(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"PRECIPITATION",unit:"mm",required:!1,defaultRole:"value.precipitation.forecast.0"},{role:/^date(\.forecast\.0)?$/,indicator:!1,type:e.StateType.String,name:"DATE",required:!1,defaultRole:"date.forecast.0"},{role:/^dayofweek(\.forecast\.0)?$/,indicator:!1,type:e.StateType.String,name:"DOW",required:!1,defaultRole:"dayofweek.forecast.0"},{role:/^weather\.state(\.forecast\.0)?$/,indicator:!1,type:e.StateType.String,name:"STATE",required:!1,defaultRole:"weather.state.forecast.0"},{role:/^value\.temperature(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"TEMP",required:!1,defaultRole:"value.temperature.forecast.0"},{role:/^value\.pressure(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"PRESSURE",required:!1,defaultRole:"value.pressure.forecast.0"},{role:/^value\.humidity(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"HUMIDITY",required:!1,defaultRole:"value.humidity.forecast.0"},{role:/^(?:date|time)\.sunrise(?:\.forecast\.0)?$/,indicator:!1,type:[e.StateType.String,e.StateType.Number],name:"TIME_SUNRISE",required:!1,defaultRole:"date.sunrise"},{role:/^(?:date|time)\.sunset(?:\.forecast\.0)?$/,indicator:!1,type:[e.StateType.String,e.StateType.Number],name:"TIME_SUNSET",required:!1,defaultRole:"date.sunset"},{role:/^value\.temperature\.windchill(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"WIND_CHILL",required:!1,defaultRole:"value.temperature.windchill.forecast.0"},{role:/^value\.temperature\.feelslike(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"FEELS_LIKE",required:!1,defaultRole:"value.temperature.feelslike.forecast.0"},{role:/^value\.speed\.wind(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"WIND_SPEED",required:!1,defaultRole:"value.speed.wind.forecast.0"},{role:/^value\.direction\.wind(\.forecast\.0)?$/,indicator:!1,type:e.StateType.Number,name:"WIND_DIRECTION",required:!1,defaultRole:"value.direction.wind.forecast.0"},{role:/^weather\.direction\.wind(\.forecast\.0)?$/,indicator:!1,type:e.StateType.String,name:"WIND_DIRECTION_STR",required:!1,defaultRole:"weather.direction.wind.forecast.0"},{role:/^weather\.icon\.wind(\.forecast\.0)?$/,indicator:!1,type:e.StateType.String,name:"WIND_ICON",required:!1,defaultRole:"weather.icon.wind.forecast.0"},{role:/^weather\.chart\.url$/,indicator:!1,type:e.StateType.String,name:"HISTORY_CHART",required:!1,noSubscribe:!0,defaultRole:"weather.chart.url"},{role:/^weather\.chart\.url\.forecast$/,indicator:!1,type:e.StateType.String,name:"FORECAST_CHART",required:!1,noSubscribe:!0,defaultRole:"weather.chart.url.forecast"},{role:/^location$/,indicator:!1,type:e.StateType.String,name:"LOCATION",required:!1,defaultRole:"location"},{role:/^weather\.icon\.forecast.(\d+)$/,indicator:!1,type:e.StateType.String,name:"ICON%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0,notSingle:!0},{role:/^value\.temperature\.min\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,name:"TEMP_MIN%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.temperature\.max\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,name:"TEMP_MAX%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^date\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.String,name:"DATE%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^dayofweek\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.String,name:"DOW%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^weather\.state\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.String,name:"STATE%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.temperature\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,name:"TEMP%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.pressure\.forecast\.(\d+)?$/,indicator:!1,type:e.StateType.Number,name:"PRESSURE%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.humidity\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,name:"HUMIDITY%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.humidity\.max\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,name:"HUMIDITY_MAX%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.precipitation\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,unit:"%",name:"PRECIPITATION_CHANCE%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.precipitation\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,unit:"mm",name:"PRECIPITATION%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.speed\.wind\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,name:"WIND_SPEED%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^value\.direction\.wind\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.Number,name:"WIND_DIRECTION%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^weather\.direction\.wind\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.String,name:"WIND_DIRECTION_STR%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^weather\.icon\.wind\.forecast\.(\d+)$/,indicator:!1,type:e.StateType.String,name:"WIND_ICON%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^(?:date|time)\.sunrise(?:\.forecast\.(\d+))?$/,indicator:!1,type:[e.StateType.String,e.StateType.Number],name:"TIME_SUNRISE%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0},{role:/^(?:date|time)\.sunset(?:\.forecast\.(\d+))?$/,indicator:!1,type:[e.StateType.String,e.StateType.Number],name:"TIME_SUNSET%d",required:!1,searchInParent:!0,multiple:!0,noSubscribe:!0}],type:e.Types.weatherForecast},rgb:{states:[{role:/^level\.color\.red$/,indicator:!1,type:e.StateType.Number,write:!0,name:"RED",required:!0,defaultRole:"level.color.red"},{role:/^level\.color\.green$/,indicator:!1,type:e.StateType.Number,write:!0,name:"GREEN",required:!0,defaultRole:"level.color.green"},{role:/^level\.color\.blue$/,indicator:!1,type:e.StateType.Number,write:!0,name:"BLUE",required:!0,defaultRole:"level.color.blue"},{role:/^level\.color\.white$/,indicator:!1,type:e.StateType.Number,write:!0,name:"WHITE",required:!1,defaultRole:"level.color.white"},{role:/^level\.dimmer$/,indicator:!1,type:e.StateType.Number,write:!0,name:"DIMMER",required:!1,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:e.StateType.Number,write:!0,name:"BRIGHTNESS",required:!1},{role:/^level\.color\.temperature$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TEMPERATURE",required:!1,defaultRole:"level.color.temperature",defaultUnit:"\xB0K"},{role:/^level\.effect$/,indicator:!1,type:[e.StateType.Number,e.StateType.String],write:!0,statesDefined:!0,name:"EFFECT",required:!1,defaultRole:"level.effect",defaultStates:{0:"None"}},{role:/^switch(\.light)?$|^state$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^(state|switch|sensor)\.light$|^switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light",ignoreRole:f},{role:/^time\.(span|interval)$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TRANSITION_TIME",required:!1,defaultRole:"time.span",defaultUnit:"ms"},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.rgb},rgbwSingle:{states:[{role:/^level\.color\.rgbw$/,indicator:!1,type:e.StateType.String,write:!0,name:"RGBW",required:!0,defaultRole:"level.color.rgbw"},{role:/^level\.dimmer$/,indicator:!1,type:e.StateType.Number,write:!0,name:"DIMMER",required:!1,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:e.StateType.Number,write:!0,name:"BRIGHTNESS",required:!1,defaultUnit:"%"},{role:/^level\.color\.temperature$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TEMPERATURE",required:!1,defaultRole:"level.color.temperature",defaultUnit:"\xB0K"},{role:/^level\.effect$/,indicator:!1,type:[e.StateType.Number,e.StateType.String],write:!0,statesDefined:!0,name:"EFFECT",required:!1,defaultRole:"level.effect",defaultStates:{0:"None"}},{role:/^switch(\.light)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^(state|switch|sensor)\.light$|^switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light",ignoreRole:f},{role:/^time\.(span|interval)$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TRANSITION_TIME",required:!1,defaultRole:"time.span",defaultUnit:"ms"},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.rgbwSingle},rgbSingle:{states:[{role:/^level\.color\.rgb$/,indicator:!1,type:e.StateType.String,write:!0,name:"RGB",required:!0,defaultRole:"level.color.rgb"},{role:/^level\.dimmer$/,indicator:!1,type:e.StateType.Number,write:!0,name:"DIMMER",required:!1,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:e.StateType.Number,write:!0,name:"BRIGHTNESS",required:!1,defaultUnit:"%"},{role:/^level\.color\.temperature$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TEMPERATURE",required:!1,defaultRole:"level.color.temperature",defaultUnit:"\xB0K"},{role:/^level\.effect$/,indicator:!1,type:[e.StateType.Number,e.StateType.String],write:!0,statesDefined:!0,name:"EFFECT",required:!1,defaultRole:"level.effect",defaultStates:{0:"None"}},{role:/^switch(\.light)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^(state|switch|sensor)\.light$|^switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light",ignoreRole:f},{role:/^time\.(span|interval)$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TRANSITION_TIME",required:!1,defaultRole:"time.span",defaultUnit:"ms"},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.rgbSingle},cie:{states:[{role:/^level\.color\.cie$/,indicator:!1,type:e.StateType.String,write:!0,name:"CIE",required:!0,defaultRole:"level.color.cie"},{role:/^level\.dimmer$/,indicator:!1,type:e.StateType.Number,write:!0,name:"DIMMER",required:!1,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:e.StateType.Number,write:!0,name:"BRIGHTNESS",required:!1,defaultUnit:"%"},{role:/^level\.color\.temperature$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TEMPERATURE",required:!1,defaultRole:"level.color.temperature",defaultUnit:"\xB0K"},{role:/^level\.effect$/,indicator:!1,type:[e.StateType.Number,e.StateType.String],write:!0,statesDefined:!0,name:"EFFECT",required:!1,defaultRole:"level.effect",defaultStates:{0:"None"}},{role:/^switch(\.light)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^(state|switch|sensor)\.light$|^switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light",ignoreRole:f},{role:/^time\.(span|interval)$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TRANSITION_TIME",required:!1,defaultRole:"time.span",defaultUnit:"ms"},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.cie},hue:{states:[{role:/^level\.color\.hue$/,indicator:!1,type:e.StateType.Number,write:!0,name:"HUE",required:!0,defaultRole:"level.color.hue",defaultUnit:"\xB0"},{role:/^level\.dimmer$/,indicator:!1,type:e.StateType.Number,write:!0,name:"DIMMER",required:!1,searchInParent:!0,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:e.StateType.Number,write:!0,name:"BRIGHTNESS",required:!1},{role:/^level\.color\.saturation$/,indicator:!1,type:e.StateType.Number,write:!0,name:"SATURATION",required:!1,defaultRole:"level.color.saturation",defaultUnit:"%"},{role:/^level\.color\.temperature$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TEMPERATURE",required:!1,defaultRole:"level.color.temperature",defaultUnit:"\xB0K"},{role:/^level\.effect$/,indicator:!1,type:[e.StateType.Number,e.StateType.String],write:!0,statesDefined:!0,name:"EFFECT",required:!1,defaultRole:"level.effect",defaultStates:{0:"None"}},{role:/^switch(\.light)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^(state|switch|sensor)\.light$|^switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light",ignoreRole:f},{role:/^time\.(span|interval)$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TRANSITION_TIME",required:!1,defaultRole:"time.span",defaultUnit:"ms"},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.hue},ct:{states:[{role:/^level\.color\.temperature$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TEMPERATURE",required:!0,defaultRole:"level.color.temperature",defaultUnit:"\xB0K"},{role:/^level\.dimmer$/,indicator:!1,type:e.StateType.Number,write:!0,name:"DIMMER",required:!1,defaultRole:"level.dimmer",defaultUnit:"%"},{role:/^level\.brightness$/,indicator:!1,type:e.StateType.Number,write:!0,name:"BRIGHTNESS",required:!1},{role:/^switch(\.light)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"ON",required:!1,defaultRole:"switch.light"},{role:/^(state|switch|sensor)\.light$|^switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light",ignoreRole:f},{role:/^level\.effect$/,indicator:!1,type:[e.StateType.Number,e.StateType.String],write:!0,statesDefined:!0,name:"EFFECT",required:!1,defaultRole:"level.effect",defaultStates:{0:"None"}},{role:/^time\.(span|interval)$/,indicator:!1,type:e.StateType.Number,write:!0,name:"TRANSITION_TIME",required:!1,defaultRole:"time.span",defaultUnit:"ms"},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.ct},warning:{states:[{role:/^value\.warning$/,indicator:!1,name:"LEVEL",required:!0,defaultRole:"value.warning"},{role:/^weather\.title\.short$/,indicator:!1,type:e.StateType.String,name:"TITLE",required:!1,defaultRole:"weather.title.short"},{role:/^weather\.title$/,indicator:!1,type:e.StateType.String,name:"INFO",required:!1,defaultRole:"weather.title"},{role:/^date\.start$/,indicator:!1,type:e.StateType.String,name:"START",required:!1,defaultRole:"date.start"},{role:/^date\.end$/,indicator:!1,type:e.StateType.String,name:"END",required:!1,defaultRole:"date.end"},{role:/^date$/,indicator:!1,type:e.StateType.String,name:"START",required:!1},{role:/^weather\.chart\.url/,indicator:!1,type:e.StateType.String,name:"ICON",required:!1,defaultRole:"weather.chart.url"},{role:/^weather\.state$/,indicator:!1,type:e.StateType.String,name:"DESC",required:!1,noSubscribe:!0,defaultRole:"weather.state"}],type:e.Types.warning},airCondition:{states:[{role:/temperature(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Number,name:"SET",requiredOneOf:"setpoint",defaultRole:"level.temperature",defaultUnit:"\xB0C",ignoreRole:Se},Z.heating,Z.cooling,{role:/(level\.mode\.)?airconditioner$/,indicator:!1,write:!0,type:[e.StateType.Number,e.StateType.String],searchInParent:!0,name:"MODE",required:!0,defaultRole:"level.mode.airconditioner",defaultStates:{0:"AUTO",3:"COOL",4:"DRY",5:"ECO",6:"FAN_ONLY",7:"HEAT",8:"OFF"},ignoreRole:f},be.airCondition,v.speed,v.speedLevel,v.power,{role:/temperature(\..*)?$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"ACTUAL",required:!1,defaultRole:"value.temperature",defaultUnit:"\xB0C",ignoreRole:f},{role:/humidity(\..*)?$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"HUMIDITY",required:!1,defaultRole:"value.humidity",defaultUnit:"%",ignoreRole:f},{role:/^switch\.boost(\..*)?$/,indicator:!1,write:!0,type:[e.StateType.Boolean,e.StateType.Number],searchInParent:!0,name:"BOOST",required:!1,defaultRole:"switch.boost"},v.swing,v.swingBoolean,v.airflowDirection,x.condition,x.conditionCarbon,x.change,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.rssi,t.battery],type:e.Types.airCondition},airPurifier:{states:[{...v.speed,required:!0},v.power,v.speedLevel,v.swing,v.swingBoolean,v.airflowDirection,{...x.condition,requiredOneOf:"filter"},{...x.conditionCarbon,requiredOneOf:"filter"},x.change,t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.airPurifier},fan:{states:[{...v.speed,required:!0},v.power,v.speedLevel,v.swing,v.swingBoolean,v.airflowDirection,t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.fan},thermostat:{states:[{role:/temperature(\..*)?$/,indicator:!1,write:!0,type:e.StateType.Number,name:"SET",requiredOneOf:"setpoint",defaultRole:"level.temperature",defaultUnit:"\xB0C",ignoreRole:Se},Z.heating,Z.cooling,{role:/temperature(\..*)?$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"ACTUAL",required:!1,defaultRole:"value.temperature",defaultUnit:"\xB0C",ignoreRole:f},{role:/humidity(\..*)?$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"HUMIDITY",required:!1,defaultRole:"value.humidity",defaultUnit:"%",ignoreRole:f},{role:/^switch(\.mode)?\.boost(\..*)?$/,indicator:!1,write:!0,type:[e.StateType.Boolean,e.StateType.Number],searchInParent:!0,name:"BOOST",required:!1,defaultRole:"switch.mode.boost"},{role:/^switch(\.power)?$/,indicator:!1,write:!0,type:[e.StateType.Boolean,e.StateType.Number],searchInParent:!0,name:"POWER",required:!1,defaultRole:"switch.power"},{role:/^switch(\.mode)?\.party$/,indicator:!1,write:!0,type:[e.StateType.Boolean,e.StateType.Number],searchInParent:!0,name:"PARTY",required:!1,defaultRole:"switch.mode.party"},{role:/^level(\.mode)?\.thermostat$/,indicator:!1,write:!0,type:[e.StateType.Number,e.StateType.String],searchInParent:!0,name:"MODE",required:!1,defaultRole:"level.mode.thermostat",defaultStates:{0:"AUTO",1:"MANUAL"}},{role:/^(value|level)\.valve$/,indicator:!1,type:e.StateType.Number,searchInParent:!0,name:"VALVE",required:!1,defaultRole:"value.valve",defaultUnit:"%",ignoreRole:f},be.thermostat,{role:/^(state|sensor)\.window$/,indicator:!1,write:!1,type:e.StateType.Boolean,name:"WINDOW",required:!1,defaultRole:"sensor.window"},...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.thermostat},vacuumCleaner:{states:[{role:/^switch\.power$/,indicator:!1,write:!0,type:[e.StateType.Boolean,e.StateType.Number],searchInParent:!0,name:"POWER",required:!0,defaultRole:"switch.power"},{role:/mode\.cleanup$/,indicator:!1,write:!0,type:[e.StateType.Number,e.StateType.String],searchInParent:!0,name:"MODE",requiredOneOf:"vacuumMode",defaultRole:"level.mode.cleanup",defaultStates:{0:"AUTO",1:"NORMAL",2:"QUIET",3:"ECO",4:"EXPRESS"},ignoreRole:f},{role:/vacuum\.map\.base64$/,indicator:!1,write:!1,type:e.StateType.String,searchInParent:!0,name:"MAP_BASE64",required:!1,defaultRole:"vacuum.map.base64",ignoreRole:f},{role:/vacuum\.map\.url$/,indicator:!1,write:!1,type:e.StateType.String,searchInParent:!0,name:"MAP_URL",required:!1,ignoreRole:f},{role:/mode\.work$/,indicator:!1,write:!0,type:e.StateType.Number,searchInParent:!0,name:"WORK_MODE",required:!1,defaultRole:"level.mode.work",defaultStates:{0:"AUTO",1:"FAST",2:"MEDIUM",3:"SLOW",4:"TURBO"},ignoreRole:f},{role:/^value\.water$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,unit:"%",name:"WATER",required:!1,defaultRole:"value.water",defaultUnit:"%"},{role:/^value\.waste$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,unit:"%",name:"WASTE",required:!1,defaultRole:"value.waste",defaultUnit:"%"},{role:/^value\.battery$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,unit:"%",name:"BATTERY",required:!1,defaultRole:"value.battery",defaultUnit:"%"},{role:/^value\.state$/,indicator:!1,write:!1,type:[e.StateType.Number,e.StateType.String],searchInParent:!0,name:"STATE",required:!1,defaultRole:"value.state"},{role:/^switch\.pause$/,indicator:!1,write:!0,type:e.StateType.Boolean,searchInParent:!0,name:"PAUSE",required:!1,defaultRole:"switch.pause"},{role:/^indicator(\.maintenance)?\.waste$|^indicator(\.alarm)?\.waste/,indicator:!0,type:e.StateType.Boolean,searchInParent:!0,name:"WASTE_ALARM",required:!1,defaultRole:"indicator.maintenance.waste"},{role:/^indicator(\.maintenance)?\.water$|^indicator(\.alarm)?\.water/,indicator:!0,type:e.StateType.Boolean,searchInParent:!0,name:"WATER_ALARM",required:!1,defaultRole:"indicator.maintenance.water"},{role:/^value(\.usage)?\.filter/,indicator:!0,type:e.StateType.Number,searchInParent:!0,name:"FILTER",required:!1,defaultRole:"value.usage.filter",defaultUnit:"%"},{role:/^value(\.usage)?\.brush/,indicator:!0,type:e.StateType.Number,searchInParent:!0,name:"BRUSH",required:!1,defaultRole:"value.usage.brush",defaultUnit:"%"},{role:/^value(\.usage)?\.sensors/,indicator:!0,type:e.StateType.Number,searchInParent:!0,name:"SENSORS",required:!1,defaultRole:"value.usage.sensors",defaultUnit:"%"},{role:/^value(\.usage)?\.brush\.side/,indicator:!0,type:e.StateType.Number,searchInParent:!0,name:"SIDE_BRUSH",required:!1,defaultRole:"value.usage.brush.side",defaultUnit:"%"},{role:/^(button|action)\.home$/,indicator:!1,write:!0,type:e.StateType.Boolean,name:"HOME",required:!1,noSubscribe:!0,defaultRole:"button.home"},{role:/^level\.mode\.vacuum$/,indicator:!1,write:!0,type:e.StateType.Number,name:"RUN_MODE",requiredOneOf:"vacuumMode",defaultRole:"level.mode.vacuum",defaultStates:{0:"IDLE",1:"CLEANING",2:"MAPPING"},ignoreRole:f},{role:/^value\.progress$/,indicator:!1,write:!1,type:e.StateType.Number,name:"PROGRESS",required:!1,defaultRole:"value.progress",defaultUnit:"%"},{role:/^value\.vacuum\.phase$/,indicator:!1,write:!1,type:e.StateType.String,name:"PHASE",required:!1,defaultRole:"value.vacuum.phase"},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.vacuumCleaner},blinds:{states:[{role:/^level(\.blind)?$/,indicator:!1,type:e.StateType.Number,write:!0,enums:y.roleOrEnumBlind,name:"SET",required:!0,defaultRole:"level.blind",defaultUnit:"%"},{role:/^value(\.blind)?$/,indicator:!1,type:e.StateType.Number,enums:y.roleOrEnumBlind,name:"ACTUAL",required:!1,defaultRole:"value.blind",defaultUnit:"%"},{role:/^(button|action)\.stop(\.blind)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"STOP",required:!1,noSubscribe:!0,defaultRole:"button.stop.blind"},{role:/^(button|action)\.open(\.blind)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"OPEN",required:!1,noSubscribe:!0,defaultRole:"button.open.blind"},{role:/^(button|action)\.close(\.blind)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"CLOSE",required:!1,noSubscribe:!0,defaultRole:"button.close.blind"},{role:/^level(\.open)?\.tilt$/,indicator:!1,type:e.StateType.Number,write:!0,enums:y.roleOrEnumBlind,name:"TILT_SET",required:!1,defaultRole:"level.tilt"},{role:/^value(\.open)?\.tilt$/,indicator:!1,type:e.StateType.Number,enums:y.roleOrEnumBlind,name:"TILT_ACTUAL",required:!1,defaultRole:"value.tilt"},{role:/^(button|action)\.stop\.tilt$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"TILT_STOP",required:!1,noSubscribe:!0,defaultRole:"button.stop.tilt"},{role:/^(button|action)\.open\.tilt$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"TILT_OPEN",required:!1,noSubscribe:!0,defaultRole:"button.open.tilt"},{role:/^(button|action)\.close\.tilt$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"TILT_CLOSE",required:!1,noSubscribe:!0,defaultRole:"button.close.tilt"},t.direction,t.direction_enum,t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.blind},blindButtons:{states:[{role:/^(button|action)\.stop(\.blind)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"STOP",required:!0,noSubscribe:!0,defaultRole:"button.stop.blind"},{role:/^(button|action)\.open(\.blind)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"OPEN",required:!0,noSubscribe:!0,defaultRole:"button.open.blind"},{role:/^(button|action)\.close(\.blind)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"CLOSE",required:!0,noSubscribe:!0,defaultRole:"button.close.blind"},{role:/^level\.tilt$/,indicator:!1,type:e.StateType.Number,write:!0,enums:y.roleOrEnumBlind,name:"TILT_SET",required:!1,defaultRole:"level.tilt"},{role:/^value\.tilt$/,indicator:!1,type:e.StateType.Number,enums:y.roleOrEnumBlind,name:"TILT_ACTUAL",required:!1,defaultRole:"value.tilt"},{role:/^(button|action)\.stop\.tilt$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"TILT_STOP",required:!1,noSubscribe:!0,defaultRole:"button.stop.tilt"},{role:/^(button|action)\.open\.tilt$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"TILT_OPEN",required:!1,noSubscribe:!0,defaultRole:"button.open.tilt"},{role:/^(button|action)\.close\.tilt$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumBlind,name:"TILT_CLOSE",required:!1,noSubscribe:!0,defaultRole:"button.close.tilt"},t.direction,t.direction_enum,t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.blindButtons},gate:{states:[{role:/^switch(\.gate)?$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumGate,name:"SET",required:!0,defaultRole:"switch.gate"},{role:/^value(\.(position|gate))?$/,indicator:!1,type:e.StateType.Number,enums:y.roleOrEnumGate,name:"ACTUAL",required:!1,defaultRole:"value.blind",defaultUnit:"%",ignoreRole:f},{role:/^(button|action)\.stop$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumGate,name:"STOP",required:!1,noSubscribe:!0,defaultRole:"button.stop"},{role:/^indicator\.opened$/,indicator:!0,type:e.StateType.Boolean,name:"OPENED",required:!1,defaultRole:"indicator.opened"},{role:/^indicator\.closed$/,indicator:!0,type:e.StateType.Boolean,name:"CLOSED",required:!1,defaultRole:"indicator.closed"},t.direction,t.direction_enum,t.working,t.unreach,t.maintain,t.error,t.rssi],type:e.Types.gate},weatherCurrent:{states:[{role:/^value(\.temperature)?$/,indicator:!1,type:e.StateType.Number,name:"ACTUAL",required:!0,defaultRole:"value.temperature",defaultUnit:"\xB0C"},{role:/^weather\.icon$/,indicator:!1,name:"ICON",required:!0,defaultRole:"weather.icon"},{role:/^value\.precipitation\.chance$/,indicator:!1,type:e.StateType.Number,name:"PRECIPITATION_CHANCE",defaultRole:"value.precipitation.chance",defaultUnit:"%"},{role:/^value\.precipitation\.type$/,indicator:!1,type:e.StateType.Number,name:"PRECIPITATION_TYPE",defaultRole:"value.precipitation.type",defaultStates:{0:"NO",1:"RAIN",2:"SNOW",3:"HAIL"}},{role:/^value\.pressure$/,indicator:!1,type:e.StateType.Number,name:"PRESSURE",defaultRole:"value.pressure",defaultUnit:"mbar"},{role:/^value\.pressure\.tendency$/,indicator:!1,type:e.StateType.String,name:"PRESSURE_TENDENCY",defaultRole:"value.pressure.tendency"},{role:/^value\.temperature\.windchill$/,indicator:!1,type:e.StateType.Number,name:"REAL_FEEL_TEMPERATURE",defaultRole:"value.temperature.windchill",defaultUnit:"\xB0C"},{role:/^value\.humidity$/,indicator:!1,type:e.StateType.Number,name:"HUMIDITY",defaultRole:"value.humidity",defaultUnit:"%"},{role:/^value\.uv$/,indicator:!1,type:e.StateType.Number,name:"UV",defaultRole:"value.uv"},{role:/^weather\.state$/,indicator:!1,type:e.StateType.String,name:"WEATHER",defaultRole:"weather.state"},{role:/^value\.direction\.wind$/,indicator:!1,type:e.StateType.String,name:"WIND_DIRECTION",defaultRole:"value.direction.wind",defaultUnit:"\xB0"},{role:/^value\.speed\.wind\.gust$/,indicator:!1,type:e.StateType.Number,name:"WIND_GUST",defaultRole:"value.speed.wind.gust",defaultUnit:"km/h"},{role:/^value\.speed\.wind$/,indicator:!1,type:e.StateType.Number,name:"WIND_SPEED",defaultRole:"value.speed.wind",defaultUnit:"km/h"},t.lowbat,t.unreach,t.maintain,t.error,t.battery],type:e.Types.weatherCurrent},camera:{states:[{role:/^link\.camera(\.\w+)?$/,indicator:!1,type:e.StateType.String,name:"URL",required:!0,defaultRole:"link.camera"},{role:/^switch(\.camera)?\.autofocus$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"AUTOFOCUS",required:!1,defaultRole:"switch.camera.autofocus"},{role:/^switch(\.camera)?\.autowhitebalance$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"AUTOWHITEBALANCE",required:!1,defaultRole:"switch.camera.autowhitebalance"},{role:/^switch(\.camera)?\.brightness$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"BRIGHTNESS",required:!1,defaultRole:"switch.camera.brightness"},{role:/^switch(\.camera)?\.nightmode$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"NIGHTMODE",required:!1,defaultRole:"switch.camera.nightmode"},{role:/^level(\.camera)?\.position$|^level(\.camera)?(\.ptz)$/,indicator:!1,type:e.StateType.Number,write:!0,name:"PTZ",required:!1,defaultRole:"level.camera.position"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.camera,enumRequired:!1},lock:{states:[{role:/^switch\.lock$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"SET",required:!0,defaultRole:"switch.lock"},{role:/^state$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ACTUAL",required:!1,defaultRole:"state"},{indicator:!1,type:e.StateType.Boolean,write:!0,read:!1,name:"OPEN",required:!1,noSubscribe:!0,defaultRole:"button",ignoreRole:f},{role:/^(state|sensor)(\.door)?$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"DOOR_STATE",required:!1,defaultRole:"sensor.door",ignoreRole:f},t.direction,t.direction_enum,t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.lock},motion:{states:[{role:/^(state\.)?motion$|^sensor\.motion$/,indicator:!1,type:e.StateType.Boolean,name:"ACTUAL",required:!0,defaultRole:"sensor.motion",ignoreRole:f},{role:/brightness$/,indicator:!1,type:e.StateType.Number,name:"SECOND",required:!1,defaultRole:"value.brightness",defaultUnit:"lux",ignoreRole:f},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.motion},contact:{states:[{role:/^sensor\.contact$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ACTUAL",required:!0,defaultRole:"sensor.contact",defaultChannelRole:"sensor.contact"},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.contact,enumRequired:!1},window:{states:[{role:/^(state|sensor)(\.window)?/,indicator:!1,type:e.StateType.Boolean,enums:y.roleOrEnumWindow,write:!1,name:"ACTUAL",required:!0,defaultRole:"sensor.window",ignoreRole:f},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.window},windowTilt:{states:[{role:/^state$|^value(\.window)?$/,indicator:!1,type:e.StateType.Number,write:!1,enums:y.roleOrEnumWindow,name:"ACTUAL",required:!0,defaultRole:"value.window"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.windowTilt},fireAlarm:{states:[{role:/^(state|sensor|indicator)(\.alarm)?\.fire$/,indicator:!1,type:e.StateType.Boolean,name:"ACTUAL",required:!0,defaultRole:"sensor.alarm.fire",defaultChannelRole:"sensor.alarm.fire"},{role:/^(state|sensor)(\.alarm)?\.co$/,indicator:!1,type:e.StateType.Boolean,name:"CO",required:!1,defaultRole:"sensor.alarm.co"},Y.severity,Y.muted,Y.test,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.fireAlarm,enumRequired:!1},coAlarm:{states:[{role:/^(state|sensor)(\.alarm)?\.co$/,indicator:!1,type:e.StateType.Boolean,name:"ACTUAL",required:!0,defaultRole:"sensor.alarm.co",defaultChannelRole:"sensor.alarm.co"},Y.severity,Y.muted,Y.test,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.coAlarm,enumRequired:!1},floodAlarm:{states:[{role:/^(state|sensor|indicator)(\.alarm)?\.flood$/,indicator:!1,type:e.StateType.Boolean,name:"ACTUAL",required:!0,defaultRole:"sensor.alarm.flood",defaultChannelRole:"sensor.alarm.flood"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.floodAlarm},door:{states:[{role:/^(state|sensor)(\.door)?/,indicator:!1,type:e.StateType.Boolean,write:!1,enums:y.roleOrEnumDoor,name:"ACTUAL",required:!0,defaultRole:"sensor.door"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.door},dimmer:{states:[{role:/^level(\.dimmer)?$|^level\.brightness$/,indicator:!1,type:e.StateType.Number,write:!0,enums:y.roleOrEnumLight,name:"SET",required:!0,defaultRole:"level.dimmer",ignoreRole:/^level\.dimspeed$/,defaultUnit:"%"},{role:/^value(\.dimmer)?$/,indicator:!1,type:e.StateType.Number,write:!1,enums:y.roleOrEnumLight,name:"ACTUAL",required:!1,defaultRole:"value.dimmer",defaultUnit:"%"},{role:/^switch(\.light)?$|^state$/,indicator:!1,type:e.StateType.Boolean,write:!0,enums:y.roleOrEnumLight,name:"ON_SET",required:!1,defaultRole:"switch.light"},{role:/^level\.effect$/,indicator:!1,type:[e.StateType.Number,e.StateType.String],write:!0,statesDefined:!0,name:"EFFECT",required:!1,defaultRole:"level.effect",defaultStates:{0:"None"}},{role:/^(state|switch|sensor)\.light$|^switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,enums:y.roleOrEnumLight,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light",ignoreRole:f},{role:/^time\.(span|interval)$/,indicator:!1,type:e.StateType.Number,write:!0,enums:y.roleOrEnumLight,name:"TRANSITION_TIME",required:!1,defaultRole:"time.span",defaultUnit:"ms"},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.dimmer},light:{states:[{role:/^switch(\.light)?$|^state$/,enums:y.roleOrEnumLight,indicator:!1,type:e.StateType.Boolean,write:!0,name:"SET",required:!0,defaultRole:"switch.light"},{role:/^(state|switch|sensor)\.light$|^switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,enums:y.roleOrEnumLight,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.light",ignoreRole:f},{role:/^level\.effect$/,indicator:!1,type:[e.StateType.Number,e.StateType.String],write:!0,statesDefined:!0,name:"EFFECT",required:!1,defaultRole:"level.effect",defaultStates:{0:"None"}},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.light},volume:{states:[{role:/^level\.volume$/,indicator:!1,type:e.StateType.Number,min:e.StateType.Number,max:e.StateType.Number,write:!0,name:"SET",required:!0,defaultRole:"level.volume",defaultUnit:"%"},{role:/^value\.volume$/,indicator:!1,type:e.StateType.Number,min:e.StateType.Number,max:e.StateType.Number,write:!1,name:"ACTUAL",required:!1,defaultRole:"value.volume",defaultUnit:"%"},{role:/^media\.mute$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"MUTE",required:!1,defaultRole:"media.mute"},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.volume},locationOne:{states:[{role:/^value\.gps$/,indicator:!1,type:e.StateType.String,write:!1,name:"GPS",required:!0,defaultRole:"value.gps"},{role:/^value\.gps\.elevation$/,indicator:!1,type:e.StateType.Number,write:!1,name:"ELEVATION",required:!1,defaultRole:"value.gps.elevation"},{role:/^value(\.gps)?\.radius$/,indicator:!1,type:e.StateType.Number,write:!1,name:"RADIUS",required:!1,defaultRole:"value.gps.radius"},{role:/^value(\.gps)?\.accuracy$/,indicator:!1,type:e.StateType.Number,write:!1,name:"ACCURACY",required:!1,defaultRole:"value.gps.accuracy"},t.unreach,t.lowbat,t.maintain,t.error,t.battery],type:e.Types.locationOne},location:{states:[{role:/^value(\.gps)?\.longitude$/,indicator:!1,type:e.StateType.Number,write:!1,name:"LONGITUDE",required:!0,defaultRole:"value.gps.longitude",defaultUnit:"\xB0"},{role:/^value(\.gps)?\.latitude$/,indicator:!1,type:e.StateType.Number,write:!1,name:"LATITUDE",required:!0,defaultRole:"value.gps.latitude",defaultUnit:"\xB0"},{role:/^value(\.gps)?\.elevation$/,indicator:!1,type:e.StateType.Number,write:!1,name:"ELEVATION",required:!1,defaultRole:"value.gps.elevation"},{role:/^value(\.gps)?\.radius$/,indicator:!1,type:e.StateType.Number,write:!1,name:"RADIUS",required:!1,defaultRole:"value.gps.radius"},{role:/^value(\.gps)?\.accuracy$/,indicator:!1,type:e.StateType.Number,write:!1,name:"ACCURACY",required:!1,defaultRole:"value.gps.accuracy"},t.unreach,t.lowbat,t.maintain,t.error,t.battery],type:e.Types.location},volumeGroup:{states:[{role:/^level\.volume\.group?$/,indicator:!1,type:e.StateType.Number,min:e.StateType.Number,max:e.StateType.Number,write:!0,name:"SET",required:!0,defaultRole:"level.volume.group",defaultUnit:"%"},{role:/^value\.volume\.group$/,indicator:!1,type:e.StateType.Number,min:e.StateType.Number,max:e.StateType.Number,write:!1,name:"ACTUAL",required:!1,defaultRole:"value.volume.group",defaultUnit:"%"},{role:/^media\.mute\.group$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"MUTE",required:!1,defaultRole:"media.mute.group"},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.volumeGroup},pump:{states:[{role:/^switch\.pump$/,indicator:!1,write:!0,type:[e.StateType.Boolean,e.StateType.Number],name:"POWER",required:!0,defaultRole:"switch.pump"},{role:/^level\.pump$/,indicator:!1,write:!0,type:e.StateType.Number,name:"LEVEL",required:!1,defaultRole:"level.pump",defaultUnit:"%",ignoreRole:f},{role:/temperature(\..*)?$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"TEMPERATURE",required:!1,defaultRole:"value.temperature",defaultUnit:"\xB0C",ignoreRole:f},{role:/^value\.pressure$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"PRESSURE",required:!1,defaultRole:"value.pressure",defaultUnit:"mbar"},{role:/^value\.flow$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"FLOW",required:!1,defaultRole:"value.flow",defaultUnit:"m\xB3/h"},...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.pump},percentage:{states:[{role:/^level(\..*)?$/,indicator:!1,type:e.StateType.Number,write:!0,unit:"%",name:"SET",required:!0,defaultRole:"level",defaultUnit:"%",ignoreRole:f},{role:/^value(\..*)?$/,indicator:!1,type:e.StateType.Number,write:!1,name:"ACTUAL",required:!1,defaultRole:"value",defaultUnit:"%",ignoreRole:f},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.percentage},levelSlider:{states:[{role:/^level(\..*)?$/,indicator:!1,type:e.StateType.Number,min:e.StateType.Number,max:e.StateType.Number,write:!0,name:"SET",required:!0,defaultRole:"level",defaultUnit:"%",ignoreRole:f},{role:/^switch(\.active)?$/,indicator:!1,write:!0,type:e.StateType.Boolean,name:"ON",required:!1,defaultRole:"switch"},{role:/^state\.active$|^sensor\.switch$/,indicator:!1,write:!1,type:e.StateType.Boolean,name:"ON_ACTUAL",required:!1,defaultRole:"sensor.switch"},{role:/^value(\..*)?$/,indicator:!1,type:e.StateType.Number,min:e.StateType.Number,max:e.StateType.Number,write:!1,name:"ACTUAL",required:!1,defaultRole:"value",defaultUnit:"%",ignoreRole:f},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.slider},socket:{states:[{role:/^switch(\.active)?$|^state$/,indicator:!1,type:e.StateType.Boolean,write:!0,name:"SET",required:!0,defaultRole:"switch"},{role:/^state\.active$|^sensor\.switch$/,indicator:!1,type:e.StateType.Boolean,write:!1,name:"ACTUAL",required:!1,defaultRole:"sensor.switch"},t.onTime,...Object.values($),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.rssi],type:e.Types.socket},button:{states:[{role:/^(button|action)(\.[.\w]+)?$/,indicator:!1,type:e.StateType.Boolean,read:!1,write:!0,name:"SET",required:!0,noSubscribe:!0,defaultRole:"button"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.button},buttonSensor:{states:[{role:/^button(\.[.\w]+)?$/,indicator:!1,type:e.StateType.Boolean,read:!0,write:!1,name:"PRESS",required:!0,defaultRole:"button.press"},{role:/^button\.long/,indicator:!1,type:e.StateType.Boolean,read:!0,write:!1,name:"PRESS_LONG",required:!1,defaultRole:"button.long"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.buttonSensor},airQuality:{states:[{role:/^value\.airquality$/,indicator:!1,write:!1,type:e.StateType.Number,name:"AQI",required:!0,defaultRole:"value.airquality",defaultStates:{0:"UNKNOWN",1:"GOOD",2:"FAIR",3:"MODERATE",4:"POOR",5:"VERY_POOR",6:"EXTREMELY_POOR"}},{role:/^switch(\.power)?$/,indicator:!1,write:!0,type:e.StateType.Boolean,searchInParent:!0,name:"POWER",required:!1,defaultRole:"switch.power"},...A("CO2","co2","ppm"),...A("TVOC","tvoc"),...A("PM1","pm1","\xB5g/m\xB3"),...A("PM25","pm25","\xB5g/m\xB3"),...A("PM10","pm10","\xB5g/m\xB3"),...A("CO","co","ppm"),...A("NO2","no2"),...A("O3","o3"),...A("CH2O","ch2o","\xB5g/m\xB3"),...A("RN","rn","Bq/m\xB3"),...A("SO2","so2"),{role:/^value\.pressure$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"PRESSURE",required:!1,defaultRole:"value.pressure",defaultUnit:"mbar"},{role:/temperature(\..*)?$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"ACTUAL",required:!1,defaultRole:"value.temperature",defaultUnit:"\xB0C",ignoreRole:f},{role:/humidity(\..*)?$/,indicator:!1,write:!1,type:e.StateType.Number,searchInParent:!0,name:"HUMIDITY",required:!1,defaultRole:"value.humidity",defaultUnit:"%",ignoreRole:f},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.airQuality},temperature:{states:[{role:/\.temperature$/,indicator:!1,write:!1,type:e.StateType.Number,name:"ACTUAL",required:!0,defaultRole:"value.temperature",defaultUnit:"\xB0C"},{role:/\.humidity$/,indicator:!1,write:!1,type:e.StateType.Number,name:"SECOND",required:!1,defaultRole:"value.humidity",defaultUnit:"%"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.temperature},humidity:{states:[{role:/\.humidity$/,indicator:!1,write:!1,type:e.StateType.Number,name:"ACTUAL",required:!0,defaultRole:"value.humidity",defaultUnit:"%"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.humidity},illuminance:{states:[{role:/\.brightness$/,indicator:!1,write:!1,type:e.StateType.Number,name:"ACTUAL",required:!0,defaultRole:"value.brightness",defaultUnit:"lux"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.illuminance},pressure:{states:[{role:/^value\.pressure$/,indicator:!1,write:!1,type:e.StateType.Number,name:"PRESSURE",required:!0,defaultRole:"value.pressure",defaultUnit:"mbar"},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.pressure},flow:{states:[{role:/^value\.flow$/,indicator:!1,write:!1,type:e.StateType.Number,name:"FLOW",required:!0,defaultRole:"value.flow",defaultUnit:"m\xB3/h"},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.flow},fillLevel:{states:[{role:/^value\.fill(\.[-.\w]+)?$/,indicator:!1,write:!1,type:e.StateType.Number,name:"ACTUAL",required:!0,defaultRole:"value.fill",defaultUnit:"%"},t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.fillLevel},image:{states:[{role:/\.icon$|^icon$|^icon\.|\.icon\.|\.chart\.url\.|\.chart\.url$|^url.icon$/,indicator:!1,write:!1,type:e.StateType.String,name:"URL",defaultRole:"icon",required:!0,ignoreRole:f},t.unreach,t.lowbat,t.maintain,t.error,t.battery],type:e.Types.image},electricity:{states:[...Object.values($).map(a=>({...a,requiredOneOf:"electricity"})),t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.electricity},info:{states:[{indicator:!1,name:"ACTUAL",required:!0,multiple:!0,noDeviceDetection:!0,ignoreRole:/\.inhibit$/,defaultRole:"state"},t.working,t.unreach,t.lowbat,t.maintain,t.error,t.battery,t.rssi],type:e.Types.info}}});var he=K(re=>{"use strict";Object.defineProperty(re,"__esModule",{value:!0});re.ChannelDetector=void 0;var P=X(),L=z(),B=we(),te=class a{constructor(){this.enums=null,this.cache={}}_applyPattern(r,l,i,n,u){var o,c;if(!((o=r[l])===null||o===void 0)&&o.common){let d=null;if(i.role&&(d=i.role.test(r[l].common.role||""),d&&i.channelRole)){let T=(0,L.getParentId)(l),w=((c=r[T])===null||c===void 0?void 0:c.common.role)||"";w&&(r[T].type==="channel"||r[T].type==="device")?d=i.channelRole.test(w):d=!1}if(d===!1)return!1;if(i.type){if(typeof i.type=="string"){if(i.type!==r[l].common.type)return!1}else if(Array.isArray(i.type)){let T=!1;for(let w=0;w<i.type.length;w++)if(i.type[w]===r[l].common.type){T=!0;break}if(!T)return!1}}if(i.objectType&&r[l].type!==i.objectType||i.stateName&&!i.stateName.test(l)||i.unit&&i.unit!==r[l].common.unit)return!1;if(i.ignoreRole){let T=r[l].common.role||"";if(T&&i.ignoreRole.test(T))return!1}if(i.indicator===!1&&(r[l].common.role||"").match(/^indicator(\.[.\w]+)?$/))return!1;if(i.state){let T=l.split(".").pop()||"";if(T&&!i.state.test(T))return!1}let R=i.defaultRole&&r[l].common.role===i.defaultRole,m=i.defaultUnit?r[l].common.unit===i.defaultUnit:!1;if(i.min===P.StateType.Number&&typeof r[l].common.min!==P.StateType.Number&&(!m||r[l].common.unit!=="%")||i.max===P.StateType.Number&&typeof r[l].common.max!==P.StateType.Number&&(!m||r[l].common.unit!=="%")||i.statesDefined===!0&&typeof r[l].common.states!="object")return!1;if(!R){if(i.write!==void 0&&i.write!==!!r[l].common.write||i.read!==void 0&&i.read!==(r[l].common.read===void 0?!0:r[l].common.read))return!1;if(typeof i.enums=="function"){let T=this._getEnumsForId(r,l,u);if(!n&&!i.enums(r[l],T||[]))return!1}}return!0}return!1}_getEnumsForId(r,l,i){var n;this.enums||(this.enums=(0,L.getFunctionEnums)(r,i));let u=[];if(this.enums.forEach(o=>{r[o].common.members.includes(l)&&u.push(o)}),!u.length&&((n=r[l])===null||n===void 0?void 0:n.type)==="state"){let o=(0,L.getParentId)(l);r[o]&&(r[o].type==="channel"||r[o].type==="device")&&this.enums.forEach(c=>{r[c].common.members.includes(o)&&u.push(c)})}return u.length?u:null}static copyState(r,l){let i=l||JSON.parse(JSON.stringify(r));return i.original=r.original||r,"enums"in r&&r.enums&&(i.enums=r.enums),"role"in r&&r.role&&(i.role=r.role),"channelRole"in r&&r.channelRole&&(i.channelRole=r.channelRole),i}_testOneState(r){var l,i,n,u,o,c;let d=r.objects,R=r.pattern,m=r.state,T=r.channelStates,w=r.usedIds,E=r.usedInCurrentDevice,U=r.ignoreIndicators,W=r.ignoreEnums,V=r.sortedKeys,p=r.result,D=!1;for(let h of T)if(!(m.name==="COVER"&&(p!=null&&p.states.find(C=>C.id&&C.name==="COVER")))){if(m.indicator&&U){let s=h.split(".").pop()||"";if(s&&U.includes(s))continue}if(!m.indicator){if(E.includes(h))continue;if(!m.notSingle){if(!r.detectAllPossibleDevices){if(w.includes(h))continue}}}if(this._applyPattern(d,h,m,W,V)){p||(p=JSON.parse(JSON.stringify(B.patterns[R])),r.result=p,p==null||p.states.forEach((s,q)=>a.copyState(B.patterns[R].states[q],s)));let C=!1;if(p.states.find(({id:s})=>s===h))C=!0;else for(let s of p.states)if(s.name===m.name&&a.stateTypeMatches(s,d[h])){if(s.id){let S;r.favorId&&(h===r.favorId?S=!0:s.id===r.favorId&&(S=!1));let _=(n=(i=(l=d[s.id])===null||l===void 0?void 0:l.common)===null||i===void 0?void 0:i.role)!==null&&n!==void 0?n:"",F=(c=(o=(u=d[h])===null||u===void 0?void 0:u.common)===null||o===void 0?void 0:o.role)!==null&&c!==void 0?c:"",G=s.defaultRole;if(G&&S===void 0&&(F===G?S=!0:_===G&&(S=!1)),S===void 0){let b=F.split("."),I=b.length,N=_.split("."),M=N.length;F===""||b[0]==="state"&&N[0]!=="state"?S=!1:b[0]!=="state"&&N[0]==="state"||I>M?S=!0:I<M?S=!1:S=b[0]!=="state"}if(!S)break}let q=s.id;if(s.id=h,C=!0,q&&!m.indicator){for(let S=E.length-1;S>=0;S--)E[S]===q&&E.splice(S,1);r.rejectedInCurrentDevice.push(q)}break}if(!C)D&&!m.indicator&&r.rejectedInCurrentDevice.push(h);else if(D=!0,m.indicator||E.push(h),m.multiple&&T.length>1){for(let s of T)if(s!==h&&(m.indicator||!E.includes(s)&&!r.rejectedInCurrentDevice.includes(s)&&(m.notSingle||!w.includes(s)))&&this._applyPattern(d,s,m,W,V))if(m.indicator||E.push(s),Array.isArray(m)){let q=a.copyState(m[0]);q.id=s,p.states.push(q)}else{let q=a.copyState(m);q.id=s,p.states.push(q)}}}}return D}static findParentChannelOrDevice(r,l,i){if(!r[l])return;let n=l.split("."),u=l;if(r[l].type==="state"&&(n.pop(),l=n.join(".")),n.length<=2)return l;let o=r[l];if((o==null?void 0:o.type)==="device"||i&&(o==null?void 0:o.type)==="channel")return l;if(i)return;n.pop();let c=n.join("."),d=r[c];if(!d)return o?l:u;if(d.type==="device"||n.length<=2)return c;if((o==null?void 0:o.type)==="channel")return l;n.pop();let R=n.join("."),m=r[R];return!m||m.type!=="device"&&m.type!=="channel"?c:R}static getChannelOrDeviceStates(r,l,i,n=!1,u=!1){var o;let c=(o=r[l])===null||o===void 0?void 0:o.type;switch(c){case void 0:return[...(0,L.getObjectsBelowId)(i,l)];case"state":case"channel":case"device":case"folder":if(n&&c!=="device"){let d=a.findParentChannelOrDevice(r,l);return d&&d!==l?[...(0,L.getObjectsBelowId)(i,d)]:[l]}if(c!=="state")return[...(0,L.getObjectsBelowId)(i,l)];if(u){let d=a.findParentChannelOrDevice(r,l,!0);return d&&d!==l?[...(0,L.getObjectsBelowId)(i,d)]:[l]}return[l];default:return[l]}}static patternIsAllowed(r,l,i){if(!r)return!1;if(Array.isArray(r.type)){for(let n=0;n<r.type.length;n++)if(l&&!l.includes(r.type[n])||i&&i.includes(r.type[n]))return!1;return!0}return l&&!l.includes(r.type)?!1:!i||!i.includes(r.type)}static stateTypeMatches(r,l){var i;if(!r.type)return!0;let n=(i=l==null?void 0:l.common)===null||i===void 0?void 0:i.type;return n?Array.isArray(r.type)?r.type.includes(n):r.type===n:!0}static allRequiredStatesFound(r){if(!r.result)return!1;let l=r.result.states,i=new Map;for(let n=0;n<l.length;n++){let u=l[n].requiredOneOf;if(u)i.set(u,i.get(u)||!!l[n].id);else if(l[n].required&&!l[n].id)return!1}for(let n of i.values())if(!n)return!1;return!0}static cleanState(r,l){var i,n;let u=((n=(i=l[r.id])===null||i===void 0?void 0:i.common)===null||n===void 0?void 0:n.role)||"";if(r.name.includes("%d")&&r.role&&r.id&&u){let o=r.role.exec(u);o&&(r.name=r.name.replace("%d",o[1]))}r.role&&delete r.role,r.enums&&delete r.enums,r.original&&delete r.original}sortTypes(r,l){return l.forEach(([i,n])=>{let u=r.indexOf(i),o=r.indexOf(n);if(u===-1||o===-1)return;let c=r.splice(u,1);r.splice(o,0,...c)}),r}_detectNext(r){var l,i,n,u,o,c;let{objects:d,id:R,_usedIdsOptional:m=[],ignoreIndicators:T,prioritizedTypes:w,detectParent:E,detectOnlyChannel:U,allowedTypes:W,excludedTypes:V,_keysOptional:p,detectAllPossibleDevices:D}=r,{_patternList:h}=r;r._usedIdsOptional=m;let C=a.getChannelOrDeviceStates(d,R,p||[],E,U);if(!(!((l=d[R])===null||l===void 0)&&l.common)&&!C.length)return null;if((i=r._checkedPatterns)!==null&&i!==void 0||(r._checkedPatterns=[]),!h){let S=Object.keys(B.patterns).filter(_=>a.patternIsAllowed(B.patterns[_],W,V));h=w?this.sortTypes(S,w):S,r._patternList=h}let s={objects:d,channelStates:C,usedIds:m,ignoreIndicators:T||[],pattern:"unknown",usedInCurrentDevice:[],rejectedInCurrentDevice:[],state:{},ignoreEnums:!!r.ignoreEnums,sortedKeys:p,favorId:r.detectParent?void 0:R,detectAllPossibleDevices:D},q=(n=d[R])===null||n===void 0?void 0:n.type;for(let S of h){if(r._checkedPatterns.includes(S))continue;r._checkedPatterns.push(S),delete s.result,s.pattern=S,s.usedInCurrentDevice=[],s.rejectedInCurrentDevice=[];let _=new Map;for(let b of B.patterns[S].states)b.requiredOneOf&&_.set(b.requiredOneOf,((u=_.get(b.requiredOneOf))!==null&&u!==void 0?u:0)+1);let F=new Set;for(let b of B.patterns[S].states){let I=!1;s.state=b,this._testOneState(s)&&(I=!0);let N=b.requiredOneOf;if(N){I&&F.add(N);let M=((o=_.get(N))!==null&&o!==void 0?o:0)-1;if(_.set(N,M),M<=0&&!F.has(N)){delete s.result;break}}else if(b.required&&!I){delete s.result;break}}if(!a.allRequiredStatesFound(s))continue;s.usedInCurrentDevice.forEach(b=>m.push(b)),s.rejectedInCurrentDevice.forEach(b=>!m.includes(b)&&m.push(b));let G;if(q!=="device"){let b=(c=a.findParentChannelOrDevice(d,R))!==null&&c!==void 0?c:R;if(d[b]&&(d[b].type==="channel"||d[b].type==="device")){G=(0,L.getObjectsBelowId)(p,b);for(let I of G)s.result.states.forEach((N,M)=>{!N.id&&(N.indicator||N.searchInParent)&&!N.noDeviceDetection&&this._applyPattern(d,I,N.original,!!r.ignoreEnums,s.sortedKeys)&&s.result&&(s.result.states[M].id=I)})}}if(s.result.states.forEach(b=>a.cleanState(b,s.objects)),r.limitTypesToOneOf){for(let b of r.limitTypesToOneOf)if(b.includes(S))for(let I of b)I===S||r._checkedPatterns.includes(I)||r._checkedPatterns.push(I)}return s.result}return null}detect(r){var l;let{objects:i,id:n,ignoreCache:u,detectAllPossibleDevices:o}=r,{_keysOptional:c,_usedIdsOptional:d}=r;if(!u&&this.cache[n]){let{allowedTypes:T=[],excludedTypes:w=[]}=r;if(!T.length&&!w.length)return this.cache[n];let E=this.cache[n].filter(({type:U})=>T.includes(U)&&!w.includes(U));if(E.length)return E}c?r._keysOptionalSorted||c.sort():(c=Object.keys(i),c.sort(),r._keysOptional=c),d&&!r.detectParent&&(d=[],r._usedIdsOptional=d),r.ignoreEnums===void 0&&((l=r.allowedTypes)===null||l===void 0?void 0:l.length)===1&&(r.ignoreEnums=!0),o&&(r.excludedTypes||(r.excludedTypes=[]),r.excludedTypes.includes(P.Types.info)||r.excludedTypes.push(P.Types.info)),r._checkedPatterns=[];let R=[],m;for(;m=this._detectNext(r);)R.push(m),r.detectAllPossibleDevices&&(r._usedIdsOptional=[]);return R.sort((T,w)=>{if(T.type===P.Types.info&&w.type!==P.Types.info)return 1;if(w.type===P.Types.info&&T.type!==P.Types.info)return-1;let E=T.states.find(p=>p.id===n&&(p.required||p.requiredOneOf))?1:0,U=w.states.find(p=>p.id===n&&(p.required||p.requiredOneOf))?1:0;if(E!==U)return U-E;if(!E){let p=T.states.find(h=>h.id===n)?1:0,D=w.states.find(h=>h.id===n)?1:0;if(p!==D)return D-p}let W=T.states.filter(p=>p.id).length;return w.states.filter(p=>p.id).length-W}),this.cache[n]=R.length?R:null,this.cache[n]}static getPatterns(){let r={};return Object.keys(B.patterns).forEach(l=>{let i=JSON.parse(JSON.stringify(B.patterns[l]));i.states.forEach((n,u)=>{let o=B.patterns[l].states[u];o.role&&(i.states[u].role=o.role.toString()),o.enums&&(i.states[u].enums=!0)}),r[l]=i}),r}};re.ChannelDetector=te;te.getEnums=L.getEnums});var ve=K(g=>{"use strict";Object.defineProperty(g,"__esModule",{value:!0});g.StateType=g.Types=g.roleOrEnumGate=g.roleOrEnumDoor=g.roleOrEnumWindow=g.roleOrEnumBlind=g.roleOrEnumLight=void 0;var Ge=he(),Q=z();Object.defineProperty(g,"roleOrEnumLight",{enumerable:!0,get:function(){return Q.roleOrEnumLight}});Object.defineProperty(g,"roleOrEnumBlind",{enumerable:!0,get:function(){return Q.roleOrEnumBlind}});Object.defineProperty(g,"roleOrEnumWindow",{enumerable:!0,get:function(){return Q.roleOrEnumWindow}});Object.defineProperty(g,"roleOrEnumDoor",{enumerable:!0,get:function(){return Q.roleOrEnumDoor}});Object.defineProperty(g,"roleOrEnumGate",{enumerable:!0,get:function(){return Q.roleOrEnumGate}});g.default=Ge.ChannelDetector;var Re=X();Object.defineProperty(g,"Types",{enumerable:!0,get:function(){return Re.Types}});Object.defineProperty(g,"StateType",{enumerable:!0,get:function(){return Re.StateType}})});var k=Ae(ve());var ge={name:"@iobroker/type-detector",version:"6.0.1",description:"Detects devices in ioBroker for Material, Google home, Homekit, ...",author:{name:"bluefox",email:"dogafox@gmail.com"},publishConfig:{access:"public"},homepage:"https://github.com/ioBroker/ioBroker.type-detector",keywords:["ioBroker","types","devices"],repository:{type:"git",url:"git+https://github.com/ioBroker/ioBroker.type-detector.git"},dependencies:{},devDependencies:{"@alcalzone/release-script":"^5.2.1","@alcalzone/release-script-plugin-license":"^5.2.0","@iobroker/types":"^7.2.2","@iobroker/eslint-config":"^2.3.4",mocha:"^11.7.6",typescript:"~6.0.3"},bugs:{url:"https://github.com/ioBroker/ioBroker.type-detector/issues"},main:"build/index.js",files:["LICENSE","build/"],scripts:{test:"mocha --exit","test:integration":"mocha --exit","test:package":`node -e "console.log('Not applicable')"`,lint:"eslint -c eslint.config.mjs",watch:"mocha --watch","build:ts":"tsc -p tsconfig.build.json","build:doc":"node lib/createMd",build:"npm run build:ts && npm run build:doc",release:"release-script --noPush -y",npm:"npm i -f && cd src-test-gui && npm i -f"},license:"MIT",readmeFilename:"README.md"};window.AWDetector={ChannelDetector:k.default,patterns:k.default.getPatterns(),Types:k.Types,StateType:k.StateType,version:ge.version};})();