Mal wieder virtuelle Geräte - jetzt aber richtig!

ich löse mal auf: :wink:
nimm mal bitte als Profil den „Temperatur- und Luftfeuchtigkeitssensor“.
Bei Attribute dann nur „relative Luftfeuchtigkeit“
Temperatur kannste weglassen.

Grüße

1 „Gefällt mir“

Hi TiDO,

vielen Dank für die Auflösung :wink:

Ich werde das demnächst ausprobieren, jetzt habe ich erstmal ein anderes Profil „verbogen“ (wegen aktuellem Zeitmangel) - klappt erstmal :wink:

Aber vielen Dank!

Hallo,
jetzt wollte ich mich auch mal an das Thema wagen, da ich mir Dashboard auf einem Tablet erstellen möchte.

Also habe ich einen Raspi4 bestellt, Home Assistant Image auf SD gebrannt und Node Red habe ich inzwischen auch noch ans laufen bekommen.

Jetzt will ich noch das Homee-Plugin istallieren, komme aber mit
cd ~/.node-red
npm install node-red-contrib-homee
nicht weiter. Ich habe auch „SSH & Web Terminal“ installiert, aber das ist wohl nicht das Richtige.

Könnt ihr wir weiterhelfen wie ich das Plugin istalliert bekomme?
An den Frage merkt ihr bestimmt das ich ein Newbie bin. :slight_smile:

Da ich ja eigentlich nur ein Dashboard will, könnte ich das evtl. auch nur mit MQTT machen?

@Warmduscher,
Hast du mal bei Node-Red in den Palettenmamger geschaut?

Oben rechts aufs Burgermenu gehen und dann das Feld Palette auswählen.
Hier auf suchen gehen und homee eintippen und installieren auswählen ( wenn du das node gefunden hast ) .

Das sollte alles sein und geht aus Node Red heraus ohne ssh oder Terminal.

VG

YES!! Danke @Micha
Manchmal sieht man den Wald vor lauter Bäumen nicht. Ich habe das Hamburger-Menu gestern schon gesucht gehabt und bin immer im „Stapel“ vom Kontextdaten gewesen. :slight_smile:

1 „Gefällt mir“

So liebe vhih Nutzer ,
nach einem erneuten sterben eines PI musste ich wieder mal die Geräte neu anlernen und die HG’s umbauen.
Eine Funktion zum ersetzen der Geräte gibt es ja schon, aber hier muss man noch die GeräteID’s händisch eingeben und das nervt dann wirklich.
Also habe ich mich an die Funktion ran gemacht und erweitert.
Wichtig ist bei dieser Funktion das die Geräte 1 zu 1 existieren.

So sollte es dann aussehen.
Dann den Flow installieren und ausführen.

erst das get:all auslösen und nach kurzer Zeit das get:homeegrams

[
    {
        "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 (Object.keys(msg.payload)[0] === \"homeegrams\"){\n    \n    var hg = msg.payload.homeegrams;\n    hg.forEach(function(hgs){\n     nodes.forEach(function(nodei){\n        if(nodei.protocol === 21 && nodei.state === 8) {\n            nodeold = nodei.id\n            nodes.forEach(function(noden){\n                if(noden.name === nodei.name && noden.state === 1) {\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": [
            [
                "931bde81.11fb3"
            ]
        ]
    },
    {
        "id": "931bde81.11fb3",
        "type": "link out",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "links": [
            "e204158a.3c9808"
        ],
        "x": 795,
        "y": 500,
        "wires": []
    },
    {
        "id": "916aabd1.fb43e8",
        "type": "inject",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "get:homeegrams",
        "payloadType": "str",
        "x": 640,
        "y": 480,
        "wires": [
            [
                "931bde81.11fb3"
            ]
        ]
    },
    {
        "id": "43c6ee84.2b6ea",
        "type": "inject",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "get:all",
        "payloadType": "str",
        "x": 660,
        "y": 520,
        "wires": [
            [
                "931bde81.11fb3"
            ]
        ]
    },
    {
        "id": "28e990a7.deeab",
        "type": "link in",
        "z": "92bbd3bd.5be8f",
        "name": "",
        "links": [
            "2d175cfc.54ee54"
        ],
        "x": 175,
        "y": 580,
        "wires": [
            [
                "39fe227c.afd74e"
            ]
        ]
    }
]

Nun werden alle Geräte die 1 zu 1 vorhanden sind ausgetauscht in den homeegrammen.
Wichtig altes und neues Geräten sollten identisch sein und auch den gleichen Namen haben und dieser sollte auch einmalig sein.
Am besten die Funktion mal trocken durchlaufen lassen ohne eine Verbindung zum homeeAPI Node.

Somit dauert das Austauschen nur noch wenige Sekunden.

Viel Spaß damit

Edit:
Neuer Flow , nur noch start drücken

[
    {
        "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": []
    }
]



Mit dieser Funktion wird das Protocol und der State über das Inject gesteuert.
Protocol und State stehen in der Beschreibung des Inject.
Der State des alten Nodes und der des neuen Nodes müssen angegeben werden.
Das wären die Einstellungen für das Beispiel oben.
Stateold = 8
Statenew = 1
Protocol = 21

25 „Gefällt mir“

Wahnsinn @Micha ! Beeindruckend was du hier mal so eben nebenbei immer wieder ablieferst. Vielen Dank für dein unermüdliches Engagement! :+1:

3 „Gefällt mir“

Ich finde es auch mal wieder beeindruckend, @Micha :+1:t2:

…und ich frage mich allen Ernstes, warum homee solch eine Elementarfunktion „1:1 ersetzen defekter Geräte“ nicht integrieren kann oder will?!

4 „Gefällt mir“

Das machen Sie nicht damit ich was zum tüfteln habe. :upside_down_face:

9 „Gefällt mir“

Ach ja, ich vergass :stuck_out_tongue_winking_eye: :joy:

1 „Gefällt mir“

Vielleicht ja doch. Erinnere mich noch an deinen Hilferuf, dass du nix mehr zu basteln hast. :crazy_face:

1 „Gefällt mir“

Hallo,
ich bin ganz neu bei node-red und IoBroker. Grundsätzlich habe ich schon virtuelle Geräte erstellt und auch mein Ikea Rollo habe ich schon eingebunden.

Nun probiere ich es schon ein paar Stunden :see_no_evil: mit dem homee Systemstatus von @Micha, aber irgendwie werden zum Schluss keine Daten übernommen und es gibt keine Wert-Änderungen:

grafik

Ich finde den Fehler nicht, hat jemand einen Tipp für mich?

Die Struktur muss so aussehen: {„attribute“:{„id“:91,„value“:1}}.

1 „Gefällt mir“

Ja genau die hat sich geändert.
Du kannst auch ne Funktion schreiben die das fehlende attribute einfügt. Somit muss nicht jedes Templatenode geändert werden.
So habe ich das bei einigen flows gemacht weil ich nicht alles umschreiben wollte.

2 „Gefällt mir“



Das ist eine einfache Möglichkeit um den Fehler zu umgehen mit dem alten Format.

2 „Gefällt mir“

Ok danke, das hab ich jetzt geschafft. Mußte zwar den Flow neu importieren, weil zwischenzeitlich ging gar nichts mehr. Wie man es mit der neue Struktur {„attribute“:{„id“:91,„value“:1}} in diesem Fall richtig macht, habe ich noch nict verstanden bzw. bei den Versuchen damit hatte ich auch Fehlermeldungen. Aber ich bin ja erst am Anfang.

wie gesagt, dann einfach ne Funktion mit dem o.g. Inhalt vor das vhih gerät setzten und fertig.

1 „Gefällt mir“

Weis jemand wie man einen virtuellen Raffstore mit Lamellenposition anlegen kann?
Ich wollt mal die Sonnenautomatik testen :wink:
Raffstore/Rollladen habe ich grundsätzlich geschafft, aber das mit der Lamellenposition schaffe ich nicht, ich bekomme da keinen Schieberegler in homee angezeigt.
Das habe ich ausgewählt:

CANodeProfileElectricMotorMeteringSwitch: 2004,

grafik

Ist es nicht das gleiche Profil wie ein Rollershutter ?

Schieberegler für Lamellenposition habe ich noch nicht geschafft…

Noch eine generelle Frage:
Kann man irgendwo festlegen das für ein Attribut ein Verlauf angelegt wird?