NEWS
Dummy-Mailserver für Kamera-Bewegungserkennung
-
In der Facebook-Gruppe ist eine Frage aufgetaucht, wie man die die Bewegungserkennung von Reolink-Kameras nach ioBroker bringt. Ich hab dazu einen Dummy-Mailserver im Einsatz. Die Reolink Kameras können nämlich bei Bewegungserkennung eine Mail versenden.
Achtung: Es ist TypeScript!
In meinem originalen Scripts ist noch etwas mehr drinnen - ich hab das rausgelöscht und die Einstellungen geändert.
// Doku über smtp-server: // https://nodemailer.com/extras/smtp-server/ const logOn = true; const smtpPort = 26; const emailUserName = 'mail@myhome.com'; const emailPassword = 'abc123'; const sessionUserName = 'myname'; const smptServer = require("smtp-server").SMTPServer; const server = new smptServer({ size: 4096, // allow messages up to 4 kb onConnect(session: any, callback: any) { if(logOn) log(`onConnect Remote Address: ${session.remoteAddress}`); // keine externen Connections erlauben: //if (!session.remoteAddress.startsWith("192.168.1.")) { // return callback(new Error("No remote connections allowed!")); //} return callback(); // Accept the connection }, onAuth(auth: any, session: any, callback: any) { if(logOn) log(`onAuth username: ${auth.username}, password: ${auth.password}`); if (auth.username !== emailUserName || auth.password !== emailPassword) { return callback(new Error("Invalid username or password")); } callback(null, { user: sessionUserName}); }, maxClients: 5, closeTimeout: 0, onData: receiveMail }); server.on("error", (err: any) => { log(`on Error: ${err.message}`, 'error'); }); server.listen(smtpPort, null, () => { if(logOn) log(`Started listening on port ${smtpPort}.`); }); onStop ((callback: any) => { server.close(() => { if(logOn) log(`SMTP server closed`); }); callback(); }); async function receiveMail(stream: any, session: any, callback: any) { //stream.pipe(process.stdout); // print message to console if(logOn) log(`Received: ${JSON.stringify(session)}`); const mailFrom = session?.envelope?.mailFrom?.address; const mailTo = session?.envelope?.rcptTo[0]?.address; const remoteAddress = session.remoteAddress; // z.B. State setzen: if(mailTo == 'kamera1@myhome.com' || mailTo == 'kamera2@myhome.com') { setState('0_userdata.0.kamera.bewegung', 1, true); } // oder abhängig von Kamera: if(mailTo == 'kamera1@myhome.com') { setState('0_userdata.0.kamera.bewegung', 'kamera1', true); } else if (mailTo == 'kamera2@myhome.com') { setState('0_userdata.0.kamera.bewegung', 'kamera2', true); } //var chunks = []; stream.on('data', (chunk: any) => { // const chungJson = JSON.stringify(chunk); // if(logOn) log(`Received: ${chungJson}`); // chunks.push(chunk); }); // stream.on('end', () => { // if(logOn) log(`Stream End`); // let buffer = Buffer.concat(chunks); // if(logOn) log(buffer.toString()); // }); stream.on('end', callback) //callback(null, "Message queued"); } if(logOn) log('Started');
Reolink Settings:
192.168.1.10 ist bei mir die IP der ioBroker-Installation wo also auch der Dummy-Mailserver läufgt.
Dort wo
// z.B. State setzen:
steht, gelangt das Script, wenn eine Bewegung erkannt wird. Hier kann man also z.B. einen State setzten etc.