Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion front/src/config/i18n/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -2133,7 +2133,16 @@
"disabledWarningSettings": "Matter ist nicht aktiviert, bitte klicke auf den Button unten, um es zu aktivieren.",
"enableButton": "Matter aktivieren",
"disableButton": "Matter deaktivieren",
"downloadNodesJson": "Knoten-JSON herunterladen"
"downloadNodesJson": "Knoten-JSON herunterladen",
"reset": {
"title": "Integration zurücksetzen",
"description": "Verwende diese Option, wenn du mit Matter von vorne beginnen möchtest. Dadurch werden alle Controller-Daten, Backups und der Matter-Ordner gelöscht.",
"button": "Zurücksetzen",
"confirmMessage": "Achtung, das Zurücksetzen der Integration löscht alle Matter-Controller-Daten, Backups und den Matter-Ordner. Alle derzeit gekoppelten Matter-Geräte müssen erneut gekoppelt werden.",
"confirmButton": "Ja, alles zurücksetzen",
"cancelButton": "Abbrechen",
"error": "Beim Zurücksetzen der Integration ist ein Fehler aufgetreten."
}
},
"device": {
"title": "Matter-Geräte",
Expand Down
11 changes: 10 additions & 1 deletion front/src/config/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -2133,7 +2133,16 @@
"disabledWarningSettings": "Matter is not activated, please click on the button below to activate it.",
"enableButton": "Enable Matter",
"disableButton": "Disable Matter",
"downloadNodesJson": "Download Nodes JSON"
"downloadNodesJson": "Download Nodes JSON",
"reset": {
"title": "Reset Integration",
"description": "Use this option if you want to start from scratch with Matter. This will delete all controller data, backup, and Matter folder.",
"button": "Reset",
"confirmMessage": "Warning, resetting the integration will delete all Matter controller data, backup, and Matter folder. All Matter devices currently paired will need to be re-paired.",
"confirmButton": "Yes, reset everything",
"cancelButton": "Cancel",
"error": "An error occurred while resetting the integration."
}
},
"device": {
"title": "Matter Devices",
Expand Down
11 changes: 10 additions & 1 deletion front/src/config/i18n/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -2164,7 +2164,16 @@
"disabledWarningSettings": "Matter n'est pas activé, veuillez cliquer sur le bouton ci-dessous pour l'activer.",
"enableButton": "Activer Matter",
"disableButton": "Désactiver Matter",
"downloadNodesJson": "Télécharger Noeuds Matter en JSON"
"downloadNodesJson": "Télécharger Noeuds Matter en JSON",
"reset": {
"title": "Réinitialiser l'intégration",
"description": "Utilisez cette option si vous souhaitez repartir de zéro avec Matter. Cela supprimera toutes les données du contrôleur, la sauvegarde et le dossier Matter.",
"button": "Réinitialiser",
"confirmMessage": "Attention, la réinitialisation de l'intégration supprimera toutes les données du contrôleur Matter, la sauvegarde et le dossier Matter. Tous les appareils Matter actuellement appairés devront être ré-appairés.",
"confirmButton": "Oui, tout réinitialiser",
"cancelButton": "Annuler",
"error": "Une erreur est survenue lors de la réinitialisation de l'intégration."
}
}
},
"mcp": {
Expand Down
74 changes: 72 additions & 2 deletions front/src/routes/integration/all/matter/MatterSettingsPage.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,10 @@ class MatterSettingsPage extends Component {
loadingNodes: true,
decommissioningNodes: {},
collapsedDevices: {},
visibleKeys: {}
visibleKeys: {},
showConfirmReset: false,
resetting: false,
resetError: null
};
}

Expand Down Expand Up @@ -319,6 +322,29 @@ class MatterSettingsPage extends Component {
window.URL.revokeObjectURL(url);
};

showConfirmReset = () => {
this.setState({ showConfirmReset: true });
};

cancelReset = () => {
this.setState({ showConfirmReset: false });
};

confirmReset = async () => {
this.setState({ showConfirmReset: false, resetting: true, resetError: null });
try {
await this.props.httpClient.post('/api/v1/service/matter/reset');
this.setState({
resetting: false,
matterEnabled: false,
nodes: []
});
} catch (e) {
console.error(e);
this.setState({ resetting: false, resetError: true });
}
};

render() {
const {
matterEnabled,
Expand All @@ -330,7 +356,10 @@ class MatterSettingsPage extends Component {
decommissioningNodes,
collapsedDevices,
visibleKeys,
hasIpv6
hasIpv6,
showConfirmReset,
resetting,
resetError
} = this.state;

return (
Expand Down Expand Up @@ -464,6 +493,47 @@ class MatterSettingsPage extends Component {
<Text id="integration.matter.settings.disableButton" />
</button>
</div>

<div class="mt-5">
<h4>
<Text id="integration.matter.settings.reset.title" />
</h4>
<p class="text-muted">
<Text id="integration.matter.settings.reset.description" />
</p>

{resetError && (
<div class="alert alert-danger">
<Text id="integration.matter.settings.reset.error" />
</div>
)}

{!showConfirmReset && (
<button
class="btn btn-outline-danger"
onClick={this.showConfirmReset}
disabled={saving || resetting}
>
<Text id="integration.matter.settings.reset.button" />
</button>
)}

{showConfirmReset && (
<div class="d-flex flex-column align-items-start" style="row-gap: 1em">
<div class="alert alert-danger mb-0">
<Text id="integration.matter.settings.reset.confirmMessage" />
</div>
<div>
<button class="btn btn-danger" onClick={this.confirmReset} disabled={resetting}>
<Text id="integration.matter.settings.reset.confirmButton" />
</button>
<button class="btn ml-2" onClick={this.cancelReset} disabled={resetting}>
<Text id="integration.matter.settings.reset.cancelButton" />
</button>
</div>
</div>
)}
</div>
</>
)}
</div>
Expand Down
9 changes: 6 additions & 3 deletions server/lib/device/device.newStateEvent.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
const { NotFoundError } = require('../../utils/coreErrors');
const { DEVICE_FEATURE_CATEGORIES, DEVICE_FEATURE_TYPES } = require('../../utils/constants');
const logger = require('../../utils/logger');

Expand All @@ -15,11 +14,15 @@ const logger = require('../../utils/logger');
async function newStateEvent(event) {
const deviceFeature = this.stateManager.get('deviceFeatureByExternalId', event.device_feature_external_id);
if (deviceFeature === null) {
throw new NotFoundError(`DeviceFeature ${event.device_feature_external_id} not found`);
logger.info(
`DeviceFeature "${event.device_feature_external_id}" not found (or not added to Gladys), skipping state update.`,
);
return;
}
const device = this.stateManager.get('deviceById', deviceFeature.device_id);
if (device === null) {
throw new NotFoundError(`Device ${deviceFeature.device_id} not found`);
logger.info(`Device "${deviceFeature.device_id}" not found, skipping state update.`);
return;
}
try {
// If there is a "text" property in the even, we save as string
Expand Down
Loading
Loading