immi2mpeg bringt das Livebild von Blink-Kameras in den Browser. Blink überträgt den Livestream über ein eigenes Binärprotokoll (IMMI), das kein Browser direkt abspielen kann. Der Dienst baut die Verbindung zum Blink-Server auf, wandelt den empfangenen MPEG-TS-Strom mit ffmpeg in fragmentiertes MP4 um und reicht die Daten per WebSocket weiter. Im Browser spielt ein <video>-Element sie über die Media Source Extensions ab.
immi2mpeg ist eine Node.js-Portierung von livestream.py aus blinkpy und bietet dieselbe WebSocket-Schnittstelle wie die blink-liveview-middleware .
So funktioniert’s
Browser / Client
│ WebSocket ws://host:8090
▼
immi2mpeg
├─ BlinkApi startet die Liveansicht über die Blink-API
├─ BlinkLiveStream TLS-Verbindung, Anmeldung, MPEG-TS empfangen
└─ ffmpeg MPEG-TS → fMP4
│ TLS TCP binary stream
▼
Blink IMMI Server
- Ein Client verbindet sich per WebSocket und schickt innerhalb von 8 Sekunden den Befehl
liveview:startmit den Zugangsdaten und der Kamera-ID. - immi2mpeg startet über die Blink-API die Liveansicht und verbindet sich mit dem IMMI-Server.
- Nach etwa zwei bis drei Sekunden kommen die ersten Videofragmente als Binärdaten beim Client an.
- Mit
liveview:stopbeendet der Client den Stream, immi2mpeg meldet das Ende auch an Blink zurück.
Voraussetzungen
- Node.js ab Version 18
- ffmpeg, installiert und im Suchpfad (
sudo apt install ffmpeg) - die Blink-Zugangsdaten: Region, API-Token, Konto-, Netzwerk- und Kamera-ID
Installation
cd /opt
git clone https://github.com/wilkware/immi2mpeg
cd immi2mpeg
npm install
sudo cp ./docs/immi2mpeg.service /etc/systemd/system
sudo chmod +x /opt/immi2mpeg/src/index.js
sudo systemctl daemon-reload
sudo systemctl enable immi2mpeg.service
sudo systemctl start immi2mpeg.service
Standardmäßig lauscht der Dienst auf Port 8090. Port und Adresse lassen sich beim Start ändern, entweder als Parameter oder über Umgebungsvariablen:
node src/index.js --port=9000 --host=127.0.0.1
PORT=9000 HOST=127.0.0.1 npm start
Für die Fehlersuche gibt DEBUG=immi2mpeg:* ausführliche Meldungen aus, einzelne Bereiche lassen sich über immi2mpeg:stream, :api, :ffmpeg oder :ws gezielt einschalten. Alternativ läuft der Dienst auch in einem Docker-Container.
Die WebSocket-Schnittstelle
const ws = new WebSocket('ws://localhost:8090');
ws.binaryType = 'arraybuffer';
ws.onopen = () => {
ws.send(JSON.stringify({
command: 'liveview:start',
data: {
account_region: 'e006',
api_token: 'eyJhbGci...',
account_id: '12345',
network_id: '67890',
camera_id: '111222',
camera_type: 'cameras', // 'cameras' | 'owl' | 'doorbell'
},
}));
};
ws.onmessage = (evt) => {
if (evt.data instanceof ArrayBuffer) {
// fMP4-Fragment an den SourceBuffer übergeben
return;
}
const msg = JSON.parse(evt.data);
// msg.command: 'liveview:start' (Stream offen) oder 'liveview:stop' (Ende, ggf. mit msg.error)
};
Unterstützt werden normale Kameras, die Mini-Kamera (owl) und die Türklingel (doorbell). Ein vollständiges Beispiel für das Abspielen mit MediaSource steht in der README
.
Und Symcon?
Die Zugangsdaten, die immi2mpeg erwartet, kennt man aus der Anmeldung bei Blink, in Symcon zum Beispiel über die Bibliothek Blink Home System . Wo ein Livebild gebraucht wird, etwa in einer eigenen Kachel oder HTML-Box, reicht dann eine WebSocket-Verbindung zu immi2mpeg.
immi2mpeg steht unter der MIT-Lizenz .