Geräte ersetzen in HG's

Es ist mal wieder soweit für ein neues Projekt.
Leider ist ja vermehr wieder zu lesen das Geräte neu angelernt werden müssen.
Das ist bei vielen mit einer HG Schlacht verbunden und mit viel Zeit.

Daher habe ich mir mein Node Red vorgenommen und eine Funktion geschrieben die bei den HG’s die ID’s tauscht.

Dazu muss Node Red installiert sein ( system ist egal es geht auch nen Windows Rechner ) sowie das homee Node von @stfnhmplr.

Das tote Gerät darf noch nicht gelöscht sein und das neue muss angelernt sein.
Das homee Node (API) muss mit dem homee verbunden sein und das Speichern im Kontext muss aktiviert sein.

[
    {
        "id": "76e0d02a.6b828",
        "type": "inject",
        "z": "2fafa37e.5aa2cc",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "get:homeegrams",
        "payloadType": "str",
        "x": 180,
        "y": 860,
        "wires": [
            [
                "ac5cba84.d15698"
            ]
        ]
    },
    {
        "id": "9492b4bb.9b0458",
        "type": "function",
        "z": "2fafa37e.5aa2cc",
        "name": "Attribute und Node ID ersetzen bei Trigger , Conditions und Actions ",
        "func": "var nodeold = 0;\nvar nodenew = 0;\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": "",
        "x": 340,
        "y": 1000,
        "wires": [
            [
                "ac5cba84.d15698"
            ]
        ]
    },
    {
        "id": "ac5cba84.d15698",
        "type": "homeeApi",
        "z": "2fafa37e.5aa2cc",
        "homee": "",
        "name": "homeeApi",
        "messageTypeFilter": [],
        "nodeFilter": null,
        "attributeFilter": null,
        "x": 420,
        "y": 860,
        "wires": [
            [
                "9492b4bb.9b0458"
            ]
        ]
    }
]

Dann diesen Flow importieren und in der Funktion die alte Node ID und die neue Node ID eingeben. ( Diese findet Ihr in der Browser Eingabezeile )

Dann den Inject Button drücken und in wenigen Sekunden ist alles erledigt und Ihr könnt das alte Gerät löschen und das neue ist Betriebsbereit.

Die Funktion berücksichtigt hier alle Attributtypen und deren Instancen.

Viel Spaß beim testen und beim Zeitsparen.

VG Micha

33 Like

Vielen Dank @Micha :+1:

1 Like

Als Nächstes müsste man noch an die relationships ran um die Zugehörigkeit in den Gruppen zu ändern.
Das werde ich mir bei Bedarf mal anschauen.
VG

3 Like

Das wäre natürlich noch das hohe C. Dies wird aber eigentlich beim einlernen festgelegt und sollte erledigt sein.

Grüße

1 Like

Die Gruppenzugehörigkeit wird nicht automatisch gemacht :crazy_face:

Ja. Ich meine wenn ich ein Gerät einlerne, lege ich ja zum Schluss den Namen und die Gruppen fest.

1 Like

Danke @Micha!!! :+1: :+1: Das ist ein wahnsinniger Mehrwert für die Würfel.
Hat Dich CA eigentlich schon direkt angefragt?

:rofl: :rofl:

3 Like

Meine Qualifikation liegt mehr in einem anderen Sektor und nicht beim Programmieren.

1 Like

Tja, scheinbar braucht es deine Qualifikationen :wink:

3 Like

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 Like