@tbiegner99/reporter 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -0
- package/dist/src/constants.d.ts +9 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +11 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +20 -0
- package/dist/src/models/index.d.ts +2 -0
- package/dist/src/models/index.d.ts.map +1 -0
- package/dist/src/models/index.js +17 -0
- package/dist/src/models/measures/index.d.ts +9 -0
- package/dist/src/models/measures/index.d.ts.map +1 -0
- package/dist/src/models/measures/index.js +24 -0
- package/dist/src/models/measures/unit.d.ts +25 -0
- package/dist/src/models/measures/unit.d.ts.map +1 -0
- package/dist/src/models/measures/unit.js +51 -0
- package/dist/src/models/measures/units/direction.d.ts +20 -0
- package/dist/src/models/measures/units/direction.d.ts.map +1 -0
- package/dist/src/models/measures/units/direction.js +105 -0
- package/dist/src/models/measures/units/distance.d.ts +26 -0
- package/dist/src/models/measures/units/distance.d.ts.map +1 -0
- package/dist/src/models/measures/units/distance.js +60 -0
- package/dist/src/models/measures/units/percent.d.ts +18 -0
- package/dist/src/models/measures/units/percent.d.ts.map +1 -0
- package/dist/src/models/measures/units/percent.js +48 -0
- package/dist/src/models/measures/units/pressure.d.ts +25 -0
- package/dist/src/models/measures/units/pressure.d.ts.map +1 -0
- package/dist/src/models/measures/units/pressure.js +62 -0
- package/dist/src/models/measures/units/speed.d.ts +19 -0
- package/dist/src/models/measures/units/speed.d.ts.map +1 -0
- package/dist/src/models/measures/units/speed.js +64 -0
- package/dist/src/models/measures/units/temperature.d.ts +17 -0
- package/dist/src/models/measures/units/temperature.d.ts.map +1 -0
- package/dist/src/models/measures/units/temperature.js +56 -0
- package/dist/src/models/measures/units/time.d.ts +19 -0
- package/dist/src/models/measures/units/time.d.ts.map +1 -0
- package/dist/src/models/measures/units/time.js +50 -0
- package/dist/src/reading/HumidityReading.d.ts +5 -0
- package/dist/src/reading/HumidityReading.d.ts.map +1 -0
- package/dist/src/reading/HumidityReading.js +11 -0
- package/dist/src/reading/Reading.d.ts +10 -0
- package/dist/src/reading/Reading.d.ts.map +1 -0
- package/dist/src/reading/Reading.js +20 -0
- package/dist/src/reading/TemperatureReading.d.ts +6 -0
- package/dist/src/reading/TemperatureReading.d.ts.map +1 -0
- package/dist/src/reading/TemperatureReading.js +12 -0
- package/dist/src/reporter/CurrentStatusReporter.d.ts +13 -0
- package/dist/src/reporter/CurrentStatusReporter.d.ts.map +1 -0
- package/dist/src/reporter/CurrentStatusReporter.js +35 -0
- package/dist/src/reporter/DatabaseReporter.d.ts +29 -0
- package/dist/src/reporter/DatabaseReporter.d.ts.map +1 -0
- package/dist/src/reporter/DatabaseReporter.js +56 -0
- package/dist/src/reporter/KafkaReporter.d.ts +34 -0
- package/dist/src/reporter/KafkaReporter.d.ts.map +1 -0
- package/dist/src/reporter/KafkaReporter.js +86 -0
- package/dist/src/reporter/LoggerReporter.d.ts +24 -0
- package/dist/src/reporter/LoggerReporter.d.ts.map +1 -0
- package/dist/src/reporter/LoggerReporter.js +34 -0
- package/dist/src/reporter/MQTTReporter.d.ts +44 -0
- package/dist/src/reporter/MQTTReporter.d.ts.map +1 -0
- package/dist/src/reporter/MQTTReporter.js +101 -0
- package/dist/src/reporter/Reporter.d.ts +10 -0
- package/dist/src/reporter/Reporter.d.ts.map +1 -0
- package/dist/src/reporter/Reporter.js +15 -0
- package/dist/src/reporter/ReporterConfig.d.ts +136 -0
- package/dist/src/reporter/ReporterConfig.d.ts.map +1 -0
- package/dist/src/reporter/ReporterConfig.js +99 -0
- package/dist/src/reporter/ReporterFactory.d.ts +14 -0
- package/dist/src/reporter/ReporterFactory.d.ts.map +1 -0
- package/dist/src/reporter/ReporterFactory.js +74 -0
- package/dist/src/reporter/formatter/DefaultFormatter.d.ts +6 -0
- package/dist/src/reporter/formatter/DefaultFormatter.d.ts.map +1 -0
- package/dist/src/reporter/formatter/DefaultFormatter.js +12 -0
- package/dist/src/reporter/formatter/FormatterFactory.d.ts +9 -0
- package/dist/src/reporter/formatter/FormatterFactory.d.ts.map +1 -0
- package/dist/src/reporter/formatter/FormatterFactory.js +59 -0
- package/dist/src/reporter/formatter/HumidityFormatter.d.ts +7 -0
- package/dist/src/reporter/formatter/HumidityFormatter.d.ts.map +1 -0
- package/dist/src/reporter/formatter/HumidityFormatter.js +14 -0
- package/dist/src/reporter/formatter/TemperatureFormatter.d.ts +12 -0
- package/dist/src/reporter/formatter/TemperatureFormatter.d.ts.map +1 -0
- package/dist/src/reporter/formatter/TemperatureFormatter.js +20 -0
- package/dist/src/reporter/index.d.ts +5 -0
- package/dist/src/reporter/index.d.ts.map +1 -0
- package/dist/src/reporter/index.js +20 -0
- package/dist/src/service/CurrentConditionsManager.d.ts +34 -0
- package/dist/src/service/CurrentConditionsManager.d.ts.map +1 -0
- package/dist/src/service/CurrentConditionsManager.js +58 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Reporter } from './Reporter';
|
|
2
|
+
import { ReporterConfig } from './ReporterConfig';
|
|
3
|
+
import { Reading } from '../models';
|
|
4
|
+
import MQTT from 'async-mqtt';
|
|
5
|
+
export interface MqttReporterConfig extends ReporterConfig {
|
|
6
|
+
zoneName?: string;
|
|
7
|
+
topic?: string;
|
|
8
|
+
reportingInterval: number;
|
|
9
|
+
zoneDescription: string;
|
|
10
|
+
user: string;
|
|
11
|
+
password: string;
|
|
12
|
+
broker: string;
|
|
13
|
+
logLevel?: number;
|
|
14
|
+
topics: {
|
|
15
|
+
[x: string]: string;
|
|
16
|
+
} | undefined;
|
|
17
|
+
appName: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class MqttReporter extends Reporter {
|
|
20
|
+
topic: string;
|
|
21
|
+
broker: string;
|
|
22
|
+
user: string;
|
|
23
|
+
password: string;
|
|
24
|
+
zoneName: string;
|
|
25
|
+
zoneDescription: string;
|
|
26
|
+
lastReported: number;
|
|
27
|
+
reportingInterval: number;
|
|
28
|
+
isConnected: boolean;
|
|
29
|
+
topics: {
|
|
30
|
+
[x: string]: string;
|
|
31
|
+
} | undefined;
|
|
32
|
+
client: MQTT.AsyncClient;
|
|
33
|
+
constructor(config: MqttReporterConfig, env: any);
|
|
34
|
+
getName(): string;
|
|
35
|
+
reportError(): Promise<void>;
|
|
36
|
+
init(): Promise<void>;
|
|
37
|
+
shouldReportReading(reading: Reading<any>): boolean;
|
|
38
|
+
isOutsideOfReportingInterval(): boolean;
|
|
39
|
+
isReporterActive(): boolean;
|
|
40
|
+
getTopicForType(type: string): string | undefined;
|
|
41
|
+
createReading(zoneName: string, reading: Reading<any>): Promise<void>;
|
|
42
|
+
reportReading(reading: Reading<any>): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=MQTTReporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MQTTReporter.d.ts","sourceRoot":"","sources":["../../../src/reporter/MQTTReporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAS,MAAM,WAAW,CAAC;AAC3C,OAAO,IAAI,MAAM,YAAY,CAAC;AAG9B,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAa,SAAQ,QAAQ;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAC5C,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC;gBAEb,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;IAuBhD,OAAO;IAGD,WAAW;IAEX,IAAI;IAcV,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO;IAOnD,4BAA4B;IAS5B,gBAAgB;IAIhB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAO3C,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;IAwBrD,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;CAQ1C"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MqttReporter = void 0;
|
|
7
|
+
const Reporter_1 = require("./Reporter");
|
|
8
|
+
const async_mqtt_1 = __importDefault(require("async-mqtt"));
|
|
9
|
+
class MqttReporter extends Reporter_1.Reporter {
|
|
10
|
+
constructor(config, env) {
|
|
11
|
+
super();
|
|
12
|
+
this.isConnected = false;
|
|
13
|
+
this.broker = config.broker || env.MQTT_BROKER;
|
|
14
|
+
this.topic = config.topic || env.MQTT_TOPIC;
|
|
15
|
+
this.topics = config.topics || {};
|
|
16
|
+
if (!config.topics) {
|
|
17
|
+
Object.entries(process.env).forEach(([key, value]) => {
|
|
18
|
+
var topicPrefix = 'MQTT_TOPIC_';
|
|
19
|
+
if (key && key.startsWith(topicPrefix)) {
|
|
20
|
+
let topic = key.substring(topicPrefix.length);
|
|
21
|
+
this.topics[topic] = value;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
this.zoneName = config.zoneName || env.ZONE_NAME;
|
|
26
|
+
this.zoneDescription = config.zoneDescription || env.ZONE_DESCRIPTION;
|
|
27
|
+
this.lastReported = 0;
|
|
28
|
+
this.reportingInterval = config.reportingInterval;
|
|
29
|
+
this.user = config.user || env.MQTT_USER;
|
|
30
|
+
this.password = config.password || env.MQTT_PASSWORD;
|
|
31
|
+
}
|
|
32
|
+
getName() {
|
|
33
|
+
return 'mqttReporter';
|
|
34
|
+
}
|
|
35
|
+
async reportError() { }
|
|
36
|
+
async init() {
|
|
37
|
+
try {
|
|
38
|
+
this.client = await async_mqtt_1.default.connectAsync(this.broker, {
|
|
39
|
+
username: this.user,
|
|
40
|
+
password: this.password,
|
|
41
|
+
});
|
|
42
|
+
this.isConnected = true;
|
|
43
|
+
console.log('Connected to MQTT broker');
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
console.error('Error connecting to MQTT broker');
|
|
47
|
+
console.error(err.message);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
shouldReportReading(reading) {
|
|
51
|
+
var _a;
|
|
52
|
+
if (this.isReporterActive()) {
|
|
53
|
+
return Boolean(this.topic) || ((_a = this.topics) === null || _a === void 0 ? void 0 : _a[reading.type]) !== undefined;
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
isOutsideOfReportingInterval() {
|
|
58
|
+
return (!this.lastReported ||
|
|
59
|
+
!this.reportingInterval ||
|
|
60
|
+
this.reportingInterval <= 0 ||
|
|
61
|
+
Date.now() - this.lastReported > this.reportingInterval);
|
|
62
|
+
}
|
|
63
|
+
isReporterActive() {
|
|
64
|
+
return this.isOutsideOfReportingInterval() && Boolean(this.zoneName);
|
|
65
|
+
}
|
|
66
|
+
getTopicForType(type) {
|
|
67
|
+
if (!this.topics || !this.topics[type]) {
|
|
68
|
+
return this.topic || undefined;
|
|
69
|
+
}
|
|
70
|
+
return this.topics[type];
|
|
71
|
+
}
|
|
72
|
+
async createReading(zoneName, reading) {
|
|
73
|
+
if (!this.isConnected) {
|
|
74
|
+
await this.init();
|
|
75
|
+
}
|
|
76
|
+
const timestamp = Date.now();
|
|
77
|
+
const topic = this.getTopicForType(reading.type);
|
|
78
|
+
if (!topic) {
|
|
79
|
+
console.debug(`No topic configured so not send reading of type ${reading.type} to MQTT`);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
console.info(`Sending ${reading.type} reading to MQTT topic ${topic}`);
|
|
83
|
+
await this.client.publish(topic, JSON.stringify({
|
|
84
|
+
timestamp,
|
|
85
|
+
zoneName,
|
|
86
|
+
type: reading.type,
|
|
87
|
+
value: reading.reading.value,
|
|
88
|
+
unit: reading.reading.unit,
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
async reportReading(reading) {
|
|
92
|
+
try {
|
|
93
|
+
await this.createReading(this.zoneName, reading);
|
|
94
|
+
this.lastReported = Date.now();
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
console.warn('Error saving reading to mqtt', err);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.MqttReporter = MqttReporter;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Reading } from '../models';
|
|
2
|
+
export declare abstract class Reporter {
|
|
3
|
+
init(): Promise<void>;
|
|
4
|
+
shouldReportReading(reading: Reading<any>): boolean;
|
|
5
|
+
report(reading: Reading<any>): void;
|
|
6
|
+
abstract getName(): string;
|
|
7
|
+
abstract reportReading(reading: Reading<any>): Promise<any>;
|
|
8
|
+
abstract reportError(error: any): Promise<any>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=Reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Reporter.d.ts","sourceRoot":"","sources":["../../../src/reporter/Reporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,8BAAsB,QAAQ;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAE3B,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO;IAInD,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;IAM5B,QAAQ,CAAC,OAAO,IAAI,MAAM;IAE1B,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IAE3D,QAAQ,CAAC,WAAW,CAAC,KAAK,KAAA,GAAG,OAAO,CAAC,GAAG,CAAC;CAC1C"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Reporter = void 0;
|
|
4
|
+
class Reporter {
|
|
5
|
+
async init() { }
|
|
6
|
+
shouldReportReading(reading) {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
report(reading) {
|
|
10
|
+
if (this.shouldReportReading(reading)) {
|
|
11
|
+
this.reportReading(reading);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.Reporter = Reporter;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
export declare class ReporterConfig {
|
|
2
|
+
static loadLoggerReporterFromEnvironment(): {
|
|
3
|
+
logger?: undefined;
|
|
4
|
+
} | {
|
|
5
|
+
logger: {};
|
|
6
|
+
};
|
|
7
|
+
static loadMqttReporterFromEnvironment(): {
|
|
8
|
+
mqtt?: undefined;
|
|
9
|
+
} | {
|
|
10
|
+
mqtt: {
|
|
11
|
+
topic: string;
|
|
12
|
+
topics: any;
|
|
13
|
+
broker: string;
|
|
14
|
+
password: string;
|
|
15
|
+
user: string;
|
|
16
|
+
zoneName: string;
|
|
17
|
+
zoneDescription: string;
|
|
18
|
+
reportingInterval: number;
|
|
19
|
+
appName: string;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
static loadKafkaReporterFromEnvironment(): {
|
|
23
|
+
kafka?: undefined;
|
|
24
|
+
} | {
|
|
25
|
+
kafka: {
|
|
26
|
+
topic: string;
|
|
27
|
+
brokers: string[];
|
|
28
|
+
zoneName: string;
|
|
29
|
+
zoneDescription: string;
|
|
30
|
+
reportingInterval: number;
|
|
31
|
+
appName: string;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
static loadFromEnvironment(): {
|
|
35
|
+
mqtt?: undefined;
|
|
36
|
+
kafka?: undefined;
|
|
37
|
+
logger?: undefined;
|
|
38
|
+
} | {
|
|
39
|
+
mqtt: {
|
|
40
|
+
topic: string;
|
|
41
|
+
topics: any;
|
|
42
|
+
broker: string;
|
|
43
|
+
password: string;
|
|
44
|
+
user: string;
|
|
45
|
+
zoneName: string;
|
|
46
|
+
zoneDescription: string;
|
|
47
|
+
reportingInterval: number;
|
|
48
|
+
appName: string;
|
|
49
|
+
};
|
|
50
|
+
kafka?: undefined;
|
|
51
|
+
logger?: undefined;
|
|
52
|
+
} | {
|
|
53
|
+
mqtt?: undefined;
|
|
54
|
+
kafka: {
|
|
55
|
+
topic: string;
|
|
56
|
+
brokers: string[];
|
|
57
|
+
zoneName: string;
|
|
58
|
+
zoneDescription: string;
|
|
59
|
+
reportingInterval: number;
|
|
60
|
+
appName: string;
|
|
61
|
+
};
|
|
62
|
+
logger?: undefined;
|
|
63
|
+
} | {
|
|
64
|
+
mqtt: {
|
|
65
|
+
topic: string;
|
|
66
|
+
topics: any;
|
|
67
|
+
broker: string;
|
|
68
|
+
password: string;
|
|
69
|
+
user: string;
|
|
70
|
+
zoneName: string;
|
|
71
|
+
zoneDescription: string;
|
|
72
|
+
reportingInterval: number;
|
|
73
|
+
appName: string;
|
|
74
|
+
};
|
|
75
|
+
kafka: {
|
|
76
|
+
topic: string;
|
|
77
|
+
brokers: string[];
|
|
78
|
+
zoneName: string;
|
|
79
|
+
zoneDescription: string;
|
|
80
|
+
reportingInterval: number;
|
|
81
|
+
appName: string;
|
|
82
|
+
};
|
|
83
|
+
logger?: undefined;
|
|
84
|
+
} | {
|
|
85
|
+
mqtt?: undefined;
|
|
86
|
+
kafka?: undefined;
|
|
87
|
+
logger: {};
|
|
88
|
+
} | {
|
|
89
|
+
mqtt: {
|
|
90
|
+
topic: string;
|
|
91
|
+
topics: any;
|
|
92
|
+
broker: string;
|
|
93
|
+
password: string;
|
|
94
|
+
user: string;
|
|
95
|
+
zoneName: string;
|
|
96
|
+
zoneDescription: string;
|
|
97
|
+
reportingInterval: number;
|
|
98
|
+
appName: string;
|
|
99
|
+
};
|
|
100
|
+
kafka?: undefined;
|
|
101
|
+
logger: {};
|
|
102
|
+
} | {
|
|
103
|
+
mqtt?: undefined;
|
|
104
|
+
kafka: {
|
|
105
|
+
topic: string;
|
|
106
|
+
brokers: string[];
|
|
107
|
+
zoneName: string;
|
|
108
|
+
zoneDescription: string;
|
|
109
|
+
reportingInterval: number;
|
|
110
|
+
appName: string;
|
|
111
|
+
};
|
|
112
|
+
logger: {};
|
|
113
|
+
} | {
|
|
114
|
+
mqtt: {
|
|
115
|
+
topic: string;
|
|
116
|
+
topics: any;
|
|
117
|
+
broker: string;
|
|
118
|
+
password: string;
|
|
119
|
+
user: string;
|
|
120
|
+
zoneName: string;
|
|
121
|
+
zoneDescription: string;
|
|
122
|
+
reportingInterval: number;
|
|
123
|
+
appName: string;
|
|
124
|
+
};
|
|
125
|
+
kafka: {
|
|
126
|
+
topic: string;
|
|
127
|
+
brokers: string[];
|
|
128
|
+
zoneName: string;
|
|
129
|
+
zoneDescription: string;
|
|
130
|
+
reportingInterval: number;
|
|
131
|
+
appName: string;
|
|
132
|
+
};
|
|
133
|
+
logger: {};
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=ReporterConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReporterConfig.d.ts","sourceRoot":"","sources":["../../../src/reporter/ReporterConfig.ts"],"names":[],"mappings":"AAEA,qBAAa,cAAc;IACzB,MAAM,CAAC,iCAAiC;;;;;IASxC,MAAM,CAAC,+BAA+B;;;;;;;;;;;;;;;IAiDtC,MAAM,CAAC,gCAAgC;;;;;;;;;;;;IA+BvC,MAAM,CAAC,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAO3B"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ReporterConfig = void 0;
|
|
4
|
+
const constants_1 = require("../constants");
|
|
5
|
+
class ReporterConfig {
|
|
6
|
+
static loadLoggerReporterFromEnvironment() {
|
|
7
|
+
if (process.env.ENABLE_LOG_REPORTER !== 'true') {
|
|
8
|
+
return {};
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
logger: {},
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
static loadMqttReporterFromEnvironment() {
|
|
15
|
+
if (process.env.ENABLE_MQTT_REPORTER !== 'true') {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
const topic = process.env.MQTT_TOPIC;
|
|
19
|
+
const zoneName = process.env.ZONE_NAME;
|
|
20
|
+
const appName = process.env.APP_NAME;
|
|
21
|
+
const zoneDescription = process.env.ZONE_DESCRIPTION;
|
|
22
|
+
const broker = process.env.MQTT_BROKER;
|
|
23
|
+
const reportingInterval = Number.parseInt(process.env.MQTT_REPORTING_INTERVAL, 10);
|
|
24
|
+
let topics = undefined;
|
|
25
|
+
Object.entries(process.env).forEach(([key, value]) => {
|
|
26
|
+
var topicPrefix = 'MQTT_TOPIC_';
|
|
27
|
+
if (key && key.startsWith(topicPrefix)) {
|
|
28
|
+
if (!topics) {
|
|
29
|
+
topics = {};
|
|
30
|
+
}
|
|
31
|
+
let topic = key.substring(topicPrefix.length);
|
|
32
|
+
topics[topic] = value;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
if (!topic && !topics) {
|
|
36
|
+
console.error('topic required');
|
|
37
|
+
throw new Error('topic required');
|
|
38
|
+
}
|
|
39
|
+
if (!zoneName) {
|
|
40
|
+
console.error('zone required');
|
|
41
|
+
throw new Error('zoneName required');
|
|
42
|
+
}
|
|
43
|
+
if (!appName) {
|
|
44
|
+
console.error('app required');
|
|
45
|
+
throw new Error('appName required');
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
mqtt: {
|
|
49
|
+
topic,
|
|
50
|
+
topics,
|
|
51
|
+
broker,
|
|
52
|
+
password: process.env.MQTT_PASSWORD,
|
|
53
|
+
user: process.env.MQTT_USER,
|
|
54
|
+
zoneName,
|
|
55
|
+
zoneDescription,
|
|
56
|
+
reportingInterval: !Number.isNaN(reportingInterval) ? reportingInterval : constants_1.Timing.FIVE_MIN,
|
|
57
|
+
appName,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
static loadKafkaReporterFromEnvironment() {
|
|
62
|
+
if (process.env.ENABLE_KAFKA_REPORTER !== 'true') {
|
|
63
|
+
return {};
|
|
64
|
+
}
|
|
65
|
+
const topic = process.env.KAFKA_TOPIC;
|
|
66
|
+
const zoneName = process.env.ZONE_NAME;
|
|
67
|
+
const appName = process.env.APP_NAME;
|
|
68
|
+
const zoneDescription = process.env.ZONE_DESCRIPTION;
|
|
69
|
+
const brokers = process.env.KAFKA_BROKERS.split(',');
|
|
70
|
+
const reportingInterval = Number.parseInt(process.env.KAFKA_REPORTING_INTERVAL, 10);
|
|
71
|
+
if (!topic) {
|
|
72
|
+
throw new Error('topic required');
|
|
73
|
+
}
|
|
74
|
+
if (!zoneName) {
|
|
75
|
+
throw new Error('zoneName required');
|
|
76
|
+
}
|
|
77
|
+
if (!appName) {
|
|
78
|
+
throw new Error('appName required');
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
kafka: {
|
|
82
|
+
topic,
|
|
83
|
+
brokers,
|
|
84
|
+
zoneName,
|
|
85
|
+
zoneDescription,
|
|
86
|
+
reportingInterval: !Number.isNaN(reportingInterval) ? reportingInterval : constants_1.Timing.FIVE_MIN,
|
|
87
|
+
appName,
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
static loadFromEnvironment() {
|
|
92
|
+
return {
|
|
93
|
+
...ReporterConfig.loadLoggerReporterFromEnvironment(),
|
|
94
|
+
...ReporterConfig.loadKafkaReporterFromEnvironment(),
|
|
95
|
+
...ReporterConfig.loadMqttReporterFromEnvironment(),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.ReporterConfig = ReporterConfig;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Reporter } from './Reporter';
|
|
2
|
+
export type ReporterType = {
|
|
3
|
+
new (config: any, env: any): Reporter;
|
|
4
|
+
};
|
|
5
|
+
export declare class ReporterFactory {
|
|
6
|
+
config: any;
|
|
7
|
+
env: {
|
|
8
|
+
[x: string]: string;
|
|
9
|
+
};
|
|
10
|
+
constructor(config: any, env: any);
|
|
11
|
+
static fromEnvironment(): ReporterFactory;
|
|
12
|
+
constructReporters(): Promise<Reporter[]>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=ReporterFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReporterFactory.d.ts","sourceRoot":"","sources":["../../../src/reporter/ReporterFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQtC,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,QAAQ,CAAA;CAAE,CAAC;AASrE,qBAAa,eAAe;IAC1B,MAAM,EAAE,GAAG,CAAC;IACZ,GAAG,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;gBACjB,MAAM,KAAA,EAAE,GAAG,KAAA;IAKvB,MAAM,CAAC,eAAe,IAAI,eAAe;IAInC,kBAAkB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;CAuBhD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.ReporterFactory = void 0;
|
|
27
|
+
const DatabaseReporter_1 = require("./DatabaseReporter");
|
|
28
|
+
const CurrentStatusReporter_1 = require("./CurrentStatusReporter");
|
|
29
|
+
const LoggerReporter_1 = require("./LoggerReporter");
|
|
30
|
+
const KafkaReporter_1 = require("./KafkaReporter");
|
|
31
|
+
const MQTTReporter_1 = require("./MQTTReporter");
|
|
32
|
+
const ReporterConfig_1 = require("./ReporterConfig");
|
|
33
|
+
const registeredReporters = {
|
|
34
|
+
database: DatabaseReporter_1.DatabaseReporter,
|
|
35
|
+
currentStatus: CurrentStatusReporter_1.CurrentStatusReporter,
|
|
36
|
+
kafka: KafkaReporter_1.KafkaReporter,
|
|
37
|
+
logger: LoggerReporter_1.LoggerReporter,
|
|
38
|
+
mqtt: MQTTReporter_1.MqttReporter,
|
|
39
|
+
};
|
|
40
|
+
class ReporterFactory {
|
|
41
|
+
constructor(config, env) {
|
|
42
|
+
this.config = config;
|
|
43
|
+
this.env = env;
|
|
44
|
+
}
|
|
45
|
+
static fromEnvironment() {
|
|
46
|
+
return new ReporterFactory(ReporterConfig_1.ReporterConfig.loadFromEnvironment(), {});
|
|
47
|
+
}
|
|
48
|
+
async constructReporters() {
|
|
49
|
+
const reporterNames = Object.keys(this.config || []);
|
|
50
|
+
const reporters = [];
|
|
51
|
+
for (var reporter of reporterNames) {
|
|
52
|
+
let ReporterClass = registeredReporters[reporter];
|
|
53
|
+
const config = this.config[reporter];
|
|
54
|
+
if (ReporterClass) {
|
|
55
|
+
var reporterObj = new ReporterClass(config, this.env);
|
|
56
|
+
await reporterObj.init();
|
|
57
|
+
reporters.push(reporterObj);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
try {
|
|
61
|
+
ReporterClass = await Promise.resolve(`${reporter}`).then(s => __importStar(require(s))); // eslint-disable-line global-require, import/no-dynamic-require
|
|
62
|
+
var reporterObj = new ReporterClass(config, this.env);
|
|
63
|
+
await reporterObj.init();
|
|
64
|
+
reporters.push(reporterObj);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
console.warn(`Unknown Reporter: ${reporter}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return reporters;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.ReporterFactory = ReporterFactory;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultFormatter.d.ts","sourceRoot":"","sources":["../../../../src/reporter/formatter/DefaultFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,qBAAa,SAAS;IACpB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO;IAIzC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM;CAGtC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Formatter = void 0;
|
|
4
|
+
class Formatter {
|
|
5
|
+
appliesTo(reading) {
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
format(reading) {
|
|
9
|
+
return `${reading.type}: ${reading.reading.toDisplayString(2)}`;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.Formatter = Formatter;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Formatter } from './DefaultFormatter';
|
|
2
|
+
export interface FormatterConfig {
|
|
3
|
+
}
|
|
4
|
+
export declare class FormatterFactory {
|
|
5
|
+
config: FormatterConfig;
|
|
6
|
+
constructor(config: FormatterConfig);
|
|
7
|
+
constructFormatters(): Promise<Formatter[]>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=FormatterFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormatterFactory.d.ts","sourceRoot":"","sources":["../../../../src/reporter/formatter/FormatterFactory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQ/C,MAAM,WAAW,eAAe;CAAG;AAEnC,qBAAa,gBAAgB;IAC3B,MAAM,EAAE,eAAe,CAAC;gBACZ,MAAM,EAAE,eAAe;IAI7B,mBAAmB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;CAmBlD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.FormatterFactory = void 0;
|
|
27
|
+
const TemperatureFormatter_1 = require("./TemperatureFormatter");
|
|
28
|
+
const HumidityFormatter_1 = require("./HumidityFormatter");
|
|
29
|
+
const registeredFormatters = {
|
|
30
|
+
temperature: TemperatureFormatter_1.TemperatureFormatter,
|
|
31
|
+
humidity: HumidityFormatter_1.HumidityFormatter,
|
|
32
|
+
};
|
|
33
|
+
class FormatterFactory {
|
|
34
|
+
constructor(config) {
|
|
35
|
+
this.config = config;
|
|
36
|
+
}
|
|
37
|
+
async constructFormatters() {
|
|
38
|
+
const formatterNames = Object.keys(this.config);
|
|
39
|
+
const formatters = [];
|
|
40
|
+
for (var formatter of formatterNames) {
|
|
41
|
+
let FormatterClass = registeredFormatters[formatter];
|
|
42
|
+
const config = this.config[formatter];
|
|
43
|
+
if (FormatterClass) {
|
|
44
|
+
formatters.push(new FormatterClass(config));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
try {
|
|
48
|
+
FormatterClass = await Promise.resolve(`${formatter}`).then(s => __importStar(require(s))); // eslint-disable-line global-require, import/no-dynamic-require
|
|
49
|
+
formatters.push(new FormatterClass());
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
console.warn(`Unknown Formatter: ${formatter}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return formatters;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.FormatterFactory = FormatterFactory;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Formatter } from './DefaultFormatter';
|
|
2
|
+
import { Reading } from '../../models';
|
|
3
|
+
export declare class HumidityFormatter extends Formatter {
|
|
4
|
+
appliesTo(reading: Reading<any>): boolean;
|
|
5
|
+
format(reading: Reading<any>): string;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=HumidityFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HumidityFormatter.d.ts","sourceRoot":"","sources":["../../../../src/reporter/formatter/HumidityFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO;IAIzC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM;CAGtC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HumidityFormatter = void 0;
|
|
4
|
+
const DefaultFormatter_1 = require("./DefaultFormatter");
|
|
5
|
+
const constants_1 = require("../../constants");
|
|
6
|
+
class HumidityFormatter extends DefaultFormatter_1.Formatter {
|
|
7
|
+
appliesTo(reading) {
|
|
8
|
+
return reading.type === constants_1.ReadingTypes.HUMIDITY;
|
|
9
|
+
}
|
|
10
|
+
format(reading) {
|
|
11
|
+
return `Humidity: ${reading.reading.toDisplayString(2)}`;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.HumidityFormatter = HumidityFormatter;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Formatter } from './DefaultFormatter';
|
|
2
|
+
import { Reading, Temperature, Unit } from '../../models';
|
|
3
|
+
export interface TemperatureFormatterConfig {
|
|
4
|
+
unit?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class TemperatureFormatter extends Formatter {
|
|
7
|
+
unit?: Unit<Temperature>;
|
|
8
|
+
constructor(config: TemperatureFormatterConfig);
|
|
9
|
+
appliesTo(reading: Reading<any>): boolean;
|
|
10
|
+
format(reading: Reading<any>): string;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=TemperatureFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemperatureFormatter.d.ts","sourceRoot":"","sources":["../../../../src/reporter/formatter/TemperatureFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAmB,IAAI,EAAE,MAAM,cAAc,CAAC;AAE3E,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,oBAAqB,SAAQ,SAAS;IACjD,IAAI,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBACb,MAAM,EAAE,0BAA0B;IAK9C,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;IAI/B,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;CAI7B"}
|