Real-time PM2.5 via WebSocket — PSRU Workshop, 28 ก.พ. 2569
const client = mqtt.connect('wss://dustboy-wss-bridge.laris.workers.dev/mqtt');
client.on('connect', () => {
console.log('Connected!');
client.subscribe('DUSTBOY/+/+/+/status');
});
client.on('error', (e) => console.log('Error:', e));
client.on('offline', () => console.log('Offline'));
client.on('message', (topic, message) => {
const raw = message.toString();
console.log(topic, raw);
});
function parse(topic, raw) {
const obj = JSON.parse(raw);
const parts = topic.split('/');
const isModelT = parts[1] === 'Model-T';
let pm25, pm10, temp, humid, name;
if (isModelT) {
pm25 = obj.pm2_5; pm10 = obj.pm10;
temp = obj.temp; humid = obj.humid;
name = obj.nickname || parts[2];
} else {
const d = obj.d || obj;
pm25 = d.pm2_5; pm10 = d.pm10;
temp = d.temperature_c; humid = d.humidity_rh;
name = d.myName || parts[3];
}
return { name, pm25, pm10, temp, humid };
}
function pmColor(pm25) {
if (pm25 <= 25) return '#3fb950';
if (pm25 <= 50) return '#fbbf24';
if (pm25 <= 100) return '#f87171';
return '#c084fc';
}
function updateCard(sensor) {
const card = document.getElementById('card-' + sensor.id);
}