/// <inheritdoc/> public OpenHABEvent Parse(string message) { try { var data = JsonConvert.DeserializeObject <EventStreamData>(message.Remove(0, 6)); if (data.Type == "ThingUpdatedEvent" || data.Type == "ThingStatusInfoChangedEvent") { _logger.LogWarning($"Event type is not supported '{data.Type}'."); return(null); } var payload = JsonConvert.DeserializeObject <EventStreamPayload>(data.Payload); string itemName = data.Topic .Replace("openhab/items/", string.Empty) // openHAB V3 .Replace("smarthome/items/", string.Empty) // openHAB V2 .Replace("/statechanged", string.Empty).Replace("/state", string.Empty); if (!Enum.TryParse(typeof(OpenHABEventType), data.Type, out object type)) { type = OpenHABEventType.Unknown; } OpenHABEvent openHABevent = new OpenHABEvent() { ItemName = itemName, ValueType = payload.Type, Value = payload.Value, Topic = data.Topic, OldType = payload.OldType, OldValue = payload.OldValue, EventType = (OpenHABEventType)type, }; return(openHABevent); } catch (Exception ex) { _logger.LogError(ex, "Failed to parse openHAB event."); } return(null); }
/// <inheritdoc /> public async void StartItemUpdates(System.Threading.CancellationToken token) { await Task.Run((Func <Task>)(async() => { var settings = _settingsService.Load(); var client = _openHABHttpClient.Client(_connection, settings); var requestUri = Constants.API.Events; _logger.LogInformation($"Retrive item updates from '{client.BaseAddress.ToString()}'"); try { var stream = await client.GetStreamAsync((string)requestUri).ConfigureAwait(false); using (var reader = new StreamReader((Stream)stream)) { while (!reader.EndOfStream) { if (token.IsCancellationRequested) { return; } var updateEvent = reader.ReadLine(); if (updateEvent?.StartsWith("data:", StringComparison.InvariantCultureIgnoreCase) == true) { OpenHABEvent ohEvent = _eventParser.Parse(updateEvent); if (ohEvent == null) { continue; } switch (ohEvent.EventType) { case OpenHABEventType.ItemStateEvent: _messenger.Send(new UpdateItemMessage(ohEvent.ItemName, ohEvent.Value)); break; case OpenHABEventType.ThingUpdatedEvent: break; case OpenHABEventType.RuleStatusInfoEvent: break; case OpenHABEventType.ItemStatePredictedEvent: break; case OpenHABEventType.GroupItemStateChangedEvent: break; case OpenHABEventType.ItemStateChangedEvent: _messenger.Send(new ItemStateChangedMessage(ohEvent.ItemName, ohEvent.Value, ohEvent.OldValue)); break; case OpenHABEventType.Unknown: break; default: break; } } } } } catch (HttpRequestException ex) { _logger.LogError(ex, "StartItemUpdates failed."); } catch (Exception ex) { _logger.LogError(ex, "StartItemUpdates failed."); } })).ConfigureAwait(false); }