diff --git a/devices/sensor/_sensor.1ino b/devices/sensor/_sensor.1ino deleted file mode 100644 index 5b23cbc..0000000 --- a/devices/sensor/_sensor.1ino +++ /dev/null @@ -1,291 +0,0 @@ -#include - -#include "ld2420_radar.h" -#include "bh1750_sensor.h" -#include "bme280_sensor.h" -#include "max4466_mic.h" - -/* - ========================= - GLOBAL OBJECTS - ========================= -*/ - -Ld2420Radar radar; -RadarConfig radar_config; - -Bh1750Sensor light_sensor; -Bh1750Config light_config; - -Bme280Sensor climate_sensor; -Bme280Config climate_config; - -Max4466Mic mic; -Max4466Config mic_config; - -/* - Отдельные I2C-шины. - 0-я шина для BH1750. - 1-я шина для BME/BMP280. -*/ -TwoWire i2c_climate = TwoWire(1); - -/* - Интервал печати состояния. -*/ -static const uint32_t print_interval_ms = 500; -uint32_t last_print_ms = 0; - - -/* - ========================= - RADAR CONFIGURATION - ========================= -*/ - -void setup_radar_config() { - /* ---- UART ---- */ - radar_config.uart_rx_pin = 4; - radar_config.uart_tx_pin = 15; - radar_config.baud_rate = 115200; - - /* ---- Присутствие и онлайн ---- */ - radar_config.presence_hold_ms = 1500; - radar_config.stale_after_ms = 2000; - radar_config.distance_ema_alpha = 0.6f; - - /* ---- Параметры, записываемые в радар при старте ---- */ - radar_config.min_gate = 1; // игнорировать ворота < 0.7 м - radar_config.max_gate = 8; // детекция до ~5.6 м - radar_config.radar_timeout_s = 5; - - /* ---- Пороги для записи в модуль (внутренняя логика радара) ---- */ - radar_config.move_threshold = 10000; - radar_config.still_threshold = 8000; - - /* - Пороги присутствия по воротам — вычисляется в прошивке, - поле pres из фрейма радара игнорируется. - - Настройка: - 1. Включи enable_debug_frames=true - 2. Посмотри [GATES] в пустой комнате - 3. Порог ворота = максимум_шума_этого_ворота * 2 - 4. g0 и g1 всегда 0 - - Текущие пороги подобраны под эту комнату: - g0-g1: шум антенны и фон — игнорируем - g2: шум до ~30 → порог 800 - g3: шум до ~220 → порог 500 (основной сигнал на 2 м) - g4-g6: высокий шум от помех в комнате → высокие пороги - g7+: малый шум → порог 2000 - */ - static const uint32_t thresholds[LD2420_TOTAL_GATES] = { - 0, // g0 ~0.0 м шум антенны - 0, // g1 ~0.7 м фоновый шум - 800, // g2 ~1.4 м - 500, // g3 ~2.1 м - 15000, // g4 ~2.8 м (помехи в комнате) - 25000, // g5 ~3.5 м (помехи в комнате) - 15000, // g6 ~4.2 м (помехи в комнате) - 2000, // g7 ~4.9 м - 2000, // g8 ~5.6 м - 500, // g9 - 500, // g10 - 500, // g11 - 500, // g12 - 500, // g13 - 500, // g14 - 500, // g15 - }; - memcpy(radar_config.presence_thresholds, thresholds, - sizeof(radar_config.presence_thresholds)); - - radar_config.presence_min_active_gates = 1; - - /* ---- activity_score ---- */ - radar_config.total_energy_max = 150000; - radar_config.activity_avg_window_s = 60; - radar_config.activity_trend_window_min = 10; - - /* ---- Отладка ---- */ - radar_config.enable_debug_frames = false; -} - - -/* - ========================= - BH1750 CONFIGURATION - ========================= -*/ - -void setup_light_config() { - /* - Отдельная шина освещённости: - SDA -> GPIO16 - SCL -> GPIO17 - ADDR -> VCC -> 0x5C - */ - light_config.sda_pin = 16; - light_config.scl_pin = 17; - light_config.i2c_address = 0x5C; - light_config.measurement_mode = 0x10; - light_config.stale_after_ms = 2000; - light_config.read_interval_ms = 200; - light_config.lux_ema_alpha = 0.25f; - light_config.lux_max = 500.0f; -} - - -/* - ========================= - BME/BMP280 CONFIGURATION - ========================= -*/ - -void setup_climate_config() { - /* - Отдельная климатическая шина: - SDA -> GPIO18 - SCL -> GPIO19 - SDO -> GND => 0x76 - SDO -> VCC => 0x77 - */ - climate_config.sda_pin = 18; - climate_config.scl_pin = 19; - climate_config.i2c_address = 0x76; - - climate_config.stale_after_ms = 3000; - climate_config.read_interval_ms = 1000; - - climate_config.temperature_ema_alpha = 0.25f; - climate_config.pressure_ema_alpha = 0.20f; - climate_config.humidity_ema_alpha = 0.20f; -} - - -/* - ========================= - MAX4466 CONFIGURATION - ========================= -*/ - -void setup_mic_config() { - /* - Аналоговый выход MAX4466 -> GPIO34 - GPIO34 — input only, ADC1_CH6, подходит для analogRead. - - Калибровка: - db_noise_floor — уровень тишины в вашем помещении (дБ). - db_scale_range_db — диапазон от тишины до максимума (дБ). - db_ref_mv — опорное напряжение для расчёта дБ. - - Стартовые значения подходят для большинства помещений. - Для точной калибровки: - 1. В тишине посмотрите db_raw в Serial — это ваш noise floor. - 2. При максимальном ожидаемом шуме посмотрите db_raw — - разница с noise floor и есть db_scale_range_db. - */ - mic_config.adc_pin = 34; - mic_config.adc_max_value = 4095; - mic_config.adc_vref_mv = 3300.0f; - - mic_config.sample_count = 256; - mic_config.sample_interval_us = 100; - - mic_config.read_interval_ms = 100; - mic_config.stale_after_ms = 2000; - - mic_config.db_ema_alpha = 0.15f; - mic_config.db_ref_mv = 1.0f; - mic_config.db_noise_floor = 30.0f; - mic_config.db_scale_range_db = 30.0f; - - mic_config.db_avg_window_s = 30; - mic_config.db_trend_window_min = 10; - - mic_config.peak_reset_ms = 60000; -} - - -/* - ========================= - DEVICE INITIALIZATION - ========================= -*/ - -void init_radar() { - setup_radar_config(); - bool ok = radar.begin(Serial2, radar_config); - if (ok) Serial.println("Radar configured and initialized"); - else Serial.println("Radar init failed — running with defaults"); -} - -void init_light_sensor() { - setup_light_config(); - bool ok = light_sensor.begin(light_config); - if (ok) Serial.println("BH1750 initialized"); - else Serial.println("BH1750 init failed"); -} - -void init_climate_sensor() { - setup_climate_config(); - bool ok = climate_sensor.begin(i2c_climate, climate_config); - if (ok) { - Serial.print("Climate sensor initialized: "); - Serial.println(climate_sensor.get_sensor_type_string()); - } else { - Serial.println("Climate sensor init failed"); - } -} - -void init_mic() { - setup_mic_config(); - mic.begin(mic_config); - Serial.println("MAX4466 initialized"); -} - - -/* - ========================= - SETUP - ========================= -*/ - -void setup() { - Serial.begin(115200); - delay(1000); - - Serial.println(); - Serial.println("Radar + BH1750 + BME/BMP280 + MAX4466 project start"); - - init_radar(); - init_light_sensor(); - init_climate_sensor(); - init_mic(); -} - - -/* - ========================= - LOOP - ========================= -*/ - -void loop() { - radar.update(); - light_sensor.update(); - climate_sensor.update(); - mic.update(); - - uint32_t now_ms = millis(); - - if (now_ms - last_print_ms >= print_interval_ms) { - last_print_ms = now_ms; - - Serial.println(radar.get_state_json()); - Serial.println(light_sensor.get_state_json()); - Serial.println(climate_sensor.get_state_json()); - Serial.println(mic.get_state_json()); - } -} diff --git a/webclient/dist/js/main.js b/webclient/dist/js/main.js index 86f4af7..4ce5006 100644 --- a/webclient/dist/js/main.js +++ b/webclient/dist/js/main.js @@ -1,4 +1,4 @@ -(()=>{var Oe=Object.defineProperty,ke=Object.defineProperties;var Ie=Object.getOwnPropertyDescriptors;var ae=Object.getOwnPropertySymbols;var Ne=Object.prototype.hasOwnProperty,xe=Object.prototype.propertyIsEnumerable;var ne=(a,e,t)=>e in a?Oe(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,v=(a,e)=>{for(var t in e||(e={}))Ne.call(e,t)&&ne(a,t,e[t]);if(ae)for(var t of ae(e))xe.call(e,t)&&ne(a,t,e[t]);return a},se=(a,e)=>ke(a,Ie(e));var re=(a,e,t)=>new Promise((n,s)=>{var r=o=>{try{i(t.next(o))}catch(l){s(l)}},c=o=>{try{i(t.throw(o))}catch(l){s(l)}},i=o=>o.done?n(o.value):Promise.resolve(o.value).then(r,c);i((t=t.apply(a,e)).next())});var h,T,D;function Re(){h.dataset.navState="displayed",h.classList.remove("state-off"),h.classList.add("state-on"),T.classList.add("a-show")}function P(){h.dataset.navState="hidden",h.classList.remove("state-on"),h.classList.add("state-off"),T.classList.add("a-hide"),T.classList.remove("a-show"),setTimeout(()=>{T.classList.remove("a-hide")},300)}function ie(){console.log("HUD init"),h=document.querySelector(".hud .nav-toggle"),T=document.querySelector(".hud .navigation"),D=document.querySelector(".hud .reload-screen"),h==null||h.addEventListener("click",a=>{a.currentTarget.dataset.navState!="displayed"?Re():P()}),D==null||D.addEventListener("click",a=>{Screens.reload()})}var M=class{constructor(e,t,n){this.screens={},this.routesMap={},this.currentScreen=null,this.eventsHandlers={switch:[],reload:[],reinit:[],errorScreen:[]},this.screensContainer=document.querySelector(e),this.loader=document.querySelector(t),this.errorScreen=document.querySelector(n),console.log("Screens Init")}add(e,t){if(typeof t!="object")return console.error("Screens: screens must be object");if(typeof(t==null?void 0:t.alias)=="undefined")return console.error("Screens: undefined alias");if(typeof(t==null?void 0:t.renderer)!="function")return console.error("Screens: renderer must be function");this.screens[t.alias]=v({route:e},t),this.routesMap[e]=t.alias}switch(e){var n;if(this.runSwitchHandlers(e),this.hideErrorScreen(),this.showLoader(),(n=this.currentScreen)==null||n.DOMObject.remove(),typeof this.screens[e]=="undefined"){console.error(`Screens: "${e}" not found`);return}this.currentScreen=this.screens[e];let t=document.createElement("div");t.classList.add("screen"),t.id=e,t.dataset.alias=e,t.innerHTML=this.currentScreen.renderer(),this.currentScreen.DOMObject=t,this.screensContainer.append(this.currentScreen.DOMObject),this.currentScreen.initer(this)}reload(){this.currentScreen&&(this.runReloadHandlers(this.currentScreen.alias),this.switch(this.currentScreen.alias))}reinit(){this.currentScreen&&(this.currentScreen.initer(this),this.runReinitHandlers())}routing(){setInterval(()=>{let e=document.location.hash.split("#!")[1];if(typeof e=="undefined"||e=="")return;let t=typeof this.routesMap[e]=="undefined"?"not-found-screen":this.routesMap[e];(!this.currentScreen||this.currentScreen.alias!=t)&&this.switch(t)},50)}ready(){this.currentScreen!=null&&(this.currentScreen.DOMObject||(this.currentScreen.DOMObject=document.getElementsById(this.currentScreen.alias)),this.hideLoader(),this.currentScreen.DOMObject.classList.add("a-show"))}error(e,t){var n;(n=this.currentScreen)==null||n.DOMObject.remove(),this.errorScreen.querySelector(".error-title").innerHTML=e,this.errorScreen.querySelector(".error-text").innerHTML=t,this.showErrorScreen(),this.runErrorScreenHandlers()}hideLoader(){this.loader.classList.remove("a-show")}showLoader(){this.loader.classList.add("a-show")}showErrorScreen(){this.errorScreen.classList.add("a-show")}hideErrorScreen(){this.errorScreen.classList.remove("a-show")}getScreens(){return this.screens}getRoutesMap(){return this.routesMap}onSwitch(e){this.eventsHandlers.switch.push(e)}onReaload(e){this.eventsHandlers.reload.push(e)}onReinit(e){this.eventsHandlers.reinit.push(e)}onErrorScreen(e){this.eventsHandlers.errorScreen.push(e)}runSwitchHandlers(e){let t=Object.keys(this.routesMap).filter(n=>this.routesMap[n]==e);for(let n of this.eventsHandlers.switch)n(this,e,t.length?t[0]:void 0)}runReloadHandlers(e){for(let t of this.eventsHandlers.reload)t(this,e)}runReinitHandlers(){for(let e of this.eventsHandlers.reinit)e(this)}runErrorScreenHandlers(){for(let e of this.eventsHandlers.errorScreen)e(this)}};var q=class{constructor(){this.data={}}set(e,t){this.data[e]=t}get(e){return this.data[e]}setRaw(e,t){this.set("raw."+e,t)}getRaw(e){return this.get("raw."+e)}};function je(a,e,t,n){return` +(()=>{var Oe=Object.defineProperty,ke=Object.defineProperties;var Ie=Object.getOwnPropertyDescriptors;var ae=Object.getOwnPropertySymbols;var Ne=Object.prototype.hasOwnProperty,xe=Object.prototype.propertyIsEnumerable;var ne=(a,e,t)=>e in a?Oe(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,h=(a,e)=>{for(var t in e||(e={}))Ne.call(e,t)&&ne(a,t,e[t]);if(ae)for(var t of ae(e))xe.call(e,t)&&ne(a,t,e[t]);return a},se=(a,e)=>ke(a,Ie(e));var re=(a,e,t)=>new Promise((n,s)=>{var r=o=>{try{i(t.next(o))}catch(l){s(l)}},c=o=>{try{i(t.throw(o))}catch(l){s(l)}},i=o=>o.done?n(o.value):Promise.resolve(o.value).then(r,c);i((t=t.apply(a,e)).next())});var v,T,D;function Re(){v.dataset.navState="displayed",v.classList.remove("state-off"),v.classList.add("state-on"),T.classList.add("a-show")}function P(){v.dataset.navState="hidden",v.classList.remove("state-on"),v.classList.add("state-off"),T.classList.add("a-hide"),T.classList.remove("a-show"),setTimeout(()=>{T.classList.remove("a-hide")},300)}function ie(){console.log("HUD init"),v=document.querySelector(".hud .nav-toggle"),T=document.querySelector(".hud .navigation"),D=document.querySelector(".hud .reload-screen"),v==null||v.addEventListener("click",a=>{a.currentTarget.dataset.navState!="displayed"?Re():P()}),D==null||D.addEventListener("click",a=>{Screens.reload()})}var M=class{constructor(e,t,n){this.screens={},this.routesMap={},this.currentScreen=null,this.eventsHandlers={switch:[],reload:[],reinit:[],errorScreen:[]},this.screensContainer=document.querySelector(e),this.loader=document.querySelector(t),this.errorScreen=document.querySelector(n),console.log("Screens Init")}add(e,t){if(typeof t!="object")return console.error("Screens: screens must be object");if(typeof(t==null?void 0:t.alias)=="undefined")return console.error("Screens: undefined alias");if(typeof(t==null?void 0:t.renderer)!="function")return console.error("Screens: renderer must be function");this.screens[t.alias]=h({route:e},t),this.routesMap[e]=t.alias}switch(e){var n;if(this.runSwitchHandlers(e),this.hideErrorScreen(),this.showLoader(),(n=this.currentScreen)==null||n.DOMObject.remove(),typeof this.screens[e]=="undefined"){console.error(`Screens: "${e}" not found`);return}this.currentScreen=this.screens[e];let t=document.createElement("div");t.classList.add("screen"),t.id=e,t.dataset.alias=e,t.innerHTML=this.currentScreen.renderer(),this.currentScreen.DOMObject=t,this.screensContainer.append(this.currentScreen.DOMObject),this.currentScreen.initer(this)}reload(){this.currentScreen&&(this.runReloadHandlers(this.currentScreen.alias),this.switch(this.currentScreen.alias))}reinit(){this.currentScreen&&(this.currentScreen.initer(this),this.runReinitHandlers())}routing(){setInterval(()=>{let e=document.location.hash.split("#!")[1];if(typeof e=="undefined"||e=="")return;let t=typeof this.routesMap[e]=="undefined"?"not-found-screen":this.routesMap[e];(!this.currentScreen||this.currentScreen.alias!=t)&&this.switch(t)},50)}ready(){this.currentScreen!=null&&(this.currentScreen.DOMObject||(this.currentScreen.DOMObject=document.getElementsById(this.currentScreen.alias)),this.hideLoader(),this.currentScreen.DOMObject.classList.add("a-show"))}error(e,t){var n;(n=this.currentScreen)==null||n.DOMObject.remove(),this.errorScreen.querySelector(".error-title").innerHTML=e,this.errorScreen.querySelector(".error-text").innerHTML=t,this.showErrorScreen(),this.runErrorScreenHandlers()}hideLoader(){this.loader.classList.remove("a-show")}showLoader(){this.loader.classList.add("a-show")}showErrorScreen(){this.errorScreen.classList.add("a-show")}hideErrorScreen(){this.errorScreen.classList.remove("a-show")}getScreens(){return this.screens}getRoutesMap(){return this.routesMap}onSwitch(e){this.eventsHandlers.switch.push(e)}onReaload(e){this.eventsHandlers.reload.push(e)}onReinit(e){this.eventsHandlers.reinit.push(e)}onErrorScreen(e){this.eventsHandlers.errorScreen.push(e)}runSwitchHandlers(e){let t=Object.keys(this.routesMap).filter(n=>this.routesMap[n]==e);for(let n of this.eventsHandlers.switch)n(this,e,t.length?t[0]:void 0)}runReloadHandlers(e){for(let t of this.eventsHandlers.reload)t(this,e)}runReinitHandlers(){for(let e of this.eventsHandlers.reinit)e(this)}runErrorScreenHandlers(){for(let e of this.eventsHandlers.errorScreen)e(this)}};var q=class{constructor(){this.data={}}set(e,t){this.data[e]=t}get(e){return this.data[e]}setRaw(e,t){this.set("raw."+e,t)}getRaw(e){return this.get("raw."+e)}};function je(a,e,t,n){return` `}};function lt(a){a.addEventListener("click",e=>{e.currentTarget.deviceStateComponent.create()})}function dt(a,e,t){return typeof me[a]!="undefined"?me[a](e,t):"Unknown device type
"+JSON.stringify(t)}function y(a,e,t){let n=Helper.template.createElement("div",{class:"component device-state-component"},"");return n.deviceStateComponent={create:()=>{n.innerHTML=Helper.template.circleLoaderHTML(),a.devices.status(e,(s,r,c)=>{if(console.log("sh_api.devices.status",s,r),!r)return n.innerHTML=` + `}`},hatch:(a,e)=>`
${e.hatch.state.indexOf("open")!=-1?`${e.hatch.state} - ${e.hatch.position_pct}%`:`${e.hatch.state}`}
`};function lt(a){a.addEventListener("click",e=>{e.currentTarget.deviceStateComponent.create()})}function dt(a,e,t){return typeof me[a]!="undefined"?me[a](e,t):"Unknown device type
"+JSON.stringify(t)}function y(a,e,t){let n=Helper.template.createElement("div",{class:"component device-state-component"},"");return n.deviceStateComponent={create:()=>{n.innerHTML=Helper.template.circleLoaderHTML(),a.devices.status(e,(s,r,c)=>{if(console.log("sh_api.devices.status",s,r),!r)return n.innerHTML=` Loading Error `,console.error("deviceStateComponent",`DeviceID ${e}`);n.innerHTML=dt(t,r.data.device.alias,r.data.device.device_response),lt(n)})}},n.deviceStateComponent.create(),n}function ut(a,e,t){let n=[{payloadFieldName:"name",selector:".display-name",methName:"update_name",originalValue:e.name,isMultiString:!1},{payloadFieldName:"description",selector:".description",methName:"update_description",originalValue:e.description,isMultiString:!0},{payloadFieldName:"new_alias",selector:".alias",methName:"update_alias",originalValue:e.alias,isMultiString:!1}];for(let s of n){let r=editableString(t.querySelector(s.selector));r.editableString.onChange(c=>{let i={device_id:e.id};i[s.payloadFieldName]=c.value,a.devices[s.methName](i,(o,l,d)=>{var u,p,m;if(o||!l||!l.status)return console.error(`sh_api.devices.${s.methName}`,o),r.editableString.setValue(s.originalValue),Toasts.createError((u=o==null?void 0:o.message)!=null?u:"Error updating",(m=(p=o.raw)==null?void 0:p.msg)!=null?m:`Error of ${s.payloadFieldName} updating`).show();l.status==!0&&Screens.reinit()})})}}function R(a,e){return console.log(a),Modals.create("device-popup",{title:`Device ${a.name}`,body:t=>{var c;let n={area_id:"place-in-area-component-container",ip:"device-ip",state:"state-container",name:"display-name",description:"description",alias:"alias-view-container"},s=(i,o)=>{let l={ip:"{{value}}",status:d=>`${d}`,connection_status:d=>`${d}`,mac:"{{value}}",alias:' {{value}}',device_id:"{{value}}",last_contact:d=>Helper.unification.timeAgo(d),create_at:d=>Helper.unification.formatDate(d),update_at:d=>Helper.unification.formatDate(d)};return l[i]?typeof l[i]=="function"?l[i](o):l[i].replaceAll("{{value}}",o):o},r="";for(let i in a){let o=(c=n[i])!=null?c:"";r+=` @@ -128,7 +128,7 @@ type="button" >Reboot - `});return e}function mt(a,e,t){a.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Devices list",{deviceName:"Device name",connectionStatus:"Connect",state:"State",ip:"IP",actions:"Actions"},e,`Total: ${t} devices`)}function ft(a,e){a.currentScreen.DOMObject.querySelectorAll(".reboot-btn").forEach(t=>{t.addEventListener("click",n=>{n.currentTarget.getAttribute("disabled")||_(e,n.currentTarget)})}),a.currentScreen.DOMObject.querySelectorAll(".details-btn").forEach(t=>{t.addEventListener("click",n=>{let s=v({state:""},JSON.parse(n.currentTarget.dataset.device));R(s,e).show()})})}function fe(a){return{alias:"devices",renderer:()=>Helper.template.mainTemplate(N("devices")),initer:e=>{try{a.devices.list((t,n,s)=>{if(t||!n||s.status_code!=200)throw"Err";mt(e,pt(n.data),n.data.total),ft(e,a),e.currentScreen.DOMObject.querySelectorAll(".device-state-container").forEach(r=>{r.append(y(a,r.dataset.deviceId,r.dataset.deviceType))}),e.ready()})}catch(t){return console.error("sh_api.devices.list",t),e.error("Server API ERROR","")}}}}function be(a,e){return a=Helper.unification.deviceFieldsUnification(a),Modals.create("device-setup",{title:`Setup new device ${a.ip}`,body:t=>{let n="";for(let r in a)r[0]!="_"&&(n+=` + `});return e}function mt(a,e,t){a.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Devices list",{deviceName:"Device name",connectionStatus:"Connect",state:"State",ip:"IP",actions:"Actions"},e,`Total: ${t} devices`)}function ft(a,e){a.currentScreen.DOMObject.querySelectorAll(".reboot-btn").forEach(t=>{t.addEventListener("click",n=>{n.currentTarget.getAttribute("disabled")||_(e,n.currentTarget)})}),a.currentScreen.DOMObject.querySelectorAll(".details-btn").forEach(t=>{t.addEventListener("click",n=>{let s=h({state:""},JSON.parse(n.currentTarget.dataset.device));R(s,e).show()})})}function fe(a){return{alias:"devices",renderer:()=>Helper.template.mainTemplate(N("devices")),initer:e=>{try{a.devices.list((t,n,s)=>{if(t||!n||s.status_code!=200)throw"Err";mt(e,pt(n.data),n.data.total),ft(e,a),e.currentScreen.DOMObject.querySelectorAll(".device-state-container").forEach(r=>{r.append(y(a,r.dataset.deviceId,r.dataset.deviceType))}),e.ready()})}catch(t){return console.error("sh_api.devices.list",t),e.error("Server API ERROR","")}}}}function be(a,e){return a=Helper.unification.deviceFieldsUnification(a),Modals.create("device-setup",{title:`Setup new device ${a.ip}`,body:t=>{let n="";for(let r in a)r[0]!="_"&&(n+=` ${r}: ${a[r]} @@ -181,7 +181,7 @@ data-device='${JSON.stringify(t)}' type="button" >Setup - `:""});return e}function vt(a,e,t){a.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Found devices",{deviceId:"Device ID",deviceName:"Device name",deviceType:"Type",status:"Status",ip:"IP",mac:"Mac",wifiSignal:"Signal",actions:"Actions"},e,`Total: ${t} devices`)}function ht(a,e){a.currentScreen.DOMObject.querySelectorAll(".setup-btn").forEach(t=>{t.addEventListener("click",n=>{let s=JSON.parse(n.currentTarget.dataset.device);be(s,e).show()})})}function ve(a){return{alias:"devices-scanning",renderer:()=>Helper.template.mainTemplate(N("scanning")),initer:e=>{a.devices.scanning_all((t,n,s)=>{if(console.log("sh_api.devices.scanning_all",t,n),s.status_code!=200)return e.error("Server API ERROR","");vt(e,bt(n.data),n.data.devices.length),ht(e,a),e.ready()})}}}var J={list:fe,scanning:ve};function E(a){return Helper.template.sidebarNav([{content:' Scopes',route:"/#!/scripts/scopes",is_active:a=="scopes"},{content:' Actions',route:"/#!/scripts/actions",is_active:a=="actions"},{content:' Regular',route:"/#!/scripts/regular",is_active:a=="regular"}])}function W(a,e,t){a.scripts.run({alias:e,params:{}},(n,s,r)=>{s?(t(!0),setTimeout(()=>Screens.reinit(),1e3),setTimeout(()=>Toasts.createSuccess(`${e} running`,`${e} running success`).show(),300)):(t(!1),setTimeout(()=>Toasts.createError(`${e} failed`,`${e} running failed`).show(),300))})}function Y(a){return` + `:""});return e}function ht(a,e,t){a.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Found devices",{deviceId:"Device ID",deviceName:"Device name",deviceType:"Type",status:"Status",ip:"IP",mac:"Mac",wifiSignal:"Signal",actions:"Actions"},e,`Total: ${t} devices`)}function vt(a,e){a.currentScreen.DOMObject.querySelectorAll(".setup-btn").forEach(t=>{t.addEventListener("click",n=>{let s=JSON.parse(n.currentTarget.dataset.device);be(s,e).show()})})}function he(a){return{alias:"devices-scanning",renderer:()=>Helper.template.mainTemplate(N("scanning")),initer:e=>{a.devices.scanning_all((t,n,s)=>{if(console.log("sh_api.devices.scanning_all",t,n),s.status_code!=200)return e.error("Server API ERROR","");ht(e,bt(n.data),n.data.devices.length),vt(e,a),e.ready()})}}}var J={list:fe,scanning:he};function $(a){return Helper.template.sidebarNav([{content:' Scopes',route:"/#!/scripts/scopes",is_active:a=="scopes"},{content:' Actions',route:"/#!/scripts/actions",is_active:a=="actions"},{content:' Regular',route:"/#!/scripts/regular",is_active:a=="regular"}])}function W(a,e,t){a.scripts.run({alias:e,params:{}},(n,s,r)=>{s?(t(!0),setTimeout(()=>Screens.reinit(),1e3),setTimeout(()=>Toasts.createSuccess(`${e} running`,`${e} running success`).show(),300)):(t(!1),setTimeout(()=>Toasts.createError(`${e} failed`,`${e} running failed`).show(),300))})}function Y(a){return`
${a.description}
- `}function G(a,e){e.querySelector(".card-content").addEventListener("click",t=>{if(e.getAttribute("disabled"))return;Helper.states.cardScriptActionLoadingState(e,!0);let n=e.dataset.alias;W(a,n,s=>{Helper.states.cardScriptActionLoadingState(e,!1),s&&(e.classList.add("card-success"),setTimeout(()=>e.classList.remove("card-success"),1e3))})})}function he(a,e){let t=document.createElement("div");t.innerHTML=Y(e);let n=t.querySelector(".card");return G(a,n),n}function gt(a){let e=[];for(let t of a.scopes){let n=t.state=="disabled"?``;e.push({name:t.name,filename:`${t.filename}
${t.path}`,state:Helper.template.toogleStateBadge(t.state),actions:` ${n} - `})}return e}function St(a,e,t){a.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Scopes list",{name:"Scope name",filename:"Filename",state:"State",actions:"Actions"},e,`Total: ${t} scopes`)}function yt(a,e){a.currentScreen.DOMObject.querySelectorAll(".change-state-btn").forEach(t=>{t.addEventListener("click",n=>{let s=n.currentTarget;if(s.getAttribute("disabled"))return;let r=s.dataset.value=="enable"?"scope_enable":"scope_disable",c=JSON.parse(s.dataset.scope);Helper.states.btnLoadingState(s,!0),e.scripts[r](c.name,(i,o,l)=>{Helper.states.btnLoadingState(s,!1),o?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of ${c.name} was changed`).show()):Toasts.createError("Request failed","Scope state not changed").show()})})})}function ge(a){return{title:"Scripts Scopes",alias:"scripts-scopes",renderer:()=>Helper.template.mainTemplate(E("scopes")),initer:e=>{a.scripts.scopes_list((t,n,s)=>{if(console.log("sh_api.scripts.scopes_list",t,n,s),s.status_code!=200)return e.error("Server API ERROR","");St(e,gt(n.data),n.data.total),yt(e,a),e.ready()})}}}function _t(a){let e=[];for(let t of a.scripts){let n=t.state=="disabled"?``;e.push({alias:`${t.alias}
by ${t.created_by}`,name:`${t.name}
${t.description}
`,filename:`${t.filename}
${t.path}`,state:Helper.template.toogleStateBadge(t.state),actions:` ${n} - `})}return e}function wt(a,e,t){let n={};for(let s in e)n[e[s].alias]=e[s],e[s].code="";a.currentScreen.DOMObject.provideSciptsData=n,a.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Regular scripts list",{alias:"Alias",name:"Script name",filename:"Filename",state:"State",actions:"Actions"},e,`Total: ${t} scripts`)}function Lt(a,e){a.currentScreen.DOMObject.querySelectorAll(".change-state-btn").forEach(t=>{t.addEventListener("click",n=>{var i;let s=n.currentTarget;if(s.getAttribute("disabled"))return;let r=s.dataset.value=="enable"?"regular_enable":"regular_disable",c=(i=a.currentScreen.DOMObject.provideSciptsData[s.dataset.alias])!=null?i:{alias:s.dataset.alias};Helper.states.btnLoadingState(s,!0),e.scripts[r](c.alias,(o,l,d)=>{Helper.states.btnLoadingState(s,!1),l?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of ${c.alias} was changed`).show()):Toasts.createError("Request failed","Regular script state not changed").show()})})})}function Se(a){return{title:"Scripts Regular",alias:"scripts-regular",renderer:()=>Helper.template.mainTemplate(E("regular")),initer:e=>{a.scripts.regular_list((t,n,s)=>{if(console.log("sh_api.scripts.regular_list",t,n,s),s.status_code!=200)return e.error("Server API ERROR","");wt(e,_t(n.data),n.data.total),Lt(e,a),e.ready()})}}}function ye(a,e){return console.log("actionDetailsPopup",a),Modals.create("action-script-popup",{title:`${a.name}`,body:t=>{let n=a.area_id!=-1?'
':"";return` + `})}return e}function wt(a,e,t){let n={};for(let s in e)n[e[s].alias]=e[s],e[s].code="";a.currentScreen.DOMObject.provideSciptsData=n,a.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Regular scripts list",{alias:"Alias",name:"Script name",filename:"Filename",state:"State",actions:"Actions"},e,`Total: ${t} scripts`)}function Lt(a,e){a.currentScreen.DOMObject.querySelectorAll(".change-state-btn").forEach(t=>{t.addEventListener("click",n=>{var i;let s=n.currentTarget;if(s.getAttribute("disabled"))return;let r=s.dataset.value=="enable"?"regular_enable":"regular_disable",c=(i=a.currentScreen.DOMObject.provideSciptsData[s.dataset.alias])!=null?i:{alias:s.dataset.alias};Helper.states.btnLoadingState(s,!0),e.scripts[r](c.alias,(o,l,d)=>{Helper.states.btnLoadingState(s,!1),l?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of ${c.alias} was changed`).show()):Toasts.createError("Request failed","Regular script state not changed").show()})})})}function Se(a){return{title:"Scripts Regular",alias:"scripts-regular",renderer:()=>Helper.template.mainTemplate($("regular")),initer:e=>{a.scripts.regular_list((t,n,s)=>{if(console.log("sh_api.scripts.regular_list",t,n,s),s.status_code!=200)return e.error("Server API ERROR","");wt(e,_t(n.data),n.data.total),Lt(e,a),e.ready()})}}}function ye(a,e){return console.log("actionDetailsPopup",a),Modals.create("action-script-popup",{title:`${a.name}`,body:t=>{let n=a.area_id!=-1?'
':"";return`
@@ -247,7 +247,7 @@
- `},actions:t=>{let n=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),s=Helper.template.createElement("button",{class:a.state=="enabled"?"btn btn-warning":"btn btn-success","data-value":a.state=="enabled"?"disable":"enable"},a.state=="enabled"?"Disable":"Enable"),r=Helper.template.createElement("button",{class:"btn btn-secondary with-icon"},' Run');return n.addEventListener("click",c=>{t.close()}),s.addEventListener("click",c=>{let i=c.currentTarget;if(i.getAttribute("disabled"))return;let o=i.dataset.value=="enable"?"action_enable":"action_disable";Helper.states.btnLoadingState(i,!0),e.scripts[o](a.alias,(l,d,u)=>{Helper.states.btnLoadingState(i,!1),t.close(),d?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of ${a.alias} was changed`).show()):Toasts.createError("Request failed","Regular script state not changed").show()})}),r.addEventListener("click",c=>{let i=c.currentTarget;Helper.states.btnLoadingState(i,!0),W(e,a.alias,o=>{Helper.states.btnLoadingState(i,!1),o&&t.close()})}),[n,s,r]},onready:t=>{L(e,t.querySelector(".place-in-area-component-container"),"action",a.id,a.area_id),hljs.highlightElement(t.querySelector(".code-viewer"))}})}function K(a){var t,n,s;let e=[];for(let r of a.scripts)e.push({alias:r.alias,author:r.created_by,name:r.name,icon:(t=r.icon)!=null?t:'',description:r.description,filename:`${r.filename}
${r.path}`,state:r.state,code:r.code,id:(n=r.id)!=null?n:0,area_id:(s=r.area_id)!=null?s:-1});return e}function Et(a,e,t){let n='
',s={};for(let c of e)s[c.alias]=c,n+=Y(c);n+="
";let r=a.currentScreen.DOMObject.querySelector(".main-container");r.innerHTML=n,a.currentScreen.DOMObject.provideSciptsData=s}function $t(a,e){a.currentScreen.DOMObject.querySelectorAll(".script-action").forEach(t=>{G(e,t)}),a.currentScreen.DOMObject.querySelectorAll(".action-details-btn").forEach(t=>{t.addEventListener("click",n=>{var c;let s=n.currentTarget,r=(c=a.currentScreen.DOMObject.provideSciptsData[s.dataset.alias])!=null?c:{};console.log("SCRIPT",r),ye(r,e).show()})})}function _e(a){return{title:"Scripts Actions",alias:"scripts-actions",renderer:()=>Helper.template.mainTemplate(E("actions")),initer:e=>{a.scripts.actions_list((t,n,s)=>{if(console.log("sh_api.scripts.actions_list",t,n,s),s.status_code!=200)return e.error("Server API ERROR","");Et(e,K(n.data),n.data.total),$t(e,a),e.ready()})}}}var j={scopes:ge,regular:Se,actions:_e};function we(a){return Helper.template.sidebarNav([{content:' Areas Tree',route:"/#!/areas/tree",is_active:a=="areas-tree"}])}function Le(a,e){return console.log("areaDevicesModal",a),Modals.create("area-devices-modal",{title:` ${a.display_name}`,body:t=>` + `},actions:t=>{let n=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),s=Helper.template.createElement("button",{class:a.state=="enabled"?"btn btn-warning":"btn btn-success","data-value":a.state=="enabled"?"disable":"enable"},a.state=="enabled"?"Disable":"Enable"),r=Helper.template.createElement("button",{class:"btn btn-secondary with-icon"},' Run');return n.addEventListener("click",c=>{t.close()}),s.addEventListener("click",c=>{let i=c.currentTarget;if(i.getAttribute("disabled"))return;let o=i.dataset.value=="enable"?"action_enable":"action_disable";Helper.states.btnLoadingState(i,!0),e.scripts[o](a.alias,(l,d,u)=>{Helper.states.btnLoadingState(i,!1),t.close(),d?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of ${a.alias} was changed`).show()):Toasts.createError("Request failed","Regular script state not changed").show()})}),r.addEventListener("click",c=>{let i=c.currentTarget;Helper.states.btnLoadingState(i,!0),W(e,a.alias,o=>{Helper.states.btnLoadingState(i,!1),o&&t.close()})}),[n,s,r]},onready:t=>{L(e,t.querySelector(".place-in-area-component-container"),"action",a.id,a.area_id),hljs.highlightElement(t.querySelector(".code-viewer"))}})}function K(a){var t,n,s;let e=[];for(let r of a.scripts)e.push({alias:r.alias,author:r.created_by,name:r.name,icon:(t=r.icon)!=null?t:'',description:r.description,filename:`${r.filename}
${r.path}`,state:r.state,code:r.code,id:(n=r.id)!=null?n:0,area_id:(s=r.area_id)!=null?s:-1});return e}function $t(a,e,t){let n='
',s={};for(let c of e)s[c.alias]=c,n+=Y(c);n+="
";let r=a.currentScreen.DOMObject.querySelector(".main-container");r.innerHTML=n,a.currentScreen.DOMObject.provideSciptsData=s}function Et(a,e){a.currentScreen.DOMObject.querySelectorAll(".script-action").forEach(t=>{G(e,t)}),a.currentScreen.DOMObject.querySelectorAll(".action-details-btn").forEach(t=>{t.addEventListener("click",n=>{var c;let s=n.currentTarget,r=(c=a.currentScreen.DOMObject.provideSciptsData[s.dataset.alias])!=null?c:{};console.log("SCRIPT",r),ye(r,e).show()})})}function _e(a){return{title:"Scripts Actions",alias:"scripts-actions",renderer:()=>Helper.template.mainTemplate($("actions")),initer:e=>{a.scripts.actions_list((t,n,s)=>{if(console.log("sh_api.scripts.actions_list",t,n,s),s.status_code!=200)return e.error("Server API ERROR","");$t(e,K(n.data),n.data.total),Et(e,a),e.ready()})}}}var j={scopes:ge,regular:Se,actions:_e};function we(a){return Helper.template.sidebarNav([{content:' Areas Tree',route:"/#!/areas/tree",is_active:a=="areas-tree"}])}function Le(a,e){return console.log("areaDevicesModal",a),Modals.create("area-devices-modal",{title:` ${a.display_name}`,body:t=>`
`,actions:t=>{let n=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),s=Helper.template.createElement("button",{class:"btn btn-warning with-icon btn-reboot-all"},' Reboot All');return n.addEventListener("click",r=>{t.close()}),s.addEventListener("click",r=>{s.getAttribute("disabled")||(Helper.states.btnLoadingState(s,!0),confirmPopup(`Are you sure you want to reboot all devices from ${a.display_name}?`,()=>{e.areas.reboot_devices(a.id,(c,i,o)=>{Helper.states.btnLoadingState(s,!1),i?(console.log("Was rebooted all devices"),Toasts.createSuccess("Rebooted all devices",`Area: ${a.display_name}`).show()):Toasts.createDanger("Rebooted fail",`Area: ${a.display_name}`).show()})},()=>{Helper.states.btnLoadingState(s,!1),console.log("CANCELED")}))}),[n,s]},onready:t=>{let n=t.querySelector(".devices-container"),s=t.querySelector(".loader");e.areas.devices(a.id,(r,c,i)=>{console.log("sh_api.areas.devices",c);function o(d){if(!d)return[];let u=[];for(let p of d.devices)p=Helper.unification.deviceFieldsUnification(p),u.push({deviceNaming:` @@ -274,11 +274,11 @@ type="button" >Reboot - `});return u}let l=o(c==null?void 0:c.data);l.length?n.innerHTML=Helper.template.table("",{deviceNaming:"Device",status:"Status",state:"State",actions:"Actions"},l,`Total: ${l.length} devices`):(n.innerHTML=Helper.template.emptyHereHTML(),t.querySelector(".btn-reboot-all").remove()),n.querySelectorAll(".reboot-btn").forEach(d=>{d.addEventListener("click",u=>{d.getAttribute("disabled")||_(e,u.currentTarget,t)})}),n.querySelectorAll(".device-state-container").forEach(d=>{d.append(y(e,d.dataset.deviceId,d.dataset.deviceType))}),n.querySelectorAll(".details-btn").forEach(d=>{d.addEventListener("click",u=>{let p=v({status:""},JSON.parse(u.currentTarget.dataset.device));R(p,e).show()})}),s.remove(),console.log("devices",l)})}})}function Ee(a,e){return console.log("areaActionsModal",a),Modals.create("area-actions-modal",{title:` ${a.display_name}`,body:t=>` + `});return u}let l=o(c==null?void 0:c.data);l.length?n.innerHTML=Helper.template.table("",{deviceNaming:"Device",status:"Status",state:"State",actions:"Actions"},l,`Total: ${l.length} devices`):(n.innerHTML=Helper.template.emptyHereHTML(),t.querySelector(".btn-reboot-all").remove()),n.querySelectorAll(".reboot-btn").forEach(d=>{d.addEventListener("click",u=>{d.getAttribute("disabled")||_(e,u.currentTarget,t)})}),n.querySelectorAll(".device-state-container").forEach(d=>{d.append(y(e,d.dataset.deviceId,d.dataset.deviceType))}),n.querySelectorAll(".details-btn").forEach(d=>{d.addEventListener("click",u=>{let p=h({status:""},JSON.parse(u.currentTarget.dataset.device));R(p,e).show()})}),s.remove(),console.log("devices",l)})}})}function $e(a,e){return console.log("areaActionsModal",a),Modals.create("area-actions-modal",{title:` ${a.display_name}`,body:t=>`
- `,actions:t=>{let n=Helper.template.createElement("button",{class:"btn btn-primary"},"Close");return n.addEventListener("click",s=>{t.close()}),[n]},onready:t=>{let n=t.querySelector(".actions-container"),s=t.querySelector(".loader");e.areas.scripts(a.id,(r,c,i)=>{if(console.log("sh_api.areas.scripts",r,c,i),!c)return Toasts.createDanger("Loading failed",`Area: ${a.display_name}`).show();let o=K(c.data);console.log("ACTIONS",o),n.innerHTML="",o.length||(n.innerHTML=Helper.template.emptyHereHTML()),s.remove();for(let l of o)n.append(he(e,l))})}})}function $e(a){return console.log("createNewAreaModal"),Modals.create("create-area-modal",{title:' Create new Area',body:e=>` + `,actions:t=>{let n=Helper.template.createElement("button",{class:"btn btn-primary"},"Close");return n.addEventListener("click",s=>{t.close()}),[n]},onready:t=>{let n=t.querySelector(".actions-container"),s=t.querySelector(".loader");e.areas.scripts(a.id,(r,c,i)=>{if(console.log("sh_api.areas.scripts",r,c,i),!c)return Toasts.createDanger("Loading failed",`Area: ${a.display_name}`).show();let o=K(c.data);console.log("ACTIONS",o),n.innerHTML="",o.length||(n.innerHTML=Helper.template.emptyHereHTML()),s.remove();for(let l of o)n.append(ve(e,l))})}})}function Ee(a){return console.log("createNewAreaModal"),Modals.create("create-area-modal",{title:' Create new Area',body:e=>`
- `;if((r=a.children)!=null&&r.length)for(let c of a.children)n+=He(c,e+1);return n}function Dt(a,e){console.log("TREE",e);let t='
';for(let n of e)t+=He(n);t+="
",a.currentScreen.DOMObject.querySelector(".main-container .tree-container").innerHTML=t}function Mt(a,e){a.currentScreen.DOMObject.querySelectorAll(".btn.devices").forEach(t=>{t.addEventListener("click",n=>{Le({id:n.currentTarget.dataset.areaId,display_name:n.currentTarget.dataset.areaName},e).show()})}),a.currentScreen.DOMObject.querySelectorAll(".btn.actions").forEach(t=>{t.addEventListener("click",n=>{Ee({id:n.currentTarget.dataset.areaId,display_name:n.currentTarget.dataset.areaName},e).show()})}),a.currentScreen.DOMObject.querySelectorAll(".btn.details").forEach(t=>{t.addEventListener("click",n=>{Te({id:n.currentTarget.dataset.areaId,display_name:n.currentTarget.dataset.areaName,parent_id:n.currentTarget.dataset.parentId},e).show()})}),a.currentScreen.DOMObject.querySelectorAll("button.show-childs").forEach(t=>{t.addEventListener("click",n=>{let s=n.currentTarget,r=s.parentNode,c=parseInt(r.dataset.lvl);if(s.classList.contains("opened")){s.classList.remove("opened");let i=r.nextElementSibling;for(;i;){let o=parseInt(i.dataset.lvl);if(o==c||oHelper.template.mainTemplate(we("areas-tree"),`
+ `;if((r=a.children)!=null&&r.length)for(let c of a.children)n+=He(c,e+1);return n}function Dt(a,e){console.log("TREE",e);let t='
';for(let n of e)t+=He(n);t+="
",a.currentScreen.DOMObject.querySelector(".main-container .tree-container").innerHTML=t}function Mt(a,e){a.currentScreen.DOMObject.querySelectorAll(".btn.devices").forEach(t=>{t.addEventListener("click",n=>{Le({id:n.currentTarget.dataset.areaId,display_name:n.currentTarget.dataset.areaName},e).show()})}),a.currentScreen.DOMObject.querySelectorAll(".btn.actions").forEach(t=>{t.addEventListener("click",n=>{$e({id:n.currentTarget.dataset.areaId,display_name:n.currentTarget.dataset.areaName},e).show()})}),a.currentScreen.DOMObject.querySelectorAll(".btn.details").forEach(t=>{t.addEventListener("click",n=>{Te({id:n.currentTarget.dataset.areaId,display_name:n.currentTarget.dataset.areaName,parent_id:n.currentTarget.dataset.parentId},e).show()})}),a.currentScreen.DOMObject.querySelectorAll("button.show-childs").forEach(t=>{t.addEventListener("click",n=>{let s=n.currentTarget,r=s.parentNode,c=parseInt(r.dataset.lvl);if(s.classList.contains("opened")){s.classList.remove("opened");let i=r.nextElementSibling;for(;i;){let o=parseInt(i.dataset.lvl);if(o==c||oHelper.template.mainTemplate(we("areas-tree"),`

Areas Tree

@@ -365,7 +365,7 @@
- `),initer:e=>{a.areas.list((t,n,s)=>{if(console.log("sh_api.areas.list",t,n,s),s.status_code!=200)return e.error("Server API ERROR","");if(e.currentScreen.DOMObject.provideData={},typeof n.data!="undefined"&&typeof n.data.areas!="undefined")for(let c of n.data.areas)e.currentScreen.DOMObject.provideData[c.id]=c;Dt(e,At(n.data)),Mt(e,a);let r=e.currentScreen.DOMObject.querySelector(".create-new-area-modal");r.classList.contains("inited")||(r.classList.add("inited"),r==null||r.addEventListener("click",c=>{$e(a).show()})),e.ready()})}}}var De={areasTree:Ae};function Me(a,e){a.add("/",{alias:"home",renderer:()=>"",initer:t=>{document.location="/#!/areas/tree"}}),a.add("-",{alias:"not-found-screen",renderer:()=>'

404 NOT FOUND

',initer:t=>{t.ready()}}),a.add("/devices",J.list(e)),a.add("/devices/scanning",J.scanning(e)),a.add("/scripts/scopes",j.scopes(e)),a.add("/scripts/regular",j.regular(e)),a.add("/scripts/actions",j.actions(e)),a.add("/areas/tree",De.areasTree(e))}function qt(a,e,t){return` + `),initer:e=>{a.areas.list((t,n,s)=>{if(console.log("sh_api.areas.list",t,n,s),s.status_code!=200)return e.error("Server API ERROR","");if(e.currentScreen.DOMObject.provideData={},typeof n.data!="undefined"&&typeof n.data.areas!="undefined")for(let c of n.data.areas)e.currentScreen.DOMObject.provideData[c.id]=c;Dt(e,At(n.data)),Mt(e,a);let r=e.currentScreen.DOMObject.querySelector(".create-new-area-modal");r.classList.contains("inited")||(r.classList.add("inited"),r==null||r.addEventListener("click",c=>{Ee(a).show()})),e.ready()})}}}var De={areasTree:Ae};function Me(a,e){a.add("/",{alias:"home",renderer:()=>"",initer:t=>{document.location="/#!/areas/tree"}}),a.add("-",{alias:"not-found-screen",renderer:()=>'

404 NOT FOUND

',initer:t=>{t.ready()}}),a.add("/devices",J.list(e)),a.add("/devices/scanning",J.scanning(e)),a.add("/scripts/scopes",j.scopes(e)),a.add("/scripts/regular",j.regular(e)),a.add("/scripts/actions",j.actions(e)),a.add("/areas/tree",De.areasTree(e))}function qt(a,e,t){return`