NEWS
Test Adapter onvif camera v1.x.x
-
@chrga
Ja genau dauert ca 2sek
Genau es wird der hoch auflösende stream verwendet
Wäre interessant wenn du mal den rtsp2web docker installierst wie da die performance ist@tombox
alles klar, schaue ich mir mal an und gebe Feedback.Was anderes: Wie sieht es mit der Steuerung der Kamera aus? Ich sehe da die Option für die Presets, aber kein up/down/left/right. Für meine Tapo sehe ich auch koordinaten X/Y, aber die sind read-only. Kann ich die Kamera bewegen, also ist das der Plan?
Melde mich, sobal ich weiteres Feedback habe.
Insgeamt läuft es aber recht sauber! Hab es vor allem in Telegram integriert, und sowohl das Bild senden, als auch dei Bewegungsmeldung laufen sehr sauber und zuverlässig. Übrigends dann auch noch, wenn man dem Tapo das Internet abdreht. -
@tombox
alles klar, schaue ich mir mal an und gebe Feedback.Was anderes: Wie sieht es mit der Steuerung der Kamera aus? Ich sehe da die Option für die Presets, aber kein up/down/left/right. Für meine Tapo sehe ich auch koordinaten X/Y, aber die sind read-only. Kann ich die Kamera bewegen, also ist das der Plan?
Melde mich, sobal ich weiteres Feedback habe.
Insgeamt läuft es aber recht sauber! Hab es vor allem in Telegram integriert, und sowohl das Bild senden, als auch dei Bewegungsmeldung laufen sehr sauber und zuverlässig. Übrigends dann auch noch, wenn man dem Tapo das Internet abdreht. -
@chrga exakt move geht nicht aber du kannst abgespeichert presets aufrufen. müsste ich mal schauen ob Bewegung geht und ob das so relevant ist
-
@tombox ok, danke. und die presets speichere ich dann über ein externes tool auf der Kamera ab, das geht dann nicht über den Adapter!?
-
Ich habe auf meiner Synology DS918+ den Docker RTSPtoWeb eingerichtet. Kamera einrichten hat funktioniert. Ich kann auf dem Webinterface auch den Stream der Kamera sehen.
Leider kommt bei Eingabe der URL im Browser
http://192.168.178.86:8083/stream/27aec28e-6181-4753-9acd-0456a75f0289/channel/0immer
404 page not foundsollte mit der URL nicht der Stream angezeigt werden?
Könnte mir jemand mal bitte einen Einblick in seine config.json von RTSPtoWeb gewähren?
-
Ich habe auf meiner Synology DS918+ den Docker RTSPtoWeb eingerichtet. Kamera einrichten hat funktioniert. Ich kann auf dem Webinterface auch den Stream der Kamera sehen.
Leider kommt bei Eingabe der URL im Browser
http://192.168.178.86:8083/stream/27aec28e-6181-4753-9acd-0456a75f0289/channel/0immer
404 page not foundsollte mit der URL nicht der Stream angezeigt werden?
Könnte mir jemand mal bitte einen Einblick in seine config.json von RTSPtoWeb gewähren?
@knallochse Der stream ist direkt nicht Sichtbar sondern muss mit einem Skript wie in der Anleitung eingebunden werden
-
@tombox
ok, das war mir gar nicht bewußt, das jedes Objekt einen Zeitstempel hat.
Das sehe ich mir im Detail an.
Dankealso erst einmal vielen Dank für Deinen Adpater. Funktioniert richtig super.
Noch eine Information von meiner Seite. Ich verwende inzwischen von MaterialDesign das Widget Html Card. Das hat ein Feld Objekt-ID zum Aktualisieren. Das ist ideal um Events abzufangen, da spart man sich die Skripts. -
Ich habe auf meiner Synology DS918+ den Docker RTSPtoWeb eingerichtet. Kamera einrichten hat funktioniert. Ich kann auf dem Webinterface auch den Stream der Kamera sehen.
Leider kommt bei Eingabe der URL im Browser
http://192.168.178.86:8083/stream/27aec28e-6181-4753-9acd-0456a75f0289/channel/0immer
404 page not foundsollte mit der URL nicht der Stream angezeigt werden?
Könnte mir jemand mal bitte einen Einblick in seine config.json von RTSPtoWeb gewähren?
@knallochse hier ist meine config.json:
{ "channel_defaults": {}, "server": { "debug": true, "http_debug": false, "http_demo": true, "http_dir": "web", "http_login": "demo", "http_password": "demo", "http_port": ":8083", "https": false, "https_auto_tls": false, "https_auto_tls_name": "", "https_cert": "server.crt", "https_key": "server.key", "https_port": ":443", "ice_credential": "", "ice_servers": [], "ice_username": "", "log_level": "debug", "rtsp_port": ":5541", "token": { "backend": "", "enable": false }, "webrtc_port_max": 0, "webrtc_port_min": 0 }, "streams": { "a649b2ed-a7ab-4e24-bb47-52ad03fae00d": { "channels": { "0": { "url": "rtsp://192.168.102.20:554/cam/realmonitor?channel=1\u0026subtype=0\u0026unicast=true\u0026proto=Onvif" } }, "name": "Eingang" } } } -
Hi ich habe ein neuen Adapter für ONVIF Kameras geschrieben, da die bisherigen Adapter nicht mehr gewartet werden und ich kein snapshot bei meiner Kamera erhalten habe.
Zum Installieren:
https://github.com/iobroker-community-adapters/ioBroker.onvifFür die aktuelle Version
bitte das latest Repo auswählen:

Kameras hinzufügen
Discovery:
Bei jedem Adapterstart wird mit dem in der Einstellungen eingetragen Benutzername und Passwort eine Discovery durchgeführt und versuch sich in die Kamera einzuloggen. Falls die Kamera noch nicht unter Objekte hinzugefügt wurde.
In den Einstellungen kann man die Discovery manuell ausführen. Falls die Kameras unterschiedliche Zugangsdaten haben müssen die jeweils eingegeben werden und eine discovery durchgeführt werden. Im Log sieht man Details zu dem Prozess.
Damit eine Kamera neu erkannt wird muss sie einfach unter Objekte gelöscht werden.
Manuelle Suche
Es können Kameras manuell gesucht werden, falls Discovery nicht funktioniert. Dazu muss eine IP Range und Ports eingegeben und manuell ausgeführt werden. Im Log sieht man Details zu dem Prozess.
Datenpunkte
onvif.0.IP_PORT.events Events der Kamera wie z.b. Bewegungserkennung
onvif.0.IP_PORT.general Generelle Information über die Kameras
onvif.0.IP_PORT.infos Informationen über die Kamera werden nur bei Adapterstart aktualisiert oder bei remote.refresh
Video und Snapshot URL:
onvif.0.IP_PORT.infos.streamUris.MediaProfile_Channel1_MainStream.snapshotUrl.urionvif.0.IP_PORT.remote Steuerung der Kamera
onvif.0.IP_PORT.remote.refresh Aktualisierung der Infodaten
onvif.0.IP_PORT.remote.gotoHomePosition PTZ Kamera in die HomePosition setzen
onvif.0.IP_PORT.remote.gotoPreset PTZ Kamera Preset Nummer auswählen
onvif.0.IP_PORT.remote.snapshot Speichert ein snapshot unter onvif.0.IP_PORT.snapshot
Message
Adapter nimmt Message "snapshot" entgegen und gibt ein Bild zurück
sendTo("onvif.0", "snapshot", "192_168_178_100_80", (result) => { if (result) { sendTo("telegram.0", { text: result, type: "photo", caption: "Kamera 2", }); } });Bewegungsmeldung zu Telegram
on("onvif.0.192_168_178_100_80.events.RuleEngine/CellMotionDetector/Motion", (obj) => { if (obj.state.val === true) { sendTo("onvif.0", "snapshot", "192_168_178_100_80", (result) => { if (result) { sendTo("telegram.0", { text: result, type: "photo", caption: "Camera 2", }); } }); } });Snapshot Server in vis einbinden
Der Adapter bietet ein Snapshot Server ohne Passwort an. Dazu Server aktivieren in den Instanzeinstellungen und dann kann der aktuelle Snapshot http://iobrokerIp:8095/CAMERAIP_PORT z.B. http://192.168.0.1:8095/192_168_0_1_80 abgerufen werden.
In der Vis ein Image Widget einfügen und die Url als Quelle angeben und eine Updatezeit auswählen

Stream in vis einbinden
go2rtsp Docker
Ein Stream wird normalerweise via rtsp stream bereitgestellt. Eine Umwandlung via motion eye ist sehr resourcen aufwändig und hat ein Verzögerng. Ein Umwandlung in webrtc ist schneller und resourcenschonender. Meine Empfehlung ist ein go2rtsp. Dazu muss ein Docker von alexxit/go2rtc erstellt werden.
https://hub.docker.com/r/alexxit/go2rtcOder go2rtc lokal zu installieren:
https://www.youtube.com/watch?v=4VEEpRYerZg
https://forum.iobroker.net/post/1031526image: alexxit/go2rtc network_mode: host # important for WebRTC, HomeKit, UDP cameras privileged: true # only for FFmpeg hardware transcoding restart: unless-stopped # autorestart on fail or config change from WebUI environment: - TZ=Europe/Berlin # timezone in logs volumes: - "~/go2rtc:/config" # folder for go2rtc.yaml file (edit from WebUI)Es muss ein Volume für den Pfad /config und das network als host eingestellt werden.
Dann ist go2rtsp erreichbar über
http://IP:1984Dann kann man ein Stream hinzufügen. Die Stream url findet man z.B. unter
onvif.0.IP_PORT.infos.streamUris.ProfileName.live_stream_tcp.uri
Stream als iFrame einfügen
Das Widget
iFramein der Vis hinzufügen und als Quelle den stream link von go2rtsp verwendenhttp://192.168.178.1:1984/stream.html?src=camera&mode=webrtcUnter links kann noch die Art des Players ausgewählt werden (Mikrofon)
Rtsp2Web Docker
Eine Alternative ist ein RTSPtoWeb Docker. Dies ist aber von der Einrichtun komplizierter.
Dazu muss ein Docker von ghcr.io/deepch/rtsptoweb:latest erstellt werden.FFMpeg Unterstützung
Wenn die Kamera keine Snapshot Unterstützng hat wird mit ffmpeg ein snapshot aus dem rtsp stream erzeugt.
Snapshot Server in vis einbinden
Der Adapter bietet ein Snapshot Server ohne Passwort an. Dazu Server aktivieren in den Instanzeinstellungen und dann kann der aktuelle Snapshot http://iobrokerIp:8095/CAMERAIP_PORT z.B. http://192.168.0.1:8095/192_168_0_1_80 abgerufen werden.
In der Vis ein Image Widget einfügen und die Url als Quelle angeben und eine Updatezeit auswählen
Snapshot in vis einbinden
Wenn möglich die snapshotUri verwenden z.B.
onvif.0.IP_PORT.infos.streamUris.MediaProfile_Channel1_MainStream.snapshotUrl.uriDen Datenpunkt nicht als Stream verwenden, da sonst die Festplatte zu hohe Last hat.
Den Datenpunkt aktualisieren via t onvif.0.IP_PORT.remote.snapshot
Den Datenpunkt onvif.0.IP_PORT.snapshot ein
String img srcelement zuordnen

Oder als Alternative falls String img src nicht funktioniert
Den Datenpunkt onvif.0.IP_PORT.snapshot alsHTMLelement in die vis einfügen mit folgendem Inhalt<img src="{onvif.0.IP_PORT.snapshot}" width="500px" />@tombox sagte in Test Adapter onvif camera v1.0.0:
Rtsp2Web Docker
Hi,
ich versuch das gerade umzusetzen. Habe aber das Problem das sobald ich ein zweites Widget für eine weitere Kamera einfüge beide kein Bild mehr anzeigen.
Lösche ich das zweite Widget wieder funktioniert das andere wieder.
Erstes Widget sieht so aus:

Zweites dann so mit anderer Channel ID:

Script ist hinterlegt:

Was mache ich denn falsch ?
EDIT: Gibt es im Browser Beschränkungen was die Anzahl der Streams betrifft oder so?
In Chrome sieht es so aus: der funktionierende ist der zuerst eingefügte Stream

In FF kommt das:

Wenn ich den zweiten Stream auf einen anderen View mache funktioniert er:

Jemand eine Idee dazu ?
-
Hallo zusammen,
ich habe den Fehler gefunden und bitte um Unterstützung:
In der Kamera steht
onvif.0.IP_PORT.infos.streamUris.Profile2.snapshotUrl.uri: http://IP:80/api/v1/snap.cgi?chn=0Sobald ich Port 80 mit dem hinterlegten Port ändere funktioniert der Link bei mir und ich kann über den Browser Screenshots abfragen.
Den Pfad im DAtenpunkt zu überschreiben ist sicher keine gute Idee. Wie ist es denn behebar?
-
Hallo zusammen,
ich habe den Fehler gefunden und bitte um Unterstützung:
In der Kamera steht
onvif.0.IP_PORT.infos.streamUris.Profile2.snapshotUrl.uri: http://IP:80/api/v1/snap.cgi?chn=0Sobald ich Port 80 mit dem hinterlegten Port ändere funktioniert der Link bei mir und ich kann über den Browser Screenshots abfragen.
Den Pfad im DAtenpunkt zu überschreiben ist sicher keine gute Idee. Wie ist es denn behebar?
@marc_el_k in was änderst du :80? Der Datenpunkt wird von der Onvif Discovery zurück gemeldet. Es wird nicht bringen es dort händisch zu ändern...
Schick doch mal die URL mit der Du Snapshots im Browser anzeigen lassen kannst. -
@marc_el_k in was änderst du :80? Der Datenpunkt wird von der Onvif Discovery zurück gemeldet. Es wird nicht bringen es dort händisch zu ändern...
Schick doch mal die URL mit der Du Snapshots im Browser anzeigen lassen kannst. -
@marc_el_k hast Du ein Problem mit Port 80? Oder warum hast Du dort einen anderen? Stell doch in der Kamera den Port wieder auf 80 und teste es.
-
@marc_el_k hast Du ein Problem mit Port 80? Oder warum hast Du dort einen anderen? Stell doch in der Kamera den Port wieder auf 80 und teste es.
@rookie50 in den Einstellungen der Kamera kann ich von 8000-9000 einen Port vergeben. Also probiere ich es Mal mit 8000
Edit: Nein geht nicht. Im Datenpunkt steht wieder "80". Im Browser kein Bild. Ändere ich es ab auf 8000 geht es sofort
-
@rookie50 in den Einstellungen der Kamera kann ich von 8000-9000 einen Port vergeben. Also probiere ich es Mal mit 8000
Edit: Nein geht nicht. Im Datenpunkt steht wieder "80". Im Browser kein Bild. Ändere ich es ab auf 8000 geht es sofort
@marc_el_k ein Screenshot von den Porteinstellungen wäre hilfreich. Die Kameras haben meistens mehrere Ports für unterschiedliche Dienste
-
@tombox sagte in Test Adapter onvif camera v1.0.0:
Rtsp2Web Docker
Hi,
ich versuch das gerade umzusetzen. Habe aber das Problem das sobald ich ein zweites Widget für eine weitere Kamera einfüge beide kein Bild mehr anzeigen.
Lösche ich das zweite Widget wieder funktioniert das andere wieder.
Erstes Widget sieht so aus:

Zweites dann so mit anderer Channel ID:

Script ist hinterlegt:

Was mache ich denn falsch ?
EDIT: Gibt es im Browser Beschränkungen was die Anzahl der Streams betrifft oder so?
In Chrome sieht es so aus: der funktionierende ist der zuerst eingefügte Stream

In FF kommt das:

Wenn ich den zweiten Stream auf einen anderen View mache funktioniert er:

Jemand eine Idee dazu ?
@wendy2702 Bei mir auch so. Ab 2. Kamera geht die Anzeige nicht mehr
-
@wendy2702 Bei mir auch so. Ab 2. Kamera geht die Anzeige nicht mehr
@knallochse Danke für die Info.
Vielleicht hat ja noch wer eine Lösung dazu oder sind wir die einzigen die mehr als eine Kamera in VIS haben ?
-
@knallochse Danke für die Info.
Vielleicht hat ja noch wer eine Lösung dazu oder sind wir die einzigen die mehr als eine Kamera in VIS haben ?
@wendy2702 bitte für die zweite Kamera folgendes verwenden
<input type="hidden" name="webrtc2-url" id="webrtc2-url" value="http://192.168.0.2:8083/stream/ddbdb583-9f80-4b61-bafa-613aa7a5daa5/channel/0/webrtc" /> <video id="webrtc2-video" autoplay muted playsinline controls style="max-width: 100%; max-height: 100%;"></video>setTimeout(function () { function startPlay(videoEl, url) { const webrtc = new RTCPeerConnection({ iceServers: [ { urls: ["stun:stun.l.google.com:19302"], }, ], sdpSemantics: "unified-plan", }); webrtc.ontrack = function (event) { console.log(event.streams.length + " track is delivered"); videoEl.srcObject = event.streams[0]; videoEl.play(); }; webrtc.addTransceiver("video", { direction: "sendrecv" }); webrtc.onnegotiationneeded = async function handleNegotiationNeeded() { const offer = await webrtc.createOffer(); await webrtc.setLocalDescription(offer); fetch(url, { method: "POST", body: new URLSearchParams({ data: btoa(webrtc.localDescription.sdp) }), }) .then((response) => response.text()) .then((data) => { try { webrtc.setRemoteDescription(new RTCSessionDescription({ type: "answer", sdp: atob(data) })); } catch (e) { console.warn(e); } }); }; const webrtcSendChannel = webrtc.createDataChannel("rtsptowebSendChannel"); webrtcSendChannel.onopen = (event) => { console.log(`${webrtcSendChannel.label} has opened`); webrtcSendChannel.send("ping"); }; webrtcSendChannel.onclose = (_event) => { console.log(`${webrtcSendChannel.label} has closed`); startPlay(videoEl, url); }; webrtcSendChannel.onmessage = (event) => console.log(event.data); } const videoEl = document.querySelector("#webrtc2-video"); const webrtcUrl = document.querySelector("#webrtc2-url").value; startPlay(videoEl, webrtcUrl); }, 1000); -
@wendy2702 bitte für die zweite Kamera folgendes verwenden
<input type="hidden" name="webrtc2-url" id="webrtc2-url" value="http://192.168.0.2:8083/stream/ddbdb583-9f80-4b61-bafa-613aa7a5daa5/channel/0/webrtc" /> <video id="webrtc2-video" autoplay muted playsinline controls style="max-width: 100%; max-height: 100%;"></video>setTimeout(function () { function startPlay(videoEl, url) { const webrtc = new RTCPeerConnection({ iceServers: [ { urls: ["stun:stun.l.google.com:19302"], }, ], sdpSemantics: "unified-plan", }); webrtc.ontrack = function (event) { console.log(event.streams.length + " track is delivered"); videoEl.srcObject = event.streams[0]; videoEl.play(); }; webrtc.addTransceiver("video", { direction: "sendrecv" }); webrtc.onnegotiationneeded = async function handleNegotiationNeeded() { const offer = await webrtc.createOffer(); await webrtc.setLocalDescription(offer); fetch(url, { method: "POST", body: new URLSearchParams({ data: btoa(webrtc.localDescription.sdp) }), }) .then((response) => response.text()) .then((data) => { try { webrtc.setRemoteDescription(new RTCSessionDescription({ type: "answer", sdp: atob(data) })); } catch (e) { console.warn(e); } }); }; const webrtcSendChannel = webrtc.createDataChannel("rtsptowebSendChannel"); webrtcSendChannel.onopen = (event) => { console.log(`${webrtcSendChannel.label} has opened`); webrtcSendChannel.send("ping"); }; webrtcSendChannel.onclose = (_event) => { console.log(`${webrtcSendChannel.label} has closed`); startPlay(videoEl, url); }; webrtcSendChannel.onmessage = (event) => console.log(event.data); } const videoEl = document.querySelector("#webrtc2-video"); const webrtcUrl = document.querySelector("#webrtc2-url").value; startPlay(videoEl, webrtcUrl); }, 1000);@tombox So ähnlich habe ich das auch gerade hinbekommen.
Jetzt bisschen Off Topic aber kann man eigentlich jedem Widget einzeln unterschiedliche Skripte anhängen?
Ich habe das ja gerade für das erste Widget eingefügt und es ist dann ja auch direkt bei allen anderen sichtbar.
-
@tombox So ähnlich habe ich das auch gerade hinbekommen.
Jetzt bisschen Off Topic aber kann man eigentlich jedem Widget einzeln unterschiedliche Skripte anhängen?
Ich habe das ja gerade für das erste Widget eingefügt und es ist dann ja auch direkt bei allen anderen sichtbar.
@wendy2702 Kenne mich da auch nicht so aus aber anscheinend.
Kannst du was zu der performance von rtsp2web sagen?