Heizung aus, wenn bei allen Räumen soll Temp erreicht

Node-RED als CCU3/RaspberryMatic Addon, WebApp, HomeKit, ...

Moderator: Co-Administratoren

Benutzeravatar
Henke
Beiträge: 1524
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 141 Mal
Danksagung erhalten: 306 Mal

Re: Heizung aus, wenn bei allen Räumen soll Temp erreicht

Beitrag von Henke » 30.10.2022, 05:02

Etagenweise?
In NodeRed müsste man bei dem Beispiel oben nur pro Etage noch einen Eingang machen. Ziemlich simpel also und kein großer Unterschied, da das Beispiel schon differenziert zwischen Heizkörper und Fußbodenheizung.

Ich selber habe ein Script fertig gehabt, bei dem mal beliebig viele Gruppen anlegen konnte und das dann den Bedarf sowie das Raumklima erzeugte, aber da die Programme der CCU durch fehlende Unterroutinen kaum wartbar sind, mal ganz abgesehen von der Logik bei Neustart, bin ich zu 90% auf NodeRed umgestiegen und habe das Programm eingestampft. Wobei ich aus NodeRed heraus auf Programme auf der CCU durchaus noch zugreife (3 komplexere und 2 die ausschließlich auf der CCU laufen). Das sind aber nur noch recht wenige und der Duty.Cycle dankt es mir. Variablen brauche ich nur als Ausgang/Anzeige für den Historian bzw. Neo.

Ein etwas komplexere Steuerung wie z.B.:
Screenshot 2022-10-30 040306.jpg
Screenshot 2022-10-30 040628.jpg
dürfte mit CCU-Programmen nicht mehr realisierbar sein.

Was ich aktuell noch gebrauchen könnte, wäre, egal ob CCU-Script, CCU-Programm, Java Script oder NodeRed Flow:
Das fehlende Element der Zirkulationspumpensteuerung. Aktuell wird sie über die Anforderung Vorlauf, Erzeugung Warmwasser und feste Zeiten an geschaltet und über die zeitliche Delta der Rücklaufes ausgeschaltet. Funktioniert gut und es war sogar zu sehen wie sich die Zeiten reduzieren, nachdem die neue Pumpe eingelaufen war.
Anhand der anwesenden Personen und des Wochentages (Feiertag,Urlaub,Arbeitstag) eine automatische Analyse der Gewohnheiten und daraus resultierend eine sich immer aktualisierende Tabelle nach der die Pumpe im Vorfeld gestartet werden kann.
Da es ja alles schon gibt, nur leider finde ich es nicht.

Ach ja, die guten alten Zeiten, C Compiler von Diskette starten...
Hmmm, C++ - objektorientiert von SSD gestartet..., macht bei mehreren Millionen Zeilen Quellcode einfach mehr Sinn. :lol:

Lange Rede, kurzer Sinn, wenn jemand NodeRed am laufen hat, geht der nicht mehr auf die CCU zurück.

mrKnuspel
Beiträge: 10
Registriert: 14.10.2022, 10:25
System: Alternative CCU (auf Basis OCCU)

Re: Heizung aus, wenn bei allen Räumen soll Temp erreicht

Beitrag von mrKnuspel » 30.10.2022, 14:50

Hallo,

danke erstmal für eure Beispiele. Das übersteigt bei weitem meine Fähigkeiten.
Habe den ganzen Tag versucht irgendwie daraus schlau zu werden, aber ich bekomme da nix hin.

Es muss doch irgendwie gehen eine einfache wenn-dann funktion auszuführen (wenn Eingänge 3-6 true dann true, ansonsten fales). Letztendlich stehe ich wieder am Anfang und bin keinen Schritt weiter gekommen.

Habe auch mit dem rpc-event note experimentiert und den valve-state abgerufen, was vom Prinzip auch funktioniert, aber auch da gibt es ja ein wildes geschalte. Selbst wenn der rbe-node dazwischen gehangen wird, lässt der ja bei jeder Änderung durch.
Bin gerade nur noch verwirrt und hab absolut keinen Plan mehr. Bei Fhem ging das irgendwie besser, evtl. geh ich dann doch wieder dorthin zurück.

Gruß Stefan

Edit: Oder ich nehme die Lösung von Robbi77, aber da vermische ich halt alles und dass sollte eigentlich nicht sein.
Umstieg von FHEM zu RaspberryMatic mit RedMatic auf Raspberry 3B+

Benutzeravatar
Henke
Beiträge: 1524
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 141 Mal
Danksagung erhalten: 306 Mal

Re: Heizung aus, wenn bei allen Räumen soll Temp erreicht

Beitrag von Henke » 30.10.2022, 16:42

Hast du meinen Flow importiert und die Geräte angepasst?

Reduziert und die Abfrage auf die Heizungsgruppen angepasst:

Code: Alles auswählen

[
    {
        "id": "ba1cc1ab6b95cb02",
        "type": "combine-logic",
        "z": "72181fa0ef2f6078",
        "name": "",
        "topic": "",
        "operator": "or",
        "defer": 250,
        "timeout": "",
        "distinction": "topic",
        "x": 840,
        "y": 240,
        "wires": [
            [
                "bbca7c8945f8fe5c"
            ]
        ]
    },
    {
        "id": "7fc50906e0b3de62",
        "type": "switch",
        "z": "72181fa0ef2f6078",
        "name": "LEVEL",
        "property": "datapoint",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "LEVEL",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 360,
        "y": 240,
        "wires": [
            [
                "1ea1a82d35c21c7e",
                "cf054acfcd2cd989"
            ]
        ]
    },
    {
        "id": "bcefd41cffd1dcfa",
        "type": "debug",
        "z": "72181fa0ef2f6078",
        "name": "debug 17",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "true",
        "targetType": "full",
        "statusVal": "payload",
        "statusType": "msg",
        "x": 1020,
        "y": 300,
        "wires": []
    },
    {
        "id": "1ea1a82d35c21c7e",
        "type": "switch",
        "z": "72181fa0ef2f6078",
        "name": "0.10",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "gt",
                "v": "0.10",
                "vt": "num"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 510,
        "y": 240,
        "wires": [
            [
                "ef18c41b8f8cce0c"
            ],
            [
                "fb11200a27a1a14f"
            ]
        ]
    },
    {
        "id": "ef18c41b8f8cce0c",
        "type": "change",
        "z": "72181fa0ef2f6078",
        "name": "1",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "true",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 670,
        "y": 220,
        "wires": [
            [
                "ba1cc1ab6b95cb02"
            ]
        ]
    },
    {
        "id": "fb11200a27a1a14f",
        "type": "change",
        "z": "72181fa0ef2f6078",
        "name": "0",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "false",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 670,
        "y": 280,
        "wires": [
            [
                "ba1cc1ab6b95cb02"
            ]
        ]
    },
    {
        "id": "cf054acfcd2cd989",
        "type": "debug",
        "z": "72181fa0ef2f6078",
        "name": "debug 18",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "true",
        "targetType": "full",
        "statusVal": "payload",
        "statusType": "msg",
        "x": 520,
        "y": 180,
        "wires": []
    },
    {
        "id": "e5cad690243547af",
        "type": "ccu-rpc-event",
        "z": "72181fa0ef2f6078",
        "name": "Gruppen - Level",
        "iface": "VirtualDevices",
        "ccuConfig": "38263145.35ea0e",
        "rooms": "",
        "roomsRx": "str",
        "functions": "",
        "functionsRx": "str",
        "device": "",
        "deviceRx": "str",
        "deviceName": "",
        "deviceNameRx": "str",
        "deviceType": "",
        "deviceTypeRx": "str",
        "channel": "",
        "channelRx": "str",
        "channelName": "",
        "channelNameRx": "str",
        "channelType": "",
        "channelTypeRx": "str",
        "channelIndex": "",
        "channelIndexRx": "str",
        "datapoint": "LEVEL",
        "datapointRx": "str",
        "change": false,
        "working": false,
        "cache": true,
        "topic": "${CCU}/${Interface}/${channelName}/${datapoint}",
        "x": 160,
        "y": 240,
        "wires": [
            [
                "7fc50906e0b3de62"
            ]
        ]
    },
    {
        "id": "bbca7c8945f8fe5c",
        "type": "trigger",
        "z": "72181fa0ef2f6078",
        "name": "",
        "op1": "",
        "op2": "",
        "op1type": "nul",
        "op2type": "payl",
        "duration": "10",
        "extend": true,
        "overrideDelay": false,
        "units": "s",
        "reset": "",
        "bytopic": "all",
        "topic": "topic",
        "outputs": 1,
        "x": 850,
        "y": 300,
        "wires": [
            [
                "bcefd41cffd1dcfa"
            ]
        ]
    },
    {
        "id": "38263145.35ea0e",
        "type": "ccu-connection",
        "name": "localhost",
        "host": "localhost",
        "regaEnabled": true,
        "bcrfEnabled": true,
        "iprfEnabled": true,
        "virtEnabled": true,
        "bcwiEnabled": false,
        "jackEnabled": true,
        "cuxdEnabled": true,
        "regaPoll": true,
        "regaInterval": "30",
        "rpcPingTimeout": "60",
        "rpcInitAddress": "127.0.0.1",
        "rpcServerHost": "127.0.0.1",
        "rpcBinPort": "2047",
        "rpcXmlPort": "2048",
        "tls": false,
        "inSecure": false,
        "authentication": false,
        "queueTimeout": "5000",
        "queuePause": "250",
        "contextStore": ""
    }
]
Alternativ kannst du auch auf der CCU ein Gewerk anlegen in dem du alle relevanten Kanäle sammelst und diese dann über "funktion" im Startpunkt abfragst.

Läuft eine der Versionen, dann den Startpunkt ändern auf "nur geänderte Werte ausgeben". Zum Testen sind viele Werte gut, nachher aber zu viel.

mrKnuspel
Beiträge: 10
Registriert: 14.10.2022, 10:25
System: Alternative CCU (auf Basis OCCU)

Re: Heizung aus, wenn bei allen Räumen soll Temp erreicht

Beitrag von mrKnuspel » 31.10.2022, 10:49

Hallo Henke,

ja hatte ich und mit den State_Valve experimentiert, aber irgendwie war das nicht so erfolgreich :?

Habe jetzt eine Lösung gefunden, die ist sicher etwas verwirrend und lässt die Profis unter euch mit dem Kopf schütteln, aber es funktioniert.
Sicher könnte man das irgendwie in eine function bringen, das hatte ich aber nicht geschafft und so hab ich es mit fertigen nodes hin gefummelt.

Für die, die meine Gedanken nachvollziehen wollen, hier eine Erklärung...
1. Auswertung der ist-soll Temperatur aller Räume
2. umwandeln von "wahr" und "falsch" auf "0" und "1"
3. Werte zusammen rechnen und in "0" und ">0" trennen und in "wahr" u. "falsch" wandeln
4. mittels switch aufteilen in "wahr" und "falsch"
5. den "falsch" durch die Temperatur schicken um nur ab einer bestimmten Temp auszulösen
6. das "wahr" aus dem switch" und das "falsch" aus der Temp in den rbe-node um nur eine geänderte Nachricht durch zu lassen, sonnst werden ständig die gleichen Nachrichten gesendet
7. eigentlich wäre es hier fertig, nur da ich nen shelly schalte, muss ich nun wieder splitten, da ich ja ein html senden muss

Wie gesagt, es geht sicher auch einfacher, aber so funktioniert es erst mal.
Flow.png
Gruß Stefan
Umstieg von FHEM zu RaspberryMatic mit RedMatic auf Raspberry 3B+

jasteen
Beiträge: 10
Registriert: 24.12.2018, 12:15
Wohnort: Saterland

Re: Heizung aus, wenn bei allen Räumen soll Temp erreicht

Beitrag von jasteen » 31.10.2022, 11:36

Hallo,

das selbe Projekt bin auch auch angegangen.
Mir ging es regelrecht auf den Keks, dass ausgerechnet die Küche als Referenzraum genommen wurde.
Und gerade jetzt, wo doch alle Energie sparen sollen ist es suboptimal.

Also bin ich wie folgt vorgegangen.
Der Temperaturregler von der Therme ist ein CAN-Bus-System, dem entsprechend nicht einfach so zu ersetzen.
Aber, dieser hat ein NTC. Diesen habe ich durch zwei Widerstände ersetzt, und lasse nun von dem "HmIP-PCBS-BAT"
die Therme bei Bedarf einschalten bzw ausschalten.
Die Schaltzyklen habe ich in der Programmerstellung auf der Raspberrymatic angelegt.

Und was soll ich sagen? Es klappt.

Antworten

Zurück zu „RedMatic“