Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }