iobroker.satellite-display 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 sadam6752-tech <sadam6752@gmail.com>
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 sadam6752-tech <sadam6752@gmail.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -41,11 +41,12 @@ to 8 tiles. Swipe left from the clock to reach them; a page without tiles is ski
41
41
  | --- | --- | --- | --- |
42
42
  | Value | name, number with unit, or a text | all | – |
43
43
  | Gauge | name, arc from the scale start to its end, number | square, large | – |
44
- | Value with bar | name, number, bar along the scale | square, wide, large | – |
45
- | Value with chart | name, number, line of the last 60 values | wide, large | – |
44
+ | Value with bar | name, number, bar along the scale | all | – |
45
+ | Value with chart | name, number, line of the last 60 values | small, wide, large | – |
46
46
  | Switch | name, toggle; the tile lights up when on | small, square, wide | toggles the state |
47
47
  | Dimmer | name, toggle, slider, percent | wide, large | toggle and slider write the states |
48
48
  | Button | icon, name | small, square, wide | writes `true` to the state |
49
+ | Thermostat | name, arc with the current temperature, − target +, a dot for the heating relay | square, large | − and + write the target |
49
50
 
50
51
  ## Settings
51
52
 
@@ -54,7 +55,8 @@ to 8 tiles. Swipe left from the clock to reach them; a page without tiles is ski
54
55
  2. **Tiles:** a graphical editor. Choose the satellite and the page; the preview shows the screen with the current
55
56
  values. Click a free cell to add a tile, drag a tile to move it, click a tile to edit it on the right: kind,
56
57
  size, the state (with the object browser of the admin), name, unit, icon and scale. Name, unit and scale may stay
57
- empty: they come from the object of the state. A tile beyond the eight a page takes is marked red.
58
+ empty: they come from the object of the state. A tile the adapter would leave out is marked red, with the reason
59
+ (a size its kind does not come in, a thermostat without its target, more than eight tiles on a page).
58
60
  3. **Charts (optional):** a history adapter (history, sql, influxdb). A chart then starts with the last hours of its
59
61
  state instead of empty.
60
62
 
@@ -66,6 +68,11 @@ Details of the kinds:
66
68
  writes the level when it is released. The second state is its on/off. Without a second state a level of 0 is off,
67
69
  and switching on restores the last level.
68
70
  - **Button:** writes `true` (or `1` for a number state), e.g. to a scene or a script trigger.
71
+ - **Thermostat:** three states: the current temperature (the arc), the target temperature (written by − and +)
72
+ and, optional, the heating relay (the dot: green on, grey off). − and + change the target on the screen at
73
+ once by the step (0.5 unless set); one second after the last press the adapter writes it. The scale and the
74
+ limits of the target come from the object of the target temperature (`min`/`max`), else 5-30. Needs the
75
+ satellite firmware **2.0.1**; an older firmware is reported in the log and the tile is left out.
69
76
  - A value that is no number (text, `true`/`false`) shows as text on a value tile.
70
77
 
71
78
  The toggle and the slider change at once on the screen. When the device does not follow, the tile shows the real
@@ -85,6 +92,8 @@ again by itself.
85
92
 
86
93
  ## Notes
87
94
 
95
+ - The small bar and chart tiles (1 × 1) need the satellite firmware **2.0.2**; an older one leaves them empty and
96
+ writes a warning into its own log.
88
97
  - The satellite firmware must be **2.0.0** or newer; an older firmware is reported in the log ("tile pages need the
89
98
  satellite firmware 2.0.0").
90
99
  - The format between adapter and firmware is described in
@@ -93,11 +102,25 @@ again by itself.
93
102
 
94
103
  ## Changelog
95
104
 
105
+ Older changes: [CHANGELOG_OLD.md](CHANGELOG_OLD.md)
106
+
96
107
  <!--
97
108
  Placeholder for the next version (at the beginning of the line):
98
109
  ### **WORK IN PROGRESS**
99
110
  -->
100
111
 
112
+ ### 0.0.3 (2026-11-09)
113
+
114
+ - Small bar and chart tiles (1 × 1): the name and the value on one line, the bar or the line below (satellite
115
+ firmware 2.0.2)
116
+ - The tile editor marks a tile the adapter would leave out, with the reason
117
+
118
+ ### 0.0.2 (2026-11-09)
119
+
120
+ - Thermostat tile: current temperature in an arc, the target temperature with − and +, a dot for the heating
121
+ relay (satellite firmware 2.0.1)
122
+ - Released through GitHub Actions with provenance
123
+
101
124
  ### 0.0.1 (2026-11-09)
102
125
 
103
126
  - First version: tile pages on the touch display of ESPHome voice satellites, with a graphical tile editor
@@ -0,0 +1 @@
1
+ import"./_virtual_mf___mfe_internal__SatDisplay__mf_owner__180606781360439__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BtcMQbqk.js";import{$r as e,Dn as t,K as n,Mt as r,Qr as i,Qt as a,Sn as o,Yt as s,Zr as c,Zt as l,_ as u,cn as d,en as f,m as p,on as m,pt as h,rn as g,tn as _,zn as v}from"./_virtual_mf___mfe_internal__SatDisplay__mf_owner__180606781360439__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-B7AZpjV-.js";import{t as y}from"./_virtual_mf___mfe_internal__SatDisplay__mf_owner__180606781360439__loadShare__shared-B2hx53j0.js";var b={s:[1,1],q:[1,2],w:[2,1],l:[2,2]},x={value:[`s`,`q`,`w`,`l`],gauge:[`q`,`l`],bar:[`s`,`q`,`w`,`l`],chart:[`s`,`w`,`l`],switch:[`s`,`q`,`w`],dimmer:[`w`,`l`],button:[`s`,`q`,`w`],thermostat:[`q`,`l`]},S=`lightbulb.lamp.ceiling-light.power-plug.power.fan.radiator.thermometer.water-percent.flash.solar-power.battery.window-closed.window-open.door.garage.blinds.lock.lock-open.bell.television.movie.music.speaker.coffee.washing-machine.dishwasher.car.home.bed.sofa.shower.weather-sunny.weather-night.alarm.play.pause.stop.check.close`.split(`.`);function C(e){return!x[e.type]||!x[e.type].includes(e.size)?`sd_bad_size`:e.type===`thermostat`&&!String(e.state2||``).trim()?`sd_need_target`:``}function w(e,t){let n=e=>String(e||``).trim().toLowerCase().replace(/[^a-z0-9_-]+/g,`_`).replace(/^_+|_+$/g,``)||`satellite`;return n(e)===n(t)}function T(e,t,n){let[r,i]=b[e];return t>=0&&n>=0&&t+r<=2&&n+i<=4}function E(e,t){let[n,r]=b[e.size],[i,a]=b[t.size];return e.col<t.col+i&&t.col<e.col+n&&e.row<t.row+a&&t.row<e.row+r}function D(e,t,n,r,i,a,o=-1){return T(r,i,a)?!e.some((e,s)=>s!==o&&e.enabled!==!1&&w(e.satellite,t)&&Number(e.page)===n&&b[e.size]&&E(e,{size:r,col:i,row:a})):!1}function O(e,t,n,r,i=-1){for(let a=0;a<4;a++)for(let o=0;o<2;o++)if(D(e,t,n,r,o,a,i))return{col:o,row:a};return null}function k(e,t,n,r,i){return e.findIndex(e=>e.enabled!==!1&&w(e.satellite,t)&&Number(e.page)===n&&b[e.size]&&E(e,{size:`s`,col:r,row:i}))}function A(e,t,n){return e.map((e,t)=>({t:e,i:t})).filter(e=>e.t.enabled!==!1&&w(e.t.satellite,t)&&Number(e.t.page)===n).slice(8).map(e=>e.i)}function j(e,t,n,r){return{enabled:!0,satellite:e,page:t,col:n,row:r,size:`s`,type:`value`,state:``,state2:``,state3:``,label:``,unit:``,icon:``,decimals:``,min:``,max:``,step:``}}var M=1.5,N=e=>Math.round(e*M),P=e=>6+e*157,F=e=>6+Math.floor(e*117/2),I={value:`sd_kind_value`,gauge:`sd_kind_gauge`,bar:`sd_kind_bar`,chart:`sd_kind_chart`,switch:`sd_kind_switch`,dimmer:`sd_kind_dimmer`,button:`sd_kind_button`,thermostat:`sd_kind_thermostat`},L={s:`1 × 1`,q:`1 × 2`,w:`2 × 1`,l:`2 × 2`},R={screen:`#0B1118`,tile:`#18212B`,tileOn:`#0C4A6E`,label:`#8A9AAC`,accent:`#38BDF8`,track:`#2E3A47`,heatOn:`#4CAF50`,heatOff:`#4B5563`},z={TileEditor:class extends y{constructor(e){super(e),this.state={...this.state,satellite:``,page:1,selected:-1,pickFor:null,dragging:-1,values:{},names:{}}}async componentDidMount(){await super.componentDidMount();let e=this.satelliteNames();e.length&&this.setState({satellite:e[0]},()=>void this.readStates())}tiles(){let e=y.getValue(this.props.data,`tiles`);return Array.isArray(e)?e:[]}satelliteNames(){let e=y.getValue(this.props.data,`satellites`),t=(Array.isArray(e)?e:[]).map(e=>String((e==null?void 0:e.name)||``).trim()).filter(Boolean);for(let e of this.tiles()){let n=String(e.satellite||``).trim();n&&!t.some(e=>w(e,n))&&t.push(n)}return t}isConfigured(e){let t=y.getValue(this.props.data,`satellites`);return(Array.isArray(t)?t:[]).some(t=>w((t==null?void 0:t.name)||``,e))}setTiles(e,t=this.state.selected){this.setState({selected:t},()=>void this.onChange(`tiles`,e,()=>void this.readStates()))}update(e,t){let n=this.tiles().map((n,r)=>r===e?{...n,...t}:n);this.setTiles(n)}async readStates(){let e=this.props.oContext.socket,t=new Set;for(let e of this.pageTiles())for(let n of[e.tile.state,e.tile.state2,e.tile.state3])n&&!(n in this.state.values)&&t.add(n);if(!t.size)return;let n={},r={},i=u.getLanguage();for(let o of t)try{var a;let t=await e.getState(o);n[o]=t==null?void 0:t.val;let s=await e.getObject(o),c=s==null||(a=s.common)==null?void 0:a.name;r[o]=typeof c==`object`&&c?c[i]||c.en||``:String(c||``)}catch{n[o]=void 0}this.setState(e=>({values:{...e.values,...n},names:{...e.names,...r}}))}pageTiles(){return this.tiles().map((e,t)=>({tile:e,index:t})).filter(e=>e.tile.enabled!==!1&&w(e.tile.satellite,this.state.satellite)&&Number(e.tile.page)===this.state.page&&!!b[e.tile.size])}addAt(e,t){let n=[...this.tiles(),j(this.state.satellite,this.state.page,e,t)];this.setTiles(n,n.length-1)}moveTo(e,t,n){let r=this.tiles()[e];r&&D(this.tiles(),this.state.satellite,this.state.page,r.size,t,n,e)&&this.update(e,{col:t,row:n})}remove(e){this.setTiles(this.tiles().filter((t,n)=>n!==e),-1)}changeKind(e,t){let n=this.tiles()[e],{size:r,col:i,row:a}=n;if(!x[t].includes(r)){let o=x[t].find(t=>D(this.tiles(),n.satellite,Number(n.page),t,i,a,e));if(o)r=o;else for(let o of x[t]){let t=O(this.tiles(),n.satellite,Number(n.page),o,e);if(t){r=o,{col:i,row:a}=t;break}}}this.update(e,{type:t,size:r,col:i,row:a,state2:t===`dimmer`||t===`thermostat`?n.state2:``,state3:t===`thermostat`&&n.state3||``})}changePage(e,t){let n=this.tiles()[e],r=O(this.tiles(),n.satellite,t,n.size,e);r&&(this.update(e,{page:t,...r}),this.setState({page:t}))}renderTileFace(t,n,r){let a=this.state.values[t.state],o=t.label||this.state.names[t.state]||t.state.split(`.`).pop()||u.t(`sd_no_state`),s=typeof a==`number`?a:NaN,l=t.unit&&t.type!==`dimmer`?` ${t.unit}`:``,d=a==null?`–`:typeof a==`number`?`${Number(a.toFixed(t.decimals===``||t.decimals===null?1:Number(t.decimals)))}${l}`:`${String(a)}${typeof a==`boolean`?``:l}`,f=t.type===`dimmer`&&t.state2?!!this.state.values[t.state2]:a===!0||typeof a==`number`&&a>0,p=t.min===``||t.min===null?0:Number(t.min),m=t.max===``||t.max===null?100:Number(t.max),h=Number.isFinite(s)&&m>p?Math.max(0,Math.min(1,(s-p)/(m-p))):.5,g=i(`div`,{style:{color:R.label,fontSize:N(10),whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`},children:o}),_=r>N(60),v=i(`div`,{style:{fontSize:N(_?22:14)},children:d}),y=i(`div`,{style:{width:N(26),height:N(14),borderRadius:N(7),background:f?R.accent:R.track,position:`relative`,flex:`none`},children:i(`div`,{style:{position:`absolute`,top:N(2),left:N(f?14:2),width:N(10),height:N(10),borderRadius:`50%`,background:`#fff`}})}),b=(t,n)=>{let r=t/2-N(4),a=Math.PI*2*r*.75;return e(`svg`,{width:t,height:t,style:n,children:[i(`circle`,{cx:t/2,cy:t/2,r,fill:`none`,stroke:R.track,strokeWidth:N(5),strokeDasharray:`${a} ${a*2}`,transform:`rotate(135 ${t/2} ${t/2})`,strokeLinecap:`round`}),i(`circle`,{cx:t/2,cy:t/2,r,fill:`none`,stroke:R.accent,strokeWidth:N(5),strokeDasharray:`${a*h} ${a*3}`,transform:`rotate(135 ${t/2} ${t/2})`,strokeLinecap:`round`}),i(`text`,{x:t/2,y:t/2+N(4),textAnchor:`middle`,fill:`#fff`,fontSize:N(11),children:d})]})};switch(t.type){case`thermostat`:{let n=this.state.values[t.state2],r=Number(t.step)>0?Number(t.step):.5,a=typeof n==`number`?`${n.toFixed(+(r<1))}${t.unit?` ${t.unit}`:``}`:`–`,o=t.state3?this.state.values[t.state3]:void 0,s=t.state3&&o!=null?i(`div`,{style:{position:`absolute`,right:N(6),top:N(5),width:N(10),height:N(10),borderRadius:`50%`,background:o===!0||Number(o)>0?R.heatOn:R.heatOff}}):null,l=e(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,color:R.label,flex:1},children:[i(`span`,{style:{fontSize:N(18),fontWeight:700},children:`−`}),i(`span`,{style:{fontSize:t.size===`l`?N(22):N(11),color:t.size===`l`?`#fff`:R.label},children:a}),i(`span`,{style:{fontSize:N(18),fontWeight:700},children:`+`})]});return t.size===`l`?e(c,{children:[s,g,e(`div`,{style:{display:`flex`,alignItems:`center`,gap:N(12)},children:[b(N(52),{display:`block`,flex:`none`}),l]})]}):e(c,{children:[s,g,b(N(46),{display:`block`,margin:`0 auto`}),i(`div`,{style:{display:`flex`,marginTop:-N(4)},children:l})]})}case`gauge`:{let t=N(56),n=t/2-N(4),r=Math.PI*2*n*.75;return e(c,{children:[g,e(`svg`,{width:t,height:t,style:{display:`block`,margin:`${N(2)}px auto 0`},children:[i(`circle`,{cx:t/2,cy:t/2,r:n,fill:`none`,stroke:R.track,strokeWidth:N(5),strokeDasharray:`${r} ${r*2}`,transform:`rotate(135 ${t/2} ${t/2})`,strokeLinecap:`round`}),i(`circle`,{cx:t/2,cy:t/2,r:n,fill:`none`,stroke:R.accent,strokeWidth:N(5),strokeDasharray:`${r*h} ${r*3}`,transform:`rotate(135 ${t/2} ${t/2})`,strokeLinecap:`round`}),i(`text`,{x:t/2,y:t/2+N(4),textAnchor:`middle`,fill:`#fff`,fontSize:N(11),children:d})]})]})}case`bar`:case`chart`:return t.size===`s`?e(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100%`},children:[e(`div`,{style:{display:`flex`,alignItems:`center`,gap:N(4)},children:[i(`div`,{style:{flex:1,minWidth:0},children:g}),i(`div`,{style:{fontSize:N(14)},children:d})]}),t.type===`bar`?i(`div`,{style:{height:N(4),background:R.track,borderRadius:N(2),marginTop:`auto`,marginBottom:N(4)},children:i(`div`,{style:{width:`${h*100}%`,height:`100%`,background:R.accent,borderRadius:N(2)}})}):i(`svg`,{width:n-N(16),height:N(14),style:{display:`block`,marginTop:`auto`,marginBottom:N(2)},children:i(`polyline`,{fill:`none`,stroke:R.accent,strokeWidth:2,points:[0,.6,.4,.7,.3,.5,.2,.45,.35].map((e,t)=>`${t*(n-N(16))/8},${e*N(14)}`).join(` `)})})]}):t.type===`chart`?e(c,{children:[g,v,i(`svg`,{width:n-N(16),height:N(18),style:{display:`block`},children:i(`polyline`,{fill:`none`,stroke:R.accent,strokeWidth:2,points:[0,.6,.4,.7,.3,.5,.2,.45,.35].map((e,t)=>`${t*(n-N(16))/8},${e*N(18)}`).join(` `)})})]}):e(c,{children:[g,v,i(`div`,{style:{height:N(5),background:R.track,borderRadius:N(3),marginTop:N(_?14:2)},children:i(`div`,{style:{width:`${h*100}%`,height:`100%`,background:R.accent,borderRadius:N(3)}})})]});case`switch`:return e(`div`,{style:{display:`flex`,alignItems:_?`flex-start`:`center`,gap:N(6),height:`100%`,flexDirection:_?`column`:`row`,justifyContent:`space-between`},children:[i(`div`,{style:{flex:1,minWidth:0},children:g}),i(`div`,{style:{alignSelf:`flex-end`},children:y})]});case`dimmer`:return e(`div`,{style:{display:`flex`,alignItems:`center`,gap:N(6),height:`100%`},children:[i(`div`,{style:{width:N(40),minWidth:0},children:g}),y,i(`div`,{style:{flex:1,height:N(5),background:R.track,borderRadius:N(3)},children:i(`div`,{style:{width:`${Number.isFinite(s)?Math.max(0,Math.min(100,s)):50}%`,height:`100%`,background:R.accent,borderRadius:N(3)}})}),i(`div`,{style:{fontSize:N(11),width:N(30),textAlign:`right`},children:Number.isFinite(s)?`${Math.round(s)} %`:`–`})]});case`button`:return e(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`center`,height:`100%`,gap:N(6),flexDirection:_?`column`:`row`},children:[t.icon?e(`span`,{style:{color:R.accent,fontSize:N(9)},children:[`◉ `,t.icon]}):null,i(`span`,{style:{fontSize:N(11)},children:o})]});default:return r<=N(53)&&n<=N(151)?e(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,height:`100%`},children:[i(`div`,{style:{minWidth:0,flex:1},children:g}),i(`div`,{style:{fontSize:N(13)},children:d})]}):e(c,{children:[g,v]})}}renderScreen(){let t=this.tiles(),n=new Set(A(t,this.state.satellite,this.state.page)),a=[];for(let e=0;e<4;e++)for(let n=0;n<2;n++)k(t,this.state.satellite,this.state.page,n,e)===-1&&a.push(i(f,{title:u.t(`sd_add_here`),children:i(`div`,{onClick:()=>this.addAt(n,e),onDragOver:e=>e.preventDefault(),onDrop:t=>{t.preventDefault(),this.moveTo(this.state.dragging,n,e)},style:{position:`absolute`,left:N(P(n)),top:N(F(e)),width:N(151),height:N(F(e+1)-6-F(e)),border:`1px dashed #3a4654`,borderRadius:N(8),display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#56657a`,cursor:`pointer`,boxSizing:`border-box`},children:i(r,{})})},`c${n}${e}`));return e(`div`,{style:{position:`relative`,width:N(320),height:N(240),background:R.screen,borderRadius:10,outline:`8px solid #2a2a2a`,margin:8,flex:`none`,fontFamily:`Roboto, sans-serif`},children:[a,this.pageTiles().map(({tile:e,index:t})=>{let[r,a]=b[e.size],o=N(r===2?308:151),s=N(F(e.row+a)-6-F(e.row)),c=t===this.state.selected,l=n.has(t)?`sd_too_many`:C(e),d=e.type===`switch`&&(this.state.values[e.state]===!0||Number(this.state.values[e.state])>0);return i(`div`,{draggable:!0,onDragStart:()=>this.setState({dragging:t,selected:t}),onDragEnd:()=>this.setState({dragging:-1}),onDragOver:e=>e.preventDefault(),onDrop:e=>{var t;e.preventDefault();let n=(t=e.currentTarget.parentElement)==null?void 0:t.getBoundingClientRect();if(n){let t=Math.min(1,Math.max(0,Math.floor((e.clientX-n.left)/N(157)))),r=Math.min(3,Math.max(0,Math.floor((e.clientY-n.top)/N(58.5))));this.moveTo(this.state.dragging,t,r)}},onClick:()=>this.setState({selected:t}),title:l?u.t(l):``,style:{position:`absolute`,left:N(P(e.col)),top:N(F(e.row)),width:o,height:s,boxSizing:`border-box`,padding:`${N(4)}px ${N(7)}px`,display:e.type===`thermostat`?`flex`:void 0,flexDirection:e.type===`thermostat`?`column`:void 0,background:d?R.tileOn:R.tile,borderRadius:N(8),color:`#fff`,cursor:`grab`,overflow:`hidden`,border:`2px solid ${c?R.accent:l?`#EF4444`:`transparent`}`,opacity:l?.5:1,userSelect:`none`},children:this.renderTileFace(e,o,s)},t)})]})}renderStateField(n,r,a,o){return e(g,{sx:{display:`flex`,gap:1,alignItems:`center`},children:[i(s,{variant:`standard`,fullWidth:!0,label:u.t(o),value:r[a]||``,onChange:e=>this.update(n,{[a]:e.target.value})}),i(t,{size:`small`,title:u.t(`sd_pick_state`),onClick:()=>this.setState({pickFor:a}),children:i(h,{})})]})}renderPanel(){let t=this.state.selected,r=this.tiles()[t];if(!r||!w(r.satellite,this.state.satellite))return i(_,{variant:`body2`,sx:{opacity:.7,p:1},children:u.t(`sd_hint`)});let f=this.tiles(),p=e=>e===``?``:Number(e),h=r.type===`gauge`||r.type===`bar`||r.type===`chart`||r.type===`thermostat`,y=r.type===`dimmer`?`sd_level_state`:r.type===`thermostat`?`sd_current_state`:`sd_state`;return e(g,{sx:{display:`flex`,flexDirection:`column`,gap:1.5,minWidth:260,maxWidth:360,flex:1},children:[C(r)?i(_,{variant:`body2`,color:`error`,children:u.t(C(r))}):null,i(o,{control:i(d,{checked:r.enabled!==!1,onChange:e=>this.update(t,{enabled:e.target.checked})}),label:u.t(`sd_active`)}),i(s,{select:!0,variant:`standard`,label:u.t(`sd_kind`),value:r.type,onChange:e=>this.changeKind(t,e.target.value),children:Object.keys(x).map(e=>i(v,{value:e,children:u.t(I[e])},e))}),e(g,{children:[i(_,{variant:`caption`,sx:{opacity:.7},children:u.t(`sd_size`)}),i(a,{exclusive:!0,size:`small`,value:r.size,sx:{display:`flex`},onChange:(e,n)=>n&&this.update(t,{size:n}),children:x[r.type].map(e=>i(l,{value:e,sx:{flex:1},disabled:e!==r.size&&!D(f,r.satellite,Number(r.page),e,r.col,r.row,t),children:L[e]},e))})]}),this.renderStateField(t,r,`state`,y),r.type===`dimmer`?this.renderStateField(t,r,`state2`,`sd_onoff_state`):null,r.type===`thermostat`?this.renderStateField(t,r,`state2`,`sd_target_state`):null,r.type===`thermostat`?this.renderStateField(t,r,`state3`,`sd_relay_state`):null,e(g,{sx:{display:`flex`,gap:1},children:[i(s,{variant:`standard`,sx:{flex:2},label:u.t(`sd_label`),placeholder:this.state.names[r.state]||``,value:r.label||``,slotProps:{htmlInput:{maxLength:24}},onChange:e=>this.update(t,{label:e.target.value})}),r.type!==`dimmer`&&r.type!==`button`&&r.type!==`switch`?i(s,{variant:`standard`,sx:{flex:1},label:u.t(`sd_unit`),value:r.unit||``,slotProps:{htmlInput:{maxLength:8}},onChange:e=>this.update(t,{unit:e.target.value})}):null]}),r.type===`button`||r.type===`switch`&&r.size===`q`?e(s,{select:!0,variant:`standard`,label:u.t(`sd_icon`),value:r.icon||``,onChange:e=>this.update(t,{icon:e.target.value}),children:[i(v,{value:``,children:`–`}),S.map(e=>i(v,{value:e,children:e},e))]}):null,r.type===`value`||h?e(g,{sx:{display:`flex`,gap:1},children:[i(s,{variant:`standard`,type:`number`,sx:{flex:1},label:u.t(`sd_decimals`),value:r.decimals??``,slotProps:{htmlInput:{min:0,max:3}},onChange:e=>this.update(t,{decimals:p(e.target.value)})}),h?e(c,{children:[i(s,{variant:`standard`,type:`number`,sx:{flex:1},label:u.t(`sd_min`),value:r.min??``,onChange:e=>this.update(t,{min:p(e.target.value)})}),i(s,{variant:`standard`,type:`number`,sx:{flex:1},label:u.t(`sd_max`),value:r.max??``,onChange:e=>this.update(t,{max:p(e.target.value)})})]}):null]}):null,r.type===`thermostat`?i(s,{variant:`standard`,type:`number`,label:u.t(`sd_step`),placeholder:`0.5`,value:r.step??``,slotProps:{htmlInput:{min:.1,step:.1}},onChange:e=>this.update(t,{step:p(e.target.value)})}):null,i(s,{select:!0,variant:`standard`,label:u.t(`sd_page`),value:Number(r.page),onChange:e=>this.changePage(t,Number(e.target.value)),children:[1,2,3,4].map(e=>i(v,{value:e,disabled:e!==Number(r.page)&&!O(f,r.satellite,e,r.size,t),children:e},e))}),i(m,{color:`error`,variant:`outlined`,startIcon:i(n,{}),onClick:()=>this.remove(t),children:u.t(`sd_delete`)})]})}renderPicker(){let e=this.state.selected,t=this.state.pickFor,n=this.tiles()[e];return!t||!n?null:i(p,{dialogName:`satelliteDisplayTile`,socket:this.props.oContext.socket,theme:this.props.oContext.theme,themeType:this.props.oContext.themeType,imagePrefix:`../..`,selected:n[t]||``,onClose:()=>this.setState({pickFor:null}),onOk:n=>{let r=Array.isArray(n)?n[0]:n;this.setState({pickFor:null}),r&&this.update(e,{[t]:r})}})}renderItem(){let t=this.satelliteNames();if(!t.length)return i(_,{sx:{p:2},children:u.t(`sd_no_satellites`)});let n=t.find(e=>w(e,this.state.satellite))||t[0],r=[1,2,3,4].map(e=>this.tiles().filter(t=>t.enabled!==!1&&w(t.satellite,n)&&Number(t.page)===e).length),o=this.tiles().filter(e=>e.enabled===!1&&w(e.satellite,n)&&Number(e.page)===this.state.page).length;return e(g,{sx:{width:`100%`},children:[e(g,{sx:{display:`flex`,gap:2,alignItems:`center`,flexWrap:`wrap`,mb:2},children:[i(s,{select:!0,variant:`standard`,label:u.t(`sd_satellite`),value:n,sx:{minWidth:180},onChange:e=>this.setState({satellite:e.target.value,selected:-1},()=>void this.readStates()),children:t.map(e=>i(v,{value:e,children:this.isConfigured(e)?e:`${e} (${u.t(`sd_not_configured`)})`},e))}),i(a,{exclusive:!0,size:`small`,value:this.state.page,onChange:(e,t)=>t&&this.setState({page:t,selected:-1},()=>void this.readStates()),children:Array.from({length:4},(e,t)=>t+1).map(t=>e(l,{value:t,children:[u.t(`sd_page`),` `,t,r[t-1]?` (${r[t-1]})`:``]},t))})]}),e(g,{sx:{display:`flex`,gap:3,alignItems:`flex-start`,flexWrap:`wrap`},children:[e(g,{children:[this.renderScreen(),e(_,{variant:`caption`,component:`div`,sx:{opacity:.7,mt:2,maxWidth:N(320)},children:[u.t(`sd_how`),o?` ${u.t(`sd_disabled_count`,o)}`:``]})]}),this.renderPanel()]}),this.renderPicker()]})}}};export{z as default};
@@ -1,4 +1,4 @@
1
- import{t as e}from"./assets/dist-ClWhWsnT.js";import{t}from"./assets/helpers-DYkm0lQU.js";import{t as n}from"./assets/vite-preload-helper-D97eqSzU.js";var r={},i=new Set,a=new Map;function o(e,t){let n=a.get(e);return n||(n=Promise.resolve().then(t).catch(t=>{throw a.delete(e),t}),a.set(e,n)),n}async function s(e){if(typeof document>`u`)return;let t=r[e]||[];await Promise.all(t.map(e=>{let t=new URL(e,import.meta.url).href;return i.has(t)||(i.add(t),document.querySelector(`link[rel="stylesheet"][href="${t}"]`))?Promise.resolve():new Promise((e,n)=>{let r=document.createElement(`link`);r.rel=`stylesheet`,r.href=t,r.onload=()=>e(),r.onerror=()=>n(Error(`[Module Federation] Failed to load CSS asset: ${t}`)),document.head.appendChild(r)})}))}var c={"./Components":async()=>{await s(`./Components`),await Promise.all([]);let e=await o(`./Components`,()=>n(()=>import(`./assets/Components-Dqt07U-e.js`),[],import.meta.url)),t=e&&e.__mf_remote_dependency_pending;t&&typeof t.then==`function`&&await t;let r={};return Object.assign(r,e),Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),r}};typeof __VUE_HMR_RUNTIME__>`u`&&(globalThis.__VUE_HMR_RUNTIME__={createRecord(){},rerender(){},reload(){}});var l=`__mf_init__virtual:mf:__mfe_internal__SatDisplay__mf_owner__180606781360439__mf_v__runtimeInit__mf_v__.js__`,u=globalThis[l];if(!u){let e,t,n=new Promise((n,r)=>{e=n,t=r});u=globalThis[l]={initPromise:n,initResolve:e,initReject:t}}var d=u.initResolve,f=`__mf_module_cache__`;globalThis[f]||={share:{},remote:{}},globalThis[f].share||={},globalThis[f].remote||={};var p=globalThis[f];for(let e of Object.keys(p.share))if(e.startsWith(`default:`)){let t=e.slice(8);p.share[t]===void 0&&(p.share[t]=p.share[e])}else if(!e.includes(`:`)){let t=`default:`+e;p.share[t]===void 0&&(p.share[t]=p.share[e])}var m={},h=Array.isArray(`default`)?`default`:[`default`],g=`default`,_=`SatDisplay`,v=[[`react`],[`react/jsx-runtime`,`react-dom`,`@emotion/react`],[`react-dom/client`,`@emotion/styled`],[`@mui/material`],[`@mui/icons-material`],[`@iobroker/gui-components`],[`@iobroker/json-config`]],y,b;async function x(e){for(let t=0;;t++)try{return await e()}catch(e){throw e}}var S=Symbol(`mf.originalSharedProvider`),C={emit:e=>e},w=e=>Array.isArray(e.scope)?e.scope:[e.scope||`default`],T=(e,t)=>{if(t!==`version-first`)return e;let n={};for(let[t,r]of Object.entries(e))n[t]=Object.assign({},r,{[S]:r});return n},E=(e,t)=>{if(!t)return;let n=Object.entries(e||{}),r=n.find(([,e])=>e===t);if(r)return{version:r[0],provider:t,registered:!0};if(typeof t.version==`string`&&t.version)return{version:t.version,provider:t,registered:!1};let i=n.filter(([,e])=>e===t||!!(t.from&&(e==null?void 0:e.from)===t.from));if(i.length===1)return{version:i[0][0],provider:t,registered:!1}},D=(e,n,r,i)=>{var a;if(!e||!r)return;let o=Object.fromEntries(Object.entries(e).filter(([,e])=>{var t;return(e==null||(t=e.shareConfig)==null?void 0:t.import)!==!1}));if(Object.keys(o).length===0)return;let s=w(r),c=T(o,i),l={};for(let e of s)l[e||`default`]={[n]:c};let u=(a=t.getRegisteredShare(l,n,{...r,scope:s,strategy:i},C))==null?void 0:a.shared;return(u==null?void 0:u[S])||u},O=(e,t,n,r)=>{var i;let a=e=>k(e,n),o=Object.fromEntries(Object.entries(e||{}).filter(([,e])=>{var t;return!a(e)&&(e==null||(t=e.shareConfig)==null?void 0:t.import)!==!1}));n!=null&&n.version&&((i=n.shareConfig)==null?void 0:i.import)!==!1&&(o[n.version]||(o[n.version]=n));let s=D(o,t,n,r);return a(s)?void 0:s},k=(e,t)=>e===t||!!(t!=null&&t.from&&(e==null?void 0:e.from)===t.from),A=(e,t,n,r,i,a,o,s,c)=>{var l,u;if(c!==`version-first`||!s)return;let d=t==null||(l=t.options)==null||(l=l.shared)==null?void 0:l[i],f=Array.isArray(d)?d.find(e=>(e==null?void 0:e.version)===a):void 0,p=((s==null?void 0:s.from)===(t==null||(u=t.options)==null?void 0:u.name)?s:void 0)||(k(f,s)?f:t?void 0:s);if(p)return e.some(e=>{var i,a;return e!==t&&(e==null||(i=e.options)==null?void 0:i.name)===(o==null?void 0:o.from)&&(e==null||(a=e.shareScopeMap)==null?void 0:a[r])===n})?p:void 0},ee=(e,t,n,r,i,a,o,s,c)=>{let l=a.registered?A(e,t,n,r,i,a.version,a.provider,s,c):void 0,u=l||o;if(u&&(!a.registered||k(u,s)))return{provider:u,scopeRootProvider:l}};async function te(){return y||=x(()=>n(()=>import(`./assets/_virtual_mf-localSharedImportMap___mfe_internal__SatDisplay__mf_owner__1-Bp0DvNe1.js`),[],import.meta.url)).catch(e=>{throw y=void 0,e}),y}async function j(){return c}async function M(t={},n=[],r={}){var i,a;let o=(e,t,n,r)=>{let i=(Array.isArray(r)?r[0]:r)||`default`,a=t||!n?e:e+`@`+n,o={canonical:i+`:`+a};return i==="default"&&(o.aliases=[a]),o},s=(e,t)=>{let n=e[t.canonical];if(n!==void 0)return n;let r=t.aliases||[];for(let n of r){if(!Object.prototype.hasOwnProperty.call(e,n))continue;let r=e[n];if(r!==void 0)return e[t.canonical]=r,r}},c=Symbol.for(`module-federation.shared-cache-listeners`),l=Symbol.for(`module-federation.shared-cache-owners`),f=e=>{let t=e[l];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,l,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},y=(e,t)=>{var n;return(n=e[l])==null?void 0:n[t.canonical]},S=e=>{let t=[e,e==null?void 0:e.default];for(let e of t)if(e&&typeof e==`object`){for(let t of[`__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE`,`__TEST_INTERNALS`,`__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED`]){let n=e[t];if(n&&typeof n==`object`)return{internals:n}}if(typeof e.useState==`function`)return{hook:e.useState}}},C=(e,t)=>{if(e===t)return!0;let n=S(e),r=S(t);if(!n||!r)return!1;let i=n.internals,a=r.internals;return i!==void 0||a!==void 0?i!==void 0&&i===a:typeof n.hook==`function`&&n.hook===r.hook},w=(e,t,n,r)=>{var i;let a=s(e,t);if(a!==void 0&&C(a,n))return n;e[t.canonical]=n;let o=t.aliases||[];for(let t of o)Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0});let u=e[l];r===void 0?u&&delete u[t.canonical]:f(e)[t.canonical]=r;let d=(i=e[c])==null?void 0:i[t.canonical];if(d)for(let e of d)e(n);return n},T=Symbol.for(`module-federation.tree-shaking-shared-cache`),A=e=>{let t=e[T];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,T,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},j=(e,t,n,r)=>{if(!Array.isArray(n))return r;let i=[...new Set(n)].sort(),a=A(e),o=a[t.canonical]||=[],s=o.find(e=>e.providedExports.length===i.length&&e.providedExports.every((e,t)=>e===i[t]));return s?s.value=r:o.push({providedExports:i,value:r}),r},M=Symbol.for(`module-federation.tree-shaking-shared-selection-cache`),N=e=>{let t=e[M];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,M,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},P=(e,t,n)=>{var r;let i=s(e,t);return i===void 0?(r=e[M])==null||(r=r[t.canonical])==null?void 0:r[n]:i},F=(e,t,n,r)=>{let i=N(e),a=i[t.canonical]||=Object.create(null);return a[n]=r,r},I=((i=globalThis.__FEDERATION__)==null?void 0:i.__INSTANCES__)||[],L=(a=n.find(e=>e==null?void 0:e.from))==null?void 0:a.from,ne=I.find(e=>{var n,r;return(e==null||(n=e.options)==null?void 0:n.name)===L&&(e==null||(r=e.shareScopeMap)==null?void 0:r.default)===t})||I.find(e=>{var n,r;return(e==null||(n=e.options)==null?void 0:n.name)!==_&&(e==null||(r=e.shareScopeMap)==null?void 0:r.default)===t}),R=Object.create(null),re=e=>{let t=Object.create(null);for(let[n,r]of Object.entries(e||{}))t[n]=Object.assign(Object.create(null),r);return t},ie=(e,t)=>{var n;for(let[i,a]of Object.entries(((n=q.shareScopeMap)==null?void 0:n[e])||{}))for(let[e,n]of Object.entries(a||{})){var r;if(!n||n.get===((r=B[i])==null?void 0:r.get))continue;let a=t[i]||={};a[e]===void 0&&(a[e]=n)}},ae=(e,t)=>{ie(e,t);let n=!ne&&Object.values(t||{}).some(e=>Object.values(e||{}).some(V)),r=n?re(t):t;return R[e]={host:t,runtime:r,isWebpackScope:n},r},oe=()=>{let e=Object.values(R).filter(({isWebpackScope:e})=>e);if(e.length!==0)for(let{host:t,runtime:n}of e)for(let[e,r]of Object.entries(t||{})){let t=n[e]||=Object.create(null);for(let[e,n]of Object.entries(r||{}))t[e]=n}},z=Object.create(null);for(let[e,n]of Object.entries(t)){let t=z[e]=Object.create(null);for(let[e,r]of Object.entries(n))t[e]=Object.assign({},r)}let{usedShared:B,usedRemotes:se}=await te();function V(e){if(typeof(e==null?void 0:e.get)!=`function`)return!1;let t=Function.prototype.toString.call(e.get);return t.includes(`__webpack_require__`)||/\.\s*e\s*\([^)]*\)\s*\.then\s*\(/.test(t)}let ce=Object.values(z).some(e=>Object.values(e||{}).some(V)),le=e=>{let t=e.split(`/`);return e.startsWith(`@`)?t.slice(0,2).join(`/`):t[0]},H=(e,n,r,i)=>{if(typeof O!=`function`)return;let a=le(e),o=!i||a===e?[[e,n]]:[[e,n],[a,B[a]]];for(let[n,i]of o){if(!i)continue;let a=O(r?n===e?r:z[n]:z[n]??t[n],n,i,`version-first`);if(a)return a}},ue=(e,t,n)=>{let r=H(e,t,n,!0);return r&&V(r)&&!r.lib&&!r.loaded?r:void 0};var U=m[g];if(U||=m[g]={from:_},n.indexOf(U)>=0)return;n.push(U);let de=e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.getPrototypeOf(e);if(n!==null&&n!==Object.prototype)break;let r=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(r.length>0&&r.some(e=>e!==void 0))break;t=e}return t},fe=[],pe=globalThis.window===void 0?await Promise.all([]):[],W=`__mf_vite_runtime_share_load_id__`,me=0,G=new Map,K=new Map,q=e({name:_,remotes:se,shared:B,plugins:[he(),ge(),...fe,...pe],shareStrategy:`version-first`});q.initShareScopeMap(`default`,ae(`default`,t));function he(){return{name:`vite-share-pin-lifecycle-plugin`,resolveShare(e){var t;let n=(t=e.shareInfo)==null?void 0:t[W],r=n===void 0?void 0:K.get(n);if(!r)return e;let i=e.resolver;return e.resolver=(...e)=>(r.pinned.reapply(),i(...e)),r.pinned.reveal(),e}}}function ge(){return{name:`vite-real-name-snapshot-plugin`,afterLoadSnapshot(e){let t=e&&e.remoteSnapshot,n=t&&t.globalName,r=t&&t.version;if(!n||!r||!t.remoteEntry)return e;let i=globalThis.__FEDERATION__&&globalThis.__FEDERATION__.moduleInfo,a=n+`:`+r;return i&&!i[a]&&(i[a]=t),e}}}let _e=q.sharedHandler.hooks.lifecycle.resolveShare;if(!q.__mfKeepAdoptedProviders){var J,ve;q.__mfKeepAdoptedProviders=!0,(J=q.sharedHandler)==null||(J=J.hooks)==null||(J=J.lifecycle)==null||(J=J.afterRegisterShare)==null||(ve=J.on)==null||ve.call(J,e=>{var t,n,r;let{shared:i,previousShared:a,registeredShared:o}=e||{};if((i==null||(t=i.shareConfig)==null?void 0:t.import)!==!1||o!==i||!a||((n=a.shareConfig)==null?void 0:n.import)===!1)return;let s=(r=q.shareScopeMap)==null||(r=r[e.scope])==null?void 0:r[e.pkgName];s&&s[i.version]===i&&(s[i.version]=a)})}let Y=new WeakMap;_e.on(e=>{var t;let n=(t=e.shareInfo)==null?void 0:t[W],r=e.resolver;return typeof r==`function`&&(e.resolver=(...t)=>{var i;let a=r(...t);if((a==null||(i=a.shared)==null||(i=i.shareConfig)==null?void 0:i.import)===!1&&typeof D==`function`&&B[e.pkgName]){var o,s;let t=D((o=e.shareScopeMap)==null||(o=o[e.scope])==null?void 0:o[e.pkgName],e.pkgName,B[e.pkgName],`version-first`);t&&((s=t.shareConfig)==null?void 0:s.import)!==!1&&(a={shared:t,useTreesShaking:a.useTreesShaking})}let c=a==null?void 0:a.shared;return c&&(typeof c==`object`||typeof c==`function`)&&!Y.has(c)&&Y.set(c,{from:c.from}),n!==void 0&&c&&G.set(n,c),a}),e});let ye=(e,t,n,r)=>{if(!e||e[t]!==n)return;let i=Object.assign({},r,{version:r.version??t,scope:r.scope??(n==null?void 0:n.scope)??[`default`],strategy:`loaded-first`}),a=r.from;e[t]=i;let o=()=>n===void 0?e[t]===void 0:e[t]===n;return{provider:i,reveal(){return e[t]===i&&(n===void 0?delete e[t]:e[t]=n,!0)},reapply(){return o()?(e[t]=i,!0):!1},release(s,c=!0){return r.from=a,e[t]===i?c?s?(i.from=a,s&&i.lib&&(i.loaded=!0),r.strategy===void 0?delete i.strategy:i.strategy=r.strategy,!0):(n===void 0?delete e[t]:e[t]=n,!1):(n===void 0?delete e[t]:e[t]=n,!0):!c&&o()}}},be=e=>Object.entries(e||{}).map(([e,t])=>({provider:t,version:e,from:t.from,registered:!0})),xe=(e,t)=>{if(t===void 0)return;let n;for(let r of e){let e=r.provider,i=e.treeShaking||e;if(r.loadedFactory===t||e.lib===t||i.lib===t){if(n)return;n=r}}return n},Se=async(e,t,n)=>{let r=++me;K.set(r,{pinned:n});try{let n=await q.loadShare(e,{customShareInfo:{shareConfig:t,[W]:r}});return{factory:n===!1?void 0:n,selectedProvider:G.get(r)}}finally{G.delete(r),K.delete(r)}},Ce=async(e,t,n,r,i,a,o=!0)=>{let s=a.from,c=ye(n,r,i,a);if(!c)return;let l;try{l=await Se(e,t,c)}catch(e){throw c.release(!1),e}let u=l==null?void 0:l.factory;if(u===void 0){c.release(!1);return}let d=be(n),f=c.provider.treeShaking||c.provider,p=c.provider.lib===u||f.lib===u;if(!o&&p){let e=d.findIndex(e=>e.provider===c.provider);e!==-1&&d.splice(e,1)}!o&&!d.some(e=>e.provider===a)&&d.push({provider:a,version:r,from:s,registered:!1,loadedFactory:p?u:void 0});let m=!o&&l.selectedProvider===c.provider&&p?a:l.selectedProvider;if(m&&!d.some(e=>e.provider===m)){let e=Y.get(m),t=typeof m.version==`string`&&m.version?m.version:r;d.push({provider:m,version:t,from:e?e.from:m.from,registered:(n==null?void 0:n[t])===m,loadedFactory:u})}let h=d.find(e=>e.provider===m)??xe(d,u);if(!c.release(!0,(h==null?void 0:h.provider)===c.provider)||!h)return;let g=Y.get(h.provider);h.from=h.provider===a?s:g?g.from:h.provider.from,g&&(h.provider.from=g.from);let _=typeof u==`function`?u():u,v=await Promise.resolve(_);if(!(h.registered&&(n==null?void 0:n[h.version])!==h.provider))return{provider:h.provider,selection:h,resolved:v}},X=new Set,we=new Map,Te=async(e,n,r)=>{var i;let a=!!((i=n.shareConfig)!=null&&i.singleton);if(!a&&n.canLiveRebind!==!1)try{var c,l;let i=O(r,e,n,`version-first`),u=E(r,i);if(!u||((c=n.shareConfig)==null?void 0:c.import)===!1&&k(i,n)||(i==null||(l=i.shareConfig)==null?void 0:l.import)===!1)return;let{version:d}=u;if(!a&&d!==n.version||!i.lib&&!i.loading&&!(i.loaded&&typeof i.get==`function`))return;let f=o(e,a,n.version,n.scope);if(s(p.share,f)!==void 0)return;let m=t[e],h=m==null?void 0:m[d];if(u.registered&&!k(h,i))return;let g,_=i.lib;if(!_&&V(i)||(!_&&i.loading&&(_=await i.loading),!_&&i.loaded&&typeof i.get==`function`&&(_=await i.get()),!_))return;let v=typeof _==`function`?_():_,y=await Promise.resolve(v),b=u.registered?h:i;g={provider:b,selection:{provider:b,version:d,from:i.from,registered:u.registered},resolved:y};let x=g==null?void 0:g.provider,S=g==null?void 0:g.selection;if(!S)return;let C=g==null?void 0:g.resolved;if(C===void 0||s(p.share,f)!==void 0||S.registered&&(m==null?void 0:m[S.version])!==x)return;w(p.share,f,de(C),S.from),X.add(x)}catch(t){console.error(`[Module Federation] Failed to bridge materialized shared module "`+e+`"`,t)}},Ee=async(e,n,r,i,a)=>{try{var c,l,u,d;let f=o(e,(c=n.shareConfig)==null?void 0:c.singleton,n.version,n.scope),m=s(p.share,f),h=y(p.share,f),g=O(r,e,n,`version-first`),v=g||D(r,e,n,`version-first`)||n,b=E(r,v);if(!b)return;let x=k(v,n),{version:S}=b;if(!((l=n.shareConfig)!=null&&l.singleton)&&S!==n.version)return;let C=i==null?void 0:i[S],T=ee(I,ne,t,`default`,e,b,g,C,`version-first`);if(!T&&!x)return;let{provider:A,scopeRootProvider:te}=T||{provider:v,scopeRootProvider:void 0};if(n.canLiveRebind===!1||((u=n.shareConfig)==null?void 0:u.import)===!1&&k(A,n)||(A==null||(d=A.shareConfig)==null?void 0:d.import)===!1||m!==void 0&&h!==_)return;let j=t[e],M=j==null?void 0:j[S];if(b.registered&&!te&&!k(M,A))return;let N=await Ce(e,n.shareConfig,j,S,M,A,b.registered&&!x),P=N==null?void 0:N.provider,F=N==null?void 0:N.selection;if(!F||k(P,n)||a&&(a.version!==F.version||!k({from:F.from},a.provider))||X.has(P))return;let L=N==null?void 0:N.resolved;if(L===void 0)return;let R=s(p.share,f),re=y(p.share,f);if(R!==void 0&&re!==_||F.registered&&(j==null?void 0:j[F.version])!==P)return;a||we.set(e,{version:F.version,provider:{from:F.from}}),X.add(P);let ie=de(L);w(p.share,f,ie,F.from)}catch(t){console.error(`[Module Federation] Failed to bridge external shared module "`+e+`"`,t)}};for(let e of v)await Promise.all(e.map(async e=>{let t=B[e];t&&t.materialize!==!1&&!t.treeShaking&&await Te(e,t,z[e])}));for(let[e,t]of Object.entries(B)){var De;if(t.treeShaking)continue;let n=o(e,(De=t.shareConfig)==null?void 0:De.singleton,t.version,t.scope);if(s(p.share,n)!==void 0)continue;let r=o(e,!0,t.version,t.scope),i=s(p.share,r);i!==void 0&&w(p.share,n,i,y(p.share,r))}let Oe=[`react`,`react/jsx-runtime`,`react-dom`,`@emotion/react`,`react-dom/client`,`@emotion/styled`,`@mui/material`,`@mui/icons-material`,`@iobroker/gui-components`,`@iobroker/json-config`],ke=[[`react`],[`react/jsx-runtime`,`react-dom`,`@emotion/react`],[`react-dom/client`,`@emotion/styled`],[`@mui/material`],[`@mui/icons-material`],[`@iobroker/gui-components`],[`@iobroker/json-config`]],Z=new Map(Oe.map((e,t)=>[e,t])),Ae={1:[0],2:[0],3:[0],4:[0,2],5:[3,0],6:[3,5,0,2],7:[6,0],8:[0,2,7,6],9:[3,5,8,7,6,0,2]},Q=Oe.filter(e=>{var t;return B[e]&&(B[e].materialize!==!1||((t=B[e].shareConfig)==null?void 0:t.import)===!1&&!B[e].lazy)});p.providerInit||=new Map;let je=(e,t)=>{let n=p.providerInit.get(e);if(n)return n;let r=Promise.resolve().then(t);return p.providerInit.set(e,r),r.catch(()=>p.providerInit.delete(e)),r};var Me=async e=>{let t=new Set(e);for(let e of ke)await Promise.all(e.filter(e=>t.has(e)).map(async e=>{var t,n,r;let i=B[e],a=o(e,(t=i.shareConfig)==null?void 0:t.singleton,i.version,i.scope);if(((n=i.shareConfig)==null?void 0:n.import)===!1||i.treeShaking||s(p.share,a)!==void 0)return;let c=o(e,!0,i.version,i.scope),l=s(p.share,c);if(l!==void 0){w(p.share,a,l,y(p.share,c));return}let u=typeof H==`function`?H(e,i):void 0;if(u){var d,f;let t=u.lib;if(!t&&u.loading&&(t=await u.loading),!t&&u.loaded&&typeof u.get==`function`&&(t=await u.get()),t){let e=typeof t==`function`?t():t,n=await Promise.resolve(e);w(p.share,a,(e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.getPrototypeOf(e);if(n!==null&&n!==Object.prototype)break;let r=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(r.length>0&&r.some(e=>e!==void 0))break;t=e}return t})(n),u.from);return}if(typeof V==`function`&&V(u)&&((d=i.shareConfig)!=null&&d.singleton||((f=E(z[e],u))==null?void 0:f.version)===i.version))return}let m=a.canonical,h=await je(m,async()=>{let e=await i.get(),t=typeof e==`function`?e():e;return Promise.resolve(t)});for(let t of((r=q.options.shared)==null?void 0:r[e])||[])t.get===i.get&&(t.eager=!0);let g=(e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.getPrototypeOf(e);if(n!==null&&n!==Object.prototype)break;let r=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(r.length>0&&r.some(e=>e!==void 0))break;t=e}return t})(h),v=g===h?{...h}:g;v.__esModule!==!0&&Object.defineProperty(v,"__esModule",{value:!0,enumerable:!1}),w(p.share,a,v,_)}))};let $=e=>{var t,n;let r=B[e];if(!r.treeShaking&&((t=r.shareConfig)==null?void 0:t.import)!==!1)return!1;let i=o(e,(n=r.shareConfig)==null?void 0:n.singleton,r.version,r.scope);return r.treeShaking?P(p.share,i,_)===void 0&&s(p.share,i)===void 0:s(p.share,i)===void 0},Ne=e=>{var t,n;let r=B[e],i=o(e,(t=r.shareConfig)==null?void 0:t.singleton,r.version,r.scope);return(r.treeShaking?P(p.share,i,_)??s(p.share,i):s(p.share,i))===void 0?r.treeShaking||((n=r.shareConfig)==null?void 0:n.import)===!1?!0:typeof O==`function`&&!!O(z[e],e,r,`version-first`):!1},Pe=e=>{let t=!0;for(;t;){t=!1;for(let n of Q){let r=Z.get(n);e.has(r)||(Ae[r]||[]).some(t=>e.has(t))&&(e.add(r),t=!0)}}return e},Fe=Pe(new Set(Q.filter(Ne).map(e=>Z.get(e)))),Ie=Q.filter(e=>!Fe.has(Z.get(e)));var Le=Q.filter(e=>Fe.has(Z.get(e)));await Me(Ie);try{await x(async()=>{await Promise.all(await q.initializeSharing(`default`,{strategy:`version-first`,from:`build`,initScope:n}))})}catch(e){console.error(`[Module Federation]`,e)}oe();let Re=async()=>{for(let e of v)await Promise.all(e.map(async e=>{let n=B[e];n&&n.materialize!==!1&&!n.treeShaking&&await Ee(e,n,t[e],z[e],void 0)}))};ce?b=Re:await Re();try{var ze;let e=(ze=globalThis.__FEDERATION__)==null?void 0:ze.__SHARE__,t=Object.create(null);if(e)for(let[,n]of Object.entries(e))for(let e of h){let r=n==null?void 0:n[e];if(r)for(let[e,n]of Object.entries(r)){let r=B==null?void 0:B[e],i=z[e],a=we.get(e);if(!r||!i||!a||r.treeShaking)continue;let o=t[e]||(t[e]=Object.create(null));for(let[e,t]of Object.entries(n)){if(!t.lib||a.version!==e||!k(t,a.provider))continue;let n=i[e];(t===n||n!=null&&n.from&&t.from===n.from)&&(t===r||r.from&&t.from===r.from||o[e]===void 0&&(o[e]=t))}}}for(let e of v)await Promise.all(e.map(async e=>{let n=t[e];n&&await Ee(e,B[e],n,z[e],we.get(e))}))}catch(e){console.error(`[Module Federation] Failed to bridge external shared modules`,e)}let Be=async()=>{},Ve=async(e,n)=>{var r,i;let a=o(e,(r=n.shareConfig)==null?void 0:r.singleton,n.version,n.scope),c=n.treeShaking?P(p.share,a,_):s(p.share,a);if(((i=n.shareConfig)==null?void 0:i.import)!==!1||c!==void 0||ue(e,n,z[e]))return;let l=e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.getPrototypeOf(e);if(n!==null&&n!==Object.prototype)break;let r=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(r.length>0&&r.some(e=>e!==void 0))break;t=e}return t},u=t==null?void 0:t[e],d=D(u,e,n,`version-first`)||n,f=E(u,d);if(!f)return;let m=e=>{var t;return e===n||(e==null||(t=e.shareConfig)==null?void 0:t.import)===!1};if(m(d))return;let{version:h}=f,g=u==null?void 0:u[h],v=await Ce(e,n.shareConfig,u,h,g,d,f.registered),y=v==null?void 0:v.selection,b=v==null?void 0:v.provider,x=v==null?void 0:v.resolved;if(!y||m(b)||x===void 0||(n.treeShaking?P(p.share,a,_):s(p.share,a))!==void 0||y.registered&&(u==null?void 0:u[y.version])!==b)return;let S=l(x);if(n.treeShaking){let e=n.treeShaking.providedExports??n.treeShaking.usedExports??[];j(p.share,a,e,S),F(p.share,a,_,S)}else w(p.share,a,S,y.from)},He=[],Ue=new Set;for(let e of Le){let t=B[e],n=Z.get(e);if($(e))try{var We;t.treeShaking?await Be(e,t):((We=t.shareConfig)==null?void 0:We.import)===!1&&await Ve(e,t)}catch(t){console.error(`[Module Federation] Failed to resolve runtime-only shared module "${e}"`,t)}$(e)&&Ue.add(n)}Pe(Ue),He.push(...Le.filter(e=>!Ue.has(Z.get(e)))),await Me(He);let Ge=new Map;return u.loadLazyShares=async e=>{let n=new Set(e);for(let e of v)await Promise.all(e.filter(e=>n.has(e)).map(e=>{let n=B[e];if(!n||!n.lazy||!$(e))return;let r=Ge.get(e);return r||(r=Ee(e,n,t[e],z[e],void 0).then(()=>$(e)?Ve(e,n):void 0),r.catch(()=>Ge.delete(e)),Ge.set(e,r)),r}))},d(q),q}async function N(e){let t=await j();if(!(e in t))throw Error(`[Module Federation] Module ${e} does not exist in container.`);return b&&await b(),p.pendingShareLoads&&await Promise.all(p.pendingShareLoads),t[e]().then(e=>()=>e)}export{N as get,M as init};
1
+ import{t as e}from"./assets/dist-ClWhWsnT.js";import{t}from"./assets/helpers-DYkm0lQU.js";import{t as n}from"./assets/vite-preload-helper-D97eqSzU.js";var r={},i=new Set,a=new Map;function o(e,t){let n=a.get(e);return n||(n=Promise.resolve().then(t).catch(t=>{throw a.delete(e),t}),a.set(e,n)),n}async function s(e){if(typeof document>`u`)return;let t=r[e]||[];await Promise.all(t.map(e=>{let t=new URL(e,import.meta.url).href;return i.has(t)||(i.add(t),document.querySelector(`link[rel="stylesheet"][href="${t}"]`))?Promise.resolve():new Promise((e,n)=>{let r=document.createElement(`link`);r.rel=`stylesheet`,r.href=t,r.onload=()=>e(),r.onerror=()=>n(Error(`[Module Federation] Failed to load CSS asset: ${t}`)),document.head.appendChild(r)})}))}var c={"./Components":async()=>{await s(`./Components`),await Promise.all([]);let e=await o(`./Components`,()=>n(()=>import(`./assets/Components-dEIM9Tps.js`),[],import.meta.url)),t=e&&e.__mf_remote_dependency_pending;t&&typeof t.then==`function`&&await t;let r={};return Object.assign(r,e),Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),r}};typeof __VUE_HMR_RUNTIME__>`u`&&(globalThis.__VUE_HMR_RUNTIME__={createRecord(){},rerender(){},reload(){}});var l=`__mf_init__virtual:mf:__mfe_internal__SatDisplay__mf_owner__180606781360439__mf_v__runtimeInit__mf_v__.js__`,u=globalThis[l];if(!u){let e,t,n=new Promise((n,r)=>{e=n,t=r});u=globalThis[l]={initPromise:n,initResolve:e,initReject:t}}var d=u.initResolve,f=`__mf_module_cache__`;globalThis[f]||={share:{},remote:{}},globalThis[f].share||={},globalThis[f].remote||={};var p=globalThis[f];for(let e of Object.keys(p.share))if(e.startsWith(`default:`)){let t=e.slice(8);p.share[t]===void 0&&(p.share[t]=p.share[e])}else if(!e.includes(`:`)){let t=`default:`+e;p.share[t]===void 0&&(p.share[t]=p.share[e])}var m={},h=Array.isArray(`default`)?`default`:[`default`],g=`default`,_=`SatDisplay`,v=[[`react`],[`react/jsx-runtime`,`react-dom`,`@emotion/react`],[`react-dom/client`,`@emotion/styled`],[`@mui/material`],[`@mui/icons-material`],[`@iobroker/gui-components`],[`@iobroker/json-config`]],y,b;async function x(e){for(let t=0;;t++)try{return await e()}catch(e){throw e}}var S=Symbol(`mf.originalSharedProvider`),C={emit:e=>e},w=e=>Array.isArray(e.scope)?e.scope:[e.scope||`default`],T=(e,t)=>{if(t!==`version-first`)return e;let n={};for(let[t,r]of Object.entries(e))n[t]=Object.assign({},r,{[S]:r});return n},E=(e,t)=>{if(!t)return;let n=Object.entries(e||{}),r=n.find(([,e])=>e===t);if(r)return{version:r[0],provider:t,registered:!0};if(typeof t.version==`string`&&t.version)return{version:t.version,provider:t,registered:!1};let i=n.filter(([,e])=>e===t||!!(t.from&&(e==null?void 0:e.from)===t.from));if(i.length===1)return{version:i[0][0],provider:t,registered:!1}},D=(e,n,r,i)=>{var a;if(!e||!r)return;let o=Object.fromEntries(Object.entries(e).filter(([,e])=>{var t;return(e==null||(t=e.shareConfig)==null?void 0:t.import)!==!1}));if(Object.keys(o).length===0)return;let s=w(r),c=T(o,i),l={};for(let e of s)l[e||`default`]={[n]:c};let u=(a=t.getRegisteredShare(l,n,{...r,scope:s,strategy:i},C))==null?void 0:a.shared;return(u==null?void 0:u[S])||u},O=(e,t,n,r)=>{var i;let a=e=>k(e,n),o=Object.fromEntries(Object.entries(e||{}).filter(([,e])=>{var t;return!a(e)&&(e==null||(t=e.shareConfig)==null?void 0:t.import)!==!1}));n!=null&&n.version&&((i=n.shareConfig)==null?void 0:i.import)!==!1&&(o[n.version]||(o[n.version]=n));let s=D(o,t,n,r);return a(s)?void 0:s},k=(e,t)=>e===t||!!(t!=null&&t.from&&(e==null?void 0:e.from)===t.from),A=(e,t,n,r,i,a,o,s,c)=>{var l,u;if(c!==`version-first`||!s)return;let d=t==null||(l=t.options)==null||(l=l.shared)==null?void 0:l[i],f=Array.isArray(d)?d.find(e=>(e==null?void 0:e.version)===a):void 0,p=((s==null?void 0:s.from)===(t==null||(u=t.options)==null?void 0:u.name)?s:void 0)||(k(f,s)?f:t?void 0:s);if(p)return e.some(e=>{var i,a;return e!==t&&(e==null||(i=e.options)==null?void 0:i.name)===(o==null?void 0:o.from)&&(e==null||(a=e.shareScopeMap)==null?void 0:a[r])===n})?p:void 0},ee=(e,t,n,r,i,a,o,s,c)=>{let l=a.registered?A(e,t,n,r,i,a.version,a.provider,s,c):void 0,u=l||o;if(u&&(!a.registered||k(u,s)))return{provider:u,scopeRootProvider:l}};async function te(){return y||=x(()=>n(()=>import(`./assets/_virtual_mf-localSharedImportMap___mfe_internal__SatDisplay__mf_owner__1-Bp0DvNe1.js`),[],import.meta.url)).catch(e=>{throw y=void 0,e}),y}async function j(){return c}async function M(t={},n=[],r={}){var i,a;let o=(e,t,n,r)=>{let i=(Array.isArray(r)?r[0]:r)||`default`,a=t||!n?e:e+`@`+n,o={canonical:i+`:`+a};return i==="default"&&(o.aliases=[a]),o},s=(e,t)=>{let n=e[t.canonical];if(n!==void 0)return n;let r=t.aliases||[];for(let n of r){if(!Object.prototype.hasOwnProperty.call(e,n))continue;let r=e[n];if(r!==void 0)return e[t.canonical]=r,r}},c=Symbol.for(`module-federation.shared-cache-listeners`),l=Symbol.for(`module-federation.shared-cache-owners`),f=e=>{let t=e[l];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,l,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},y=(e,t)=>{var n;return(n=e[l])==null?void 0:n[t.canonical]},S=e=>{let t=[e,e==null?void 0:e.default];for(let e of t)if(e&&typeof e==`object`){for(let t of[`__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE`,`__TEST_INTERNALS`,`__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED`]){let n=e[t];if(n&&typeof n==`object`)return{internals:n}}if(typeof e.useState==`function`)return{hook:e.useState}}},C=(e,t)=>{if(e===t)return!0;let n=S(e),r=S(t);if(!n||!r)return!1;let i=n.internals,a=r.internals;return i!==void 0||a!==void 0?i!==void 0&&i===a:typeof n.hook==`function`&&n.hook===r.hook},w=(e,t,n,r)=>{var i;let a=s(e,t);if(a!==void 0&&C(a,n))return n;e[t.canonical]=n;let o=t.aliases||[];for(let t of o)Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0});let u=e[l];r===void 0?u&&delete u[t.canonical]:f(e)[t.canonical]=r;let d=(i=e[c])==null?void 0:i[t.canonical];if(d)for(let e of d)e(n);return n},T=Symbol.for(`module-federation.tree-shaking-shared-cache`),A=e=>{let t=e[T];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,T,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},j=(e,t,n,r)=>{if(!Array.isArray(n))return r;let i=[...new Set(n)].sort(),a=A(e),o=a[t.canonical]||=[],s=o.find(e=>e.providedExports.length===i.length&&e.providedExports.every((e,t)=>e===i[t]));return s?s.value=r:o.push({providedExports:i,value:r}),r},M=Symbol.for(`module-federation.tree-shaking-shared-selection-cache`),N=e=>{let t=e[M];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,M,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},P=(e,t,n)=>{var r;let i=s(e,t);return i===void 0?(r=e[M])==null||(r=r[t.canonical])==null?void 0:r[n]:i},F=(e,t,n,r)=>{let i=N(e),a=i[t.canonical]||=Object.create(null);return a[n]=r,r},I=((i=globalThis.__FEDERATION__)==null?void 0:i.__INSTANCES__)||[],L=(a=n.find(e=>e==null?void 0:e.from))==null?void 0:a.from,ne=I.find(e=>{var n,r;return(e==null||(n=e.options)==null?void 0:n.name)===L&&(e==null||(r=e.shareScopeMap)==null?void 0:r.default)===t})||I.find(e=>{var n,r;return(e==null||(n=e.options)==null?void 0:n.name)!==_&&(e==null||(r=e.shareScopeMap)==null?void 0:r.default)===t}),R=Object.create(null),re=e=>{let t=Object.create(null);for(let[n,r]of Object.entries(e||{}))t[n]=Object.assign(Object.create(null),r);return t},ie=(e,t)=>{var n;for(let[i,a]of Object.entries(((n=q.shareScopeMap)==null?void 0:n[e])||{}))for(let[e,n]of Object.entries(a||{})){var r;if(!n||n.get===((r=B[i])==null?void 0:r.get))continue;let a=t[i]||={};a[e]===void 0&&(a[e]=n)}},ae=(e,t)=>{ie(e,t);let n=!ne&&Object.values(t||{}).some(e=>Object.values(e||{}).some(V)),r=n?re(t):t;return R[e]={host:t,runtime:r,isWebpackScope:n},r},oe=()=>{let e=Object.values(R).filter(({isWebpackScope:e})=>e);if(e.length!==0)for(let{host:t,runtime:n}of e)for(let[e,r]of Object.entries(t||{})){let t=n[e]||=Object.create(null);for(let[e,n]of Object.entries(r||{}))t[e]=n}},z=Object.create(null);for(let[e,n]of Object.entries(t)){let t=z[e]=Object.create(null);for(let[e,r]of Object.entries(n))t[e]=Object.assign({},r)}let{usedShared:B,usedRemotes:se}=await te();function V(e){if(typeof(e==null?void 0:e.get)!=`function`)return!1;let t=Function.prototype.toString.call(e.get);return t.includes(`__webpack_require__`)||/\.\s*e\s*\([^)]*\)\s*\.then\s*\(/.test(t)}let ce=Object.values(z).some(e=>Object.values(e||{}).some(V)),le=e=>{let t=e.split(`/`);return e.startsWith(`@`)?t.slice(0,2).join(`/`):t[0]},H=(e,n,r,i)=>{if(typeof O!=`function`)return;let a=le(e),o=!i||a===e?[[e,n]]:[[e,n],[a,B[a]]];for(let[n,i]of o){if(!i)continue;let a=O(r?n===e?r:z[n]:z[n]??t[n],n,i,`version-first`);if(a)return a}},ue=(e,t,n)=>{let r=H(e,t,n,!0);return r&&V(r)&&!r.lib&&!r.loaded?r:void 0};var U=m[g];if(U||=m[g]={from:_},n.indexOf(U)>=0)return;n.push(U);let de=e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.getPrototypeOf(e);if(n!==null&&n!==Object.prototype)break;let r=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(r.length>0&&r.some(e=>e!==void 0))break;t=e}return t},fe=[],pe=globalThis.window===void 0?await Promise.all([]):[],W=`__mf_vite_runtime_share_load_id__`,me=0,G=new Map,K=new Map,q=e({name:_,remotes:se,shared:B,plugins:[he(),ge(),...fe,...pe],shareStrategy:`version-first`});q.initShareScopeMap(`default`,ae(`default`,t));function he(){return{name:`vite-share-pin-lifecycle-plugin`,resolveShare(e){var t;let n=(t=e.shareInfo)==null?void 0:t[W],r=n===void 0?void 0:K.get(n);if(!r)return e;let i=e.resolver;return e.resolver=(...e)=>(r.pinned.reapply(),i(...e)),r.pinned.reveal(),e}}}function ge(){return{name:`vite-real-name-snapshot-plugin`,afterLoadSnapshot(e){let t=e&&e.remoteSnapshot,n=t&&t.globalName,r=t&&t.version;if(!n||!r||!t.remoteEntry)return e;let i=globalThis.__FEDERATION__&&globalThis.__FEDERATION__.moduleInfo,a=n+`:`+r;return i&&!i[a]&&(i[a]=t),e}}}let _e=q.sharedHandler.hooks.lifecycle.resolveShare;if(!q.__mfKeepAdoptedProviders){var J,ve;q.__mfKeepAdoptedProviders=!0,(J=q.sharedHandler)==null||(J=J.hooks)==null||(J=J.lifecycle)==null||(J=J.afterRegisterShare)==null||(ve=J.on)==null||ve.call(J,e=>{var t,n,r;let{shared:i,previousShared:a,registeredShared:o}=e||{};if((i==null||(t=i.shareConfig)==null?void 0:t.import)!==!1||o!==i||!a||((n=a.shareConfig)==null?void 0:n.import)===!1)return;let s=(r=q.shareScopeMap)==null||(r=r[e.scope])==null?void 0:r[e.pkgName];s&&s[i.version]===i&&(s[i.version]=a)})}let Y=new WeakMap;_e.on(e=>{var t;let n=(t=e.shareInfo)==null?void 0:t[W],r=e.resolver;return typeof r==`function`&&(e.resolver=(...t)=>{var i;let a=r(...t);if((a==null||(i=a.shared)==null||(i=i.shareConfig)==null?void 0:i.import)===!1&&typeof D==`function`&&B[e.pkgName]){var o,s;let t=D((o=e.shareScopeMap)==null||(o=o[e.scope])==null?void 0:o[e.pkgName],e.pkgName,B[e.pkgName],`version-first`);t&&((s=t.shareConfig)==null?void 0:s.import)!==!1&&(a={shared:t,useTreesShaking:a.useTreesShaking})}let c=a==null?void 0:a.shared;return c&&(typeof c==`object`||typeof c==`function`)&&!Y.has(c)&&Y.set(c,{from:c.from}),n!==void 0&&c&&G.set(n,c),a}),e});let ye=(e,t,n,r)=>{if(!e||e[t]!==n)return;let i=Object.assign({},r,{version:r.version??t,scope:r.scope??(n==null?void 0:n.scope)??[`default`],strategy:`loaded-first`}),a=r.from;e[t]=i;let o=()=>n===void 0?e[t]===void 0:e[t]===n;return{provider:i,reveal(){return e[t]===i&&(n===void 0?delete e[t]:e[t]=n,!0)},reapply(){return o()?(e[t]=i,!0):!1},release(s,c=!0){return r.from=a,e[t]===i?c?s?(i.from=a,s&&i.lib&&(i.loaded=!0),r.strategy===void 0?delete i.strategy:i.strategy=r.strategy,!0):(n===void 0?delete e[t]:e[t]=n,!1):(n===void 0?delete e[t]:e[t]=n,!0):!c&&o()}}},be=e=>Object.entries(e||{}).map(([e,t])=>({provider:t,version:e,from:t.from,registered:!0})),xe=(e,t)=>{if(t===void 0)return;let n;for(let r of e){let e=r.provider,i=e.treeShaking||e;if(r.loadedFactory===t||e.lib===t||i.lib===t){if(n)return;n=r}}return n},Se=async(e,t,n)=>{let r=++me;K.set(r,{pinned:n});try{let n=await q.loadShare(e,{customShareInfo:{shareConfig:t,[W]:r}});return{factory:n===!1?void 0:n,selectedProvider:G.get(r)}}finally{G.delete(r),K.delete(r)}},Ce=async(e,t,n,r,i,a,o=!0)=>{let s=a.from,c=ye(n,r,i,a);if(!c)return;let l;try{l=await Se(e,t,c)}catch(e){throw c.release(!1),e}let u=l==null?void 0:l.factory;if(u===void 0){c.release(!1);return}let d=be(n),f=c.provider.treeShaking||c.provider,p=c.provider.lib===u||f.lib===u;if(!o&&p){let e=d.findIndex(e=>e.provider===c.provider);e!==-1&&d.splice(e,1)}!o&&!d.some(e=>e.provider===a)&&d.push({provider:a,version:r,from:s,registered:!1,loadedFactory:p?u:void 0});let m=!o&&l.selectedProvider===c.provider&&p?a:l.selectedProvider;if(m&&!d.some(e=>e.provider===m)){let e=Y.get(m),t=typeof m.version==`string`&&m.version?m.version:r;d.push({provider:m,version:t,from:e?e.from:m.from,registered:(n==null?void 0:n[t])===m,loadedFactory:u})}let h=d.find(e=>e.provider===m)??xe(d,u);if(!c.release(!0,(h==null?void 0:h.provider)===c.provider)||!h)return;let g=Y.get(h.provider);h.from=h.provider===a?s:g?g.from:h.provider.from,g&&(h.provider.from=g.from);let _=typeof u==`function`?u():u,v=await Promise.resolve(_);if(!(h.registered&&(n==null?void 0:n[h.version])!==h.provider))return{provider:h.provider,selection:h,resolved:v}},X=new Set,we=new Map,Te=async(e,n,r)=>{var i;let a=!!((i=n.shareConfig)!=null&&i.singleton);if(!a&&n.canLiveRebind!==!1)try{var c,l;let i=O(r,e,n,`version-first`),u=E(r,i);if(!u||((c=n.shareConfig)==null?void 0:c.import)===!1&&k(i,n)||(i==null||(l=i.shareConfig)==null?void 0:l.import)===!1)return;let{version:d}=u;if(!a&&d!==n.version||!i.lib&&!i.loading&&!(i.loaded&&typeof i.get==`function`))return;let f=o(e,a,n.version,n.scope);if(s(p.share,f)!==void 0)return;let m=t[e],h=m==null?void 0:m[d];if(u.registered&&!k(h,i))return;let g,_=i.lib;if(!_&&V(i)||(!_&&i.loading&&(_=await i.loading),!_&&i.loaded&&typeof i.get==`function`&&(_=await i.get()),!_))return;let v=typeof _==`function`?_():_,y=await Promise.resolve(v),b=u.registered?h:i;g={provider:b,selection:{provider:b,version:d,from:i.from,registered:u.registered},resolved:y};let x=g==null?void 0:g.provider,S=g==null?void 0:g.selection;if(!S)return;let C=g==null?void 0:g.resolved;if(C===void 0||s(p.share,f)!==void 0||S.registered&&(m==null?void 0:m[S.version])!==x)return;w(p.share,f,de(C),S.from),X.add(x)}catch(t){console.error(`[Module Federation] Failed to bridge materialized shared module "`+e+`"`,t)}},Ee=async(e,n,r,i,a)=>{try{var c,l,u,d;let f=o(e,(c=n.shareConfig)==null?void 0:c.singleton,n.version,n.scope),m=s(p.share,f),h=y(p.share,f),g=O(r,e,n,`version-first`),v=g||D(r,e,n,`version-first`)||n,b=E(r,v);if(!b)return;let x=k(v,n),{version:S}=b;if(!((l=n.shareConfig)!=null&&l.singleton)&&S!==n.version)return;let C=i==null?void 0:i[S],T=ee(I,ne,t,`default`,e,b,g,C,`version-first`);if(!T&&!x)return;let{provider:A,scopeRootProvider:te}=T||{provider:v,scopeRootProvider:void 0};if(n.canLiveRebind===!1||((u=n.shareConfig)==null?void 0:u.import)===!1&&k(A,n)||(A==null||(d=A.shareConfig)==null?void 0:d.import)===!1||m!==void 0&&h!==_)return;let j=t[e],M=j==null?void 0:j[S];if(b.registered&&!te&&!k(M,A))return;let N=await Ce(e,n.shareConfig,j,S,M,A,b.registered&&!x),P=N==null?void 0:N.provider,F=N==null?void 0:N.selection;if(!F||k(P,n)||a&&(a.version!==F.version||!k({from:F.from},a.provider))||X.has(P))return;let L=N==null?void 0:N.resolved;if(L===void 0)return;let R=s(p.share,f),re=y(p.share,f);if(R!==void 0&&re!==_||F.registered&&(j==null?void 0:j[F.version])!==P)return;a||we.set(e,{version:F.version,provider:{from:F.from}}),X.add(P);let ie=de(L);w(p.share,f,ie,F.from)}catch(t){console.error(`[Module Federation] Failed to bridge external shared module "`+e+`"`,t)}};for(let e of v)await Promise.all(e.map(async e=>{let t=B[e];t&&t.materialize!==!1&&!t.treeShaking&&await Te(e,t,z[e])}));for(let[e,t]of Object.entries(B)){var De;if(t.treeShaking)continue;let n=o(e,(De=t.shareConfig)==null?void 0:De.singleton,t.version,t.scope);if(s(p.share,n)!==void 0)continue;let r=o(e,!0,t.version,t.scope),i=s(p.share,r);i!==void 0&&w(p.share,n,i,y(p.share,r))}let Oe=[`react`,`react/jsx-runtime`,`react-dom`,`@emotion/react`,`react-dom/client`,`@emotion/styled`,`@mui/material`,`@mui/icons-material`,`@iobroker/gui-components`,`@iobroker/json-config`],ke=[[`react`],[`react/jsx-runtime`,`react-dom`,`@emotion/react`],[`react-dom/client`,`@emotion/styled`],[`@mui/material`],[`@mui/icons-material`],[`@iobroker/gui-components`],[`@iobroker/json-config`]],Z=new Map(Oe.map((e,t)=>[e,t])),Ae={1:[0],2:[0],3:[0],4:[0,2],5:[3,0],6:[3,5,0,2],7:[6,0],8:[0,2,7,6],9:[3,5,8,7,6,0,2]},Q=Oe.filter(e=>{var t;return B[e]&&(B[e].materialize!==!1||((t=B[e].shareConfig)==null?void 0:t.import)===!1&&!B[e].lazy)});p.providerInit||=new Map;let je=(e,t)=>{let n=p.providerInit.get(e);if(n)return n;let r=Promise.resolve().then(t);return p.providerInit.set(e,r),r.catch(()=>p.providerInit.delete(e)),r};var Me=async e=>{let t=new Set(e);for(let e of ke)await Promise.all(e.filter(e=>t.has(e)).map(async e=>{var t,n,r;let i=B[e],a=o(e,(t=i.shareConfig)==null?void 0:t.singleton,i.version,i.scope);if(((n=i.shareConfig)==null?void 0:n.import)===!1||i.treeShaking||s(p.share,a)!==void 0)return;let c=o(e,!0,i.version,i.scope),l=s(p.share,c);if(l!==void 0){w(p.share,a,l,y(p.share,c));return}let u=typeof H==`function`?H(e,i):void 0;if(u){var d,f;let t=u.lib;if(!t&&u.loading&&(t=await u.loading),!t&&u.loaded&&typeof u.get==`function`&&(t=await u.get()),t){let e=typeof t==`function`?t():t,n=await Promise.resolve(e);w(p.share,a,(e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.getPrototypeOf(e);if(n!==null&&n!==Object.prototype)break;let r=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(r.length>0&&r.some(e=>e!==void 0))break;t=e}return t})(n),u.from);return}if(typeof V==`function`&&V(u)&&((d=i.shareConfig)!=null&&d.singleton||((f=E(z[e],u))==null?void 0:f.version)===i.version))return}let m=a.canonical,h=await je(m,async()=>{let e=await i.get(),t=typeof e==`function`?e():e;return Promise.resolve(t)});for(let t of((r=q.options.shared)==null?void 0:r[e])||[])t.get===i.get&&(t.eager=!0);let g=(e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.getPrototypeOf(e);if(n!==null&&n!==Object.prototype)break;let r=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(r.length>0&&r.some(e=>e!==void 0))break;t=e}return t})(h),v=g===h?{...h}:g;v.__esModule!==!0&&Object.defineProperty(v,"__esModule",{value:!0,enumerable:!1}),w(p.share,a,v,_)}))};let $=e=>{var t,n;let r=B[e];if(!r.treeShaking&&((t=r.shareConfig)==null?void 0:t.import)!==!1)return!1;let i=o(e,(n=r.shareConfig)==null?void 0:n.singleton,r.version,r.scope);return r.treeShaking?P(p.share,i,_)===void 0&&s(p.share,i)===void 0:s(p.share,i)===void 0},Ne=e=>{var t,n;let r=B[e],i=o(e,(t=r.shareConfig)==null?void 0:t.singleton,r.version,r.scope);return(r.treeShaking?P(p.share,i,_)??s(p.share,i):s(p.share,i))===void 0?r.treeShaking||((n=r.shareConfig)==null?void 0:n.import)===!1?!0:typeof O==`function`&&!!O(z[e],e,r,`version-first`):!1},Pe=e=>{let t=!0;for(;t;){t=!1;for(let n of Q){let r=Z.get(n);e.has(r)||(Ae[r]||[]).some(t=>e.has(t))&&(e.add(r),t=!0)}}return e},Fe=Pe(new Set(Q.filter(Ne).map(e=>Z.get(e)))),Ie=Q.filter(e=>!Fe.has(Z.get(e)));var Le=Q.filter(e=>Fe.has(Z.get(e)));await Me(Ie);try{await x(async()=>{await Promise.all(await q.initializeSharing(`default`,{strategy:`version-first`,from:`build`,initScope:n}))})}catch(e){console.error(`[Module Federation]`,e)}oe();let Re=async()=>{for(let e of v)await Promise.all(e.map(async e=>{let n=B[e];n&&n.materialize!==!1&&!n.treeShaking&&await Ee(e,n,t[e],z[e],void 0)}))};ce?b=Re:await Re();try{var ze;let e=(ze=globalThis.__FEDERATION__)==null?void 0:ze.__SHARE__,t=Object.create(null);if(e)for(let[,n]of Object.entries(e))for(let e of h){let r=n==null?void 0:n[e];if(r)for(let[e,n]of Object.entries(r)){let r=B==null?void 0:B[e],i=z[e],a=we.get(e);if(!r||!i||!a||r.treeShaking)continue;let o=t[e]||(t[e]=Object.create(null));for(let[e,t]of Object.entries(n)){if(!t.lib||a.version!==e||!k(t,a.provider))continue;let n=i[e];(t===n||n!=null&&n.from&&t.from===n.from)&&(t===r||r.from&&t.from===r.from||o[e]===void 0&&(o[e]=t))}}}for(let e of v)await Promise.all(e.map(async e=>{let n=t[e];n&&await Ee(e,B[e],n,z[e],we.get(e))}))}catch(e){console.error(`[Module Federation] Failed to bridge external shared modules`,e)}let Be=async()=>{},Ve=async(e,n)=>{var r,i;let a=o(e,(r=n.shareConfig)==null?void 0:r.singleton,n.version,n.scope),c=n.treeShaking?P(p.share,a,_):s(p.share,a);if(((i=n.shareConfig)==null?void 0:i.import)!==!1||c!==void 0||ue(e,n,z[e]))return;let l=e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.getPrototypeOf(e);if(n!==null&&n!==Object.prototype)break;let r=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(r.length>0&&r.some(e=>e!==void 0))break;t=e}return t},u=t==null?void 0:t[e],d=D(u,e,n,`version-first`)||n,f=E(u,d);if(!f)return;let m=e=>{var t;return e===n||(e==null||(t=e.shareConfig)==null?void 0:t.import)===!1};if(m(d))return;let{version:h}=f,g=u==null?void 0:u[h],v=await Ce(e,n.shareConfig,u,h,g,d,f.registered),y=v==null?void 0:v.selection,b=v==null?void 0:v.provider,x=v==null?void 0:v.resolved;if(!y||m(b)||x===void 0||(n.treeShaking?P(p.share,a,_):s(p.share,a))!==void 0||y.registered&&(u==null?void 0:u[y.version])!==b)return;let S=l(x);if(n.treeShaking){let e=n.treeShaking.providedExports??n.treeShaking.usedExports??[];j(p.share,a,e,S),F(p.share,a,_,S)}else w(p.share,a,S,y.from)},He=[],Ue=new Set;for(let e of Le){let t=B[e],n=Z.get(e);if($(e))try{var We;t.treeShaking?await Be(e,t):((We=t.shareConfig)==null?void 0:We.import)===!1&&await Ve(e,t)}catch(t){console.error(`[Module Federation] Failed to resolve runtime-only shared module "${e}"`,t)}$(e)&&Ue.add(n)}Pe(Ue),He.push(...Le.filter(e=>!Ue.has(Z.get(e)))),await Me(He);let Ge=new Map;return u.loadLazyShares=async e=>{let n=new Set(e);for(let e of v)await Promise.all(e.filter(e=>n.has(e)).map(e=>{let n=B[e];if(!n||!n.lazy||!$(e))return;let r=Ge.get(e);return r||(r=Ee(e,n,t[e],z[e],void 0).then(()=>$(e)?Ve(e,n):void 0),r.catch(()=>Ge.delete(e)),Ge.set(e,r)),r}))},d(q),q}async function N(e){let t=await j();if(!(e in t))throw Error(`[Module Federation] Module ${e} does not exist in container.`);return b&&await b(),p.pendingShareLoads&&await Promise.all(p.pendingShareLoads),t[e]().then(e=>()=>e)}export{N as get,M as init};
2
2
  if (typeof document !== 'undefined' && document.head) {
3
3
  try {
4
4
  for (const __mfWarmupPath of ["assets/_virtual_mf-localSharedImportMap___mfe_internal__SatDisplay__mf_owner__1-Bp0DvNe1.js","assets/dist-ClWhWsnT.js","assets/vite-preload-helper-D97eqSzU.js","assets/utils-BLvN1RVq.js"]) {
@@ -29,5 +29,12 @@
29
29
  "sd_satellite": "Satellit",
30
30
  "sd_not_configured": "nicht in der Liste der Satelliten",
31
31
  "sd_how": "Eine freie Zelle anklicken fügt eine Kachel hinzu, eine Kachel ziehen verschiebt sie. Die Vorschau zeigt die aktuellen Werte; die Farben des Satelliten können leicht abweichen.",
32
- "sd_disabled_count": "%s inaktive Kachel(n) auf dieser Seite werden nicht gezeigt."
32
+ "sd_disabled_count": "%s inaktive Kachel(n) auf dieser Seite werden nicht gezeigt.",
33
+ "sd_kind_thermostat": "Thermostat mit Sollwert",
34
+ "sd_current_state": "Ist-Temperatur",
35
+ "sd_target_state": "Soll-Temperatur",
36
+ "sd_relay_state": "Heizungsrelais (optional, der Punkt)",
37
+ "sd_step": "Schrittweite von − / +",
38
+ "sd_bad_size": "Diese Art gibt es nicht in dieser Größe, die Kachel wird weggelassen: andere Größe wählen oder auf der Seite Platz schaffen.",
39
+ "sd_need_target": "Ein Thermostat braucht den Datenpunkt der Soll-Temperatur, bis dahin wird die Kachel weggelassen."
33
40
  }
@@ -29,5 +29,12 @@
29
29
  "sd_satellite": "Satellite",
30
30
  "sd_not_configured": "not in the list of satellites",
31
31
  "sd_how": "Click a free cell to add a tile, drag a tile to move it. The preview shows the current values; the colours of the satellite may differ a little.",
32
- "sd_disabled_count": "%s inactive tile(s) on this page are not shown."
32
+ "sd_disabled_count": "%s inactive tile(s) on this page are not shown.",
33
+ "sd_kind_thermostat": "Thermostat",
34
+ "sd_current_state": "Current temperature",
35
+ "sd_target_state": "Target temperature",
36
+ "sd_relay_state": "Heating relay (optional, the dot)",
37
+ "sd_step": "Step of − / +",
38
+ "sd_bad_size": "This kind does not come in this size, the tile is left out: choose another size, or make room on the page.",
39
+ "sd_need_target": "A thermostat needs the state of its target temperature, the tile is left out until it has one."
33
40
  }
@@ -29,5 +29,12 @@
29
29
  "sd_satellite": "Satélite",
30
30
  "sd_not_configured": "no está en la lista de satélites",
31
31
  "sd_how": "Haga clic en una celda libre para añadir un mosaico, arrastre un mosaico para moverlo. La vista previa muestra los valores actuales; los colores del satélite pueden variar un poco.",
32
- "sd_disabled_count": "%s mosaico(s) inactivo(s) en esta página no se muestran."
32
+ "sd_disabled_count": "%s mosaico(s) inactivo(s) en esta página no se muestran.",
33
+ "sd_kind_thermostat": "Termostato",
34
+ "sd_current_state": "Temperatura actual",
35
+ "sd_target_state": "Temperatura deseada",
36
+ "sd_relay_state": "Relé de la calefacción (opcional, el punto)",
37
+ "sd_step": "Paso de − / +",
38
+ "sd_bad_size": "Este tipo no existe en este tamaño, el mosaico se omite: elija otro tamaño o libere espacio en la página.",
39
+ "sd_need_target": "Un termostato necesita el estado de la temperatura deseada, hasta entonces el mosaico se omite."
33
40
  }
@@ -29,5 +29,12 @@
29
29
  "sd_satellite": "Satellite vocal",
30
30
  "sd_not_configured": "absent de la liste des satellites",
31
31
  "sd_how": "Cliquez sur une case libre pour ajouter une tuile, faites glisser une tuile pour la déplacer. L'aperçu montre les valeurs actuelles ; les couleurs du satellite peuvent différer un peu.",
32
- "sd_disabled_count": "%s tuile(s) inactive(s) sur cette page ne sont pas affichées."
32
+ "sd_disabled_count": "%s tuile(s) inactive(s) sur cette page ne sont pas affichées.",
33
+ "sd_kind_thermostat": "Thermostat d'ambiance",
34
+ "sd_current_state": "Température actuelle",
35
+ "sd_target_state": "Température de consigne",
36
+ "sd_relay_state": "Relais du chauffage (facultatif, le point)",
37
+ "sd_step": "Pas de − / +",
38
+ "sd_bad_size": "Ce type n'existe pas dans cette taille, la tuile est omise : choisissez une autre taille ou libérez de la place sur la page.",
39
+ "sd_need_target": "Un thermostat a besoin de l'état de la température de consigne, la tuile est omise jusque-là."
33
40
  }
@@ -29,5 +29,12 @@
29
29
  "sd_satellite": "Satellite vocale",
30
30
  "sd_not_configured": "non nell'elenco dei satelliti",
31
31
  "sd_how": "Fai clic su una cella libera per aggiungere un riquadro, trascina un riquadro per spostarlo. L'anteprima mostra i valori attuali; i colori del satellite possono differire un po'.",
32
- "sd_disabled_count": "%s riquadro/i inattivo/i in questa pagina non sono mostrati."
32
+ "sd_disabled_count": "%s riquadro/i inattivo/i in questa pagina non sono mostrati.",
33
+ "sd_kind_thermostat": "Termostato",
34
+ "sd_current_state": "Temperatura attuale",
35
+ "sd_target_state": "Temperatura desiderata",
36
+ "sd_relay_state": "Relè del riscaldamento (facoltativo, il punto)",
37
+ "sd_step": "Passo di − / +",
38
+ "sd_bad_size": "Questo tipo non esiste in questa dimensione, il riquadro viene omesso: scegli un'altra dimensione o libera spazio nella pagina.",
39
+ "sd_need_target": "Un termostato ha bisogno dello stato della temperatura desiderata, fino ad allora il riquadro viene omesso."
33
40
  }
@@ -29,5 +29,12 @@
29
29
  "sd_satellite": "Satelliet",
30
30
  "sd_not_configured": "niet in de lijst met satellieten",
31
31
  "sd_how": "Klik op een vrije cel om een tegel toe te voegen, sleep een tegel om hem te verplaatsen. De voorvertoning toont de huidige waarden; de kleuren van de satelliet kunnen iets afwijken.",
32
- "sd_disabled_count": "%s inactieve tegel(s) op deze pagina worden niet getoond."
32
+ "sd_disabled_count": "%s inactieve tegel(s) op deze pagina worden niet getoond.",
33
+ "sd_kind_thermostat": "Thermostaat",
34
+ "sd_current_state": "Huidige temperatuur",
35
+ "sd_target_state": "Gewenste temperatuur",
36
+ "sd_relay_state": "Verwarmingsrelais (optioneel, de stip)",
37
+ "sd_step": "Stap van − / +",
38
+ "sd_bad_size": "Dit soort bestaat niet in deze grootte, de tegel wordt weggelaten: kies een andere grootte of maak ruimte op de pagina.",
39
+ "sd_need_target": "Een thermostaat heeft de state van de gewenste temperatuur nodig, tot dan wordt de tegel weggelaten."
33
40
  }
@@ -29,5 +29,12 @@
29
29
  "sd_satellite": "Satelita",
30
30
  "sd_not_configured": "brak na liście satelitów",
31
31
  "sd_how": "Kliknij wolną komórkę, aby dodać kafelek, przeciągnij kafelek, aby go przenieść. Podgląd pokazuje bieżące wartości; kolory na satelicie mogą się nieco różnić.",
32
- "sd_disabled_count": "Nieaktywne kafelki na tej stronie, które nie są pokazane: %s."
32
+ "sd_disabled_count": "Nieaktywne kafelki na tej stronie, które nie są pokazane: %s.",
33
+ "sd_kind_thermostat": "Termostat z nastawą",
34
+ "sd_current_state": "Temperatura bieżąca",
35
+ "sd_target_state": "Temperatura zadana",
36
+ "sd_relay_state": "Przekaźnik ogrzewania (opcjonalnie, kropka)",
37
+ "sd_step": "Krok − / +",
38
+ "sd_bad_size": "Ten rodzaj nie występuje w tym rozmiarze, kafelek zostanie pominięty: wybierz inny rozmiar lub zwolnij miejsce na stronie.",
39
+ "sd_need_target": "Termostat potrzebuje stanu temperatury zadanej, do tego czasu kafelek jest pomijany."
33
40
  }
@@ -29,5 +29,12 @@
29
29
  "sd_satellite": "Satélite",
30
30
  "sd_not_configured": "não está na lista de satélites",
31
31
  "sd_how": "Clique numa célula livre para adicionar um mosaico, arraste um mosaico para o mover. A pré-visualização mostra os valores atuais; as cores do satélite podem diferir um pouco.",
32
- "sd_disabled_count": "%s mosaico(s) inativo(s) nesta página não são mostrados."
32
+ "sd_disabled_count": "%s mosaico(s) inativo(s) nesta página não são mostrados.",
33
+ "sd_kind_thermostat": "Termostato",
34
+ "sd_current_state": "Temperatura atual",
35
+ "sd_target_state": "Temperatura desejada",
36
+ "sd_relay_state": "Relé do aquecimento (opcional, o ponto)",
37
+ "sd_step": "Passo de − / +",
38
+ "sd_bad_size": "Este tipo não existe neste tamanho, o bloco é omitido: escolha outro tamanho ou liberte espaço na página.",
39
+ "sd_need_target": "Um termóstato precisa do estado da temperatura desejada, até lá o bloco é omitido."
33
40
  }
@@ -29,5 +29,12 @@
29
29
  "sd_satellite": "Сателлит",
30
30
  "sd_not_configured": "нет в списке сателлитов",
31
31
  "sd_how": "Нажмите на свободную клетку, чтобы добавить плитку, перетащите плитку, чтобы переместить. Превью показывает текущие значения; цвета на сателлите могут немного отличаться.",
32
- "sd_disabled_count": "Неактивных плиток на этой странице, которые не показаны: %s."
32
+ "sd_disabled_count": "Неактивных плиток на этой странице, которые не показаны: %s.",
33
+ "sd_kind_thermostat": "Термостат",
34
+ "sd_current_state": "Текущая температура",
35
+ "sd_target_state": "Заданная температура",
36
+ "sd_relay_state": "Реле отопления (необязательно, индикатор)",
37
+ "sd_step": "Шаг − / +",
38
+ "sd_bad_size": "Этот вид не бывает такого размера, плитка будет пропущена: выберите другой размер или освободите место на странице.",
39
+ "sd_need_target": "Термостату нужно состояние заданной температуры, без него плитка пропускается."
33
40
  }
@@ -29,5 +29,12 @@
29
29
  "sd_satellite": "Сателіт",
30
30
  "sd_not_configured": "немає у списку сателітів",
31
31
  "sd_how": "Натисніть на вільну клітинку, щоб додати плитку, перетягніть плитку, щоб перемістити. Попередній перегляд показує поточні значення; кольори на сателіті можуть трохи відрізнятися.",
32
- "sd_disabled_count": "Неактивних плиток на цій сторінці, які не показано: %s."
32
+ "sd_disabled_count": "Неактивних плиток на цій сторінці, які не показано: %s.",
33
+ "sd_kind_thermostat": "Термостат",
34
+ "sd_current_state": "Поточна температура",
35
+ "sd_target_state": "Задана температура",
36
+ "sd_relay_state": "Реле опалення (необов'язково, індикатор)",
37
+ "sd_step": "Крок − / +",
38
+ "sd_bad_size": "Цей вид не буває такого розміру, плитку буде пропущено: виберіть інший розмір або звільніть місце на сторінці.",
39
+ "sd_need_target": "Термостату потрібен стан заданої температури, без нього плитка пропускається."
33
40
  }
@@ -29,5 +29,12 @@
29
29
  "sd_satellite": "卫星设备",
30
30
  "sd_not_configured": "不在卫星设备列表中",
31
31
  "sd_how": "点击空白格添加磁贴,拖动磁贴可移动它。预览显示当前数值;卫星设备上的颜色可能略有不同。",
32
- "sd_disabled_count": "此页有 %s 个未启用的磁贴未显示。"
32
+ "sd_disabled_count": "此页有 %s 个未启用的磁贴未显示。",
33
+ "sd_kind_thermostat": "恒温器",
34
+ "sd_current_state": "当前温度",
35
+ "sd_target_state": "目标温度",
36
+ "sd_relay_state": "供暖继电器(可选,圆点)",
37
+ "sd_step": "− / + 的步长",
38
+ "sd_bad_size": "此类型没有这个尺寸,该磁贴将被忽略:请选择其他尺寸或在页面上腾出空间。",
39
+ "sd_need_target": "恒温器需要目标温度的状态,在此之前该磁贴将被忽略。"
33
40
  }
@@ -72,7 +72,7 @@
72
72
  "_tileEditor": {
73
73
  "type": "custom",
74
74
  "i18n": true,
75
- "url": "custom/customComponents.js",
75
+ "url": "custom/customComponents.js?v=0.0.3",
76
76
  "name": "SatDisplay/Components/TileEditor",
77
77
  "guiApi": 2,
78
78
  "bundlerType": "module",
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "satellite-display",
4
- "version": "0.0.1",
4
+ "version": "0.0.3",
5
5
  "news": {
6
+ "0.0.3": {
7
+ "en": "Small bar and chart tiles (1 x 1, satellite firmware 2.0.2); the editor marks tiles that would be left out",
8
+ "de": "Kleine Balken- und Verlaufskacheln (1 x 1, Satelliten-Firmware 2.0.2); der Editor markiert Kacheln, die weggelassen würden",
9
+ "ru": "Маленькие плитки с полосой и графиком (1 x 1, прошивка сателлита 2.0.2); редактор отмечает плитки, которые будут пропущены",
10
+ "pt": "Blocos pequenos de barra e gráfico (1 x 1, firmware do satélite 2.0.2); o editor marca os blocos que seriam omitidos",
11
+ "nl": "Kleine balk- en grafiektegels (1 x 1, satellietfirmware 2.0.2); de editor markeert tegels die zouden worden weggelaten",
12
+ "fr": "Petites tuiles barre et courbe (1 x 1, firmware du satellite 2.0.2) ; l'éditeur marque les tuiles qui seraient omises",
13
+ "it": "Piccoli riquadri con barra e grafico (1 x 1, firmware del satellite 2.0.2); l'editor segna i riquadri che verrebbero omessi",
14
+ "es": "Mosaicos pequeños de barra y gráfico (1 x 1, firmware del satélite 2.0.2); el editor marca los mosaicos que se omitirían",
15
+ "pl": "Małe kafelki z paskiem i wykresem (1 x 1, firmware satelity 2.0.2); edytor oznacza kafelki, które zostałyby pominięte",
16
+ "uk": "Малі плитки зі смугою та графіком (1 x 1, прошивка сателіта 2.0.2); редактор позначає плитки, які буде пропущено",
17
+ "zh-cn": "小型进度条和图表磁贴(1 x 1,卫星固件 2.0.2);编辑器会标记将被忽略的磁贴"
18
+ },
19
+ "0.0.2": {
20
+ "en": "Thermostat tile: current temperature, target with - and +, heating relay (satellite firmware 2.0.1)",
21
+ "de": "Thermostat-Kachel: Ist-Temperatur, Soll mit - und +, Heizungsrelais (Satelliten-Firmware 2.0.1)",
22
+ "ru": "Плитка термостата: текущая температура, заданная с - и +, реле отопления (прошивка сателлита 2.0.1)",
23
+ "pt": "Bloco de termostato: temperatura atual, alvo com - e +, relé do aquecimento (firmware do satélite 2.0.1)",
24
+ "nl": "Thermostaattegel: huidige temperatuur, doel met - en +, verwarmingsrelais (satellietfirmware 2.0.1)",
25
+ "fr": "Tuile thermostat : température actuelle, consigne avec - et +, relais du chauffage (firmware du satellite 2.0.1)",
26
+ "it": "Riquadro termostato: temperatura attuale, obiettivo con - e +, relè del riscaldamento (firmware del satellite 2.0.1)",
27
+ "es": "Mosaico de termostato: temperatura actual, objetivo con - y +, relé de la calefacción (firmware del satélite 2.0.1)",
28
+ "pl": "Kafelek termostatu: temperatura bieżąca, zadana z - i +, przekaźnik ogrzewania (firmware satelity 2.0.1)",
29
+ "uk": "Плитка термостата: поточна температура, задана з - і +, реле опалення (прошивка сателіта 2.0.1)",
30
+ "zh-cn": "恒温器磁贴:当前温度、用 - 和 + 调节的目标温度、供暖继电器(卫星固件 2.0.1)"
31
+ },
6
32
  "0.0.1": {
7
33
  "en": "First version: tile pages on the touch display of ESPHome voice satellites",
8
34
  "de": "Erste Version: Kachelseiten auf dem Touch-Display von ESPHome-Sprachsatelliten",
@@ -31,17 +57,17 @@
31
57
  "zh-cn": "卫星显示屏"
32
58
  },
33
59
  "desc": {
34
- "en": "Tile pages on the touch display of ESPHome voice satellites: values, gauges, charts, switches, dimmers and buttons bound to ioBroker states",
35
- "de": "Kachelseiten auf dem Touch-Display von ESPHome-Sprachsatelliten: Werte, Anzeigen, Verläufe, Schalter, Dimmer und Tasten, verbunden mit ioBroker-Datenpunkten",
36
- "ru": "Страницы плиток на сенсорном дисплее голосовых сателлитов ESPHome: значения, шкалы, графики, выключатели, диммеры и кнопки, связанные с состояниями ioBroker",
37
- "pt": "Páginas de mosaicos no ecrã tátil de satélites de voz ESPHome: valores, mostradores, gráficos, interruptores, reguladores e botões ligados a estados do ioBroker",
38
- "nl": "Tegelpagina's op het aanraakscherm van ESPHome-spraaksatellieten: waarden, meters, grafieken, schakelaars, dimmers en knoppen gekoppeld aan ioBroker-states",
39
- "fr": "Pages de tuiles sur l'écran tactile des satellites vocaux ESPHome : valeurs, jauges, courbes, interrupteurs, variateurs et boutons liés aux états ioBroker",
40
- "it": "Pagine di riquadri sul display touch dei satelliti vocali ESPHome: valori, indicatori, grafici, interruttori, dimmer e pulsanti collegati agli stati di ioBroker",
41
- "es": "Páginas de mosaicos en la pantalla táctil de satélites de voz ESPHome: valores, indicadores, gráficos, interruptores, reguladores y botones vinculados a estados de ioBroker",
42
- "pl": "Strony kafelków na ekranie dotykowym satelitów głosowych ESPHome: wartości, wskaźniki, wykresy, przełączniki, ściemniacze i przyciski powiązane ze stanami ioBroker",
43
- "uk": "Сторінки плиток на сенсорному дисплеї голосових сателітів ESPHome: значення, шкали, графіки, вимикачі, димери та кнопки, пов'язані зі станами ioBroker",
44
- "zh-cn": "ESPHome 语音卫星触摸屏上的磁贴页面:与 ioBroker 状态绑定的数值、仪表、图表、开关、调光器和按钮"
60
+ "en": "Tile pages on the touch display of ESPHome voice satellites: values, gauges, charts, switches, dimmers, buttons and thermostats bound to ioBroker states",
61
+ "de": "Kachelseiten auf dem Touch-Display von ESPHome-Sprachsatelliten: Werte, Anzeigen, Verläufe, Schalter, Dimmer, Tasten und Thermostate, verbunden mit ioBroker-Datenpunkten",
62
+ "ru": "Страницы плиток на сенсорном дисплее голосовых сателлитов ESPHome: значения, шкалы, графики, выключатели, диммеры, кнопки и термостаты, связанные с состояниями ioBroker",
63
+ "pt": "Páginas de mosaicos no ecrã tátil de satélites de voz ESPHome: valores, mostradores, gráficos, interruptores, reguladores, botões e termóstatos ligados a estados do ioBroker",
64
+ "nl": "Tegelpagina's op het aanraakscherm van ESPHome-spraaksatellieten: waarden, meters, grafieken, schakelaars, dimmers, knoppen en thermostaten gekoppeld aan ioBroker-states",
65
+ "fr": "Pages de tuiles sur l'écran tactile des satellites vocaux ESPHome : valeurs, jauges, courbes, interrupteurs, variateurs, boutons et thermostats liés aux états ioBroker",
66
+ "it": "Pagine di riquadri sul display touch dei satelliti vocali ESPHome: valori, indicatori, grafici, interruttori, dimmer, pulsanti e termostati collegati agli stati di ioBroker",
67
+ "es": "Páginas de mosaicos en la pantalla táctil de satélites de voz ESPHome: valores, indicadores, gráficos, interruptores, reguladores, botones y termostatos vinculados a estados de ioBroker",
68
+ "pl": "Strony kafelków na ekranie dotykowym satelitów głosowych ESPHome: wartości, wskaźniki, wykresy, przełączniki, ściemniacze, przyciski i termostaty powiązane ze stanami ioBroker",
69
+ "uk": "Сторінки плиток на сенсорному дисплеї голосових сателітів ESPHome: значення, шкали, графіки, вимикачі, димери, кнопки та термостати, пов'язані зі станами ioBroker",
70
+ "zh-cn": "ESPHome 语音卫星触摸屏上的磁贴页面:与 ioBroker 状态绑定的数值、仪表、图表、开关、调光器、按钮和恒温器"
45
71
  },
46
72
  "authors": [
47
73
  "sadam6752-tech <sadam6752@gmail.com>"
package/lib/layout.js CHANGED
@@ -13,13 +13,17 @@ const SIZES = { s: [1, 1], q: [1, 2], w: [2, 1], l: [2, 2] };
13
13
  const TYPES = {
14
14
  value: ['s', 'q', 'w', 'l'],
15
15
  gauge: ['q', 'l'],
16
- bar: ['q', 'w', 'l'],
17
- chart: ['w', 'l'],
16
+ bar: ['s', 'q', 'w', 'l'],
17
+ chart: ['s', 'w', 'l'],
18
18
  switch: ['s', 'q', 'w'],
19
19
  dimmer: ['w', 'l'],
20
20
  button: ['s', 'q', 'w'],
21
+ thermostat: ['q', 'l'],
21
22
  };
22
23
 
24
+ /** Step of the - / + buttons of a thermostat when none is set */
25
+ const DEFAULT_STEP = 0.5;
26
+
23
27
  /** Icons the firmware has (components/tiles/tiles.cpp of the satellite firmware) */
24
28
  const ICONS = [
25
29
  'lightbulb',
@@ -82,9 +86,11 @@ const ICONS = [
82
86
  * @property {number} gridCol - Column 0..1 of the top left cell
83
87
  * @property {number} gridRow - Row 0..3 of the top left cell
84
88
  * @property {string} size - s, q, w or l
85
- * @property {string} type - value, gauge, bar, chart, switch, dimmer or button
86
- * @property {string} state - Bound state
87
- * @property {string} state2 - On/off state of a dimmer (optional)
89
+ * @property {string} type - value, gauge, bar, chart, switch, dimmer, button or thermostat
90
+ * @property {string} state - Bound state (the current temperature of a thermostat)
91
+ * @property {string} state2 - On/off state of a dimmer (optional), target temperature of a thermostat
92
+ * @property {string} state3 - Heating relay of a thermostat (optional)
93
+ * @property {number} step - Step of the - / + buttons of a thermostat
88
94
  * @property {string} label - Name on the tile, empty = name of the object
89
95
  * @property {string} unit - Unit, empty = unit of the object
90
96
  * @property {string} icon - Icon name or empty
@@ -223,6 +229,12 @@ function normalizeTiles(rows, satellites, problems) {
223
229
  problems.push(`${where}: no state chosen`);
224
230
  continue;
225
231
  }
232
+ const state2 = type === 'dimmer' || type === 'thermostat' ? String(row.state2 || '').trim() : '';
233
+ if (type === 'thermostat' && !state2) {
234
+ problems.push(`${where}: a thermostat needs the state of its target temperature`);
235
+ continue;
236
+ }
237
+ const step = numberOrNull(row.step);
226
238
  let icon = String(row.icon || '').trim();
227
239
  if (icon.startsWith('mdi:')) {
228
240
  icon = icon.slice(4);
@@ -242,7 +254,9 @@ function normalizeTiles(rows, satellites, problems) {
242
254
  size,
243
255
  type,
244
256
  state,
245
- state2: type === 'dimmer' ? String(row.state2 || '').trim() : '',
257
+ state2,
258
+ state3: type === 'thermostat' ? String(row.state3 || '').trim() : '',
259
+ step: step !== null && step > 0 ? step : DEFAULT_STEP,
246
260
  label: String(row.label || '').trim(),
247
261
  unit: String(row.unit || '').trim(),
248
262
  icon,
@@ -254,4 +268,15 @@ function normalizeTiles(rows, satellites, problems) {
254
268
  return result;
255
269
  }
256
270
 
257
- module.exports = { PAGES, SLOTS, SIZES, TYPES, ICONS, idOf, numberOrNull, normalizeSatellites, normalizeTiles };
271
+ module.exports = {
272
+ PAGES,
273
+ SLOTS,
274
+ SIZES,
275
+ TYPES,
276
+ ICONS,
277
+ DEFAULT_STEP,
278
+ idOf,
279
+ numberOrNull,
280
+ normalizeSatellites,
281
+ normalizeTiles,
282
+ };
package/lib/satellite.js CHANGED
@@ -7,6 +7,8 @@ const { EventEmitter } = require('node:events');
7
7
 
8
8
  /** The actions the firmware 2.0.0 brings (docs/TILES.md of the satellite firmware) */
9
9
  const TILE_ACTIONS = ['tile_set', 'tile_value', 'tile_text', 'tile_state', 'tile_history', 'tile_clear'];
10
+ /** Actions of newer firmware; without them the tiles that need them are left out */
11
+ const OPTIONAL_ACTIONS = { tile_setpoint: '2.0.1' };
10
12
 
11
13
  /** Argument types of ESPHome actions (ServiceArgType of api.proto) */
12
14
  const ARG = { BOOL: 0, INT: 1, FLOAT: 2, STRING: 3, BOOL_ARRAY: 4, INT_ARRAY: 5, FLOAT_ARRAY: 6, STRING_ARRAY: 7 };
@@ -268,6 +270,14 @@ class SatelliteLink extends EventEmitter {
268
270
  }
269
271
  }
270
272
 
273
+ /**
274
+ * @param {string} name - Action
275
+ * @returns {boolean} True when the firmware of the satellite has it
276
+ */
277
+ has(name) {
278
+ return this.actions.has(name);
279
+ }
280
+
271
281
  /**
272
282
  * Calls an action of the satellite.
273
283
  *
@@ -293,4 +303,13 @@ class SatelliteLink extends EventEmitter {
293
303
  }
294
304
  }
295
305
 
296
- module.exports = { SatelliteLink, TILE_ACTIONS, ARG, convertArg, parseTileInput, skipUnknownMessages, UnknownMessage };
306
+ module.exports = {
307
+ SatelliteLink,
308
+ TILE_ACTIONS,
309
+ OPTIONAL_ACTIONS,
310
+ ARG,
311
+ convertArg,
312
+ parseTileInput,
313
+ skipUnknownMessages,
314
+ UnknownMessage,
315
+ };
package/lib/values.js CHANGED
@@ -140,24 +140,50 @@ function switchValue(on, common) {
140
140
  return on;
141
141
  }
142
142
 
143
+ /**
144
+ * The target temperature a thermostat tile asks for, on the grid of its step and within the range of the object.
145
+ *
146
+ * @param {number} value - Setpoint from the satellite
147
+ * @param {number} step - Step of the - / + buttons
148
+ * @param {Partial<ioBroker.StateCommon>} common - Common part of the object of the target temperature
149
+ * @returns {number} Value to write
150
+ */
151
+ function setpointValue(value, step, common) {
152
+ let v = step > 0 ? Math.round(value / step) * step : value;
153
+ if (typeof common.min === 'number') {
154
+ v = Math.max(common.min, v);
155
+ }
156
+ if (typeof common.max === 'number') {
157
+ v = Math.min(common.max, v);
158
+ }
159
+ // no 21.500000000000004
160
+ return Math.round(v * 1000) / 1000;
161
+ }
162
+
143
163
  /**
144
164
  * The arguments of tile_set for a tile, the empty fields filled from the object of its state.
145
165
  *
146
166
  * @param {import('./layout').Tile} tile - Tile from the settings
147
167
  * @param {ioBroker.Object | null | undefined} obj - Object of its state
148
168
  * @param {string} lang - Language of the system
169
+ * @param {ioBroker.Object | null} [obj2] - Object of the second state (the target temperature of a thermostat)
149
170
  * @returns {Record<string, string | number>} Arguments of tile_set
150
171
  */
151
- function tileArgs(tile, obj, lang) {
172
+ function tileArgs(tile, obj, lang, obj2) {
152
173
  const common = /** @type {Partial<ioBroker.StateCommon>} */ (obj?.common || {});
174
+ const common2 = /** @type {Partial<ioBroker.StateCommon>} */ (obj2?.common || {});
153
175
  let label = tile.label || nameOf(common.name, lang) || tile.state.split('.').pop() || '';
154
176
  label = label.slice(0, 24);
155
- const unit = (tile.type === 'dimmer' ? '' : tile.unit || common.unit || '').slice(0, 8);
177
+ const unit = (tile.type === 'dimmer' ? '' : tile.unit || common.unit || common2.unit || '').slice(0, 8);
156
178
  let min = tile.min;
157
179
  let max = tile.max;
158
180
  if (tile.type === 'gauge' || tile.type === 'bar') {
159
181
  min ??= typeof common.min === 'number' ? common.min : 0;
160
182
  max ??= typeof common.max === 'number' ? common.max : 100;
183
+ } else if (tile.type === 'thermostat') {
184
+ // the scale of the arc and the limits of the target: from the object of the target temperature
185
+ min ??= typeof common2.min === 'number' ? common2.min : 5;
186
+ max ??= typeof common2.max === 'number' ? common2.max : 30;
161
187
  } else if (tile.type === 'chart') {
162
188
  // equal values: the chart scales itself
163
189
  min ??= 0;
@@ -197,5 +223,6 @@ module.exports = {
197
223
  levelPercent,
198
224
  levelValue,
199
225
  switchValue,
226
+ setpointValue,
200
227
  tileArgs,
201
228
  };
package/main.js CHANGED
@@ -7,10 +7,19 @@
7
7
  */
8
8
 
9
9
  const utils = require('@iobroker/adapter-core');
10
- const { SatelliteLink } = require('./lib/satellite');
10
+ const { SatelliteLink, OPTIONAL_ACTIONS } = require('./lib/satellite');
11
11
  const { normalizeSatellites, normalizeTiles } = require('./lib/layout');
12
12
  const { NAMES } = require('./lib/names');
13
- const { toNumber, isOn, textOf, levelPercent, levelValue, switchValue, tileArgs } = require('./lib/values');
13
+ const {
14
+ toNumber,
15
+ isOn,
16
+ textOf,
17
+ levelPercent,
18
+ levelValue,
19
+ switchValue,
20
+ setpointValue,
21
+ tileArgs,
22
+ } = require('./lib/values');
14
23
 
15
24
  /** After a touch the tile shows the real state again after this time (when the device did not follow) */
16
25
  const RESYNC_MS = 3000;
@@ -27,7 +36,8 @@ const CHART_POINTS = 60;
27
36
  * @property {Tile} tile - The tile
28
37
  * @property {Record<string, string | number>} args - Its tile_set arguments
29
38
  * @property {Partial<ioBroker.StateCommon>} common - Common part of the object of its state
30
- * @property {Partial<ioBroker.StateCommon>} common2 - Common part of the object of the on/off state of a dimmer
39
+ * @property {Partial<ioBroker.StateCommon>} common2 - Common part of the object of the second state (on/off of a
40
+ * dimmer, target temperature of a thermostat)
31
41
  * @property {number} lastLevel - Last level above 0 of a dimmer (switched on again with it)
32
42
  */
33
43
 
@@ -54,6 +64,8 @@ class SatelliteDisplay extends utils.Adapter {
54
64
  this.stopping = false;
55
65
  /** @type {Set<string>} read-only states already reported */
56
66
  this.readOnlyWarned = new Set();
67
+ /** @type {Set<string>} satellites already told that their firmware is too old for a tile */
68
+ this.oldFirmwareWarned = new Set();
57
69
  }
58
70
 
59
71
  async onReady() {
@@ -178,16 +190,19 @@ class SatelliteDisplay extends utils.Adapter {
178
190
  for (const tile of tiles) {
179
191
  const obj = await objectOf(tile.state);
180
192
  const obj2 = tile.state2 ? await objectOf(tile.state2) : null;
193
+ if (tile.state3) {
194
+ await objectOf(tile.state3);
195
+ }
181
196
  /** @type {Bound} */
182
197
  const b = {
183
198
  tile,
184
- args: tileArgs(tile, obj, this.lang),
199
+ args: tileArgs(tile, obj, this.lang, obj2),
185
200
  common: /** @type {Partial<ioBroker.StateCommon>} */ (obj?.common || {}),
186
201
  common2: /** @type {Partial<ioBroker.StateCommon>} */ (obj2?.common || {}),
187
202
  lastLevel: 100,
188
203
  };
189
204
  this.bound.push(b);
190
- for (const id of [tile.state, tile.state2].filter(Boolean)) {
205
+ for (const id of [tile.state, tile.state2, tile.state3].filter(Boolean)) {
191
206
  const list = this.byState.get(id) || [];
192
207
  list.push(b);
193
208
  this.byState.set(id, list);
@@ -230,7 +245,7 @@ class SatelliteDisplay extends utils.Adapter {
230
245
  return;
231
246
  }
232
247
  link.call('tile_clear', { page: 0 });
233
- const mine = this.bound.filter(b => b.tile.satellite === sat.id);
248
+ const mine = this.bound.filter(b => b.tile.satellite === sat.id && this.supported(sat, link, b));
234
249
  for (const b of mine) {
235
250
  link.call('tile_set', b.args);
236
251
  }
@@ -242,6 +257,28 @@ class SatelliteDisplay extends utils.Adapter {
242
257
  }
243
258
  }
244
259
 
260
+ /**
261
+ * A thermostat needs the action tile_setpoint of a newer firmware; without it the tile is left out.
262
+ *
263
+ * @param {SatelliteConfig} sat - Satellite
264
+ * @param {SatelliteLink} link - Its connection
265
+ * @param {Bound} b - Tile
266
+ * @returns {boolean} True when the firmware can show the tile
267
+ */
268
+ supported(sat, link, b) {
269
+ if (b.tile.type !== 'thermostat' || link.has('tile_setpoint')) {
270
+ return true;
271
+ }
272
+ const key = `${sat.id}/tile_setpoint`;
273
+ if (!this.oldFirmwareWarned.has(key)) {
274
+ this.oldFirmwareWarned.add(key);
275
+ this.log.warn(
276
+ `${sat.name}: a thermostat tile needs the satellite firmware ${OPTIONAL_ACTIONS.tile_setpoint} or newer, it is left out`,
277
+ );
278
+ }
279
+ return false;
280
+ }
281
+
245
282
  /**
246
283
  * Sends the current values of a tile.
247
284
  *
@@ -254,9 +291,9 @@ class SatelliteDisplay extends utils.Adapter {
254
291
  try {
255
292
  const state = await this.getForeignStateAsync(b.tile.state);
256
293
  this.push(b, b.tile.state, state?.val);
257
- if (b.tile.state2) {
258
- const state2 = await this.getForeignStateAsync(b.tile.state2);
259
- this.push(b, b.tile.state2, state2?.val);
294
+ for (const id of [b.tile.state2, b.tile.state3].filter(Boolean)) {
295
+ const other = await this.getForeignStateAsync(id);
296
+ this.push(b, id, other?.val);
260
297
  }
261
298
  } catch (e) {
262
299
  this.log.debug(`Reading ${b.tile.state} failed: ${e.message}`);
@@ -314,6 +351,24 @@ class SatelliteDisplay extends utils.Adapter {
314
351
  link.call('tile_state', { page, slot, on: isOn(val) });
315
352
  }
316
353
  break;
354
+ case 'thermostat':
355
+ // one state can be bound twice (e.g. the target as the current value too): send each meaning
356
+ if (id === b.tile.state) {
357
+ const n = toNumber(val);
358
+ if (n !== null) {
359
+ link.call('tile_value', { page, slot, value: n });
360
+ }
361
+ }
362
+ if (id === b.tile.state2 && link.has('tile_setpoint')) {
363
+ const n = toNumber(val);
364
+ if (n !== null) {
365
+ link.call('tile_setpoint', { page, slot, value: n, step: b.tile.step });
366
+ }
367
+ }
368
+ if (id === b.tile.state3) {
369
+ link.call('tile_state', { page, slot, on: isOn(val) });
370
+ }
371
+ break;
317
372
  default:
318
373
  break;
319
374
  }
@@ -426,6 +481,8 @@ class SatelliteDisplay extends utils.Adapter {
426
481
  b.lastLevel = input.value;
427
482
  }
428
483
  target = { id: tile.state, val: levelValue(input.value, b.common), common: b.common };
484
+ } else if (tile.type === 'thermostat' && input.input === 'setpoint') {
485
+ target = { id: tile.state2, val: setpointValue(input.value, tile.step, b.common2), common: b.common2 };
429
486
  } else if (tile.type === 'button' && input.input === 'press') {
430
487
  target = { id: tile.state, val: b.common.type === 'number' ? 1 : true, common: b.common };
431
488
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "iobroker.satellite-display",
3
- "version": "0.0.1",
4
- "description": "Tile pages on the touch display of ESPHome voice satellites: values, gauges, charts, switches, dimmers and buttons bound to ioBroker states",
3
+ "version": "0.0.3",
4
+ "description": "Tile pages on the touch display of ESPHome voice satellites: values, gauges, charts, switches, dimmers, buttons and thermostats bound to ioBroker states",
5
5
  "author": {
6
6
  "name": "sadam6752-tech",
7
7
  "email": "sadam6752@gmail.com"
@@ -1 +0,0 @@
1
- import"./_virtual_mf___mfe_internal__SatDisplay__mf_owner__180606781360439__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BtcMQbqk.js";import{$r as e,Dn as t,K as n,Mt as r,Qr as i,Qt as a,Sn as o,Yt as s,Zr as c,Zt as l,_ as u,cn as d,en as f,m as p,on as m,pt as h,rn as g,tn as _,zn as v}from"./_virtual_mf___mfe_internal__SatDisplay__mf_owner__180606781360439__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-B7AZpjV-.js";import{t as y}from"./_virtual_mf___mfe_internal__SatDisplay__mf_owner__180606781360439__loadShare__shared-B2hx53j0.js";var b={s:[1,1],q:[1,2],w:[2,1],l:[2,2]},x={value:[`s`,`q`,`w`,`l`],gauge:[`q`,`l`],bar:[`q`,`w`,`l`],chart:[`w`,`l`],switch:[`s`,`q`,`w`],dimmer:[`w`,`l`],button:[`s`,`q`,`w`]},S=`lightbulb.lamp.ceiling-light.power-plug.power.fan.radiator.thermometer.water-percent.flash.solar-power.battery.window-closed.window-open.door.garage.blinds.lock.lock-open.bell.television.movie.music.speaker.coffee.washing-machine.dishwasher.car.home.bed.sofa.shower.weather-sunny.weather-night.alarm.play.pause.stop.check.close`.split(`.`);function C(e,t){let n=e=>String(e||``).trim().toLowerCase().replace(/[^a-z0-9_-]+/g,`_`).replace(/^_+|_+$/g,``)||`satellite`;return n(e)===n(t)}function w(e,t,n){let[r,i]=b[e];return t>=0&&n>=0&&t+r<=2&&n+i<=4}function T(e,t){let[n,r]=b[e.size],[i,a]=b[t.size];return e.col<t.col+i&&t.col<e.col+n&&e.row<t.row+a&&t.row<e.row+r}function E(e,t,n,r,i,a,o=-1){return w(r,i,a)?!e.some((e,s)=>s!==o&&e.enabled!==!1&&C(e.satellite,t)&&Number(e.page)===n&&b[e.size]&&T(e,{size:r,col:i,row:a})):!1}function D(e,t,n,r,i=-1){for(let a=0;a<4;a++)for(let o=0;o<2;o++)if(E(e,t,n,r,o,a,i))return{col:o,row:a};return null}function O(e,t,n,r,i){return e.findIndex(e=>e.enabled!==!1&&C(e.satellite,t)&&Number(e.page)===n&&b[e.size]&&T(e,{size:`s`,col:r,row:i}))}function k(e,t,n){return e.map((e,t)=>({t:e,i:t})).filter(e=>e.t.enabled!==!1&&C(e.t.satellite,t)&&Number(e.t.page)===n).slice(8).map(e=>e.i)}function A(e,t,n,r){return{enabled:!0,satellite:e,page:t,col:n,row:r,size:`s`,type:`value`,state:``,state2:``,label:``,unit:``,icon:``,decimals:``,min:``,max:``}}var j=1.5,M=e=>Math.round(e*j),N=e=>6+e*157,P=e=>6+Math.floor(e*117/2),F={value:`sd_kind_value`,gauge:`sd_kind_gauge`,bar:`sd_kind_bar`,chart:`sd_kind_chart`,switch:`sd_kind_switch`,dimmer:`sd_kind_dimmer`,button:`sd_kind_button`},I={s:`1 × 1`,q:`1 × 2`,w:`2 × 1`,l:`2 × 2`},L={screen:`#0B1118`,tile:`#18212B`,tileOn:`#0C4A6E`,label:`#8A9AAC`,accent:`#38BDF8`,track:`#2E3A47`},R={TileEditor:class extends y{constructor(e){super(e),this.state={...this.state,satellite:``,page:1,selected:-1,pickFor:null,dragging:-1,values:{},names:{}}}async componentDidMount(){await super.componentDidMount();let e=this.satelliteNames();e.length&&this.setState({satellite:e[0]},()=>void this.readStates())}tiles(){let e=y.getValue(this.props.data,`tiles`);return Array.isArray(e)?e:[]}satelliteNames(){let e=y.getValue(this.props.data,`satellites`),t=(Array.isArray(e)?e:[]).map(e=>String((e==null?void 0:e.name)||``).trim()).filter(Boolean);for(let e of this.tiles()){let n=String(e.satellite||``).trim();n&&!t.some(e=>C(e,n))&&t.push(n)}return t}isConfigured(e){let t=y.getValue(this.props.data,`satellites`);return(Array.isArray(t)?t:[]).some(t=>C((t==null?void 0:t.name)||``,e))}setTiles(e,t=this.state.selected){this.setState({selected:t},()=>void this.onChange(`tiles`,e,()=>void this.readStates()))}update(e,t){let n=this.tiles().map((n,r)=>r===e?{...n,...t}:n);this.setTiles(n)}async readStates(){let e=this.props.oContext.socket,t=new Set;for(let e of this.pageTiles())for(let n of[e.tile.state,e.tile.state2])n&&!(n in this.state.values)&&t.add(n);if(!t.size)return;let n={},r={},i=u.getLanguage();for(let o of t)try{var a;let t=await e.getState(o);n[o]=t==null?void 0:t.val;let s=await e.getObject(o),c=s==null||(a=s.common)==null?void 0:a.name;r[o]=typeof c==`object`&&c?c[i]||c.en||``:String(c||``)}catch{n[o]=void 0}this.setState(e=>({values:{...e.values,...n},names:{...e.names,...r}}))}pageTiles(){return this.tiles().map((e,t)=>({tile:e,index:t})).filter(e=>e.tile.enabled!==!1&&C(e.tile.satellite,this.state.satellite)&&Number(e.tile.page)===this.state.page&&!!b[e.tile.size])}addAt(e,t){let n=[...this.tiles(),A(this.state.satellite,this.state.page,e,t)];this.setTiles(n,n.length-1)}moveTo(e,t,n){let r=this.tiles()[e];r&&E(this.tiles(),this.state.satellite,this.state.page,r.size,t,n,e)&&this.update(e,{col:t,row:n})}remove(e){this.setTiles(this.tiles().filter((t,n)=>n!==e),-1)}changeKind(e,t){let n=this.tiles()[e],{size:r,col:i,row:a}=n;if(!x[t].includes(r)){let o=x[t].find(t=>E(this.tiles(),n.satellite,Number(n.page),t,i,a,e));if(o)r=o;else for(let o of x[t]){let t=D(this.tiles(),n.satellite,Number(n.page),o,e);if(t){r=o,{col:i,row:a}=t;break}}}this.update(e,{type:t,size:r,col:i,row:a,state2:t===`dimmer`?n.state2:``})}changePage(e,t){let n=this.tiles()[e],r=D(this.tiles(),n.satellite,t,n.size,e);r&&(this.update(e,{page:t,...r}),this.setState({page:t}))}renderTileFace(t,n,r){let a=this.state.values[t.state],o=t.label||this.state.names[t.state]||t.state.split(`.`).pop()||u.t(`sd_no_state`),s=typeof a==`number`?a:NaN,l=t.unit&&t.type!==`dimmer`?` ${t.unit}`:``,d=a==null?`–`:typeof a==`number`?`${Number(a.toFixed(t.decimals===``||t.decimals===null?1:Number(t.decimals)))}${l}`:`${String(a)}${typeof a==`boolean`?``:l}`,f=t.type===`dimmer`&&t.state2?!!this.state.values[t.state2]:a===!0||typeof a==`number`&&a>0,p=t.min===``||t.min===null?0:Number(t.min),m=t.max===``||t.max===null?100:Number(t.max),h=Number.isFinite(s)&&m>p?Math.max(0,Math.min(1,(s-p)/(m-p))):.5,g=i(`div`,{style:{color:L.label,fontSize:M(10),whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`},children:o}),_=r>M(60),v=i(`div`,{style:{fontSize:M(_?22:14)},children:d}),y=i(`div`,{style:{width:M(26),height:M(14),borderRadius:M(7),background:f?L.accent:L.track,position:`relative`,flex:`none`},children:i(`div`,{style:{position:`absolute`,top:M(2),left:M(f?14:2),width:M(10),height:M(10),borderRadius:`50%`,background:`#fff`}})});switch(t.type){case`gauge`:{let t=M(56),n=t/2-M(4),r=Math.PI*2*n*.75;return e(c,{children:[g,e(`svg`,{width:t,height:t,style:{display:`block`,margin:`${M(2)}px auto 0`},children:[i(`circle`,{cx:t/2,cy:t/2,r:n,fill:`none`,stroke:L.track,strokeWidth:M(5),strokeDasharray:`${r} ${r*2}`,transform:`rotate(135 ${t/2} ${t/2})`,strokeLinecap:`round`}),i(`circle`,{cx:t/2,cy:t/2,r:n,fill:`none`,stroke:L.accent,strokeWidth:M(5),strokeDasharray:`${r*h} ${r*3}`,transform:`rotate(135 ${t/2} ${t/2})`,strokeLinecap:`round`}),i(`text`,{x:t/2,y:t/2+M(4),textAnchor:`middle`,fill:`#fff`,fontSize:M(11),children:d})]})]})}case`bar`:return e(c,{children:[g,v,i(`div`,{style:{height:M(5),background:L.track,borderRadius:M(3),marginTop:M(_?14:2)},children:i(`div`,{style:{width:`${h*100}%`,height:`100%`,background:L.accent,borderRadius:M(3)}})})]});case`chart`:return e(c,{children:[g,v,i(`svg`,{width:n-M(16),height:M(18),style:{display:`block`},children:i(`polyline`,{fill:`none`,stroke:L.accent,strokeWidth:2,points:[0,.6,.4,.7,.3,.5,.2,.45,.35].map((e,t)=>`${t*(n-M(16))/8},${e*M(18)}`).join(` `)})})]});case`switch`:return e(`div`,{style:{display:`flex`,alignItems:_?`flex-start`:`center`,gap:M(6),height:`100%`,flexDirection:_?`column`:`row`,justifyContent:`space-between`},children:[i(`div`,{style:{flex:1,minWidth:0},children:g}),i(`div`,{style:{alignSelf:`flex-end`},children:y})]});case`dimmer`:return e(`div`,{style:{display:`flex`,alignItems:`center`,gap:M(6),height:`100%`},children:[i(`div`,{style:{width:M(40),minWidth:0},children:g}),y,i(`div`,{style:{flex:1,height:M(5),background:L.track,borderRadius:M(3)},children:i(`div`,{style:{width:`${Number.isFinite(s)?Math.max(0,Math.min(100,s)):50}%`,height:`100%`,background:L.accent,borderRadius:M(3)}})}),i(`div`,{style:{fontSize:M(11),width:M(30),textAlign:`right`},children:Number.isFinite(s)?`${Math.round(s)} %`:`–`})]});case`button`:return e(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`center`,height:`100%`,gap:M(6),flexDirection:_?`column`:`row`},children:[t.icon?e(`span`,{style:{color:L.accent,fontSize:M(9)},children:[`◉ `,t.icon]}):null,i(`span`,{style:{fontSize:M(11)},children:o})]});default:return r<=M(53)&&n<=M(151)?e(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,height:`100%`},children:[i(`div`,{style:{minWidth:0,flex:1},children:g}),i(`div`,{style:{fontSize:M(13)},children:d})]}):e(c,{children:[g,v]})}}renderScreen(){let t=this.tiles(),n=new Set(k(t,this.state.satellite,this.state.page)),a=[];for(let e=0;e<4;e++)for(let n=0;n<2;n++)O(t,this.state.satellite,this.state.page,n,e)===-1&&a.push(i(f,{title:u.t(`sd_add_here`),children:i(`div`,{onClick:()=>this.addAt(n,e),onDragOver:e=>e.preventDefault(),onDrop:t=>{t.preventDefault(),this.moveTo(this.state.dragging,n,e)},style:{position:`absolute`,left:M(N(n)),top:M(P(e)),width:M(151),height:M(P(e+1)-6-P(e)),border:`1px dashed #3a4654`,borderRadius:M(8),display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#56657a`,cursor:`pointer`,boxSizing:`border-box`},children:i(r,{})})},`c${n}${e}`));return e(`div`,{style:{position:`relative`,width:M(320),height:M(240),background:L.screen,borderRadius:10,outline:`8px solid #2a2a2a`,margin:8,flex:`none`,fontFamily:`Roboto, sans-serif`},children:[a,this.pageTiles().map(({tile:e,index:t})=>{let[r,a]=b[e.size],o=M(r===2?308:151),s=M(P(e.row+a)-6-P(e.row)),c=t===this.state.selected,l=e.type===`switch`&&(this.state.values[e.state]===!0||Number(this.state.values[e.state])>0);return i(`div`,{draggable:!0,onDragStart:()=>this.setState({dragging:t,selected:t}),onDragEnd:()=>this.setState({dragging:-1}),onDragOver:e=>e.preventDefault(),onDrop:e=>{var t;e.preventDefault();let n=(t=e.currentTarget.parentElement)==null?void 0:t.getBoundingClientRect();if(n){let t=Math.min(1,Math.max(0,Math.floor((e.clientX-n.left)/M(157)))),r=Math.min(3,Math.max(0,Math.floor((e.clientY-n.top)/M(58.5))));this.moveTo(this.state.dragging,t,r)}},onClick:()=>this.setState({selected:t}),title:n.has(t)?u.t(`sd_too_many`):``,style:{position:`absolute`,left:M(N(e.col)),top:M(P(e.row)),width:o,height:s,boxSizing:`border-box`,padding:`${M(4)}px ${M(7)}px`,background:l?L.tileOn:L.tile,borderRadius:M(8),color:`#fff`,cursor:`grab`,overflow:`hidden`,border:`2px solid ${c?L.accent:n.has(t)?`#EF4444`:`transparent`}`,opacity:n.has(t)?.5:1,userSelect:`none`},children:this.renderTileFace(e,o,s)},t)})]})}renderStateField(n,r,a,o){return e(g,{sx:{display:`flex`,gap:1,alignItems:`center`},children:[i(s,{variant:`standard`,fullWidth:!0,label:u.t(o),value:r[a]||``,onChange:e=>this.update(n,{[a]:e.target.value})}),i(t,{size:`small`,title:u.t(`sd_pick_state`),onClick:()=>this.setState({pickFor:a}),children:i(h,{})})]})}renderPanel(){let t=this.state.selected,r=this.tiles()[t];if(!r||!C(r.satellite,this.state.satellite))return i(_,{variant:`body2`,sx:{opacity:.7,p:1},children:u.t(`sd_hint`)});let f=this.tiles(),p=e=>e===``?``:Number(e),h=r.type===`gauge`||r.type===`bar`||r.type===`chart`;return e(g,{sx:{display:`flex`,flexDirection:`column`,gap:1.5,minWidth:260,maxWidth:360,flex:1},children:[i(o,{control:i(d,{checked:r.enabled!==!1,onChange:e=>this.update(t,{enabled:e.target.checked})}),label:u.t(`sd_active`)}),i(s,{select:!0,variant:`standard`,label:u.t(`sd_kind`),value:r.type,onChange:e=>this.changeKind(t,e.target.value),children:Object.keys(x).map(e=>i(v,{value:e,children:u.t(F[e])},e))}),e(g,{children:[i(_,{variant:`caption`,sx:{opacity:.7},children:u.t(`sd_size`)}),i(a,{exclusive:!0,size:`small`,value:r.size,sx:{display:`flex`},onChange:(e,n)=>n&&this.update(t,{size:n}),children:x[r.type].map(e=>i(l,{value:e,sx:{flex:1},disabled:e!==r.size&&!E(f,r.satellite,Number(r.page),e,r.col,r.row,t),children:I[e]},e))})]}),this.renderStateField(t,r,`state`,r.type===`dimmer`?`sd_level_state`:`sd_state`),r.type===`dimmer`?this.renderStateField(t,r,`state2`,`sd_onoff_state`):null,e(g,{sx:{display:`flex`,gap:1},children:[i(s,{variant:`standard`,sx:{flex:2},label:u.t(`sd_label`),placeholder:this.state.names[r.state]||``,value:r.label||``,slotProps:{htmlInput:{maxLength:24}},onChange:e=>this.update(t,{label:e.target.value})}),r.type!==`dimmer`&&r.type!==`button`&&r.type!==`switch`?i(s,{variant:`standard`,sx:{flex:1},label:u.t(`sd_unit`),value:r.unit||``,slotProps:{htmlInput:{maxLength:8}},onChange:e=>this.update(t,{unit:e.target.value})}):null]}),r.type===`button`||r.type===`switch`&&r.size===`q`?e(s,{select:!0,variant:`standard`,label:u.t(`sd_icon`),value:r.icon||``,onChange:e=>this.update(t,{icon:e.target.value}),children:[i(v,{value:``,children:`–`}),S.map(e=>i(v,{value:e,children:e},e))]}):null,r.type===`value`||h?e(g,{sx:{display:`flex`,gap:1},children:[i(s,{variant:`standard`,type:`number`,sx:{flex:1},label:u.t(`sd_decimals`),value:r.decimals??``,slotProps:{htmlInput:{min:0,max:3}},onChange:e=>this.update(t,{decimals:p(e.target.value)})}),h?e(c,{children:[i(s,{variant:`standard`,type:`number`,sx:{flex:1},label:u.t(`sd_min`),value:r.min??``,onChange:e=>this.update(t,{min:p(e.target.value)})}),i(s,{variant:`standard`,type:`number`,sx:{flex:1},label:u.t(`sd_max`),value:r.max??``,onChange:e=>this.update(t,{max:p(e.target.value)})})]}):null]}):null,i(s,{select:!0,variant:`standard`,label:u.t(`sd_page`),value:Number(r.page),onChange:e=>this.changePage(t,Number(e.target.value)),children:[1,2,3,4].map(e=>i(v,{value:e,disabled:e!==Number(r.page)&&!D(f,r.satellite,e,r.size,t),children:e},e))}),i(m,{color:`error`,variant:`outlined`,startIcon:i(n,{}),onClick:()=>this.remove(t),children:u.t(`sd_delete`)})]})}renderPicker(){let e=this.state.selected,t=this.state.pickFor,n=this.tiles()[e];return!t||!n?null:i(p,{dialogName:`satelliteDisplayTile`,socket:this.props.oContext.socket,theme:this.props.oContext.theme,themeType:this.props.oContext.themeType,imagePrefix:`../..`,selected:n[t]||``,onClose:()=>this.setState({pickFor:null}),onOk:n=>{let r=Array.isArray(n)?n[0]:n;this.setState({pickFor:null}),r&&this.update(e,{[t]:r})}})}renderItem(){let t=this.satelliteNames();if(!t.length)return i(_,{sx:{p:2},children:u.t(`sd_no_satellites`)});let n=t.find(e=>C(e,this.state.satellite))||t[0],r=[1,2,3,4].map(e=>this.tiles().filter(t=>t.enabled!==!1&&C(t.satellite,n)&&Number(t.page)===e).length),o=this.tiles().filter(e=>e.enabled===!1&&C(e.satellite,n)&&Number(e.page)===this.state.page).length;return e(g,{sx:{width:`100%`},children:[e(g,{sx:{display:`flex`,gap:2,alignItems:`center`,flexWrap:`wrap`,mb:2},children:[i(s,{select:!0,variant:`standard`,label:u.t(`sd_satellite`),value:n,sx:{minWidth:180},onChange:e=>this.setState({satellite:e.target.value,selected:-1},()=>void this.readStates()),children:t.map(e=>i(v,{value:e,children:this.isConfigured(e)?e:`${e} (${u.t(`sd_not_configured`)})`},e))}),i(a,{exclusive:!0,size:`small`,value:this.state.page,onChange:(e,t)=>t&&this.setState({page:t,selected:-1},()=>void this.readStates()),children:Array.from({length:4},(e,t)=>t+1).map(t=>e(l,{value:t,children:[u.t(`sd_page`),` `,t,r[t-1]?` (${r[t-1]})`:``]},t))})]}),e(g,{sx:{display:`flex`,gap:3,alignItems:`flex-start`,flexWrap:`wrap`},children:[e(g,{children:[this.renderScreen(),e(_,{variant:`caption`,component:`div`,sx:{opacity:.7,mt:2,maxWidth:M(320)},children:[u.t(`sd_how`),o?` ${u.t(`sd_disabled_count`,o)}`:``]})]}),this.renderPanel()]}),this.renderPicker()]})}}};export{R as default};