diff --git a/CHANGELOG.md b/CHANGELOG.md index c2eca9e0..af46ab46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,11 +5,11 @@ - **Added**: Toggle the display chart bounds on the map. - **Added**: Support for Mapbox styles. - **Updated**: New Map icons for waypoints and AIS targets. -- **Experiment (Weather)**: - - Removed NOAA service option. - - Display map icon at location where weather data was retrieved. - - Clicking map icon displays observation data. - - Weather data is relocated under the _meteo.default-fb_ context (See [nmea0183-signalk PR #245](https://github.com/SignalK/nmea0183-signalk/pull/245)). +- **Added**: Display weather data from paths within the `meteo` context + - Weather graduated from experiment to mainstream feature. + - Display meto stations on the map. + - Clicking on meto station icon displays available observation data. + - Weather data from station closest to vessel position is available via the _meteo.freeboard-sk_ path (See [nmea0183-signalk PR #245](https://github.com/SignalK/nmea0183-signalk)). - **Experiment (Route)**: - Render start / Finish line when present in route properties and route is active. diff --git a/README.md b/README.md index 8e3b7edd..904078e7 100644 --- a/README.md +++ b/README.md @@ -107,10 +107,6 @@ _**Signal K Standard Alarms:**_ - mob - fire - sinking -- flooding -- collision -- grounding -- listing - adrift - piracy - abandon diff --git a/helper/lib/openweather.ts b/helper/lib/openweather.ts index e3f9d19c..d72d4123 100644 --- a/helper/lib/openweather.ts +++ b/helper/lib/openweather.ts @@ -143,16 +143,18 @@ export class OpenWeather implements IWeatherService { const current: OWObservation = owData.current; obs = { - timestamp: current.dt + date: current.dt ? new Date(current.dt * 1000).toISOString() : new Date().toISOString(), description: current.weather[0].description ?? '', - outside: { + sun: { sunrise: new Date(current.sunrise * 1000).toISOString() ?? null, - sunset: new Date(current.sunset * 1000).toISOString() ?? null, + sunset: new Date(current.sunset * 1000).toISOString() ?? null + }, + horizontalVisibility: current.visibility ?? null, + outside: { uvIndex: current.uvi ?? null, cloudCover: current.clouds ?? null, - horizontalVisibility: current.visibility ?? null, temperature: current.temp ?? null, feelsLikeTemperature: current.feels_like ?? null, dewPointTemperature: current.dew_point ?? null, @@ -195,20 +197,20 @@ export class OpenWeather implements IWeatherService { const forecasts = owData[period]; forecasts.forEach((f: OWForecast) => { const forecast: SKMeteo = { - timestamp: f.dt + date: f.dt ? new Date(f.dt * 1000).toISOString() : new Date().toISOString(), description: f.weather[0].description ?? '', + sun: {}, outside: {}, water: {}, wind: {} }; if (period === 'daily') { - forecast.outside.sunrise = + forecast.sun.sunrise = new Date(f.sunrise * 1000).toISOString() ?? null; - forecast.outside.sunset = - new Date(f.sunset * 1000).toISOString() ?? null; + forecast.sun.sunset = new Date(f.sunset * 1000).toISOString() ?? null; forecast.outside.minTemperature = f.temp.min ?? null; forecast.outside.maxTemperature = f.temp.max ?? null; forecast.outside.feelsLikeTemperature = f.feels_like.day ?? null; diff --git a/helper/openApi.json b/helper/openApi.json index 1b5dbcf9..0c36dbd2 100644 --- a/helper/openApi.json +++ b/helper/openApi.json @@ -23,6 +23,10 @@ "name": "weather", "description": "Weather resources." }, + { + "name": "stations-self", + "description": "Weather data from station closest to vessel position." + }, { "name": "stations", "description": "Weather station data." @@ -70,13 +74,40 @@ "type": "object", "required": ["timestamp"], "properties": { - "timestamp": { + "date": { "$ref": "#/components/schemas/IsoTime" }, "description": { "type": "string", "example": "broken clouds" }, + "horizontalVisibility": { + "type": "number", + "example": 5000, + "description": "Visibilty (m)" + }, + "horizontalVisibilityOverRange": { + "type": "boolean", + "example": "true", + "description": "Visibilty distance is greater than the range of the measuring equipment." + }, + "sunlight": { + "type": "object", + "required": ["times"], + "properties": { + "times": { + "type": "object", + "properties": { + "sunrise": { + "$ref": "#/components/schemas/IsoTime" + }, + "sunset": { + "$ref": "#/components/schemas/IsoTime" + } + } + } + } + }, "outside": { "type": "object", "properties": { @@ -136,17 +167,17 @@ "type": "number", "example": 56, "description": "Amount of precipitation (mm)" - }, - "horizontalVisibility": { - "type": "number", - "example": 5000, - "description": "Visibilty (m)" } } }, "wind": { "type": "object", "properties": { + "averageSpeed": { + "type": "number", + "example": 9.3, + "description": "Average wind speed (m/s)" + }, "speedTrue": { "type": "number", "example": 15.3, @@ -155,17 +186,17 @@ "directionTrue": { "type": "number", "example": 2.145, - "description": "Wind direction (rad)" + "description": "Wind direction relative to true north (rad)" }, "gust": { "type": "number", "example": 21.6, "description": "Wind gust (m/s)" }, - "gustDirection": { + "gustDirectionTrue": { "type": "number", "example": 2.6, - "description": "Wind gust direction (rad)" + "description": "Wind gust direction relative to true north (rad)" } } }, @@ -182,41 +213,51 @@ "example": 11.9, "description": "Water level (m)" }, - "levelTrend": { + "levelTendency": { "type": "number", "enum": ["steady","decreasing","increasing"], "example": "steady", "description": "Water level trend" }, - "waveSignificantHeight": { - "type": "number", - "example": 2.6, - "description": "Wave height (m)" - }, - "waveDirection": { - "type": "number", - "example": 2.3876, - "description": "Wave direction (rad)" - }, - "wavePeriod": { - "type": "number", - "example": 2.3876, - "description": "Wave period (m/s)" - }, - "swellHeight": { - "type": "number", - "example": 2.6, - "description": "Swell height (m)" - }, - "swellDirection": { - "type": "number", - "example": 2.3876, - "description": "Swell direction (rad)" + "waves": { + "type": "object", + "properties": { + "significantHeight": { + "type": "number", + "example": 2.6, + "description": "Wave height (m)" + }, + "directionTrue": { + "type": "number", + "example": 2.3876, + "description": "Wave direction relative to true north (rad)" + }, + "period": { + "type": "number", + "example": 2.3876, + "description": "Wave period (m/s)" + } + } }, - "swellPeriod": { - "type": "number", - "example": 2.3876, - "description": "Swell period (m/s)" + "swell": { + "type": "object", + "properties": { + "height": { + "type": "number", + "example": 2.6, + "description": "Swell height (m)" + }, + "directionTrue": { + "type": "number", + "example": 2.3876, + "description": "Swell direction relative to true north (rad)" + }, + "period": { + "type": "number", + "example": 2.3876, + "description": "Swell period (m/s)" + } + } }, "seaState": { "type": "number", @@ -238,12 +279,12 @@ "current": { "type": "object", "properties": { - "surfaceSpeed": { + "drift": { "type": "number", "example": 3.4, "description": "Surface current speed (m/s)" }, - "surfaceDirection": { + "set": { "type": "number", "example": 1.74, "description": "Surface current direction (rad)" @@ -405,6 +446,24 @@ } } }, + "/freeboard-sk": { + "get": { + "tags": ["stations-self"], + "summary": "Weather station data closest to vessel position.", + "responses": { + "default": { + "description": "Data from weather station that weather proivder deems closest to the vessel position.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WeatherStationResponseModel" + } + } + } + } + } + } + }, "/{id}": { "parameters": [ { diff --git a/helper/weather.ts b/helper/weather.ts index 2c51adf6..8856ac10 100644 --- a/helper/weather.ts +++ b/helper/weather.ts @@ -42,20 +42,21 @@ export type MeteoPrecipitationType = export type MeteoIce = 'no' | 'yes' | 'reserved' | 'not available'; export type MeteoBeaufort = - | 'Flat' - | 'Ripples without crests' - | 'Small wavelets. Crests of glassy appearance, not breaking' - | 'Large wavelets. Crests begin to break; scattered whitecaps' - | 'Small waves' - | 'Moderate (1.2 m) longer waves. Some foam and spray' - | 'Large waves with foam crests and some spray' - | 'Sea heaps up and foam begins to streak' - | 'Moderately high waves with breaking crests forming spindrift. Streaks of foam' - | 'High waves (6-7 m) with dense foam. Wave crests start to roll over. Considerable spray' - | 'Very high waves. The sea surface is white and there is considerable tumbling. Visibility is reduced' - | 'Exceptionally high waves' - | 'Huge waves. Air filled with foam and spray. Sea completely white with driving spray. Visibility greatly reduced' + | 'calm, 0–0.2 m/s' + | 'light air, 0.3–1.5 m/s' + | 'light breeze, 1.6–3.3 m/s' + | 'gentle breeze, 3.4–5.4 m/s' + | 'moderate breeze, 5.5–7.9 m/s' + | 'fresh breeze, 8–10.7 m/s' + | 'strong breeze, 10.8–13.8 m/s' + | 'high wind, 13.9–17.1 m/s' + | 'gale, 17.2–20.7 m/s' + | 'strong gale, 20.8–24.4 m/s' + | 'storm, 24.5–28.4 m/s' + | 'violent storm, 28.5–32.6 m/s' + | 'hurricane-force, ≥ 32.7 m/s' | 'not available' + | 'reserved' | 'reserved'; interface SKMeteoVDMAir { @@ -64,14 +65,13 @@ interface SKMeteoVDMAir { pressure?: number; pressureTendency?: MeteoStatus; relativeHumidity?: number; - horizontalVisibility?: number; precipitationType?: MeteoPrecipitationType; } interface SKMeteoVDMWater { temperature?: number; level?: number; - levelTrend?: MeteoStatus; + levelTendency?: MeteoStatus; surfaceCurrentSpeed?: number; surfaceCurrentDirection?: number; salinity?: number; @@ -93,6 +93,8 @@ interface SKMeteoVDMWind { } export interface SKMeteoVDM { + date?: string; + horizontalVisibility?: number; outside?: SKMeteoVDMAir; water?: SKMeteoVDMWater; wind?: SKMeteoVDMWind; @@ -104,15 +106,16 @@ export interface SKMeteoAir extends SKMeteoVDMAir { feelsLikeTemperature?: number; precipitationVolume?: number; absoluteHumidity?: number; - sunrise?: string; - sunset?: string; uvIndex?: number; cloudCover?: number; } export interface SKMeteo extends SKMeteoVDM { - timestamp: string; description: string; + sun?: { + sunrise?: string; + sunset?: string; + }; outside?: SKMeteoAir; } @@ -137,7 +140,7 @@ export interface IWeatherService { } // default weather station context -export const defaultStationId = `default-fb`; +export const defaultStationId = `freeboard-sk`; let server: FreeboardHelperApp; let pluginId: string; @@ -478,22 +481,33 @@ const emitMeteoDeltas = () => { if (obs && Array.isArray(obs)) { server.debug('**** METEO OBS *****'); obs.forEach((o: SKMeteo) => { - deltaValues.push({ path: ``, value: { name: weatherServiceName } }); - - if (typeof o.outside.sunrise !== 'undefined') { + + if (typeof o.date !== 'undefined') { deltaValues.push({ - path: `${pathRoot}.outside.sunrise`, - value: o.outside.sunrise + path: `${pathRoot}.date`, + value: o.date }); } - if (typeof o.outside.sunset !== 'undefined') { + if (typeof o.horizontalVisibility !== 'undefined') { deltaValues.push({ - path: `${pathRoot}.outside.sunset`, - value: o.outside.sunset + path: `${pathRoot}.horizontalVisibility`, + value: o.horizontalVisibility + }); + } + if (typeof o.sun.sunrise !== 'undefined') { + deltaValues.push({ + path: `${pathRoot}.sun.sunrise`, + value: o.sun.sunrise + }); + } + if (typeof o.sun.sunset !== 'undefined') { + deltaValues.push({ + path: `${pathRoot}.sun.sunset`, + value: o.sun.sunset }); } if (typeof o.outside.uvIndex !== 'undefined') { @@ -526,24 +540,6 @@ const emitMeteoDeltas = () => { value: o.outside.feelsLikeTemperature }); } - if (typeof o.wind.speedTrue !== 'undefined') { - deltaValues.push({ - path: `${pathRoot}.wind.speedTrue`, - value: o.wind.speedTrue - }); - } - if (typeof o.wind.directionTrue !== 'undefined') { - deltaValues.push({ - path: `${pathRoot}.wind.directionTrue`, - value: o.wind.directionTrue - }); - } - if (typeof o.outside.horizontalVisibility !== 'undefined') { - deltaValues.push({ - path: `${pathRoot}.outside.horizontalVisibility`, - value: o.outside.horizontalVisibility - }); - } if (typeof o.outside.pressure !== 'undefined') { deltaValues.push({ path: `${pathRoot}.outside.pressure`, @@ -568,6 +564,18 @@ const emitMeteoDeltas = () => { value: o.outside.precipitationType }); } + if (typeof o.wind.speedTrue !== 'undefined') { + deltaValues.push({ + path: `${pathRoot}.wind.speedTrue`, + value: o.wind.speedTrue + }); + } + if (typeof o.wind.directionTrue !== 'undefined') { + deltaValues.push({ + path: `${pathRoot}.wind.directionTrue`, + value: o.wind.directionTrue + }); + } }); // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -596,16 +604,31 @@ const emitMeteoDeltas = () => { const buildMeteoMetas = () => { server.debug('**** METEO - build metas *****'); let metas = []; - metas = metas.concat(buildObservationMetas()); - + metas = metas.concat(buildObservationMetas('environment')); return metas; }; -const buildObservationMetas = () => { - const pathRoot = 'environment'; +const buildObservationMetas = (pathRoot: string) => { const metas = []; server.debug('**** METEO - building observation metas *****'); - + metas.push({ + path: `${pathRoot}.date`, + value: { + description: 'Time of measurement.' + } + }); + metas.push({ + path: `${pathRoot}.sun.sunrise`, + value: { + description: 'Time of sunrise at the related position.' + } + }); + metas.push({ + path: `${pathRoot}.sun.sunset`, + value: { + description: 'Time of sunset at the related position.' + } + }); metas.push({ path: `${pathRoot}.outside.cloudCover`, value: { @@ -635,7 +658,7 @@ const buildObservationMetas = () => { } }); metas.push({ - path: `${pathRoot}.outside.horizontalVisibility`, + path: `${pathRoot}.horizontalVisibility`, value: { description: 'Horizontal visibility.', units: 'm' @@ -648,6 +671,21 @@ const buildObservationMetas = () => { units: 'Pa' } }); + metas.push({ + path: `${pathRoot}.outside.pressureTendency`, + value: { + description: + 'Integer value indicating barometric pressure value tendency e.g. 0 = steady, etc.' + } + }); + + metas.push({ + path: `${pathRoot}.outside.pressureTendencyType`, + value: { + description: + 'Description for the value of pressureTendency e.g. steady, increasing, decreasing.' + } + }); metas.push({ path: `${pathRoot}.outside.relativeHumidity`, value: { @@ -662,6 +700,13 @@ const buildObservationMetas = () => { units: '%' } }); + metas.push({ + path: `${pathRoot}.wind.averageSpeed`, + value: { + description: 'Average wind speed.', + units: 'm/s' + } + }); metas.push({ path: `${pathRoot}.wind.speedTrue`, value: { @@ -684,7 +729,7 @@ const buildObservationMetas = () => { } }); metas.push({ - path: `${pathRoot}.wind.gustDirection`, + path: `${pathRoot}.wind.gustDirectionTrue`, value: { description: 'Maximum wind gust direction.', units: 'rad' @@ -699,5 +744,77 @@ const buildObservationMetas = () => { } }); + metas.push({ + path: `${pathRoot}.water.level`, + value: { + description: 'Water level.', + units: 'm' + } + }); + + metas.push({ + path: `${pathRoot}.water.levelTendency`, + value: { + description: + 'Integer value indicating water level tendency e.g. 0 = steady, etc.' + } + }); + + metas.push({ + path: `${pathRoot}.water.levelTendencyType`, + value: { + description: + 'Description for the value of levelTendency e.g. steady, increasing, decreasing.' + } + }); + + metas.push({ + path: `${pathRoot}.water.waves.significantHeight`, + value: { + description: 'Significant wave height.', + units: 'm' + } + }); + + metas.push({ + path: `${pathRoot}.water.waves.period`, + value: { + description: 'Wave period.', + units: 'ms' + } + }); + + metas.push({ + path: `${pathRoot}.water.waves.direction`, + value: { + description: 'Wave direction.', + units: 'rad' + } + }); + + metas.push({ + path: `${pathRoot}.water.swell.significantHeight`, + value: { + description: 'Significant swell height.', + units: 'm' + } + }); + + metas.push({ + path: `${pathRoot}.water.swell.period`, + value: { + description: 'Swell period.', + units: 'ms' + } + }); + + metas.push({ + path: `${pathRoot}.water.swell.directionTrue`, + value: { + description: 'Swell direction.', + units: 'rad' + } + }); + return metas; }; diff --git a/src/app/app.component.html b/src/app/app.component.html index b8660c14..2570f6da 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -124,7 +124,7 @@ - + +
+ No weather data found! +
@@ -89,7 +95,7 @@ export class WeatherForecastModal implements OnInit { } private getForecast(count = 8) { - const path = '/meteo/default-fb/forecasts'; + const path = '/meteo/freeboard-sk/forecasts'; // eslint-disable-next-line @typescript-eslint/no-explicit-any this.sk.api.get(2, path).subscribe((forecasts: any) => { Object.values(forecasts) @@ -98,13 +104,12 @@ export class WeatherForecastModal implements OnInit { .forEach((v: any) => { const forecastData: WeatherData = { wind: {} }; forecastData.description = v['description'] ?? ''; - forecastData.time = - new Date(v['timestamp']).toLocaleTimeString() ?? ''; + forecastData.time = new Date(v['date']).toLocaleTimeString() ?? ''; if (typeof v.outside?.temperature !== 'undefined') { forecastData.temperature = this.app.config.units?.temperature === 'f' - ? Convert.kelvinToFarenheit(v.ooutside.temperature).toFixed(1) + + ? Convert.kelvinToFarenheit(v.outside.temperature).toFixed(1) + String.fromCharCode(186) + 'F' : Convert.kelvinToCelcius(v.outside.temperature).toFixed(1) + diff --git a/src/app/modules/map/fb-map.component.html b/src/app/modules/map/fb-map.component.html index 28d3f86d..d47c1b81 100644 --- a/src/app/modules/map/fb-map.component.html +++ b/src/app/modules/map/fb-map.component.html @@ -590,5 +590,12 @@ anchor Anchor Watch +
diff --git a/src/app/modules/map/ol/lib/resources/layer-chart-bounds.component.ts b/src/app/modules/map/ol/lib/resources/layer-chart-bounds.component.ts index 92eaff11..88f19f91 100644 --- a/src/app/modules/map/ol/lib/resources/layer-chart-bounds.component.ts +++ b/src/app/modules/map/ol/lib/resources/layer-chart-bounds.component.ts @@ -170,13 +170,16 @@ export class ChartBoundsLayerComponent implements OnInit, OnDestroy, OnChanges { bounds[3] === 90) ) return []; - const rect = mapifyCoords([ - [bounds[0], bounds[1]], - [bounds[2], bounds[1]], - [bounds[2], bounds[3]], - [bounds[0], bounds[3]], - [bounds[0], bounds[1]] - ], 0); + const rect = mapifyCoords( + [ + [bounds[0], bounds[1]], + [bounds[2], bounds[1]], + [bounds[2], bounds[3]], + [bounds[0], bounds[3]], + [bounds[0], bounds[1]] + ], + 0 + ); return [fromLonLatArray(rect)]; } diff --git a/src/app/modules/map/ol/lib/util.ts b/src/app/modules/map/ol/lib/util.ts index 67dd0abf..41665d36 100644 --- a/src/app/modules/map/ol/lib/util.ts +++ b/src/app/modules/map/ol/lib/util.ts @@ -49,14 +49,20 @@ export function inDLCrossingZone(coord: Coordinate, zoneValue = 170) { } // update linestring coords for map display (including dateline crossing) -export function mapifyCoords(coords: Array, zoneValue?: number): Array { +export function mapifyCoords( + coords: Array, + zoneValue?: number +): Array { if (coords.length === 0) { return coords; } let dlCrossing = 0; const last = coords[0]; for (let i = 0; i < coords.length; i++) { - if (inDLCrossingZone(coords[i], zoneValue) || inDLCrossingZone(last, zoneValue)) { + if ( + inDLCrossingZone(coords[i], zoneValue) || + inDLCrossingZone(last, zoneValue) + ) { dlCrossing = last[0] > 0 && coords[i][0] < 0 ? 1 diff --git a/src/app/modules/skresources/resource-dialogs.ts b/src/app/modules/skresources/resource-dialogs.ts index eaf9de9a..63aedf8c 100644 --- a/src/app/modules/skresources/resource-dialogs.ts +++ b/src/app/modules/skresources/resource-dialogs.ts @@ -476,7 +476,9 @@ export class AISPropertiesModal implements OnInit { { - const pathRoot = `environment.${k}`; - const g = data.environment[k]; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - Object.entries(g).forEach((i: any) => { - const key = `${pathRoot}.${i[0]}`; - if (i[1].meta.units) { + Object.keys(bk).forEach((k: any) => { + const pathRoot = `${pk}.${k}`; + const g = bk[k]; + if (g.meta) { + res[pathRoot] = this.app.formatValueForDisplay( + g.value, + g.meta.units ? g.meta.units : '', + k.indexOf('level') !== -1 // depth values + ); + } else { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Object.entries(g).forEach((i: any) => { + const key = `${pathRoot}.${i[0]}`; res[key] = this.app.formatValueForDisplay( i[1].value, - i[1].meta.units + i[1].meta && i[1].meta.units ? i[1].meta.units : '', + i[0].indexOf('level') !== -1 // depth values ); - } else { - res[key] = i[1].value; - } - }); + }); + } }); } return res; @@ -627,7 +638,9 @@ export class AtoNPropertiesModal implements OnInit { Signal K Server >Note: Freeboard-SK requires the Signal K server to implement the following APIs: -
  • - Resources API: for the storage and retrieval of resources -
  • -
  • Course API: to set a destination or activate a route
  • -
    +
      +
    • + Resources API: for the storage and retrieval of resources +
    • +
    • Course API: to set a destination or activate a route
    • +
    + Freeboard is a "stateless" application which can be used concurrently at multiple stations to both display and send back information to the Signal K server.
    @@ -318,6 +320,12 @@

    Display

    Show / Hide Vessels: Toggle the display of other vessels.
  • Show / Hide Notes: Toggle the display of notes.
  • +
  • + Show weather forecast data. Weather forecast data from the + weather station closest to the vessel location. (Requires + Weather API enabled in + Server Admin -> Plugin Config -> Freeboard-SK) +
  • Settings: Open the Settings screen.
  • @@ -494,16 +502,20 @@

    Display

    Active Vessel: displays the current position and heading for a - vessel where an update has been received within the - time period selected in Settings->Vessels->Mark AIS Target Inactive After (default = 6 mins).
    + vessel where an update has been received within the time period + selected in + Settings->Vessels->Mark AIS Target Inactive After (default = 6 + mins).
    Inactive Vessel: displays the last received position and - heading for a vessel for which an update has NOT been received within the - time period selected in Settings->Vessels->Mark AIS Target Inactive After (default = 6 mins).
    + heading for a vessel for which an update has NOT been received within + the time period selected in + Settings->Vessels->Mark AIS Target Inactive After (default = 6 + mins).
    Note: Vessels are removed from display after there has been no - update received within the time period selected in - Settings->Vessels->Remove AIS Target After + update received within the time period selected in + Settings->Vessels->Remove AIS Target After (default = 9 mins).
    @@ -627,13 +639,14 @@

    layers Resources / Layers

    Additionally resources can be saved to a GPX file by selecting the save Save to GPX menu.
    +
      +
    • + directions + Routes: + Displays a list of available Routes. +
    • +
    -
  • - directions - Routes: - Displays a list of available Routes. -
  • -
    @@ -646,76 +659,84 @@

    layers Resources / Layers

    />
    -
  • - Filter Routes: Type into the text box to filter the list - of routes. -
  • -
  • - Display Route: Check the checkbox to display the route on - the map. -
  • +
      +
    • + Filter Routes: Type into the text box to filter the + list of routes. +
    • +
    • + Display Route: Check the checkbox to display the route + on the map. +
    • -
    • - Delete Route: Click - delete and you will be prompted to - delete the route.
      -
    • -
    • - Points: Click flag to view - a list of route points where the following actions can be - performed:
      -
    • -
    • - Set the destination point: If displayed route is the - Active Route, click a point to set it as the current - destination along the route. + Delete Route: Click + delete and you will be prompted + to delete the route.
    • - Re-order points: Use the handle to drag points to a new - position in the list.
      - Note: If points of the Active Route have been re-ordered - then you will not be able to set the destination point until - changes have been applied. - + Points: Click flag to + view a list of route points where the following actions can be + performed:
    • +
    +
    +
      +
    • + Set the destination point: If displayed route is the + Active Route, click a point to set it as the current + destination along the route. +
    • +
    • + Re-order points: Use the handle to drag points to a + new position in the list.
      + Note: If points of the Active Route have been re-ordered + then you will not be able to set the destination point + until changes have been applied. + +
    • +
    -
  • - Notes: - Clicking local_offer displays a - list of Notes associated with the route. From this screen you - can add, edit or delete notes. -
  • -
  • - Activate: Clicking - near_me sends a message to the - server to set this route as the Active Route.
    - The start of the route is set as the current destination.
    - Use the Previous and Next point options in the - more_horiz menu to select the - destination point. -
  • -
  • - Clear: Clicking - clear_all sends a message to the - server to clear the Active Route. -
  • -
  • - Edit Properties: Click - edit to edit route Name and - Description. -
  • -
    +
      +
    • + Notes: + Clicking local_offer displays a + list of Notes associated with the route. From this screen you + can add, edit or delete notes. +
    • +
    • + Activate: Clicking + near_me sends a message to the + server to set this route as the Active Route.
      + The start of the route is set as the current destination. +
      + Use the Previous and Next point options in the + more_horiz menu to select the + destination point. +
    • +
    • + Clear: Clicking + clear_all sends a message to the + server to clear the Active Route. +
    • +
    • + Edit Properties: Click + edit to edit route Name and + Description. +
    • +
    You can also click on a Route on the map to display an information window with additional actions.
    -
  • - Move: - Clicking touch_app allows route - points to be re-positioned. -
  • +
      +
    • + Move: + Clicking touch_app allows + route points to be re-positioned. +
    • +
    @@ -761,13 +782,13 @@

    layers Resources / Layers


    - -
  • - location_on - Waypoints: - Displays a list of available Waypoints. -
  • -
    +
      +
    • + location_on + Waypoints: + Displays a list of available Waypoints. +
    • +
    layers Resources / Layers />
    -
  • - Filter Waypoints: Type into the text box to filter the - list of waypoints. -
  • -
  • - Display Waypoint: Check the checkbox to display the - waypoint on the map. -
  • +
      +
    • + Filter Waypoints: Type into the text box to filter the + list of waypoints. +
    • +
    • + Display Waypoint: Check the checkbox to display the + waypoint on the map. +
    • -
    • - Delete Waypoint: Click - delete and you will be prompted to - delete the waypoint.
      - Note: A waypoint may be associated with a route. so take care - when deleting waypoints! -
    • -
    • - Notes: - Clicking local_offer displays a - list of Notes associated with the waypoint. From this screen you - can add, edit or delete notes. -
    • -
    • - Go To: Clicking - near_me sends a message to the - server to set this waypoint as the target to navigate to. The - server should then send - navigation data in relation to this - location. -
    • -
    • - Clear: Clicking - clear_all sends a message to the - server to clear the current destination. -
    • -
    • - Center: Clicking - center_focus_strong positions the - map so the waypaoint is displayed in the center. -
    • -
    • - Edit Properties Click - edit to edit waypoint Name and - Description. -
    • +
    • + Delete Waypoint: Click + delete and you will be prompted + to delete the waypoint.
      + Note: A waypoint may be associated with a route. so take + care when deleting waypoints! +
    • +
    • + Notes: + Clicking local_offer displays a + list of Notes associated with the waypoint. From this screen + you can add, edit or delete notes. +
    • +
    • + Go To: Clicking + near_me sends a message to the + server to set this waypoint as the target to navigate to. The + server should then send + navigation data in relation to this + location. +
    • +
    • + Clear: Clicking + clear_all sends a message to the + server to clear the current destination. +
    • +
    • + Center: Clicking + center_focus_strong positions + the map so the waypaoint is displayed in the center. +
    • +
    • + Edit Properties Click + edit to edit waypoint Name and + Description. +
    • +

    @@ -831,51 +854,55 @@

    layers Resources / Layers

    window with additional actions.
    -
  • - Move: - Clicking touch_app allows waypoints - to be re-positioned. -
  • +
      +
    • + Move: + Clicking touch_app allows + waypoints to be re-positioned. +
    • +

    - -
  • - local_offer - Notes: - Displays a list of available Notes. -
  • -
    +
      +
    • + local_offer + Notes: + Displays a list of available Notes. +
    • +
    -
  • - Filter Notes: Type into the text box to filter the list - of notes. -
  • -
  • - Draft Notes: Click - border_color to display only draft - notes in the list.
    -
  • +
      +
    • + Filter Notes: Type into the text box to filter the list + of notes. +
    • +
    • + Draft Notes: Click + border_color to display only + draft notes in the list.
      +
    • -
    • - Display Notes: Check the checkbox to display notes on the - map. -
    • +
    • + Display Notes: Check the checkbox to display notes on + the map. +
    • -
    • - Group: Clicking - styles will display a list of - notes in the same group. -
    • +
    • + Group: Clicking + styles will display a list of + notes in the same group. +
    • -
    • - Properties: Click - info_outline to open the note - information / editor screen. -
    • +
    • + Properties: Click + info_outline to open the note + information / editor screen. +
    • +
    layers Resources / Layers Note Properties:
    Freeboard uses specfic key / value pairs that are defined within the properties: {} block of a note:
      -
  • - draft (boolean): Indicates whether the note is in - draft mode. Used by the server to determine the visibility or - scope of where the note is made available. -
  • -
  • - readOnly (boolean): Used by Freeboard (when - meta._attr is not available) to determine whther the note is - editable. -
  • -
    +
      +
    • + draft (boolean): Indicates whether the note is in + draft mode. Used by the server to determine the visibility or + scope of where the note is made available. +
    • +
    • + readOnly (boolean): Used by Freeboard (when + meta._attr is not available) to determine whther the note is + editable. +
    • +
    Example: properties: { draft: true, readOnly: false } @@ -910,9 +938,12 @@

    layers Resources / Layers

    Note: Freeboard uses chart information from the ./resources/charts - path and requires that the server has a supported plugin installed and configured - (e.g. @signalk/charts-plugin) for charts to be available.Note: Freeboard uses chart information from the + ./resources/charts + path and requires that the server has a supported plugin installed + and configured + (e.g. @signalk/charts-plugin) for charts to be + available.
     
    Freeboard supports the following chart types: @@ -935,10 +966,21 @@

    layers Resources / Layers

    to color lines and fill polygons. +
  • + mapstyleJSON: A mapbox style JSON file which defines + sources and styles of vector tiles maps. +
  • WMS: A Web Map Service which serves geo-referenced image tiles.
  • +
  • + WMTS: A Web Map Service which serves pre-rendered tiles. +
  • +
  • + PMTile (Protomap): A single-file archive format for tiled + data which can be hosted on commodity storage. +

  • @@ -947,33 +989,38 @@

    layers Resources / Layers

    -
  • - Filter Charts: Type into the text box to filter the list - of charts. -
  • -
  • - Re-order charts: Click - import_export to arrange the chart - stack to ensure charts are displayed in the correct order. Drag - and drop the charts within the list to chage the order. -
  • -
  • - Chart Bounds: Click - select_all to display the bounds - of the listed charts. The bounding rectangle of each chart will - be overlayed on the current map display. -
  • -
  • - Properties: Click - info_outline to display the chart - properties. -
  • -
  • - Display Chart: Check the checkbox to display the chart. -
  • +
      +
    • + Filter Charts: Type into the text box to filter the + list of charts. +
    • +
    • + Re-order charts: Click + import_export to arrange the + chart stack to ensure charts are displayed in the correct + order. Drag and drop the charts within the list to chage the + order. +
    • +
    • + Chart Bounds: Click + select_all to display the bounds + of the listed charts. The bounding rectangle of each chart + will be overlayed on the current map display. +
    • +
    • + Properties: Click + info_outline to display the + chart properties. +
    • +
    • + Display Chart: Check the checkbox to display the chart. +
    • +
    Freeboard by default will display: -
  • OpenStreetMap
  • -
  • OpenSeaMap
  • +
      +
    • OpenStreetMap
    • +
    • OpenSeaMap
    • +
    which require an internet connection to be displayed.
    Local Charts hosted on the Signal K server are identified with the map icon. @@ -987,14 +1034,15 @@

    layers Resources / Layers

    saveSave to GPX


    - -
  • - Click the layers - Resources toolbar button and select the - save Save to GPX option from - the menu. -
  • -
    +
      +
    • + Click the + layers + Resources toolbar button and select the + save Save to GPX option from + the menu. +
    • +
    @@ -1009,20 +1057,20 @@

    saveSave to GPX

    >Note: this option is only available when Get Trail from Server setting is not selected.
    - -
  • - Waypoints: Click the checkbox to select all Waypoints or - expand the list and select the Waypoints to export. -
  • -
  • - Routes: Click the checkbox to select all Routes or expand - the list and select the Routes to export. -
  • -
  • - Tracks: Click the checkbox to select all Tracks or expand - the list and select the Tracks to export. -
  • -
    +
      +
    • + Waypoints: Click the checkbox to select all Waypoints + or expand the list and select the Waypoints to export. +
    • +
    • + Routes: Click the checkbox to select all Routes or + expand the list and select the Routes to export. +
    • +
    • + Tracks: Click the checkbox to select all Tracks or + expand the list and select the Tracks to export. +
    • +
    After selecting the required resources click Save to choose the name and location of the GPX file.
    @@ -1031,51 +1079,54 @@

    saveSave to GPX

    streetviewLoad from GPX

    -
  • - menu - Main Menu: - Access the streetview - Load from GPX option from the Main menu. -
  • -
    +
      +
    • + menu + Main Menu: + Access the streetview + Load from GPX option from the Main menu. +
    • +
    @@ -1084,16 +1135,16 @@

    streetviewLoad from GPX

    After selecting a GPX file from the Open File dialog you will be presented with a screen that will allow you to select some or all of the Route and Waypoint resources contained in the file.
    - -
  • - Waypoints: Click the checkbox to select all Waypoints or - expand the list and select the Waypoints to import. -
  • -
  • - Routes: Click the checkbox to select all Routes or expand - the list and select the Routes to import. -
  • -
    +
      +
    • + Waypoints: Click the checkbox to select all Waypoints + or expand the list and select the Waypoints to import. +
    • +
    • + Routes: Click the checkbox to select all Routes or + expand the list and select the Routes to import. +
    • +
    After selecting the resources click Load Selected to load the resources onto the Signal K server.
    @@ -1197,30 +1248,33 @@

    categoryLoad Resource

    `non-standard` resource paths that accept `PUT` or `POST` requests.
     
    To upload data: -
  • - Select the categoryLoad Resource menu - option. -
  • -
  • - Select the desired destination path from the drop-down list.
    - Note: only paths detected under `signalk/v1/api/resources` are - listed. +
  • + Select the categoryLoad Resource + menu option. +
  • +
  • + Select the desired destination path from the drop-down list.
    + Note: only paths detected under `signalk/v1/api/resources` are + listed. +
  • +
  • + Click and select (or drop) the file containing the resource data. +
  • +
  • + Click Load to upload the fiel contents to the server. +
  • + Important: + Freeboard does not attempt to validate the file contents in any + way so please ensure you are uploading appropirate content for + the selected destination. + - -
  • - Click and select (or drop) the file containing the resource data. -
  • -
  • Click Load to upload the fiel contents to the server.
  • - Important: - Freeboard does not attempt to validate the file contents in any - way so please ensure you are uploading appropirate content for the - selected destination. - -
    + For information about using `ResourceSets` see Resource Paths in in Settings.
    @@ -1330,12 +1384,13 @@

    raise alarms.
    Notifications are displayed using: -
  • Visual only (popup at the top of the screen)
  • -
  • Sound only
  • -
  • Visual & Sound
  • - as specified by the notification message received from the Signal K - server. -
    +
      +
    • Visual only (popup at the top of the screen)
    • +
    • Sound only
    • +
    • Visual & Sound
    • + as specified by the notification message received from the Signal K + server. +
    The following Alarms can be raised:
    @@ -1343,50 +1398,56 @@


    To RAISE an alarm:
    -
  • - Click the - warning - button on the toolbar to display the Alarms dialog: -
  • -
  • - Click the RAISE ALARM button for the desired alarm type. -
  • - An alarm notification will be sent to the Signal K server.
    -  
    - Freeboard will display the received alarm from the server. This alarm - can be Acknowledged and / or Muted.
    -
  • - Acknowledging the alarm will minimise the alarm icon until the alarm - has been cleared. -
  • - -
  • The raised alarm will remain until it is cancelled.
  • -
    -
    To CANCEL an alarm:
    -
  • - Click the - warning - button on the toolbar to display the Alarms dialog: -
  • -
  • Click the CANCEL ALARM button.
  • +
      +
    • + Click the + warning + button on the toolbar to display the Alarms dialog: +
    • +
    • + Click the RAISE ALARM button for the desired alarm type. +
    • + An alarm notification will be sent to the Signal K server.
      +  
      + Freeboard will display the received alarm from the server. This + alarm can be + Acknowledged + and / or + Muted.
      +
    • + Acknowledging the alarm will minimise the alarm icon until the + alarm has been cleared. +
    • + +
    • The raised alarm will remain until it is cancelled.
    • +
      +
      To CANCEL an alarm:
      +
    • + Click the + warning + button on the toolbar to display the Alarms dialog: +
    • +
    • Click the CANCEL ALARM button.
    • -
      -
      NOTIFICATIONS:
      - Freeboard displays the following Notifications: -
    • Depth
    • -
    • Anchor - see Anchor Watch
    • -
    • Closest Approach
    • -
      -
    • Buddy - via signalk-buddylist-plugin
    • - +
      +
      NOTIFICATIONS:
      + Freeboard displays the following Notifications: +
    • Depth
    • +
    • Anchor - see Anchor Watch
    • +
    • Closest Approach
    • +
      +
    • Buddy - via signalk-buddylist-plugin
    • + +
    @@ -1420,9 +1481,10 @@

    Vessels

    Freeboard provides the ability to de-clutter the screen of vessels in the following ways: -
  • Show / Hide Vessels layer on the map
  • -
  • Providing the ability select which Vessels to display.
  • - +
      +
    • Show / Hide Vessels layer on the map
    • +
    • Providing the ability select which Vessels to display.
    • +
    Additionally, a wind vector will be displayed for vessels where the data is available.
    This vector will only be displayed at higher zoom levels so as to @@ -1434,59 +1496,64 @@

    Vessels

    Settings screen.
     
    To Show / Hide the Vessels Map Layer:
    -
  • - From the more_horiz menu select - either: -
      -
    • - visibility Show Vessels -
    • -
    • - visibility_off Hide Vessels -
    • -
    -
  • -
    +
      +
    • + From the more_horiz menu select + either: +
        +
      • + visibility Show Vessels +
      • +
      • + visibility_off Hide Vessels +
      • +
      +
    • +
    To Select Vessels:
    -
  • - From the menu menu select - directions_boat Vessels. -
  • -
    +
      +
    • + From the menu menu select + directions_boat Vessels. +
    • +
    -
  • - Filter Vessels: Type into the text box to filter the list - of vessels. -
  • -
  • - Display Vessel: Tick the checkbox to display the vessel - on the map. -
  • - Freeboard by default will display all vessels
    -
  • - info_outline - Info: - Click this button to display the vessel properties. -
  • -
  • - center_focus_weak - Focus: Click this button to set this vessel as the active - vessel and direct all actions to this vessels path on the Signal - K server.
    - Note: Actions may fail if the Signal K server does not - support PUTs to paths other than `vessels/self` - -
  • -
  • - clear_all - Unfocus: Click this button to reset the active vessel to - self. -
  • +
      +
    • + Filter Vessels: Type into the text box to filter the + list of vessels. +
    • +
    • + Display Vessel: Tick the checkbox to display the vessel + on the map. +
    • + Freeboard by default will display all vessels
      +
    • + info_outline + Info: + Click this button to display the vessel properties. +
    • +
    • + center_focus_weak + Focus: Click this button to set this vessel as the + active vessel and direct all actions to this vessels path on + the Signal K server.
      + Note: Actions may fail if the Signal K server does not + support PUTs to paths other than `vessels/self` + +
    • +
    • + clear_all + Unfocus: Click this button to reset the active vessel + to self. +
    • +
    Playback History


     
    Note: Playback history must be supported by the server.
     
    -
  • - menu - Main Menu: - Access the history - Playback History option from the Main menu. -
  • -
    +
      +
    • + menu + Main Menu: + Access the history + Playback History option from the Main menu. +
    • +
    @@ -1549,11 +1617,13 @@

    Playback History

    Once started, Playback Mode is identified by the addition of the cancel button to the menu bar. - -
  • - Click cancel to - end playback and return to realtime data stream. -
  • +
      +
    • + Click + cancel to end + playback and return to realtime data stream. +
    • +
    @@ -1714,16 +1784,17 @@

    settings Settings

    Notification type to use: Select the notification from the server to use to trigger the advancement to the next point.
    Choose either: -
  • - perpendicularPassed (advancement occurs immediately - notification is received.) -
  • -
  • - arrivalCircleEntered (advancement occurs once - Time to Wait has elapsed after notification has been - receieved.) -
  • - +
      +
    • + perpendicularPassed (advancement occurs immediately + notification is received.) +
    • +
    • + arrivalCircleEntered (advancement occurs once + Time to Wait has elapsed after notification has been + receieved.) +
    • +
    Time to Wait: Note: This option is only available when arrivalCircleEntered has been selected as the notification type.
    @@ -1795,40 +1866,42 @@

    settings Settings

    style="height: 200px" alt="" />
    -
  • - Mark AIS Target inactive after: Maximum time (in minutes) - elapsed between updates before the vessel is displayed as inactive. -
  • -
  • - Remove AIS Target after: Maximum time (in minutes) elapsed - between updates before the vessel is removed from map. -
  • -
  • - Wind Vector Value: Wind True / Wind Apparent - Value used to display wind vector for other vessels displayed on the - map. -
  • -
  • - Wind / Trail Zoom Level: The minimum Zoom level at which - other vessels wind vector and trails will be displayed. - (Default=15) -
  • -
  • - Show Trails: Select to display trails of other vessels on - map. Note: length of trail is limited in length to approx 1hr of - data. -
  • -
  • - Hide Moored: Select to hide vessels with a state of - 'moored'. Note: Display is updated when next vessel update is - received. -
  • -
  • - Hide Anchored: Select to hide vessels with a state of - 'anchored'. Note: Display is updated when next vessel update - is received. -
  • - +
      +
    • + Mark AIS Target inactive after: Maximum time (in minutes) + elapsed between updates before the vessel is displayed as + inactive. +
    • +
    • + Remove AIS Target after: Maximum time (in minutes) elapsed + between updates before the vessel is removed from map. +
    • +
    • + Wind Vector Value: Wind True / Wind Apparent + Value used to display wind vector for other vessels displayed on + the map. +
    • +
    • + Wind / Trail Zoom Level: The minimum Zoom level at which + other vessels wind vector and trails will be displayed. + (Default=15) +
    • +
    • + Show Trails: Select to display trails of other vessels on + map. Note: length of trail is limited in length to approx 1hr of + data. +
    • +
    • + Hide Moored: Select to hide vessels with a state of + 'moored'. Note: Display is updated when next vessel update + is received. +
    • +
    • + Hide Anchored: Select to hide vessels with a state of + 'anchored'. Note: Display is updated when next vessel + update is received. +
    • +

    RESOURCES: NOTES
    Tracks: /signalk/vi/api/resources/tracks path is available from which to write and retrieve track data.
    This requires the following action: -
  • - Configure the - sk-resources-fs plugin (v1.3.0 or later) to serve the - tracks path. -
  • -
  • Re-start the Signal K server
  • -
  • - Once the server has re-started Tracks will appear in the list - of available resource paths. -
  • -
  • - Select Tracks and this will display the - show_chart Tracks entry in the - layers - layers list. -
  • - -
     
    +
      +
    • + Configure the + sk-resources-fs plugin (v1.3.0 or later) to serve the + tracks path. +
    • +
    • Re-start the Signal K server
    • +
    • + Once the server has re-started Tracks will appear in the + list of available resource paths. +
    • +
    • + Select Tracks and this will display the + show_chart Tracks entry in + the + layers + layers list. +
    • +
    +  
    Resource Sets:
    Data from all other resource paths that you enable in Freeboard Settings will be treated as ResourceSets.
    @@ -1991,8 +2066,9 @@
    Resource Sets:

    SIGNAL K CONNECTION:
    - This section allows you to set parameters for the Signal K stream connection - to provide control over the type and number of features displayed on the map.
    + This section allows you to set parameters for the Signal K stream + connection to provide control over the type and number of features + displayed on the map.
    Note: The Signal K data stream can deliver a large volume of data depending on the data sources you have connected. The processing of @@ -2007,47 +2083,47 @@
    Resource Sets:
    />
    Signal K server is behind a proxy:
    - Check this option when your browser is connecting to a Signal K server that is behind a - proxy server. - This enables Freeboard-SK to correctly detect and connect to the endpoints exposed - by the Signal K Server.
     
    + Check this option when your browser is connecting to a Signal K server + that is behind a proxy server. This enables Freeboard-SK to correctly + detect and connect to the endpoints exposed by the Signal K Server.
     
    Filter Stream Data: - Use the options in this section to select which Signal K context(s) will be used - to display features on the map.
    - -
  • - Vessels: Display vessels (other than your own) on the map. - (Default is checked) -
  • + Use the options in this section to select which Signal K + context(s) will be used to display features on the map.
    +
      +
    • + Vessels: Display vessels (other than your own) on the map. + (Default is checked) +
    • -
    • - Aids to Navigation: Display AtoNs on the map. - (Default is checked) -
    • +
    • + Aids to Navigation: Display AtoNs on the map. + (Default is checked) +
    • -
    • - Aircraft: Display aircraft on the map. - (Default is unchecked) -
    • +
    • + Aircraft: Display aircraft on the map. + (Default is unchecked) +
    • -
    • - Search and Rescue: Display SaR beacons on the map. - (Default is unchecked) -
    • +
    • + Search and Rescue: Display SaR beacons on the map. + (Default is unchecked) +
    • -
    • - Meteo (Weather): Display weather stations on the map. - (Default is unchecked) -
    • -
      -
    • - Max Distance from Vessel: Set the distance from your vessel - that targets must be within to be displayed on the map.
      - The distance represents the radius of a bounding box around your - vessel.
      - Selecting None (default) will display all received targets. -
    • +
    • + Meteo (Weather): Display weather stations on the map. + (Default is unchecked) +
    • +
      +
    • + Max Distance from Vessel: Set the distance from your vessel + that targets must be within to be displayed on the map.
      + The distance represents the radius of a bounding box around your + vessel.
      + Selecting None (default) will display all received targets. +
    • +
    @@ -2113,8 +2189,10 @@

    science Experiments

    Once enabled, you can access these features via the science button.
     
    - Note: Some experiments will require configuration settings to be made - in the Signal K server Admin console under Plugin Config -> Freeboard-SK. + Note: Some experiments will require configuration settings to + be made in the Signal K server Admin console under + Plugin Config -> Freeboard-SK. +