[{"server":null,"owner":null,"id":"b6a1f48d-dd30-42ca-b3bc-e8155fa22774","params":{"result":{"value":"","datetime":1639485972,"status":null,"version":0},"hash":{"value":"O4Du1iOjlpfWlF6PiItpSA==","datetime":1639583137,"status":null,"version":0},"enabled":{"value":true,"datetime":1639485972,"status":null,"version":0},"error_text":{"value":"","datetime":1639582465,"status":null,"version":0},"type":{"value":"EgsScenario","datetime":1639583005,"status":null,"version":0},"settings":{"value":"{\r\n  \"substances\": {\r\n    \"AskAtmosferaChemicalSensor\": {\r\n      \"sulfur_dioxide\": \"SulfurDioxide\",\r\n      \"nitrogen_oxide\": \"NitrogenOxide\"\r\n    }\r\n  },\r\n  \"event_server\": \"server\",\r\n  \"event_timeout\": \"00:00:05\",\r\n  \"command_timeout\": \"00:00:05\",\r\n  \"start_timeout\": \"00:00:05\",\r\n  \"repeat_timeout\": \"00:00:05\",\r\n  \"stop_timeout\": \"00:00:05\",\r\n  \"interval\": \"00:00:05\"\r\n}","datetime":1639572091,"status":null,"version":0},"state":{"value":"ok.normal","datetime":1639582465,"status":null,"version":0},"script":{"value":"# имя: 'Hazard Emission Calculator Automation'\r\n# описание: автоматическиц запуск рассчета зоны поражения\r\n# тип триггера: 'EgsScenario'\r\n# создан: 2021.11.29 18.30.10, Сельченков Н.Ю.\r\n# изменен: '2021.12.15 19.45.41', Сельченков Н.Ю.\r\n# подробности: https://redmine.integra-s.com:11000/projects/eilyacuario/wiki/Hazard_Emission_Calculator_Automation\r\n\r\nuse System.Convert\r\nuse Newtonsoft.Json.JsonConvert from Newtonsoft.Json\r\nuse acuario2.utils.TextExtension\r\nuse System.Collections.Concurrent.ConcurrentDictionary(Param, HazardEmissionAlgorithmDataSource) as HazardCache\r\n\r\n### UTILS ###\r\n\r\nlet json(obj as object) = JsonConvert.SerializeObject(obj)     \r\nlet shrink(str as string, threshold as int) = TextExtension.Shrink(str ?? \"\", threshold)\r\n\r\n### SETTINGS ###\r\n\r\nuse json_schema\r\n`\r\n{\r\n    \"type\": \"object\",\r\n    \"properties\":\r\n    {\r\n        \"substances\":      \r\n        { \r\n            \"type\": \"object\",\r\n            \"additionalProperties\": \r\n            { \r\n                \"type\": \"object\",\r\n                \"additionalProperties\": { \"type\": \"string\", \"format\": \"HazardStorageSubstance\" } \r\n            }\r\n        },  \r\n        \"start_timeout\": { \"type\": \"string\", \"format\": \"TimeSpan\", \"default\": \"00:00:05\" },\r\n        \"repeat_timeout\": { \"type\": \"string\", \"format\": \"TimeSpan\", \"default\": \"00:00:05\" },\r\n        \"stop_timeout\": { \"type\": \"string\", \"format\": \"TimeSpan\", \"default\": \"00:00:05\" },  \r\n        \"interval\": { \"type\": \"string\", \"format\": \"TimeSpan\", \"default\": \"00:00:05\" },      \r\n    }\r\n}\r\n` as SETTINGS\r\n\r\nlet settings = SETTINGS(this.settings)\r\nlet cache    = HazardCache()\r\n\r\n### START ###\r\n\r\nlet trystart(item as Item, param as Param) =\r\n    let paramValue = Convert.ToDouble(param.Value)\r\n    from settings.substances where Key in item.Types \r\n    select many (from Value where param.Name like Key select Value) do\r\n        let paramSubstance = it\r\n        from item.GetItemsLinkedBy(LogicLink) of type HazardEmissionAlgorithmDataSource             \r\n        where substance is paramSubstance do\r\n            let source         = it\r\n            let timeoutElapsed = source[\"value\"]?.TimePassed > settings.start_timeout \r\n            print(\"trystart\", item, param.Name, paramValue, source.substance, source.alarmThreshold, timeoutElapsed)\r\n            if (paramValue > source.alarmThreshold) and timeoutElapsed then\r\n                source.alarmValue = paramValue\r\n                source.value      = paramValue\r\n                source.state      = \"alarm_alarm\"\r\n                source[\"command\"].Set(\"calculateStartEmergency\", null, DateTime.UtcNow)\r\n                cache[param]          = source\r\n            end\r\n        now\r\n    now\r\nend\r\n\r\n### REPEAT ###\r\n\r\nlet tryrepeat(item as Item, param as Param, source as HazardEmissionAlgorithmDataSource) =\r\n    let paramValue     = Convert.ToDouble(param.Value)\r\n    let timeoutElapsed = source[\"value\"]?.TimePassed > settings.repeat_timeout \r\n    print(\"tryrepeat\", item, param.Name, paramValue, source.substance, source.value, timeoutElapsed)\r\n    if (paramValue > source.value) and timeoutElapsed then\r\n        source.value = paramValue\r\n        source[\"command\"].Set(\"calculateStartEmergency\", null, DateTime.UtcNow)\r\n    end\r\nend\r\n\r\n### STOP ###\r\n\r\nlet trystop(item as Item, param as Param, source as HazardEmissionAlgorithmDataSource) =\r\n    let paramValue     = Convert.ToDouble(param.Value)\r\n    let timeoutElapsed = source[\"value\"]?.TimePassed > settings.stop_timeout \r\n    print(\"trystop\", item, param.Name, paramValue, source.substance, source.alarmThreshold, timeoutElapsed)\r\n    if (paramValue < source.alarmThreshold) and timeoutElapsed then\r\n        source.value = paramValue\r\n        source.state = \"ok_normal\"\r\n        source[\"command\"].Set(\"calculateEndEmergency\", null, DateTime.UtcNow)\r\n        cache.TryRemove(param, source)\r\n    end\r\nend\r\n\r\n### RUN ###\r\n\r\nlet tryaction(item as Item, paramName as string) = \r\n    let source = null as HazardEmissionAlgorithmDataSource\r\n    let param  = item[paramName]\r\n    if param.Type == double then        \r\n        if cache.TryGetValue(param, source) then\r\n            tryrepeat(item, param, source)\r\n            trystop(item, param, source)        \r\n        else\r\n            trystart(item, param)\r\n        end\r\n    end\r\n\r\nend\r\n\r\nlet on_update(source as AbstractObject, changes as string[]) = \r\n    if source is Item item then\r\n        from changes do tryaction(item, it) now                \r\n    void()    \r\nend\r\nthis.RunOnUpdated(on_update)\r\n\r\nlet on_timer() = from cache.Keys do tryaction(Owner as Item, Name) now\r\n    \r\nlet interval = check settings.interval.TotalSeconds > 0 else 1000\r\nthis.RunOnTimer(interval, on_timer)\r\n\r\n\r\n","datetime":1639583141,"status":null,"version":0},"name":{"value":"Hazard Emission Calculator Automation","datetime":1639485972,"status":null,"version":0}},"entity":"item","operation":"create"}]