From 9c345ec5647cb8fcecbb0cf1903b36ba6613ef59 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 6 Nov 2024 16:19:59 +0100 Subject: [PATCH] 2024.11: Finish WebRTC --- .../_posts/2024-11-06-release-202411.markdown | 43 ++++++++++++++++-- .../blog/2024-11/webrtc-logo-horiz-retro.png | Bin 0 -> 14095 bytes 2 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 source/images/blog/2024-11/webrtc-logo-horiz-retro.png diff --git a/source/_posts/2024-11-06-release-202411.markdown b/source/_posts/2024-11-06-release-202411.markdown index f473540cd28..4350b663ec5 100644 --- a/source/_posts/2024-11-06-release-202411.markdown +++ b/source/_posts/2024-11-06-release-202411.markdown @@ -157,11 +157,48 @@ to align 2, 3, 4, or 6 buttons side-by-side. ## Low latency cameras using WebRTC -Camera streams will now try to use WebRTC whenever possible. WebRTC is an online standard that makes a peer-to-peer connection for lower-latency audio and video streaming. When you’re away from home, it will try to find the fastest and most direct path between your Home Assistant instance and the device you’re using. +Lots of effort has gone into this new and amazing feature for this release: +**WebRTC**! 🎉 -The Open Home Foundation will host the basic network infrastructure to give all Home Assistant users the capability to use WebRTC for peer-to-peer connections whenever possible. Sometimes, a direct connection between the client and the camera is not possible; in those situations, the stream needs to be relayed by an external server. [Home Assistant Cloud](/cloud/) now provides this relay server, and it's included as one of the many benefits available to subscribers! So, no matter where you are, you should always be able to watch your cameras via this low-latency technology. +

Logo of WebRTC

-If WebRTC is not available, it will fall back to using the old method of streaming. +Not sure [what WebRTC is]? No worries! Let us try to explain. If you are +watching a camera in Home Assistant, you might have noticed it is something +a bit slow and delayed. WebRTC support is going to change that! + +Camera streams will now try to use WebRTC whenever possible. +[WebRTC is a standard] that makes a peer-to-peer connection for lower-latency +audio and video streaming. You are probably using this technology a lot already, +for example, when having an online video call. When you’re away from home, +it will try to find the fastest and most direct path between your Home Assistant +instance and the camera you are trying to view. + +[The Open Home Foundation] will host the negotiating network infrastructure +([STUN servers]) **for free for all Home Assistant users** and enable the +capability to use WebRTC for peer-to-peer connections whenever possible. + +

Logo of the Open Home Foundation

+ +Sometimes, a direct connection between the client (like your browser +or mobile app) and the camera is not possible; in those situations, the camera +stream needs to be relayed by an external server. [Home Assistant Cloud] now +provides this relay server, and it's **included as one of the many benefits** +available to all subscribers! + +So, no matter where you are, you should always be able to watch your cameras +via this low-latency technology. If, for whatever reason, WebRTC is not +available, it will fall back to using the old method of streaming to ensure +you can always see your camera feeds. + +So, after reading all of this, what changed? Well, everything will still look +and work the same, but your camera feeds will be faster, more responsive, and +less delayed! 🎉 + +[Home Assistant Cloud]: /cloud/ +[STUN servers]: https://en.wikipedia.org/wiki/STUN +[The Open Home Foundation]: https://www.openhomefoundation.org/ +[WebRTC is a standard]: https://webrtc.org/ +[what WebRTC is]: https://en.wikipedia.org/wiki/WebRTC ## Integrations diff --git a/source/images/blog/2024-11/webrtc-logo-horiz-retro.png b/source/images/blog/2024-11/webrtc-logo-horiz-retro.png new file mode 100644 index 0000000000000000000000000000000000000000..fef08510be7f7a8ac8683ed79be122da765662f1 GIT binary patch literal 14095 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 literal 0 HcmV?d00001