NEWS
Rotex HPSU / Daikin Altherma Wärmepumpe über ioBroker.canbus
-
hab grad mal mit Daikin telefoniert
die neuen E Serien der Altherma die ab ~ April ausgeliefert werden, kommunizieren via modbus
d.h. das CAN Modul wird bei mir wohl eh nicht mehr funktionierenlassen wir uns mal überraschen
-
Über meinen Adapter ioBroker.canbus (Adaptervorstellung im Forum) ist die Einbindung einer Rotex HPSU bzw. Daikin Altherma Wärmepumpe mittlerweile relativ einfach möglich.
Um die Diskussionen bezüglich der Wärmepumpen etwas vom Adapter-Test zu entkoppeln nun dieses Thema hier.
Alles vorangegangene ist im Adapter-Test-Thema zu finden.Dank der Mithilfe von @michael-wind, @cb187 und @shortcircuit0815 ist im Adapter auch eine vordefinierte Konfiguration für diese Wärmepumpen verfügbar, welche direkt geladen werden kann.
(Ich selbst habe diese Hardware nicht!)@RaspiUser hat die Installation und Einrichtung in einer kurzen Anleitung zusammengefasst: Anleitung CAN Bus Installation.pdf
Alle Angaben nach bestem Wissen und Gewissen, aber ohne Gewähr und jegliche Haftung für ggf. entstehende Schäden wird ausgeschlossen.
Allgemeine Infos
Auslesen und Setzen vieler Parameter der einzelnen Module der Wärmepumpe.
Keine speziellen Zugriffsrechte erforderlich.
Getestet mit Rotex HPSU compact 516 (Baujahr 2013/2017) und Altherma 3 ECH2O.Die Kommunikation auf dem CAN-Bus erfolgt hier mit 20 kbit/s und Nachrichten im Standard-Frame-Format (SFF).
Die CAN-Nachrichten-ID ist jeweils die ID des sendenden Gerätes. Die Identifikation der einzelnen Nachrichteninhalte ist in den ersten Daten-Bytes der einzelnen Nachrichten enthalten.
Gerät CAN-ID RoCon 10A Kessel 180 HPSU Bedienmodul 300 HPSU Heizmodul 500 Remote-Software 680 Zusätzliche Infos zum Aufbau der Nachrichten sind hier zu finden.
Daten in ioBroker
Damit Daten im ioBroker ankommen, müssen diese aktiv von der Wärmepumpe abgefragt werden. Dies kann beispielsweise vom Bedienmodul oder auch vom ioBroker aus über die entsprechenden States unter der Nachrichten-ID 680 erfolgen.
Sollen Daten regelmäßig abgefragt werden, so kann in der Adapterkonfiguration beim entsprechenden Parser die Option Automatisch einen bestimmten Wert setzen mit dem gewünschten Intervall aktiviert werden.
Änderungen an Einstellungen der Wäremepumpe sind über die
-set-States unter der Nachrichten-ID 680 möglich.Damit beim Ändern von Werten die gesetzten Werte automatisch auch in ioBroker "ankommen", kann über den Javascript-Adapter ein eigenes Script erstellt werden, welches nach dem Ändern eines
-set-States die zugehörige Abfrage triggern:/* * Aktuellen Wert automatisch nach dem Setzen eines Wertes abfragen, sofern möglich. */ on({ id: /^canbus\.0\.680\..+-set$/, change: 'any', ack: true }, async (obj) => { const id = obj.id.replace(/-set$/, ''); const exists = await existsObjectAsync(id); if (exists) { await new Promise((resolve) => setTimeout(resolve, 500)); // 500ms warten, damit Änderung übernommen wurde await setStateAsync(id, true); } });
Technische Infos
Kabellänge
Die nutzbare Kabellänge ist vor allem vom verwendeten Kabeltyp und von der Baudrate abhängig.
Bei dem Kabel sollte auf jeden Fall auf ein verdrilltes Adernpaar von CAN-H und CAN-L geachtet werden. Zudem ist besonders bei Längen über 1 m eine Schirmung immer gut. Ich habe hier sehr gute Erfahrungen mit S/FTP Kabeln, die sonst hauptsächlich für Ethernet eingesetzt werden, gemacht.
Bei der hier verwendeten Baudrate von 20 kbit/s beträgt die maximale Kabellänge stolze 3,3 km. Dies hängt natürlich auch noch diversen anderen Faktoren mit ab, aber für den Einsatz in einem Gebäude sollte das locker ausreichen.
Moin,
ich bin nicht so der script pro, deshalb die Frage zu deinem Script ganz oben zum triggern der Abfragen.
Kann ich das so bei mir importieren oder muss ich es irgendwie auf meine Installation anpassen?
Und ist das Script für ein Wert oder reicht dieses um alle Datenpunkte zu überwachen?Vielen Dank im voraus für deine Rückmeldung!
-
Moin,
ich bin nicht so der script pro, deshalb die Frage zu deinem Script ganz oben zum triggern der Abfragen.
Kann ich das so bei mir importieren oder muss ich es irgendwie auf meine Installation anpassen?
Und ist das Script für ein Wert oder reicht dieses um alle Datenpunkte zu überwachen?Vielen Dank im voraus für deine Rückmeldung!
@elektroniker86 Das Script kannst du so direkt übernehmen, ohne irgendwas anzupassen, solange der Adapter bei dir als
canbus.0läuft.
Das Script erkennt dann automatisch bei allen States unter 680 mit-setam Ende, wenn es eine Änderung gab und triggert 500ms später dem zugehörigen Abfrage-State an. Dadurch bekommst du dann die Rückmeldung für eine Änderungen direkt im ioBroker angezeigt. -
@elektroniker86 Das Script kannst du so direkt übernehmen, ohne irgendwas anzupassen, solange der Adapter bei dir als
canbus.0läuft.
Das Script erkennt dann automatisch bei allen States unter 680 mit-setam Ende, wenn es eine Änderung gab und triggert 500ms später dem zugehörigen Abfrage-State an. Dadurch bekommst du dann die Rückmeldung für eine Änderungen direkt im ioBroker angezeigt.@crycode
Tip Top genau das wollte ich wissen.
DANKE! -
Hallo Kann mir von euch hier jemand bitte weiter helfen. Meine HPSU übernimmt den State Wert nämlich nicht -
Siehe unteren Link bzw. Code:
HPSU spricht nicht anvar timeout, memoryMODUS, timeout2; on({id: 'canbus.0.180.fa0a8c', change: "lt"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("canbus.0.180.fa0a8c").val == false) { (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); timeout = setTimeout(async function () { setState("javascript.0.jsState-SWING-Timer"/*jsState-SWING-Timer*/, 1, true); }, 140000); } }); on({id: 'javascript.0.jsState-SWING-Timer', change: "any"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("javascript.0.jsState-SWING-Timer").val == 1 && getState("canbus.0.180.02").val > 0) { memoryMODUS = getState("canbus.0.180.fa0112").val; setStateDelayed("canbus.0.680.fa0112-set"/*Modus setzen*/, 1, 1000, true); setStateDelayed("canbus.0.680.fa0112-set"/*Modus setzen*/, memoryMODUS, 4000, true); } }); on({id: 'javascript.0.jsState-SWING-Timer', change: "any"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("javascript.0.jsState-SWING-Timer").val == 1) { (function () {if (timeout2) {clearTimeout(timeout2); timeout2 = null;}})(); timeout2 = setTimeout(async function () { setState("javascript.0.jsState-SWING-Timer"/*jsState-SWING-Timer*/, 0, true); }, 35000); } }); -
Hallo Kann mir von euch hier jemand bitte weiter helfen. Meine HPSU übernimmt den State Wert nämlich nicht -
Siehe unteren Link bzw. Code:
HPSU spricht nicht anvar timeout, memoryMODUS, timeout2; on({id: 'canbus.0.180.fa0a8c', change: "lt"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("canbus.0.180.fa0a8c").val == false) { (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); timeout = setTimeout(async function () { setState("javascript.0.jsState-SWING-Timer"/*jsState-SWING-Timer*/, 1, true); }, 140000); } }); on({id: 'javascript.0.jsState-SWING-Timer', change: "any"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("javascript.0.jsState-SWING-Timer").val == 1 && getState("canbus.0.180.02").val > 0) { memoryMODUS = getState("canbus.0.180.fa0112").val; setStateDelayed("canbus.0.680.fa0112-set"/*Modus setzen*/, 1, 1000, true); setStateDelayed("canbus.0.680.fa0112-set"/*Modus setzen*/, memoryMODUS, 4000, true); } }); on({id: 'javascript.0.jsState-SWING-Timer', change: "any"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("javascript.0.jsState-SWING-Timer").val == 1) { (function () {if (timeout2) {clearTimeout(timeout2); timeout2 = null;}})(); timeout2 = setTimeout(async function () { setState("javascript.0.jsState-SWING-Timer"/*jsState-SWING-Timer*/, 0, true); }, 35000); } });@andy999 Wird denn von deinem Script der Wert von
canbus.0.680.fa0112-setgesetzt, wenn du es im Admin unter Objekte beobachtest? Wenn ja, wäre die Frage ob mitack: falseoderack: true. Um das genau zu sehen kannst du mal folgendes in deinem Script hinzufügen. Das erstellt bei jeder Änderung des States einen Logeintrag:on({ id: 'canbus.0.680.fa0112-set', change: 'any' }, (obj) => { log(`${obj.id} changed => val: ${obj.state.val} ack: ${obj.state.ack}`); });Im Idealfall solltest du damit immer zwei Logeinträge kurz hintereinander sehen. Einen mit
ack: false(von deiner Aktion) und dann einen mitack: true(Bestätigung vom Adapter). -
@andy999 Wird denn von deinem Script der Wert von
canbus.0.680.fa0112-setgesetzt, wenn du es im Admin unter Objekte beobachtest? Wenn ja, wäre die Frage ob mitack: falseoderack: true. Um das genau zu sehen kannst du mal folgendes in deinem Script hinzufügen. Das erstellt bei jeder Änderung des States einen Logeintrag:on({ id: 'canbus.0.680.fa0112-set', change: 'any' }, (obj) => { log(`${obj.id} changed => val: ${obj.state.val} ack: ${obj.state.ack}`); });Im Idealfall solltest du damit immer zwei Logeinträge kurz hintereinander sehen. Einen mit
ack: false(von deiner Aktion) und dann einen mitack: true(Bestätigung vom Adapter).@crycode Hi, besten Dank für die rasche Antwort, habe unter den Objekten den Wert händisch auf 1 gesetzt, und der wurde tadellos übernommen, auch in der HPSU selber. Hab folgendes im LOG:
12:40:02.144 info javascript.0 (1422) script.js.HPSU-Test.SWING_-_java: canbus.0.680.fa0112-set changed => val: 1 ack: false 12:40:02.853 info javascript.0 (1422) script.js.HPSU-Test.SWING_-_java: canbus.0.680.fa0112-set changed => val: 1 ack: trueund wieder zurück auf 3 (heizen) auch ohne Probleme:
12:40:16.756 info javascript.0 (1422) script.js.HPSU-Test.SWING_-_java: canbus.0.680.fa0112-set changed => val: 3 ack: false 12:40:17.503 info javascript.0 (1422) script.js.HPSU-Test.SWING_-_java: canbus.0.680.fa0112-set changed => val: 3 ack: trueEs hat mir aber keine ruhe gelassen, deswegen hab ich danach über den Trigger -Zeitplan (alle 10s) den Block Steuere UND Schreibe 1:1 (aktualisieren funktionierte nicht) übernommen und mit dem wurde der Wert in der HPSU tatsächlich übernommen.
Also jetzt verstehe ich nix mehr, wie im Link schon beschrieben werden im Trigger-Falls bestimmte Objekte bzw. Werte übernommen und andere leider nicht? Was mache ich hier falsch?
P.S. arbeite bevorzugter weise mit Blockly
-
Guten Abend,
da es jetzt wieder viele Sonnenstunden gibt habe ich mir ein kleines Blockly gebaut, dass mir bei vollem PV Speicher und Überschuss die Smart Grid Eingänge schaltet um den WWSpeicher mit einer höheren Temperatur zu laden.
Jetzt wollte ich hier mal ein paar Meinungen zu meinem Vorhaben hören und ob das Blockly so passt oder ob es Verbesserungsvorschläge von euch gibt?Hier das Blockly und die Eckdaten:



Bin gespannnt auf eure Meinungen
-
Guten Abend,
da es jetzt wieder viele Sonnenstunden gibt habe ich mir ein kleines Blockly gebaut, dass mir bei vollem PV Speicher und Überschuss die Smart Grid Eingänge schaltet um den WWSpeicher mit einer höheren Temperatur zu laden.
Jetzt wollte ich hier mal ein paar Meinungen zu meinem Vorhaben hören und ob das Blockly so passt oder ob es Verbesserungsvorschläge von euch gibt?Hier das Blockly und die Eckdaten:



Bin gespannnt auf eure Meinungen
@elektroniker86
Hi mir wäre es neu das du über den Adapter die Relaisausgänge schalten kannst.Ich glaube eher nicht. -
@crycode Hi, besten Dank für die rasche Antwort, habe unter den Objekten den Wert händisch auf 1 gesetzt, und der wurde tadellos übernommen, auch in der HPSU selber. Hab folgendes im LOG:
12:40:02.144 info javascript.0 (1422) script.js.HPSU-Test.SWING_-_java: canbus.0.680.fa0112-set changed => val: 1 ack: false 12:40:02.853 info javascript.0 (1422) script.js.HPSU-Test.SWING_-_java: canbus.0.680.fa0112-set changed => val: 1 ack: trueund wieder zurück auf 3 (heizen) auch ohne Probleme:
12:40:16.756 info javascript.0 (1422) script.js.HPSU-Test.SWING_-_java: canbus.0.680.fa0112-set changed => val: 3 ack: false 12:40:17.503 info javascript.0 (1422) script.js.HPSU-Test.SWING_-_java: canbus.0.680.fa0112-set changed => val: 3 ack: trueEs hat mir aber keine ruhe gelassen, deswegen hab ich danach über den Trigger -Zeitplan (alle 10s) den Block Steuere UND Schreibe 1:1 (aktualisieren funktionierte nicht) übernommen und mit dem wurde der Wert in der HPSU tatsächlich übernommen.
Also jetzt verstehe ich nix mehr, wie im Link schon beschrieben werden im Trigger-Falls bestimmte Objekte bzw. Werte übernommen und andere leider nicht? Was mache ich hier falsch?
P.S. arbeite bevorzugter weise mit Blockly
@andy999 sagte in Rotex HPSU / Daikin Altherma Wärmepumpe über ioBroker.canbus:
Es hat mir aber keine ruhe gelassen, deswegen hab ich danach über den Trigger -Zeitplan (alle 10s) den Block Steuere UND Schreibe 1:1 (aktualisieren funktionierte nicht) übernommen und mit dem wurde der Wert in der HPSU tatsächlich übernommen.
Also jetzt verstehe ich nix mehr, wie im Link schon beschrieben werden im Trigger-Falls bestimmte Objekte bzw. Werte übernommen und andere leider nicht? Was mache ich hier falsch?Wenn du willst, dass ein Adapter auf eine Änderung von dir reagiert, dann musst du immer "steuere" nehmen. Bei "steuere" wird das
ack-Flag auffalsegesetzt, was einem Befehl entspricht und woraufhin ein Adapter reagiert und nach seiner Aktion als Bestätigungackauftruesetzt.
Wenn du hingegen "aktualisiere" nimmst, dann wirdackgleich auftruegesetzt. Damit legst du dann nur den Wert fest, aber löst keine Steuerung aus, da (alle) Adapter nur auf Änderungen mitack: falsereagieren. -
Guten Abend,
da es jetzt wieder viele Sonnenstunden gibt habe ich mir ein kleines Blockly gebaut, dass mir bei vollem PV Speicher und Überschuss die Smart Grid Eingänge schaltet um den WWSpeicher mit einer höheren Temperatur zu laden.
Jetzt wollte ich hier mal ein paar Meinungen zu meinem Vorhaben hören und ob das Blockly so passt oder ob es Verbesserungsvorschläge von euch gibt?Hier das Blockly und die Eckdaten:



Bin gespannnt auf eure Meinungen
@elektroniker86 Wie sehen denn die EVG und SG Eingänge aus? Ich würde vermuten, dass das Hardwareeingänge sind, die du dann extern beschalten müsstest.
@cb187 sagte in Rotex HPSU / Daikin Altherma Wärmepumpe über ioBroker.canbus:
Hi mir wäre es neu das du über den Adapter die Relaisausgänge schalten kannst.Ich glaube eher nicht.
Grundsätzlich sollte sich über den Adapter alles schalten lassen, was du auch über die originale Steuerung schalten kannst. Ggf. müsste man nur entsprechende Parser hinzufügen.
-
@elektroniker86 Wie sehen denn die EVG und SG Eingänge aus? Ich würde vermuten, dass das Hardwareeingänge sind, die du dann extern beschalten müsstest.
@cb187 sagte in Rotex HPSU / Daikin Altherma Wärmepumpe über ioBroker.canbus:
Hi mir wäre es neu das du über den Adapter die Relaisausgänge schalten kannst.Ich glaube eher nicht.
Grundsätzlich sollte sich über den Adapter alles schalten lassen, was du auch über die originale Steuerung schalten kannst. Ggf. müsste man nur entsprechende Parser hinzufügen.
-
@andy999 sagte in Rotex HPSU / Daikin Altherma Wärmepumpe über ioBroker.canbus:
Es hat mir aber keine ruhe gelassen, deswegen hab ich danach über den Trigger -Zeitplan (alle 10s) den Block Steuere UND Schreibe 1:1 (aktualisieren funktionierte nicht) übernommen und mit dem wurde der Wert in der HPSU tatsächlich übernommen.
Also jetzt verstehe ich nix mehr, wie im Link schon beschrieben werden im Trigger-Falls bestimmte Objekte bzw. Werte übernommen und andere leider nicht? Was mache ich hier falsch?Wenn du willst, dass ein Adapter auf eine Änderung von dir reagiert, dann musst du immer "steuere" nehmen. Bei "steuere" wird das
ack-Flag auffalsegesetzt, was einem Befehl entspricht und woraufhin ein Adapter reagiert und nach seiner Aktion als Bestätigungackauftruesetzt.
Wenn du hingegen "aktualisiere" nimmst, dann wirdackgleich auftruegesetzt. Damit legst du dann nur den Wert fest, aber löst keine Steuerung aus, da (alle) Adapter nur auf Änderungen mitack: falsereagieren.@crycode Das war mir schon klar, das dass mit aktualisieren nicht funktionieren wird.
Hab nun nach langen hin und her (hab mir einen HMI-Virtualen Schalter fürs testen erstellt) herausgefunden, dass in der einen FALLS Instanz nicht zwei STEUERE drinnen sein dürfen. Habe nach der Fehlersuche also unten noch eine zusätzliche Falls Instanz hinzugefügt und nun hats zumindest mit meinen HMI-Schalter funktioniert. Ich lasse das ganze auf der HPSU über Nacht laufen, mal schauen ob alles hinhaut.P.S. Die o.g. trixerei wird wohl einen BUG im Blockly verschuldet sein weil ich es mir sonst nicht erklären kann.

-
@elektroniker86
Hi mir wäre es neu das du über den Adapter die Relaisausgänge schalten kannst.Ich glaube eher nicht.Da hast Du vollkommen recht. Ich schalte die Eingange mit einer SPS über ioBroker.
-
Entweder bin ich blind oder habe es schon gelöscht.
Auf jeden Fall habe ich bei den CAN Objekten keinen TA2 Wert.
Ich kann ihn zwar über canbus.0.680.fac105 abfragen, aber wo wird der eingetragen? -
Entweder bin ich blind oder habe es schon gelöscht.
Auf jeden Fall habe ich bei den CAN Objekten keinen TA2 Wert.
Ich kann ihn zwar über canbus.0.680.fac105 abfragen, aber wo wird der eingetragen?@hg6806 sagte in Rotex HPSU / Daikin Altherma Wärmepumpe über ioBroker.canbus:
Auf jeden Fall habe ich bei den CAN Objekten keinen TA2 Wert.
Ich kann ihn zwar über canbus.0.680.fac105 abfragen, aber wo wird der eingetragen?TA2 fehlte tatsächlich noch, genauso wie TDHW2.
Habe die beiden jetzt in der "latest" Konfiguration auf GitHub hinzugefügt (180.fac105und180.fac106). Bitte diese laden, testen und mir eine kurze Rückmeldung geben. :-) Wenn alles funktioniert, würde ich die "latest" dann mit neuer Versionsnummer kennzeichnen. -
@hg6806 sagte in Rotex HPSU / Daikin Altherma Wärmepumpe über ioBroker.canbus:
Auf jeden Fall habe ich bei den CAN Objekten keinen TA2 Wert.
Ich kann ihn zwar über canbus.0.680.fac105 abfragen, aber wo wird der eingetragen?TA2 fehlte tatsächlich noch, genauso wie TDHW2.
Habe die beiden jetzt in der "latest" Konfiguration auf GitHub hinzugefügt (180.fac105und180.fac106). Bitte diese laden, testen und mir eine kurze Rückmeldung geben. :-) Wenn alles funktioniert, würde ich die "latest" dann mit neuer Versionsnummer kennzeichnen. -
@hg6806 Perfekt, damit ist die bisherige latest Konfiguration jetzt als 1.5.0 für alle als Vorauswahl zum Import verfügbar.