diff --git a/src/common/util/copy-clipboard.ts b/src/common/util/copy-clipboard.ts
index 9d7e6885fa65..1708858c85ac 100644
--- a/src/common/util/copy-clipboard.ts
+++ b/src/common/util/copy-clipboard.ts
@@ -1,4 +1,13 @@
-export const copyToClipboard = (str) => {
+export const copyToClipboard = async (str) => {
+ if (navigator.clipboard) {
+ try {
+ await navigator.clipboard.writeText(str);
+ return;
+ } catch {
+ // just continue with the fallback coding below
+ }
+ }
+
const el = document.createElement("textarea");
el.value = str;
document.body.appendChild(el);
diff --git a/src/panels/developer-tools/state/developer-tools-state.js b/src/panels/developer-tools/state/developer-tools-state.js
index 02f6e67ec21f..f85c81acea6c 100644
--- a/src/panels/developer-tools/state/developer-tools-state.js
+++ b/src/panels/developer-tools/state/developer-tools-state.js
@@ -13,8 +13,12 @@ import { EventsMixin } from "../../../mixins/events-mixin";
import LocalizeMixin from "../../../mixins/localize-mixin";
import "../../../styles/polymer-ha-style";
import { formatDateTimeWithSeconds } from "../../../common/datetime/format_date_time";
-import { mdiInformationOutline } from "@mdi/js";
+import {
+ mdiInformationOutline,
+ mdiClipboardTextMultipleOutline,
+} from "@mdi/js";
import { computeRTL } from "../../../common/util/compute_rtl";
+import { copyToClipboard } from "../../../common/util/copy-clipboard";
const ERROR_SENTINEL = {};
/*
@@ -205,6 +209,12 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) {
title="[[localize('ui.panel.developer-tools.tabs.states.more_info')]]"
path="[[informationOutlineIcon()]]"
>
+