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); }
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 }); }
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); }
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); } }
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)); } }