Beispiel #1
0
        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\">&nbsp;</th></tr>";

            return(table);
        }
Beispiel #2
0
        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;
            }
        }
Beispiel #3
0
        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);
            }
        }