[{"server":null,"owner":null,"id":"238eb4d3-6a97-4617-be24-0288d7e41d5e","params":{"type":{"value":"EgsScheduled","datetime":1550919601,"status":null,"version":0},"settings":{"value":"{\"type\":\"VideoCamera\",\"states\":[\"*\"],\"time_start\":null,\"time_gain\":null,\"time_yaw\":null,\"time_stop\":null}","datetime":1550827212,"status":null,"version":0},"period_time":{"value":null,"datetime":1550827045,"status":null,"version":0},"error_text":{"value":null,"datetime":1550830548,"status":null,"version":0},"repeat":{"value":0,"datetime":1550827186,"status":null,"version":0},"period_unit":{"value":"Millisecond","datetime":1550828314,"status":null,"version":0},"hash":{"value":"+81K1pTj1kVBmjdzUk+Hzw==","datetime":1550919647,"status":null,"version":0},"name":{"value":"State simulator 2","datetime":1550827045,"status":null,"version":0},"enabled":{"value":false,"datetime":1550919616,"status":null,"version":0},"result":{"value":null,"datetime":1550919601,"status":null,"version":0},"typedef":{"value":"","datetime":1550827045,"status":null,"version":0},"period_count":{"value":200,"datetime":1550828335,"status":null,"version":0},"state":{"value":"ok.normal","datetime":1550830548,"status":null,"version":0},"script":{"value":"# имя: 'State simulator 2'\r\n# описание: cимулятор событий\r\n# тип триггера: 'EgsScheduled'\r\n# создан: 2017.10.03 14:22:07, Сельченков Н.Ю.\r\n# изменен: '2019.02.23 15.00.46', Сельченков Н.Ю.\r\n# подробности: https://redmine.integra-s.com:11000/projects/eilyacuario/wiki/State_simulator_2\r\n\r\nuse System.Random\r\nuse System.Math\r\n\r\nuse typedef\r\n`\r\n    <root>\r\n        <param name=\"type\" type=\"text\"/>\r\n        <param name=\"states\" type=\"list\"/>\r\n        <param name=\"time_start\" type=\"time\"/>\r\n        <param name=\"time_gain\" type=\"span\"/>\r\n        <param name=\"time_yaw\" type=\"span\"/>\r\n        <param name=\"time_stop\" type=\"time\"/>\r\n    </root>\r\n` as Settings\r\n\r\n\r\nconst settings = Settings(trigger.settings)\r\n\r\nuse (\"acuario2.types.\" + settings.type) as ItemType from acuario2.types\r\n\r\nonce next_time = settings.time_start ?? DateTime.MinValue\r\n\r\nlet allowed_state(state as string) = from settings.states any state like it\r\n\r\nlet simulate(param as Param) =\r\n    let states = from param.EnumNames where it is allowed_state to array\r\n    if states isnt empty then \r\n        let state = states[Random().Next(0, states.Length)] \r\n        let time  =  DateTime.Now\r\n        if settings.time_start isnt null then\r\n            time     = next_time\r\n            let gain = settings.time_gain ?? TimeSpan.Zero\r\n            if (settings.time_stop isnt null) and (trigger.repeat > 0) then \r\n                settings.time_gain = TimeSpan.FromTicks((settings.time_stop - settings.time_start).Ticks / trigger.repeat)\r\n            end\r\n            next_time       = time + gain\r\n            let ms          = settings.time_yaw?.TotalMilliseconds as int\r\n            ms              = Random().Next(-ms, ms)\r\n            let span        = TimeSpan.FromMilliseconds(ms)\r\n            next_time       = if ms < 0 then next_time - span else next_time + span\r\n            trigger.enabled = (settings.time_stop is null) or (next_time < settings.time_stop)\r\n        end\r\n        param.Set(state, null, time)\r\n    end\r\nend  \r\n\r\nfrom graph.Values of type Item \r\n    where it is ItemType\r\n    select it[\"state\"]\r\n    where it isnt null\r\n    order by it.DateTime\r\n    group by it.Owner.ServerId\r\n    select (from it try first)\r\n    where it isnt null\r\n    do simulate(it) now\r\n","datetime":1550919646,"status":null,"version":0}},"entity":"item","operation":"create"}]