[{"server":null,"owner":null,"id":"3e81aa94-36b2-4b27-bc66-d8038f38eab4","params":{"result":{"value":null,"datetime":1550743487,"status":null,"version":0},"hash":{"value":"POHaPuSIZkJEncKMoeQmpQ==","datetime":1561711686,"status":null,"version":0},"enabled":{"value":true,"datetime":1550743487,"status":null,"version":0},"error_text":{"value":"Unexpected character encountered while parsing value: c. Path 'result', line 1, position 431. at line 57","datetime":1561711496,"status":null,"version":0},"type":{"value":"EgsObjectUpdated","datetime":1561707272,"status":null,"version":0},"settings":{"value":"{\"url\":\"http://localhost:1986/axis2/services/Iv7Server\",\"max_zoom_distance\":1500.0,\"max_zoom_limit_factor\":1.0}","datetime":1550743487,"status":null,"version":0},"state":{"value":"error.defective","datetime":1561711496,"status":null,"version":0},"script":{"value":"# имя: 'Point observer 2'\r\n# описание: поворот связанной поворотной камеры в предустановленную точку по команде\r\n# тип триггера: 'EgsObjectUpdated'\r\n# создан: 2018.04.11 10.35.35, Сельченков Н.Ю.\r\n# изменен: '2019.06.28 12.48.05', Сельченков Н.Ю.\r\n# подробности: https://redmine.integra-s.com:11000/projects/eilyacuario/wiki//Point_observer_2\r\n\r\nuse System.Uri\r\nuse System.Convert\r\nuse System.Math\r\nuse System.Text.RegularExpressions.Regex\r\nuse System.Collections.Generic.Dictionary(string, object) as Dictionary\r\nuse System.Collections.ArrayList\r\nuse Newtonsoft.Json.JsonConvert from Newtonsoft.Json\r\nuse Newtonsoft.Json.Linq.JArray\r\nuse Newtonsoft.Json.Linq.JObject\r\n\r\nuse acuario2.types.BaseObject from acuario2.types\r\nuse acuario2.types.SpatialObject from acuario2.types\r\nuse acuario2.types.ObservablePoint from acuario2.types\r\nuse acuario2.types.VideoCamera from acuario2.types\r\nuse acuario2.types.PTZDevice from acuario2.types\r\nuse acuario2.types.Overseer_output from acuario2.types\r\nuse acuario2.types.IntegraVideo7 from acuario2.types\r\n\r\nuse utils.GeoPoint from GeoUtils\r\nuse utils.GeoUtils from GeoUtils\r\nuse utils.Matrix3D from GeoUtils\r\n\r\nuse integravideo.client.Iv7Server from IntegraVideo7Client\r\nuse new { code = 0, user_code = 0, result = null as ArrayList } as CallMethod2Result\r\nuse new { pan = 0.0, tilt = 0.0, zoom = 0.0 } as PTZ\r\n\r\nuse typedef\r\n`\r\n    <root>\r\n        <param name=\"url\">http://localhost:1986/axis2/services/Iv7Server</param>\r\n        <param name=\"max_zoom_distance\" type=\"real\">1500</param>\r\n        <param name=\"max_zoom_limit_factor\" type=\"real\">1</param>\r\n    </root>\r\n` as Settings\r\n\r\nconst settings = Settings(trigger.settings)\r\nconst uri      = Uri(settings.url)\r\n\r\n######################################################\r\n\r\nlet iv7 = Iv7Server() \r\niv7.Url = string(uri)\r\n\r\nlet sys_params = \"\" \r\n\r\nlet сall_method2(name as string, args as object, log as bool) = \r\n    let request  = JsonConvert.SerializeObject(args)\r\n    let response = iv7.CallMethod2(name, request, sys_params)\r\n    let res      = JsonConvert.DeserializeObject(response, CallMethod2Result) as CallMethod2Result\r\n    let ok       = (res.code is 0) and (res.user_code is 0)\r\n    if (not ok) and log then\r\n        print request\r\n        print sys_params\r\n        print response\r\n    end\r\n    if ok then res.result\r\nend\r\n\r\nlet logon { login = \"\", password = \"\" } = \r\n    sys_params = JsonConvert.SerializeObject(new { session_id = \"egs\", timeout = 5, relay = string[](0), login = login, password = password })\r\n    сall_method2(\"video-client:Logon\", it, on) is not null\r\nend\r\n\r\nlet get_ptz { key2 = \"\", QueryAll = true, login = \"\", password = \"\" } = \r\n    let res = сall_method2(\"ptzclient:Command\", it, on)\r\n    if res isnt null then \r\n        let ptz  = PTZ()\r\n        let obj  = res[0] as JObject\r\n        ptz.pan  = (obj[\"pan\"] as double) / 100\r\n        ptz.tilt = (obj[\"tilt\"] as double) / 100\r\n        ptz.zoom = (obj[\"zoom\"] as double) / 10000\r\n        ptz\r\n    end\r\nend\r\n\r\nlet _set_ptz { key2 = \"\", PanTo = -1, TiltTo = -1, ZoomTo = -1, GotoPreset = -1, login = \"\", password = \"\" } = сall_method2(\"ptzclient:Command\", it, on) is not null\r\nlet set_ptz(login as string, password as string, key2 as string, ptz as PTZ) = _set_ptz { key2 = key2, PanTo = ptz.pan * 100 as int, TiltTo = ptz.tilt * 100 as int, ZoomTo = ptz.zoom * 10000 as int, login = login, password = password } \r\nlet goto_preset(login as string, password as string, key2 as string, preset as int) = _set_ptz { key2 = key2, GotoPreset = preset, login = login, password = password }\r\n\r\nlet get_param_from_urls(obj as VideoCamera, pattern as string) = \r\n    let regex = Regex(pattern)\r\n    from obj.url select regex.Match(it) where Success select Groups[1].Value first\r\nend\r\n\r\nlet get_key2(obj as VideoCamera) = get_param_from_urls(obj, \"key2=(.+)[&|;]?\")\r\nlet get_udp_id(obj as VideoCamera) = get_param_from_urls(obj, \"udp_id=([0-9]{1,})&\")\r\nlet get_login(obj as VideoCamera) = get_param_from_urls(obj, \"iv7://(.+):.+@\")\r\nlet get_password(obj as VideoCamera) = get_param_from_urls(obj, \"iv7://.+:(.+)@\")\r\n    \r\n######################################################\r\n\r\nlet trace_target(ptzdev as PTZDevice, target as ObservablePoint) =\r\n\r\n    let camera_pos = with ptzdev as SpatialObject do \r\n        let p    = GeoPoint(geo_position)\r\n        p.Height = geo_height\r\n        p\r\n    end\r\n    \r\n    let target_pos = with target as BaseObject do\r\n        let p    = GeoPoint(position)\r\n        p.Height = altitude\r\n        p\r\n    end\r\n    \r\n    let key2   = get_key2(ptzdev as VideoCamera)\r\n    let udp_id = get_udp_id(ptzdev as VideoCamera)\r\n    \r\n    let videoServer = from ptzdev.GetLinkedItems(IntegraVideo7) try single\r\n    let login       = (videoServer?.login) ??? get_login(ptzdev as VideoCamera) \r\n    let password    = (videoServer?.password) ??? get_password(ptzdev as VideoCamera)    \r\n\r\n    logon { login = login, password = password }\r\n    \r\n    let v = ptzdev.calibrationMatrix\r\n    if (v isnt null) and camera_pos.Valid and target_pos.Valid then\r\n    \r\n        let matrix = Matrix3D\r\n        (\r\n            v[0], v[1], v[2], 0, \r\n            v[3], v[4], v[5], 0, \r\n            v[6], v[7], v[8], 0, \r\n               0,    0,    0, 1\r\n        )\r\n\r\n        let arr                   = GeoUtils.recalibrate(camera_pos, target_pos, matrix)\r\n        let ptz                   = PTZ()\r\n        ptz.tilt                  = Math.Round(arr[0], 2, \"AwayFromZero\")\r\n        ptz.pan                   = Math.Round(arr[1], 2, \"AwayFromZero\")\r\n        let range                 = arr[2]\r\n        let max_zoom_distance     = settings.max_zoom_distance ?? 1500\r\n        let max_zoom_limit_factor = settings.max_zoom_limit_factor ?? 1\r\n        ptz.zoom                  = if range > max_zoom_distance then max_zoom_limit_factor else 1 - (max_zoom_distance - range) / max_zoom_distance\r\n        ptz.zoom                  = Math.Round(ptz.zoom, 2, \"AwayFromZero\")\r\n        \r\n        print(\"TRACE\", ptzdev, target, target_pos, ptz)\r\n        set_ptz(login, password, key2, ptz)\r\n    else\r\n    \r\n        print(\"TRACE\", ptzdev, target, target.preset)\r\n        goto_preset(login, password, key2, target.preset)\r\n    end\r\nend\r\n\r\n######################################################\r\n\r\nif (@object is ObservablePoint) and (\"command\" in changes) then\r\n    let target  = @object as ObservablePoint\r\n    let command = target[\"command\"].Old ?? target[\"command\"]\r\n    if command.Text is \"observe\" then\r\n        from target.GetItemsLinkedTo(Overseer_output) of type PTZDevice do trace_target(it, target) now\r\n    end\r\nend\r\n        \r\n    ","datetime":1561711683,"status":null,"version":0},"name":{"value":"Point observer 2","datetime":1550743487,"status":null,"version":0}},"entity":"item","operation":"create"}]