Homee Tagebuch visualisieren?

Hallo zusammen!
Kennt jemand von euch eine Möglichkeit, das homee Tagebuch auf einem zB Tablet sichtbar zu machen? Möchte nicht immer die App öffnen. Kurzer Blick auf das Dashboard im Flur und ich kann sehen, womit sich die Würfel gerade so beschäftigen. Node-Red und ioBroker sind vorhanden.

Du kannst das Tagebuch abfragen aber das wird dir nicht viel bringen da hier nur ID‘s hinterlegt sind.

Was willst du denn auf dem Dashboard darstellen ?
Wenn du die einzelnen Nachrichten die homee verarbeitet anzeigen willst, dann ist das doch recht gut mit Node Red umsetzbar.

Ich stelle mir das in etwa so vor:
18.20 Uhr Rollläden OG geschlossen
18.35 Uhr Gartentor geöffnet
18.45 Uhr Präsenzmelder Vordach ausgelöst
19.00 Uhr Gartenbeleuchtung angeschaltet

Habe in Node Red das Node homee.log gesehen. Ginge das vielleicht damit?

Nein es geht rein über das api Node. Du musst ja nur den Namen zum entsprechenden Attribut filtern und den current_value umschreiben je nach Attributtyp

Wie weit bist du schon gekommen ?

Hallo @Micha
ich habe mir das jetzt mal ein bisschen angesehen, aber das ist doch zu hoch für mich. Einfache datenpunkte aus ioB an homee weiterreichen, das geht. Aber filtern und umwandeln ? Da muss ich passen.

[
    {
        "id": "14a10ca6.4e63d3",
        "type": "function",
        "z": "acb00e70.85a73",
        "name": "Testfunktion",
        "func": "// Variablen\nconst nodes = global.get(\"homee.nodes\");\nconst homeegrams = global.get(\"homee.homeegrams\");\nconst attributes = global.get(\"homee.attributes\");\nconst groups = global.get(\"homee.groups\");\n\n\n// Datum\nvar d = new Date();\nvar date2 = d.getDate() + \"-\" + (d.getMonth() + 1) + \"-\" + d.getFullYear()+\" \"+d.getHours()+\":\"+d.getMinutes()+\":\"+d.getSeconds();\n\n\n// Value Type Switch\nif (msg.payload.attribute && msg.payload.attribute.current_value === msg.payload.attribute.target_value && msg.payload.attribute.current_value != msg.payload.attribute.last_value){\nvar value = msg.payload.attribute.current_value;\nswitch(msg.payload.attribute.type){\n    case 1 : switch(msg.payload.attribute.current_value){\n        case 1: value = \"angeschaltet\";\n        break;\n        case 0: value = \"ausgeschaltet\";\n        break\n    }\n    break;\n    case 25 : switch(msg.payload.attribute.current_value){\n        case 1: value = \"Bewegung erkannt\";\n        break;\n        case 0: value = \"keine Bewegung\";\n        break\n    }\n    break\n}\n\n// Ausgabe\n\nnode.send({\n    payload:\n    date2+\" \"+\n    String(decodeURI(node_id(msg.payload.attribute.node_id).name))+\n    \" \"+\n    value+\n    \" \"+\n    decodeURI(msg.payload.attribute.unit)\n    \n})\n}\n\n// Functionen \nfunction node_id(x) {\n    return nodes.find(no => no.id === x)\n}\nfunction hgs_id(x) {\n    return homeegrams.find(hg => hg.id === x)\n}\nfunction attribut_id(x) {\n    return attributes.find(at => at.id === x)\n}\nfunction group_id(x) {\n    return groups.find(gr => gr.id === x)\n}\nfunction nodefe_id(x) {\n    var y = [];\n    nodes.forEach(function(no){if (no.protocol === x ){ \n        \n        y.push(no) }})\n    return y\n}\n\n    ",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 470,
        "y": 820,
        "wires": [
            [
                "4e176190.b3d4f8"
            ]
        ]
    }
]

hier mal ne Idee für einen Ansatz
Für die Bewegungsmelder und Schalter habe ich mal schon nen switch angelegt.
die Funktion wird gespeist durch das homee Node und an der Funktion kannst ja mal nen Debug dran hängen und dann siehst du alles umgewandelt.

Der globale Kontext muss aktiviert sein im homee node.

VG

Muss nur noch die Uhrzeit richtig formatiert werden.

4 „Gefällt mir“

Dashboard von node Red

2 „Gefällt mir“

Super, vielen Dank @Micha das funktioniert :slight_smile:
Jetzt laufen da natürlich alle Aktivitäten durch. Gibt es die Möglichkeit, nur bestimmte Meldungen zur Anzeige zu bringen? Zb nur die Schalter und/oder die Bewegungsmelder?

Und noch eine andere Frage: belastet das den homee zu sehr, wenn er ständig diese Abfrage bekommt?

Nein den homee belastet das garnicht.
Es wird ja eine Websocket Verbindung hergestellt und homee sendet einfach alles was kommt darüber.
Das node ist wie eine App die offen ist.

Ja die Daten können auch auf die entsprechenden Attributtyp gefiltert werden so das dann nur die gewünschten ausgegeben werden.

Edit: @Foerster solltest du wegen dem
Filter Fragen haben dann nur zu.

Hallo @Foerster
ich fange gerade erst an mich mit Node Red zu beschäftigen und habe da leider noch gar keinen Durchblick. Könntest du bitte deinen gesamten Flow einstellen, damit ich nachvollziehen kann, wie sowas aufgebaut ist?

Danke!

Hallo @Micha

ich habe mal versucht den Flow wie folgt nachzubauen

Leider habe ich keine Ahnung, ob der so richtig ist.
Ich bekomme leider auch eine Fehlermeldung bei Start (siehe Bild).

Was müsste ich Ändern um folgendes zu realisieren?

  1. den Fehler zu beseitigen.
  2. eine Filterung der Daten um das Tagebuch so ähnlich wie möglich abzubilden
  3. die Daten als Json in einen Datenpunk in ioBroker zu schreiben

Danke!!

Kannst du mal deinen Flow einstellen?
Ich weiß jetzt nicht welchen du genommen hast.
Dann kann ich dir da weiter helfen.
Auch die Node red Version ist wichtig.

Hallo @Micha ,
danke für deine Hilfe.
Node Red Version ist die v3.0.2.

Hier der Flow:

[
    {
        "id": "923267c8ae275a5e",
        "type": "tab",
        "label": "homee Tagebuch",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "14a10ca6.4e63d3",
        "type": "function",
        "z": "923267c8ae275a5e",
        "name": "Testfunktion",
        "func": "// Variablen\nconst nodes = global.get(\"homee.nodes\");\nconst homeegrams = global.get(\"homee.homeegrams\");\nconst attributes = global.get(\"homee.attributes\");\nconst groups = global.get(\"homee.groups\");\n\n\n// Datum\nvar d = new Date();\nvar date2 = d.getDate() + \"-\" + (d.getMonth() + 1) + \"-\" + d.getFullYear()+\" \"+d.getHours()+\":\"+d.getMinutes()+\":\"+d.getSeconds();\n\n\n// Value Type Switch\nif (msg.payload.attribute && msg.payload.attribute.current_value === msg.payload.attribute.target_value && msg.payload.attribute.current_value != msg.payload.attribute.last_value){\nvar value = msg.payload.attribute.current_value;\nswitch(msg.payload.attribute.type){\n    case 1 : switch(msg.payload.attribute.current_value){\n        case 1: value = \"angeschaltet\";\n        break;\n        case 0: value = \"ausgeschaltet\";\n        break\n    }\n    break;\n    case 25 : switch(msg.payload.attribute.current_value){\n        case 1: value = \"Bewegung erkannt\";\n        break;\n        case 0: value = \"keine Bewegung\";\n        break\n    }\n    break\n}\n\n// Ausgabe\n\nnode.send({\n    payload:\n    date2+\" \"+\n    String(decodeURI(node_id(msg.payload.attribute.node_id).name))+\n    \" \"+\n    value+\n    \" \"+\n    decodeURI(msg.payload.attribute.unit)\n    \n})\n}\n\n// Functionen \nfunction node_id(x) {\n    return nodes.find(no => no.id === x)\n}\nfunction hgs_id(x) {\n    return homeegrams.find(hg => hg.id === x)\n}\nfunction attribut_id(x) {\n    return attributes.find(at => at.id === x)\n}\nfunction group_id(x) {\n    return groups.find(gr => gr.id === x)\n}\nfunction nodefe_id(x) {\n    var y = [];\n    nodes.forEach(function(no){if (no.protocol === x ){ \n        \n        y.push(no) }})\n    return y\n}\n\n    ",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 670,
        "y": 200,
        "wires": [
            []
        ]
    },
    {
        "id": "62424b98b4fc72b6",
        "type": "inject",
        "z": "923267c8ae275a5e",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "GET:/nodes",
        "payloadType": "str",
        "x": 270,
        "y": 200,
        "wires": [
            []
        ]
    },
    {
        "id": "c7c9b4f95ac00793",
        "type": "homeeApi",
        "z": "923267c8ae275a5e",
        "homee": "",
        "name": "homeeApi",
        "messageTypeFilter": [],
        "nodeFilter": "",
        "attributeFilter": "",
        "x": 500,
        "y": 200,
        "wires": [
            [
                "14a10ca6.4e63d3"
            ]
        ]
    },
    {
        "id": "9dfba987d0fb63cf",
        "type": "ioBroker out",
        "z": "923267c8ae275a5e",
        "name": "Logdatei",
        "topic": "0_userdata.0.System.homee.Logdatei",
        "ack": "false",
        "autoCreate": "false",
        "stateName": "",
        "role": "",
        "payloadType": "",
        "readonly": "",
        "stateUnit": "",
        "stateMin": "",
        "stateMax": "",
        "x": 860,
        "y": 200,
        "wires": []
    }
]

Hallo @Oliver1
bin noch unterwegs und erst morgen wieder am Rechner. Aktuell habe ich den Flow nicht mehr aktiv, müsste aber noch vorhanden sein.

Gute Idee, das Tagebuch nachzubilden.

Grüße
Christian

Habe den Flow getestet und er funktioniert wie es sollte.
Hast du im homee Node etwas eingestellt ?

Die Fehlermeldung kannst du aber ignorieren.
Da kommt dann eine Nachricht durch die nicht das entsprechende Attribut „name“ hat und daher der Fehler.

Hallo Micha,
danke erstmal für testen. Die Probleme was ich habe sind, dass er mir nicht nur die Schaltvorgänge ausgibt, sondern auch jede Änderung der Verbräuche und mir in den Datenpunkt keine JSON schreibt, sondern mit jedem neuen Ereignis das vorherige überschreibt.

Was mir noch aufgefallen ist, dass mir die Ereignissen bei den Fensterkontakten nicht ausgibt,

Der Status wird dir nur als Zahl ausgeben für die Fenster.
Dazu musst du noch ein Case erstellen mit geöffnet / geschlossen oder gekippt

Willst du die Werte alle als Json haben ?
Oder wie brauchst du die Werte?

Eigentlich wollte ich das in einer Tabelle mit 4 Spalten darstellen.

Spalte 1 = Datum und Uhrzei
Spalte 2 = Sensorname / homeegramm
Spalte 3 = Was gemacht wurde
Spalte 4 = ob es ausgeführt (Warung, Error, Info)

Ob das alles möglichst ist weiß ich nicht.