signalk-mqtt-export
Version:
SignalK plugin to selectively export data to MQTT with webapp management interface
142 lines (141 loc) • 3.62 kB
TypeScript
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;
}