Ejemplo n.º 1
0
        static private async Task InitPrograms()
        {
            //read all saved programs
            FileStream mystream = null;

            try
            {
                mystream = new FileStream(await GetFilePathAsync(strFileListProgram), FileMode.OpenOrCreate, FileAccess.Read);
                byte[] buff = new byte[mystream.Length];
                await mystream.ReadAsync(buff, 0, (int)mystream.Length);

                string strprogs = Encoding.UTF8.GetString(buff);
                var    progs    = Newtonsoft.Json.JsonConvert.DeserializeObject <SprinklerProgram[]>(strprogs);
                if (progs == null)
                {
                    return;
                }
                foreach (var prg in progs)
                {
                    SprinklerPrograms.Add(prg);
                }
                //string strDeSer = "";
                //byte mByte;
                ////read up to find a '?'
                //for (long i = 0; i < mystream.Length; i++)
                //{
                //    mByte = (byte)mystream.ReadByte();
                //    if (((mByte == (byte)Param.ParamStart) && (i > 0)) || (i == (mystream.Length - 1)))
                //    {
                //        if (i == (mystream.Length - 1))
                //            strDeSer += new String((char)mByte, 1);
                //        ProcessProgram(null, strDeSer);
                //        strDeSer = "";
                //    }
                //    strDeSer += new String((char)mByte, 1);
                //}
                mystream.Dispose();
            }
            catch (Exception e)
            {
                if (mystream != null)
                {
                    mystream.Dispose();
                }
            }
        }
Ejemplo n.º 2
0
        private string ProcessTypical(string param)
        {
            string strResp = "";

            strResp = BuildHeader();

            strResp += "Programming typical sprinkling<br>";
            try
            {
                if (TypicalProg != null)
                {
                    for (int i = 0; i < TypicalProg.Length; i++)
                    {
                        DateTimeOffset dtoff = DateTimeOffset.Now;

                        if (TimeSpan.Compare(TypicalProg[i].StartTime, dtoff.TimeOfDay) < 0)
                        {
                            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);

                        SprinklerPrograms.Add(new SprinklerProgram(dtoff, TypicalProg[i].Duration, TypicalProg[i].SprinklerNumber));
                        strResp += $"Adding program on Sprinkler {TypicalProg[i].SprinklerNumber}, at {dtoff} for {TypicalProg[i].Duration}<br>";
                    }
                }
                else
                {
                    strResp += "Sorry, there is no typical program setup";
                }
            }
            catch (Exception e)
            {
                strResp += $"Ups, something went wrong! {e.Message}";
            }

            strResp += "<a href='/" + paramPageSprinkler + Param.ParamStart + securityKey + "'>Return to main page</a>";
            strResp += "</BODY></HTML>";

            return(strResp);
        }
Ejemplo n.º 3
0
        private string ProcessProgram(string param)
        {
            string strResp = "";

            try
            {
                // decode params
                // params must be sprX=0; or 1 where X is a number from 0 to 2
                int          intYear            = -1;
                int          intMonth           = -1;
                int          intDay             = -1;
                int          intHour            = -1;
                int          intMinute          = -1;
                int          intDuration        = -1;
                int          intSprinklerNumber = -1;
                bool         bnoUI = false;
                DateTime     MyDate;
                TimeSpan     MySpanDuration;
                List <Param> Params = Param.decryptParam(param);

                // decrypt all params in a readeable sentense
                if (Params != null)
                {
                    bnoUI              = Param.CheckConvertBool(Params, paramNoUI);
                    intYear            = Param.CheckConvertInt32(Params, paramYear);
                    intMonth           = Param.CheckConvertInt32(Params, paramMonth);
                    intDay             = Param.CheckConvertInt32(Params, paramDay);
                    intHour            = Param.CheckConvertInt32(Params, paramHour);
                    intMinute          = Param.CheckConvertInt32(Params, paramMinute);
                    intDuration        = Param.CheckConvertInt32(Params, paramDuration);
                    intSprinklerNumber = Param.CheckConvertInt32(Params, paramSpr);
                }
                // valid all params are in normal limits and in the future
                if (!bnoUI)
                {
                    strResp = BuildHeader(true);
                }

                DateTime tmpNow = DateTime.Now;
                //case delete a program
                if (intDuration == 0)
                {
                    for (int i = 0; i < SprinklerPrograms.Count; i++)
                    {
                        // case the date already exist and durqtion is 0 => delete
                        if ((intYear == ((SprinklerProgram)SprinklerPrograms[i]).DateTimeStart.Year) &&
                            (intMonth == ((SprinklerProgram)SprinklerPrograms[i]).DateTimeStart.Month) &&
                            (intDay == ((SprinklerProgram)SprinklerPrograms[i]).DateTimeStart.Day) &&
                            (intSprinklerNumber == ((SprinklerProgram)SprinklerPrograms[i]).SprinklerNumber))
                        {
                            SprinklerPrograms.RemoveAt(i);
                            if (!bnoUI)
                            {
                                strResp += "Deleting Sprinkler " + Sprinklers[intSprinklerNumber].Name + " for " + intYear + " " + intMonth + " " + intDay + ". <br>";
                                strResp += "<a href='/" + paramPageSprinkler + Param.ParamStart + securityKey + "'>Back to main page</a>";
                                //strResp = await OutPutStream(response, strResp);
                            }
                            else
                            {
                                strResp += paramOK;
                                // end if it is deleted and no ui
                                return(strResp);
                            }
                        }
                    }
                    // if we are there there was anything to update so return a problem
                    if (bnoUI)
                    {
                        strResp = paramProblem;
                        // end if it is deleted and no ui
                        return(strResp);
                    }
                }
                else if ((intYear > 1900) && (intMonth > 0) && (intMonth < 13) && (intHour >= 0) && (intHour < 24) && (intMinute >= 0) && (intMinute < 60))
                {
                    MyDate = new DateTime(intYear, intMonth, intDay, intHour, intMinute, 0);
                    bool TodayIsToday = false;
                    if ((intYear == tmpNow.Year) && (intMonth == tmpNow.Month) && (intDay == tmpNow.Day))
                    {
                        TodayIsToday = true;
                    }
                    // Is the program in the future or today!
                    if ((MyDate >= tmpNow) || (TodayIsToday))
                    {
                        //display the possibility to setup another Sprinkler
                        for (int i = 0; i < NUMBER_SPRINKLERS; i++)
                        {
                            //TO DO: display something here
                        }
                        bool updated = false;
                        // is the duration the right one? with an existing sprinkler?
                        if ((intDuration > 0) && (intDuration < 1440) && (intSprinklerNumber >= 0) && (intSprinklerNumber < NUMBER_SPRINKLERS))
                        {
                            MySpanDuration = new TimeSpan(0, intDuration, 0);

                            // is it a new program for a day a just an update (only 1 program per day available)

                            for (int i = 0; i < SprinklerPrograms.Count; i++)
                            {
                                // case the date already exist => update the hour, minute and duration for the given Sprinkler
                                if ((MyDate.Year == ((SprinklerProgram)SprinklerPrograms[i]).DateTimeStart.Year) &&
                                    (MyDate.Month == ((SprinklerProgram)SprinklerPrograms[i]).DateTimeStart.Month) &&
                                    (MyDate.Day == ((SprinklerProgram)SprinklerPrograms[i]).DateTimeStart.Day) &&
                                    (intSprinklerNumber == ((SprinklerProgram)SprinklerPrograms[i]).SprinklerNumber) &&
                                    (updated == false))
                                {
                                    ((SprinklerProgram)SprinklerPrograms[i]).DateTimeStart = MyDate;
                                    ((SprinklerProgram)SprinklerPrograms[i]).Duration      = MySpanDuration;
                                    updated = true;
                                    if (!bnoUI)
                                    {
                                        strResp += "Updating Sprinkler " + Sprinklers[intSprinklerNumber].Name + " for " + MyDate.ToString("yyyy MMM d") + " to start at " + MyDate.ToString("HH:mm") + " and duration of " + MySpanDuration.Minutes + " minutes. <br>";
                                        //strResp = await OutPutStream(response, strResp);
                                    }
                                    else
                                    {   //if it was an update, then everything is fine
                                        strResp += paramOK;
                                        // end if it is deleted and no ui
                                        return(strResp);
                                    }
                                }
                            }
                            // does not exist, then will need to create it
                            if (updated == false)
                            {
                                SprinklerPrograms.Add(new SprinklerProgram(MyDate, MySpanDuration, intSprinklerNumber));
                                if (!bnoUI)
                                {
                                    strResp += "Adding Sprinkler " + Sprinklers[intSprinklerNumber].Name + " for " + MyDate.ToString("yyyy MMM d") + " to start at " + MyDate.ToString("HH:mm") + " and duration of " + MySpanDuration.Minutes + " minutes. <br>";
                                    updated  = true;
                                    //strResp = await OutPutStream(response, strResp);
                                }
                                else
                                {
                                    strResp += paramOK;
                                    // end if it is deleted and no ui
                                    return(strResp);
                                }
                            }
                        }


                        if (updated == false)
                        {
                            if (bnoUI)
                            {
                                // we have a problem if we are here if we don't display UI
                                strResp += paramProblem;
                                // end if it is deleted and no ui
                                return(strResp);
                            }
                            //create a timeline to select hour and minutes
                            strResp += "<br>Select your starting time.<br>";
                            strResp += "<table BORDER=\"0\">";
                            //in case it's Today, allow programation for the next hour
                            int StartTime = 0;
                            if (TodayIsToday)
                            {
                                StartTime = intHour + 1;
                            }
                            //strResp = await OutPutStream(response, strResp);
                            for (int i = StartTime; i < 24; i++)
                            {
                                for (int j = 0; j < 2; j++)
                                {
                                    strResp += "<tr><td>";
                                    DateTime tmpDateTime = new DateTime(intYear, intMonth, intDay, i, j * 30, 0);
                                    strResp += tmpDateTime.ToString("HH:mm");
                                    strResp += "</td><td>";
                                    strResp += "<a href='" + paramPageProgram + Param.ParamStart + securityKey + Param.ParamSeparator + paramYear
                                               + Param.ParamEqual + tmpDateTime.Year + Param.ParamSeparator + paramMonth + Param.ParamEqual + tmpDateTime.Month
                                               + Param.ParamSeparator + paramDay + Param.ParamEqual + tmpDateTime.Day + Param.ParamSeparator + paramHour
                                               + Param.ParamEqual + i + Param.ParamSeparator + paramMinute + Param.ParamEqual + j * 30 + Param.ParamSeparator
                                               + paramDuration + Param.ParamEqual + SprDuration + Param.ParamSeparator + paramSpr + Param.ParamEqual
                                               + intSprinklerNumber + "'>" + SprDuration + " minutes</a>";
                                    strResp += "</td>";
                                    //if (strResp.Length > 800)
                                    //{
                                    //    strResp = await OutPutStream(response, strResp);
                                    //}
                                    strResp += "</tr>";
                                }
                            }
                            strResp += "</table>";
                        }
                        else
                        {
                            // something has been updated so redirect to the main page
                            strResp += "<a href='/" + paramPageCalendar + Param.ParamStart + securityKey + Param.ParamSeparator + paramYear + Param.ParamEqual
                                       + intYear + Param.ParamSeparator + paramMonth + Param.ParamEqual + intMonth + Param.ParamSeparator + paramSpr
                                       + Param.ParamEqual + intSprinklerNumber + "'>Program this month</a>";
                            //strResp = await OutPutStream(response, strResp);
                        }
                    }
                    else
                    {
                        if (bnoUI)
                        {
                            strResp += paramProblem;
                            // end if it is deleted and no ui
                            return(strResp);
                        }
                        strResp += "Date must be in the future";
                    }
                }
                else
                {
                    if (bnoUI)
                    {
                        strResp += paramProblem;
                        // end if it is deleted and no ui
                        return(strResp);
                    }
                    strResp += "Date must be in the future";
                }

                // if no UI we should not be there!
                strResp += "<br><a href='/" + paramPageSprinkler + Param.ParamStart + securityKey + "'>Back to main page<a><br>";
                strResp += "</BODY></HTML>";
            }
            catch (Exception e)
            {
                // do nothing
            }
            return(strResp);
        }
Ejemplo n.º 4
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();
            }
        }
Ejemplo n.º 5
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;
                }
            }
        }