Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions Inferno.Cli/Inferno.Cli.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,14 @@
<ItemGroup>
<ProjectReference Include="..\Inferno.Common\Inferno.Common.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
</ItemGroup>

<ItemGroup>
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
14 changes: 11 additions & 3 deletions Inferno.Cli/Program.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Inferno.Common.Models;
using Inferno.Common.Models;
using Inferno.Common.Proxies;
using Microsoft.Extensions.Configuration;
using System;
using System.Net.Http;
using System.Threading.Tasks;
Expand All @@ -8,10 +9,17 @@ namespace Inferno.Cli
{
class Program
{
static SmokerProxy _smokerProxy = new SmokerProxy();
static SmokerProxy _smokerProxy = null!;

static async Task Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false)
.AddEnvironmentVariables()
.Build();
var apiBaseUrl = configuration["Api:BaseUrl"] ?? "http://127.0.0.1:5000";
_smokerProxy = new SmokerProxy(apiBaseUrl);

if(args == null || args.Length < 1)
{
PrintHelp();
Expand Down
5 changes: 5 additions & 0 deletions Inferno.Cli/appsettings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"Api": {
"BaseUrl": "http://127.0.0.1:5000"
}
}
8 changes: 5 additions & 3 deletions Inferno.Common/Services/SmokerProxy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@ namespace Inferno.Common.Proxies
public class SmokerProxy : IDisposable
{

private HttpClient _client;
private readonly HttpClient _client;
private readonly string _baseUrl;

public SmokerProxy()
public SmokerProxy(string baseUrl)
{
_client = new HttpClient();
_baseUrl = baseUrl.TrimEnd('/');
}

private bool disposedValue;
Expand Down Expand Up @@ -49,7 +51,7 @@ public async Task SetModeAsync(SmokerMode smokerMode)

private async Task<HttpResponseMessage> InfernoApiRequestAsync(SmokerEndpoint endpoint, string content = "")
{
Uri requestUri = new Uri($"http://127.0.0.1:5000/api/{endpoint}");
Uri requestUri = new Uri($"{_baseUrl}/api/{endpoint}");
HttpResponseMessage result;

if (string.IsNullOrEmpty(content))
Expand Down
10 changes: 9 additions & 1 deletion Inferno.Mqtt/Inferno.Mqtt.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,14 @@

<ItemGroup>
<PackageReference Include="MQTTnet.Extensions.ManagedClient" Version="4.1.3.436" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
</ItemGroup>

<ItemGroup>
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>

</Project>
20 changes: 20 additions & 0 deletions Inferno.Mqtt/MqttSettings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace Inferno.Mqtt;

public class MqttSettings
{
public string BrokerAddress { get; set; } = "localhost";
public string BrokerUsername { get; set; } = "";
public string BrokerPassword { get; set; } = "";
public string TopicRoot { get; set; } = "inferno";
public string TopicCommand { get; set; } = "command";
public string TopicState { get; set; } = "state";
public string TopicMode { get; set; } = "mode";
public string TopicSetPoint { get; set; } = "setpoint";
public string TopicPValue { get; set; } = "pvalue";
public string TopicGrillTemp { get; set; } = "grill";
public string TopicProbeTemp { get; set; } = "probe";
public string TopicAuger { get; set; } = "auger";
public string TopicBlower { get; set; } = "blower";
public string TopicIgniter { get; set; } = "igniter";
public string TopicFireHealthy { get; set; } = "firehealthy";
}
18 changes: 14 additions & 4 deletions Inferno.Mqtt/Program.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
using Inferno.Mqtt.Services;
using Inferno.Mqtt;
using Inferno.Mqtt.Services;
using Microsoft.Extensions.Configuration;

var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false)
.AddEnvironmentVariables()
.Build();

var mqttSettings = configuration.GetSection("Mqtt").Get<MqttSettings>() ?? new MqttSettings();
var apiBaseUrl = configuration["Api:BaseUrl"] ?? "http://127.0.0.1:5000";

while (true)
{
try
{
Console.WriteLine($"{DateTime.Now} Starting SmokerBridge");
using var smokerBridge = await SmokerBridge.CreateAsync();
using var smokerBridge = await SmokerBridge.CreateAsync(mqttSettings, apiBaseUrl);
Thread.Sleep(Timeout.InfiniteTimeSpan);
}
catch(Exception ex)
catch (Exception ex)
{
Console.WriteLine($"{DateTime.Now} WTF: {ex.Message}");
Thread.Sleep(5000);
}
}
}
70 changes: 30 additions & 40 deletions Inferno.Mqtt/Services/SmokerBridge.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,7 @@ namespace Inferno.Mqtt.Services
public sealed class SmokerBridge : IDisposable
{

private const string TOPIC_ROOT = "inferno";
private const string TOPIC_COMMAND = "command";
private const string TOPIC_STATE = "state";
private const string TOPIC_MODE = "mode";
private const string TOPIC_SETPOINT = "setpoint";
private const string TOPIC_PVALUE = "pvalue";
private const string TOPIC_GRILLTEMP = "grill";
private const string TOPIC_PROBETEMP = "probe";
private const string TOPIC_AUGER = "auger";
private const string TOPIC_BLOWER = "blower";
private const string TOPIC_IGNITER = "igniter";
private const string TOPIC_FIREHEALTHY = "firehealthy";

private readonly MqttSettings _settings;

private readonly string _brokerAddress;
private readonly string _brokerUsername;
Expand All @@ -37,23 +25,25 @@ public sealed class SmokerBridge : IDisposable
private readonly SmokerProxy _proxy;

private bool disposedValue;


public SmokerBridge()

public SmokerBridge(MqttSettings settings, string apiBaseUrl)
{
_brokerAddress = Environment.GetEnvironmentVariable("MQTT_BROKER_ADDRESS") ?? "localhost";
_brokerUsername = Environment.GetEnvironmentVariable("MQTT_USERNAME") ?? "";
_brokerPassword = Environment.GetEnvironmentVariable("MQTT_PASSWORD") ?? "";
_settings = settings;

_brokerAddress = settings.BrokerAddress;
_brokerUsername = settings.BrokerUsername;
_brokerPassword = settings.BrokerPassword;

Console.WriteLine($"Broker Address: {_brokerAddress}");
Console.WriteLine($"Broker Username: {_brokerUsername}");

_proxy = new SmokerProxy();
_proxy = new SmokerProxy(apiBaseUrl);
}

public static async Task<SmokerBridge> CreateAsync()
public static async Task<SmokerBridge> CreateAsync(MqttSettings settings, string apiBaseUrl)
{
var smokerBridge = new SmokerBridge();
var smokerBridge = new SmokerBridge(settings, apiBaseUrl);
await smokerBridge.InitializeAsync();
return smokerBridge;
}
Expand All @@ -80,17 +70,17 @@ private async Task InitializeAsync()
.WithTopicFilter(
f =>
{
f.WithTopic(GetCommandTopic(TOPIC_MODE));
f.WithTopic(GetCommandTopic(_settings.TopicMode));
})
.WithTopicFilter(
f =>
{
f.WithTopic(GetCommandTopic(TOPIC_SETPOINT));
f.WithTopic(GetCommandTopic(_settings.TopicSetPoint));
})
.WithTopicFilter(
f =>
{
f.WithTopic(GetCommandTopic(TOPIC_PVALUE));
f.WithTopic(GetCommandTopic(_settings.TopicPValue));
})
.Build();

Expand All @@ -107,21 +97,21 @@ private async Task ProcessCommand(MqttApplicationMessageReceivedEventArgs args)
var payload = Encoding.UTF8.GetString(args.ApplicationMessage.Payload);
Console.WriteLine($"{DateTime.Now} Received on {topic}: {payload}");

if (topic == SmokerBridge.GetCommandTopic(TOPIC_MODE))
if (topic == GetCommandTopic(_settings.TopicMode))
{
if (Enum.TryParse(payload, true, out SmokerMode mode))
{
await _proxy.SetModeAsync(mode);
}
}
else if (topic == SmokerBridge.GetCommandTopic(TOPIC_SETPOINT))
else if (topic == GetCommandTopic(_settings.TopicSetPoint))
{
if (int.TryParse(payload, out var setPoint))
{
await _proxy.SetSetPointAsync(setPoint);
}
}
else if (topic == SmokerBridge.GetCommandTopic(TOPIC_PVALUE))
else if (topic == GetCommandTopic(_settings.TopicPValue))
{
if (int.TryParse(payload, out var pValue))
{
Expand All @@ -130,14 +120,14 @@ private async Task ProcessCommand(MqttApplicationMessageReceivedEventArgs args)
}
}

private static string GetCommandTopic(string topic)
private string GetCommandTopic(string topic)
{
return $"{TOPIC_ROOT}/{topic}/{TOPIC_COMMAND}";
return $"{_settings.TopicRoot}/{topic}/{_settings.TopicCommand}";
}

private static string GetStateTopic(string topic)
private string GetStateTopic(string topic)
{
return $"{TOPIC_ROOT}/{topic}/{TOPIC_STATE}";
return $"{_settings.TopicRoot}/{topic}/{_settings.TopicState}";
}

private async Task StateLoop()
Expand All @@ -160,37 +150,37 @@ private async Task StateLoop()

await SendUpdateMessage(status.AugerOn.ToString(),
_lastStatus.AugerOn.ToString(),
TOPIC_AUGER,
_settings.TopicAuger,
forceUpdate);

await SendUpdateMessage(status.BlowerOn.ToString(),
_lastStatus.BlowerOn.ToString(),
TOPIC_BLOWER,
_settings.TopicBlower,
forceUpdate);

await SendUpdateMessage(status.IgniterOn.ToString(),
_lastStatus.IgniterOn.ToString(),
TOPIC_IGNITER,
_settings.TopicIgniter,
forceUpdate);

await SendUpdateMessage(status.FireHealthy.ToString(),
_lastStatus.FireHealthy.ToString(),
TOPIC_FIREHEALTHY,
_settings.TopicFireHealthy,
forceUpdate);

await SendUpdateMessage(status.Mode,
_lastStatus.Mode,
TOPIC_MODE,
_settings.TopicMode,
forceUpdate);

await SendUpdateMessage(status.SetPoint.ToString(),
_lastStatus.SetPoint.ToString(),
TOPIC_SETPOINT,
_settings.TopicSetPoint,
forceUpdate);

await SendUpdateMessage(status.PValue.ToString(),
_lastStatus.PValue.ToString(),
TOPIC_PVALUE,
_settings.TopicPValue,
forceUpdate);

// Only update the grill/probe temps every 5 iterations
Expand All @@ -201,7 +191,7 @@ await SendUpdateMessage(status.PValue.ToString(),
double grillTemp = status.Temps?.GrillTemp ?? -1;
await SendUpdateMessage(grillTemp.ToString(),
_lastGrillTemp.ToString(),
TOPIC_GRILLTEMP,
_settings.TopicGrillTemp,
forceUpdate);
_lastGrillTemp = grillTemp;
}
Expand All @@ -211,7 +201,7 @@ await SendUpdateMessage(grillTemp.ToString(),
double probeTemp = status.Temps?.ProbeTemp ?? -1;
await SendUpdateMessage(probeTemp.ToString(),
_lastProbeTemp.ToString(),
TOPIC_PROBETEMP,
_settings.TopicProbeTemp,
forceUpdate);
_lastProbeTemp = probeTemp;
}
Expand Down
22 changes: 22 additions & 0 deletions Inferno.Mqtt/appsettings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"Mqtt": {
"BrokerAddress": "localhost",
"BrokerUsername": "",
"BrokerPassword": "",
"TopicRoot": "inferno",
"TopicCommand": "command",
"TopicState": "state",
"TopicMode": "mode",
"TopicSetPoint": "setpoint",
"TopicPValue": "pvalue",
"TopicGrillTemp": "grill",
"TopicProbeTemp": "probe",
"TopicAuger": "auger",
"TopicBlower": "blower",
"TopicIgniter": "igniter",
"TopicFireHealthy": "firehealthy"
},
"Api": {
"BaseUrl": "http://127.0.0.1:5000"
}
}