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(); } }
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; } } }