fix: OpenRemote REST - gestion version If-Match pour PUT assets

- Récupère la version actuelle de l'asset avant PUT
- Ajoute la version au payload pour éviter HTTP 409 Conflict
- OpenRemote:  les assets sont mis à jour en temps réel
- MQTT OK: 3/4 (EMQX, Mosquitto, BunkerM)
This commit is contained in:
Eric FELIXINE
2026-05-11 14:56:27 -04:00
parent 918c03dffa
commit 8b87d95ca5

View File

@@ -797,13 +797,26 @@ def _or_put(asset_id: str, payload: dict) -> bool:
if not token: if not token:
return False return False
try: try:
# Récupérer la version actuelle de l'asset
get_url = f"{OR_URL}/api/{OR_REALM}/asset/{asset_id}"
get_req = urllib.request.Request(get_url, headers={"Authorization": f"Bearer {token}"})
version = 1
try:
with urllib.request.urlopen(get_req, timeout=5) as resp:
asset_data = json.loads(resp.read().decode())
version = asset_data.get("version", 1)
except:
pass # Si GET échoue, utiliser version=1
# Ajouter la version au payload
payload["version"] = version
body = json.dumps(payload).encode() body = json.dumps(payload).encode()
url = f"{OR_URL}/api/{OR_REALM}/asset/{asset_id}" url = f"{OR_URL}/api/{OR_REALM}/asset/{asset_id}"
req = urllib.request.Request(url, data=body, req = urllib.request.Request(url, data=body,
headers={ headers={
"Authorization": f"Bearer {token}", "Authorization": f"Bearer {token}",
"Content-Type": "application/json", "Content-Type": "application/json",
"If-Match": str(payload.get("version", 1)), "If-Match": str(version),
}, },
method="PUT") method="PUT")
with http_request_duration.labels(broker="openremote", method="PUT").time(): with http_request_duration.labels(broker="openremote", method="PUT").time():