示例#1
0
        public async Task <byte[]> ThumbnailImageAsync(MinimumData minData, string thumbnailPart)
        {
            var uri = $"https://rest-{minData.RegionTier}.immedia-semi.com/{thumbnailPart}.jpg";
            var ret = await FireGetBytesCallAsync(uri, minData.AuthToken);

            return(ret);
        }
示例#2
0
        /* "CommandClip.cs" and "CommandThumbnail.cs" are only different in "target" and "target_id".
         * The two classes can not be merged due "null can not be mapped to a specific type" error.
         * -> In my opinion is returning "null" for both "CommandClip" properties a design error made by Blink!
         */
        public async Task <CommandClip> CommandClipAsync(MinimumData minData)
        {
            var uri       = $"https://rest-{minData.RegionTier}.immedia-semi.com/network/{minData.NetworkId}/camera/{minData.CameraId}/clip";
            var retString = await FirePostCallWithEmptyBodyAsync(uri, minData.AuthToken);

            var ret = JsonConvert.DeserializeObject <CommandClip>(retString);

            return(ret);
        }
示例#3
0
        public async Task <BlinkSyncModules> SyncModulesAsync(MinimumData minData)
        {
            // ToDo: API NOT FOUND! ######################################################################################################################
            var uri       = $"https://rest-{minData.RegionTier}.immedia-semi.com/network/{minData.NetworkId}/syncmodules";
            var retString = await FireGetCallAsync(uri, minData.AuthToken);

            var ret = JsonConvert.DeserializeObject <BlinkSyncModules>(retString);

            return(ret);
        }
示例#4
0
        public void TakeSnapshots(BaseData baseData, int networkId, int cameraId)
        {
            var uweR70_Get     = new UweR70_Get();
            var uweR70_GetData = new UweR70_GetData();
            var uweR70_PostCallWithEmptyBody = new UweR70_PostCallWithEmptyBody();

            var minData = new MinimumData
            {
                AuthToken  = baseData.AuthToken,
                RegionTier = baseData.RegionTier,
                NetworkId  = networkId,
                CameraId   = cameraId
            };

            #region Comment
            // It does NOT matter whether the camera is active (active := "disable" / "enable") nor whether it is armed or not (armed := true / false)!
            // Just fire ".ThumbnailAsync(..)" to take a thumbnail.
            // Firing this command does NOT change any of these two properties.
            //
            //var magicValueCameraName = "Garten";
            //var beforeHomescreen = uweR70_Get.HomescreenV3Async(baseData).Result;
            //// Eleminate first the sync modul, than search the correct device in the remaining items!
            //var beforeDataList = beforeHomescreen.cameras.Where(x => !string.IsNullOrEmpty(x.name)).Where(x => x.name.Equals(magicValueCameraName, StringComparison.InvariantCultureIgnoreCase)).ToList();
            //if (beforeDataList == null || beforeDataList.Count != 1)
            //{
            //    throw new Exception("'Snapshot.cs', 'TakeSnapshots(...)': Something went wrong!");
            //}
            //var beforeData = beforeDataList[0];
            #endregion

            // Take the snapshot
            var commandThumbnail_Test = uweR70_PostCallWithEmptyBody.CommandThumbnailAsync(minData).Result;

            var cameraStatus = uweR70_Get.CameraStatusAsync(minData).Result;

            var cameraThumbnail = cameraStatus.camera_status.thumbnail;
            if (string.IsNullOrEmpty(BaseStoragePathSnapshot))
            {
                BaseStoragePathSnapshot = GetStoragePath(baseData, networkId, cameraId);
                Form.SetP2TxtBoxInfoText("Base storage path:");
                Form.SetP2TxtBoxInfoText($"\t{BaseStoragePathSnapshot}");
                Form.SetP2TxtBoxInfoText(string.Empty);
            }

            var timestampFormatter      = Common.GetTimestampFormatter();
            var timestamp               = DateTime.Now.ToString(timestampFormatter);
            var cameraThumbnailFileName = $"{++SnapshotCounter:D6}_{timestamp}.jpg";
            Form.SetP2TxtBoxInfoText($"Snapshot #{SnapshotCounter:D6}");
            Form.SetP2TxtBoxInfoText($"\tFile name {cameraThumbnailFileName}");
            Form.SetP2TxtBoxInfoText(string.Empty);

            var cameraThumbnailPathAndFileName = $"{BaseStoragePathSnapshot}\\{cameraThumbnailFileName}";
            var cameraThumbnailByteArray       = uweR70_GetData.ThumbnailImageAsync(minData, cameraThumbnail).Result;
            File.WriteAllBytes(cameraThumbnailPathAndFileName, cameraThumbnailByteArray);
        }
示例#5
0
        public async Task <CommandThumbnail> CommandThumbnailAsync(MinimumData minData)
        {
            //  @POST("https://rest-{tier}.immedia-semi.com/network/{network}/camera/{camera}/thumbnail")
            //  Observable<Command> takeThumbnail(@Path("tier") String paramString, @Path("network") long paramLong1, @Path("camera") long paramLong2);
            var uri       = $"https://rest-{minData.RegionTier}.immedia-semi.com/network/{minData.NetworkId}/camera/{minData.CameraId}/thumbnail";
            var retString = await FirePostCallWithEmptyBodyAsync(uri, minData.AuthToken);

            var ret = JsonConvert.DeserializeObject <CommandThumbnail>(retString);

            return(ret);
        }
示例#6
0
        public async Task <CommandArmDisarm> CommandArmDisarmAsync(MinimumData minData, ArmDisarm armDisarm)
        {
            // @POST("https://rest-{tier}.immedia-semi.com/api/v1/accounts/{accountId}/networks/{networkId}/state/{type}")
            // Observable<Command> armDisarmNetwork(@Path("tier") String paramString1, @Path("accountId") long paramLong1, @Path("networkId") long paramLong2, @Path("type") String paramString2);
            var uri       = $"https://rest-{minData.RegionTier}.immedia-semi.com/network/{minData.NetworkId}/{armDisarm}";
            var retString = await FirePostCallWithEmptyBodyAsync(uri, minData.AuthToken);

            var ret = JsonConvert.DeserializeObject <CommandArmDisarm>(retString);

            return(ret);
        }
示例#7
0
        public async Task <CameraStatus> CameraStatusAsync(MinimumData minData)
        {
            //  @GET("https://rest-{tier}.immedia-semi.com/network/{network}/camera/{camera}")
            //  Observable<CameraStatus> cameraCommandStatus(@Path("tier") String paramString, @Path("network") long paramLong1, @Path("camera") long paramLong2);
            var uri       = $"https://rest-{minData.RegionTier}.immedia-semi.com/network/{minData.NetworkId}/camera/{minData.CameraId}";
            var retString = await FireGetCallAsync(uri, minData.AuthToken);

            var ret = JsonConvert.DeserializeObject <CameraStatus>(retString);

            return(ret);
        }
        public async Task <LiveVideoResponse> LiveView(MinimumData minData, VideoLiveViewBody verifyPinBody)
        {
            //  @POST("https://rest-{tier}.immedia-semi.com/api/v3/networks/{network}/cameras/{camera}/liveview")
            //  Observable<LiveVideoResponse> liveView(@Body VideoLiveViewBody paramVideoLiveViewBody, @Path("tier") String paramString, @Path("network") long paramLong1, @Path("camera") long paramLong2);
            var uri       = $"https://rest-{minData.RegionTier}.immedia-semi.com/api/v3/networks/{minData.NetworkId}/cameras/{minData.CameraId}/liveview";
            var retString = await FirePostCallAsync(uri, verifyPinBody, minData.AuthToken);

            var ret = JsonConvert.DeserializeObject <LiveVideoResponse>(retString);

            return(ret);
        }
示例#9
0
        public async Task <BlinkEvents> EventsAsync(MinimumData minData)
        {
            // ToDo: API NOT FOUND! ######################################################################################################################
            var uri       = $"https://rest-{minData.RegionTier}.immedia-semi.com/events/network/{minData.NetworkId}";
            var retString = await FireGetCallAsync(uri, minData.AuthToken);

            // Special case!
            // The from the api call returned property name "event" is in C# protected.
            // That is why the "Edit" -> "Paste Special" -> "Paste JSON as Classes" prefixes the property "event" with a "_".
            // Solution / workaround as follows:
            retString = retString.Replace("event", "_event");
            var ret = JsonConvert.DeserializeObject <BlinkEvents>(retString);

            return(ret);
        }
示例#10
0
        /// <summary>
        /// Demo implementation to show which data the api calls are requiering and how the api calls are made.
        /// </summary>
        /// <param name="form">Reference to the 'form1' instance.</param>
        /// <param name="baseData">The data recieved while the login/authentification were made.</param>
        /// <returns></returns>
        public void Test(Form1 form, BaseData baseData)
        {
            var uweR70_Get     = new UweR70_Get();
            var uweR70_GetData = new UweR70_GetData();
            var uweR70_PostCallWithEmptyBody    = new UweR70_PostCallWithEmptyBody();
            var uweR70_PostCallWithNonEmptyBody = new UweR70_PostCallWithNonEmptyBody();

            var networkObject = baseData.Networks[0];

            /*
             * var cameraList = baseData.Networks[0].Cameras.Where(x => x.Name.Equals("Garage", StringComparison.InvariantCultureIgnoreCase)).ToList();
             * if (cameraList == null || cameraList.Count != 1)
             * {
             *  throw new Exception("'Quicktest.cs', 'TestAsync(...)': Something went wrong!");
             * }
             * var cameraObject = cameraList[0];
             */
            var cameraObject = baseData.Networks[0].Cameras[1];

            var minData = new MinimumData
            {
                AuthToken  = baseData.AuthToken,
                RegionTier = baseData.RegionTier,
                NetworkId  = networkObject.Id,
                CameraId   = cameraObject.Id
            };


            /*
             * var videoLiveViewBody = new VideoLiveViewBody
             * {
             *   id = minData.CameraId,
             *   network = minData.NetworkId,
             *   type = 4
             * };
             * try
             * {
             *  var liveVideoResponse = new UweR70_PostCallWithNonEmptyBody().LiveView(minData, videoLiveViewBody).Result;
             *
             *  // liveVideoResponse.server = "immis://18.196.123.157:443/jb2dzOlaeVLqLO5C__IMDS_811177681?client_id=146"
             *  // iMMis != iMis, but found olny this ...
             *  //http://help.imis.com/sdk/index.htm#!exampleusingc2.htm
             *
             *  var dummy = 1;
             * }
             * catch (Exception ex)
             * {
             *  var errorMessage = ex.Message;
             *  if (ex.InnerException != null && !string.IsNullOrEmpty(ex.InnerException.Message))
             *  {
             *      errorMessage = ex.InnerException.Message;
             *  }
             *  var xx = errorMessage;
             * }
             */



            /*
             * var network = uweR70_Get.BatteryUssageAsync(baseData).Result;
             * var changedMedia = uweR70_Get.ChangedMediaAsync(baseData, 0).Result;
             * var cameraStatus = uweR70_Get.CameraStatusAsync(minData).Result;
             * var signalStrength = uweR70_Get.SignalStrengthAsync(minData).Result;
             * var homescreenV3 = uweR70_Get.HomescreenV3Async(baseData).Result;
             * var quickRegionInfo = uweR70_Get.QuickRegionInfoAsync(baseData).Result;
             * var syncModules = uweR70_Get.SyncModulesAsync(minData).Result;
             * var regions = uweR70_Get.GetRegionsAsync(baseData, "US").Result;
             *
             * var events = uweR70_Get.EventsAsync(minData).Result;
             * var typeList = new[] { "first_boot", "battery", "armed", "disarmed", "scheduled_arm", "scheduled_disarm", "heartbeat", "sm_offline" };
             * var blinkEvents = events._event;
             * var count = blinkEvents.Length;
             * for (int i = 0; i < typeList.Length; i++)
             * {
             *  blinkEvents = blinkEvents.Where(x => !x.type.Equals(typeList[i], StringComparison.InvariantCultureIgnoreCase)).ToArray();
             *  count = blinkEvents.Length;
             * }
             *
             *
             * var thumbnailImage = uweR70_GetData.ThumbnailImageAsync(minData, "<enter valid data here>").Result;
             * var video = uweR70_GetData.VideoAsync(baseData, "<enter valid data here>").Result;
             *
             *
             * var commandArm = uweR70_PostCallWithEmptyBody.CommandArmDisarmAsync(minData, UweR70_PostCallWithEmptyBody.ArmDisarm.arm).Result;
             * var commandDisarm = uweR70_PostCallWithEmptyBody.CommandArmDisarmAsync(minData, UweR70_PostCallWithEmptyBody.ArmDisarm.disarm).Result;
             * var commandMotionDetectionEnable = uweR70_PostCallWithEmptyBody.CommandMotionDetectionAsync(minData, UweR70_PostCallWithEmptyBody.MotionDetection.enable).Result;
             * var commandMotionDetectionDisable = uweR70_PostCallWithEmptyBody.CommandMotionDetectionAsync(minData, UweR70_PostCallWithEmptyBody.MotionDetection.disable).Result;
             * var commandClip = uweR70_PostCallWithEmptyBody.CommandClipAsync(minData).Result;
             * var commandThumbnail = uweR70_PostCallWithEmptyBody.CommandThumbnailAsync(minData).Result;
             *
             * var login = uweR70_PostCallWithNonEmptyBody.LoginAsync(baseData, new LoginBody
             * {
             *  email = "<your blink email address>",
             *  password = "******"
             * }).Result;
             *
             * var mediaIdLIstBody = new MediaIdListBody
             * {
             *  media_list = new List<long>(new long[] { 12345678, 23456789 })  // Example values
             * };
             * var test = uweR70_PostCallWithNonEmptyBody.DeleteMediaCall(baseData, mediaIdLIstBody);
             */
        }
示例#11
0
        public BaseData Start(Form1 form, string email, string password, string saveDirectory, bool isGerman, MediaIdListBody mediaIdListBody)
        {
            try
            {
                form.SetP0TxtBoxInfoText("Started.");
                form.SetP0TxtBoxInfoText(string.Empty);

                var common         = new Common();
                var uweR70_Get     = new UweR70_Get();
                var uweR70_GetData = new UweR70_GetData();
                var uweR70_PostCallWithNonEmptyBody = new UweR70_PostCallWithNonEmptyBody();

                var storeIt = new StoreIt();

                var baseData = new BaseData
                {
                    Email     = email,
                    LoginTier = isGerman ? "prde" : "prod",
                    Networks  = new List <BaseData.Network>()
                };

                Blink.BatteryUsage batteryUssage = null;

                var alreadyStoredAuthTokens = storeIt.ReadAuthToken();
                var alreadyStoredMainData   = storeIt.ReadMainData();
                var oldAuthTokenWorked      = false;
                if (alreadyStoredAuthTokens != null && alreadyStoredAuthTokens.Count != 0 && alreadyStoredMainData != null)
                {
                    try
                    {
                        baseData.RegionTier        = alreadyStoredMainData.RegionTier;
                        baseData.RegionDescription = alreadyStoredMainData.RegionDescription;
                        baseData.AuthToken         = alreadyStoredAuthTokens[alreadyStoredAuthTokens.Count - 1].Token;
                        baseData.AccountId         = alreadyStoredMainData.AccountId;
                        baseData.ClientId          = alreadyStoredMainData.ClientId;

                        batteryUssage = uweR70_Get.BatteryUssageAsync(baseData).Result;

                        oldAuthTokenWorked = true;
                    }
                    catch {}
                }
                if (!oldAuthTokenWorked)
                {
                    // Authentification api call
                    var login = uweR70_PostCallWithNonEmptyBody.LoginAsync(baseData, new LoginBody
                    {
                        email    = email,
                        password = password
                    }).Result;

                    baseData.RegionTier        = login.region.tier;
                    baseData.RegionDescription = login.region.description;
                    baseData.AuthToken         = login.authtoken.authtoken;
                    baseData.AccountId         = login.account.id;
                    baseData.ClientId          = login.client.id;

                    batteryUssage = uweR70_Get.BatteryUssageAsync(baseData).Result;
                    storeIt.StoreData(baseData, batteryUssage);
                }

                for (var i = 0; i < batteryUssage.networks.Length; i++)
                {
                    baseData.Networks.Add(new BaseData.Network
                    {
                        Id      = batteryUssage.networks[i].network_id,
                        Name    = batteryUssage.networks[i].name,
                        Cameras = new List <BaseData.Camera>()
                    });

                    var minData = new MinimumData
                    {
                        AuthToken  = baseData.AuthToken,
                        RegionTier = baseData.RegionTier,
                        NetworkId  = baseData.Networks[i].Id
                    };

                    form.SetP0TxtBoxInfoText($"Network id >{baseData.Networks[i].Id}<");
                    form.SetP0TxtBoxInfoText($"Network name >{baseData.Networks[i].Name}<");
                    form.SetP0TxtBoxInfoText($"camera count >{batteryUssage.networks[i].cameras.Length}<");

                    for (var n = 0; n < batteryUssage.networks[i].cameras.Length; n++)
                    {
                        form.SetP0TxtBoxInfoText(string.Empty);
                        form.SetP0TxtBoxInfoText($"camera #{n + 1:D2}");

                        baseData.Networks[i].Cameras.Add(new BaseData.Camera
                        {
                            Id    = batteryUssage.networks[i].cameras[n].id,
                            Name  = batteryUssage.networks[i].cameras[n].name,
                            Media = new BaseData.Media()
                        });

                        minData.CameraId = baseData.Networks[i].Cameras[n].Id;

                        form.SetP0TxtBoxInfoText($"camera id >{baseData.Networks[i].Cameras[n].Id}<");
                        form.SetP0TxtBoxInfoText($"camera name >{baseData.Networks[i].Cameras[n].Name}<");

                        var cameraStatus = uweR70_Get.CameraStatusAsync(minData).Result;

                        var cameraThumbnail = cameraStatus.camera_status.thumbnail;

                        var networkNameAndId = common.CombineNameAndId(baseData.Networks[i].Name, baseData.Networks[i].Id);
                        var cameraNameAndId  = common.CombineNameAndId(batteryUssage.networks[i].cameras[n].name, batteryUssage.networks[i].cameras[n].id);
                        var storagePath      = GetStoragePath(saveDirectory, networkNameAndId, cameraNameAndId);
                        if (string.IsNullOrEmpty(baseData.StoragePathNetwork))
                        {   /* Both folligng directories where created while  "GetStoragePath(...)" worked out!
                             * because the there combined path contains all parts of the following two combined directories.
                             */
                            baseData.StoragePathNetwork = Path.Combine(saveDirectory, $"{Config.StoragePartBase}\\{networkNameAndId}");
                            baseData.StoragePathMain    = $"{baseData.StoragePathNetwork}\\{Config.StoragePartMain}";
                        }
                        var cameraThumbnailFileName        = GetAdjustedCameraThumbnailFileName(Path.GetFileName(cameraThumbnail));
                        var cameraThumbnailPathAndFileName = $"{storagePath}\\{cameraThumbnailFileName}";
                        baseData.Networks[i].Cameras[n].Media.PathAndFileNameThumbnail = cameraThumbnailPathAndFileName;
                        baseData.Networks[i].Cameras[n].Media.PathAndFileNameVideos    = new List <string>();
                        if (!File.Exists(cameraThumbnailPathAndFileName))
                        {
                            var cameraThumbnailByteArray = uweR70_GetData.ThumbnailImageAsync(minData, cameraThumbnail).Result;
                            File.WriteAllBytes(cameraThumbnailPathAndFileName, cameraThumbnailByteArray);
                        }
                    }
                }

                var timestampFormatter = common.GetTimestampFormatter();

                var pageCounter = 0;
                var aborted     = false;
                form.SetP0TxtBoxInfoText(string.Empty);
                form.SetP0TxtBoxInfoText($"Try to download videos.");
                do
                {
                    pageCounter++;

                    var changedMedia = uweR70_Get.ChangedMediaAsync(baseData, pageCounter).Result;
                    if (changedMedia.media == null || changedMedia.media.Length == 0)
                    {
                        break;
                    }

                    form.SetP0TxtBoxInfoText(string.Empty);
                    form.SetP0TxtBoxInfoText($"Page #{pageCounter} contains {changedMedia.media.Length} videos.");

                    var counterMarkedAsDeleted         = 0;
                    var counterAlreadyBeforeDownloaded = 0;
                    var counterDownloaded = 0;

                    form.SetP0TxtBoxInfoText($"\tMarked as deleted #{counterMarkedAsDeleted}.");
                    form.SetP0TxtBoxInfoText($"\tAlready before downloaded #{counterAlreadyBeforeDownloaded}.");
                    form.SetP0TxtBoxInfoText($"\tDownloaded #{counterDownloaded}.");

                    for (var i = 0; i < changedMedia.media.Length; i++)
                    {
                        if (changedMedia.media[i].deleted)
                        {
                            counterMarkedAsDeleted++;
                            AdjustInfo(form, common, $"\tMarked as deleted #{counterMarkedAsDeleted - 1}.", $"\tMarked as deleted #{counterMarkedAsDeleted}.");

                            if (counterMarkedAsDeleted == MagicNumberVideosPerPage)
                            {
                                form.SetP0TxtBoxInfoText($"Download aborted becasue current page cantains {MagicNumberVideosPerPage} as deleted marked videos!");
                                aborted = true;
                                break;
                            }
                            continue;
                        }

                        var networkObject = baseData.Networks.Where(x => x.Id == changedMedia.media[i].network_id).ToList();
                        if (networkObject == null || networkObject.Count() != 1)
                        {
                            // Should never be true!
                            continue;
                        }
                        var cameraObject = networkObject[0].Cameras.Where(x => x.Id == changedMedia.media[i].device_id).ToList();
                        if (cameraObject == null || cameraObject.Count() != 1)
                        {
                            // Should never be true!
                            continue;
                        }

                        // Method called and not just path combined because called method creates directory if it does not exist.
                        var networkNameAndId     = common.CombineNameAndId(changedMedia.media[i].network_name, changedMedia.media[i].network_id);
                        var cameraNameAndId      = common.CombineNameAndId(changedMedia.media[i].device_name, changedMedia.media[i].device_id);
                        var storagePath          = GetStoragePath(saveDirectory, networkNameAndId, cameraNameAndId);
                        var videoFileName        = changedMedia.media[i].created_at.ToString(timestampFormatter) + ".mp4";
                        var videoPathAndFileName = $"{storagePath}\\{videoFileName}";
                        cameraObject[0].Media.PathAndFileNameVideos.Add(videoPathAndFileName);
                        if (!File.Exists(videoPathAndFileName))
                        {
                            var videoByteArray = uweR70_GetData.VideoAsync(baseData, changedMedia.media[i].media).Result;
                            mediaIdListBody.media_list.Add(changedMedia.media[i].id);
                            File.WriteAllBytes(videoPathAndFileName, videoByteArray);
                            counterDownloaded++;
                            AdjustInfo(form, common, $"\tDownloaded #{counterDownloaded - 1}.", $"\tDownloaded #{counterDownloaded}.");
                        }
                        else
                        {
                            counterAlreadyBeforeDownloaded++;
                            AdjustInfo(form, common, $"\tAlready before downloaded #{counterAlreadyBeforeDownloaded - 1}.", $"\tAlready before downloaded #{counterAlreadyBeforeDownloaded}.");
                        }
                    }
                } while (!aborted);

                form.SetP0TxtBoxInfoText(string.Empty);
                form.SetP0TxtBoxInfoText("Done!");
                return(baseData);
            }
            catch (Exception ex)
            {
                form.SetP0TxtBoxInfoText(string.Empty);
                form.SetP0TxtBoxInfoText($"### ERROR ###");
                var errorMessage = ex.Message;
                if (ex.InnerException != null && !string.IsNullOrEmpty(ex.InnerException.Message))
                {
                    errorMessage = ex.InnerException.Message;
                }
                form.SetP0TxtBoxInfoText($"\t{errorMessage}");
                return(null);
            }
        }