NEWS
[Lösung] Adapter HeatingControl - NodeRed Dashboard
-
Hi Leute.
Ich habe mich ein wenig in das NodeRed Dashboard eingearbeitet und mir eine dynamische Darstellung für das Pflegen der Datenpunkte des HeatingControl Adapters gebaut. Sehr vereinfacht also das, was @Pittini für die Vis gemacht hat. Hier halt nur für das NodeRed Dashboard.
Natürlich ist es noch ausbaufähig, aber da die Struktur innerhalb des Adapters immer sehr ähnlich ist, lässt es sich für Interessierte leicht anpassen. Mein momentanes Beispiel basiert auf 5 Perioden, die für jeden Tag einzeln gepflegt werden (Adapter Einstellungen). Die Namen der Räume müssen im Dropdown noch korrekt gesetzt werden je nach Installation.
So sieht es dann aus:
Selektiere ich in der linken Gruppe ein Profil, einen Wochentag und einen Raum dann werden die Daten dann in der rechten Gruppe geladen und können auch modifiziert werden (Zeit ändern und Temperatur einstellen). Die Datenpunkte werden bei Änderung + Focuswechsel oder Klick auf die Pfeile aktuallisiert.
Da ich relativ am Anfang meiner Reise mit NodeRed stehe, bin ich auch über Feedback dankbar, wie man etwas einfacher oder besser bauen kann. Sonst hoffe ich, dass es vielleicht noch ein paar Leute verwenden können.
Hier der Flow:
[ { "id": "d7486244aef4dca1", "type": "tab", "label": "Visualisierung HeatingControl Tabelle", "disabled": false, "info": "", "env": [] }, { "id": "0dcd6daae4d2dbda", "type": "ui_dropdown", "z": "d7486244aef4dca1", "name": "", "label": "Heizprofil", "tooltip": "", "place": "Select option", "group": "d60b6f99a971eb20", "order": 1, "width": 0, "height": 0, "passthru": false, "multiple": false, "options": [ { "label": "(1) Homeoffice", "value": 1, "type": "num" }, { "label": "(2) Kein Homeoffice", "value": 2, "type": "num" } ], "payload": "", "topic": "Heizprofil", "topicType": "str", "className": "", "x": 320, "y": 40, "wires": [ [ "85fa274351152be5" ] ] }, { "id": "cab4eecd8cfb933b", "type": "ui_dropdown", "z": "d7486244aef4dca1", "name": "", "label": "Wochentag", "tooltip": "", "place": "Select option", "group": "d60b6f99a971eb20", "order": 2, "width": 0, "height": 0, "passthru": false, "multiple": false, "options": [ { "label": "Montag", "value": "Mon", "type": "str" }, { "label": "Dienstag", "value": "Tue", "type": "str" }, { "label": "Mittwoch", "value": "Wed", "type": "str" }, { "label": "Donnerstag", "value": "Thu", "type": "str" }, { "label": "Freitag", "value": "Fri", "type": "str" }, { "label": "Samstag", "value": "Sat", "type": "str" }, { "label": "Sonntag", "value": "Sun", "type": "str" } ], "payload": "", "topic": "Wochentag", "topicType": "str", "className": "", "x": 330, "y": 100, "wires": [ [ "85fa274351152be5" ] ] }, { "id": "173d5d45ae34a29d", "type": "ui_dropdown", "z": "d7486244aef4dca1", "name": "", "label": "Raum", "tooltip": "", "place": "Select option", "group": "d60b6f99a971eb20", "order": 3, "width": 0, "height": 0, "passthru": false, "multiple": false, "options": [ { "label": "(OG) Büro", "value": "OG_BU", "type": "str" }, { "label": "(OG) Heimkino", "value": "OG_HK", "type": "str" }, { "label": "(DG) Fitness", "value": "DG_FI", "type": "str" } ], "payload": "", "topic": "Raum", "topicType": "str", "className": "", "x": 310, "y": 160, "wires": [ [ "85fa274351152be5" ] ] }, { "id": "773c25426dffc7c6", "type": "ui_numeric", "z": "d7486244aef4dca1", "name": "Profil - Zeitraum 1", "label": "Periode 1", "tooltip": "", "group": "579ccae2d2e79186", "order": 1, "width": 6, "height": 1, "wrap": false, "passthru": false, "topic": "topic", "topicType": "msg", "format": "{{value}}", "min": "5", "max": "25", "step": "0.5", "className": "", "x": 1230, "y": 20, "wires": [ [ "b144ed59aed9271a" ] ] }, { "id": "208af488611a0ec7", "type": "ioBroker get", "z": "d7486244aef4dca1", "name": "Lade Temperatur", "topic": "", "attrname": "payload", "payloadType": "value", "errOnInvalidState": "nothing", "x": 990, "y": 20, "wires": [ [ "773c25426dffc7c6" ] ] }, { "id": "85fa274351152be5", "type": "join", "z": "d7486244aef4dca1", "name": "", "mode": "custom", "build": "object", "property": "payload", "propertyType": "msg", "key": "topic", "joiner": "\\n", "joinerType": "str", "accumulate": true, "timeout": "", "count": "3", "reduceRight": false, "reduceExp": "", "reduceInit": "", "reduceInitType": "", "reduceFixup": "", "x": 510, "y": 100, "wires": [ [ "9b3026a64cf43adc", "cad860118d81cfe1", "2ac04350942283a8", "aea2f89e4805c273", "c196bf7fd669a980", "715c5af2d00c64a7", "a237bc9bf2e80ebd", "6686102cd5e24e27", "ad97637293b9d9f7", "ac2c73f8e64292df" ] ] }, { "id": "9b3026a64cf43adc", "type": "change", "z": "d7486244aef4dca1", "name": "Periode 1", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "\"heatingcontrol.0.Profiles.\"&$.payload.Heizprofil&\".\"&$.payload.Raum&\".\"&$.payload.Wochentag&\".Periods.1.Temperature\"", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 780, "y": 20, "wires": [ [ "208af488611a0ec7" ] ] }, { "id": "b4f118ecfb009177", "type": "ioBroker get", "z": "d7486244aef4dca1", "name": "Lade Temperatur", "topic": "", "attrname": "payload", "payloadType": "value", "errOnInvalidState": "nothing", "x": 990, "y": 80, "wires": [ [ "d629aab76e944bb1" ] ] }, { "id": "cad860118d81cfe1", "type": "change", "z": "d7486244aef4dca1", "name": "Periode 2", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "\"heatingcontrol.0.Profiles.\"&$.payload.Heizprofil&\".\"&$.payload.Raum&\".\"&$.payload.Wochentag&\".Periods.2.Temperature\"", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 780, "y": 80, "wires": [ [ "b4f118ecfb009177" ] ] }, { "id": "c8399ca5c6b3220d", "type": "ui_numeric", "z": "d7486244aef4dca1", "name": "Profil - Zeitraum 3", "label": "Periode 3", "tooltip": "", "group": "579ccae2d2e79186", "order": 5, "width": 6, "height": 1, "wrap": false, "passthru": false, "topic": "topic", "topicType": "msg", "format": "{{value}}", "min": "5", "max": "25", "step": "0.5", "className": "", "x": 1230, "y": 140, "wires": [ [ "a4467d19e5573c50" ] ] }, { "id": "fcf5059cd2fb1f0c", "type": "ioBroker get", "z": "d7486244aef4dca1", "name": "Lade Temperatur", "topic": "", "attrname": "payload", "payloadType": "value", "errOnInvalidState": "nothing", "x": 990, "y": 140, "wires": [ [ "c8399ca5c6b3220d" ] ] }, { "id": "2ac04350942283a8", "type": "change", "z": "d7486244aef4dca1", "name": "Periode 3", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "\"heatingcontrol.0.Profiles.\"&$.payload.Heizprofil&\".\"&$.payload.Raum&\".\"&$.payload.Wochentag&\".Periods.3.Temperature\"", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 780, "y": 140, "wires": [ [ "fcf5059cd2fb1f0c" ] ] }, { "id": "fcc32382b27c7bf9", "type": "ui_numeric", "z": "d7486244aef4dca1", "name": "Profil - Zeitraum 4", "label": "Periode 4", "tooltip": "", "group": "579ccae2d2e79186", "order": 7, "width": 6, "height": 1, "wrap": false, "passthru": false, "topic": "topic", "topicType": "msg", "format": "{{value}}", "min": "5", "max": "25", "step": "0.5", "className": "", "x": 1230, "y": 200, "wires": [ [ "49024e36bb75c3f6" ] ] }, { "id": "36972a6d0b97cb48", "type": "ioBroker get", "z": "d7486244aef4dca1", "name": "Lade Temperatur", "topic": "", "attrname": "payload", "payloadType": "value", "errOnInvalidState": "nothing", "x": 990, "y": 200, "wires": [ [ "fcc32382b27c7bf9" ] ] }, { "id": "aea2f89e4805c273", "type": "change", "z": "d7486244aef4dca1", "name": "Periode 4", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "\"heatingcontrol.0.Profiles.\"&$.payload.Heizprofil&\".\"&$.payload.Raum&\".\"&$.payload.Wochentag&\".Periods.4.Temperature\"", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 780, "y": 200, "wires": [ [ "36972a6d0b97cb48" ] ] }, { "id": "0266ede1d351e3d1", "type": "ui_numeric", "z": "d7486244aef4dca1", "name": "Profil - Zeitraum 5", "label": "Periode 5", "tooltip": "", "group": "579ccae2d2e79186", "order": 9, "width": 6, "height": 1, "wrap": false, "passthru": false, "topic": "topic", "topicType": "msg", "format": "{{value}}", "min": "5", "max": "25", "step": "0.5", "className": "", "x": 1230, "y": 260, "wires": [ [ "b4939f8abb67a3ee" ] ] }, { "id": "d66101d8153e2f8e", "type": "ioBroker get", "z": "d7486244aef4dca1", "name": "Lade Temperatur", "topic": "", "attrname": "payload", "payloadType": "value", "errOnInvalidState": "nothing", "x": 990, "y": 260, "wires": [ [ "0266ede1d351e3d1" ] ] }, { "id": "c196bf7fd669a980", "type": "change", "z": "d7486244aef4dca1", "name": "Periode 5", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "\"heatingcontrol.0.Profiles.\"&$.payload.Heizprofil&\".\"&$.payload.Raum&\".\"&$.payload.Wochentag&\".Periods.5.Temperature\"", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 780, "y": 260, "wires": [ [ "d66101d8153e2f8e" ] ] }, { "id": "715c5af2d00c64a7", "type": "change", "z": "d7486244aef4dca1", "name": "Periode 1", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "\"heatingcontrol.0.Profiles.\"&$.payload.Heizprofil&\".\"&$.payload.Raum&\".\"&\t$.payload.Wochentag&\".Periods.1.time\"", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 780, "y": 340, "wires": [ [ "aa79a7739e2fb39c" ] ] }, { "id": "a237bc9bf2e80ebd", "type": "change", "z": "d7486244aef4dca1", "name": "Periode 2", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "\"heatingcontrol.0.Profiles.\"&$.payload.Heizprofil&\".\"&$.payload.Raum&\".\"&$.payload.Wochentag&\".Periods.2.time\"", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 780, "y": 400, "wires": [ [ "791a37c2a7b8ce71" ] ] }, { "id": "6686102cd5e24e27", "type": "change", "z": "d7486244aef4dca1", "name": "Periode 3", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "\"heatingcontrol.0.Profiles.\"&$.payload.Heizprofil&\".\"&$.payload.Raum&\".\"&$.payload.Wochentag&\".Periods.3.time\"", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 780, "y": 460, "wires": [ [ "e06be6c53c6703f2" ] ] }, { "id": "ad97637293b9d9f7", "type": "change", "z": "d7486244aef4dca1", "name": "Periode 4", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "\"heatingcontrol.0.Profiles.\"&$.payload.Heizprofil&\".\"&$.payload.Raum&\".\"&$.payload.Wochentag&\".Periods.4.time\"", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 780, "y": 520, "wires": [ [ "7ecc3b8037979f8e" ] ] }, { "id": "ac2c73f8e64292df", "type": "change", "z": "d7486244aef4dca1", "name": "Periode 5", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "\"heatingcontrol.0.Profiles.\"&$.payload.Heizprofil&\".\"&$.payload.Raum&\".\"&$.payload.Wochentag&\".Periods.5.time\"", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 780, "y": 580, "wires": [ [ "014e58f4dea2d90e" ] ] }, { "id": "014e58f4dea2d90e", "type": "ioBroker get", "z": "d7486244aef4dca1", "name": "Lade Zeit", "topic": "", "attrname": "payload", "payloadType": "value", "errOnInvalidState": "nothing", "x": 960, "y": 580, "wires": [ [ "1cfd9ed9e6902c43" ] ] }, { "id": "7ecc3b8037979f8e", "type": "ioBroker get", "z": "d7486244aef4dca1", "name": "Lade Zeit", "topic": "", "attrname": "payload", "payloadType": "value", "errOnInvalidState": "nothing", "x": 960, "y": 520, "wires": [ [ "094f9dceca896961" ] ] }, { "id": "e06be6c53c6703f2", "type": "ioBroker get", "z": "d7486244aef4dca1", "name": "Lade Zeit", "topic": "", "attrname": "payload", "payloadType": "value", "errOnInvalidState": "nothing", "x": 960, "y": 460, "wires": [ [ "ccef6810ab3dcfb7" ] ] }, { "id": "791a37c2a7b8ce71", "type": "ioBroker get", "z": "d7486244aef4dca1", "name": "Lade Zeit", "topic": "", "attrname": "payload", "payloadType": "value", "errOnInvalidState": "nothing", "x": 960, "y": 400, "wires": [ [ "0f0326822a0a4c82" ] ] }, { "id": "aa79a7739e2fb39c", "type": "ioBroker get", "z": "d7486244aef4dca1", "name": "Lade Zeit", "topic": "", "attrname": "payload", "payloadType": "value", "errOnInvalidState": "nothing", "x": 960, "y": 340, "wires": [ [ "200ec0940a45bf3f" ] ] }, { "id": "200ec0940a45bf3f", "type": "ui_text_input", "z": "d7486244aef4dca1", "name": "Büro - Profil 1 - Zeit", "label": "", "tooltip": "", "group": "579ccae2d2e79186", "order": 2, "width": 2, "height": 1, "passthru": false, "mode": "text", "delay": 300, "topic": "topic", "sendOnBlur": true, "className": "", "topicType": "msg", "x": 1210, "y": 340, "wires": [ [ "b31dc92fa4810a6e" ] ] }, { "id": "0f0326822a0a4c82", "type": "ui_text_input", "z": "d7486244aef4dca1", "name": "Büro - Profil 2 - Zeit", "label": "", "tooltip": "", "group": "579ccae2d2e79186", "order": 4, "width": 2, "height": 1, "passthru": false, "mode": "text", "delay": 300, "topic": "topic", "sendOnBlur": true, "className": "", "topicType": "msg", "x": 1210, "y": 400, "wires": [ [ "181421ea9d8e9426" ] ] }, { "id": "ccef6810ab3dcfb7", "type": "ui_text_input", "z": "d7486244aef4dca1", "name": "Büro - Profil 3 - Zeit", "label": "", "tooltip": "", "group": "579ccae2d2e79186", "order": 6, "width": 2, "height": 1, "passthru": false, "mode": "text", "delay": 300, "topic": "topic", "sendOnBlur": true, "className": "", "topicType": "msg", "x": 1210, "y": 460, "wires": [ [ "bb12fc8f98d48e51" ] ] }, { "id": "094f9dceca896961", "type": "ui_text_input", "z": "d7486244aef4dca1", "name": "Büro - Profil 4 - Zeit", "label": "", "tooltip": "", "group": "579ccae2d2e79186", "order": 8, "width": 2, "height": 1, "passthru": false, "mode": "text", "delay": 300, "topic": "topic", "sendOnBlur": true, "className": "", "topicType": "msg", "x": 1210, "y": 520, "wires": [ [ "32b2c1496819464f" ] ] }, { "id": "1cfd9ed9e6902c43", "type": "ui_text_input", "z": "d7486244aef4dca1", "name": "Büro - Profil 5- Zeit", "label": "", "tooltip": "", "group": "579ccae2d2e79186", "order": 10, "width": 2, "height": 1, "passthru": false, "mode": "text", "delay": 300, "topic": "topic", "sendOnBlur": true, "className": "", "topicType": "msg", "x": 1210, "y": 580, "wires": [ [ "d52424ac4c245ffa" ] ] }, { "id": "b144ed59aed9271a", "type": "ioBroker out", "z": "d7486244aef4dca1", "name": "Schreiben", "topic": "", "ack": "false", "autoCreate": "false", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 20, "wires": [] }, { "id": "bdb8b104467f2ec5", "type": "ioBroker out", "z": "d7486244aef4dca1", "name": "Schreiben", "topic": "", "ack": "false", "autoCreate": "false", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 80, "wires": [] }, { "id": "a4467d19e5573c50", "type": "ioBroker out", "z": "d7486244aef4dca1", "name": "Schreiben", "topic": "", "ack": "false", "autoCreate": "false", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 140, "wires": [] }, { "id": "49024e36bb75c3f6", "type": "ioBroker out", "z": "d7486244aef4dca1", "name": "Schreiben", "topic": "", "ack": "false", "autoCreate": "false", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 200, "wires": [] }, { "id": "b4939f8abb67a3ee", "type": "ioBroker out", "z": "d7486244aef4dca1", "name": "Schreiben", "topic": "", "ack": "false", "autoCreate": "false", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 260, "wires": [] }, { "id": "b31dc92fa4810a6e", "type": "ioBroker out", "z": "d7486244aef4dca1", "name": "Schreiben", "topic": "", "ack": "false", "autoCreate": "false", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 340, "wires": [] }, { "id": "181421ea9d8e9426", "type": "ioBroker out", "z": "d7486244aef4dca1", "name": "Schreiben", "topic": "", "ack": "false", "autoCreate": "false", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 400, "wires": [] }, { "id": "bb12fc8f98d48e51", "type": "ioBroker out", "z": "d7486244aef4dca1", "name": "Schreiben", "topic": "", "ack": "false", "autoCreate": "false", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 460, "wires": [] }, { "id": "32b2c1496819464f", "type": "ioBroker out", "z": "d7486244aef4dca1", "name": "Schreiben", "topic": "", "ack": "false", "autoCreate": "false", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 520, "wires": [] }, { "id": "d52424ac4c245ffa", "type": "ioBroker out", "z": "d7486244aef4dca1", "name": "Schreiben", "topic": "", "ack": "false", "autoCreate": "false", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1460, "y": 580, "wires": [] }, { "id": "c589b0a966719f74", "type": "inject", "z": "d7486244aef4dca1", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": true, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "str", "x": 1050, "y": 300, "wires": [ [ "773c25426dffc7c6", "c8399ca5c6b3220d", "fcc32382b27c7bf9", "0266ede1d351e3d1", "200ec0940a45bf3f", "0f0326822a0a4c82", "ccef6810ab3dcfb7", "094f9dceca896961", "1cfd9ed9e6902c43", "d629aab76e944bb1" ] ] }, { "id": "7995318aa8070394", "type": "inject", "z": "d7486244aef4dca1", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": true, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "str", "x": 90, "y": 40, "wires": [ [ "0dcd6daae4d2dbda", "cab4eecd8cfb933b", "173d5d45ae34a29d" ] ] }, { "id": "d629aab76e944bb1", "type": "ui_numeric", "z": "d7486244aef4dca1", "name": "Profil - Zeitraum 2", "label": "Periode 2", "tooltip": "", "group": "579ccae2d2e79186", "order": 3, "width": 6, "height": 1, "wrap": false, "passthru": false, "topic": "topic", "topicType": "msg", "format": "{{value}}", "min": "5", "max": "25", "step": "0.5", "className": "", "x": 1230, "y": 80, "wires": [ [ "bdb8b104467f2ec5" ] ] }, { "id": "d60b6f99a971eb20", "type": "ui_group", "name": "Komponentenauswahl", "tab": "2f20796e8f897eb0", "order": 1, "disp": true, "width": "8", "collapse": false, "className": "" }, { "id": "579ccae2d2e79186", "type": "ui_group", "name": "Profil bearbeiten", "tab": "2f20796e8f897eb0", "order": 2, "disp": true, "width": "8", "collapse": false, "className": "" }, { "id": "2f20796e8f897eb0", "type": "ui_tab", "name": "Zeitsteuerung Heizung - Übersicht", "icon": "fa-calendar", "order": 7, "disabled": false, "hidden": false } ]
-
@tableautin Ich versuche das gerade für meine Bedürfnisse etwas anzupassen. Das wollte ich schon lange mal in die Hand nehmen. Eine kleine Verbesserung wäre, wenn Du die topics gleich in die entsprechenden Nodes aufnimmst, dann kannst Du alles in eine iobroker-Out Node leiten.
Ich werde mich allerdings nicht nach dem Adapter richten und auch mal dieses Thema in Angriff nehmen - werde aber mich an die Strings halten, die ich für meine MAX Heizung mit dem fhem adapter benötige.
-
@mickym Danke für den Hinweis. Werde ich mit der nächsten Version einmal anschauen. Wenn du deine Lösung hast, wäre ich daran auch interessiert (einfach um zu schauen, wie du es umgesetzt hast)
-
So nachdem Du mich @Tableautin mit diesem Thread mich mal wieder dazu motiviert hast, die Zeitpläne meiner Thermostaten in Angriff zu nehmen und an meiner Lösung interessiert bist, bin ich jetzt nach ein paar Tagen Arbeit mit meiner Lösung fertig, wobei mich das einiges Kopfzerbrechen gekostet hat. Inzwischen bin ich aber mit dem Projekt fertig und ganz zufrieden. Und auch wenn ich am Anfang Deinen Entwurf genommen habe, hat meine Lösung nicht mehr viel mit Deiner zu tun, da ich ja nicht den Heating Control Adapter verwende.
Das ist eine Grundsatzentscheidung, da ich grundsätzlich der Meinung bin, dass wenn die Geräte hinreichende Intelligenz aufweisen, dann lasse ich das durch die Geräte steuern. Das hat einfach den Vorteil, dass die Zeitsteuerung auch funktioniert, wenn der iobroker nicht verfügbar ist. Es minimiert auch die Belastung des iobrokers, sowie des Netzes da ja die Hardware nur mit sich selbst kommuniziert und die Steuerung der Heizung nicht über WLAN läuft.
Bevor ich also zum Dashboard komme will ich ein kleines Schaubild der Kommunikation meines MAX - Heizungssystem machen (Dieses System gibt es inzwischen nicht mehr und ich habe auch keine Veranlassung gesehen, auch Homematic umzusteigen).
So hier erst mal die grundsätzliche Architektur, dass man den Rest versteht:
-
So weiter im Kontext - wie man sieht werden die Wochenprofile durch FHEM gesteuert und via mqtt in den iobroker übertragen.
Diese Daten werden im NodeRed Flow eingelesen - damit man den Flow nachvollziehen kann - habe ich diese Datenpunkte in eine Injekt-Node verfrachtet.
Und alle Nodes deaktiviert, die nicht funktionieren - weil die Datenpunkte nicht vorhanden sind. Die Demo Node wird automatisch ausgeführt.
im Demo-Mode ist die erste Gruppe nicht mit allen Elementen zu sehen. So sieht es vollständig aus:
Von links nach rechts.
Im 1. Gruppe wählt man ggf. ein Datei zum Upload aus. (Neben der Inject- Node als Test). Hier habe ich mal 3 Dateien als Beispiel hier - das ist wie gesagt FHEM Syntax für den MAX Cube.MAX_Wohnzimmer_weekProfile.txt MAX_Buero_weekProfile.txt MAX_Bad_weekProfile.txt
Sind keine Daten für den entsprechenden Wochentag vorhanden, dann werden die anderen Gruppen ausgeblendet.
In der 2. Gruppe kann das selektierte Tagesprofil editiert werden.
Es sind soweit mir möglich war alle Möglichkeiten durchgetest. In der Regel sind die Perioden automatisch nach der Tageszeit sortiert. Eine Periode ist zwingend bei 0:00 Uhr erforderlich. Wenn sich eine Periode mit gleicher Temperatur anschließt wird diese gelöscht bzw. die Eingabe wird nicht akzeptiert.
Unten kann man dann Perioden löschen oder neue hinzufügen.Sobald ein Tagesplan zufriedenstellend editiert wurde kann man den in der 3. Gruppe für verschiedene Tage erstellen lassen.
Das ganze muss man sich halt im Debug Fenster ausgeben lassen. Der Download/Export geht nur, wenn man ggf. den Ort wohin der Export geschrieben wird - also relativ zum http-Static Pfad.
Hier das Ganze zum Testen, wer Lust hat.