Detecção de movimento com SMTP

Olá pessoal!

Vim compartilhar com vocês a solução que encontrei para ativar detecção de movimento na minha camera de segurança da marca Intelbras (VIP 1430 B G2), sem utillizar recursos da máquina que está rodando o Home Assistant, seja via MotionEye, ou qualquer outro software, espero que acabe ajudando alguém por aqui, ou traga outras ideias :slight_smile:

Então, a camera pode enviar alertas de detecção de movimento via SMTP (email), e a url do servidor, precisamos definir nela, então, criei um servidor de SMPT, que roda dentro de um container docker (sobe junto com o compose do esphome e do home assistant), esse servidor então recebe os “emails”, e chama uma URL de webhook do home assistant que pode triggar quaisquer automações que desejar

Segue o código do servidor de SMTP que está rodando no docker:

const { SMTPServer } = require("smtp-server");
const parse = require("parse-email");
const axios = require("axios");

const server = new SMTPServer({
  secure: false,
  allowInsecureAuth: true,

  onConnect(session, callback) {
    callback(null, true);
  },

  onMailFrom(address, session, callback) {
    callback(null, true);
  },

  onRcptTo(address, session, callback) {
    callback(null, true);
  },

  onAuth(a, s, callback) {
    callback(null, { user: {} });
  },

  onData(stream, session, callback) {
    const chunks = [];
    stream.on("data", function (chunk) {
      chunks.push(chunk);
    });

    stream.on("end", async () => {
      console.log("MOVEMENT DETECTED!!!");
      const emailString = Buffer.concat(chunks).toString("utf-8");

      const email = await parse(emailString);

      const base = email.attachments[0]?.content.toString("base64");
      const fs = require("fs");

      if (base) {
        fs.writeFileSync(`/media/movement.jpg`, base, "base64");
        await axios.post("http://localhost:8123/api/webhook/motion-detected", {
          cam: email.subject,
        });
      }

      callback(null, {});
    });
  },
});

server.listen(8124, undefined, () => console.log("Listening..."));

A pasta /media é um volume em comum para os 2 containers, então consigo enviar essa foto via push notification usando o home assistant

Ele está meio bagunçado e confuso pois fiz de uma maneira rápida apenas como PoC para validar o conceito, ainda tenho muito para melhorar, e fico com uma duvida, se alguem puder ajudar
Existe maneira de salvar a foto pelo home assistant se eu mandar um base64 na payload do webhook? Gostaria disso pois provavelmente vou ter um modo sentinela, e nao precisaria salvar a foto se estiver desativado.

4 curtidas