From ac888d7331a3951e22994a6041cf7823cf8dad70 Mon Sep 17 00:00:00 2001 From: cyrilp Date: Mon, 13 May 2024 13:56:52 +0200 Subject: [PATCH 01/11] add aeraulic type --- custom_components/deltadore_tydom/tydom/MessageHandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/deltadore_tydom/tydom/MessageHandler.py b/custom_components/deltadore_tydom/tydom/MessageHandler.py index 57502db..5d7270f 100644 --- a/custom_components/deltadore_tydom/tydom/MessageHandler.py +++ b/custom_components/deltadore_tydom/tydom/MessageHandler.py @@ -292,7 +292,7 @@ async def get_device( return TydomSmoke( tydom_client, uid, device_id, name, last_usage, endpoint, device_metadata[uid], data ) - case "boiler" | "sh_hvac" | "electric": + case "boiler" | "sh_hvac" | "electric" | "aeraulic": return TydomBoiler( tydom_client, uid, device_id, name, last_usage, endpoint, device_metadata[uid], data ) From a25c126e7cac7772dd3b0c38b8ab7f578197fd5c Mon Sep 17 00:00:00 2001 From: cyrilp Date: Mon, 13 May 2024 13:57:38 +0200 Subject: [PATCH 02/11] add naviclim traces --- tools/traces-naviclim-atlantic.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 tools/traces-naviclim-atlantic.txt diff --git a/tools/traces-naviclim-atlantic.txt b/tools/traces-naviclim-atlantic.txt new file mode 100644 index 0000000..0b005b6 --- /dev/null +++ b/tools/traces-naviclim-atlantic.txt @@ -0,0 +1,11 @@ +HTTP/1.1 200 OK\r\nServer: Tydom-001A25066BBE\r\nUri-Origin: /ping\r\nContent-Type: application/json\r\nContent-Length: 0\r\nTransac-Id: 0\r\n\r\n +HTTP/1.1 200 OK\r\nServer: Tydom-001A25066BBE\r\nUri-Origin: /info\r\nContent-Type: application/json\r\nTransfer-Encoding: chunked\r\nTransac-Id: 0\r\n\r\n1\r\n{\r\n1C\r\n"productName": "TYDOM HOME",\r\n16\r\n"mac": "001A2503ACB0",\r\n11\r\n"config": "prod",\r\n12\r\n"bddEmpty": false,\r\nF\r\n"bddStatus": 0,\r\n10\r\n"apiMode": true,\r\n1C\r\n"mainVersionSW": "03.16.14",\r\n1C\r\n"mainVersionHW": "00.00.01",\r\n14\r\n"mainId": "6700116",\r\n1C\r\n"mainReference": "25170010",\r\n1B\r\n"keyVersionSW": "01.08.04",\r\n1E\r\n"zigbeeVersionSW": "01.01.00",\r\n1B\r\n"keyVersionHW": "00.00.01",\r\n1E\r\n"keyVersionStack": "04.02.06",\r\n1B\r\n"keyReference": "25170020",\r\n1E\r\n"zigbeeReference": "25170030",\r\n1D\r\n"oryxVersion": "2.1.8-10.02",\r\n38\r\n"bootReference": "P25170011", "bootVersion": "01.00.10",\r\nF\r\n"TYDOM.dat": 0,\r\n11\r\n"config.json": 0,\r\nE\r\n"mom.json": 0,\r\n11\r\n"gateway.dat": 0,\r\nF\r\n"bdd.json": 25,\r\n14\r\n"collect.json": 170,\r\n12\r\n"groups.json": 33,\r\n13\r\n"mom_api.json": 41,\r\n13\r\n"scenario.json": 6,\r\n11\r\n"site.json": 120,\r\n12\r\n"bdd_mig.json": 0,\r\n13\r\n"info_mig.json": 0,\r\n13\r\n"info_col.json": 1,\r\n13\r\n"absence.json": 22,\r\n13\r\n"anticip.json": 40,\r\n12\r\n"trigger.json": 6,\r\n12\r\n"bioclim.json": 0,\r\n16\r\n"data_config.json": 3,\r\n26\r\n"urlMediation": "mediation.tydom.com",\r\n15\r\n"pltRegistered":true,\r\n19\r\n"updateAvailable": false,\r\n17\r\n"passwordEmpty": false,\r\nF\r\n"maintenance":{\r\n28\r\n"id": "0000000000000000000000ff00000000"\r\n2\r\n},\r\nB\r\n"geoloc": {\r\n15\r\n"longitude": 2333333,\r\n14\r\n"latitude": 48866666\r\n2\r\n},\r\nA\r\n"clock": {\r\n25\r\n"clock": "2024-05-10T20:28:20+02:00",\r\n10\r\n"source": "ntp",\r\nF\r\n"timezone": 60,\r\n14\r\n"summerOffset": "ON"\r\n2\r\n},\r\nC\r\n"moments": {\r\nC\r\n"suspend": {\r\n7\r\n"to": 0\r\n3\r\n}},\r\nF\r\n"local_claim":{\r\n12\r\n"status": "CLOSE",\r\n24\r\n"lastAccess": "2014-01-01T00:00:00Z"\r\n2\r\n},\r\nC\r\n"weather": {\r\n22\r\n"outTempSrc":{"devId":0,"epId":0},\r\n28\r\n"weatherSrc":{"devId":0,"epId":16711680}\r\n2\r\n},\r\nE\r\n"protocols": [\r\n71\r\n{"protocol":"X3D", "available":true, "installed":true, "ready":true, "status":"running", "installStatus":"idle"},\r\n74\r\n{"protocol":"ZIGBEE", "available":true, "installed":true, "ready":true, "status":"running", "installStatus":"idle"},\r\n27\r\n{"protocol":"X3DV", "available":false},\r\n2D\r\n{"protocol":"PltService", "available":false},\r\n71\r\n{"protocol":"HTTP", "available":true, "installed":true, "ready":true, "status":"running", "installStatus":"idle"}\r\n1\r\n]\r\n1\r\n}\r\n0\r\n\r\n +HTTP/1.1 200 OK\r\nServer: Tydom-001A25066BBE\r\nUri-Origin: /groups/file\r\nContent-Type: application/json\r\nContent-Length: 1051\r\nTransac-Id: 0\r\nFile-Version: 33\r\n\r\n{"groups":[{"areas":[],"devices":[],"id":1851415931},{"id":1022165148,"devices":[{"endpoints":[{"id":0}],"id":9},{"endpoints":[{"id":1670688808}],"id":1670688808},{"endpoints":[{"id":0}],"id":10},{"id":8,"endpoints":[{"id":0}]},{"id":1670689449,"endpoints":[{"id":1670689449}]},{"endpoints":[{"id":1670688732}],"id":1670688732},{"id":1670689697,"endpoints":[{"id":1670689697}]},{"endpoints":[{"id":1670689384}],"id":1670689384},{"id":1670689519,"endpoints":[{"id":1670689519}]}],"areas":[]},{"devices":[],"areas":[],"id":45675624},{"areas":[],"devices":[],"id":2117250291},{"devices":[{"id":1670688808,"endpoints":[{"id":1670688808}]},{"endpoints":[{"id":1670688732}],"id":1670688732},{"id":10,"endpoints":[{"id":0}]},{"endpoints":[{"id":0}],"id":9},{"endpoints":[{"id":1670689519}],"id":1670689519}],"areas":[],"id":565713470},{"id":854245770,"devices":[{"id":1670689449,"endpoints":[{"id":1670689449}]},{"endpoints":[{"id":1670689697}],"id":1670689697},{"id":8,"endpoints":[{"id":0}]},{"id":1670689384,"endpoints":[{"id":1670689384}]}],"areas":[]}]} +HTTP/1.1 200 OK\r\nServer: Tydom-001A25066BBE\r\nUri-Origin: /refresh/all\r\nContent-Type: application/json\r\nContent-Length: 0\r\nTransac-Id: 0\r\n\r\n +HTTP/1.1 200 OK\r\nServer: Tydom-001A25066BBE\r\nUri-Origin: /configs/file\r\nContent-Type: application/json\r\nContent-Length: 3290\r\nTransac-Id: 0\r\nFile-Version: 120\r\n\r\n{"version_application":"4.13.1 (1025)","groups":[{"is_group_user":false,"usage":"light","name":"TOTAL","group_all":true,"id":1851415931,"picto":"picto_lamp"},{"name":"TOTAL","group_all":true,"usage":"shutter","id":1022165148,"is_group_user":false,"picto":"picto_shutter"},{"picto":"picto_awning_awning","id":45675624,"usage":"awning","is_group_user":false,"name":"TOTAL","group_all":true},{"id":2117250291,"is_group_user":false,"usage":"plug","group_all":true,"name":"TOTAL","picto":"picto_smartplug"},{"is_group_user":true,"picto":"picto_shutter","id":565713470,"usage":"shutter","group_all":false,"name":"Volets du RDC"},{"usage":"shutter","id":854245770,"name":"Volets de lXXXXXtage","group_all":false,"picto":"picto_shutter","is_group_user":true}],"version":"1.0.1","camera_install_date":0,"zigbee_networks":[{"is_connected":true,"extended_pan_id":"0x6FBC1A3463A448F2","name":"RXXseau Zigbee","type":"coordinator"}],"os":"ios","endpoints":[{"name":"Chauffage du haut","anticipation_start":false,"first_usage":"hvac","last_usage":"boiler","id_device":0,"picto":"picto_radiator","id_endpoint":0},{"first_usage":"shutter","picto":"picto_shutter","anticipation_start":false,"id_endpoint":0,"last_usage":"shutter","id_device":8,"name":"Volet chambre parent"},{"last_usage":"shutter","picto":"picto_shutter","anticipation_start":false,"name":"Volet cuisine","id_device":9,"id_endpoint":0,"first_usage":"shutter"},{"name":"Volet salon terrasse","picto":"picto_shutter","id_device":10,"anticipation_start":false,"last_usage":"shutter","first_usage":"shutter","id_endpoint":0},{"first_usage":"shutter","last_usage":"shutter","name":"Volet salon entrXXe","id_endpoint":1670688732,"id_device":1670688732,"picto":"picto_shutter","anticipation_start":false},{"last_usage":"shutter","id_endpoint":1670688808,"first_usage":"shutter","picto":"picto_shutter","anticipation_start":false,"id_device":1670688808,"name":"Volet cuisine garage"},{"id_endpoint":1670689384,"first_usage":"shutter","picto":"picto_shutter","id_device":1670689384,"anticipation_start":false,"name":"Volet chambre dXXXelie","last_usage":"shutter"},{"first_usage":"shutter","id_device":1670689449,"id_endpoint":1670689449,"picto":"picto_shutter","last_usage":"shutter","anticipation_start":false,"name":"Volet bureau"},{"last_usage":"shutter","id_device":1670689519,"picto":"picto_shutter","name":"Volet salon arriXXre","id_endpoint":1670689519,"first_usage":"shutter","anticipation_start":false},{"last_usage":"shutter","picto":"picto_shutter","first_usage":"shutter","anticipation_start":false,"id_device":1670689697,"id_endpoint":1670689697,"name":"Volet chambre dXXXamis"},{"anticipation_start":false,"name":"XXquipement non gXXrXX","picto":"","last_usage":"","first_usage":"","id_device":1670690842,"id_endpoint":1670690842},{"last_usage":"aeraulic","id_device":1711649289,"first_usage":"hvac","id_endpoint":1711649289,"name":"Clim du bas","picto":"picto_climatisation","anticipation_start":false,"widget_behavior":{"tutorial_id":"split_takao_type_2"}}],"id_catalog":"F2BD90F93B888DA02C54980F11AE4796DFCC98F447CD3FE326F5A3A964C939BF","date":1714600420,"old_tycam":false,"scenarios":[],"moments":[{"name":"Couper la Clim","id":1039849051,"color":13587247},{"id":1904552856,"name":"Rallumer la Clim","color":4100464}],"areas":[]} +HTTP/1.1 200 OK\r\nServer: Tydom-001A25066BBE\r\nUri-Origin: /devices/meta\r\nContent-Type: application/json\r\nTransfer-Encoding: chunked\r\nTransac-Id: 0\r\n\r\nAB\r\n[{"id":0,"endpoints":[{"id":0,"error":0,"metadata":[{"name":"authorization","type":"string","permission":"rw","validity":"STATUS_POLLING","enum_values":["STOP","HEATING"]}\r\n6F\r\n,{"name":"comfortMode","type":"string","permission":"w","validity":"INFINITE","enum_values":["STOP","HEATING"]}\r\n86\r\n,{"name":"setpoint","type":"numeric","permission":"rw","validity":"DATA_POLLING","min":10.000,"max":30.000,"step":0.500,"unit":"degC"}\r\n6B\r\n,{"name":"thermicLevel","type":"string","permission":"rw","validity":"DATA_POLLING","enum_values":["STOP"]}\r\n86\r\n,{"name":"delaySetpoint","type":"numeric","permission":"w","validity":"INFINITE","min":10.000,"max":30.000,"step":0.500,"unit":"degC"}\r\n6B\r\n,{"name":"delayThermicLevel","type":"string","permission":"w","validity":"INFINITE","enum_values":["STOP"]}\r\n7D\r\n,{"name":"hvacMode","type":"string","permission":"rw","validity":"DATA_POLLING","enum_values":["NORMAL","STOP","ANTI_FROST"]}\r\n80\r\n,{"name":"timeDelay","type":"numeric","permission":"rw","validity":"TIMER_POLLING","min":0,"max":65535,"step":1,"unit":"minute"}\r\n8B\r\n,{"name":"temperature","type":"numeric","permission":"r","validity":"SENSOR_POLLING","min":-99.900,"max":99.900,"step":0.010,"unit":"degC"}\r\n62\r\n,{"name":"tempoOn","type":"boolean","permission":"r","validity":"STATUS_POLLING","unit":"boolean"}\r\n66\r\n,{"name":"antifrostOn","type":"boolean","permission":"r","validity":"STATUS_POLLING","unit":"boolean"}\r\n69\r\n,{"name":"loadSheddingOn","type":"boolean","permission":"r","validity":"STATUS_POLLING","unit":"boolean"}\r\n6A\r\n,{"name":"openingDetected","type":"boolean","permission":"r","validity":"STATUS_POLLING","unit":"boolean"}\r\n6B\r\n,{"name":"presenceDetected","type":"boolean","permission":"r","validity":"STATUS_POLLING","unit":"boolean"}\r\n62\r\n,{"name":"absence","type":"boolean","permission":"r","validity":"STATUS_POLLING","unit":"boolean"}\r\n6B\r\n,{"name":"productionDefect","type":"boolean","permission":"r","validity":"STATUS_POLLING","unit":"boolean"}\r\n6B\r\n,{"name":"batteryCmdDefect","type":"boolean","permission":"r","validity":"STATUS_POLLING","unit":"boolean"}\r\n6B\r\n,{"name":"tempSensorDefect","type":"boolean","permission":"r","validity":"STATUS_POLLING","unit":"boolean"}\r\n6D\r\n,{"name":"tempSensorShortCut","type":"boolean","permission":"r","validity":"STATUS_POLLING","unit":"boolean"}\r\n6D\r\n,{"name":"tempSensorOpenCirc","type":"boolean","permission":"r","validity":"STATUS_POLLING","unit":"boolean"}\r\n63\r\n,{"name":"boostOn","type":"boolean","permission":"rw","validity":"STATUS_POLLING","unit":"boolean"}\r\n67\r\n,{"name":"localisation","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n63\r\n,{"name":"modeAsso","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n7E\r\n,{"name":"anticipCoeff","type":"numeric","permission":"r","validity":"INFINITE","min":0,"max":65534,"step":1,"unit":"min/deg"}\r\nD4\r\n]}]},{"id":8,"endpoints":[{"id":0,"error":0,"metadata":[{"name":"positionCmd","type":"string","permission":"w","validity":"INFINITE","enum_values":["DOWN","UP","STOP","FAVORIT1","FAVORIT2","UP_SLOW","DOWN_SLOW"]}\r\n68\r\n,{"name":"thermicDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n79\r\n,{"name":"position","type":"numeric","permission":"rw","validity":"ES_SUPERVISION","min":0,"max":100,"step":1,"unit":"%"}\r\n6F\r\n,{"name":"recFav","type":"string","permission":"w","validity":"INFINITE","enum_values":["FAVORIT1","FAVORIT2"]}\r\n63\r\n,{"name":"onFavPos","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n63\r\n,{"name":"upDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"downDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n69\r\n,{"name":"obstacleDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n64\r\n,{"name":"intrusion","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"battDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n67\r\n,{"name":"localisation","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n63\r\n,{"name":"modeAsso","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n78\r\n,{"name":"jobsMP","type":"numeric","permission":"r","validity":"INFINITE","min":0,"max":4294967294,"step":1,"unit":"NA"}\r\n69\r\n,{"name":"softVersion","type":"string","permission":"r","validity":"INFINITE","enum_values":["XX.YY.ZZ"]}\r\n69\r\n,{"name":"softPlan","type":"string","permission":"r","validity":"INFINITE","enum_values":["WW.XX.YY.ZZ"]}\r\n60\r\n,{"name":"reset","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\nD4\r\n]}]},{"id":9,"endpoints":[{"id":0,"error":0,"metadata":[{"name":"positionCmd","type":"string","permission":"w","validity":"INFINITE","enum_values":["DOWN","UP","STOP","FAVORIT1","FAVORIT2","UP_SLOW","DOWN_SLOW"]}\r\n68\r\n,{"name":"thermicDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n79\r\n,{"name":"position","type":"numeric","permission":"rw","validity":"ES_SUPERVISION","min":0,"max":100,"step":1,"unit":"%"}\r\n6F\r\n,{"name":"recFav","type":"string","permission":"w","validity":"INFINITE","enum_values":["FAVORIT1","FAVORIT2"]}\r\n63\r\n,{"name":"onFavPos","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n63\r\n,{"name":"upDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"downDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n69\r\n,{"name":"obstacleDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n64\r\n,{"name":"intrusion","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"battDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n67\r\n,{"name":"localisation","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n63\r\n,{"name":"modeAsso","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n78\r\n,{"name":"jobsMP","type":"numeric","permission":"r","validity":"INFINITE","min":0,"max":4294967294,"step":1,"unit":"NA"}\r\n69\r\n,{"name":"softVersion","type":"string","permission":"r","validity":"INFINITE","enum_values":["XX.YY.ZZ"]}\r\n69\r\n,{"name":"softPlan","type":"string","permission":"r","validity":"INFINITE","enum_values":["WW.XX.YY.ZZ"]}\r\n60\r\n,{"name":"reset","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\nD5\r\n]}]},{"id":10,"endpoints":[{"id":0,"error":0,"metadata":[{"name":"positionCmd","type":"string","permission":"w","validity":"INFINITE","enum_values":["DOWN","UP","STOP","FAVORIT1","FAVORIT2","UP_SLOW","DOWN_SLOW"]}\r\n68\r\n,{"name":"thermicDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n79\r\n,{"name":"position","type":"numeric","permission":"rw","validity":"ES_SUPERVISION","min":0,"max":100,"step":1,"unit":"%"}\r\n6F\r\n,{"name":"recFav","type":"string","permission":"w","validity":"INFINITE","enum_values":["FAVORIT1","FAVORIT2"]}\r\n63\r\n,{"name":"onFavPos","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n63\r\n,{"name":"upDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"downDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n69\r\n,{"name":"obstacleDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n64\r\n,{"name":"intrusion","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"battDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n67\r\n,{"name":"localisation","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n63\r\n,{"name":"modeAsso","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n78\r\n,{"name":"jobsMP","type":"numeric","permission":"r","validity":"INFINITE","min":0,"max":4294967294,"step":1,"unit":"NA"}\r\n69\r\n,{"name":"softVersion","type":"string","permission":"r","validity":"INFINITE","enum_values":["XX.YY.ZZ"]}\r\n69\r\n,{"name":"softPlan","type":"string","permission":"r","validity":"INFINITE","enum_values":["WW.XX.YY.ZZ"]}\r\n60\r\n,{"name":"reset","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\nE6\r\n]}]},{"id":1670688732,"endpoints":[{"id":1670688732,"error":0,"metadata":[{"name":"positionCmd","type":"string","permission":"w","validity":"INFINITE","enum_values":["DOWN","UP","STOP","FAVORIT1","FAVORIT2","UP_SLOW","DOWN_SLOW"]}\r\n68\r\n,{"name":"thermicDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n79\r\n,{"name":"position","type":"numeric","permission":"rw","validity":"ES_SUPERVISION","min":0,"max":100,"step":1,"unit":"%"}\r\n6F\r\n,{"name":"recFav","type":"string","permission":"w","validity":"INFINITE","enum_values":["FAVORIT1","FAVORIT2"]}\r\n63\r\n,{"name":"onFavPos","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n63\r\n,{"name":"upDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"downDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n69\r\n,{"name":"obstacleDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n64\r\n,{"name":"intrusion","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"battDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n67\r\n,{"name":"localisation","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n63\r\n,{"name":"modeAsso","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n78\r\n,{"name":"jobsMP","type":"numeric","permission":"r","validity":"INFINITE","min":0,"max":4294967294,"step":1,"unit":"NA"}\r\n69\r\n,{"name":"softVersion","type":"string","permission":"r","validity":"INFINITE","enum_values":["XX.YY.ZZ"]}\r\n69\r\n,{"name":"softPlan","type":"string","permission":"r","validity":"INFINITE","enum_values":["WW.XX.YY.ZZ"]}\r\n60\r\n,{"name":"reset","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\nE6\r\n]}]},{"id":1670688808,"endpoints":[{"id":1670688808,"error":0,"metadata":[{"name":"positionCmd","type":"string","permission":"w","validity":"INFINITE","enum_values":["DOWN","UP","STOP","FAVORIT1","FAVORIT2","UP_SLOW","DOWN_SLOW"]}\r\n68\r\n,{"name":"thermicDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n79\r\n,{"name":"position","type":"numeric","permission":"rw","validity":"ES_SUPERVISION","min":0,"max":100,"step":1,"unit":"%"}\r\n6F\r\n,{"name":"recFav","type":"string","permission":"w","validity":"INFINITE","enum_values":["FAVORIT1","FAVORIT2"]}\r\n63\r\n,{"name":"onFavPos","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n63\r\n,{"name":"upDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"downDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n69\r\n,{"name":"obstacleDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n64\r\n,{"name":"intrusion","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"battDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n67\r\n,{"name":"localisation","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n63\r\n,{"name":"modeAsso","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n78\r\n,{"name":"jobsMP","type":"numeric","permission":"r","validity":"INFINITE","min":0,"max":4294967294,"step":1,"unit":"NA"}\r\n69\r\n,{"name":"softVersion","type":"string","permission":"r","validity":"INFINITE","enum_values":["XX.YY.ZZ"]}\r\n69\r\n,{"name":"softPlan","type":"string","permission":"r","validity":"INFINITE","enum_values":["WW.XX.YY.ZZ"]}\r\n60\r\n,{"name":"reset","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\nE6\r\n]}]},{"id":1670689384,"endpoints":[{"id":1670689384,"error":0,"metadata":[{"name":"positionCmd","type":"string","permission":"w","validity":"INFINITE","enum_values":["DOWN","UP","STOP","FAVORIT1","FAVORIT2","UP_SLOW","DOWN_SLOW"]}\r\n68\r\n,{"name":"thermicDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n79\r\n,{"name":"position","type":"numeric","permission":"rw","validity":"ES_SUPERVISION","min":0,"max":100,"step":1,"unit":"%"}\r\n6F\r\n,{"name":"recFav","type":"string","permission":"w","validity":"INFINITE","enum_values":["FAVORIT1","FAVORIT2"]}\r\n63\r\n,{"name":"onFavPos","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n63\r\n,{"name":"upDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"downDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n69\r\n,{"name":"obstacleDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n64\r\n,{"name":"intrusion","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"battDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n67\r\n,{"name":"localisation","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n63\r\n,{"name":"modeAsso","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n78\r\n,{"name":"jobsMP","type":"numeric","permission":"r","validity":"INFINITE","min":0,"max":4294967294,"step":1,"unit":"NA"}\r\n69\r\n,{"name":"softVersion","type":"string","permission":"r","validity":"INFINITE","enum_values":["XX.YY.ZZ"]}\r\n69\r\n,{"name":"softPlan","type":"string","permission":"r","validity":"INFINITE","enum_values":["WW.XX.YY.ZZ"]}\r\n60\r\n,{"name":"reset","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\nE6\r\n]}]},{"id":1670689449,"endpoints":[{"id":1670689449,"error":0,"metadata":[{"name":"positionCmd","type":"string","permission":"w","validity":"INFINITE","enum_values":["DOWN","UP","STOP","FAVORIT1","FAVORIT2","UP_SLOW","DOWN_SLOW"]}\r\n68\r\n,{"name":"thermicDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n79\r\n,{"name":"position","type":"numeric","permission":"rw","validity":"ES_SUPERVISION","min":0,"max":100,"step":1,"unit":"%"}\r\n6F\r\n,{"name":"recFav","type":"string","permission":"w","validity":"INFINITE","enum_values":["FAVORIT1","FAVORIT2"]}\r\n63\r\n,{"name":"onFavPos","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n63\r\n,{"name":"upDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"downDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n69\r\n,{"name":"obstacleDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n64\r\n,{"name":"intrusion","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"battDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n67\r\n,{"name":"localisation","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n63\r\n,{"name":"modeAsso","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n78\r\n,{"name":"jobsMP","type":"numeric","permission":"r","validity":"INFINITE","min":0,"max":4294967294,"step":1,"unit":"NA"}\r\n69\r\n,{"name":"softVersion","type":"string","permission":"r","validity":"INFINITE","enum_values":["XX.YY.ZZ"]}\r\n69\r\n,{"name":"softPlan","type":"string","permission":"r","validity":"INFINITE","enum_values":["WW.XX.YY.ZZ"]}\r\n60\r\n,{"name":"reset","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\nE6\r\n]}]},{"id":1670689519,"endpoints":[{"id":1670689519,"error":0,"metadata":[{"name":"positionCmd","type":"string","permission":"w","validity":"INFINITE","enum_values":["DOWN","UP","STOP","FAVORIT1","FAVORIT2","UP_SLOW","DOWN_SLOW"]}\r\n68\r\n,{"name":"thermicDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n79\r\n,{"name":"position","type":"numeric","permission":"rw","validity":"ES_SUPERVISION","min":0,"max":100,"step":1,"unit":"%"}\r\n6F\r\n,{"name":"recFav","type":"string","permission":"w","validity":"INFINITE","enum_values":["FAVORIT1","FAVORIT2"]}\r\n63\r\n,{"name":"onFavPos","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n63\r\n,{"name":"upDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"downDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n69\r\n,{"name":"obstacleDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n64\r\n,{"name":"intrusion","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"battDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n67\r\n,{"name":"localisation","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n63\r\n,{"name":"modeAsso","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n78\r\n,{"name":"jobsMP","type":"numeric","permission":"r","validity":"INFINITE","min":0,"max":4294967294,"step":1,"unit":"NA"}\r\n69\r\n,{"name":"softVersion","type":"string","permission":"r","validity":"INFINITE","enum_values":["XX.YY.ZZ"]}\r\n69\r\n,{"name":"softPlan","type":"string","permission":"r","validity":"INFINITE","enum_values":["WW.XX.YY.ZZ"]}\r\n60\r\n,{"name":"reset","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\nE6\r\n]}]},{"id":1670689697,"endpoints":[{"id":1670689697,"error":0,"metadata":[{"name":"positionCmd","type":"string","permission":"w","validity":"INFINITE","enum_values":["DOWN","UP","STOP","FAVORIT1","FAVORIT2","UP_SLOW","DOWN_SLOW"]}\r\n68\r\n,{"name":"thermicDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n79\r\n,{"name":"position","type":"numeric","permission":"rw","validity":"ES_SUPERVISION","min":0,"max":100,"step":1,"unit":"%"}\r\n6F\r\n,{"name":"recFav","type":"string","permission":"w","validity":"INFINITE","enum_values":["FAVORIT1","FAVORIT2"]}\r\n63\r\n,{"name":"onFavPos","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n63\r\n,{"name":"upDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"downDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n69\r\n,{"name":"obstacleDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n64\r\n,{"name":"intrusion","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n65\r\n,{"name":"battDefect","type":"boolean","permission":"r","validity":"ES_SUPERVISION","unit":"boolean"}\r\n67\r\n,{"name":"localisation","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n63\r\n,{"name":"modeAsso","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n78\r\n,{"name":"jobsMP","type":"numeric","permission":"r","validity":"INFINITE","min":0,"max":4294967294,"step":1,"unit":"NA"}\r\n69\r\n,{"name":"softVersion","type":"string","permission":"r","validity":"INFINITE","enum_values":["XX.YY.ZZ"]}\r\n69\r\n,{"name":"softPlan","type":"string","permission":"r","validity":"INFINITE","enum_values":["WW.XX.YY.ZZ"]}\r\n60\r\n,{"name":"reset","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\nB1\r\n]}]},{"id":1670690842,"endpoints":[{"id":1670690842,"error":15,"metadata":[{"name":"localisation","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n63\r\n,{"name":"modeAsso","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\nBE\r\n]}]},{"id":1711649289,"endpoints":[{"id":1711649289,"error":0,"metadata":[{"name":"zclVersion","type":"numeric","permission":"r","validity":"INFINITE","min":0,"max":254,"step":1,"unit":"NA"}\r\n59\r\n,{"name":"manufacturer","type":"string","permission":"r","validity":"INFINITE","size":32}\r\n67\r\n,{"name":"localisation","type":"string","permission":"w","validity":"INFINITE","enum_values":["START"]}\r\n92\r\n,{"name":"ambientTemperature","type":"numeric","permission":"r","validity":"ES_SUPERVISION","min":-99.900,"max":99.900,"step":0.010,"unit":"degC"}\r\n8B\r\n,{"name":"coolSetpoint","type":"numeric","permission":"rw","validity":"ES_SUPERVISION","min":7.000,"max":32.000,"step":0.500,"unit":"degC"}\r\n8D\r\n,{"name":"minCoolSetpoint","type":"numeric","permission":"r","validity":"ES_SUPERVISION","min":7.000,"max":32.000,"step":0.500,"unit":"degC"}\r\n8D\r\n,{"name":"maxCoolSetpoint","type":"numeric","permission":"r","validity":"ES_SUPERVISION","min":7.000,"max":32.000,"step":0.500,"unit":"degC"}\r\n87\r\n,{"name":"setpoint","type":"numeric","permission":"rw","validity":"ES_SUPERVISION","min":7.000,"max":32.000,"step":0.500,"unit":"degC"}\r\n89\r\n,{"name":"minSetpoint","type":"numeric","permission":"r","validity":"ES_SUPERVISION","min":7.000,"max":32.000,"step":0.500,"unit":"degC"}\r\n89\r\n,{"name":"maxSetpoint","type":"numeric","permission":"r","validity":"ES_SUPERVISION","min":7.000,"max":32.000,"step":0.500,"unit":"degC"}\r\n8B\r\n,{"name":"heatSetpoint","type":"numeric","permission":"rw","validity":"ES_SUPERVISION","min":7.000,"max":32.000,"step":0.500,"unit":"degC"}\r\n8D\r\n,{"name":"minHeatSetpoint","type":"numeric","permission":"r","validity":"ES_SUPERVISION","min":7.000,"max":32.000,"step":0.500,"unit":"degC"}\r\n8D\r\n,{"name":"maxHeatSetpoint","type":"numeric","permission":"r","validity":"ES_SUPERVISION","min":7.000,"max":32.000,"step":0.500,"unit":"degC"}\r\n82\r\n,{"name":"comfortMode","type":"string","permission":"w","validity":"DATA_POLLING_5MIN","enum_values":["STOP","HEATING","COOLING"]}\r\nA2\r\n,{"name":"authorization","type":"string","permission":"r","validity":"DATA_POLLING_5MIN","enum_values":["STOP","HEATING","COOLING","AUTO","VENTILATING","DRYING"]}\r\n67\r\n,{"name":"thermicLevel","type":"string","permission":"rw","validity":"INFINITE","enum_values":["STOP"]}\r\n75\r\n,{"name":"speed","type":"numeric","permission":"rw","validity":"ES_SUPERVISION","min":1,"max":3,"step":1,"unit":"NA"}\r\n6C\r\n,{"name":"speedString","type":"string","permission":"rw","validity":"ES_SUPERVISION","enum_values":["AUTO"]}\r\n85\r\n,{"name":"anticipCoeff","type":"numeric","permission":"r","validity":"INFINITE","min":0,"max":65534,"step":1,"unit":"min/deg"}]}]}]\r\n\r\n0\r\n\r\n +HTTP/1.1 200 OK\r\nServer: Tydom-001A25066BBE\r\nUri-Origin: /devices/cmeta\r\nContent-Type: application/json\r\nTransfer-Encoding: chunked\r\nTransac-Id: 0\r\n\r\n34\r\n[{"id":0,"endpoints":[{"id":0,"error":0,"cmetadata":\r\n39\r\n[]}]},{"id":8,"endpoints":[{"id":0,"error":0,"cmetadata":\r\n39\r\n[]}]},{"id":9,"endpoints":[{"id":0,"error":0,"cmetadata":\r\n3A\r\n[]}]},{"id":10,"endpoints":[{"id":0,"error":0,"cmetadata":\r\n4B\r\n[]}]},{"id":1670688732,"endpoints":[{"id":1670688732,"error":0,"cmetadata":\r\n4B\r\n[]}]},{"id":1670688808,"endpoints":[{"id":1670688808,"error":0,"cmetadata":\r\n4B\r\n[]}]},{"id":1670689384,"endpoints":[{"id":1670689384,"error":0,"cmetadata":\r\n4B\r\n[]}]},{"id":1670689449,"endpoints":[{"id":1670689449,"error":0,"cmetadata":\r\n4B\r\n[]}]},{"id":1670689519,"endpoints":[{"id":1670689519,"error":0,"cmetadata":\r\n4B\r\n[]}]},{"id":1670689697,"endpoints":[{"id":1670689697,"error":0,"cmetadata":\r\n4C\r\n[]}]},{"id":1670690842,"endpoints":[{"id":1670690842,"error":15,"cmetadata":\r\n53\r\n[]}]},{"id":1711649289,"endpoints":[{"id":1711649289,"error":0,"cmetadata":[]}]}]\r\n\r\n0\r\n\r\n +HTTP/1.1 200 OK\r\nServer: Tydom-001A25066BBE\r\nUri-Origin: /devices/data\r\nContent-Type: application/json\r\nTransfer-Encoding: chunked\r\nTransac-Id: 0\r\n\r\n70\r\n[{"id":0,"endpoints":[{"id":0,"error":0,"data":[{"name":"authorization","validity":"upToDate","value":"HEATING"}\r\n39\r\n,{"name":"setpoint","validity":"upToDate","value":21.000}\r\n3B\r\n,{"name":"thermicLevel","validity":"upToDate","value":null}\r\n3B\r\n,{"name":"hvacMode","validity":"upToDate","value":"NORMAL"}\r\n35\r\n,{"name":"timeDelay","validity":"upToDate","value":0}\r\n3C\r\n,{"name":"temperature","validity":"upToDate","value":24.300}\r\n37\r\n,{"name":"tempoOn","validity":"upToDate","value":false}\r\n3B\r\n,{"name":"antifrostOn","validity":"upToDate","value":false}\r\n3E\r\n,{"name":"loadSheddingOn","validity":"upToDate","value":false}\r\n3F\r\n,{"name":"openingDetected","validity":"upToDate","value":false}\r\n40\r\n,{"name":"presenceDetected","validity":"upToDate","value":false}\r\n37\r\n,{"name":"absence","validity":"upToDate","value":false}\r\n40\r\n,{"name":"productionDefect","validity":"upToDate","value":false}\r\n40\r\n,{"name":"batteryCmdDefect","validity":"upToDate","value":false}\r\n40\r\n,{"name":"tempSensorDefect","validity":"upToDate","value":false}\r\n42\r\n,{"name":"tempSensorShortCut","validity":"upToDate","value":false}\r\n42\r\n,{"name":"tempSensorOpenCirc","validity":"upToDate","value":false}\r\n37\r\n,{"name":"boostOn","validity":"upToDate","value":false}\r\n39\r\n,{"name":"anticipCoeff","validity":"upToDate","value":30}\r\n33\r\n]}]},{"id":8,"endpoints":[{"id":0,"error":0,"data":\r\n3D\r\n[{"name":"thermicDefect","validity":"upToDate","value":false}\r\n36\r\n,{"name":"position","validity":"upToDate","value":100}\r\n38\r\n,{"name":"onFavPos","validity":"upToDate","value":false}\r\n38\r\n,{"name":"upDefect","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"downDefect","validity":"upToDate","value":false}\r\n3E\r\n,{"name":"obstacleDefect","validity":"upToDate","value":false}\r\n39\r\n,{"name":"intrusion","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"battDefect","validity":"upToDate","value":false}\r\n34\r\n,{"name":"jobsMP","validity":"upToDate","value":536}\r\n40\r\n,{"name":"softVersion","validity":"upToDate","value":"02.05.02"}\r\n40\r\n,{"name":"softPlan","validity":"upToDate","value":"21.40.00.10"}\r\n33\r\n]}]},{"id":9,"endpoints":[{"id":0,"error":0,"data":\r\n3D\r\n[{"name":"thermicDefect","validity":"upToDate","value":false}\r\n35\r\n,{"name":"position","validity":"upToDate","value":40}\r\n38\r\n,{"name":"onFavPos","validity":"upToDate","value":false}\r\n38\r\n,{"name":"upDefect","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"downDefect","validity":"upToDate","value":false}\r\n3E\r\n,{"name":"obstacleDefect","validity":"upToDate","value":false}\r\n39\r\n,{"name":"intrusion","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"battDefect","validity":"upToDate","value":false}\r\n34\r\n,{"name":"jobsMP","validity":"upToDate","value":536}\r\n40\r\n,{"name":"softVersion","validity":"upToDate","value":"02.05.02"}\r\n40\r\n,{"name":"softPlan","validity":"upToDate","value":"21.40.00.10"}\r\n34\r\n]}]},{"id":10,"endpoints":[{"id":0,"error":0,"data":\r\n3D\r\n[{"name":"thermicDefect","validity":"upToDate","value":false}\r\n36\r\n,{"name":"position","validity":"upToDate","value":100}\r\n38\r\n,{"name":"onFavPos","validity":"upToDate","value":false}\r\n38\r\n,{"name":"upDefect","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"downDefect","validity":"upToDate","value":false}\r\n3E\r\n,{"name":"obstacleDefect","validity":"upToDate","value":false}\r\n39\r\n,{"name":"intrusion","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"battDefect","validity":"upToDate","value":false}\r\n34\r\n,{"name":"jobsMP","validity":"upToDate","value":536}\r\n40\r\n,{"name":"softVersion","validity":"upToDate","value":"02.05.02"}\r\n40\r\n,{"name":"softPlan","validity":"upToDate","value":"21.40.00.10"}\r\n45\r\n]}]},{"id":1670688732,"endpoints":[{"id":1670688732,"error":0,"data":\r\n3D\r\n[{"name":"thermicDefect","validity":"upToDate","value":false}\r\n36\r\n,{"name":"position","validity":"upToDate","value":100}\r\n38\r\n,{"name":"onFavPos","validity":"upToDate","value":false}\r\n38\r\n,{"name":"upDefect","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"downDefect","validity":"upToDate","value":false}\r\n3E\r\n,{"name":"obstacleDefect","validity":"upToDate","value":false}\r\n39\r\n,{"name":"intrusion","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"battDefect","validity":"upToDate","value":false}\r\n34\r\n,{"name":"jobsMP","validity":"upToDate","value":536}\r\n40\r\n,{"name":"softVersion","validity":"upToDate","value":"02.05.02"}\r\n40\r\n,{"name":"softPlan","validity":"upToDate","value":"21.40.00.10"}\r\n45\r\n]}]},{"id":1670688808,"endpoints":[{"id":1670688808,"error":0,"data":\r\n3D\r\n[{"name":"thermicDefect","validity":"upToDate","value":false}\r\n36\r\n,{"name":"position","validity":"upToDate","value":100}\r\n38\r\n,{"name":"onFavPos","validity":"upToDate","value":false}\r\n38\r\n,{"name":"upDefect","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"downDefect","validity":"upToDate","value":false}\r\n3E\r\n,{"name":"obstacleDefect","validity":"upToDate","value":false}\r\n39\r\n,{"name":"intrusion","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"battDefect","validity":"upToDate","value":false}\r\n34\r\n,{"name":"jobsMP","validity":"upToDate","value":536}\r\n40\r\n,{"name":"softVersion","validity":"upToDate","value":"02.05.02"}\r\n40\r\n,{"name":"softPlan","validity":"upToDate","value":"21.40.00.10"}\r\n45\r\n]}]},{"id":1670689384,"endpoints":[{"id":1670689384,"error":0,"data":\r\n3D\r\n[{"name":"thermicDefect","validity":"upToDate","value":false}\r\n36\r\n,{"name":"position","validity":"upToDate","value":100}\r\n38\r\n,{"name":"onFavPos","validity":"upToDate","value":false}\r\n38\r\n,{"name":"upDefect","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"downDefect","validity":"upToDate","value":false}\r\n3E\r\n,{"name":"obstacleDefect","validity":"upToDate","value":false}\r\n39\r\n,{"name":"intrusion","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"battDefect","validity":"upToDate","value":false}\r\n34\r\n,{"name":"jobsMP","validity":"upToDate","value":536}\r\n40\r\n,{"name":"softVersion","validity":"upToDate","value":"02.05.02"}\r\n40\r\n,{"name":"softPlan","validity":"upToDate","value":"21.40.00.10"}\r\n45\r\n]}]},{"id":1670689449,"endpoints":[{"id":1670689449,"error":0,"data":\r\n3D\r\n[{"name":"thermicDefect","validity":"upToDate","value":false}\r\n34\r\n,{"name":"position","validity":"upToDate","value":0}\r\n38\r\n,{"name":"onFavPos","validity":"upToDate","value":false}\r\n38\r\n,{"name":"upDefect","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"downDefect","validity":"upToDate","value":false}\r\n3E\r\n,{"name":"obstacleDefect","validity":"upToDate","value":false}\r\n39\r\n,{"name":"intrusion","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"battDefect","validity":"upToDate","value":false}\r\n34\r\n,{"name":"jobsMP","validity":"upToDate","value":536}\r\n40\r\n,{"name":"softVersion","validity":"upToDate","value":"02.05.02"}\r\n40\r\n,{"name":"softPlan","validity":"upToDate","value":"21.40.00.10"}\r\n45\r\n]}]},{"id":1670689519,"endpoints":[{"id":1670689519,"error":0,"data":\r\n3D\r\n[{"name":"thermicDefect","validity":"upToDate","value":false}\r\n36\r\n,{"name":"position","validity":"upToDate","value":100}\r\n38\r\n,{"name":"onFavPos","validity":"upToDate","value":false}\r\n38\r\n,{"name":"upDefect","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"downDefect","validity":"upToDate","value":false}\r\n3E\r\n,{"name":"obstacleDefect","validity":"upToDate","value":false}\r\n39\r\n,{"name":"intrusion","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"battDefect","validity":"upToDate","value":false}\r\n34\r\n,{"name":"jobsMP","validity":"upToDate","value":536}\r\n40\r\n,{"name":"softVersion","validity":"upToDate","value":"02.05.02"}\r\n40\r\n,{"name":"softPlan","validity":"upToDate","value":"21.40.00.10"}\r\n45\r\n]}]},{"id":1670689697,"endpoints":[{"id":1670689697,"error":0,"data":\r\n3D\r\n[{"name":"thermicDefect","validity":"upToDate","value":false}\r\n34\r\n,{"name":"position","validity":"upToDate","value":0}\r\n38\r\n,{"name":"onFavPos","validity":"upToDate","value":false}\r\n38\r\n,{"name":"upDefect","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"downDefect","validity":"upToDate","value":false}\r\n3E\r\n,{"name":"obstacleDefect","validity":"upToDate","value":false}\r\n39\r\n,{"name":"intrusion","validity":"upToDate","value":false}\r\n3A\r\n,{"name":"battDefect","validity":"upToDate","value":false}\r\n34\r\n,{"name":"jobsMP","validity":"upToDate","value":536}\r\n40\r\n,{"name":"softVersion","validity":"upToDate","value":"02.05.02"}\r\n40\r\n,{"name":"softPlan","validity":"upToDate","value":"21.40.00.10"}\r\n46\r\n]}]},{"id":1670690842,"endpoints":[{"id":1670690842,"error":15,"data":\r\n7C\r\n[]}]},{"id":1711649289,"endpoints":[{"id":1711649289,"error":0,"data":[{"name":"zclVersion","validity":"upToDate","value":3}\r\n47\r\n,{"name":"manufacturer","validity":"upToDate","value":"ATLANTIC GROUP"}\r\n43\r\n,{"name":"ambientTemperature","validity":"upToDate","value":25.500}\r\n3D\r\n,{"name":"coolSetpoint","validity":"upToDate","value":24.000}\r\n40\r\n,{"name":"minCoolSetpoint","validity":"upToDate","value":18.000}\r\n40\r\n,{"name":"maxCoolSetpoint","validity":"upToDate","value":30.000}\r\n37\r\n,{"name":"setpoint","validity":"upToDate","value":null}\r\n3C\r\n,{"name":"minSetpoint","validity":"upToDate","value":16.000}\r\n3C\r\n,{"name":"maxSetpoint","validity":"upToDate","value":30.000}\r\n3D\r\n,{"name":"heatSetpoint","validity":"upToDate","value":22.000}\r\n40\r\n,{"name":"minHeatSetpoint","validity":"upToDate","value":16.000}\r\n40\r\n,{"name":"maxHeatSetpoint","validity":"upToDate","value":30.000}\r\n41\r\n,{"name":"authorization","validity":"upToDate","value":"HEATING"}\r\n3D\r\n,{"name":"thermicLevel","validity":"upToDate","value":"STOP"}\r\n34\r\n,{"name":"speed","validity":"upToDate","value":null}\r\n3C\r\n,{"name":"speedString","validity":"upToDate","value":"AUTO"}\r\n40\r\n,{"name":"anticipCoeff","validity":"upToDate","value":30}]}]}]\r\n\r\n0\r\n\r\n +HTTP/1.1 200 OK\r\nServer: Tydom-001A25066BBE\r\nUri-Origin: /scenarios/file\r\nContent-Type: application/json\r\nContent-Length: 10\r\nTransac-Id: 0\r\nFile-Version: 6\r\n\r\n{"scn":[]} +HTTP/1.1 200 OK\r\nServer: Tydom-001A25066BBE\r\nUri-Origin: /ping\r\nContent-Type: application/json\r\nContent-Length: 0\r\nTransac-Id: 0\r\n\r\n +HTTP/1.1 200 OK\r\nServer: Tydom-001A25066BBE\r\nUri-Origin: /ping\r\nContent-Type: application/json\r\nContent-Length: 0\r\nTransac-Id: 0\r\n\r\n From 02ad9735b33fe5e2673422a301c3f3890576cdb7 Mon Sep 17 00:00:00 2001 From: ucpy7374 Date: Mon, 13 May 2024 17:29:19 +0200 Subject: [PATCH 03/11] implement naviclim support --- README.md | 1 + .../deltadore_tydom/ha_entities.py | 54 ++++++++++++++++--- .../deltadore_tydom/tydom/tydom_devices.py | 23 +++++--- 3 files changed, 65 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 866565b..49fe56a 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ Platform | Description - Tyxal+, Tyxal CSX40 - TYXIA 6610 - BSO +- Naviclim Atlantic 875311 Some other functions may also work or only report attributes. diff --git a/custom_components/deltadore_tydom/ha_entities.py b/custom_components/deltadore_tydom/ha_entities.py index 5e70a3e..d1f514e 100644 --- a/custom_components/deltadore_tydom/ha_entities.py +++ b/custom_components/deltadore_tydom/ha_entities.py @@ -610,17 +610,20 @@ class HaClimate(ClimateEntity, HAEntity): DICT_MODES_HA_TO_DD = { HVACMode.AUTO: "ANTI_FROST", - HVACMode.COOL: None, + HVACMode.COOL: "COOLING", HVACMode.HEAT: "NORMAL", HVACMode.OFF: "STOP", + HVACMode.FAN_ONLY: "VENTILATING", + HVACMode.DRY: "DRYING" } DICT_MODES_DD_TO_HA = { - # "": HVACMode.AUTO, - # "": HVACMode.COOL, + "COOLING": HVACMode.COOL, "ANTI_FROST": HVACMode.AUTO, "NORMAL": HVACMode.HEAT, "STOP": HVACMode.OFF, "AUTO": HVACMode.AUTO, + "VENTILATING": HVACMode.FAN_ONLY, + "DRYING": HVACMode.DRY } def __init__(self, device: TydomBoiler, hass) -> None: @@ -637,6 +640,12 @@ def __init__(self, device: TydomBoiler, hass) -> None: self._attr_supported_features | ClimateEntityFeature.TARGET_TEMPERATURE) + if hasattr(self._device, "minSetpoint"): + self._attr_min_temp = self._device.minSetpoint + + if hasattr(self._device, "maxSetpoint"): + self._attr_max_temp = self._device.maxSetpoint + self._attr_supported_features = ( self._attr_supported_features | ClimateEntityFeature.TURN_OFF @@ -649,9 +658,15 @@ def __init__(self, device: TydomBoiler, hass) -> None: # self._attr_preset_modes = ["NORMAL", "STOP", "ANTI_FROST"] self._attr_hvac_modes = [ HVACMode.OFF, - HVACMode.HEAT, HVACMode.AUTO, ] + + if ("comfortMode" in self._device._metadata and "COOLING" in self._device._metadata["comfortMode"]["enum_values"]) or ("hvacMode" in self._device._metadata and "COOLING" in self._device._metadata["hvacMode"]["enum_values"]): + self._attr_hvac_modes.append(HVACMode.COOL) + + if ("comfortMode" in self._device._metadata and "HEATING" in self._device._metadata["comfortMode"]["enum_values"]) or ("hvacMode" in self._device._metadata and "HEATING" in self._device._metadata["hvacMode"]["enum_values"]): + self._attr_hvac_modes.append(HVACMode.HEAT) + self._registered_sensors = [] if hasattr(self._device._metadata, "setpoint") and "min" in self._device._metadata["setpoint"]: @@ -663,11 +678,16 @@ def __init__(self, device: TydomBoiler, hass) -> None: @property def device_info(self) -> DeviceInfo: """Information about this entity/device.""" - return { + infos = { "identifiers": {(DOMAIN, self._device.device_id)}, "name": self._device.device_name, } + if hasattr(self._device, "manufacturer"): + infos["manufacturer"] = self._device.manufacturer + + return infos + @property def temperature_unit(self) -> str: """Return the unit of temperature measurement for the system.""" @@ -690,14 +710,34 @@ def current_temperature(self) -> float | None: """Return the current temperature.""" if hasattr(self._device, 'temperature'): return self._device.temperature + elif hasattr(self._device, 'ambientTemperature'): + return self._device.ambientTemperature else: return None @property def target_temperature(self) -> float | None: """Return the temperature currently set to be reached.""" - if self._device.authorization == "HEATING" and hasattr(self._device, "setpoint"): - return self._device.setpoint + if hasattr(self._device, 'hvacMode'): + if (self._device.hvacMode == "HEATING" or self._device.hvacMode == "NORMAL") and hasattr(self._device, "setpoint"): + return self._device.setpoint + elif (self._device.hvacMode == "HEATING" or self._device.hvacMode == "NORMAL") and hasattr(self._device, "heatSetpoint"): + return self._device.heatSetpoint + elif self._device.hvacMode == "COOLING" and hasattr(self._device, "setpoint"): + return self._device.setpoint + elif self._device.hvacMode == "COOLING" and hasattr(self._device, "coolSetpoint"): + return self._device.coolSetpoint + + elif hasattr(self._device, 'comfortMode'): + if self._device.comfortMode == "HEATING" and hasattr(self._device, "setpoint"): + return self._device.setpoint + elif self._device.comfortMode == "HEATING" and hasattr(self._device, "heatSetpoint"): + return self._device.heatSetpoint + elif self._device.comfortMode == "COOLING" and hasattr(self._device, "setpoint"): + return self._device.setpoint + elif self._device.comfortMode == "COOLING" and hasattr(self._device, "coolSetpoint"): + return self._device.coolSetpoint + return None async def async_set_hvac_mode(self, hvac_mode): diff --git a/custom_components/deltadore_tydom/tydom/tydom_devices.py b/custom_components/deltadore_tydom/tydom/tydom_devices.py index abcc3f0..c462a77 100644 --- a/custom_components/deltadore_tydom/tydom/tydom_devices.py +++ b/custom_components/deltadore_tydom/tydom/tydom_devices.py @@ -208,12 +208,19 @@ async def set_hvac_mode(self, mode): self._id, self._endpoint, "antifrostOn", False ) else: - await self._tydom_client.put_devices_data( - self._id, self._endpoint, "thermicLevel", "COMFORT" - ) - await self._tydom_client.put_devices_data( - self._id, self._endpoint, "comfortMode", "HEATING" - ) + if "COMFORT" in self._metadata["thermicLevel"]["enum_values"]: + await self._tydom_client.put_devices_data( + self._id, self._endpoint, "thermicLevel", "COMFORT" + ) + elif "HEATING" in self._metadata["thermicLevel"]["enum_values"]: + await self._tydom_client.put_devices_data( + self._id, self._endpoint, "thermicLevel", "HEATING" + ) + + if "HEATING" in self._metadata["comfortMode"]["enum_values"]: + await self._tydom_client.put_devices_data( + self._id, self._endpoint, "comfortMode", "HEATING" + ) elif mode == "STOP": if hasattr(self, 'hvacMode'): @@ -236,6 +243,10 @@ async def set_hvac_mode(self, mode): await self._tydom_client.put_devices_data( self._id, self._endpoint, "comfortMode", "STOP" ) + elif mode == "COOLING": + await self._tydom_client.put_devices_data( + self._id, self._endpoint, "comfortMode", "COOLING" + ) else: LOGGER.error("Unknown hvac mode: %s", mode) From fd1f19d8c4ce45f80b8095eccca8b772f8bdb65f Mon Sep 17 00:00:00 2001 From: CyrilP Date: Mon, 13 May 2024 17:34:07 +0200 Subject: [PATCH 04/11] fix ruff errors --- custom_components/deltadore_tydom/ha_entities.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/custom_components/deltadore_tydom/ha_entities.py b/custom_components/deltadore_tydom/ha_entities.py index d1f514e..e63c1bd 100644 --- a/custom_components/deltadore_tydom/ha_entities.py +++ b/custom_components/deltadore_tydom/ha_entities.py @@ -613,7 +613,7 @@ class HaClimate(ClimateEntity, HAEntity): HVACMode.COOL: "COOLING", HVACMode.HEAT: "NORMAL", HVACMode.OFF: "STOP", - HVACMode.FAN_ONLY: "VENTILATING", + HVACMode.FAN_ONLY: "VENTILATING", HVACMode.DRY: "DRYING" } DICT_MODES_DD_TO_HA = { @@ -660,7 +660,7 @@ def __init__(self, device: TydomBoiler, hass) -> None: HVACMode.OFF, HVACMode.AUTO, ] - + if ("comfortMode" in self._device._metadata and "COOLING" in self._device._metadata["comfortMode"]["enum_values"]) or ("hvacMode" in self._device._metadata and "COOLING" in self._device._metadata["hvacMode"]["enum_values"]): self._attr_hvac_modes.append(HVACMode.COOL) From 99533ab5353616a5a625aa95fc93fc0659ca618a Mon Sep 17 00:00:00 2001 From: CyrilP Date: Tue, 14 May 2024 10:23:29 +0200 Subject: [PATCH 05/11] fix climate status --- custom_components/deltadore_tydom/ha_entities.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/custom_components/deltadore_tydom/ha_entities.py b/custom_components/deltadore_tydom/ha_entities.py index e63c1bd..ed37019 100644 --- a/custom_components/deltadore_tydom/ha_entities.py +++ b/custom_components/deltadore_tydom/ha_entities.py @@ -696,10 +696,13 @@ def temperature_unit(self) -> str: @property def hvac_mode(self) -> HVACMode: """Return the current operation (e.g. heat, cool, idle).""" - if (hasattr(self._device, 'hvacMode')): + if hasattr(self._device, 'hvacMode'): LOGGER.debug("hvac_mode = %s", self.DICT_MODES_DD_TO_HA[self._device.hvacMode]) return self.DICT_MODES_DD_TO_HA[self._device.hvacMode] - elif (hasattr(self._device, 'thermicLevel')): + elif hasattr(self._device, 'authorization'): + LOGGER.debug("authorization = %s", self.DICT_MODES_DD_TO_HA[self._device.thermicLevel]) + return self.DICT_MODES_DD_TO_HA[self._device.authorization] + elif hasattr(self._device, 'thermicLevel'): LOGGER.debug("thermicLevel = %s", self.DICT_MODES_DD_TO_HA[self._device.thermicLevel]) return self.DICT_MODES_DD_TO_HA[self._device.thermicLevel] else: From 26e567f2593bf18478fd26a6c1ceb43676eca85f Mon Sep 17 00:00:00 2001 From: CyrilP Date: Wed, 15 May 2024 09:56:26 +0200 Subject: [PATCH 06/11] fix target temperature and cooling mode --- .../deltadore_tydom/ha_entities.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/custom_components/deltadore_tydom/ha_entities.py b/custom_components/deltadore_tydom/ha_entities.py index ed37019..656ef11 100644 --- a/custom_components/deltadore_tydom/ha_entities.py +++ b/custom_components/deltadore_tydom/ha_entities.py @@ -620,6 +620,7 @@ class HaClimate(ClimateEntity, HAEntity): "COOLING": HVACMode.COOL, "ANTI_FROST": HVACMode.AUTO, "NORMAL": HVACMode.HEAT, + "HEATING": HVACMode.HEAT, "STOP": HVACMode.OFF, "AUTO": HVACMode.AUTO, "VENTILATING": HVACMode.FAN_ONLY, @@ -635,10 +636,6 @@ def __init__(self, device: TydomBoiler, hass) -> None: self._attr_unique_id = f"{self._device.device_id}_climate" self._attr_name = self._device.device_name self._enable_turn_on_off_backwards_compatibility = False - if hasattr(self._device, "temperature"): - self._attr_supported_features = ( - self._attr_supported_features - | ClimateEntityFeature.TARGET_TEMPERATURE) if hasattr(self._device, "minSetpoint"): self._attr_min_temp = self._device.minSetpoint @@ -650,6 +647,7 @@ def __init__(self, device: TydomBoiler, hass) -> None: self._attr_supported_features | ClimateEntityFeature.TURN_OFF | ClimateEntityFeature.TURN_ON + | ClimateEntityFeature.TARGET_TEMPERATURE ) if "NORMAL" in self._device._metadata["thermicLevel"] and "AUTO" in self._device._metadata["thermicLevel"]: @@ -731,16 +729,15 @@ def target_temperature(self) -> float | None: elif self._device.hvacMode == "COOLING" and hasattr(self._device, "coolSetpoint"): return self._device.coolSetpoint - elif hasattr(self._device, 'comfortMode'): - if self._device.comfortMode == "HEATING" and hasattr(self._device, "setpoint"): - return self._device.setpoint - elif self._device.comfortMode == "HEATING" and hasattr(self._device, "heatSetpoint"): + elif hasattr(self._device, 'authorization'): + if self._device.authorization == "HEATING" and hasattr(self._device, "heatSetpoint"): return self._device.heatSetpoint - elif self._device.comfortMode == "COOLING" and hasattr(self._device, "setpoint"): + elif self._device.authorization == "HEATING" and hasattr(self._device, "setpoint"): return self._device.setpoint - elif self._device.comfortMode == "COOLING" and hasattr(self._device, "coolSetpoint"): + elif self._device.authorization == "COOLING" and hasattr(self._device, "coolSetpoint"): return self._device.coolSetpoint - + elif self._device.authorization == "COOLING" and hasattr(self._device, "setpoint"): + return self._device.setpoint return None async def async_set_hvac_mode(self, hvac_mode): From c98f91396376e70cb558aa037bf4e5aef7a7afe0 Mon Sep 17 00:00:00 2001 From: CyrilP Date: Wed, 15 May 2024 10:13:58 +0200 Subject: [PATCH 07/11] update for AUTO mode --- .../deltadore_tydom/ha_entities.py | 61 +++++++++++-------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/custom_components/deltadore_tydom/ha_entities.py b/custom_components/deltadore_tydom/ha_entities.py index 656ef11..96018b9 100644 --- a/custom_components/deltadore_tydom/ha_entities.py +++ b/custom_components/deltadore_tydom/ha_entities.py @@ -608,25 +608,6 @@ class HaClimate(ClimateEntity, HAEntity): "temperature": UnitOfTemperature.CELSIUS, } - DICT_MODES_HA_TO_DD = { - HVACMode.AUTO: "ANTI_FROST", - HVACMode.COOL: "COOLING", - HVACMode.HEAT: "NORMAL", - HVACMode.OFF: "STOP", - HVACMode.FAN_ONLY: "VENTILATING", - HVACMode.DRY: "DRYING" - } - DICT_MODES_DD_TO_HA = { - "COOLING": HVACMode.COOL, - "ANTI_FROST": HVACMode.AUTO, - "NORMAL": HVACMode.HEAT, - "HEATING": HVACMode.HEAT, - "STOP": HVACMode.OFF, - "AUTO": HVACMode.AUTO, - "VENTILATING": HVACMode.FAN_ONLY, - "DRYING": HVACMode.DRY - } - def __init__(self, device: TydomBoiler, hass) -> None: """Initialize Climate.""" super().__init__() @@ -637,6 +618,32 @@ def __init__(self, device: TydomBoiler, hass) -> None: self._attr_name = self._device.device_name self._enable_turn_on_off_backwards_compatibility = False + self.dict_modes_ha_to_dd = { + HVACMode.COOL: "COOLING", + HVACMode.HEAT: "NORMAL", + HVACMode.OFF: "STOP", + HVACMode.FAN_ONLY: "VENTILATING", + HVACMode.DRY: "DRYING" + } + self.dict_modes_dd_to_ha = { + "COOLING": HVACMode.COOL, + "ANTI_FROST": HVACMode.AUTO, + "NORMAL": HVACMode.HEAT, + "HEATING": HVACMode.HEAT, + "STOP": HVACMode.OFF, + "AUTO": HVACMode.AUTO, + "VENTILATING": HVACMode.FAN_ONLY, + "DRYING": HVACMode.DRY + } + + if "hvacMode" in self._device._metadata and "AUTO" in self._device._metadata["hvacMode"]["enum_values"]: + self.dict_modes_ha_to_dd[HVACMode.AUTO] = "AUTO" + elif "hvacMode" in self._device._metadata and "ANTI_FROST" in self._device._metadata["hvacMode"]["enum_values"]: + self.dict_modes_ha_to_dd[HVACMode.AUTO] = "ANTI_FROST" + else: + self.dict_modes_ha_to_dd[HVACMode.AUTO] = "AUTO" + + if hasattr(self._device, "minSetpoint"): self._attr_min_temp = self._device.minSetpoint @@ -651,7 +658,7 @@ def __init__(self, device: TydomBoiler, hass) -> None: ) if "NORMAL" in self._device._metadata["thermicLevel"] and "AUTO" in self._device._metadata["thermicLevel"]: - self.DICT_MODES_HA_TO_DD[HVACMode.HEAT] = "AUTO" + self.dict_modes_ha_to_dd[HVACMode.HEAT] = "AUTO" # self._attr_preset_modes = ["NORMAL", "STOP", "ANTI_FROST"] self._attr_hvac_modes = [ @@ -695,14 +702,14 @@ def temperature_unit(self) -> str: def hvac_mode(self) -> HVACMode: """Return the current operation (e.g. heat, cool, idle).""" if hasattr(self._device, 'hvacMode'): - LOGGER.debug("hvac_mode = %s", self.DICT_MODES_DD_TO_HA[self._device.hvacMode]) - return self.DICT_MODES_DD_TO_HA[self._device.hvacMode] + LOGGER.debug("hvac_mode = %s", self.dict_modes_dd_to_ha[self._device.hvacMode]) + return self.dict_modes_dd_to_ha[self._device.hvacMode] elif hasattr(self._device, 'authorization'): - LOGGER.debug("authorization = %s", self.DICT_MODES_DD_TO_HA[self._device.thermicLevel]) - return self.DICT_MODES_DD_TO_HA[self._device.authorization] + LOGGER.debug("authorization = %s", self.dict_modes_dd_to_ha[self._device.thermicLevel]) + return self.dict_modes_dd_to_ha[self._device.authorization] elif hasattr(self._device, 'thermicLevel'): - LOGGER.debug("thermicLevel = %s", self.DICT_MODES_DD_TO_HA[self._device.thermicLevel]) - return self.DICT_MODES_DD_TO_HA[self._device.thermicLevel] + LOGGER.debug("thermicLevel = %s", self.dict_modes_dd_to_ha[self._device.thermicLevel]) + return self.dict_modes_dd_to_ha[self._device.thermicLevel] else: return None @@ -742,7 +749,7 @@ def target_temperature(self) -> float | None: async def async_set_hvac_mode(self, hvac_mode): """Set new target hvac mode.""" - await self._device.set_hvac_mode(self.DICT_MODES_HA_TO_DD[hvac_mode]) + await self._device.set_hvac_mode(self.dict_modes_ha_to_dd[hvac_mode]) async def async_set_preset_mode(self, preset_mode): """Set new target preset mode.""" From 3d3accb096993e8df0ef296e97f6f9041297b906 Mon Sep 17 00:00:00 2001 From: ucpy7374 Date: Thu, 16 May 2024 09:21:10 +0200 Subject: [PATCH 08/11] update condition for auto mode --- custom_components/deltadore_tydom/ha_entities.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/deltadore_tydom/ha_entities.py b/custom_components/deltadore_tydom/ha_entities.py index 96018b9..2404dbe 100644 --- a/custom_components/deltadore_tydom/ha_entities.py +++ b/custom_components/deltadore_tydom/ha_entities.py @@ -657,7 +657,7 @@ def __init__(self, device: TydomBoiler, hass) -> None: | ClimateEntityFeature.TARGET_TEMPERATURE ) - if "NORMAL" in self._device._metadata["thermicLevel"] and "AUTO" in self._device._metadata["thermicLevel"]: + if "NORMAL" in self._device._metadata["thermicLevel"] or "AUTO" in self._device._metadata["thermicLevel"]: self.dict_modes_ha_to_dd[HVACMode.HEAT] = "AUTO" # self._attr_preset_modes = ["NORMAL", "STOP", "ANTI_FROST"] From 73ca23df1373ec000fbe83dcbad3305980f0ce7e Mon Sep 17 00:00:00 2001 From: CyrilP Date: Fri, 31 May 2024 15:35:51 +0200 Subject: [PATCH 09/11] new config flow to allow connection without cloud account --- .../deltadore_tydom/config_flow.py | 289 ++++++++++++++++-- custom_components/deltadore_tydom/const.py | 4 + .../deltadore_tydom/translations/en.json | 53 +++- 3 files changed, 313 insertions(+), 33 deletions(-) diff --git a/custom_components/deltadore_tydom/config_flow.py b/custom_components/deltadore_tydom/config_flow.py index 6a7edf6..dce0862 100644 --- a/custom_components/deltadore_tydom/config_flow.py +++ b/custom_components/deltadore_tydom/config_flow.py @@ -8,6 +8,7 @@ import voluptuous as vol from homeassistant.config_entries import OptionsFlow +from homeassistant.helpers import selector from homeassistant.helpers.aiohttp_client import async_create_clientsession import homeassistant.helpers.config_validation as cv from homeassistant import config_entries, exceptions @@ -15,7 +16,7 @@ from homeassistant.core import HomeAssistant, callback from homeassistant.components import dhcp -from .const import DOMAIN, LOGGER, CONF_TYDOM_PASSWORD, CONF_ZONES_HOME, CONF_ZONES_AWAY, CONF_REFRESH_INTERVAL +from .const import DOMAIN, LOGGER, CONF_TYDOM_PASSWORD, CONF_ZONES_HOME, CONF_ZONES_AWAY, CONF_REFRESH_INTERVAL, CONF_CONFIG_MODE, CONF_CLOUD_MODE, CONF_MANUAL_MODE from . import hub from .tydom.tydom_client import ( TydomClientApiClientCommunicationError, @@ -56,7 +57,7 @@ def zones_valid(zones) -> bool: """Return True if zone config is valid.""" return re.fullmatch(zones_regex, zones) -async def validate_input(hass: HomeAssistant, data: dict) -> dict[str, Any]: +async def validate_input(hass: HomeAssistant, cloud: bool, data: dict) -> dict[str, Any]: """Validate the user input allows us to connect. Data has the keys from DATA_SCHEMA with values provided by the user. @@ -70,30 +71,36 @@ async def validate_input(hass: HomeAssistant, data: dict) -> dict[str, Any]: if len(data[CONF_MAC]) != 12: raise InvalidMacAddress - if not email_valid(data[CONF_EMAIL]): - raise InvalidEmail - - if len(data[CONF_PASSWORD]) < 3: - raise InvalidPassword - - try: - int(data[CONF_REFRESH_INTERVAL]) - except ValueError: - raise InvalidRefreshInterval - if CONF_ZONES_HOME in data and not zones_valid(data[CONF_ZONES_HOME]): raise InvalidZoneHome if CONF_ZONES_AWAY in data and not zones_valid(data[CONF_ZONES_AWAY]): raise InvalidZoneAway - password = await hub.Hub.get_tydom_credentials( - async_create_clientsession(hass, False), - data[CONF_EMAIL], - data[CONF_PASSWORD], - data[CONF_MAC], - ) - data[CONF_TYDOM_PASSWORD] = password + if cloud: + if not email_valid(data[CONF_EMAIL]): + raise InvalidEmail + + if len(data[CONF_PASSWORD]) < 3: + raise InvalidPassword + + try: + int(data[CONF_REFRESH_INTERVAL]) + except ValueError: + raise InvalidRefreshInterval + + password = await hub.Hub.get_tydom_credentials( + async_create_clientsession(hass, False), + data[CONF_EMAIL], + data[CONF_PASSWORD], + data[CONF_MAC], + ) + data[CONF_TYDOM_PASSWORD] = password + else: + data[CONF_EMAIL] = "" + data[CONF_PASSWORD] = "" + if len(data[CONF_TYDOM_PASSWORD]) < 3: + raise InvalidPassword zone_home = None if CONF_ZONES_HOME in data: @@ -113,7 +120,7 @@ async def validate_input(hass: HomeAssistant, data: dict) -> dict[str, Any]: CONF_EMAIL: data[CONF_EMAIL], CONF_PASSWORD: data[CONF_PASSWORD], CONF_REFRESH_INTERVAL: data[CONF_REFRESH_INTERVAL], - CONF_TYDOM_PASSWORD: password, + CONF_TYDOM_PASSWORD: data[CONF_TYDOM_PASSWORD], CONF_ZONES_HOME: zone_home, CONF_ZONES_AWAY: zone_away, CONF_PIN: pin, @@ -136,6 +143,31 @@ async def async_step_import(self, import_config): return await self.async_step_user(import_config) async def async_step_user(self, user_input=None) -> config_entries.FlowResult: + _errors = {} + if user_input is not None: + if user_input.get(CONF_CONFIG_MODE) == CONF_MANUAL_MODE: + return await self.async_step_user_manual() + else: + return await self.async_step_user_cloud() + else: + user_input = user_input or {} + return self.async_show_form( + step_id="user", + data_schema=vol.Schema( + { + vol.Required(CONF_CONFIG_MODE, default=user_input.get(CONF_CONFIG_MODE),): selector.SelectSelector( + selector.SelectSelectorConfig(options=[ + selector.SelectOptionDict(value=CONF_CLOUD_MODE, label=CONF_CLOUD_MODE), + selector.SelectOptionDict(value=CONF_MANUAL_MODE, label=CONF_MANUAL_MODE)], + translation_key=CONF_CONFIG_MODE + ), + ), + } + ), + errors=_errors, + ) + + async def async_step_user_cloud(self, user_input=None) -> config_entries.FlowResult: """Handle the initial step.""" # This goes through the steps to take the user through the setup process. # Using this it is possible to update the UI and prompt for additional @@ -146,12 +178,13 @@ async def async_step_user(self, user_input=None) -> config_entries.FlowResult: _errors = {} default_zone_home = "" default_zone_away = "" + if user_input is not None: user_input.get(CONF_PIN, "") default_zone_home = user_input.get(CONF_ZONES_HOME, None) default_zone_away = user_input.get(CONF_ZONES_AWAY, None) try: - user_input = await validate_input(self.hass, user_input) + user_input = await validate_input(self.hass, True, user_input) # Ensure it's working as expected tydom_hub = hub.Hub( @@ -215,6 +248,7 @@ async def async_step_user(self, user_input=None) -> config_entries.FlowResult: LOGGER.exception("Unexpected exception") _errors["base"] = "unknown" else: + LOGGER.warn("adding TYDOM entry") await self.async_set_unique_id(user_input[CONF_MAC]) self._abort_if_unique_id_configured() @@ -225,7 +259,7 @@ async def async_step_user(self, user_input=None) -> config_entries.FlowResult: user_input = user_input or {} return self.async_show_form( - step_id="user", + step_id="user_cloud", data_schema=vol.Schema( { vol.Required( @@ -247,6 +281,112 @@ async def async_step_user(self, user_input=None) -> config_entries.FlowResult: errors=_errors, ) + async def async_step_user_manual(self, user_input=None) -> config_entries.FlowResult: + """Handle the initial step.""" + # This goes through the steps to take the user through the setup process. + # Using this it is possible to update the UI and prompt for additional + # information. This example provides a single form (built from `DATA_SCHEMA`), + # and when that has some validated input, it calls `async_create_entry` to + # actually create the HA config entry. Note the "title" value is returned by + # `validate_input` above. + _errors = {} + default_zone_home = "" + default_zone_away = "" + if user_input is not None: + user_input.get(CONF_PIN, "") + default_zone_home = user_input.get(CONF_ZONES_HOME, None) + default_zone_away = user_input.get(CONF_ZONES_AWAY, None) + try: + user_input = await validate_input(self.hass, False, user_input) + # Ensure it's working as expected + + tydom_hub = hub.Hub( + self.hass, + None, + user_input[CONF_HOST], + user_input[CONF_MAC], + user_input[CONF_TYDOM_PASSWORD], + "-1", + None, + None, + None, + ) + await tydom_hub.test_credentials() + + await self.async_set_unique_id(user_input[CONF_MAC]) + self._abort_if_unique_id_configured() + except CannotConnect: + _errors["base"] = "cannot_connect" + except InvalidHost: + # The error string is set here, and should be translated. + # This example does not currently cover translations, see the + # comments on `DATA_SCHEMA` for further details. + # Set the error on the `host` field, not the entire form. + _errors[CONF_HOST] = "invalid_host" + LOGGER.error("Invalid host: %s", user_input[CONF_HOST]) + except InvalidMacAddress: + _errors[CONF_MAC] = "invalid_macaddress" + LOGGER.error("Invalid MAC: %s", user_input[CONF_MAC]) + except InvalidPassword: + _errors[CONF_TYDOM_PASSWORD] = "invalid_password" + LOGGER.error("Invalid password") + except InvalidRefreshInterval: + _errors[CONF_REFRESH_INTERVAL] = "invalid_refresh_interval" + except InvalidZoneHome: + _errors[CONF_ZONES_HOME] = "invalid_zone_config" + default_zone_home = "" + LOGGER.error("Invalid Zone HOME: %s", user_input[CONF_ZONES_HOME]) + except InvalidZoneAway: + _errors[CONF_ZONES_AWAY] = "invalid_zone_config" + default_zone_away = "" + LOGGER.error("Invalid Zone AWAY: %s", user_input[CONF_ZONES_AWAY]) + except TydomClientApiClientCommunicationError: + traceback.print_exc() + _errors["base"] = "communication_error" + LOGGER.exception("Communication error") + except TydomClientApiClientAuthenticationError: + traceback.print_exc() + _errors["base"] = "authentication_error" + LOGGER.exception("Authentication error") + except TydomClientApiClientError: + traceback.print_exc() + _errors["base"] = "unknown" + LOGGER.exception("Unknown error") + + except Exception: # pylint: disable=broad-except + traceback.print_exc() + LOGGER.exception("Unexpected exception") + _errors["base"] = "unknown" + else: + await self.async_set_unique_id(user_input[CONF_MAC]) + self._abort_if_unique_id_configured() + + return self.async_create_entry( + title="Tydom-" + user_input[CONF_MAC][6:], data=user_input + ) + + user_input = user_input or {} + + return self.async_show_form( + step_id="user_manual", + data_schema=vol.Schema( + { + vol.Required( + CONF_HOST, default=user_input.get(CONF_HOST) + ): cv.string, + vol.Required(CONF_MAC, default=user_input.get(CONF_MAC)): cv.string, + vol.Required( + CONF_TYDOM_PASSWORD, default=user_input.get(CONF_TYDOM_PASSWORD) + ): cv.string, + vol.Required(CONF_REFRESH_INTERVAL, default="30"): cv.string, + vol.Optional(CONF_ZONES_HOME, default=default_zone_home): str, + vol.Optional(CONF_ZONES_AWAY, default=default_zone_away): str, + vol.Optional(CONF_PIN, default=user_input.get(CONF_PIN, "")): str, + } + ), + errors=_errors, + ) + @property def _name(self) -> str | None: return self.context.get(CONF_NAME) @@ -267,11 +407,110 @@ async def async_step_dhcp(self, discovery_info: dhcp.DhcpServiceInfo): async def async_step_discovery_confirm(self, user_input=None): """Confirm discovery.""" + _errors = {} + if user_input is not None: + if user_input.get(CONF_CONFIG_MODE) == CONF_MANUAL_MODE: + return await self.async_step_discovery_confirm_manual() + else: + return await self.async_step_discovery_confirm_cloud() + else: + user_input = user_input or {} + return self.async_show_form( + step_id="user", + data_schema=vol.Schema( + { + vol.Required(CONF_CONFIG_MODE, default=user_input.get(CONF_CONFIG_MODE),): selector.SelectSelector( + selector.SelectSelectorConfig(options=[ + selector.SelectOptionDict(value=CONF_CLOUD_MODE, label=CONF_CLOUD_MODE), + selector.SelectOptionDict(value=CONF_MANUAL_MODE, label=CONF_MANUAL_MODE)], + translation_key=CONF_CONFIG_MODE + ), + ), + } + ), + errors=_errors, + ) + + async def async_step_discovery_confirm_manual(self, user_input=None): + """Confirm discovery.""" + _errors = {} + if user_input is not None: + try: + user_input = await validate_input(self.hass, False, user_input) + # Ensure it's working as expected + tydom_hub = hub.Hub( + self.hass, + None, + user_input[CONF_HOST], + user_input[CONF_MAC], + user_input[CONF_TYDOM_PASSWORD], + "-1", + None, + None, + None, + ) + await tydom_hub.test_credentials() + + except CannotConnect: + _errors["base"] = "cannot_connect" + except InvalidHost: + _errors[CONF_HOST] = "invalid_host" + except InvalidMacAddress: + _errors[CONF_MAC] = "invalid_macaddress" + _errors[CONF_TYDOM_PASSWORD] = "invalid_password" + except InvalidRefreshInterval: + _errors[CONF_REFRESH_INTERVAL] = "invalid_refresh_interval" + except InvalidZoneHome: + _errors[CONF_ZONES_HOME] = "invalid_zone_config" + except InvalidZoneAway: + _errors[CONF_ZONES_AWAY] = "invalid_zone_config" + except TydomClientApiClientCommunicationError: + traceback.print_exc() + _errors["base"] = "communication_error" + except TydomClientApiClientAuthenticationError: + traceback.print_exc() + _errors["base"] = "authentication_error" + except TydomClientApiClientError: + traceback.print_exc() + _errors["base"] = "unknown" + + except Exception: # pylint: disable=broad-except + traceback.print_exc() + LOGGER.exception("Unexpected exception") + _errors["base"] = "unknown" + else: + await self.async_set_unique_id(user_input[CONF_MAC]) + self._abort_if_unique_id_configured() + + return self.async_create_entry( + title="Tydom-" + user_input[CONF_MAC][6:], data=user_input + ) + user_input = user_input or {} + return self.async_show_form( + step_id="discovery_confirm_manual", + description_placeholders={"name": self._name}, + data_schema=vol.Schema( + { + vol.Required(CONF_HOST, default=user_input.get(CONF_HOST, self._discovered_host)): str, + vol.Required(CONF_MAC, default=user_input.get(CONF_MAC, self._discovered_mac)): str, + vol.Required( + CONF_TYDOM_PASSWORD, default=user_input.get(CONF_TYDOM_PASSWORD) + ): cv.string, + vol.Required(CONF_REFRESH_INTERVAL, default=user_input.get(CONF_REFRESH_INTERVAL, "30")): str, + vol.Optional(CONF_ZONES_HOME, default=user_input.get(CONF_ZONES_HOME, "")): str, + vol.Optional(CONF_ZONES_AWAY, default=user_input.get(CONF_ZONES_AWAY, "")): str, + vol.Optional(CONF_PIN, default=user_input.get(CONF_PIN, "")): str, + } + ), + ) + + async def async_step_discovery_confirm_cloud(self, user_input=None): + """Confirm discovery.""" _errors = {} if user_input is not None: try: - user_input = await validate_input(self.hass, user_input) + user_input = await validate_input(self.hass, True, user_input) # Ensure it's working as expected tydom_hub = hub.Hub( self.hass, @@ -326,7 +565,7 @@ async def async_step_discovery_confirm(self, user_input=None): user_input = user_input or {} return self.async_show_form( - step_id="discovery_confirm", + step_id="discovery_confirm_cloud", description_placeholders={"name": self._name}, data_schema=vol.Schema( { diff --git a/custom_components/deltadore_tydom/const.py b/custom_components/deltadore_tydom/const.py index dcda8e6..38be0d9 100644 --- a/custom_components/deltadore_tydom/const.py +++ b/custom_components/deltadore_tydom/const.py @@ -12,3 +12,7 @@ CONF_REFRESH_INTERVAL= "refresh_interval" CONF_ZONES_HOME = "zones_home" CONF_ZONES_AWAY = "zones_away" +CONF_CONFIG_MODE = "config_mode" + +CONF_CLOUD_MODE = "tydom_cloud_account" +CONF_MANUAL_MODE = "tydom_credentials" diff --git a/custom_components/deltadore_tydom/translations/en.json b/custom_components/deltadore_tydom/translations/en.json index 56c2606..156da56 100644 --- a/custom_components/deltadore_tydom/translations/en.json +++ b/custom_components/deltadore_tydom/translations/en.json @@ -1,28 +1,57 @@ { "config": { "step": { - "user": { + "user_manual": { "title": "Delta Dore Tydom Configuration", "description": "If you need help with the configuration go to: https://github.com/CyrilP/hass-deltadore-tydom-component", "data": { - "host": "IP or hostname", + "host": "Tydom or mediation IP/hostname", "mac": "MAC address", - "email": "Email", - "password": "Password", + "password": "Tydom password", + "tydom_password": "Tydom password", "refresh_interval": "Refresh interval in min", "zones_away": "Active zones in away alarm mode", "zones_home": "Active zones in home alarm mode", "pin": "Alarm PIN" } }, - "discovery_confirm": { + "user_cloud": { "title": "Delta Dore Tydom Configuration", "description": "If you need help with the configuration go to: https://github.com/CyrilP/hass-deltadore-tydom-component", "data": { - "host": "IP or hostname", + "host": "Tydom or mediation IP/hostname", "mac": "MAC address", - "email": "Email", - "password": "Password", + "email": "Cloud account email", + "password": "Cloud account password", + "tydom_password": "Tydom password", + "refresh_interval": "Refresh interval in min", + "zones_away": "Active zones in away alarm mode", + "zones_home": "Active zones in home alarm mode", + "pin": "Alarm PIN" + } + }, + "discovery_confirm_manual": { + "title": "Delta Dore Tydom Configuration", + "description": "If you need help with the configuration go to: https://github.com/CyrilP/hass-deltadore-tydom-component", + "data": { + "host": "Tydom or mediation IP/hostname", + "mac": "MAC address", + "email": "Cloud account email", + "tydom_password": "Tydom password", + "refresh_interval": "Refresh interval in min", + "zones_away": "Active zones in away alarm mode", + "zones_home": "Active zones in home alarm mode", + "pin": "Alarm PIN" + } + }, + "discovery_confirm_cloud": { + "title": "Delta Dore Tydom Configuration", + "description": "If you need help with the configuration go to: https://github.com/CyrilP/hass-deltadore-tydom-component", + "data": { + "host": "Tydom or mediation IP/hostname", + "mac": "MAC address", + "email": "Cloud account email", + "password": "Cloud account password", "refresh_interval": "Refresh interval in min", "zones_away": "Active zones in away alarm mode", "zones_home": "Active zones in home alarm mode", @@ -65,5 +94,13 @@ "invalid_refresh_interval": "Refresh interval is not valid", "invalid_zone_config": "Zone configuration is invalid. syntax is : zone_id_1,zone_id_2... Example: 1,2,4" } + }, + "selector": { + "config_mode": { + "options": { + "tydom_cloud_account": "Retrieve Tydom credentials using Delta Dore cloud account", + "tydom_credentials": "Enter Tydom credentials manually" + } + } } } \ No newline at end of file From b81fe21b0d2bee8b1b3658e49eb0dcaa32b078a8 Mon Sep 17 00:00:00 2001 From: CyrilP Date: Fri, 31 May 2024 15:44:12 +0200 Subject: [PATCH 10/11] ruff fix --- custom_components/deltadore_tydom/config_flow.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/custom_components/deltadore_tydom/config_flow.py b/custom_components/deltadore_tydom/config_flow.py index dce0862..ad058a1 100644 --- a/custom_components/deltadore_tydom/config_flow.py +++ b/custom_components/deltadore_tydom/config_flow.py @@ -143,6 +143,7 @@ async def async_step_import(self, import_config): return await self.async_step_user(import_config) async def async_step_user(self, user_input=None) -> config_entries.FlowResult: + """Handle the initial step.""" _errors = {} if user_input is not None: if user_input.get(CONF_CONFIG_MODE) == CONF_MANUAL_MODE: @@ -168,7 +169,7 @@ async def async_step_user(self, user_input=None) -> config_entries.FlowResult: ) async def async_step_user_cloud(self, user_input=None) -> config_entries.FlowResult: - """Handle the initial step.""" + """Handle the cloud connection step.""" # This goes through the steps to take the user through the setup process. # Using this it is possible to update the UI and prompt for additional # information. This example provides a single form (built from `DATA_SCHEMA`), @@ -282,7 +283,7 @@ async def async_step_user_cloud(self, user_input=None) -> config_entries.FlowRes ) async def async_step_user_manual(self, user_input=None) -> config_entries.FlowResult: - """Handle the initial step.""" + """Handle the manual connection step.""" # This goes through the steps to take the user through the setup process. # Using this it is possible to update the UI and prompt for additional # information. This example provides a single form (built from `DATA_SCHEMA`), @@ -432,7 +433,7 @@ async def async_step_discovery_confirm(self, user_input=None): ) async def async_step_discovery_confirm_manual(self, user_input=None): - """Confirm discovery.""" + """Confirm discovery manual.""" _errors = {} if user_input is not None: try: @@ -504,9 +505,9 @@ async def async_step_discovery_confirm_manual(self, user_input=None): } ), ) - + async def async_step_discovery_confirm_cloud(self, user_input=None): - """Confirm discovery.""" + """Confirm discovery cloud.""" _errors = {} if user_input is not None: try: From 1a198b4a9f4e1c96def648de3f24dabb01d18121 Mon Sep 17 00:00:00 2001 From: cyrilp Date: Sun, 2 Jun 2024 12:43:37 +0200 Subject: [PATCH 11/11] fix discovery steps --- custom_components/deltadore_tydom/config_flow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/deltadore_tydom/config_flow.py b/custom_components/deltadore_tydom/config_flow.py index ad058a1..48fec2e 100644 --- a/custom_components/deltadore_tydom/config_flow.py +++ b/custom_components/deltadore_tydom/config_flow.py @@ -417,7 +417,7 @@ async def async_step_discovery_confirm(self, user_input=None): else: user_input = user_input or {} return self.async_show_form( - step_id="user", + step_id="discovery_confirm", data_schema=vol.Schema( { vol.Required(CONF_CONFIG_MODE, default=user_input.get(CONF_CONFIG_MODE),): selector.SelectSelector(