コード例 #1
0
        static private async Task ReceiveDataFromAzure()
        {
            if (strconn == "")
            {
                return;
            }
            DeviceClient deviceClient = DeviceClient.CreateFromConnectionString(strconn, TransportType.Http1);

            Message receivedMessage = null;
            string  messageData;

            try
            {
                while (true)
                {
                    try
                    {
                        receivedMessage = await deviceClient.ReceiveAsync();
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine($"Error receiving from Azure Iot Hub: {ex.Message}");
                    }


                    if (receivedMessage != null)
                    {
                        bool ballOK = true;
                        // {"command":"addprogram","message":"{\"DateTimeStart\":\"2016-06-02T03:04:05+00:00\",\"Duration\":\"00:02:05\",\"SprinklerNumber\":3}"}
                        //MessageIoT temp = new MessageIoT();
                        //temp.command = "test";
                        //temp.message = JsonConvert.SerializeObject(new SprinklerProgram(new DateTimeOffset(2016, 6, 2, 3, 4, 5, new TimeSpan(0, 0, 0)), new TimeSpan(0, 2, 5), 3));
                        //var ret = JsonConvert.SerializeObject(temp);
                        //SendDataToAzure(ret);
                        messageData = Encoding.ASCII.GetString(receivedMessage.GetBytes());
                        MessageIoT cmdmsg = null;
                        try
                        {
                            cmdmsg = JsonConvert.DeserializeObject <MessageIoT>(messageData);
                        }
                        catch (Exception)
                        {
                            try
                            {
                                await deviceClient.RejectAsync(receivedMessage);

                                ballOK = false;
                            }
                            catch (Exception)
                            {
                                ballOK = false;
                            }
                        }
                        if (!ballOK)
                        {
                        }
                        else if (cmdmsg.command.ToLower() == "sprinklername")
                        {
                            cmdmsg.message = JsonConvert.SerializeObject(Sprinklers);
                            Task.Delay(500);
                            SendDataToAzure(JsonConvert.SerializeObject(cmdmsg));
                        }
                        else if (cmdmsg.command.ToLower() == "programs")
                        {
                            cmdmsg.message = JsonConvert.SerializeObject(SprinklerPrograms);
                            Task.Delay(500);
                            SendDataToAzure(JsonConvert.SerializeObject(cmdmsg));
                        }
                        else if (cmdmsg.command.ToLower() == "addprogram")
                        {
                            if (cmdmsg.message != null)
                            {
                                try
                                {
                                    SprinklerPrograms.Add(JsonConvert.DeserializeObject <SprinklerProgram>(cmdmsg.message));
                                }
                                catch (Exception)
                                {
                                    ballOK = false;
                                }
                            }
                        }
                        else if (cmdmsg.command.ToLower() == "removeprogram")
                        {
                            if (cmdmsg.message != null)
                            {
                                try
                                {
                                    //need to be smart how to remove a program
                                    //so loop and check the elements
                                    for (int i = 0; i < SprinklerPrograms.Count; i++)
                                    {
                                        SprinklerProgram MySpr = (SprinklerProgram)SprinklerPrograms[i];
                                        SprinklerProgram spr   = JsonConvert.DeserializeObject <SprinklerProgram>(cmdmsg.message);
                                        if ((MySpr.SprinklerNumber == spr.SprinklerNumber) &&
                                            (MySpr.Duration.CompareTo(spr.Duration) == 0) &&
                                            (MySpr.DateTimeStart.CompareTo(spr.DateTimeStart) == 0))
                                        {
                                            SprinklerPrograms.RemoveAt(i);
                                        }
                                    }
                                }
                                catch (Exception)
                                {
                                    ballOK = false;
                                }
                            }
                        }
                        else if ((cmdmsg.command.ToLower() == "pumpstart") || (cmdmsg.command.ToLower() == "pumpstop"))
                        {
                            int sprNum = -1;
                            try
                            {
                                sprNum = Convert.ToInt32(cmdmsg.message);
                            }
                            catch { }
                            if ((sprNum >= 0) && (sprNum < NUMBER_SPRINKLERS))
                            {
                                if (cmdmsg.command.ToLower() == "pumpstart")
                                {
                                    Sprinklers[sprNum].Open = true;
                                }
                                else
                                {
                                    Sprinklers[sprNum].Open = false;
                                }
                            }
                        }

                        try
                        {
                            if (ballOK)
                            {
                                await deviceClient.CompleteAsync(receivedMessage);
                            }
                            else
                            {
                                await deviceClient.RejectAsync(receivedMessage);
                            }
                        }
                        catch (Exception)
                        {
                            try
                            {
                                await deviceClient.RejectAsync(receivedMessage);
                            }
                            catch (Exception)
                            {
                            }
                            //throw;
                        }
                    }
                }
            }
            catch (Exception)
            {
                ReceiveDataFromAzure();
            }
        }
コード例 #2
0
        static void ClockTimer_Tick(object sender)
        {
            DateTime now = DateTime.Now;

            //Debug.Print(now.ToString("MM/dd/yyyy HH:mm:ss"));
            // check the midnight prediction if automated mode
            if (WunderSettings.AutomateAll == true)
            {
                if (now >= LastTimeCheck.Add(TimeCheck))
                {
                    GetForecast("");
                    if (WunderSettings.NeedToSprinkle)
                    {
                        try
                        {
                            if (TypicalProg != null)
                            {
                                for (int i = 0; i < TypicalProg.Length; i++)
                                {
                                    DateTimeOffset dtoff = DateTimeOffset.Now;
                                    if (TypicalProg[i].StartTime.Hours < dtoff.Hour)
                                    {
                                        if (TypicalProg[i].StartTime.Minutes < dtoff.Minute)
                                        {
                                            dtoff = dtoff.AddDays(1);
                                        }
                                    }
                                    dtoff = new DateTimeOffset(dtoff.Year, dtoff.Month, dtoff.Day, TypicalProg[i].StartTime.Hours, TypicalProg[i].StartTime.Minutes, TypicalProg[i].StartTime.Seconds, dtoff.Offset);
                                    //correct the time needed for sprinkling
                                    SprinklerPrograms.Add(new SprinklerProgram(dtoff, TimeSpan.FromSeconds(TypicalProg[i].Duration.TotalSeconds * WunderSettings.PercentageCorrection), TypicalProg[i].SprinklerNumber));
                                    LogToAzure("Adding Program", SprinklerPrograms[SprinklerPrograms.Count - 1]);
                                }
                            }
                        }
                        catch (Exception e)
                        {
                        }
                        WunderSettings.NeedToSprinkle = false;
                    }
                    LastTimeCheck = LastTimeCheck.AddDays(1);
                }
            }
            long initialtick = now.Ticks;
            long actualtick;

            for (int i = 0; i < SprinklerPrograms.Count; i++)
            {
                SprinklerProgram MySpr = (SprinklerProgram)SprinklerPrograms[i];
                actualtick = MySpr.DateTimeStart.Ticks;
                if (initialtick >= actualtick)
                { // this is the time to open a sprinkler
                    //Debug.Print("Sprinkling " + i + " date time " + now.ToString("MM/dd/yyyy HH:mm:ss"));
                    Sprinklers[MySpr.SprinklerNumber].Open = true;
                    // it will close all sprinkler in the desired time of sprinkling. Timer will be called only once.
                    //10000 ticks in 1 milisecond
                    Sprinklers[MySpr.SprinklerNumber].TimerInterval = (int)(MySpr.Duration.Ticks / 10000); //= new Timer(new TimerCallback(ClockStopSprinkler), null, (int)(MySpr.Duration.Ticks / 10000), 0);
                    //Sprinklers[MySpr.SprinklerNumber].TimerCallBack.Start();
                    // Save the data
                    SaveProgamActual(MySpr);
                    LogToAzure("sprinkling", MySpr);
                    SprinklerPrograms.RemoveAt(i);
                    return;
                }
            }
        }