Skip to content
This repository was archived by the owner on Oct 5, 2025. It is now read-only.

Commit 182c557

Browse files
committed
better error handling, more logging
1 parent 6d46fe4 commit 182c557

File tree

5 files changed

+146
-94
lines changed

5 files changed

+146
-94
lines changed

fipha/App.xaml.cs

Lines changed: 133 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -105,21 +105,30 @@ protected override void OnStartup(StartupEventArgs evtArgs)
105105

106106
log4net.Config.XmlConfigurator.Configure();
107107

108-
109-
if (File.Exists(Path.Combine(ExePath, "appSettings.config")) &&
110-
ConfigurationManager.GetSection("appSettings") is NameValueCollection appSection)
108+
try
111109
{
112-
HaUrl = appSection["haUrl"];
113-
HaToken = appSection["haToken"];
114-
ExcludePlayers = new HashSet<string>(appSection["excludePlayers"].Split(',').Select(p => p.ToLower().Trim()).ToList());
115-
}
116110

117-
ClientFactory.Initialize($"{HaUrl}", HaToken);
111+
if (File.Exists(Path.Combine(ExePath, "appSettings.config")) &&
112+
ConfigurationManager.GetSection("appSettings") is NameValueCollection appSection)
113+
{
114+
HaUrl = appSection["haUrl"];
115+
HaToken = appSection["haToken"];
116+
ExcludePlayers = new HashSet<string>(appSection["excludePlayers"].Split(',')
117+
.Select(p => p.ToLower().Trim()).ToList());
118+
}
118119

119-
EntityClient = ClientFactory.GetClient<EntityClient>();
120+
ClientFactory.Initialize($"{HaUrl}", HaToken);
121+
122+
EntityClient = ClientFactory.GetClient<EntityClient>();
123+
124+
StatesClient = ClientFactory.GetClient<StatesClient>();
125+
126+
}
127+
catch(Exception ex)
128+
{
129+
Log.Error("Connecting to Home Assistant Failed", ex);
130+
}
120131

121-
StatesClient = ClientFactory.GetClient<StatesClient>();
122-
123132
//create the notifyicon (it's a resource declared in NotifyIconResources.xaml
124133
_notifyIcon = (TaskbarIcon)FindResource("NotifyIcon");
125134

@@ -160,12 +169,26 @@ protected override void OnStartup(StartupEventArgs evtArgs)
160169

161170
splashScreen.Dispatcher.Invoke(() => splashScreen.ProgressText.Text = "Getting data from HA...");
162171

172+
if (EntityClient != null)
173+
{
163174

164-
MediaPlayers = (await EntityClient.GetEntities("media_player")).ToList();
175+
try
176+
{
177+
MediaPlayers = (await EntityClient.GetEntities("media_player")).ToList();
165178

166-
foreach (var mediaPlayer in MediaPlayers)
179+
foreach (var mediaPlayer in MediaPlayers)
180+
{
181+
Log.Info($"{mediaPlayer}");
182+
}
183+
}
184+
catch(Exception ex )
185+
{
186+
Log.Error("Finding Media Players",ex );
187+
}
188+
}
189+
else
167190
{
168-
Log.Info($"{mediaPlayer}");
191+
Log.Error("No Home Assistant Media Players Found");
169192
}
170193

171194
splashScreen.Dispatcher.Invoke(() => splashScreen.ProgressText.Text = "Getting sensor data from HWInfo...");
@@ -174,8 +197,14 @@ protected override void OnStartup(StartupEventArgs evtArgs)
174197

175198
if (HWInfo.SensorData.Any())
176199
{
200+
Log.Info("Writing HWINFO Sensors to hwinfo.json");
201+
177202
HWInfo.SaveDataToFile(@"Data\hwinfo.json");
178203
}
204+
else
205+
{
206+
Log.Error("No HWINFO Sensors Found");
207+
}
179208

180209
Dispatcher.Invoke(() =>
181210
{
@@ -202,120 +231,138 @@ protected override void OnStartup(StartupEventArgs evtArgs)
202231

203232
var haToken = _haTokenSource.Token;
204233

205-
HaTask = Task.Run(async () =>
206-
{
207-
208-
Log.Info("HA task started");
209234

210-
while (true)
235+
if (MediaPlayers != null)
236+
{
237+
HaTask = Task.Run(async () =>
211238
{
212-
if (haToken.IsCancellationRequested)
213-
{
214-
haToken.ThrowIfCancellationRequested();
215-
}
216239

217-
for (var index = 0; index < App.MediaPlayers.Count; index++)
218-
{
219-
var mediaPlayer = App.MediaPlayers[index];
240+
Log.Info("HA task started");
220241

221-
var state = await App.StatesClient.GetState(mediaPlayer);
242+
while (true)
243+
{
244+
if (haToken.IsCancellationRequested)
245+
{
246+
haToken.ThrowIfCancellationRequested();
247+
}
222248

223-
if (!ExcludePlayers.Contains(mediaPlayer) && state != null && state.State != "off" && state.State != "standby" &&
224-
state.State != "unavailable" && state.Attributes?.Any() == true /*&&
225-
state.Attributes.ContainsKey("media_content_id") && state.Attributes["media_content_id"] is long*/)
249+
for (var index = 0; index < App.MediaPlayers.Count; index++)
226250
{
227-
if (MediaPlayerStates.Contains(mediaPlayer.ToLower()))
251+
var mediaPlayer = App.MediaPlayers[index];
252+
253+
var state = await App.StatesClient.GetState(mediaPlayer);
254+
255+
if (!ExcludePlayers.Contains(mediaPlayer) && state != null && state.State != "off" &&
256+
state.State != "standby" &&
257+
state.State != "unavailable" && state.Attributes?.Any() == true /*&&
258+
state.Attributes.ContainsKey("media_content_id") && state.Attributes["media_content_id"] is long*/
259+
)
228260
{
229-
MediaPlayerStates[mediaPlayer] = state;
261+
if (MediaPlayerStates.Contains(mediaPlayer.ToLower()))
262+
{
263+
MediaPlayerStates[mediaPlayer] = state;
264+
}
265+
else
266+
{
267+
MediaPlayerStates.Add(mediaPlayer, state);
268+
}
230269
}
231270
else
232271
{
233-
MediaPlayerStates.Add(mediaPlayer, state);
234-
}
235-
}
236-
else
237-
{
238-
if (MediaPlayerStates.Contains(mediaPlayer))
239-
{
240-
MediaPlayerStates.Remove(mediaPlayer);
272+
if (MediaPlayerStates.Contains(mediaPlayer))
273+
{
274+
MediaPlayerStates.Remove(mediaPlayer);
275+
}
241276
}
242277
}
243-
}
244278

245-
FipHandler.RefreshHAPages();
279+
FipHandler.RefreshHAPages();
246280

247-
await Task.Delay(1000, _haTokenSource.Token); // repeat every 2 seconds
248-
}
281+
await Task.Delay(1000, _haTokenSource.Token); // repeat every 2 seconds
282+
}
249283

250-
}, haToken);
284+
}, haToken);
285+
}
251286

252287
var hwInfoToken = _hwInfoTokenSource.Token;
253288

254-
if (File.Exists(Path.Combine(App.ExePath, "mqtt.config")))
289+
if (File.Exists(Path.Combine(App.ExePath, "mqtt.config")) && HWInfo.SensorData.Any())
255290
{
256291

257292
HWInfoTask = Task.Run(async () =>
258293
{
259294
var result = await MQTT.Connect();
295+
if (!result)
296+
{
297+
Log.Info("Failed to connect to MQTT server");
298+
}
299+
else
300+
{
260301

261-
Log.Info("HWInfo task started");
262302

263-
if (HWInfo.SensorData.Any())
264-
{
265303

266-
foreach (var sensor in HWInfo.SensorData)
304+
Log.Info("HWInfo task started");
305+
306+
if (HWInfo.SensorData.Any())
267307
{
268-
foreach (var element in sensor.Value.Elements)
308+
309+
foreach (var sensor in HWInfo.SensorData)
269310
{
270-
var mqttValue = JsonConvert.SerializeObject(new HWInfo.MQTTDiscoveryObj
271-
{
272-
device_class = element.Value.DeviceClass,
273-
name = element.Value.Name,
274-
state_topic =
275-
$"homeassistant/{element.Value.Component}/{element.Value.Node}/state",
276-
unit_of_measurement = element.Value.Unit,
277-
value_template = "{{ value_json.value}}",
278-
unique_id = element.Value.Node,
279-
state_class = "measurement"
280-
}, new JsonSerializerSettings
311+
foreach (var element in sensor.Value.Elements)
281312
{
282-
NullValueHandling = NullValueHandling.Ignore
283-
});
284-
285-
var task = Task.Run<bool>(async () =>
286-
await MQTT.Publish(
287-
$"homeassistant/{element.Value.Component}/{element.Value.Node}/config",
288-
mqttValue));
313+
var mqttValue = JsonConvert.SerializeObject(new HWInfo.MQTTDiscoveryObj
314+
{
315+
device_class = element.Value.DeviceClass,
316+
name = element.Value.Name,
317+
state_topic =
318+
$"homeassistant/{element.Value.Component}/{element.Value.Node}/state",
319+
unit_of_measurement = element.Value.Unit,
320+
value_template = "{{ value_json.value}}",
321+
unique_id = element.Value.Node,
322+
state_class = "measurement"
323+
}, new JsonSerializerSettings
324+
{
325+
NullValueHandling = NullValueHandling.Ignore
326+
});
327+
328+
var task = Task.Run<bool>(async () =>
329+
await MQTT.Publish(
330+
$"homeassistant/{element.Value.Component}/{element.Value.Node}/config",
331+
mqttValue));
289332

333+
}
290334
}
291-
}
292335

293-
while (true)
294-
{
295-
if (hwInfoToken.IsCancellationRequested)
336+
while (true)
296337
{
297-
hwInfoToken.ThrowIfCancellationRequested();
298-
}
338+
if (hwInfoToken.IsCancellationRequested)
339+
{
340+
hwInfoToken.ThrowIfCancellationRequested();
341+
}
299342

300-
HWInfo.ReadMem("HWINFO.INC");
301-
302-
foreach (var sensor in HWInfo.SensorData)
303-
{
304-
foreach (var element in sensor.Value.Elements)
343+
HWInfo.ReadMem("HWINFO.INC");
344+
345+
foreach (var sensor in HWInfo.SensorData)
305346
{
306-
var mqttValue = JsonConvert.SerializeObject(new HWInfo.MQTTStateObj
347+
foreach (var element in sensor.Value.Elements)
348+
{
349+
var mqttValue = JsonConvert.SerializeObject(new HWInfo.MQTTStateObj
307350
{
308351
value = element.Value.NumericValue
309352
});
310353

311-
var task = Task.Run<bool>(async () => await MQTT.Publish($"homeassistant/{element.Value.Component}/{element.Value.Node}/state", mqttValue));
312-
}
354+
var task = Task.Run<bool>(async () =>
355+
await MQTT.Publish(
356+
$"homeassistant/{element.Value.Component}/{element.Value.Node}/state",
357+
mqttValue));
358+
}
313359

314-
}
360+
}
315361

316-
//!!!FipHandler.RefreshHWInfoPages();
362+
//!!!FipHandler.RefreshHWInfoPages();
317363

318-
await Task.Delay(5 * 1000, _hwInfoTokenSource.Token); // repeat every 5 seconds
364+
await Task.Delay(5 * 1000, _hwInfoTokenSource.Token); // repeat every 5 seconds
365+
}
319366
}
320367
}
321368

fipha/HWInfo.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using System.Xml;
1414
using IniParser;
1515
using IniParser.Model;
16+
using log4net;
1617
using Newtonsoft.Json.Serialization;
1718
using Formatting = Newtonsoft.Json.Formatting;
1819

@@ -142,7 +143,11 @@ public class SensorObj
142143
public static Dictionary<string, ChartCircularBuffer> SensorTrends = new Dictionary<string, ChartCircularBuffer>();
143144

144145
public static IniData IncData = null;
145-
146+
147+
public static readonly ILog Log =
148+
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
149+
150+
146151
public static string NumberFormat(SENSOR_TYPE sensorType, string unit, double value)
147152
{
148153
string valstr = "?";
@@ -372,9 +377,9 @@ public static void ReadMem(string incPath)
372377
ParseIncFile();
373378

374379
}
375-
catch
380+
catch (Exception ex)
376381
{
377-
// don nothing
382+
Log.Error("HWINFO Shared Memory Read Problem", ex);
378383
}
379384
}
380385
}

fipha/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
// You can specify all the values or you can default the Build and Revision Numbers
3232
// by using the '*' as shown below:
3333
// [assembly: AssemblyVersion("1.0.*")]
34-
[assembly: AssemblyVersion("0.0.0.5")]
35-
[assembly: AssemblyFileVersion("0.0.0.5")]
34+
[assembly: AssemblyVersion("0.0.0.6")]
35+
[assembly: AssemblyFileVersion("0.0.0.6")]
3636

3737
[assembly: log4net.Config.XmlConfigurator(Watch = true)]

fipha/fipha.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@
7777
<Reference Include="Microsoft.Win32.Registry, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
7878
<HintPath>..\packages\Microsoft.Win32.Registry.5.0.0\lib\net461\Microsoft.Win32.Registry.dll</HintPath>
7979
</Reference>
80-
<Reference Include="MQTTnet, Version=4.0.2.221, Culture=neutral, PublicKeyToken=fdb7629f2e364a63, processorArchitecture=MSIL">
81-
<HintPath>..\packages\MQTTnet.4.0.2.221\lib\net461\MQTTnet.dll</HintPath>
80+
<Reference Include="MQTTnet, Version=4.1.0.247, Culture=neutral, PublicKeyToken=fdb7629f2e364a63, processorArchitecture=MSIL">
81+
<HintPath>..\packages\MQTTnet.4.1.0.247\lib\net461\MQTTnet.dll</HintPath>
8282
</Reference>
8383
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
8484
<HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>

fipha/packages.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<package id="Microsoft.Bcl.AsyncInterfaces" version="6.0.0" targetFramework="net472" />
1111
<package id="Microsoft.CSharp" version="4.7.0" targetFramework="net472" />
1212
<package id="Microsoft.Win32.Registry" version="5.0.0" targetFramework="net472" />
13-
<package id="MQTTnet" version="4.0.2.221" targetFramework="net48" />
13+
<package id="MQTTnet" version="4.1.0.247" targetFramework="net48" />
1414
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net472" />
1515
<package id="RazorEngine" version="3.10.0" targetFramework="net472" />
1616
<package id="SharpDX" version="4.2.0" targetFramework="net472" />

0 commit comments

Comments
 (0)