Advertisement
eqeqwan21

Untitled

May 27th, 2025 (edited)
699
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //v13_14 альтернатиная мнемосхема_маскировка команд
  2. //v11++фото заголовки со ссылками                                                                             
  3. "use strict";
  4. let hulla = new hullabaloo();
  5. let box = null;
  6. let circuit = null;
  7. let stlog = null;
  8. let dayly = null;
  9. let lastip = null;
  10. let lastmeter = null;
  11. //Антон: отображение команд с учетом маски
  12. let deviceObj = null;
  13.  
  14. let dt = null, mdt = null;
  15. let dtdt = null;
  16. let commands = null;
  17. var gallery_ro = true;
  18.  
  19. let get = parseQuery(window.location.search);
  20. moment.locale(environment.language || window.navigator.userLanguage || window.navigator.language);
  21.  
  22.  
  23. $(async function () {
  24.   let result;
  25.   let userTown;
  26.   if (environment.login_name.indexOf("_") !== -1) {
  27.     userTown = '&town=' + environment.login_name.split('_')[0].toLowerCase()
  28.   } else {
  29.     userTown = ''
  30.   }
  31.   try {
  32.     result = await $.ajax({
  33.       url: environment.base_url + "/" + '?do=api&fn=devices&id=' + get['id'] + userTown,
  34.       type: 'GET',
  35.       dataType: "json"
  36.     });
  37. //Антон: отображение команд с учетом маски
  38.     deviceObj = result;
  39.   } catch (error) {
  40.     console.error(error);
  41.     $("#content").html("<h2>Device was not loaded</h2>");
  42.     return;
  43.   }
  44.  
  45.  
  46.   if (result.rows.length > 0)
  47.     box = result.rows.slice(0)[0];
  48.   else {
  49.     $("#content").html("<h2>Device not found</h2>");
  50.     return;
  51.   }
  52.  
  53.   if (box.DimProfile_id !== null) {
  54.     try {
  55.       dayly = await $.ajax({
  56.         url: environment.base_url + "/" + '?do=api&fn=dimdetail&now&id=' + box.DimProfile_id,
  57.         type: 'GET',
  58.         dataType: "json"
  59.       });
  60.     } catch (error) {
  61.       console.error(error);
  62.     }
  63.   }
  64.  
  65.   if (box.Type == 2)
  66.     $("#strongState").text(i18next.t("Brightness"));
  67.  
  68.   drawBoxInfo();
  69.   try {
  70.     result = await $.ajax({
  71.       url: environment.base_url + "/" + '?do=api&fn=circuit&id=' + get['id'],
  72.       type: 'GET',
  73.       dataType: "json"
  74.     });
  75.  
  76.   } catch (error) {
  77.     console.error(error);
  78.     $("#content").html("<h2>Pattern was not loaded</h2>");
  79.     return;
  80.   }
  81.  
  82.   if (result.rows.length > 0)
  83.     circuit = result.rows[0];
  84.   else
  85.     console.log("Pattern not found");
  86.  
  87.   let svg = "";
  88.   if (circuit !== null) {
  89.     let qs = circuit.qs;
  90.     if (environment.language !== "en") {
  91.       qs = qs.replace(/S/gi, "K");
  92.     }
  93.  
  94.     try {
  95.       svg = await $.ajax({
  96.         url: environment.base_url + `/images/galbox.svg?v=${config.version}&noxml&cnf=` + qs,
  97.         type: 'GET',
  98.         processData: false
  99.       });
  100.       $("#circuit").html(`${svg}`);
  101.       if (box.Name?.startsWith("TL")) await attachBackground();
  102.     } catch (error) {
  103.       console.error(error);
  104.     }
  105.   }
  106.  
  107.   stdatatable();
  108.   meterdatatable();
  109.  
  110.   setTimeout(renew, 1);
  111.   setTimeout(iprenew, 10);
  112.  
  113.   $("#circuit svg").addClass("col-12");
  114.   $("#circuit svg").addClass("p-0");
  115.   //Ссылки в зоголовках "статистика" и "журнал состояния" в форме Объект
  116.   $("#statlink").attr("href", `${environment.base_url}/inlog?device=${get['id']}`);
  117.   $("#stlink").attr("href", `${environment.base_url}/stlog?device=${get['id']}`);
  118.   if (box.Smart) {
  119.     try {
  120.       result = await $.ajax({
  121.         url: environment.base_url + "/" + '?do=api&fn=ServerCommand&type=1,3&DeviceType=' + box.Type,
  122.         type: 'GET',
  123.         dataType: "json"
  124.       });
  125.  
  126.     } catch (error) {
  127.       console.error(error);
  128.       return;
  129.     }
  130.     commands = result.rows;
  131.     $("#cmd").find('option').remove();
  132.  
  133.     for (let key in commands) {
  134.       if (commands[key].Letter == "F")
  135.         continue;
  136.       $("#cmd").append($("<option></option>")
  137.           .attr("value", commands[key].id)
  138.           .text(i18next.t(commands[key].Name)));
  139.     }
  140.   } else {
  141.     $("#manualDiv").hide();
  142.   }
  143. //добавление картинки светильника из галлереи с проверкой её наличия, иначе - по умолчанию
  144.   if (box.Type !== 1) {
  145.     $.ajax({
  146.       url: `${environment.base_url}/?do=api&fn=picture_list&Devices_id=${get['id']}&order=ASC&limit=1`,
  147.       type: 'GET',
  148.       dataType: "json",
  149.       success: function (result) {
  150.         if (result['list'].length > 0) {
  151.           $("#circuit").html('<img class="img-fluid" src="' + result['list'][0].src + '">');
  152.         } else {
  153.           $("#circuit").html(`<img class="img-fluid" src="${environment.base_url}/images/lamp.png">`)
  154.         }
  155.       }
  156.     });
  157.     // $("#circuit").html(`<img class="img-fluid" src="${environment.base_url}/images/lamp.png">`);
  158.   }
  159.  
  160.   $(".picture").click(() => {
  161.     galleryOpen(get['id'])
  162.   });
  163.   /*
  164.   let pl = await getPictureList(get['id'], 'desc', 100);
  165.   if(pl.length == 0) {
  166.     $(".picture").click( ()=>{galleryOpen(get['id'])});
  167.   } else {
  168.     let html="";
  169.     let i=0;
  170.     pl.forEach(el => {
  171.       let title = "";
  172.       let opt = {month: "long", day:"numeric", year:"numeric"};
  173.       let separ=", ";
  174.       let opt2= {hour:"numeric", minute:"numeric"};
  175.       let disp="";
  176.  
  177.       if(el.Exiftime!==null) {
  178.         let dda = el.Exiftime.split(" ");
  179.         if(dda.length==2) {
  180.           let dds = dda[0].replaceAll(":","-") + " " + dda[1]+"Z";
  181.           let dd = new Date(dds);
  182.  
  183.           if(!(dd===NaN) && !dd!="Invalid Date") {
  184.             disp = "<i class='fa fa-camera'></i>&nbsp;" + dd.toLocaleDateString(environment.language, opt) + separ +
  185.             dd.toLocaleTimeString(environment.language, opt2);
  186.           }
  187.         }
  188.       }
  189.  
  190.       let dd = new Date(el.Loaded+"Z");
  191.       if(!(dd===NaN) && !dd!="Invalid Date") {
  192.         if(disp!="")
  193.           disp+="<br>";
  194.         disp += "<i class='fa fa-upload'></i>&nbsp;" + dd.toLocaleDateString(environment.language, opt) + separ +
  195.         dd.toLocaleTimeString(environment.language, opt2);
  196.       }
  197.  
  198.       title = `data-container="body" data-html="true" data-placement="top" data-toggle="tooltip" title="${disp}"`;
  199.  
  200.       html += `<div ${title}><img onclick="galleryOpen(${get['id']}, ${i})" class="border border-primary rounded imgpic" width="60px" height="60px" src="${el.src}&thumb"></div>`;
  201.       i++;
  202.     });
  203.     $("#pg").html(html);
  204.     $('[data-toggle="tooltip"]').tooltip({
  205.       boundary:"viewport",
  206.       html: true
  207.     });
  208.   }
  209.   */
  210.  
  211. });
  212.  
  213. async function runCmd() {
  214.   $("#btnCmd").prop("disabled", true);
  215.   setTimeout(() => $("#btnCmd").prop("disabled", false), 1500);
  216.   let srvcmd = {};
  217.  
  218.   srvcmd.cmd = parseInt($("#cmd").val());
  219.   let selcmd = commands.find(x => x.id == srvcmd.cmd);
  220.   let cmdtext = i18next.t(selcmd.Name);
  221.  
  222.   srvcmd.devs = [box.id];
  223.  
  224.   let result = null;
  225.   try {
  226.     result = await $.ajax({
  227.       url: environment.base_url + "/" + '?do=api&fn=makecalls',
  228.       data: JSON.stringify(srvcmd),
  229.       type: 'PUT',
  230.       contentType: "application/json; charset=utf-8",
  231.       dataType: "json"
  232.     });
  233.  
  234.   } catch (error) {
  235.     console.error(error);
  236.     hulla.send(i18next.t("Device control error"));
  237.     return false;
  238.   }
  239.  
  240.   if (result.success) {
  241.     switch (result.queued) {
  242.       case 0:
  243.         hulla.send(i18next.t("Command not queued"));
  244.         break;
  245.       case 1:
  246.         hulla.send(`${i18next.t("Command")} "${cmdtext}" ${i18next.t("queued")}`, "success");
  247.         break;
  248.       default:
  249.         hulla.send(`${cmdtext} - ${i18next.t("Command queued for multiple devices")} (${result.queued})`, "success");
  250.         break;
  251.     }
  252.   } else {
  253.     hulla.send(i18next.t("An error occurred while adding commands to the queue"));
  254.     console.log(result);
  255.   }
  256.  
  257.   return false;
  258. }
  259.  
  260. let pbox = null, plines = null;
  261.  
  262. async function drawBoxInfo() {
  263.   $("#Phone").html(number10html(box.Phone));
  264. //Добавление строки "Серийный номер"  
  265.   for (let fld of ["CustomNum", "Name", "sn", "DimProfile_Name", "Station", "ControlTime"]) {
  266.     let val = box[fld];
  267.     if (val !== null) {
  268.       if (fld == "ControlTime")
  269.         $("#" + fld).text(val.substr(0, 5));
  270.       else
  271.         $("#" + fld).text(val);
  272.     }
  273.   }
  274.   if (box.Station == null && box.Lines_id) {
  275.     //let pbox =null, plines = null;
  276.     try {
  277.       pbox = await $.ajax({
  278.         url: environment.base_url + "/" + '?do=api&fn=devices&id=' + box.Box_id,
  279.         type: 'GET',
  280.         dataType: "json"
  281.       });
  282.  
  283.     } catch (error) {
  284.       console.error(error);
  285.       return;
  286.     }
  287.     try {
  288.       plines = await $.ajax({
  289.         url: environment.base_url + "/" + '?do=api&fn=lines&id=' + box.Box_id,
  290.         type: 'GET',
  291.         dataType: "json"
  292.       });
  293.  
  294.     } catch (error) {
  295.       console.error(error);
  296.       return;
  297.     }
  298.  
  299.     if (pbox && plines) {
  300.       let ln = plines.rows.find(x => x.id == box.Lines_id)
  301.       let txt = ln.Num.toString().padStart(2, "0") + ". " + i18next.t(appdata.LinesType.find(x => x.id == ln.Type).Name);
  302.  
  303.       if (ln.Switch > 0)
  304.         txt += " " + i18next.t(appdata.Switches.find(x => x.id == ln.Switch).Name);
  305.       if (ln.Phase > 0)
  306.         txt += ", " + i18next.t("Phase") + " " + appdata.Phases.find(x => x.id == ln.Phase).Name;
  307.  
  308.       $("#Station").html(`<a target="obj${box.Box_id}" href="${environment.base_url}/obj?id=${box.Box_id}" id="aStation"></a>, ${txt}`);
  309.       $("#aStation").text(`${i18next.t("Box")} № ${pbox.rows[0].CustomNum}`);
  310.     }
  311.   }
  312.   $("#Mode").text(i18next.t(appdata.AutoModes.find(x => x.id == box.Mode).Name));
  313.   $("#Location").text(makeAddress(box));
  314.  
  315.   $("#shiftdiv").hide();
  316.  
  317.   daylyTable();
  318. }
  319.  
  320.  
  321. function daylyTable() {
  322.   if (dayly == null)
  323.     return;
  324.  
  325.   let drw = dayly.rows;
  326.   let aShift = null;
  327.   if (box.PardShift)
  328.     aShift = box.PardShift.split(",");
  329.  
  330.   let str1 = "<tr>", str2 = "<tr>", str3 = "<tr>";
  331.   for (let i = 0; i < config.pard_maxvalue; i++) {
  332.     let time = '', val = '';
  333.     if (!(drw[i] === undefined)) {
  334.  
  335.       time = drw[i].Time.substr(0, 5);
  336.       if (box.Type == 2) //lamp
  337.         val = "" + drw[i].DimValue + "%";
  338.       else
  339.         val = SwitchStateForMask(drw[i].DimValue);//Антон: отображение команд с учетом маски
  340.     }
  341.     if (aShift) {
  342.       let tt = '';
  343.       if (aShift[i]) {
  344.         let tti = parseInt(aShift[i]);
  345.         let sign = "";
  346.         if (tti < 0)
  347.           sign = "-";
  348.         if (tti > 0)
  349.           sign = "+";
  350.         tti = Math.abs(tti);
  351.         let min = tti % 60;
  352.         let hr = (tti - min) / 60;
  353.  
  354.         tt = `${sign}${new Intl.NumberFormat(environment.language, {minimumIntegerDigits: 2}).format(hr)}:${new Intl.NumberFormat(environment.language, {minimumIntegerDigits: 2}).format(min)}`;
  355.       }
  356.       str3 += `<td class="text-center">${tt}</td>`;
  357.     }
  358.  
  359.  
  360.     str1 += `<td class="text-center">${time}</td>`;
  361.     str2 += `<td class="text-center">${val}</td>`;
  362.   }
  363.   str1 += "</tr>";
  364.   str2 += "</tr>";
  365.   $("#dimDetail").append(str1);
  366.  
  367.   if (aShift) {
  368.     str3 += "</tr>";
  369.     $("#dimDetail").append(str3);
  370.   }
  371.   $("#dimDetail").append(str2);
  372. }
  373.  
  374. let loadfail = 0;
  375.  
  376. async function dataload() {
  377.   let url = environment.base_url + "/" + "?do=api&fn=stlog&limit=64&device=" + get['id'];
  378.   let result, ret = false;
  379.   try {
  380.     result = await $.ajax({
  381.       url: url,
  382.       type: 'GET',
  383.       dataType: "json",
  384.       cache: false
  385.     });
  386.   } catch (error) {
  387.     console.log("Error: ", error);
  388.  
  389.     if (error.status == 401) //unautorized
  390.       window.location = environment.base_url + "/" + "?do=login&b=" + encodeURIComponent(window.location);
  391.  
  392.     loadfail++;
  393.     if (stlog === null)
  394.       $("#content").html("<h2>Log was not loaded</h2>");
  395.     else if (loadfail > 1) {
  396.       hulla.send(i18next.t(`No connection to the server (${error.statusText})`));
  397.       loadfail = 0;
  398.     }
  399.     return ret;
  400.   }
  401.   loadfail = 0;
  402.   if (stlog == null || stlog.timestamp != result.timestamp) {
  403.     stlog = result;
  404.     ret = true;
  405.   }
  406.  
  407.   return ret;
  408. }
  409.  
  410.  
  411. async function ipload() {
  412.   let url = environment.base_url + "/" + "?do=api&fn=lastip&device=" + get['id'];
  413.   let result, ret = false;
  414.   try {
  415.     result = await $.ajax({
  416.       url: url,
  417.       type: 'GET',
  418.       dataType: "json",
  419.     });
  420.   } catch (error) {
  421.     console.log("Error: ", error);
  422.     return ret;
  423.   }
  424.   if (lastip == null || lastip.timestamp != result.timestamp) {
  425.     lastip = result;
  426.     ret = true;
  427.   }
  428.  
  429.   return ret;
  430. }
  431.  
  432. async function meterload() {
  433.   let url = environment.base_url + "/" + "?do=api&fn=lastmeter&device=" + get['id'];
  434.   let result, ret = false;
  435.   try {
  436.     result = await $.ajax({
  437.       url: url,
  438.       type: 'GET',
  439.       dataType: "json",
  440.     });
  441.   } catch (error) {
  442.     console.log("Error: ", error);
  443.     return ret;
  444.   }
  445.   if (lastmeter == null || result.timestamp != lastmeter.timestamp) {
  446.     lastmeter = result;
  447.     ret = true;
  448.   }
  449.  
  450.   return ret;
  451. }
  452.  
  453.  
  454. async function renew() {
  455.  
  456.   let nextt = 1000;
  457.   let isnew = await dataload();
  458.   if (isnew) {
  459.     onlogchane();
  460.     nextt = 2000;
  461.   }
  462.   setTimeout(renew, nextt);
  463. }
  464.  
  465. async function iprenew() {
  466.  
  467.   let nextt = 1000;
  468.   let isnew = await ipload();
  469.  
  470.   if (isnew) {
  471.     if (lastip !== null && lastip.rowCount > 0) {
  472.       let li = lastip.rows[0];
  473.       let m = moment(li.unixtime * 1000);
  474.       $("#iptime").text(m.format("L LT"));
  475.       $("#ipdata").text(li.Msg);
  476.       $("#divstat").show();
  477.     } else
  478.       $("#divstat").hide();
  479.  
  480.     let isnewmeter = await meterload();
  481.     if (isnewmeter) {
  482.       if (lastmeter !== null && lastmeter.rowCount > 0) {
  483.         let lm = lastmeter.rows[0];
  484.  
  485.         let dd = new Date(lm.Timestamp + "Z");
  486.         let disp = dd.toLocaleDateString(environment.language) + " " +
  487.             dd.toLocaleTimeString(environment.language, {hour: "numeric", minute: "numeric"});
  488.         $("#metertime").text(disp);
  489.         $("#meterlink").attr("href", `${environment.base_url}/meterlog?device=${get['id']}`);
  490. //Открытие новой вкладки для "Показания учета"
  491.         //$("#meterlink").attr("target", `meterlog${get['id']}`);
  492.         mdt.ajax.reload();
  493.         $("#meterstat").show();
  494.       } else
  495.         $("#meterstat").hide();
  496.     }
  497.  
  498.     nextt = 5000;
  499.   }
  500.   setTimeout(iprenew, nextt);
  501. }
  502.  
  503.  
  504. async function onlogchane() {
  505.   if (dt != null) {
  506.     dt.ajax.reload();
  507.     $('[data-toggle="tooltip"]').tooltip('dispose');
  508.     $(".tooltip").remove();
  509.     $('[data-toggle="tooltip"]').tooltip();
  510.   }
  511.   let result = null;
  512.  
  513.   try {
  514.     result = await $.ajax({
  515.       url: environment.base_url + "/" + "?do=api&fn=states&Devices_id=" + get['id'],
  516.       type: 'GET',
  517.       dataType: "json"
  518.     });
  519.   } catch (error) {
  520.     console.error(error);
  521.   }
  522.  
  523.   if (result !== null && result.rows.length > 0) {
  524.     let state = result.rows[0];
  525.     setSvgstate(state);
  526.     setTextstate(state);
  527.   }
  528. }
  529.  
  530. function setTextstate(state) {
  531.   let m = moment(state.unixtime * 1000);
  532.   $("#StateTime").text(m.format("LT, L"));
  533.   if (box.Type == 2)
  534.     $("#SwState").text("" + state.State + "%");
  535.   else
  536.     $("#SwState").text(SwitchStateForMask(state.State));//Антон: отображение команд с учетом маски
  537.   let mode = state.Mode == 4 ? "Manual" : "Auto";
  538.   mode = i18next.t(mode);
  539.   if (state.Mode == 1)
  540.     mode += ", " + box.DimProfile_Name;
  541.   $("#CurrentMode").text(mode);
  542.  
  543.   let door = i18next.t("Closed");
  544.   if (!state.Door)
  545.     door = '<span class="text-danger">' + i18next.t("Open") + "</span>";
  546.   $("#DoorStatus").html(door);
  547.  
  548.  
  549.   let sync = i18next.t("Synced");
  550.   if (state.Ous)
  551.     sync = '<span class="text-danger">' + i18next.t("Out of sync") + "</span>";
  552.   $("#SyncStatus").html(sync);
  553.  
  554. }
  555.  
  556. function setSvgstate(state) {
  557.  
  558.   let onoff = SwitchState(state.State);
  559.  
  560.   const ruge = "#ecabab";
  561.   const salat = "#abecab";
  562.  
  563.   const errorColor = state.Trouble == STATE_ERROR_UNKNOWN ? ruge : "red";
  564.   const greenColor = state.Trouble == STATE_ERROR_UNKNOWN ? salat : "green";
  565.  
  566.   //const phasecolor = state.Power?"green":ruge;
  567.   let aphst = [];
  568.   for (let i = 0; i < 3; i++) {
  569.     let plet = String.fromCharCode("A".charCodeAt() + i);
  570.     let phst = state.Power & (1 << i);
  571.     aphst[i] = phst;
  572.     let phasecolor = phst ? greenColor : errorColor;
  573.     $(`#phase_${plet}`).css("stroke", phasecolor);
  574. //V11
  575.     $("#Volt" + i).text(plet);
  576.     if (state.PhaseV) {
  577.       let aVolt = JSON.parse(state.PhaseV);
  578.       if (aVolt[i] !== null && aVolt[i] > 1)
  579.         $("#Volt" + i).text(aVolt[i]);
  580.     }
  581.   }
  582.   //$(".phase").css("stroke",phasecolor);
  583.  
  584.  
  585. // КОНТАКТОРЫ
  586.   for (let i = 1; i <= 4; i++) {
  587.     let swtrouble = state.Trouble & (1 << (i - 1));     //аварийность контактора
  588.     let altsw = state.Trouble & (1 << (i + 27));        //альтернативное включение контактора
  589.     let on = (onoff[i - 1] !== '0');                    // значение управления on/off && aphst[0]; 20.07.21 - remove Phase A falsification
  590.     // Команда на включение ON
  591.     if (on) {
  592.       $(`.S${i}_on`).attr("visibility", "visible");     //видимость состояния on
  593.       $(`.S${i}_off`).attr("visibility", "hidden");     //скрыть состояние off
  594.       $(`.S${i}_onoff`).attr("visibility", "hidden");   //скрыть состояние onoff
  595.       $(`.S${i}_offon`).attr("visibility", "hidden");   //скрыть состояние offon
  596.       let swc = "green";
  597.       $(`#S${i}_rect1`).css("fill", "#AFEEEE");         // левый прямоугольник (голубой)
  598.       $(`#S${i}_rect2`).css("fill", swc);               // правый прямоугольник "зеленый"
  599.       $(`#S${i}_tilda`).css("stroke", swc);             //цвет контура синусоиды "зеленый"
  600.       $(`#S${i}_tilda`).css("fill", swc);               //цвет заполнения синусоиды "зеленый"
  601.       $(`.fuse_S${i}`).css("fill", swc);                    //предохранители под напряжением "зеленые"
  602.       //Отсутствие фазы «А»
  603.       if (!aphst[0]) {
  604.         $(`.S${i}_off`).attr("visibility", "hidden");       // не видимость контактора, как Off
  605.         $(`.S${i}_on`).attr("visibility", "hidden");        //не видимость контактора, как ON
  606.         $(`.S${i}_onoff`).attr("visibility", "visible");    //видимость состояния onoff
  607.         $(`.S${i}_offon`).attr("visibility", "hidden"); //скрыть состояние offon
  608.         swc = salat;
  609.         $(`#S${i}_rect1`).css("fill", "#AFEEEE");           // левый прямоугольник "голубой"
  610.         $(`#S${i}_rect2`).css("fill", swc);             // правый прямоугольник "салатный"
  611.         $(`#S${i}_tilda`).css("stroke", "white");           //белый синус
  612.         $(`#S${i}_tilda`).css("fill", "white");         //белый синус
  613.         $(`.fuse_S${i}`).css("fill", "white");              //предохранители "белые"
  614.         if (altsw) {                                            //если альтернативно-включенный контактор
  615.           $(`.S${i}_onoff`).attr("visibility", "hidden");   //не видимость состояния onoff
  616.           $(`.S${i}_offon`).attr("visibility", "visible");  //видимость состояния offon
  617.           $(`#S${i}_rect2`).css("fill", "red");             // правый прямоугольник
  618.           $(`.fuse_S${i}`).css("fill", "green");                //предохранители под напряжением "зеленые"_07_09
  619.         }
  620.       }
  621.       //аварийность контактора
  622.       if (swtrouble) {
  623.         $(`.S${i}_onoff`).attr("visibility", "visible");    // видимость контактора, как onoff
  624.         $(`.S${i}_offon`).attr("visibility", "hidden"); //скрыть состояние offon
  625.         $(`.S${i}_off`).attr("visibility", "hidden");       // не видимость контактора, как Off
  626.         $(`.S${i}_on`).attr("visibility", "hidden");        //не видимость включенного контактора
  627.         $(`#S${i}_rect1`).css("fill", errorColor);          // левый прямоугольник "красный"
  628.         $(`#S${i}_rect2`).css("fill", salat);               // правый прямоугольник "салатный"
  629.         $(`#S${i}_tilda`).css("stroke", "white");           //белый синус
  630.         $(`#S${i}_tilda`).css("fill", "white");         //белый синус
  631.         $(`.fuse_S${i}`).css("fill", "white");              //предохранители "белые"
  632.       }
  633.     }
  634.     // Команда на выключение OFF
  635.     else {
  636.       $(`.S${i}_on`).attr("visibility", "hidden");      //скрыть состояние ON
  637.       $(`.S${i}_onoff`).attr("visibility", "hidden");   //скрыть состояние onoff
  638.       $(`.S${i}_offon`).attr("visibility", "hidden");   //скрыть состояние offon
  639.       $(`.S${i}_off`).attr("visibility", "visible");        //показать состояние OFF
  640.       $(`#S${i}_rect2`).css("fill", "white");           // правый прямоугольник "белый"
  641.       $(`#S${i}_rect1`).css("fill", "#AFEEEE");         // левый прямоугольник голубой
  642.       $(`#S${i}_tilda`).css("stroke", "green");         //цвет контура синусоиды
  643.       $(`#S${i}_tilda`).css("fill", "green");           //цвет заполнения синусоиды
  644.       $(`.fuse_S${i}`).css("fill", "white");                //предохранители
  645.       // Отсутствие фазы А
  646.       if (!aphst[0]) {
  647.         $(`#S${i}_tilda`).css("stroke", "white");   //белый синус
  648.         $(`#S${i}_tilda`).css("fill", "white");
  649.       } //белый синус
  650.       // Авария контактора
  651.       if (swtrouble) {
  652.         $(`#S${i}_rect1`).css("fill", errorColor);      // левый прямоугольник красный
  653.         $(`#S${i}_tilda`).css("stroke", "white");       //белый синус
  654.         $(`#S${i}_tilda`).css("fill", "white");
  655.       }     //белый синус
  656.       // Альтернативное включение
  657.       if (altsw) {                                      //если есть альтернативно-включенный контактор
  658.         $(`.S${i}_off`).attr("visibility", "hidden");
  659.         $(`.S${i}_offon`).attr("visibility", "visible");
  660.         $(`#S${i}_rect2`).css("fill", "red");           // правый прямоугольник красный
  661.         $(`.fuse_S${i}`).css("green");              //предохранители под напряжением "зеленые"_07_09
  662.       }
  663.     }
  664.   }
  665.  
  666. //ПРЕДОХРАНИТЕЛИ 
  667.   for (let i = 0; i < 3; i++)
  668.     if (!aphst[i])
  669.       $(`.fuse_P${i}`).css("fill", "none");
  670.  
  671. //V10__Отображение значений напряжения на линиях/предохранителях   
  672.   let volt = null;
  673.   try {
  674.     volt = JSON.parse(state.Voltage);
  675.   } catch (e) {
  676.  
  677.   }
  678. //V11  
  679.   $('[id^="fuse_"]').find("title").remove();
  680.   for (let i = 1; i <= 24; i++) {
  681.     let ftrouble = state.Trouble & (1 << (i + 3));
  682.     $(`.fuse_${i}_rect`).attr("visibility", "hidden");  //V14   Не видимость знака стрелок
  683.     if (volt) {
  684.       let fVolt = volt[i - 1];
  685.       if (fVolt) {
  686.         $(`#fuse_${i}_rect`).css("fill", "green");
  687.         let titlestr = fVolt > 1 ? fVolt + "V" : "⚡";
  688.         let title = document.createElementNS("http://www.w3.org/2000/svg", "title");
  689.         title.textContent = titlestr;
  690. //V11              
  691.         $(`#fuse_${i}`).append(title);
  692.       } else
  693.         $(`#fuse_${i}_rect`).css("fill", "white");
  694.  
  695. //V14 окраска встречки градиентом "зеленого" и символ "стрелки"
  696.       if (ftrouble && fVolt) {
  697.         $(`#fuse_${i}_rect`).css("fill", "url(#MyGradient)");
  698.         $(`.fuse_${i}_rect`).attr("visibility", "visible");     // видимость знака стрелок
  699.       }
  700.  
  701. //V14  окраска пониженного напряжения градиентом2 "зеленого"
  702.       if (fVolt < 180 && fVolt > 30) {
  703.         $(`#fuse_${i}_rect`).css("fill", "url(#MyGradient2)");
  704.         $(`.fuse_${i}_rect`).attr("visibility", "hidden");  // не видимость знака стрелок
  705.       }
  706.  
  707.       if (ftrouble && !fVolt)
  708.         $(`#fuse_${i}_rect`).css("fill", errorColor);
  709.  
  710.     }
  711.  
  712.     //else {
  713.     //if(ftrouble)
  714.     //$(`#fuse_${ i }_rect`).css("fill",errorColor);}
  715.  
  716.   }
  717. }
  718.  
  719. function SwitchState(num) {
  720.   if (num === null)
  721.     return "-";
  722.  
  723.   num = Math.min(num, 0b1111);
  724.  
  725.   return num.toString(2).padStart("4", "0"); //For robot
  726. }
  727.  
  728. //Антон: отображение команд с учетом маски
  729. function SwitchStateForMask(num) {
  730.   if (num === null)
  731.     return "-";
  732.   let maskCommand = box ? box.Mask_Command : ''
  733.   if (!maskCommand) {
  734.     num = Math.min(num, 0b1111);
  735.  
  736.     return num.toString(2).padStart("4", "0");
  737.   }
  738.   let len = maskCommand ? maskCommand.length : 4;
  739.  
  740.   let binStr = num.toString(2).padStart(len, "0");
  741.  
  742.   let result = "";
  743.   for (let i = 0; i < len; i++) {
  744.     if (maskCommand[i] === "1") {
  745.       result += binStr[i];
  746.     }
  747.   }
  748.   return result;
  749. }
  750.  
  751. function meterdatatable() {
  752.   mdt = $('#meterlog').DataTable({
  753.     "ajax": function (data, callback, settings) {
  754.       let dt = [];
  755.       if (lastmeter !== null)
  756.         dt = lastmeter.rows;
  757.       callback({data: dt});
  758.     },
  759.     "info": false,
  760.     "rowId": "id",
  761.     "language": datatables_locale,
  762.     "paging": false,
  763.     "ordering": false,
  764.     "searching": false,
  765.     "scrollX": true,
  766.     "columns": [
  767.       {
  768.         "data": "Tag",
  769.         render: function (data, type, row) {
  770.           return i18next.t("msg_meter_" + data);
  771.         }
  772.       },
  773.       {
  774.         "data": "Value", className: 'text-right',
  775.         render: function (data, type, row) {
  776.           let tag = appdata.Meter[row.Tag];
  777.           if (tag.type == "decimal") {
  778.             let num = parseFloat(data);
  779.             if (type == "export")
  780.               return num;
  781.             return Intl.NumberFormat(environment.language, {minimumFractionDigits: 3}).format(num);
  782.           }
  783.           return data;
  784.         }
  785.       },
  786.     ],
  787.   });
  788.  
  789.   mdt.on("draw", function () {
  790.     $('[data-toggle="tooltip"]').tooltip();
  791.   });
  792.  
  793.   mdt.on("init", function () {
  794.     $('[data-toggle="tooltip"]').tooltip();
  795.   });
  796. }
  797.  
  798. function stdatatable() {
  799.  
  800.   dt = $('#stlog').DataTable({
  801.     "ajax": function (data, callback, settings) {
  802.       if (stlog !== null)
  803.         callback({data: stlog.rows});
  804.     },
  805.     "info": false,
  806.     "rowId": "id",
  807.     "language": datatables_locale,
  808.     "paging": false,
  809.     "ordering": false,
  810.     "searching": false,
  811.     "scrollX": true,
  812.     "scrollY": "27rem",
  813.     "scrollCollapse": true,
  814.     "deferRender": true,
  815.  
  816.     "columns": [
  817.       {"data": "id", visible: false},
  818.       {
  819.         "data": "Timestamp",
  820.         render: function (data, type, row) {
  821.           if (type == "display") {
  822.             let m = moment(row.unixtime * 1000);
  823.             let td = moment();
  824.             let fs = "L LT";
  825.             if (td.isSame(m, 'd'))
  826.               fs = "LT";
  827.             let tz = row.tz.charAt(0) == "-" ? "" : "+" + row.tz;
  828.             let stime = data + " " + tz;
  829.             return `<span data-toggle="tooltip" title="${stime}">${m.format(fs)}</span>`;
  830.           }
  831.           return data;
  832.         }
  833.       },
  834.  
  835.       {
  836.         "data": "Mode",
  837.         render: function (data, type, row) {
  838.           let strm = i18next.t("Unmanaged");
  839.           if (row.Smart)
  840.             strm = i18next.t(appdata.AutoModes.find(x => x.id == data).Name);
  841.  
  842.           return strm;
  843.         }
  844.       },
  845.  
  846.       {
  847.         "data": "State",
  848.         "className": "text-center",  //Антон: центровка отображения команд с учетом маски
  849.         render: function (data, type, row) {
  850.           let str = data + "%";
  851.           if (row.Type == 1) {//Box
  852.             str = SwitchStateForMask(data);//Антон: отображение команд с учетом маски
  853.           }
  854.           return str;
  855.         }
  856.  
  857.       },
  858.       {
  859.         "data": "Sip",
  860.         "className": "text-center text-nowrap",
  861.         render: function (data, type, row) {
  862.           if (type == "display") {
  863.             let ret = "";
  864.             if (row.Power >= 7 || (row.Power && box.Type == 2))
  865.               ret = `<span class="fa fa-plug text-success" data-toggle="tooltip" title="${i18next.t('Power Ok')}"></span>&nbsp;`;
  866.             else {
  867.               let title = i18next.t('Power Fail');
  868.               title += " (" + reverseString(row.Power.toString(2).padStart(3, "0")) + ")";
  869.  
  870.               ret = `<span class="fa fa-plug text-danger" data-toggle="tooltip" title="${title}"></span>&nbsp;`;
  871.             }
  872.  
  873.             if (!row.Trouble)
  874.               ret += `<span class="fa fa-check-circle text-success" data-toggle="tooltip" title="${i18next.t('Facility is Ok')}"></span>&nbsp;`;
  875.             else
  876.               ret += `<span class="fa fa-exclamation-triangle text-danger" data-html="true" data-toggle="tooltip" title="${errDecode(row.Trouble, box.Type)}"></span>&nbsp;`;
  877.  
  878.  
  879.             if (data)
  880.               ret += `<span class="fa fa-phone-square text-success" data-toggle="tooltip" title="${i18next.t('SIP is Ok')}"></span>&nbsp;`;
  881.             else
  882.               ret += `<span class="fa fa-phone-square text-danger" data-toggle="tooltip" title="${i18next.t('SIP fault')}"></span>&nbsp;`;
  883.  
  884.             if (row.Ip)
  885.               ret += `<span class="fa fa-wifi text-success" data-toggle="tooltip" title="${i18next.t('IP is Ok')}"></span>&nbsp;`;
  886.             else
  887.               ret += `<span class="fa fa-wifi text-danger" data-toggle="tooltip" title="${i18next.t('IP fault')}"></span>&nbsp;`;
  888.  
  889.             if (!row.Timeallert)
  890.               ret += `<span class="fa fa-clock-o text-success" data-toggle="tooltip" title="${i18next.t('Clock is Ok')}"></span>&nbsp;`;
  891.             else
  892.               ret += `<span class="fa fa-clock-o text-danger" data-toggle="tooltip" title="${i18next.t('Clock error')}"></span>&nbsp`;
  893.  
  894.             if (row.Controller)
  895.               ret += `<span class="fa fa-microchip text-success" data-toggle="tooltip" title="${i18next.t('Controller is OK')}"></span>&nbsp`;
  896.             else
  897.               ret += `<span class="fa fa-microchip text-danger" data-toggle="tooltip" title="${i18next.t('Controller error')}"></span>&nbsp`;
  898.  
  899.             if (row.Door)
  900.               ret += `<span class="fa fa-lock text-success" data-toggle="tooltip" title="${i18next.t('Case closed')}"></span>&nbsp`;
  901.             else
  902.               ret += `<span class="fa fa-unlock text-danger" data-toggle="tooltip" title="${i18next.t('Case open')}"></span>&nbsp`;
  903.  
  904.             if (row.Ous)
  905.               ret += `<span class="fa fa-refresh text-danger" data-toggle="tooltip" title="${i18next.t('Out of sync')}"></span>`;
  906.             else
  907.               ret += `<span class="fa fa-refresh text-success" data-toggle="tooltip" title="${i18next.t('Synced')}"></span>`;
  908.  
  909.             return ret;
  910.  
  911.           }
  912.           return data;
  913.         }
  914.       },
  915.  
  916.  
  917.       {
  918.         "data": "DimProfileName",
  919.         "className": "text-nowrap",
  920.         render: function (data, type, row) {
  921.           let strd = "";
  922.           let title = ""
  923.           if (row.Smart) {
  924.  
  925.             if (!(row.IncomingLog_id === null)) {
  926.               title = i18next.t("Notification");
  927.               if (!(row.Status_name === null))
  928.                 strd = escapeQuote(i18next.t(row.Status_Name)) + " ";
  929.               if (!(row.RemoteIP === null)) {
  930.                 strd = i18next.t("Statistics") + " ";
  931.                 title = "IP: " + row.RemoteIP;
  932.               }
  933.               strd += "(&lArr;)";
  934.  
  935.               if (type == "display")
  936.                 strd = `<span data-toggle="tooltip" title="${title}">${strd}</span>`;
  937.             }
  938.             if (!(row.OutgoingLog_id === null)) {
  939.               strd = "&rArr;";
  940.               strd = escapeQuote(i18next.t(row.Command_Name)) + " (" + strd + ")";
  941.               if (row.IP_Name)
  942.                 strd = escapeQuote(i18next.t(row.IP_Name)) + ", " + strd;
  943.               title = i18next.t("Command");
  944.               if (type == "display")
  945.                 strd = `<span data-toggle="tooltip" title="${title}" class="text-${row.Hangupcause == 17 ? 'success' : 'danger'}">${strd}</span>`;
  946.  
  947.             }
  948.             if (!(row.DimProfile_id === null)) {
  949.               strd = data;
  950.               title = i18next.t("Shedule");
  951.               if (type == "display")
  952.                 strd = `<span data-toggle="tooltip" title="${title}"}">${strd}</span>`;
  953.            }
  954.          }
  955.          return strd;
  956.        }
  957.      }
  958.  
  959.    ]
  960.  
  961.  });
  962.  
  963.  dt.on("draw", function () {
  964.    $('[data-toggle="tooltip"]').tooltip();
  965.  
  966.  });
  967.  
  968.  dt.on("init", function () {
  969.    $('[data-toggle="tooltip"]').tooltip();
  970.  });
  971.  
  972. }
  973.  
  974. async function attachBackground() {
  975.  const $svg = $("#circuit").children("svg");
  976.  if (!$svg.length || $("#schemaWrapper").length) return;
  977.  
  978.  let bgSrc = null;
  979.  try {
  980.    const res = await $.ajax({
  981.      url: `${environment.base_url}/?do=api&fn=picture_list` +
  982.          `&Devices_id=${get["id"]}&order=ASC&limit=1&tag=bg`,
  983.      type: "GET",
  984.      dataType: "json"
  985.    });
  986.    if (res.list?.length) bgSrc = res.list[0].src;
  987.  } catch (e) {
  988.    console.error("BG fetch error:", e);
  989.  }
  990.  
  991.  if (!bgSrc) bgSrc = `${environment.base_url}/images/tl_default_bg.png`;
  992.  
  993.  $svg.wrap(
  994.      '<div id="schemaWrapper" ' +
  995.      '     style="position:relative; display: flex;\n' +
  996.      '    align-items: flex-end;\n' +
  997.      '    justify-content: center;\n' +
  998.      '    padding-bottom: 70px;margin-top: 10px;">' +
  999.      "</div>"
  1000.  );
  1001.  $("#schemaWrapper").prepend(
  1002.      `<img id="schemaBg" ` +
  1003.      `     src="${bgSrc}" ` +
  1004.      `     style="position:absolute;top:-10px; bottom: 0;left:0;width:100%;` +
  1005.       `            height:100%; object-fit: contain;object-position: left;z-index:1;pointer-events:none;" />`
  1006.  );
  1007.  $svg.css({ position: "relative", zIndex: 2,  maxWidth: '60%', marginRight: '30%', marginBottom: '-70px' });
  1008. }
  1009.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement