UNPKG

signalk-mqtt-export

Version:

SignalK plugin to selectively export data to MQTT with webapp management interface

142 lines (141 loc) 3.62 kB
import { Request, Response } from 'express'; import { MqttClient } from 'mqtt'; import { ServerAPI, Plugin, Delta, Update, PathValue, Context, Path, Timestamp } from '@signalk/server-api'; export type SignalKApp = ServerAPI; export type SignalKDelta = Delta; export type SignalKUpdate = Update; export type SignalKValue = PathValue; export type SignalKContext = Context; export type SignalKPath = Path; export type SignalKTimestamp = Timestamp; export interface SignalKPlugin extends Plugin { config?: MQTTExportConfig; } export interface MQTTExportConfig { enabled: boolean; mqttBroker: string; mqttClientId: string; mqttUsername: string; mqttPassword: string; topicPrefix: string; exportRules: ExportRule[]; } export interface ExportRule { id: string; name: string; context: string; path: string; source?: string; sourceLabel?: string; enabled: boolean; period: number; qos: number; retain: boolean; payloadFormat: PayloadFormat; sendOnChange: boolean; topicTemplate?: string; excludeMMSI?: string; } export type PayloadFormat = 'full' | 'value-only'; export interface PluginState { mqttClient: MqttClient | null; exportRules: ExportRule[]; activeSubscriptions: Map<string, ExportRule[]>; lastSentValues: Map<string, unknown>; currentConfig?: MQTTExportConfig; unsubscribes: (() => void)[]; } export interface MQTTClientOptions { clientId: string; clean: boolean; reconnectPeriod: number; keepalive: number; username?: string; password?: string; } export interface TypedRequest<T = unknown> extends Request { body: T; } export interface TypedResponse<T = unknown> extends Response { json: (obj: T) => this; } export interface ApiResponse { success: boolean; message?: string; error?: string; topic?: string; } export interface RulesApiResponse extends ApiResponse { rules: ExportRule[]; activeSubscriptions: number; mqttConnected: boolean; } export interface MQTTStatusApiResponse extends ApiResponse { connected: boolean; broker?: string; clientId?: string; } export interface RuleUpdateRequest { rules: ExportRule[]; } export interface DefaultRuleConfig { id: string; name: string; context: string; path: string; source: string; enabled: boolean; period: number; qos: number; retain: boolean; payloadFormat: PayloadFormat; sendOnChange: boolean; excludeMMSI?: string; } export interface MqttPublishResult { topic: string; payload: string; rule: ExportRule; success: boolean; error?: string; } export interface ContextGroup { context: string; rules: ExportRule[]; } export interface ValueChangeResult { hasChanged: boolean; currentValue: unknown; previousValue?: unknown; } export interface TopicTemplateVariables { context: string; path: string; source?: string; } export interface RuleValidationResult { isValid: boolean; errors: string[]; } export interface PluginStats { totalRules: number; enabledRules: number; activeSubscriptions: number; mqttConnected: boolean; messagesPublished: number; lastPublishTime?: string; } export type MqttConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error'; export interface SubscriptionError { context: string; path: string; error: string; } export interface RuleProcessingResult { rule: ExportRule; matched: boolean; published: boolean; topic?: string; payload?: string; error?: string; }