Пример #1
0
        public static TimeSpan ToCumulativeState(this NestState state, string key, bool newState, DateTimeOffset timestamp)
        {
            if (!state.PreviousState.TryGetValue(key, out var previousState))
            {
                previousState = false;
            }
            if (!state.CumulativeState.TryGetValue(key, out var cumulativeState))
            {
                cumulativeState = TimeSpan.Zero;
            }

            if (previousState == true && newState == false && state.LastUpdateTime != default)      //Turning from on to off
            {
                state.PreviousState[key]   = newState;
                cumulativeState           += (timestamp - state.LastUpdateTime);
                state.CumulativeState[key] = cumulativeState;
            }
            else if (previousState == false && newState == true)                                    //Turning from off to on
            {
                state.PreviousState[key] = newState;
                state.LastUpdateTime     = timestamp;
            }

            return(cumulativeState);
        }
Пример #2
0
        public static InfluxData ToInfluxData(NestState state, Device deviceDetails, Shared sharedDetails, List <Where> whereList, DateTimeOffset timestamp)
        {
            string where = whereList.Where(w => w.WhereId == deviceDetails.WhereId).Single().Name.Replace(" ", "-");

            var fields = InfluxKeyValueHelper.GetInfluxKeyValuesFromPoco(deviceDetails);

            foreach (var keyVal in InfluxKeyValueHelper.GetInfluxKeyValuesFromPoco(sharedDetails))
            {
                fields[keyVal.Key] = keyVal.Value;
            }

            fields["cumulativeHeat"] = ((float)state.ToCumulativeState(where + "-heat", sharedDetails.HvacHeaterState, timestamp).TotalMinutes).ToString();
            fields["cumulativeCool"] = ((float)state.ToCumulativeState(where + "-cool", sharedDetails.HvacAcState, timestamp).TotalMinutes).ToString();
            fields["cumulativeFan"]  = ((float)state.ToCumulativeState(where + "-fan", sharedDetails.HvacFanState, timestamp).TotalMinutes).ToString();

            return(new InfluxData
            {
                Measurement = "nest",
                Timestamp = timestamp,
                Tags = new Dictionary <string, string> {
                    { "location", where }
                },
                Fields = fields
            });
        }
Пример #3
0
        static async Task DeliverToDatabaseAsync(NestState state)
        {
            var influxData = state.ToInfluxData();
            var influxLine = influxData.DataPointsToString();

            Console.WriteLine(influxLine);
            await InfluxUploader.Upload("http://influxdb:8086", "drinka", influxLine);
        }
Пример #4
0
        static async Task Main(string[] args)
        {
            var serializerSettings = new JsonSerializerSettings
            {
                ContractResolver = new DefaultContractResolver
                {
                    NamingStrategy = new SnakeCaseNamingStrategy()
                }
            };

            var(username, password) = GetUsernamePassword();
            var nestClient = new NestClient(username, password, serializerSettings);
            var nestState  = new NestState(serializerSettings);
            var userData   = await nestClient.GetUserDataAsync();

            nestState.UpdateData(userData.UpdatedBuckets);
            await DeliverToDatabaseAsync(nestState);

            var lastTime = DateTimeOffset.Now;

            while (true)
            {
                var subscribeDelay = DateTimeOffset.Now - lastTime;
                if (subscribeDelay < TimeSpan.FromSeconds(10))
                {
                    Console.WriteLine($"{nameof(subscribeDelay)}={subscribeDelay} delaying={TimeSpan.FromSeconds(10) - subscribeDelay}");
                    await Task.Delay(TimeSpan.FromSeconds(10) - subscribeDelay);
                }
                else
                {
                    Console.WriteLine($"{nameof(subscribeDelay)}={subscribeDelay}");
                }
                lastTime += subscribeDelay;

                var newData = await nestClient.SubscribeAsync(nestState.Headers);

                nestState.UpdateData(newData);
                await DeliverToDatabaseAsync(nestState);
            }
        }
Пример #5
0
        public static IEnumerable <InfluxData> ToInfluxData(this NestState state)
        {
            var timestamp = DateTimeOffset.Now;

            var whereKey  = state.Keys.Where(key => key.StartsWith("where.")).Single();
            var whereList = state.GetObjectValue <WhereList>(whereKey);

            foreach (var deviceKey in state.Keys.Where(key => key.StartsWith("device.")))
            {
                var deviceId      = deviceKey.Split('.')[1];
                var sharedKey     = $"shared.{deviceId}";
                var deviceDetails = state.GetObjectValue <Device>(deviceKey);
                var sharedDetails = state.GetObjectValue <Shared>(sharedKey);
                yield return(ToInfluxData(state, deviceDetails, sharedDetails, whereList.Wheres, timestamp));
            }

            foreach (var kryptoniteKey in state.Keys.Where(key => key.StartsWith("kryptonite.")))
            {
                var kryptoniteDetails = state.GetObjectValue <Kryptonite>(kryptoniteKey);
                yield return(ToInfluxData(kryptoniteDetails, whereList.Wheres, timestamp));
            }
        }