Daikin - ESP32 Faikout Modul

@leon596 ich klink mich mal von der Seite ein, weil du mit HA wohl sehr zufrieden bist. Ich nutze seit etlichen Jahren iobroker und habe super viele Skripte in Blockly und auch in NodeRED für Daikin Anlagen (insgesamt 9 Stück).

Wie realisierst du diese Bedarfssteuerung in HA? Gerne um deine Infos, hier oder in eigenem Topic. Meine von iobroker habe ich vor Wochen bereits umfänglich hier veröffentlicht inkl. Kompletter Zeitsteuerung über das iobroker Dashboard

Habs mal gerade nochmal neu geschrieben damit es chronologisch hier richtig im Thread steht.

Als kleine Impression wie ich meine 2fach-Multi betreibe und wie so eine Automation dann aussehen kann. Das ist jetzt nur aufs Heizen ausgelegt.
Gehe schon eher auf 40% Demand weil ich tatsächlich eine 0,5-0,6°C-Hysterese fahre.
(Was man in den Settings in Faikout einstellen sollte ist ja ein paar Beiträge vorher durch mich schon beschrieben)

Und kann garantiert alles schöner gemacht werden. Das war quick and dirty.
Wie es immer so ist, wenns funktioniert guckt man sich das ja nicht wieder an. :sweat_smile:

Man kann das auch so schreiben, dass das gleich für Heizen und Kühlen gleichermaßen funktioniert. Im Sommer schalte ich die Automation aber einfach aus weil die Serienmäßige Regelung beim Kühlen schlichtweg gut funktioniert.

alias: Demand Leon Küche + Schlafzimmer (größere Abweichung, nur wenn Gerät an)
description: >-
Stellt alle 2 Minuten (und bei Änderungen) den Demand für Küche +
Schlafzimmer. Maßgeblich ist die größere Soll-Ist-Abweichung zwischen Küche
und Schlafzimmer, aber jeweils nur, wenn das entsprechende Klimagerät NICHT
'off' ist. Der berechnete Demand wird immer auf beide Geräte geschrieben (auch
wenn eins off ist). Stufen: >0,8°C -> 100% (wenn Außentemperatur kälter als -5°C), >0,7°C -> 95%, >0,6°C -> 70%,
sonst 40%.
triggers:

* trigger: time_pattern
minutes: /2
* trigger: state
entity_id:
  * sensor.leonkueche_9afe_temperature
  * sensor.leonschlafzimmer_000b_temperature
  * climate.leon_kueche_mqtt_hvac
  * climate.leon_schlafzimmer_mqtt_hvac
conditions:
actions:
* variables:
t_k: "{{ states('sensor.leonkueche_9afe_temperature') | float(0) }}"
sp_k: >-
{{ state_attr('climate.leon_kueche_mqtt_hvac', 'temperature') | float(0)
}}
diff_k: "{{ sp_k - t_k }}"
on_k: "{{ states('climate.leon_kueche_mqtt_hvac') != 'off' }}"
t_sz: "{{ states('sensor.leonschlafzimmer_000b_temperature') | float(0) }}"
sp_sz: >-
{{ state_attr('climate.leon_schlafzimmer_mqtt_hvac', 'temperature') |
float(0) }}
diff_sz: "{{ sp_sz - t_sz }}"
on_sz: "{{ states('climate.leon_schlafzimmer_mqtt_hvac') != 'off' }}"
t_out: "{{ states('sensor.aussen_temperatur_nord') | float(999) }}"
demand_k: |-
{% if not on_k %}
-1
{% elif diff_k > 0.8 and t_out < -5 %}
100
{% elif diff_k > 0.7 %}
95
{% elif diff_k > 0.6 %}
70
{% else %}
40
{% endif %}
demand_sz: |-
{% if not on_sz %}
-1
{% elif diff_sz > 0.8 and t_out < -5 %}
100
{% elif diff_sz > 0.7 %}
95
{% elif diff_sz > 0.6 %}
70
{% else %}
40
{% endif %}
demand: "{{ [demand_k|int, demand_sz|int, 40] | max }}"
* action: select.select_option
target:
entity_id:
  * select.leon_kueche_demand_control
  * select.leon_schlafzimmer_demand_control
data:
option: "{{ demand | string }}"
mode: single

[/quote]

Eigentlich braucht man nur die Entität des Innengerätes.
Entität der Demand-Control
Entität der externen Sensoren
(in meinem Falle zusätzlich eine Entität der Außentemperatur weil ich 100% Demand an die Außentemperatur koppel, dafür kann man auch die Außentemperatur des Außengerätes nutzen wenn man will)
Und über "Temperature" kann man die Soll-Temperatur über MQTT ans Faikout senden.
Bei mir löst die Automation bei jeder Temperaturänderung aus oder spätestens alle 2min.

Aber wie gesagt.
Wenn man die Entitäten alle hat und ChatGPT (Thinking) gut beschreibt was man genau haben möchte, dann kommt da tatsächlich fast immer eine gute Antwort raus die meist direkt gescheit funktioniert. Ich hab mich auch lange dagegen gesperrt alles nur in ChatGPT zu kloppen.
Wodurch ist jetzt zum Glück auch selbst verstehe wie man so ne Automation baut und wie es funktioniert. Aber bei solchen Dingen ist die KI mittlerweile erstaunlich gut.
Muss man leider so sagen. Wenn man sowas wirklich genau und korrekt beschreibt hat man ne Minute später wirklich ganze Automations-Blöcke und meistens funktionieren die auch.

P.S
Habe noch einige speziellere und dann auch weitaus sehr viel komplexere Automationen auf anderen Innengeräten am Laufen. Aber das muss ich dann wirklich mal an geeigneter Stelle beschreiben wenn ich wirklich Zeit dafür habe.

1 „Gefällt mir“

@mnl1234

Heißt ich brauch nicht zwingend einen BLE Sensor? Sondern kann dies auch über mqtt von HA schicken lassen?

Denn die meisten BLE Sensoren haben eine Batterie und ich habe nicht Lust an den Batteriewechsel zu denken.

Ein schöner unterputz Thermostat wäre mir lieber. Du hast Homematic?

Genau, allerdings die alten, also nicht “IP”. Und ich nutze FHEM statt HA. Für die Sache ist das aber egal.

Also du hast in deinem System irgendeine Raumtemperatur aus irgendeinem Sensor.

Den Wert schickst du zyklisch an den Faikout. Zyklisch ist wichtig, weil der Faikout einen Timeout hat, nach dem er wieder auf den internen Wert zurückfällt. Ich meine, der ist bei 60 Sekunden.

Das senden geht mit command/…/control {"env":"20.5"}. (20.5 muss halt ne Variable mit der Tenperatur sein).

1 „Gefällt mir“

Wichtig ist auf jeden Fall, dass die Temperatur mindestens eine Auflösung in 0,1°C Schritten hat. 0,5°C ist zu grob wenn man eine feine Abstimmung in der Demand-Steuerung machen möchte.
Aber gut zu wissen, dass das funktioniert.
Eine kleine Anmerkung in dem Zusammenhang;
Allgemein wichtig wäre es, dass der Sensor möglichst geschützt vom Luftstrom montiert ist.

Man kann sich aber z.b auch benachrichtigen lassen über eine Automation.
Bei Xiaomi ist es z.b so, dass die Batteriespannung in 0,01V-Schritten überwacht wird und auch ein %-Wert für den Batteriestand übermittelt wird.
Wie lang die Batterie hält vermag ich aber auch nicht zu sagen.
Nach 5 Monaten haben bei mir 30/34 Sensoren noch über 70%
Eine Batterie musste ich ersetzen. Aber die war von Anfang an nicht gut. Das lag vermutlich an der Batterie.

Ist vielleicht schon gefragt worden. Aber habe leider keine genau Angabe gefunden. Bin leider auch kein pro bei dem ganzen Programmieren :slightly_smiling_face:.

Kann mir jemand sagen wie ich eine Temperatur die per mqtt etc. von meinem externen Temperatursensor an Faikout sende.

Wie sieht der Befehl aus und wo muss ich diesen bei HA erstellen.

Muss ich bei Faikout auch wo was eingeben bzw. einstellen?

Mit der Regelung des Faikout im Automodus und BLE bin ich bisher sehr zufrieden. Allerdings habe ein Problem mit der Innenlüfterdrehzahl bisher nicht lösen können im Schlafzimmer:

Ich habe unter Extras im Faikout bei Max fan Setting “autofmax” 5 stehen (Standard), wenn Ist zu Soll sehr unterschiedlich ist: “Max fan setting when starting heat way off from target”

Das ist abends Perfekt beim Bedarfheizen damit das Zimmer schnell warm wird und keiner vor Ort ist. Allerdings ist das am frühen Morgen im Schlafzimmer um 4:30 Uhr nicht so schön :slight_smile: wenn das Zimmer vor dem Aufstehen warm werden soll. Das Faikout überschreibt scheinbar leider den “Innen Silent Modus” der Onecta und gibt “Auto” aus.

Habt ihr das Problem in HA gelöst, also den Parameter “autofmax” auf “night” überschreiben ab 0 Uhr bis 6 Uhr, oder geht es doch direkt im Faikout?

Ich habe die komplette Lüfterautomation mit in meiner Bedarfsautomation auf Home-Assistant drin bei den meisten Räumen.
Ich tracke Lüfterdrehzahl nach Abweichung von Soll-IST mit Hysterese mit dem Ziel möglich selten eine wechselnde Lüfterstufe zu haben und schicke die gewollte Lüfterstufe einfach dann ans Innengerät.
Zeitfenster zu definieren bei Nacht ist dann in dem Zusammenhang dann ja auch kein Problem.

Ich habe es z.b bei Mama und Papa so gemacht, dass eine Sitzbelegungsmatte unter der Matratze ist.
Solange man im Bett liegt ist der Lüfterbefehl automatisch silent bzw "night". :rofl:
Wenn man zu Zweit ist kann man auch einfach Wiegezellen unters Bett ballern, dann kann man die Lüfterstufe danach steuern wie viele Leute im Bett liegen :heart_eyes:

Ist natürlich nur was für komplett bekloppte Leute die sowieso Home-Assistant haben.

Bei mir läuft die Demand-Automation bei jeder Temperaturänderung, der Lüfterbefehl wird dann einfach mitgeschickt.

autofmax habe ich auf 0, aber ich weiß ehrlich gesagt nicht ob das richtig ist, falsch ist oder was das macht. Aber als er auf 5 stand hatte ich aber das gleiche Problem wie du (aber im Sommer beim Kühlen, im Winter heiz ich selbst bei mir im Schlafzimmer tatsächlich nicht vor dem Aufstehen)
Wobei das vermutlich fast irrelevant ist wenn man bei jeder Temperaturänderung eh einen Lüfterbefehl setzt. Wenn die Anlage Neu startet überschreibt man den Wert den Faikin setzt vermutlich dann eh bis die Anlage hochgefahren ist.

1 „Gefällt mir“

Es gibt noch eine relativ simple Alternative, die ich aber nicht nutze. Die würde sogar ohne HA funktionieren und benötigt nur ein entsprechendes Topic im mqtt, dem gefolgt wird.

Findest du in Fakeout unter Extras:

grafik

1 „Gefällt mir“

Ist es eigentlich “normal” dass das Faikout die Ziel-Temperatur (sensor.faikin_wien_ac_target) permanent verändert? Mir ist das heute erst aufgefallen.
Teilweise extreme Schwankungen zwischen 16 und 22 Grad.

Jedem der das jetzt (so wie ich) angeht kann ich tatsächlich nur empfehlen:

Gute Beschreibung und den code von leon596 in chatGPT oder Gemini kopieren und man hat direkt was brauchbares. Mein Input für die KI war:

Ich habe vor zwei Wochen eine Daikin Multisplit bestehend aus 3MXM40A9 Außengerät und 3xCTXA15CW Stylish Innengeräten installiert bekommen.
Die Innengeräte habe ich alle mit dem Faikout Modul ausgestattet. In der Onecta-App habe ich auch erstmal nichts groß geändert, Bedarfssteuerung und Economodus sind aus.

Ich möchte via Home-Assistant eine Automation erstellen die auf der Differenz zwischen der Soll- und Ist-Temperatur den Demand einfach laufend regelt.

Bedingung würde ich machen, dass nur Innengeräte berücksichtigt werden die auf heat stehen.
(oder nur Innengeräte die nicht auf off stehen)
Und dann das Innengerät mit der höchsten Soll-IST-Abweichung dann den Demand-Wert für die Bedarfssteuerung vorgeben lassen (der Wert muss dann aber immer an alle Innengeräte geschickt werden!)

Beispiel:
Gerät mit der größten Abweichung;

Wenn IST mehr als 1°C unter Soll liegt 100% Demand
Wenn IST mehr als 0,75°C unter Soll liegt 95% Demand
Wenn IST mehr als 0,5°C unter Soll liegt 70% Demand
Wenn IST 0,3°C unter Soll liegt dann 40% Demand

Die Entitäten von meinen 3 Innengeräten sind:

climate.daikin_arbeitszimmer_mqtt_hvac
sensor.daikin_arbeitszimmer_ac_home
sensor.daikin_arbeitszimmer_ac_target
switch.daikin_arbeitszimmer_auto_mode
switch.daikin_arbeitszimmer_comfort_mode
sensor.daikin_arbeitszimmer_comp
select.daikin_arbeitszimmer_demand_control
switch.daikin_arbeitszimmer_econo_mode
sensor.daikin_arbeitszimmer_fanfreq
sensor.daikin_arbeitszimmer_humidity
sensor.daikin_arbeitszimmer_lifetime_cooling_energy
sensor.daikin_arbeitszimmer_lifetime_heating_energy
sensor.daikin_arbeitszimmer_lifetime_outside_energy
sensor.daikin_arbeitszimmer_liquid
climate.daikin_arbeitszimmer_mqtt_hvac
sensor.daikin_arbeitszimmer_outside
switch.daikin_arbeitszimmer_power
sensor.daikin_arbeitszimmer_power_consumption
switch.daikin_arbeitszimmer_powerful
switch.daikin_arbeitszimmer_quiet_outdoor
switch.daikin_arbeitszimmer_sensor_mode
switch.daikin_arbeitszimmer_streamer

climate.daikin_kinderzimmer_mqtt_hvac
sensor.daikin_kinderzimmer_ac_home
sensor.daikin_kinderzimmer_ac_target
switch.daikin_kinderzimmer_auto_mode
switch.daikin_kinderzimmer_comfort_mode
sensor.daikin_kinderzimmer_comp
select.daikin_kinderzimmer_demand_control
switch.daikin_kinderzimmer_econo_mode
sensor.daikin_kinderzimmer_fanfreq
sensor.daikin_kinderzimmer_humidity
sensor.daikin_kinderzimmer_lifetime_cooling_energy
sensor.daikin_kinderzimmer_lifetime_heating_energy
sensor.daikin_kinderzimmer_lifetime_outside_energy
sensor.daikin_kinderzimmer_liquid
climate.daikin_kinderzimmer_mqtt_hvac
sensor.daikin_kinderzimmer_outside
switch.daikin_kinderzimmer_power
sensor.daikin_kinderzimmer_power_consumption
switch.daikin_kinderzimmer_powerful
switch.daikin_kinderzimmer_quiet_outdoor
switch.daikin_kinderzimmer_sensor_mode
switch.daikin_kinderzimmer_streamer

climate.daikin_schlafzimmer_mqtt_hvac
sensor.daikin_schlafzimmer_ac_home
sensor.daikin_schlafzimmer_ac_target
switch.daikin_schlafzimmer_auto_mode
switch.daikin_schlafzimmer_comfort_mode
sensor.daikin_schlafzimmer_comp
select.daikin_schlafzimmer_demand_control
switch.daikin_schlafzimmer_econo_mode
sensor.daikin_schlafzimmer_fanfreq
sensor.daikin_schlafzimmer_humidity
sensor.daikin_schlafzimmer_lifetime_cooling_energy
sensor.daikin_schlafzimmer_lifetime_heating_energy
sensor.daikin_schlafzimmer_lifetime_outside_energy
sensor.daikin_schlafzimmer_liquid
climate.daikin_schlafzimmer_mqtt_hvac
sensor.daikin_schlafzimmer_outside
switch.daikin_schlafzimmer_power
sensor.daikin_schlafzimmer_power_consumption
switch.daikin_schlafzimmer_powerful
switch.daikin_schlafzimmer_quiet_outdoor
switch.daikin_schlafzimmer_sensor_mode
switch.daikin_schlafzimmer_streamer

Schreibe mir eine passende YAML für diese funktion bei meinen 3 Innengeräten. die Automation soll bei jeder Temperaturänderung auslösen oder spätestens alle 2min. Wenn die zieltemperatur erreicht ist und die geräte noch an sind soll der demand auf dem minimum bleiben.

Es soll das gleiche gemacht werden wie im folgendem code, aber schöner programmiert:
alias: Demand Leon Küche + Schlafzimmer (größere Abweichung, nur wenn Gerät an)
description: >-
Stellt alle 2 Minuten (und bei Änderungen) den Demand für Küche +
Schlafzimmer. Maßgeblich ist die größere Soll-Ist-Abweichung zwischen Küche
und Schlafzimmer, aber jeweils nur, wenn das entsprechende Klimagerät NICHT
'off' ist. Der berechnete Demand wird immer auf beide Geräte geschrieben (auch
wenn eins off ist). Stufen: >0,8°C -> 100% (wenn Außentemperatur kälter als -5°C), >0,7°C -> 95%, >0,6°C -> 70%,
sonst 40%.
triggers:

  • trigger: time_pattern
    minutes: /2
  • trigger: state
    entity_id:
    • sensor.leonkueche_9afe_temperature
    • sensor.leonschlafzimmer_000b_temperature
    • climate.leon_kueche_mqtt_hvac
    • climate.leon_schlafzimmer_mqtt_hvac
      conditions:
      actions:
  • variables:
    t_k: "{{ states('sensor.leonkueche_9afe_temperature') | float(0) }}"
    sp_k: >-
    {{ state_attr('climate.leon_kueche_mqtt_hvac', 'temperature') | float(0)
    }}
    diff_k: "{{ sp_k - t_k }}"
    on_k: "{{ states('climate.leon_kueche_mqtt_hvac') != 'off' }}"
    t_sz: "{{ states('sensor.leonschlafzimmer_000b_temperature') | float(0) }}"
    sp_sz: >-
    {{ state_attr('climate.leon_schlafzimmer_mqtt_hvac', 'temperature') |
    float(0) }}
    diff_sz: "{{ sp_sz - t_sz }}"
    on_sz: "{{ states('climate.leon_schlafzimmer_mqtt_hvac') != 'off' }}"
    t_out: "{{ states('sensor.aussen_temperatur_nord') | float(999) }}"
    demand_k: |-
    {% if not on_k %}
    -1
    {% elif diff_k > 0.8 and t_out < -5 %}
    100
    {% elif diff_k > 0.7 %}
    95
    {% elif diff_k > 0.6 %}
    70
    {% else %}
    40
    {% endif %}
    demand_sz: |-
    {% if not on_sz %}
    -1
    {% elif diff_sz > 0.8 and t_out < -5 %}
    100
    {% elif diff_sz > 0.7 %}
    95
    {% elif diff_sz > 0.6 %}
    70
    {% else %}
    40
    {% endif %}
    demand: "{{ [demand_k|int, demand_sz|int, 40] | max }}"
  • action: select.select_option
    target:
    entity_id:
    • select.leon_kueche_demand_control
    • select.leon_schlafzimmer_demand_control
      data:
      option: "{{ demand | string }}"
      mode: single

Das Ergebnis dann dann stumpf Home Assistant kopieren und es funktioniert…

1 „Gefällt mir“

Hast du vielleicht den Fakeout “Auto”-Modus aktiviert?

Ich kann das bei mir nicht beobachten, nutze den Auto-Modus aber auch nicht. Es kann schon sein, dass Fakeout auch die Zieltemperatur verändert, weil nur so eine geringere Modulation unterhalb 30% “demand” möglich ist.

“The "Target" is the target temperature. You will see the "Set" in the main controls change to be many degrees below or above the target at various times to aim for the target.”

1 „Gefällt mir“

Vielen Dank! Habe tatsächlich den Faikout-Auto-Mode aktiv. Das wird wohl die Erklärung sein!

1 „Gefällt mir“

Das ist ja unglaublich wie gut das funktioniert. Ich habe nur die 4 benötigten Sensoren auf meine Daikin angepasst und den Text bis Trigger kopiert und leicht sinngemäß angepasst - und die YAML in Automation eingefügt. Die Perfera läuft besser mit der autom. Bedarf-Regelung als je zuvor - und mit wesentlich geringerer Leistungsaufnahme als mit Onecta. Vielen Dank dafür.

Das andere Problem mit der Lüfterdrehzahl im Schlafzimmer nachts habe ich gelöst indem ich in Onecta nach 5min einen zweiten identischen Timer direkt im Anschluss mit lautlos innen eingestellt habe. Der 2. Timer hat dann Faikout dauerhaft überschrieben.

Mal ein kleines Update falls es wen interessiert. Hier mal die Batteriedegradation meiner insgesamt 30 Mi2-Thermometer vom 1.Oktober bis Heute

Eine Packung Knopfzellen war wohl alt/schlecht weil grob 5 Sensoren seit Tag1 nach unten ausbrechen.
Für mich schaut es so aus, als würde das auf eine Laufzeit von 12-18 Monaten konservativ geschätzt hinauslaufen.

Die ältesten Sensoren müssten jetzt so ungefähr seit Mai laufen und die beiden Sensoren sind jetzt nach 10 Monaten tatsächlich noch über 70%.

Ich habe mir aber bis heute keine Mühe gemacht die Sendestärke der Thermometer einzustellen.
Alle die recht nahe am Bluetooth-Proxy sind könnte man sicher reduzieren.
Und alle Thermometer senden im 2,5-Sekunden-Intervall.
Auch das könnte man wenn man wollte sicher reduzieren.
Wenn man den Sensor nur zum Messen benutzt könnte man auch das Display deaktivieren.

Hat jemand von euch das Faikout Modul selber zusammen gebaut? Also sich einen ESP32 geschnappt mit stepdwon Modul und Pegelwandler und das dann mit den bin Files von Github geflasht, anstatt sich die fertigen Module bei Amazon zu bestellen?

Konnte beim groben überfliegen hier im Forum nichts dergleichen finden.

Dennoch die Frage ob wir nicht einfach geprüfte Blueprints für Automationen für HA hier teilen möchten? Das lässt beim Aufsetzen der Automation (basierend auf dem Blueprint) noch genug Möglichkeiten per GUI individuelle Parameter zu setzen und man braucht nicht auf Code-Ebene rumwerkeln, den man aus fremder Quelle vielleicht nur schwer versteht.

Empfinde das Konzept der Blueprints als ideal und mache gerne für eine einfache Bedarfsteuerung basierend auf der Außentemperatur einen Anfang:

hier der passende Blueprint zum importieren (dazu gilt es wieder in .yaml umzubenennen)

demand_curve_controller.txt (3,7 KB)

Würde mich freuen über den Weg auch mal in den Genuss zu kommen einige der komplexeren Varianten hier der Autoren ausprobieren zu können.

Edit:

Mal flux die Bedarfsteuerung auf Basis des Soll-Ist-Abgleichs in ein Blueprint gekippt (kleine Ergänzungen wie einen Überheizschutz ergänzt) / die Kennline ist noch nicht detailiert ausgeknobelt aber das dürfte eh subjektiv zu tun sein:

Anbei das Blueprint:

demand_control_target_vs_actual.txt (4,5 KB)

Zur Nutzung:

  • Umbenennen in.yaml
  • mit dem File-Editor zB nach /homeassistant/blueprints/automation/daikin/demand_control_target_vs_actual.yaml hochladen
  • Übers System die Yaml Files neu Laden
  • Dann neue Automation über dieses Blueprint erstellen

Edit2: Die vorherige Bedarfregelung auf Basis Soll/Isttemperaturvergleich erscheint sehr reaktionsfreudig und kann auch den ruhigen lauf einer Anlage negativ beeinflussen. Entsprechend auf Anreiz von @Bernhard74 nun ein Hybrid der den Bedarf wieder basierend auf der Außentemperatur nach einer Kennlinie setzt, aber zusätzlich einen Korrekturfaktor Soll/Isttemperatur nach Kennlinie verwendet.

hybrid.txt (5,4 KB)

6 „Gefällt mir“

Hallo, vielen dank für das Blueprint, ich werde es gegen Ende der Woche testen.

Ich persönlich find die die Art und Weise mit dem Blueprint Top, da ich selbst eine YAML oder so nicht selbst ins Leben rufen kann. Auch dass man die Parameter einstellen kann ist eine tolle Sache. Vielen dank allen die da mitwirken. Ganz speziell natürlich dir WattJetzt

1 „Gefällt mir“

Hallo

da mir eine Systemneutralität am Herzen liegt und es hier um die optimale Regelung der Daikin per Faikout geht, mag ich sehr ähnliches für den IOBroker nicht vorenthalten. Blueprints stehen leider so nicht zur Verfügung und es ist letztlich effektiver direkt im sortierten und gut kommentierten JS-Code anzupassen.

/***************************************************
 * =================================================
 *   DAIKIN KLIMA – EXTERNE REGELUNG 
 * =================================================
 *
 * FUNKTION:
 * Steuert eine Daikin-Klimaanlage über vordefinierte Aliase.
 * Enthält:
 *
 * 1️⃣ Zeitplanbetrieb:
 *    - Standard- und Luxusbetrieb nach Wochenplan
 *    - Aktiviert/Deaktiviert das Gerät je nach Uhrzeit
 *    - Setzt Solltemperatur beim Start des Zeitplans
 *    - Setzt Totband beim Start des Zeitplans
 *
 * 2️⃣ Swing + ECO Komfortfunktionen:
 *    - Lüfter wird automatisch auf AUTO gesetzt
 *    - Vertikaler Swing optional aktivieren
 *    - Swing wird nach Maximaldauer automatisch deaktiviert
 *    - Swing wird auch deaktiviert wenn Sollwert erreicht wird
 *    - ECO-Modus optional beim Betrieb aktivieren
 *
 * 3️⃣ Heizungsregelung (Demand-Regelung):
 *    - Aktiv nur im Heizmodus ("H")
 *    - Demand = Außentemperaturkennlinie + Soll/Ist-Korrektur
 *    - Demand wird auf Minimal/Maximalwert begrenzt
 *    - Rundung auf gültige 5%-Schritte
 *    - Überhitzschutz: Wenn Sollwert + Limit erreicht → Demand = Minimum
 *
 * 4️⃣ Manuelle Übersteuerung:
 *    - Setpoint-Änderungen an Gerät oder UI werden erkannt
 *    - Manueller Sollwert bleibt aktiv bis ein neuer Zeitplan startet
 *
 * 5️⃣ Zentrale Steuerung:
 *    - Nur ein Timer (mainLoop) steuert das komplette Script
 *    - Jede Minute werden Zeitplan und Regelung geprüft
 *
 ***************************************************/



// =======================
// ALIASE – Steuerpunkte der Klimaanlage
// =======================

const ALIAS = {

    power: "alias.0.WohnzimmerDaikin.power",      // Anlage EIN/AUS
    mode: "alias.0.WohnzimmerDaikin.modus",       // Betriebsmodus (H/C/F)
    fan: "alias.0.WohnzimmerDaikin.fanmodus",     // Lüftermodus
    swingv: "alias.0.WohnzimmerDaikin.swingv",    // Vertikaler Swing
    econo: "alias.0.WohnzimmerDaikin.econo",      // ECO Modus

    setTemp: "alias.0.WohnzimmerDaikin.autot",    // Solltemperatur
    deadband: "alias.0.WohnzimmerDaikin.autor",   // Totband

    demand: "alias.0.WohnzimmerDaikin.demand"     // Leistungsanforderung %

};


// =======================
// SENSORPUNKTE – Messwerte
// =======================

const SENSOR = {

    actualTemp: "alias.0.WohnzimmerEnv.ACTUAL",            // aktuelle Raumtemperatur
    outdoorTemp: "alias.0.WohnzimmerDaikin.Aussentemperatur" // Außentemperatur der Anlage

};



// =======================
// ZEITPLÄNE – Wochenbetrieb
// =======================

const ENABLE_STANDARD_SCHEDULE = true;
const ENABLE_LUXUS_SCHEDULE = true;

const SETPOINT_STANDARD = 21.2;
const SETPOINT_LUXUS = 21.5;

const DEADBAND = 0.2;


// Wochenplan (0 = Sonntag)

const scheduleConfig = {

    startStandard: ["10:00","11:00","10:00","11:00","10:00","11:00","10:00"],
    stopStandard:  ["13:00","15:00","15:00","15:00","15:00","15:00","15:00"],

    startLuxus:    ["13:00","15:00","15:00","15:00","15:00","15:00","15:00"],
    stopLuxus:     ["21:45","21:45","21:45","21:45","21:45","22:00","22:15"]

};



// =======================
// SCHWINGAUTOMATIK + ECO
// =======================

const swingAuto = true;        // Swing automatisch aktivieren
const swingMaxMinutes = 90;    // maximale Swing-Dauer

const econoAuto = true;        // ECO automatisch aktivieren



// =======================
// DEMAND – Leistungsregelung
// =======================

const DEMAND_MIN = 30;
const DEMAND_MAX = 100;

const DEMAND_STEP = 5;

const overheatLimit = 0.4; // Überhitzschutz


// Soll/Ist Korrektur

const correctionCurve = [

    { diff: -0.5, adjust: -10 },
    { diff: -0.2, adjust: -5 },
    { diff: 0.0, adjust: 0 },
    { diff: 0.35, adjust: 5 },
    { diff: 1.0, adjust: 10 }

];


// Basiskennlinie Außentemperatur

const demandCurve = [

    { temp: -10, demand: 70 },
    { temp: -5, demand: 60 },
    { temp: 0, demand: 55 },
    { temp: 5, demand: 50 },
    { temp: 10, demand: 45 },
    { temp: 15, demand: DEMAND_MIN }

];



// =======================
// INTERNER STATUS
// =======================

let lastScheduledSetpoint = null;

let manualOverrideActive = false;
let manualSetpoint = null;

let swingTimer = null;

let lastStdOn="", lastStdOff="", lastLuxOn="", lastLuxOff="";



// =======================
// HILFSFUNKTIONEN
// =======================


// Heizmodus prüfen
function isHeatingMode(){

    return getState(ALIAS.mode)?.val === "H";

}


// ECO aktivieren
function ensureEcono(){

    if(econoAuto && getState(ALIAS.econo)?.val !== true)
        setState(ALIAS.econo,true,false);

}



// Komfortfunktionen aktivieren

function activateComfortFeatures(actualTemp,setpoint){

    if(getState(ALIAS.fan)?.val !== "A")
        setState(ALIAS.fan,"A",false);


    if(swingAuto && getState(ALIAS.swingv)?.val!==true){

        setState(ALIAS.swingv,true,false);

        if(swingTimer) clearTimeout(swingTimer);

        swingTimer=setTimeout(()=>{
            setState(ALIAS.swingv,false,false);
        },swingMaxMinutes*60*1000);

    }


    if(getState(ALIAS.swingv)?.val===true && actualTemp>=setpoint)
        setState(ALIAS.swingv,false,false);


    ensureEcono();

}



// =======================
// DEMAND BERECHNUNG
// =======================


// Basisleistung aus Außentemperatur

function calcBaseDemand(outTemp){

    if(outTemp<=demandCurve[0].temp)
        return demandCurve[0].demand;

    if(outTemp>=demandCurve.at(-1).temp)
        return demandCurve.at(-1).demand;


    for(let i=0;i<demandCurve.length-1;i++){

        const a=demandCurve[i];
        const b=demandCurve[i+1];

        if(outTemp>=a.temp && outTemp<=b.temp){

            const ratio=(outTemp-a.temp)/(b.temp-a.temp);

            return Math.round(a.demand + ratio*(b.demand-a.demand));

        }

    }

    return DEMAND_MIN;

}



// Anpassung nach Soll/Ist

function adjustDemand(base,actual,target){

    const diff=target-actual;


    if(actual>=target+overheatLimit)
        return DEMAND_MIN;


    for(let i=0;i<correctionCurve.length-1;i++){

        const a=correctionCurve[i];
        const b=correctionCurve[i+1];

        if(diff>=a.diff && diff<=b.diff){

            const ratio=(diff-a.diff)/(b.diff-a.diff);

            return Math.round(base+a.adjust + ratio*(b.adjust-a.adjust));

        }

    }

    return base;

}



// =======================
// MANUELLE ÜBERSTEUERUNG
// =======================

function checkManualOverride(){

    const currentSetpoint=parseFloat(getState(ALIAS.setTemp)?.val);

    if(lastScheduledSetpoint!==null &&
        currentSetpoint!==lastScheduledSetpoint &&
        !manualOverrideActive){

        manualOverrideActive=true;
        manualSetpoint=currentSetpoint;

    }

}



// =======================
// REGELUNG AUSFÜHREN
// =======================

function applyControl(setpoint){

    if(!isHeatingMode()) return;


    const actual=parseFloat(getState(SENSOR.actualTemp)?.val)||setpoint;

    const outdoor=parseFloat(getState(SENSOR.outdoorTemp)?.val)||10;


    if(manualOverrideActive)
        setpoint=manualSetpoint;
    else
        lastScheduledSetpoint=setpoint;


    setState(ALIAS.setTemp,setpoint,false);


    let baseDemand=calcBaseDemand(outdoor);

    let demand=adjustDemand(baseDemand,actual,setpoint);


    demand=Math.round(demand/DEMAND_STEP)*DEMAND_STEP;

    demand=Math.min(DEMAND_MAX,Math.max(DEMAND_MIN,demand));


    setState(ALIAS.demand,demand,false);


    activateComfortFeatures(actual,setpoint);

}



// =======================
// DEMAND NACHREGELN
// =======================

function updateDemand(){

    if(!getState(ALIAS.power)?.val) return;

    if(!isHeatingMode()) return;


    const setpoint=parseFloat(getState(ALIAS.setTemp)?.val);

    const actual=parseFloat(getState(SENSOR.actualTemp)?.val);

    const outdoor=parseFloat(getState(SENSOR.outdoorTemp)?.val);


    if(isNaN(setpoint)||isNaN(actual)) return;


    let baseDemand=calcBaseDemand(outdoor);

    let demand=adjustDemand(baseDemand,actual,setpoint);


    demand=Math.round(demand/DEMAND_STEP)*DEMAND_STEP;

    demand=Math.min(DEMAND_MAX,Math.max(DEMAND_MIN,demand));


    setState(ALIAS.demand,demand,false);


    activateComfortFeatures(actual,setpoint);

}



// =======================
// ZEITPLAN
// =======================

function checkSchedule(){

    const now=new Date();

    const wd=now.getDay();

    const hm=now.toTimeString().slice(0,5);

    const day=now.toDateString();


    checkManualOverride();


    if(ENABLE_STANDARD_SCHEDULE &&
        hm>=scheduleConfig.startStandard[wd] &&
        lastStdOn!==day){

        manualOverrideActive=false;

        setState(ALIAS.power,true,false);

        setState(ALIAS.deadband,DEADBAND,false);

        applyControl(SETPOINT_STANDARD);

        lastStdOn=day;

    }


    if(ENABLE_LUXUS_SCHEDULE &&
        hm>=scheduleConfig.startLuxus[wd] &&
        lastLuxOn!==day){

        manualOverrideActive=false;

        setState(ALIAS.power,true,false);

        setState(ALIAS.deadband,DEADBAND,false);

        applyControl(SETPOINT_LUXUS);

        lastLuxOn=day;

    }


    if(ENABLE_LUXUS_SCHEDULE &&
        hm>=scheduleConfig.stopLuxus[wd] &&
        lastLuxOff!==day){

        setState(ALIAS.power,false,false);

        lastLuxOff=day;

    }

}



// =======================
// HAUPTSCHLEIFE
// =======================

function mainLoop(){

    checkSchedule();

    if(getState(ALIAS.power)?.val)
        updateDemand();

}



// =======================
// TIMER – zentrale Steuerung
// =======================

schedule("* * * * *", mainLoop);

2 „Gefällt mir“

Ich teste gerade die hybrid-Version. Läuft prima, manchmal noch etwas rucklig wenn die Solltemperatur erreicht, bzw. überschritten ist, aber absolut bruachbar und einfach zu installieren. Ein paar Dinge sind mir noch unklar, bzw. wären schön wenn sie einstellbar wären:

  1. Zykluszeit ist fix, da wäre es schön, wenn diese verlängert werden könnte
  2. Warum kann demand-Änderung pro Zyklus <5% eingestellt werden? Die min-Schrittweite ist 5%
  3. Eine kurze Beschreibung der Überheizschutz-Funktion und der Raumkorrektur wäre schön
  4. Warum startet bei mir der horizontale Swing bei Aktivierung der Automation und wo kann ich das ausschalten?

Vielen Dank @WattJetzt

Eigentlich wäre das Thema eher etwas für den Regelungs-Thread, oder?