feat: Implement Tapo P110/P115 power and energy monitoring, add Tapo device testing utilities, and include a database upsert test.

This commit is contained in:
sebseb7
2026-01-22 01:17:46 -05:00
parent 22050d1350
commit d093e18877
5 changed files with 279 additions and 12 deletions

63
test_db_upsert.js Normal file
View File

@@ -0,0 +1,63 @@
import sqlite3 from 'sqlite3';
const db = new sqlite3.Database(':memory:');
db.serialize(() => {
db.run("CREATE TABLE devices (mac TEXT PRIMARY KEY, model TEXT, connected INTEGER, last_seen TEXT)");
});
const upsertSql = `
INSERT INTO devices (mac, model, connected, last_seen)
VALUES (?, ?, ?, ?)
ON CONFLICT(mac) DO UPDATE SET
model = excluded.model,
connected = COALESCE(excluded.connected, devices.connected),
last_seen = excluded.last_seen
`;
console.log("Starting sequential tests...");
// Test 1: Insert initial online device
db.run(upsertSql, ['AA:BB:CC', 'T110', 1, '2023-01-01T12:00:00Z'], (err) => {
if (err) console.error(err);
checkDevice('Test 1 (Init Online)', 'AA:BB:CC', 1, () => {
// Test 2: Update with NULL status
db.run(upsertSql, ['AA:BB:CC', 'T110', null, '2023-01-01T12:05:00Z'], (err) => {
if (err) console.error(err);
checkDevice('Test 2 (Sensor Event/Null)', 'AA:BB:CC', 1, () => {
// Test 3: Update with offline status
db.run(upsertSql, ['AA:BB:CC', 'T110', 0, '2023-01-01T12:10:00Z'], (err) => {
if (err) console.error(err);
checkDevice('Test 3 (Offline/0)', 'AA:BB:CC', 0, () => {
// Test 4: Update with NULL status while offline
db.run(upsertSql, ['AA:BB:CC', 'T110', null, '2023-01-01T12:15:00Z'], (err) => {
if (err) console.error(err);
checkDevice('Test 4 (Sensor Event while Offline)', 'AA:BB:CC', 0, () => {
// Test 5: Back online
db.run(upsertSql, ['AA:BB:CC', 'T110', 1, '2023-01-01T12:20:00Z'], (err) => {
if (err) console.error(err);
checkDevice('Test 5 (Online again)', 'AA:BB:CC', 1, () => {
console.log("All tests completed.");
});
});
});
});
});
});
});
});
});
});
function checkDevice(testName, mac, expectedConnected, callback) {
db.get("SELECT * FROM devices WHERE mac = ?", [mac], (err, row) => {
if (err) console.error("DB Error:", err);
const status = row.connected === expectedConnected ? 'PASS' : 'FAIL';
console.log(`${testName}: connected=${row.connected} (Expected: ${expectedConnected}) -> ${status}`);
if (callback) callback();
});
}