collect and show mqtt state for nodes
This commit is contained in:
@ -0,0 +1,3 @@
|
|||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE `nodes` ADD COLUMN `mqtt_connection_state` VARCHAR(191) NULL,
|
||||||
|
ADD COLUMN `mqtt_connection_state_updated_at` DATETIME(3) NULL;
|
@ -36,6 +36,9 @@ model Node {
|
|||||||
neighbours Json?
|
neighbours Json?
|
||||||
neighbours_updated_at DateTime?
|
neighbours_updated_at DateTime?
|
||||||
|
|
||||||
|
mqtt_connection_state String?
|
||||||
|
mqtt_connection_state_updated_at DateTime?
|
||||||
|
|
||||||
created_at DateTime @default(now())
|
created_at DateTime @default(now())
|
||||||
updated_at DateTime @default(now()) @updatedAt
|
updated_at DateTime @default(now()) @updatedAt
|
||||||
|
|
||||||
|
30
src/mqtt.js
30
src/mqtt.js
@ -225,6 +225,36 @@ client.on("connect", () => {
|
|||||||
client.on("message", async (topic, message) => {
|
client.on("message", async (topic, message) => {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
// handle node status
|
||||||
|
if(topic.includes("/stat/!")){
|
||||||
|
try {
|
||||||
|
|
||||||
|
// get node id and status
|
||||||
|
const nodeIdHex = topic.split("/").pop();
|
||||||
|
const mqttConnectionState = message.toString();
|
||||||
|
|
||||||
|
// convert node id hex to int value
|
||||||
|
const nodeId = BigInt('0x' + nodeIdHex.replaceAll("!", ""));
|
||||||
|
|
||||||
|
// update mqtt connection state for node
|
||||||
|
await prisma.node.updateMany({
|
||||||
|
where: {
|
||||||
|
node_id: nodeId,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
mqtt_connection_state: mqttConnectionState,
|
||||||
|
mqtt_connection_state_updated_at: new Date(),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// no need to continue with this mqtt message
|
||||||
|
return;
|
||||||
|
|
||||||
|
} catch(e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// decode service envelope
|
// decode service envelope
|
||||||
const envelope = ServiceEnvelope.decode(message);
|
const envelope = ServiceEnvelope.decode(message);
|
||||||
if(!envelope.packet){
|
if(!envelope.packet){
|
||||||
|
@ -2175,9 +2175,19 @@
|
|||||||
|
|
||||||
function getTooltipContentForNode(node) {
|
function getTooltipContentForNode(node) {
|
||||||
|
|
||||||
|
// human friendly connection state
|
||||||
|
var mqttStatus = "???";
|
||||||
|
var mqttStatusLastUpdated = node.mqtt_connection_state_updated_at ? `(${moment(new Date(node.mqtt_connection_state_updated_at)).fromNow()})` : "";
|
||||||
|
if(node.mqtt_connection_state === "online"){
|
||||||
|
mqttStatus = `<span class="text-green-700">Online</span> ${mqttStatusLastUpdated}`;
|
||||||
|
} else if(node.mqtt_connection_state === "offline"){
|
||||||
|
mqttStatus = `<span class="text-red-700">Offline</span> ${mqttStatusLastUpdated}`;
|
||||||
|
}
|
||||||
|
|
||||||
var tooltip = `<img class="mb-4 w-40 mx-auto" src="/images/devices/${node.hardware_model_name}.png" onerror="this.classList.add('hidden')"/>` +
|
var tooltip = `<img class="mb-4 w-40 mx-auto" src="/images/devices/${node.hardware_model_name}.png" onerror="this.classList.add('hidden')"/>` +
|
||||||
`<b>${node.long_name}</b>` +
|
`<b>${node.long_name}</b>` +
|
||||||
`<br/>Short Name: ${node.short_name}` +
|
`<br/>Short Name: ${node.short_name}` +
|
||||||
|
`<br/>MQTT Status: ${mqttStatus}` +
|
||||||
`<br/><br/>Role: ${node.role_name}` +
|
`<br/><br/>Role: ${node.role_name}` +
|
||||||
`<br/>Hardware: ${node.hardware_model_name}`;
|
`<br/>Hardware: ${node.hardware_model_name}`;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user