static async Task Main(string[] args) { Console.WriteLine("Home Assistant Watcher is licensed under the MIT License."); Console.WriteLine("See https://opensource.org/licenses/MIT for the full license."); Console.WriteLine(); ConfigurationBuilder builder = new ConfigurationBuilder(); builder.AddCommandLine(args); IConfigurationRoot config = builder.Build(); GetConnectionSettings(config, out Uri path, out string token); SharpHomeAssistantConnection connection = new SharpHomeAssistantConnection() { AccessToken = token }; CancellationTokenSource asyncCancelTokenSource = new CancellationTokenSource(); try { await connection.ConnectAsync(path, asyncCancelTokenSource.Token); } catch (ConnectFailedException ex) { Console.WriteLine("Connection attempt to the remote server failed."); Console.WriteLine(ex); System.Environment.Exit(-1); } catch (SharpHomeAssistantProtocolException ex) { Console.WriteLine("Protocol error was encountered while trying to negotiate with the remote server."); Console.WriteLine(ex); System.Environment.Exit(-1); } SubscribeEventsMessage subscribeEventsMessage = new SubscribeEventsMessage() { CommandId = 1, EventName = "*" }; if (!await connection.SendMessageAsync(subscribeEventsMessage, asyncCancelTokenSource.Token)) { Console.WriteLine("Internal error while trying to send subscribe all events message."); await CloseConnection(connection, asyncCancelTokenSource.Token); System.Environment.Exit(-1); } Task pingLoopAsync = PingLoopAsync(connection, asyncCancelTokenSource.Token); for (IncomingMessageBase message = await connection.ReceiveMessageAsync(asyncCancelTokenSource.Token); message != null; message = await connection.ReceiveMessageAsync(asyncCancelTokenSource.Token)) { if (ResultMessage.TryConvert(message, out ResultMessage resultMessage)) { if (resultMessage.CommandId == 1) { if (!resultMessage.Success) { Console.WriteLine("Could not subscribe to events."); Console.WriteLine(resultMessage.ErrorDetails.Message); await CloseConnection(connection, asyncCancelTokenSource.Token); System.Environment.Exit(-1); } Console.WriteLine("Subscribed to all events."); Console.WriteLine(); Console.WriteLine(); break; } } } for (IncomingMessageBase message = await connection.ReceiveMessageAsync(asyncCancelTokenSource.Token); message != null; message = await connection.ReceiveMessageAsync(asyncCancelTokenSource.Token)) { if (EventMessage.TryConvert(message, out EventMessage eventMessage)) { if (eventMessage.CommandId == 1) { JsonSerializerOptions options = new JsonSerializerOptions() { WriteIndented = true }; string json = JsonSerializer.Serialize(eventMessage.Event, eventMessage.Event.GetType(), options); Console.WriteLine(); Console.WriteLine(json); Console.WriteLine(); } } } Console.WriteLine("Closing connection"); await CloseConnection(connection, asyncCancelTokenSource.Token); Console.WriteLine("Connection closed."); System.Environment.Exit(0); }