// created_at = 2020-11-01 14:59:59.124174 (function() { var equipment_id = "5f5fa2202438f6c72bbd6b4d"; var equipment_state = {}; var initialization = true; var queue_args = {}; var queue_i = {}; var async_performer = {}; var command_timeout_ms = 180000; var reverse_sync = true; defineVirtualDevice(equipment_id, { title: equipment_id, cells: { exec: { type: "text", value: "0", readonly: false }, executed: { type: "text", value: "0", readonly: false }, reload: { type: "text", value: "0", readonly: false }, suspend: { type: "text", value: "0", readonly: false } } }); var io_5f5fa21b2438f6c72bbd6b22 = null; defineRule(equipment_id + "_reverse_sync_io_5f5fa21b2438f6c72bbd6b22", { whenChanged: "wb-mr6c_44/K2", then: function(newValue, devName, cellName) { if (!reverse_sync) { return; } if (newValue != null) { if (io_5f5fa21b2438f6c72bbd6b22 === null) { log(equipment_id + ": Unknown target value of " + devName + "/" + cellName + ". Current " + newValue); return; } if (io_5f5fa21b2438f6c72bbd6b22 != newValue) { log(equipment_id + ": Change wrong value of " + devName + "/" + cellName + " " + newValue + " to " + io_5f5fa21b2438f6c72bbd6b22); dev[devName][cellName] = io_5f5fa21b2438f6c72bbd6b22; } } else { log(equipment_id + ": incoming wrong value " + devName + "/" + cellName + " " + newValue); } } }); function exec(command) { if (command == 0) { return; } try { log(equipment_id + " Exec: " + command); var cmd = JSON.parse(command); if (!cmd.hasOwnProperty("channels")) { return; } var now = new Date(); var expiration_stamp = cmd.expiration_stamp_ms; if (now.getTime() > expiration_stamp) { return; } dev[equipment_id]["executed"] = command; for (var ch_i in cmd.channels) { var first_timeout = 1000; if (async_performer[ch_i]) { if (cmd.source == "reload") { log(equipment_id + " busy! Skip reload...") return; } clearTimeout(async_performer[ch_i]); async_performer[ch_i] = null; first_timeout = 10000; } queue_args[ch_i] = cmd.channels[ch_i]; queue_i[ch_i] = 0; equipment_state[ch_i] = JSON.stringify(queue_args[ch_i]); if (cmd.channels[ch_i].length == 0) { log(equipment_id + ": empty rule. Skip!") return; } async_performer[ch_i] = setTimeout(function worker(my_ch_i) { if ((typeof queue_i[my_ch_i] == 'undefined') || (async_performer[my_ch_i] == null)) { async_performer[ch_i] = null; return; } log(equipment_id + " " + my_ch_i + "[" + queue_i[my_ch_i] + "]: " + queue_args[my_ch_i]); commands[my_ch_i](queue_args[my_ch_i][queue_i[my_ch_i]]); queue_i[my_ch_i]++; if (queue_args[my_ch_i].length > queue_i[my_ch_i]) { log(equipment_id + " ch_i: " + my_ch_i + " CONTINUE"); async_performer[my_ch_i] = setTimeout(worker.bind(null, my_ch_i), 5000); } else { log(equipment_id + " ch_i: " + my_ch_i + " RETURN"); async_performer[my_ch_i] = null; } }.bind(null, ch_i), first_timeout); } } catch (e) { log(equipment_id + " " + e); return; } }; defineRule(equipment_id + "_exec", { whenChanged: equipment_id + "/exec", then: function(newValue, devName, cellName) { log(equipment_id + " start exec function") exec(newValue); } }); var commands = { "ch_power": function(args) { io_5f5fa21b2438f6c72bbd6b22 = args[0] == true; dev["wb-mr6c_44"]["K2"] = args[0] == true; } }; var schedule_function_0 = function() { var now = new Date(); var cmd = { channels: { ch_power: [[0.0]] } }; cmd.expiration_stamp_ms = now.getTime() + command_timeout_ms; cmd.cmd_timestamp_ms = now.getTime(); cmd.source = 'schedule'; log(equipment_id + " Do schedule: " + JSON.stringify(cmd)); exec(JSON.stringify(cmd)); }; var schedule_function_1 = function() { var now = new Date(); var cmd = { channels: { ch_power: [[1.0]] } }; cmd.expiration_stamp_ms = now.getTime() + command_timeout_ms; cmd.cmd_timestamp_ms = now.getTime(); cmd.source = 'schedule'; log(equipment_id + " Do schedule: " + JSON.stringify(cmd)); exec(JSON.stringify(cmd)); }; var timeIntervalCheck = function (datetime, time_from, time_to) {{ var seconds = datetime.getSeconds(); var minutes = datetime.getMinutes(); var hour = datetime.getHours(); var result_seconds = hour*60*60 + minutes*60 + seconds; return (result_seconds >= time_from) && (result_seconds < time_to); }}; var time_map = [ [ { schedule_command: schedule_function_0, schedule_performed: false, date_check: function(datetime) { var actual_datetime = new Date(datetime); actual_datetime.setSeconds(actual_datetime.getSeconds() + (10800)); return timeIntervalCheck(actual_datetime, 0, 11100); } } , { schedule_command: schedule_function_1, schedule_performed: false, date_check: function(datetime) { var actual_datetime = new Date(datetime); actual_datetime.setSeconds(actual_datetime.getSeconds() + (10800)); return timeIntervalCheck(actual_datetime, 11100, 13500); } } , { schedule_command: schedule_function_0, schedule_performed: false, date_check: function(datetime) { var actual_datetime = new Date(datetime); actual_datetime.setSeconds(actual_datetime.getSeconds() + (10800)); return timeIntervalCheck(actual_datetime, 13500, 86399); } } ] ]; defineRule(equipment_id + "_SCHEDULE", { when: cron("@every 10s"), then: function() { var time_span_found = false; var schedule_performed = false; var now = new Date(); for (var layer = time_map.length - 1; layer >= 0; layer--) { for (var i in time_map[layer]) { if (time_map[layer][i].date_check(now)) { if ((!time_map[layer][i].schedule_performed) && (!time_span_found)) { dev[equipment_id]["suspend"] = "0"; time_map[layer][i].schedule_performed = true; if (typeof time_map[layer][i].schedule_command === "function") { time_map[layer][i].schedule_command(); } schedule_performed = true; } time_span_found = true; } else { time_map[layer][i].schedule_performed = false; } } } if (!schedule_performed) { if (initialization) { initialization = false; ; log(equipment_id + " initialized"); } else { ; } } else { log(equipment_id + " schedule performed"); } } }); })();