private static string AirDoc(string address) { string table; AirEventArgs args = null; table = "<tr><th colspan=\"5\">WeatherFlow Smart Weather Station Air</th></tr>"; table += "<tr><th>Value</th><th>Name</th><th>Custom Notification</th><th>Value</th><th>Notes</th></tr>"; if (WeatherFlowNS.NS.NodeData.ContainsKey(address)) { args = (AirEventArgs)WeatherFlowNS.NS.NodeData[address]; table += TableRow("Last Update", address, "0", "", "Time in seconds since last update"); table += TableRow("Temperature", address, "1", args.Temperature, ""); table += TableRow("Humidity", address, "2", args.Humidity, ""); table += TableRow("Barometric Pressure", address, "3", args.SeaLevel, ""); table += TableRow("Lightning Strikes", address, "4", args.Strikes, ""); table += TableRow("Ligthning Distance", address, "5", args.Distance, ""); table += TableRow("DewPoint", address, "6", args.Dewpoint, ""); table += TableRow("Apparent Temperature", address, "7", args.ApparentTemp, ""); table += TableRow("Pressure Trend", address, "8", args.Trend, "0 = falling, 1 = steady, 2 = rising"); table += TableRow("Battery", address, "9", args.Battery, ""); } else { table += TableRow("Last Update", address, "0", "", "Time in seconds since last update"); table += TableRow("Temperature", address, "1", "###", ""); table += TableRow("Humidity", address, "2", "###", ""); table += TableRow("Barometric Pressure", address, "3", "###", ""); table += TableRow("Lightning Strikes", address, "4", "###", ""); table += TableRow("Ligthning Distance", address, "5", "###", ""); table += TableRow("DewPoint", address, "6", "###", ""); table += TableRow("Apparent Temperature", address, "7", "###", ""); table += TableRow("Pressure Trend", address, "8", "###", "0 = falling, 1 = steady, 2 = rising"); table += TableRow("Battery", address, "9", "###", ""); } table += "<tr><th colspan=\"5\"> </th></tr>"; return(table); }
internal void WSObservations(string json) { JavaScriptSerializer serializer = new JavaScriptSerializer(); ObsData obs; double elevation = 0; try { try { obs = serializer.Deserialize <ObsData>(json); } catch (Exception ex) { WFLogging.Error("Deserialization failed for WebSocket data: " + ex.Message); WFLogging.Error(json); return; } if (json.Contains("obs_sky")) { //SkyObj = new SkyData(); // The first websocket packet seems to be cached data and it // doesn't include some things like the device serial number. // Without the serial number, we can't really process it if (obs.source == "cache") { return; } SkyObj.device_id = obs.device_id; SkyObj.firmware_revision = obs.firmware_revision; SkyObj.hub_sn = obs.hub_sn; SkyObj.obs = obs.obs; SkyObj.serial_number = obs.serial_number; SkyObj.type = obs.type; SkyObj.valid = true; WFNodeServer.SkyEventArgs evnt = new SkyEventArgs(SkyObj); evnt.SetDaily = CalcDailyPrecipitation(); evnt.Raw = json; // This fails the first time, why? WeatherFlowNS.NS.RaiseSkyEvent(this, evnt); WeatherFlowNS.NS.RaiseUpdateEvent(this, new UpdateEventArgs((int)SkyObj.obs[0][0], SkyObj.serial_number, DataType.SKY)); } else if (json.Contains("obs_air")) { //AirObj = new AirData(); if (obs.source == "cache") { return; } AirObj.device_id = obs.device_id; AirObj.firmware_revision = obs.firmware_revision; AirObj.hub_sn = obs.hub_sn; AirObj.obs = obs.obs; AirObj.serial_number = obs.serial_number; AirObj.type = obs.type; AirObj.valid = true; // Look up elevation StationInfo si = wf_station.FindStationAir(AirObj.serial_number); if (si != null) { elevation = si.elevation; } AirEventArgs evnt = new AirEventArgs(AirObj); evnt.SetDewpoint = 0; evnt.SetApparentTemp = 0; evnt.SetTrend = 1; evnt.SetSeaLevel = SeaLevelPressure(AirObj.obs[0][(int)AirIndex.PRESSURE].GetValueOrDefault(), elevation); evnt.Raw = json; if (SkyObj.valid) { try { evnt.SetDewpoint = CalcDewPoint(); evnt.SetApparentTemp = FeelsLike(AirObj.obs[0][(int)AirIndex.TEMPURATURE].GetValueOrDefault(), AirObj.obs[0][(int)AirIndex.HUMIDITY].GetValueOrDefault(), SkyObj.obs[0][(int)SkyIndex.WIND_SPEED].GetValueOrDefault()); // Trend is -1, 0, 1 while event wants 0, 1, 2 evnt.SetTrend = PressureTrend() + 1; // Heat index & Windchill ?? } catch { } } else { } WeatherFlowNS.NS.RaiseAirEvent(this, evnt); WeatherFlowNS.NS.RaiseUpdateEvent(this, new UpdateEventArgs((int)AirObj.obs[0][0], AirObj.serial_number, DataType.AIR)); } } catch (Exception ex) { WFLogging.Error("Failed to process websocket observation data: " + ex.Message); return; } }
private void AirObservations(string json) { JavaScriptSerializer serializer = new JavaScriptSerializer(); // obs[0][0] = time (seconds) // obs[0][1] = station pressure (MB) // obs[0][2] = air temp (c) // obs[0][3] = humidity (%) // obs[0][4] = lightning count // obs[0][5] = avg lightning dist (km) // obs[0][6] = battery // obs[0][7] = interval (minutes) try { double elevation = 0; AirObj = serializer.Deserialize <AirData>(json); AirObj.valid = true; // Look up elevation StationInfo si = wf_station.FindStationAir(AirObj.serial_number); if (si != null) { elevation = si.elevation; } // Do we just want to raise an event with the data object? AirEventArgs evnt = new AirEventArgs(AirObj); evnt.SetDewpoint = 0; evnt.SetApparentTemp = 0; evnt.SetTrend = 1; evnt.SetSeaLevel = SeaLevelPressure(AirObj.obs[0][(int)AirIndex.PRESSURE].GetValueOrDefault(), elevation); evnt.Raw = json; if (SkyObj.valid) { try { evnt.SetDewpoint = CalcDewPoint(); evnt.SetApparentTemp = FeelsLike(AirObj.obs[0][(int)AirIndex.TEMPURATURE].GetValueOrDefault(), AirObj.obs[0][(int)AirIndex.HUMIDITY].GetValueOrDefault(), SkyObj.obs[0][(int)SkyIndex.WIND_SPEED].GetValueOrDefault()); // Trend is -1, 0, 1 while event wants 0, 1, 2 evnt.SetTrend = PressureTrend() + 1; // Heat index & Windchill ?? } catch { } } else { } try { WeatherFlowNS.NS.RaiseAirEvent(this, evnt); } catch (Exception ex) { WFLogging.Warning("Failed to process Air event. " + ex.Message); } WeatherFlowNS.NS.RaiseUpdateEvent(this, new UpdateEventArgs((int)AirObj.obs[0][0].GetValueOrDefault(), AirObj.serial_number, DataType.AIR)); } catch (Exception ex) { WFLogging.Error("Deserialization failed for air data: " + ex.Message); WFLogging.Verbose(json); } }