Aggiunge 2 nuove variabili d'ambiente:
- SIGNALK_FILES, per specificare dove verranno salvati i file generati dal plugin - HOST_NAME, per specificare il nome del dispositivo che sta hostando il plugin. Inoltre, migliora il codice e lo adatta al nuovo path variabile SIGNALK_FILES
This commit is contained in:
44
README.md
44
README.md
@@ -1,2 +1,46 @@
|
|||||||
In questa repository è presente il plugin MEB per SignalK.
|
In questa repository è presente il plugin MEB per SignalK.
|
||||||
Ulteriori informazioni verranno aggiunte nelle prossime versioni
|
Ulteriori informazioni verranno aggiunte nelle prossime versioni
|
||||||
|
|
||||||
|
|
||||||
|
# Variabili d'Ambiente
|
||||||
|
Prima di avviare il plugin sul SignalK, è necessario configurare il file di variabili d'ambiente.
|
||||||
|
|
||||||
|
**Ricorda**:
|
||||||
|
Inserisci i valori di chiavi, percorsi di file o altro subito dopo il simbolo di uguale, senza parentesi, virgolette o altro
|
||||||
|
|
||||||
|
_Una volta creato il file env, aggiungi:_
|
||||||
|
|
||||||
|
### Chiave di Criptazione
|
||||||
|
Utilizzata per criptare i dati come i riferimenti dei log, i file di log registrati o gli utenti admin.
|
||||||
|
|
||||||
|
|
||||||
|
Aggiungi nel file env una riga come questa:
|
||||||
|
|
||||||
|
|
||||||
|
CRYPTOKEY=
|
||||||
|
|
||||||
|
|
||||||
|
### Nome dell'Host
|
||||||
|
Usato per identificare meglio, sopratutto nei casi di test temporanei, il dispositivo in cui il server SignalK è attivo.
|
||||||
|
|
||||||
|
Aggiungi nel file env una riga come questa:
|
||||||
|
|
||||||
|
HOST_NAME=
|
||||||
|
|
||||||
|
|
||||||
|
### Token Telegram
|
||||||
|
Il plugin anima un Bot Telegram. Per ragioni di sicurezza, il token che è l'identificativo del bot deve essere protetto e salvato all'interno delle variabili d'ambiente.
|
||||||
|
|
||||||
|
|
||||||
|
Aggiungi nel file env una riga come questa:
|
||||||
|
|
||||||
|
TELEGRAM_BOT_TOKEN=
|
||||||
|
|
||||||
|
|
||||||
|
### Percorso dei file
|
||||||
|
Il plugin genera file all'interno del server SignalK, come i log o file criptati. Specifica il percorso globale all'interno del tuo dispositivo nel quale vuoi che il plugin inserisca e modifichi i dati generati.
|
||||||
|
|
||||||
|
|
||||||
|
Aggiungi nel file env una riga come questa:
|
||||||
|
|
||||||
|
SIGNALK_FILES=
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
const fs = require("fs");
|
const fs = require("fs");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
|
const { paths } = require("../config.js");
|
||||||
const {
|
const {
|
||||||
encrypt,
|
encrypt,
|
||||||
decrypt,
|
decrypt,
|
||||||
@@ -64,9 +65,9 @@ const CONFIG = {
|
|||||||
fileExpirationTime: 10
|
fileExpirationTime: 10
|
||||||
};
|
};
|
||||||
|
|
||||||
const telegram_users_file = path.join(__dirname, "..", "telegram_users.json");
|
const telegram_users_file = paths.telegramUsers;
|
||||||
const logs_references_file = path.join(__dirname, "..", "datasetModels/logs_references.json");
|
const logs_references_file = paths.logsReferences;
|
||||||
const authorized_admins_file = path.join(__dirname, "..", "authorized_admins.txt");
|
const authorized_admins_file = paths.authorizedAdmins;
|
||||||
|
|
||||||
let app = null;
|
let app = null;
|
||||||
|
|
||||||
@@ -287,13 +288,24 @@ function getCurrentPosition() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function send(message) {
|
async function send(message) {
|
||||||
if (!bot) return;
|
if (!bot) {
|
||||||
|
console.warn('[Telegram] send() chiamato ma bot non inizializzato');
|
||||||
|
return;
|
||||||
|
}
|
||||||
const users = loadUsers();
|
const users = loadUsers();
|
||||||
const loggedUsers = users.filter(u => u.hasLoggedYet && u.chatID);
|
const loggedUsers = users.filter(u => u.hasLoggedYet && u.chatID);
|
||||||
|
|
||||||
|
console.log(`[Telegram] send() - Utenti totali: ${users.length}, Utenti loggati: ${loggedUsers.length}`);
|
||||||
|
|
||||||
|
if (loggedUsers.length === 0) {
|
||||||
|
console.warn('[Telegram] Nessun utente loggato a cui inviare il messaggio');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (const user of loggedUsers) {
|
for (const user of loggedUsers) {
|
||||||
try {
|
try {
|
||||||
await bot.sendMessage(user.chatID, message);
|
await bot.sendMessage(user.chatID, message);
|
||||||
|
console.log(`[Telegram] Messaggio inviato a ${user.chatID}`);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`[Telegram] Send error to ${user.chatID}:`, error.message);
|
console.error(`[Telegram] Send error to ${user.chatID}:`, error.message);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,46 @@
|
|||||||
const dotenv = require("dotenv");
|
const dotenv = require("dotenv");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
|
const fs = require("fs");
|
||||||
|
|
||||||
// Carica il file .env dalla root del plugin
|
// Carica il file .env dalla root del plugin
|
||||||
dotenv.config({ path: path.resolve(__dirname, "..", ".env"), quiet: true });
|
dotenv.config({ path: path.resolve(__dirname, "..", ".env"), quiet: true });
|
||||||
|
|
||||||
const config = {
|
// Base path per tutti i file generati dal server
|
||||||
telegramBotToken: process.env.TELEGRAM_BOT_TOKEN,
|
const SIGNALK_FILES = process.env.SIGNALK_FILES || path.resolve(__dirname, "..", "data");
|
||||||
|
|
||||||
|
// Crea le directory necessarie se non esistono
|
||||||
|
function ensureDir(dirPath) {
|
||||||
|
if (!fs.existsSync(dirPath)) {
|
||||||
|
fs.mkdirSync(dirPath, { recursive: true });
|
||||||
|
console.log(`[Config] Creata directory: ${dirPath}`);
|
||||||
|
}
|
||||||
|
return dirPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Paths per i vari tipi di file
|
||||||
|
const paths = {
|
||||||
|
// Base
|
||||||
|
base: SIGNALK_FILES,
|
||||||
|
|
||||||
|
// Logs: hourly_archive.json, logs_references.json, saved_datas/
|
||||||
|
logs: ensureDir(path.join(SIGNALK_FILES, "logs")),
|
||||||
|
hourlyArchive: path.join(SIGNALK_FILES, "logs", "hourly_archive.json"),
|
||||||
|
logsReferences: path.join(SIGNALK_FILES, "logs", "logs_references.json"),
|
||||||
|
savedDatas: ensureDir(path.join(SIGNALK_FILES, "logs", "saved_datas")),
|
||||||
|
|
||||||
|
// Private: authorized_admins.txt, telegram_users.json
|
||||||
|
private: ensureDir(path.join(SIGNALK_FILES, "private")),
|
||||||
|
authorizedAdmins: path.join(SIGNALK_FILES, "private", "authorized_admins.txt"),
|
||||||
|
telegramUsers: path.join(SIGNALK_FILES, "private", "telegram_users.json"),
|
||||||
|
|
||||||
|
// Sensors: sensors.references.json
|
||||||
|
sensors: ensureDir(path.join(SIGNALK_FILES, "sensors")),
|
||||||
|
sensorsReferences: path.join(SIGNALK_FILES, "sensors", "sensors.references.json")
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = { config };
|
const config = {
|
||||||
|
telegramBotToken: process.env.TELEGRAM_BOT_TOKEN,
|
||||||
|
paths
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = { config, paths };
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
const { paths } = require('../config.js');
|
||||||
|
|
||||||
const ARCHIVE_FILE = path.join(__dirname, 'hourly_archive.json');
|
const ARCHIVE_FILE = paths.hourlyArchive;
|
||||||
|
|
||||||
// Cache dati OpenMeteo condivisi (evita chiamate duplicate)
|
// Cache dati OpenMeteo condivisi (evita chiamate duplicate)
|
||||||
let sharedWeatherData = {
|
let sharedWeatherData = {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
const { config } = require("./config.js");
|
const { config, paths } = require("./config.js");
|
||||||
const { setupRoutes, getOpenApiSpec } = require("./tools/routes.js");
|
const { setupRoutes, getOpenApiSpec } = require("./tools/routes.js");
|
||||||
const { aisStream } = require("./api_models/aisstream.js")
|
const { aisStream } = require("./api_models/aisstream.js")
|
||||||
const mapHandler = require("./tools/map.handler.js");
|
const mapHandler = require("./tools/map.handler.js");
|
||||||
@@ -81,8 +81,8 @@ const state = {
|
|||||||
startTime: null
|
startTime: null
|
||||||
};
|
};
|
||||||
|
|
||||||
const logsDirectory = dataUtils.getDirectory(__dirname + '/datasetModels/saved_datas');
|
const logsDirectory = dataUtils.getDirectory(paths.savedDatas);
|
||||||
const logsReferencesFile = path.join(__dirname, 'datasetModels/logs_references.json');
|
const logsReferencesFile = paths.logsReferences;
|
||||||
const lastCallRef = { current: null };
|
const lastCallRef = { current: null };
|
||||||
|
|
||||||
|
|
||||||
@@ -506,7 +506,8 @@ module.exports = function (app) {
|
|||||||
if (config.telegramBotToken) {
|
if (config.telegramBotToken) {
|
||||||
try {
|
try {
|
||||||
await linkBot(app);
|
await linkBot(app);
|
||||||
await send("✅ Computer di bordo attivo e pronto.");
|
let deviceName = process.env.HOST_NAME || 'Dispositivo Sconosciuto';
|
||||||
|
await send(`Il bot è di nuovo disponibile. (Avviato da ${deviceName})`);
|
||||||
console.log('[MEB TELEGRAM] Bot avviato con app.intervalControl disponibile');
|
console.log('[MEB TELEGRAM] Bot avviato con app.intervalControl disponibile');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('[ERROR] Errore nell\'avvio del bot telegram', error);
|
console.error('[ERROR] Errore nell\'avvio del bot telegram', error);
|
||||||
|
|||||||
@@ -1,68 +0,0 @@
|
|||||||
{
|
|
||||||
"production": [
|
|
||||||
{
|
|
||||||
"collection": "temperature",
|
|
||||||
"main_path": "meb.temperature",
|
|
||||||
"elements": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"collection": "wind",
|
|
||||||
"main_path": "meb.wind",
|
|
||||||
"elements": [
|
|
||||||
{"direction": "direction"},
|
|
||||||
{"speed": "speed"}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"collection": "waves",
|
|
||||||
"main_path": "meb.waves",
|
|
||||||
"elements": [
|
|
||||||
{"direction": "direction"},
|
|
||||||
{"height": "height"},
|
|
||||||
{"period": "period"}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"collection": "position",
|
|
||||||
"main_path": "navigation",
|
|
||||||
"elements": [
|
|
||||||
{"latitude": "position.latitude"},
|
|
||||||
{"longitude": "position.longitude"},
|
|
||||||
{"headingTrue": "headingTrue"},
|
|
||||||
{"speedOverGround": "speedOverGround"},
|
|
||||||
{"courseOverGround": "courseOverGroundTrue"}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"collection": "service_battery",
|
|
||||||
"main_path": "electrical.batteries.service",
|
|
||||||
"elements": [
|
|
||||||
{"voltage": "Voltage"},
|
|
||||||
{"current": "current"},
|
|
||||||
{"stateOfCharge": "stateOfCharge"}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"collection": "traction_battery",
|
|
||||||
"main_path": "electrical.batteries.traction",
|
|
||||||
"elements": [
|
|
||||||
{"voltage": "Voltage"},
|
|
||||||
{"current": "current"},
|
|
||||||
{"stateOfCharge": "stateOfCharge"},
|
|
||||||
{"temperature": "temperature"},
|
|
||||||
{"power": "power"}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"collection": "engine",
|
|
||||||
"main_path": "propulsion.0",
|
|
||||||
"elements": [
|
|
||||||
{"proipultionShaftSpeed": "revolutions"}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"collection": "system",
|
|
||||||
"main_path": "system.uptime"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user