Geräte ersetzen in HG's

Hallo @Micha ,
ich hätte noch eine Frage:
Das Geräte ersetzen funktioniert wahrscheinlich nur, wenn ich genau das gleiche Gerät mit einem Gerät mit den gleichen Messwerten ersetze?
Falls ich ein Nachfolgegerät mit anderen Eigenschaften erwische, funktioniert wahrscheinlich nur das HG nicht mehr richtig, aber das System überlebt es?

Warum ich Frage; homee hat leider bei ähnlichen Geräten verschiedene Messwert-Eigenschaften (z.B. bei Fenstersnsoren, die heißen manchmal „Tür-/Fensterzustand“ oder nur „Zustand“) und die lassen sich auch nicht in Gruppen verwenden :roll_eyes:
Weil es könnte ja jemand auf die Idee komm, Gerät Typ A tut es nicht richtig, ich ersetze es durch Typ B (besser, anders, neuer).
Nicht das man dadurch das System zerstört?

Wenn jetzt ein node eine Eigenschaft hat die das neue Geräte nicht hat dann wird hier auch nichts ersetzt. Ich schau mir das gerne an und baue da einen fallback ein.
Das maximale was passieren kann ist, das dein HG nicht funktioniert.
Dein System wird da aber nicht weiter beeinflusst.

Laut dem Code wird dieses Attribut nicht ersetzt wenn dazu kein passender Type gefunden wird.
Es wird nur der Type 1:1 ersetzt und nicht Type 1 mit 2.
Wenn also dein alter Sensor nen Temperatur Attribut hat und der neue nicht, dann wird da nichts geändert.

Die Funktion sucht hier explizit nach dem alten Type und wenn dieser gefunden wird dann wird noch die instance kontrolliert bzw. rausgesucht.

Sollte also passen ansonsten einfach die Funktion trocken durchlaufen lassen und die Ausgabe im Debug kontrollieren und dann erstes an die homee api senden.

3 „Gefällt mir“

Hier ein passendes Video dazu.

[
    {
        "id": "9492b4bb.9b0458",
        "type": "function",
        "z": "e435a8ce.c0d9c8",
        "name": "Attribute und Node ID ersetzen bei Trigger , Conditions und Actions ( test nur Node )",
        "func": "var nodeold = 163; // zu ersetzende Node ID\nvar nodenew = 164; // neue Node ID \nvar attribute = global.get(\"homee.attributes\");\nvar nodes = global.get(\"homee.nodes\");\n\nif (Object.keys(msg.payload)[0] === \"homeegrams\"){\nvar hg = msg.payload.homeegrams;\nhg.forEach(function(hgs){\n    hgs.triggers.attribute_triggers.forEach(function(trigger){\n        if (trigger.node_id == nodeold){\n            var typeold = attribute.find(attri => attri.id === trigger.attribute_id );\n            var typenew = nodes.find(node => node.id === nodenew );\n            typenew.attributes.forEach(function(attritype){\n                if (attritype.type == typeold.type && attritype.instance == typeold.instance){\n        node.send({payload: \"PUT:homeegrams/\"+trigger.homeegram_id+\"/triggers/\"+trigger.id+\"?attribute_id=\"+attritype.id});\n        node.send({payload: \"PUT:homeegrams/\"+trigger.homeegram_id+\"/triggers/\"+trigger.id+\"?node_id=\"+nodenew})}\n            })\n        }\n    })\n\n    hgs.actions.attribute_actions.forEach(function(action){\n        if (action.node_id == nodeold){\n            var typeold = attribute.find(attri => attri.id === action.attribute_id );\n            var typenew = nodes.find(node => node.id === nodenew );\n            typenew.attributes.forEach(function(attritype){\n                if (attritype.type == typeold.type && attritype.instance == typeold.instance){\n        node.send({payload: \"PUT:homeegrams/\"+action.homeegram_id+\"/actions/\"+action.id+\"?node_id=\"+nodenew+\"&attribute_id=\"+attritype.id})}\n            })\n        }\n    })\n    \n    hgs.conditions.attribute_conditions.forEach(function(conditions){\n        if (conditions.node_id == nodeold ){\n            var typeold = attribute.find(attri => attri.id === conditions.attribute_id );\n            var typenew = nodes.find(node => node.id === nodenew );\n            typenew.attributes.forEach(function(attritype){\n                if (attritype.type == typeold.type && attritype.instance == typeold.instance){\n        node.send({payload: \"PUT:homeegrams/\"+conditions.homeegram_id+\"/conditions/\"+conditions.id+\"?node_id=\"+nodenew+\"&attribute_id=\"+attritype.id})}\n            })\n        }\n    })\n    \n})\n}\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1210,
        "y": 380,
        "wires": [
            [
                "945886b8.acd158",
                "767acccc.32ec64"
            ]
        ]
    },
    {
        "id": "945886b8.acd158",
        "type": "homeeApi",
        "z": "e435a8ce.c0d9c8",
        "homee": "",
        "name": "homeeApi",
        "messageTypeFilter": [],
        "nodeFilter": "",
        "attributeFilter": "",
        "x": 800,
        "y": 380,
        "wires": [
            [
                "9492b4bb.9b0458"
            ]
        ]
    },
    {
        "id": "343938e2.413288",
        "type": "inject",
        "z": "e435a8ce.c0d9c8",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "get:all",
        "payloadType": "str",
        "x": 250,
        "y": 300,
        "wires": [
            [
                "78be6296.1cfd8c",
                "945886b8.acd158"
            ]
        ]
    },
    {
        "id": "78be6296.1cfd8c",
        "type": "delay",
        "z": "e435a8ce.c0d9c8",
        "name": "",
        "pauseType": "delay",
        "timeout": "5",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "x": 420,
        "y": 380,
        "wires": [
            [
                "5201123d.badb0c"
            ]
        ]
    },
    {
        "id": "5201123d.badb0c",
        "type": "function",
        "z": "e435a8ce.c0d9c8",
        "name": "",
        "func": "msg.payload = \"get:homeegrams\";\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 600,
        "y": 380,
        "wires": [
            [
                "945886b8.acd158"
            ]
        ]
    },
    {
        "id": "767acccc.32ec64",
        "type": "debug",
        "z": "e435a8ce.c0d9c8",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 1430,
        "y": 560,
        "wires": []
    }
]

Der passende Flow zum Video.

16 „Gefällt mir“

Hallo @Micha,
danke für deine Bemühungen. Heute habe auch ich dein Projekt erfolgreich nuten können.

Wenn man mal alles beinander hat, Node-Red anfängt zu verstehen, dann geht´s ja recht einfach :wink: Ich hatte vor ein paar Wochen etwas Startschwierigkeit mit Node-Red, da sich das Package nicht auf meinem Win10-Rechner installieren lies. Habs dann erstmal gelassen. Ein 1-2 Wochen später gab es ein neues Package, dann hat es funktioniert :man_shrugging:
Ein Video wie man das Ganze grundsätzlich installiert, wäre wahrscheinlich für den ein oder anderen auch noch hilfreich. Mir hat das am meisten Zeit gekostet.

Ich hatte ja dann Grundsätzlich das Problem das ich 2 hue Dimmer ersetzen bzw. neu anlernen musste. Nun hatte ich aber keinen neuen hue Dimmer V1 mehr und kaufen wollte ich auch keinen mehr. Dann ist mir die Idee mit einem virtuellen Gerät gekommen und ich habe mir Michas Video dazu auch noch angesehen. Dann habe ich mir so ein Hilfsgerät in Node-Red mit angelegt.

Ich habe dann immer die Geräte ID des ausgefallen hue Dimmers mit der ID des virtuellen Dimmers ersetzt. Dann den ausgefallen hue Dimmer in homee gelöscht und neu angelernt. Und dann wieder die ID´s ausgetauscht. Ging alles ruckzuck und ohne Probleme. :+1:

Mal schaun was ich jetzt mit dem ganzen neuen Wissen in Zukunft alles anstelle :joy:

Anmerken möchte ich noch @Steffen :
Die hue Dimmer haben sich problemlos wieder anlernen lassen und funktionieren momentan. Ich kann mir daher nicht vorstellen, dass die Geräte das Problem sind. Da ihr seit Jahren nicht einmal das Problem bei den V1-Dimmern gelöst habt, wundert es mich, dass der V2-Dimmer als Gerätevorschlag zur Abstimmung gelistet wurde. :see_no_evil:

2 „Gefällt mir“

Das freut mich das es dir geholfen hat.
:relaxed::+1:

1 „Gefällt mir“

Es gibt jetzt eine Automatische Funktion zum Geräte ersetzen.


[
    {
        "id": "39fe227c.afd74e",
        "type": "function",
        "z": "92bbd3bd.5be8f",
        "name": "Attribute und Node ID ersetzen bei Trigger , Conditions und Actions ( test nur vhih mit Host nicht verfügbar )",
        "func": "var nodeold = 0;\nvar nodenew = 0;\nvar attribute = global.get(\"homee.attributes\");\nvar nodes = global.get(\"homee.nodes\");\n\n\n\nif (msg.payload === \"start\"){\n    \n    var hg = global.get(\"homee.homeegrams\");\n    hg.forEach(function(hgs){\n     nodes.forEach(function(nodei){\n        if(nodei.protocol === msg.protocol && nodei.state === msg.stateold) {\n            nodeold = nodei.id\n            nodes.forEach(function(noden){\n                if(noden.name === nodei.name && noden.state === msg.statenew && noden.protocol === msg.protocol) {\n                        nodenew = noden.id\n            \n                        hgs.triggers.attribute_triggers.forEach(function(trigger){\n            \n            \n        if (trigger.node_id == nodeold){\n            var typeold = attribute.find(attri => attri.id === trigger.attribute_id );\n            var typenew = nodes.find(node => node.id === nodenew );\n            typenew.attributes.forEach(function(attritype){\n                if (attritype.type == typeold.type && attritype.instance == typeold.instance){\n        node.send({payload: \"PUT:homeegrams/\"+trigger.homeegram_id+\"/triggers/\"+trigger.id+\"?attribute_id=\"+attritype.id});\n        node.send({payload: \"PUT:homeegrams/\"+trigger.homeegram_id+\"/triggers/\"+trigger.id+\"?node_id=\"+nodenew})}\n            })\n        }\n    })\n                        hgs.actions.attribute_actions.forEach(function(action){\n        if (action.node_id == nodeold){\n            var typeold = attribute.find(attri => attri.id === action.attribute_id );\n            var typenew = nodes.find(node => node.id === nodenew );\n            typenew.attributes.forEach(function(attritype){\n                if (attritype.type == typeold.type && attritype.instance == typeold.instance){\n        node.send({payload: \"PUT:homeegrams/\"+action.homeegram_id+\"/actions/\"+action.id+\"?node_id=\"+nodenew+\"&attribute_id=\"+attritype.id})}\n            })\n        }\n    })\n                        hgs.conditions.attribute_conditions.forEach(function(conditions){\n        if (conditions.node_id == nodeold ){\n            var typeold = attribute.find(attri => attri.id === conditions.attribute_id );\n            var typenew = nodes.find(node => node.id === nodenew );\n            typenew.attributes.forEach(function(attritype){\n                if (attritype.type == typeold.type && attritype.instance == typeold.instance){\n        node.send({payload: \"PUT:homeegrams/\"+conditions.homeegram_id+\"/conditions/\"+conditions.id+\"?node_id=\"+nodenew+\"&attribute_id=\"+attritype.id})\n                }\n            })\n        }\n    })\n                }\n                \n            })\n            \n        }\n    })\n})\n}\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 750,
        "y": 580,
        "wires": [
            [
                "b14b612b.3aa3",
                "931bde81.11fb3"
            ]
        ]
    },
    {
        "id": "931bde81.11fb3",
        "type": "link out",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "links": [
            "e204158a.3c9808"
        ],
        "x": 1195,
        "y": 540,
        "wires": []
    },
    {
        "id": "6bc91db4.26fa94",
        "type": "inject",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "protocol",
                "v": "21",
                "vt": "num"
            },
            {
                "p": "stateold",
                "v": "8",
                "vt": "num"
            },
            {
                "p": "statenew",
                "v": "1",
                "vt": "num"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "start",
        "payloadType": "str",
        "x": 130,
        "y": 580,
        "wires": [
            [
                "76d88f4e.bfbee",
                "82c49a74.a93868"
            ]
        ],
        "info": "CANodeProtocol: {\r\n        CANodeProtocolNone: 0,\r\n        CANodeProtocolZWave: 1,\r\n        CANodeProtocolZigBee: 2,\r\n        CANodeProtocolEnOcean: 3,\r\n        CANodeProtocolWMBus: 4,\r\n        CANodeProtocolHomematic: 5,\r\n        CANodeProtocolKNXRF: 6,\r\n        CANodeProtocolInova: 7,\r\n        CANodeProtocolHTTPAVM: 8,\r\n        CANodeProtocolHTTPNetatmo: 9,\r\n        CANodeProtocolHTTPKoubachi: 10,\r\n        CANodeProtocolHTTPNest: 11,\r\n        CANodeProtocolIOCube: 12,\r\n        CANodeProtocolHTTPCCU2: 13,\r\n        CANodeProtocolHTTPUPnP: 14,\r\n        CANodeProtocolHTTPNuki: 15,\r\n        CANodeProtocolHTTPSEMS: 16,\r\n        CANodeProtocolSigmaZWave: 17,\r\n        CANodeProtocolLoRa: 18,\r\n        CANodeProtocolBiSecur: 19,\r\n        CANodeProtocolHTTPWolf: 20,\r\n        CANodeProtocolExternalHomee: 21,\r\n        CANodeProtocolHTTPMyStrom: 24,\r\n        CANodeProtocolWMS: 23,\r\n        CANodeProtocolHTTPSteca: 25,\r\n        CANodeProtocolAll: 100\r\n    },\r\n    CANodeState: {\r\n        CANodeStateNone: 0,\r\n        CANodeStateAvailable: 1,\r\n        CANodeStateUnavailable: 2,\r\n        CANodeStateUpdateInProgress: 3,\r\n        CANodeStateWaitingForAttributes: 4,\r\n        CANodeStateInitializing: 5,\r\n        CANodeStateUserInteractionRequired: 6,\r\n        CANodeStatePasswordRequired: 7,\r\n        CANodeStateHostUnavailable: 8,\r\n        CANodeStateDeleteInProgress: 9,\r\n        CANodeStateCosiConnected: 10,\r\n        CANodeStateBlocked: 11,\r\n        CANodeStateWaitingForWakeup: 12,\r\n        CANodeStateRemoteNodeDeleted: 13\r\n    },"
    },
    {
        "id": "82c49a74.a93868",
        "type": "change",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "get:all",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 470,
        "y": 540,
        "wires": [
            [
                "931bde81.11fb3"
            ]
        ]
    },
    {
        "id": "76d88f4e.bfbee",
        "type": "delay",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "pauseType": "delay",
        "timeout": "5",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "x": 280,
        "y": 580,
        "wires": [
            [
                "39fe227c.afd74e"
            ]
        ]
    },
    {
        "id": "b14b612b.3aa3",
        "type": "debug",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 1230,
        "y": 580,
        "wires": []
    }
]

Bei diesem Flow müssen die Geräte 1 zu 1 vorhanden sein. Also auch der Name muss absolut identisch und einmalig sein.
Im inject könnt ihr den Protokolltyp und den State des alten Gerätes und des neuen Gerätes an.

Es müssen keine ID‘s der alten oder neuen Geräte eingegeben werden.

Die Protokolle und auch die State sind im Inject hinterlegt.

Nutzung auf eigene Gefahr

Ich bin mir nicht sicher ob ich diesen Flow schon eingestellt hatte.
:see_no_evil::crazy_face:

Tante Edit

8 „Gefällt mir“

Kurze Verständnis-Nachfrage:
wenn der Name gleich ist (sein muss), wir immer die alte Node-ID durch die neue ersetzt?

Wichtig ist bei diesem Flow
-Gleiches Protokoll ( enocean, zwave etc.)
-State der alten Geräte und neuen Geräte müssen angegeben werden
-Name muss absolut identisch und einmalig im homee sein

Der Flow entstand beinmir für die vhih Geräte da ein Raspi seinen Dienst verweigert hatte und da funzt das perfekt. So erspart man sich das raus suchen jeder Geräte ID.

Ja dann wird die alte node Id durch die neue node Id ersetzt. :+1:

Ok, muss ich mal ausprobieren.
Für meine Hauptanwendung (Hue Dimmer ersetzen :roll_eyes:) muss ich dann aber bei Version 1 bleiben, da ich ja erst einen Zigbee-Dimmer gegen einen vhih-Dimmer tausche und dann wieder retoure.

Stimmt :see_no_evil:

Beide Varianten sind eine gewaltige Erleichterung. Für V1 kam @Micha gestern Abend noch die Idee die beiden ID’s und einen Trigger über ein Dashboard einzugeben. Leider geht das im homee direkt nicht so komfortabel , da für Werteingaben nur Slider möglich sind. Da ist uns die Fehleranfälligkeit zu hoch bei den möglichen Werten. Wer ein Dashboard von NR oder iobroker-VIS oder oder oder (muss nur möglich sein die Werte nach NR zu bekommen). Sollte hierfür gesteigertes Interesse vorhanden sein, würde ich mich bereit erklären für VIS die Widgets bereit zu stellen.

9 „Gefällt mir“

Bei den vielen Likes muss ich jetzt mal mein Versprechen einhalten. :wink: Habe gestern schon angefangen. Mache den Rest heute Abend fertig, teste das mal durch und stelle es dann rein.

2 „Gefällt mir“

Bei den vielen Likes vom Erstbeitrag sollte homee sich doch mal überlegen, ob man dies nicht im Standard irgendwie mit einbindet!

Ich wäre mal für eine Abstimmungsrunde für neue Features und nicht immer für neuen Geräte, die dann doch keiner braucht… :wink:

7 „Gefällt mir“

Letztlich ist die Funktion ja echt nicht schwer umzusetzen für CA. :man_shrugging:

3 „Gefällt mir“

Die Frage ist nur, wer zahlt es?! :man_shrugging:

1 „Gefällt mir“

Da es sich ja um eine Notfall-Funktion handelt, würde es ja auch schon ausreichen, wenn diese nur in der webapp verfügbar wäre :man_shrugging: So eine Funktion in der App gelöst (ohne Umweg über node-red) wäre sicher für Viele noch wünschenswert.
Aber vllt bekommt ihr ja noch ein komprimiertes Script hin, dass es für die breite Maße noch einfacher wird :wink:

Mir hilft die Funktion auf jeden Fall wöchentlich :wink: @Steffen, da die heu Dimmer bei mir regelmäßig ausfallen :roll_eyes:

1 „Gefällt mir“

Jetzt ist es soweit. Hier wie angekündigt die Möglichkeit des Gerätetausches von @Micha über die iobroker-VIS.
Zuerst die Nodes für NR:

[
    {
        "id": "3df32cdd.2bc704",
        "type": "ioBroker in",
        "z": "26afc043.9c075",
        "name": "Change_ID",
        "topic": "0_userdata.0.Change_ID",
        "payloadType": "value",
        "onlyack": "",
        "func": "all",
        "gap": "",
        "fireOnStart": "false",
        "x": 410,
        "y": 640,
        "wires": [
            [
                "4a4a8dd.6246b74"
            ]
        ]
    },
    {
        "id": "4a4a8dd.6246b74",
        "type": "switch",
        "z": "26afc043.9c075",
        "name": "",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "true",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 550,
        "y": 640,
        "wires": [
            [
                "1e40baf.5d26e45",
                "d2f7ca42.920448",
                "ae013c3b.0c03a"
            ]
        ]
    },
    {
        "id": "1e40baf.5d26e45",
        "type": "ioBroker get",
        "z": "26afc043.9c075",
        "name": "",
        "topic": "0_userdata.0.New_ID",
        "attrname": "payload",
        "payloadType": "value",
        "x": 780,
        "y": 640,
        "wires": [
            [
                "cf78fe39.0733d"
            ]
        ]
    },
    {
        "id": "d2f7ca42.920448",
        "type": "ioBroker get",
        "z": "26afc043.9c075",
        "name": "",
        "topic": "0_userdata.0.Old_ID",
        "attrname": "payload",
        "payloadType": "value",
        "x": 780,
        "y": 700,
        "wires": [
            [
                "463636ff.89d6f8"
            ]
        ]
    },
    {
        "id": "cf78fe39.0733d",
        "type": "function",
        "z": "26afc043.9c075",
        "name": "Schreibe Flow-Variable \"New_ID\"",
        "func": "flow.set('New_ID', Number(msg.payload));",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1080,
        "y": 640,
        "wires": [
            []
        ]
    },
    {
        "id": "463636ff.89d6f8",
        "type": "function",
        "z": "26afc043.9c075",
        "name": "Schreibe Flow-Variable \"Old_ID\"",
        "func": "flow.set('Old_ID', Number(msg.payload));",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1090,
        "y": 700,
        "wires": [
            []
        ]
    },
    {
        "id": "ae013c3b.0c03a",
        "type": "delay",
        "z": "26afc043.9c075",
        "name": "",
        "pauseType": "delay",
        "timeout": "2",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "x": 760,
        "y": 760,
        "wires": [
            [
                "780a844b.97f5dc",
                "1ab219a3.3b0aa6"
            ]
        ]
    },
    {
        "id": "b2aa9f56.f6ea9",
        "type": "ioBroker out",
        "z": "26afc043.9c075",
        "name": "",
        "topic": "0_userdata.0.Change_ID",
        "ack": "true",
        "autoCreate": "false",
        "stateName": "",
        "role": "",
        "payloadType": "",
        "readonly": "",
        "stateUnit": "",
        "stateMin": "",
        "stateMax": "",
        "x": 1110,
        "y": 760,
        "wires": []
    },
    {
        "id": "780a844b.97f5dc",
        "type": "function",
        "z": "26afc043.9c075",
        "name": "",
        "func": "msg.payload = \"false\";\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 920,
        "y": 760,
        "wires": [
            [
                "b2aa9f56.f6ea9"
            ]
        ]
    },
    {
        "id": "1ab219a3.3b0aa6",
        "type": "function",
        "z": "26afc043.9c075",
        "name": "get:all",
        "func": "msg.payload = \"get:all\";\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 910,
        "y": 820,
        "wires": [
            [
                "fb402403.9f9ca8",
                "fd031dd.29bd2e"
            ]
        ]
    },
    {
        "id": "fb402403.9f9ca8",
        "type": "delay",
        "z": "26afc043.9c075",
        "name": "",
        "pauseType": "delay",
        "timeout": "2",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "x": 940,
        "y": 880,
        "wires": [
            [
                "436e05db.5afb5c"
            ]
        ]
    },
    {
        "id": "fd031dd.29bd2e",
        "type": "link out",
        "z": "26afc043.9c075",
        "name": "",
        "links": [
            "1e011fe2.7a7eb"
        ],
        "x": 1215,
        "y": 820,
        "wires": []
    },
    {
        "id": "436e05db.5afb5c",
        "type": "function",
        "z": "26afc043.9c075",
        "name": "get HG's",
        "func": "msg.payload = \"get:homeegrams\";\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1100,
        "y": 880,
        "wires": [
            [
                "fd031dd.29bd2e"
            ]
        ]
    },
    {
        "id": "1e011fe2.7a7eb",
        "type": "link in",
        "z": "26afc043.9c075",
        "name": "",
        "links": [
            "128724a1.40d67b",
            "21aa6862.c77cf8",
            "1ca9a5ca.19b05a",
            "40a012b8.87b2dc",
            "44be2096.ff847",
            "438f3d8b.5f86a4",
            "62a0bc8d.a262c4",
            "56209e5b.431ff",
            "e171b828.c450f8",
            "71226322.a72c3c",
            "7d9c7141.f460d",
            "23bd8876.6a06e8",
            "863f2dc3.315bc",
            "a49916e2.414be8",
            "d1c99ca7.1143d",
            "e0321cbc.dfa79",
            "e66e869c.11bc18",
            "eb2126e3.bca288",
            "45aa79ed.66f1b8",
            "86d6e491.b599e8",
            "691d2286.cf6fdc",
            "230c55d3.25383a",
            "27de74a2.d48abc",
            "e31bd5fd.1c2578",
            "1daf89bc.685f86",
            "d5117a9c.a0b248",
            "e952c0ea.4eae2",
            "26e57ca4.9b11a4",
            "25c3e89c.ba63c8",
            "cce2c966.22b638",
            "84d7eb77.cc06c8",
            "a9d30ecd.ed8c5",
            "66de1386.49630c",
            "ed06967f.c658b8",
            "c7302d0c.4d0bf",
            "ee187633.348248",
            "e0bf69be.cd7158",
            "672fadf9.703ea4",
            "dc72f591.6c6738",
            "947087f4.f851a8",
            "8a106fcf.08e38",
            "44179766.70acf8",
            "46dd7532.5fb1ac",
            "4feeefff.c1d31",
            "44e50a5c.7a2764",
            "8461ef97.a35c4",
            "ab144ad3.651de8",
            "c6849e0e.fa026",
            "f3c77010.422ec",
            "7710d4a7.ee44ec",
            "31eb785b.8d9ed8",
            "7b813e7d.66f3f",
            "a697a15b.5648c",
            "57809562.7524cc",
            "6df1831e.38e78c",
            "214a65cb.2758ca",
            "a016fee0.ad988",
            "fd031dd.29bd2e"
        ],
        "x": 375,
        "y": 80,
        "wires": [
            [
                "f6c24df8.4ec29"
            ]
        ]
    },
    {
        "id": "f6c24df8.4ec29",
        "type": "homeeApi",
        "z": "26afc043.9c075",
        "homee": "",
        "name": "",
        "messageTypeFilter": [],
        "nodeFilter": "",
        "attributeFilter": "",
        "x": 640,
        "y": 80,
        "wires": [
            [
                "19332ee.2ac90d1",
                "1790e618.8cb07a",
                "63217ba6.454644",
                "9492b4bb.9b0458"
            ]
        ]
    },
    {
        "id": "9492b4bb.9b0458",
        "type": "function",
        "z": "26afc043.9c075",
        "name": "Attribute und Node ID ersetzen",
        "func": "var nodeold = flow.get(\"Old_ID\");\nvar nodenew = flow.get(\"New_ID\");\nvar attribute = global.get(\"homee.attributes\");\nvar nodes = global.get(\"homee.nodes\");\n\nif (Object.keys(msg.payload)[0] === \"homeegrams\"){\nvar hg = msg.payload.homeegrams;\nhg.forEach(function(hgs){\n    hgs.triggers.attribute_triggers.forEach(function(trigger){\n        if (trigger.node_id == nodeold){\n            var typeold = attribute.find(attri => attri.id === trigger.attribute_id );\n            var typenew = nodes.find(node => node.id === nodenew );\n            typenew.attributes.forEach(function(attritype){\n                if (attritype.type == typeold.type && attritype.instance == typeold.instance){\n        node.send({payload: \"PUT:homeegrams/\"+trigger.homeegram_id+\"/triggers/\"+trigger.id+\"?attribute_id=\"+attritype.id});\n        node.send({payload: \"PUT:homeegrams/\"+trigger.homeegram_id+\"/triggers/\"+trigger.id+\"?node_id=\"+nodenew})}\n            })\n        }\n    })\n\n    hgs.actions.attribute_actions.forEach(function(action){\n        if (action.node_id == nodeold){\n            var typeold = attribute.find(attri => attri.id === action.attribute_id );\n            var typenew = nodes.find(node => node.id === nodenew );\n            typenew.attributes.forEach(function(attritype){\n                if (attritype.type == typeold.type && attritype.instance == typeold.instance){\n        node.send({payload: \"PUT:homeegrams/\"+action.homeegram_id+\"/actions/\"+action.id+\"?node_id=\"+nodenew+\"&attribute_id=\"+attritype.id})}\n            })\n        }\n    })\n    \n    hgs.conditions.attribute_conditions.forEach(function(conditions){\n        if (conditions.node_id == nodeold ){\n            var typeold = attribute.find(attri => attri.id === conditions.attribute_id );\n            var typenew = nodes.find(node => node.id === nodenew );\n            typenew.attributes.forEach(function(attritype){\n                if (attritype.type == typeold.type && attritype.instance == typeold.instance){\n        node.send({payload: \"PUT:homeegrams/\"+conditions.homeegram_id+\"/conditions/\"+conditions.id+\"?node_id=\"+nodenew+\"&attribute_id=\"+attritype.id})}\n            })\n        }\n    })\n    \n})\n}\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 810,
        "y": 280,
        "wires": [
            [
                "f6c24df8.4ec29"
            ]
        ]
    }
]

Nur den homee-API-Node durch den eigenen ersetzen.

In den Objekten von iobroker folgende Variablen anlegen:


„Change_ID“ ist Typ bool, die beiden anderen Typ Number.

Hier die iobroker-widgets:

[{"tpl":"i-vis-checkbox","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iCheckboxCount":"1","iCheckboxOrientation":"vertical","iCheckboxSpacing":"20","iCheckboxIcon":"iIconCheck","iWidth":"30","iHeight":"30","iBackgroundColor":"#ffffff","iBackgroundColorActive":"#14eb19","iColorIcon":"#000000","iCornerRadiusUL":"4","iCornerRadiusUR":"4","iCornerRadiusLR":"4","iCornerRadiusLL":"4","iBorderSize":"0","iBorderStyle":"none","iBorderColor":"#ffffff","iBorderColorActive":"#ffffff","iShadowXOffset":"2","iShadowYOffset":"2","iShadowBlur":"2","iShadowSpread":"0","iShadowColor":"#111111","iShadowColorActive":"#111111","iShadowInnerXOffset":"0","iShadowInnerYOffset":"0","iShadowInnerBlur":"0","iShadowInnerSpread":"0","iShadowInnerColor":"#111111","iShadowInnerColorActive":"#111111","iShadowTextXOffset":"0","iShadowTextYOffset":"0","iShadowTextBlur":"0","iShadowTextColor":"#111111","iShadowTextColorActive":"#111111","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"oid1":"0_userdata.0.Change_ID","iValueFalse1":"false","iValueTrue1":"true","iText1":"Tauschen"},"style":{"left":"261px","top":"302px","width":"124px","height":"30px","font-family":"Jura-Medium"},"widgetSet":"vis-inventwo"},{"tpl":"tplVis-materialdesign-Input","data":{"oid":"0_userdata.0.Old_ID","g_fixed":false,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"inputType":"number","inputLayout":"solo","showInputMessageAlways":false,"showInputCounter":false,"clearIconShow":false,"signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"inputTextColor":"#ffffff","inputLabelText":"","inputLabelColor":"","inputLayoutBorderColor":"","inputLayoutBackgroundColorHover":"#000060","inputTextFontSize":"24","inputTextFontFamily":"","clearIcon":"","inputAppendixFontSize":"24","inputLabelFontFamily":"","inputLabelFontSize":"","inputTranslateX":"","inputTranslateY":"","inputPrefix":"Alte ID: ","inputAppendixFontFamily":"","inputSuffix":"","inputMessage":"","inputLayoutBackgroundColor":"#000020","inputLayoutBackgroundColorSelected":"#000060","inputMessageFontFamily":"","clearIconColor":"#bbb9b9","visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","inputCounterColor":"","inputMessageColor":"","inputMaxLength":"4","exportData":"true","inputAlignment":"left","inputLayoutBorderColorHover":"{mode:vis-materialdesign.0.colors.darkTheme;light:vis-materialdesign.0.colors.light.input.border_hover;dark:vis-materialdesign.0.colors.dark.input.border_hover; mode === \"true\" ? dark : light}","inputLayoutBorderColorSelected":"{mode:vis-materialdesign.0.colors.darkTheme;light:vis-materialdesign.0.colors.light.input.border_selected;dark:vis-materialdesign.0.colors.dark.input.border_selected; mode === \"true\" ? dark : light}","inputLabelColorSelected":"{mode:vis-materialdesign.0.colors.darkTheme;light:vis-materialdesign.0.colors.light.input.label_selected;dark:vis-materialdesign.0.colors.dark.input.label_selected; mode === \"true\" ? dark : light}","inputAppendixColor":"{mode:vis-materialdesign.0.colors.darkTheme;light:vis-materialdesign.0.colors.light.input.appendix;dark:vis-materialdesign.0.colors.dark.input.appendix; mode === \"true\" ? dark : light}","inputMessageFontSize":"{vis-materialdesign.0.fontSizes.input.message}","inputCounterFontSize":"{vis-materialdesign.0.fontSizes.input.counter}","inputCounterFontFamily":"{vis-materialdesign.0.fonts.input.counter}"},"style":{"left":"66px","top":"287px","width":"180px","height":"30px","z-index":"5","font-family":"Jura-Medium"},"widgetSet":"materialdesign"},{"tpl":"tplVis-materialdesign-Input","data":{"oid":"0_userdata.0.New_ID","g_fixed":false,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"inputType":"number","inputLayout":"solo","showInputMessageAlways":false,"showInputCounter":false,"clearIconShow":false,"signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"inputTextColor":"#ffffff","inputLabelText":"","inputLabelColor":"","inputLayoutBorderColor":"","inputLayoutBackgroundColorHover":"#000060","inputTextFontSize":"24","inputTextFontFamily":"","clearIcon":"","inputAppendixFontSize":"24","inputLabelFontFamily":"","inputLabelFontSize":"","inputTranslateX":"","inputTranslateY":"","inputPrefix":"Neue ID: ","inputAppendixFontFamily":"","inputSuffix":"","inputMessage":"","inputLayoutBackgroundColor":"#000020","inputLayoutBackgroundColorSelected":"#000060","inputMessageFontFamily":"","clearIconColor":"#bbb9b9","visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","inputCounterColor":"","inputMessageColor":"","inputMaxLength":"4","exportData":"true","inputAlignment":"left","inputLayoutBorderColorHover":"{mode:vis-materialdesign.0.colors.darkTheme;light:vis-materialdesign.0.colors.light.input.border_hover;dark:vis-materialdesign.0.colors.dark.input.border_hover; mode === \"true\" ? dark : light}","inputLayoutBorderColorSelected":"{mode:vis-materialdesign.0.colors.darkTheme;light:vis-materialdesign.0.colors.light.input.border_selected;dark:vis-materialdesign.0.colors.dark.input.border_selected; mode === \"true\" ? dark : light}","inputLabelColorSelected":"{mode:vis-materialdesign.0.colors.darkTheme;light:vis-materialdesign.0.colors.light.input.label_selected;dark:vis-materialdesign.0.colors.dark.input.label_selected; mode === \"true\" ? dark : light}","inputAppendixColor":"{mode:vis-materialdesign.0.colors.darkTheme;light:vis-materialdesign.0.colors.light.input.appendix;dark:vis-materialdesign.0.colors.dark.input.appendix; mode === \"true\" ? dark : light}","inputMessageFontSize":"{vis-materialdesign.0.fontSizes.input.message}","inputCounterFontSize":"{vis-materialdesign.0.fontSizes.input.counter}","inputCounterFontFamily":"{vis-materialdesign.0.fonts.input.counter}"},"style":{"left":"66px","top":"317px","width":"180px","height":"30px","z-index":"5","font-family":"Jura-Medium"},"widgetSet":"materialdesign"}]

Der Trigger ist eine Checkbox ist aus den inventwo-Widgets und die Eingabefelder aus materialdesign-Widgets. Es geht aber auch jeder beliebige Toggle-Switch und numerische Eingabefelder.

Bedienung ist einfach beide ID’s wie beschrieben in die Eingabefelder und in der Checkbox den Haken setzen. Der Haken geht nach zwei Sekunden von selber weg und nach weiteren zwei Sekunden sollte das Gerät in den HG’s getauscht sein. Habe es getestet.
Bei Fragen einfach melden.

9 „Gefällt mir“


[
    {
        "id": "8cabd737.459c",
        "type": "function",
        "z": "92bbd3bd.5be8f",
        "name": "Attribute und Node ID ersetzen bei Trigger , Conditions und Actions ( test nur Node )",
        "func": "var nodeold = parseFloat(global.get(\"old_id\")); // zu ersetzende Node ID\nvar nodenew = parseFloat(global.get(\"new_id\")); // neue Node ID \nvar attribute = global.get(\"homee.attributes\");\nvar nodes = global.get(\"homee.nodes\");\n\nif (Object.keys(msg.payload)[0] === \"homeegrams\"){\nvar hg = msg.payload.homeegrams;\nhg.forEach(function(hgs){\n    hgs.triggers.attribute_triggers.forEach(function(trigger){\n        if (trigger.node_id == nodeold){\n            var typeold = attribute.find(attri => attri.id === trigger.attribute_id );\n            var typenew = nodes.find(node => node.id === nodenew );\n            typenew.attributes.forEach(function(attritype){\n                if (attritype.type == typeold.type && attritype.instance == typeold.instance){\n        node.send({payload: \"PUT:homeegrams/\"+trigger.homeegram_id+\"/triggers/\"+trigger.id+\"?attribute_id=\"+attritype.id});\n        node.send({payload: \"PUT:homeegrams/\"+trigger.homeegram_id+\"/triggers/\"+trigger.id+\"?node_id=\"+nodenew})}\n            })\n        }\n    })\n\n    hgs.actions.attribute_actions.forEach(function(action){\n        if (action.node_id == nodeold){\n            var typeold = attribute.find(attri => attri.id === action.attribute_id );\n            var typenew = nodes.find(node => node.id === nodenew );\n            typenew.attributes.forEach(function(attritype){\n                if (attritype.type == typeold.type && attritype.instance == typeold.instance){\n        node.send({payload: \"PUT:homeegrams/\"+action.homeegram_id+\"/actions/\"+action.id+\"?node_id=\"+nodenew+\"&attribute_id=\"+attritype.id})}\n            })\n        }\n    })\n    \n    hgs.conditions.attribute_conditions.forEach(function(conditions){\n        if (conditions.node_id == nodeold ){\n            var typeold = attribute.find(attri => attri.id === conditions.attribute_id );\n            var typenew = nodes.find(node => node.id === nodenew );\n            typenew.attributes.forEach(function(attritype){\n                if (attritype.type == typeold.type && attritype.instance == typeold.instance){\n        node.send({payload: \"PUT:homeegrams/\"+conditions.homeegram_id+\"/conditions/\"+conditions.id+\"?node_id=\"+nodenew+\"&attribute_id=\"+attritype.id})}\n            })\n        }\n    })\n    \n})\n}\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1050,
        "y": 820,
        "wires": [
            [
                "ca57b1f5.c8c4b"
            ]
        ]
    },
    {
        "id": "ca57b1f5.c8c4b",
        "type": "homeeApi",
        "z": "92bbd3bd.5be8f",
        "homee": "",
        "name": "homeeApi",
        "messageTypeFilter": [],
        "nodeFilter": "",
        "attributeFilter": "",
        "x": 640,
        "y": 820,
        "wires": [
            [
                "8cabd737.459c"
            ]
        ]
    },
    {
        "id": "bc19d08.97e75b",
        "type": "delay",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "pauseType": "delay",
        "timeout": "5",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "x": 300,
        "y": 820,
        "wires": [
            [
                "a9a961ca.6d0798"
            ]
        ]
    },
    {
        "id": "a9a961ca.6d0798",
        "type": "function",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "func": "msg.payload = \"get:homeegrams\";\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 480,
        "y": 820,
        "wires": [
            [
                "ca57b1f5.c8c4b"
            ]
        ]
    },
    {
        "id": "a130206a.75975",
        "type": "http in",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "url": "/change",
        "method": "get",
        "upload": false,
        "swaggerDoc": "",
        "x": 90,
        "y": 700,
        "wires": [
            [
                "2e1f57f3.63ed78"
            ]
        ]
    },
    {
        "id": "2e1f57f3.63ed78",
        "type": "template",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "field": "payload",
        "fieldType": "msg",
        "format": "html",
        "syntax": "mustache",
        "template": "<!DOCTYPE html>\n\n<html>\n    <script>\n    \n    function submitMessage() {\n      alert(\"Wert gespeichert\");\n      setTimeout(function(){ document.location.reload(true; }, 500);   \n    }\n  </script>\n<body>\n    <center>\n   <h1>** Geräte ID in den Homeegrammen tauschen**</h1>\n<form   method = \"POST\" >\n    \n    <input type=\"number\" name=\"old_id\" placeholder=\"alte Node ID\" > {{payload.old_id}}\n    <br><br>\n    <input type=\"number\" name=\"new_id\" placeholder=\"Neue Node ID\"> {{payload.new_id}}\n    <br><br>\n    <br><br>\n    <button type=\"submit\" onclick=\"submitMessage()\">Geräte tauschen</button>\n</form>\n<br><br>\n<a href=\"https://hom.ee\"><strong>homee Website</strong></a>\n<br><br>\n<a href=\"https://community.hom.ee/t/geraete-ersetzen-in-hgs/35555\"><strong>homee Community Thread</strong></a>\n<br><br>\n<iframe width=\"320\" height=\"240\" src=\"https://youtu.be/HamaS_jBWw4\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe><br> <br>\n<iframe style=\"display:none\" name=\"hidden-form\"></iframe>\n</center>\n</body>\n</html>",
        "output": "str",
        "x": 280,
        "y": 700,
        "wires": [
            [
                "5fbf3bef.e1b35c"
            ]
        ]
    },
    {
        "id": "5fbf3bef.e1b35c",
        "type": "http response",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "statusCode": "",
        "headers": {},
        "x": 470,
        "y": 700,
        "wires": []
    },
    {
        "id": "60f51ee9.2347a",
        "type": "http in",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "url": "/change",
        "method": "post",
        "upload": false,
        "swaggerDoc": "",
        "x": 100,
        "y": 740,
        "wires": [
            [
                "2e1f57f3.63ed78",
                "bc19d08.97e75b",
                "2e4df018.8d71f8",
                "2825c1b.61fe33e"
            ]
        ]
    },
    {
        "id": "2e4df018.8d71f8",
        "type": "template",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "field": "payload",
        "fieldType": "msg",
        "format": "handlebars",
        "syntax": "mustache",
        "template": "get:all",
        "output": "str",
        "x": 280,
        "y": 780,
        "wires": [
            [
                "ca57b1f5.c8c4b"
            ]
        ]
    },
    {
        "id": "2825c1b.61fe33e",
        "type": "change",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "rules": [
            {
                "t": "move",
                "p": "payload.old_id",
                "pt": "msg",
                "to": "old_id",
                "tot": "global"
            },
            {
                "t": "move",
                "p": "payload.new_id",
                "pt": "msg",
                "to": "new_id",
                "tot": "global"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 310,
        "y": 740,
        "wires": [
            []
        ]
    }
]

Hier ein Flow mit einer Eingabeseite.
ip:1880/change aufrufen und dann kann dort die ID des Gerätes eingegeben werden und mit Gerät tauschen wird dann das Gerät ausgetauscht.
Der jeweilige Tausch kann je nach Anzahl der HG und Geräte ein paar Sekunden dauern.
Danach kann das nächste Gerät ausgetauscht werden.

10 „Gefällt mir“