Zoom Rooms and Workspaces
cancel
Showing results for 
Search instead for 
Did you mean: 
Important updates from Zoom Support:
  • Starting February 3, 2025, Zoom Phone customers must add their phone numbers to an approved 10DLC campaign in order to keep using SMS/MMS capabilities on their numbers.

  • Introducing more live support options! More Zoom customers now have access to live agent chat support. Sign in and visit our Contact Support page to see all your available support options. We’re here to help!

What are Zoom Rooms and Workspaces?

Zoom Rooms are modern workspaces that enable in-person and remote participants to interact in real-time in a hybrid setting. Explore the Zoom Community's Recent Activity below to join the Rooms and Workspaces conversation and connect with other members. If you're still looking for support, browse our Zoom Rooms and Workspaces support articles or start a new discussion below!

Recent Activity

Resolved! Zoom Rooms splitting screen

My office has a number of small conference rooms or personal work spaces set up as Zoom rooms, each with a desktop console and a mounted TV/display on the wall for use in the room. I want to use the mounted display in a Zoom room as a second screen f... Show more

My office has a number of small conference rooms or personal work spaces set up as Zoom rooms, each with a desktop console and a mounted TV/display on the wall for use in the room. 

 

I want to use the mounted display in a Zoom room as a second screen for my laptop, not as a duplicate of my laptop's single (small) screen. Am I just really dense in that I can't figure out how to do this? That seems like a really obvious, high-demand use case, and something that other (not Zoom) solutions solved literally a decade+ ago. 


Show less

reply-icon Latest Reply - 

Create Join links for Breakout room

It will be nice to join the Zoom breakout room through a link.We often invite Guest speakers to a specific room. Since there is no unique link to the breakout room, we give them the link to the lobby. The speakers then will be given instructions to j... Show more

It will be nice to join the Zoom breakout room through a link.

We often invite Guest speakers to a specific room. Since there is no unique link to the breakout room, we give them the link to the lobby.

 

The speakers then will be given instructions to join the intended room. Still, the speakers feel confused when they join the meeting with unexpected attendees (Unassigned room) and also finding the right room isn't any easy. 

 

If we include the room name along with the invitation link and handle auto-join to the breakout room, The process would be easier than now.


Show less

reply-icon Latest Reply - 

Keeping control TCP connection alive via zoom room device profile JSON

We are using Zoom Room Controls to control a QSYS Core 110f. Every 60 seconds QSYS closes the connection as described here: https://q-syshelp.qsc.com/Content/External_Control_APIs/ECP/ECP_Commands.htm#:~:text=Note%3A%20An%20External%20Control%20clien... Show more

We are using Zoom Room Controls to control a QSYS Core 110f.  Every 60 seconds QSYS closes the  connection as described here:

 

https://q-syshelp.qsc.com/Content/External_Control_APIs/ECP/ECP_Commands.htm#:~:text=Note%3A%20An%20External%20Control%20client,get%20reclaimed%20by%20the%20Core.

 

Then the zoom computer instantly reconnects.  In the short term things work fine, however every few days it seems, something in the network stack of the QSYS core crashes and it needs a hard reboot.  I have experienced this with QSYS when there is a large volume of active sockets or high amounts of control activity.  I think there may be a memory leak in QSYS's network stack, or something of that nature.  Perhaps closed sockets are not getting properly deleted.  Unfortunately I cannot control that.

 

However I was wondering if there is a way to keep the connection alive so the logs aren't flooded with a reconnect every 60 seconds from zoom and there isn't the constant disconnect/reconnect. How can I have zoom send some data to QSC Core every 55 seconds?

 

image.png


Show less

reply-icon Latest Reply - 

Connection Error with Zoom Room Controls

Olá, estou tentando automatizar uma sala de zoom usando os controles com um dispositivo Sonoff. Este dispositivo funciona por meio de solicitações HTTP. Dentro dos Controles, tenho uma conexão com o dispositivo, mas os comandos não estão funcionando.... Show more

Olá, estou tentando automatizar uma sala de zoom usando os controles com um dispositivo Sonoff. Este dispositivo funciona por meio de solicitações HTTP. Dentro dos Controles, tenho uma conexão com o dispositivo, mas os comandos não estão funcionando. Depois de acionar qualquer comando, o dispositivo não responde.
Comando de Interação com Sonoff:
http:///cm?cmnd=Power%20On
http:///cm?cmnd=Power%20Off

 

Codificação JSON dos controles do Zoom Room:

json_sonoff.png

 

Desenvolvi um aplicativo em ReactNative para testar usando a mesma estrutura JSON que o Zoom usa e funcionou bem. No entanto, com a mesma configuração dentro da Zoom Room, ela não funciona conforme o esperado.
Imagem da lógica no aplicativo ReactNative:

 

app_sonoff.png

 

Eu li a documentação completa para os controles da sala de zoom e o dispositivo Sonoff. Acredito que o problema pode estar relacionado a alguma limitação do lado do Zoom.

Alguém pode me ajudar com isso?


Show less

Video Not Displaying for Self-Participant in Safari and Firefox with Zoom Video SDK

I am experiencing an issue with the Zoom Video SDK in my React.js project. The problem occurs specifically in Safari (MacOS) and Firefox browsers. While the video for other participants renders correctly, the self-participant's video is not displayed... Show more

 

I am experiencing an issue with the Zoom Video SDK in my React.js project. The problem occurs specifically in Safari (MacOS) and Firefox browsers. While the video for other participants renders correctly, the self-participant's video is not displayed in these browsers.

 

Here are some key details about the issue:

Browsers Affected: Safari (MacOS) and Firefox.
Behavior:
a. In Chrome, the self-participant's video works perfectly.
b. In Safari, the video element for the self-participant remains blank whereas the other person can see my video.
c. In Firefox, the same issue occurs, and no errors appear in the console.
In Chrome and Safari (iOS) everything works fine but in Safari (MacOS) and Firefox I am having this issue. The other person can see my video completely fine but in my screen my video is not being displayed. In the console it is giving below error:

 

Error:
Uncaught Error: The video-player must have a video-player-container as its ancestor element.

Even though this error is also coming in Chrome still it is working fine there. I have attached the code below. Help me solve this issue.

 

 

 

const connectVideo = async (token) => {
if (isJoining) return; // Prevent multiple join attempts
setIsJoining(true);

try {
// await zoomClient.init("en-US", "Global");
await zoomClient.init("en-US", "Global", { patchJsMedia: true, enforceMultipleVideos:true });
await zoomClient.join(roomId, token || videoToken, userName);
zoomSession = zoomClient.getMediaStream();
setRoom(zoomSession);
} catch (error) {
setIsJoining(false); // Reset joining status on error
}
};

 

 

 

const Room = ({ roomName, room, handleLogout, userId, roomId }) => {

const zoomClient = ZoomVideo.createClient();

const getBookingDetails = async () => {
try {
const res = await ApiCall({
route: `booking/get_booking_detail/${roomName}`,
token: token,
verb: "get",
params: data,
});
if (res?.status == "200") {
return setBookingDetail(res?.response?.booking_detail);
} else {
console.log("your error is there", res?.response);
}
} catch (e) {
console.log("your error is there", e);
}
};

const { isLoading, data } = useQuery("bookingDetails", getBookingDetails);

useEffect(() => {
const handleUserAdded = (payload) => {
setParticipants((prevParticipants) => [payload]);
setJoin(true);
};

const handleUserRemoved = (payload) => {
setParticipants([]);
};

const handleZoomPeer = (payload) => {
if (payload.action === "Start") {
// a user turned on their video, render it
room.attachVideo(payload.userId, 3).then((userVideo) => {
document
.querySelector("video-player-container")
.appendChild(userVideo);
});
handleUserAdded(payload);
} else if (payload.action === "Stop") {
// a user turned off their video, stop rendering it
room.detachVideo(payload.userId).then((userVideo) => {
document.querySelector("video-player-container").innerHTML = "";
});
handleUserRemoved(payload);
}
};

zoomClient.on("peer-video-state-change", handleZoomPeer);

return () => {
zoomClient.off("peer-video-state-change", handleZoomPeer);
};
}, [room, participants]);

useEffect(() => {
const userRemoved = (payload) => {
if (join) {
setJoin(false);
}
console.log("user removed", payload);
};
const newUserJoin = (payload) => {
setJoin(true);
getBookingDetails();
console.log("User Joined Called", payload);
};

zoomClient.on("user-added", newUserJoin);
zoomClient.on("user-removed", userRemoved);
}, [join]);

async function askPermission() {
// Checking initial permission state for microphone and camera
const MicroPermission = await navigator.permissions.query({
name: "microphone",
});
const VideoPermission = await navigator.permissions.query({
name: "camera",
});

console.log("Micro Permission At Start", MicroPermission);
console.log("Video Permission At Start", VideoPermission);

try {
if (MicroPermission.state === "prompt") {
Swal.fire({
title: "Microphone access!",
text: "Please allow microphone access to communicate.",
showConfirmButton: false,
icon: "info",
allowOutsideClick: false,
});

// Request microphone access
await navigator.mediaDevices.getUserMedia({ audio: true });

const againMicroPermission = await navigator.permissions.query({
name: "microphone",
});
if (againMicroPermission.state == "granted") {
room.startAudio();
setIsAudio(againMicroPermission.state);
setIsMute(true);

} else if (againMicroPermission.state == "denied") {
setIsAudio(againMicroPermission.state);
setIsMute(false);

// Handle the case when permission is denied
Swal.fire({
title: "Microphone Access Denied",
text: "You have denied microphone access. Some features may not work properly.",
icon: "error",
confirmButtonText: "Ok",
});
}
Swal.close();

} else {
setIsAudio(MicroPermission.state);
}
} catch (error) {
// Handle any errors (e.g., if the user denies access)
console.log("Error requesting microphone permission:", error);
if (
error.name === "NotAllowedError" ||
error.name === "PermissionDeniedError"
) {
Swal.fire({
title: "Microphone Access Denied",
text: "You have denied microphone access. Some features may not work properly.",
icon: "error",
confirmButtonText: "Ok",
});
}
}

try {
// If video permission state is "prompt", ask the user for permission
if (VideoPermission.state === "prompt") {
Swal.fire({
title: "Camera access!",
text: "Please allow camera access to communicate.",
showConfirmButton: false,
icon: "info",
allowOutsideClick: false,
});

// Request microphone access
await navigator.mediaDevices.getUserMedia({ video: true });

const againVideoPermission = await navigator.permissions.query({
name: "camera",
});
if (againVideoPermission.state == "granted") {
setIsCamera(againVideoPermission.state);
setIsVideo(true);
console.log(
"Camera permission granted:",
againVideoPermission.state,
isCamera
);

room.startVideo().then(() => {
room
.attachVideo(zoomClient.getCurrentUserInfo().userId, 3)
.then((userVideo) => {
document
.querySelector("video-local-player-container")
.appendChild(userVideo);
});
});
} else if (againVideoPermission.state == "denied") {
setIsCamera(againVideoPermission.state);
setIsVideo(false);
console.log(
"Camera permission denied:",
againVideoPermission.state,
isCamera
);
// Handle the case when permission is denied
Swal.fire({
title: "Camera Access Denied",
text: "You have denied microphone access. Some features may not work properly.",
icon: "warning",
confirmButtonText: "Ok",
});
}
Swal.close();
console.log(
"Again Camera Permission Check",
againVideoPermission,
isCamera
);
} else {
setIsCamera(VideoPermission.state);
}
} catch (error) {
// Handle any errors (e.g., if the user denies access)
console.log("Error requesting camera permission:", error);
if (
error.name === "NotAllowedError" ||
error.name === "PermissionDeniedError"
) {
Swal.fire({
title: "Camera Access Denied",
text: "You have denied camera access. Some features may not work properly.",
icon: "warning",
confirmButtonText: "Ok",
});
}
}
}

useEffect(() => {
askPermission();
}, []);

useEffect(() => {
socketConnection.on("doctorCompleted", (data) => {
console.log("doctor left the video");
console.log(data?.booking_id, roomId, data?.booking_id == roomId);
if (data?.booking_id == roomId) setDoctorCompleted(true);
});
}, []);

// on metting leave
const onMeetingLeave = (id) => {
if (bookingDetail?.doctor_id?.user_id) {
Swal.fire({
title: "Are you sure?",
text: "Do you want to end consultation?",
icon: "warning",
showCancelButton: true,
cancelButtonText: "No",
confirmButtonText: "Yes",
confirmButtonColor: "#c82333",
}).then(async (result) => {
if (result.isConfirmed) {
handleLogout(true);
}
});
} else {
if (!bookingDetail?.doctor_id?.user_id) {
Swal.fire({
title: "Are you sure?",
text: "Do you want report delay from doctor and reschedule?",
icon: "warning",
showCancelButton: true,
cancelButtonText: "No",
confirmButtonText: "Yes",
confirmButtonColor: "#c82333",
}).then(async (result) => {
if (result.isConfirmed) {
setShowReportModal(true);
}
});
}
}
};
// main return

const sendNotificationHandler = async () => {
try {
const res = await ApiCall({
route: `receiptionist/add_notifications_for_receptionists`,
token: token,
verb: "post",
params: {
bookingId: bookingDetail?._id,
},
});
console.log(res?.response, "response");
if (res?.status == "200") {
console.log("res", res?.response);
Swal.fire(
"Your request for urgent attention has been notified.",
"Staff will be in contact with you soon.",
"success"
);
setTimePassed(new Date());
} else {
console.log("your error is there", res?.response);
}
} catch (err) {
console.log("Coudln't send", err);
}
};

const reportAndRescheduleHandler = async () => {
setShowReportModal(true);
};

const closeReportModal = () => {
setShowReportModal(false);
};

let items = [];

if (
participants?.length <= 0 &&
!bookingDetail?.doctor_id?.user_id &&
(new Date() - timePassedForDelay) / (1000 * 60) > 20
) {
items.push({
id: "1",
label: (
<PrimaryButton
className="report-button "
onClick={reportAndRescheduleHandler}
>
Report Delay & Reschedule
</PrimaryButton>
),
});
}

if (
participants?.length <= 0 &&
!bookingDetail?.doctor_id?.user_id &&
(new Date() - timePassed) / (1000 * 60) > 4
) {
items.push({
id: "2",
label: (
<PrimaryButton
className="notify-receptionist"
onClick={sendNotificationHandler}
icon={
<i
style={{ transform: `rotate(0deg)` }}
class="fa-solid fa-phone"
></i>
}
>
Ring again
</PrimaryButton>
),
});
}

const toggleVideo = async () => {
console.log("Valuevale", isVideo);
if (isCamera === "granted") {
if (isVideo) {
console.log("video is allowed", isVideo);
room.stopVideo().then(() => {
room
.detachVideo(zoomClient.getCurrentUserInfo().userId)
.then((userVideo) => {
document.querySelector("video-local-player-container").innerHTML =
"";
});
});
setIsVideo(false);
} else {
room.startVideo().then(() => {
room
.attachVideo(zoomClient.getCurrentUserInfo().userId, 3)
.then((userVideo) => {
console.log("userVideo", userVideo);
document
.querySelector("video-local-player-container")
.appendChild(userVideo);
});
});
setIsVideo(true);
}
} else {
Swal.fire({
title: "Camera Permission",
text: "You have denied camera access. Please allow from the setting.",
icon: "warning",
confirmButtonText: "Ok",
});
}
};

useEffect(() => {
if (zoomClient && room) {
zoomClient
.getAllUser()
.filter((user) => user.userIdentity !== userId)
.forEach(async (user) => {
if (user.userIdentity !== userId) {
console.log(user, "user already joined");
if (user.bVideoOn) {
room
.detachVideo(user.userId)
.then((userVideo) => {
document.querySelector("video-player-container").innerHTML =
"";
})
.then(() => {
room.attachVideo(user.userId, 3).then((userVideo) => {
document
.querySelector("video-player-container")
.appendChild(userVideo);
});
});

setParticipants([user]);
}
setJoin(true);
setUsers(user);
}
});
}
}, [zoomClient, room]);

const toggleAudio = async () => {
try {
console.log("ismute value is", isMute);
if (isAudio === "granted") {
await room.startAudio();
if (isMute) {
await room.muteAudio();
setIsMute(false);
} else {
await room.unmuteAudio();
setIsMute(true);
}
} else {
Swal.fire({
title: "Microphone Access Denied",
text: "You have denied microphone access. Please allow from the setting.",
icon: "warning",
confirmButtonText: "Ok",
});
}
} catch (error) {
console.error("Error toggling audio:", error);
}
};

console.log(participants);

return (
<>
<div className="main-container-video-chat">
<div className="video-chat-container-header">
{!isMobile && (
<DrawerApp
getBookingDetails={getBookingDetails}
bookingDetail={bookingDetail}
/>
)}
<img
onClick={() => navigate("/my-consultation")}
src={logo1}
alt="logo"
className="video-chat-header-logo"
/>

<button
className="custom-button-video-call mobile-end-consultation end-consultation"
onClick={() => onMeetingLeave(bookingDetail?._id)}
>
End
</button>
</div>
<div className="video-chat-section-container-main">
<div className="video-chat-inner-contianer">
<div className="videoDiv-main">
<div
className="remote-video"
style={{ display: participants.length == 0 ? "none" : "" }}
>
<video-player-container></video-player-container>
</div>

{join ? (
participants.length == 0 ? (
<div class="video-call-ended-text-in-box">
<p>Doctor has turned off their camera!</p>
</div>
) : (
""
)
) : (
<div class="video-call-ended-text-in-box">
<h4 class="h4">Consultation Paused!</h4>
<p>
{bookingDetail?.doctor_id?.user_id
? " We've notified the doctor. "
: " "}
Doctor will be in the session soon, please don't hesitate to
ask any questions in chat.
</p>
</div>
)}

<div className="local-user-video">
{isCamera === "granted" ? (
isVideo ? (
<div className="local-video">
<video-local-player-container></video-local-player-container>
</div>
) : (
<div className="local-user-off-cam">
<i class={`fa-solid fa-video-slash text-7`}></i>
<p>Camera turned off.</p>
</div>
)
) : (
""
)}
<video-local-player-container></video-local-player-container>
</div>

{isMobile && (
<div className="mobile-long-buttons-on-top">
{items?.length == 2
? items?.find((el) => el?.id == "1")?.label
: items?.find((el) => el?.id == "2")?.label}
</div>
)}
<div className="video-chat-controls">
{isMobile && (
<DrawerApp
getBookingDetails={getBookingDetails}
bookingDetail={bookingDetail}
/>
)}
{isMobile && (
<ChatDrawer
selectedChat={{
_id: bookingDetail?.chat_id,
booking: bookingDetail,
}}
/>
)}

<button
className={
isCamera === "granted"
? "chat-control-button video-active"
: "chat-control-button"
}
onClick={() => toggleVideo()}
style={{
backgroundColor:
isCamera === "granted"
? isVideo
? "blue"
: "red"
: "orange",
}}
title={
isCamera == "granted"
? "Video Management"
: "Please provide video permissions"
}
>
<i
class={`fa-solid fa-video${isVideo ? "" : "-slash"} text-7`}
></i>
</button>

<button
className={
isAudio === "granted"
? "chat-control-button video-active"
: "chat-control-button"
}
onClick={() => toggleAudio()}
style={{
backgroundColor:
isAudio === "granted"
? isMute
? "blue"
: "red"
: "orange",
}}
title={
isMute
? "Audio Management"
: "Please provide audio permissions"
}
>
<i
class={`fa-solid fa-microphone${
isMute ? "" : "-slash"
} text-3`}
></i>
</button>
</div>
<div className="video-chat-main-buttons">
<PrimaryButton
className="end-consultation"
onClick={() => onMeetingLeave(bookingDetail?._id)}
>
End Consultation
</PrimaryButton>
{items?.length == 2
? items?.find((el) => el?.id == "1")?.label
: items?.find((el) => el?.id == "2")?.label}
</div>
</div>
</div>

{bookingDetail && !isMobile && (
<ChatBox
selectedChat={{
_id: bookingDetail?.chat_id,
booking: bookingDetail,
}}
/>
)}
</div>
</div>
<ReportModal
open={showReportModal}
close={closeReportModal}
bookingId={bookingDetail?._id}
handleLogout={handleLogout}
/>
</>
);
};

export default Room;

 


Show less

Neatpad controller pairing issue. "Wrong account type"

Had a weird thing happen today. Did a codec swap from a mac to a pc and when reconfigured everything works with exception of one Neatpad that when I try various activations methods the Neatpad will sign in for a second then prompt a wrong account typ... Show more

Had a weird thing happen today. Did a codec swap from a mac to a pc and when reconfigured everything works with exception of one Neatpad that when I try various activations methods the Neatpad will sign in for a second then prompt a wrong account type error and sign out. It will pair to other rooms just not the one that I swapped the codec. There is an ipad that will pair as a controller though. Any thoughts?

 

Windows 11 , 64bit
6.2.7 (5001) , 64bit


Show less

reply-icon Latest Reply - 

Resolved! Zoom Rooms: Adjust for Low Lighting

Is this setting available for a Zoom Room? We have a conference that has a few dark spots near the camera. It'd be great to be able to turn on a setting similar to what's in the Background & Effects settings of the desktop app.

reply-icon Latest Reply - 

Zoom room control option disappeared on TC8 page

Dear Team,We have a integration of Extron/Poly TC8/G7500 device with Zoom Platform, recently we updated the OS/ Firmware version (6.1.0 to 6.2.6) of Poly devices in Zoom admin portal, after upgradation Room control option (Extron Control) had disappe... Show more

Dear Team,

We have a integration of Extron/Poly TC8/G7500 device with Zoom Platform, recently we updated the OS/ Firmware version (6.1.0 to 6.2.6) of Poly devices in Zoom admin portal, after upgradation Room control option (Extron Control) had disappeared from zoom home page of TC8.Now is any way we can downgrade it.??

With Regards,
Vikas

 


Show less

reply-icon Latest Reply - 

zoom admin portal equipment update

In the Zoom admin portal, under room management, when I select a Zoom room, I notice that equipment updates do not occur automatically. Even when I click on "Upgrade," it doesn't work. The only way to update is by connecting directly to the equipment... Show more

In the Zoom admin portal, under room management, when I select a Zoom room, I notice that equipment updates do not occur automatically. Even when I click on "Upgrade," it doesn't work. The only way to update is by connecting directly to the equipment.

Even after updating the equipment by connecting to it directly.

On the Zoom portal, the mentioned update has not been applied, and the equipment is still displayed with its previous update.


Show less

reply-icon Latest Reply - 

Picture in Picture On Zoom Room

I work at a TV station that also operates multiple PTZ cameras for board room meetings. There is the table for the boards, a podium, and a computer desk that we often switch between while having two picture-in-picture windows at the bottom left and b... Show more

I work at a TV station that also operates multiple PTZ cameras for board room meetings. There is the table for the boards, a podium, and a computer desk that we often switch between while having two picture-in-picture windows at the bottom left and bottom right corners so you can see the back and forth discussions while not having to switch the cameras constantly.

 

We are looking into doing Zoom Rooms so we have flexibility in terms of remotely covering the meetings, however we were told by the person looking to install the new setup that Zoom Rooms do not support picture-in-picture the way we do it now, but I understand that Zoom does updates to their software.

 

Is there native support for having picture-in-picture with Zoom Rooms the way I described? Otherwise, is there any third party software like a plug-in of some sort available that would support that kind of picture-in-picture?


Show less

reply-icon Latest Reply -