LDC - Daikin tarveohjaus Faikout avulla

Luukku

Vakionaama
Perustarve sisälämpötilavirheestä --- #} {% set e = T - Tset %} {% if e | abs < 0.05 %} {% set e = 0 %} {% endif %} {% set N_base = 50 + (-e * 50 * gain) %} {% set N_base = [100, [40, N_base] | max] | min %}
Toinen hienosäätökohde on tuo "N_base=40 + (-e * 40 * gain) eli vaihtaa 50 40:en.
 

Luukku

Vakionaama
90% mullakin näyttää vaikka lähellä tavoitetta ollaan sisällä.
 

Liitteet

  • IMG_6995.jpeg
    IMG_6995.jpeg
    82,6 KB · Katsottu: 6

heebo1974

Aktiivinen jäsen
Jos takka dominoi ja halutaan minimoida energian kulutus, niin eikös olisi syytä lepuuttaa pumppua alhaisilla DC:llä ?
Mitä muuten tarkoitat "lähellä tavoitetta" ? Puhutaanko desimaaleista vai kokonaisista asteista ?
Tavoitehan minulla on 22.3C ja huoneessa on melkein 24C.
 

Luukku

Vakionaama
Jos takka dominoi ja halutaan minimoida energian kulutus, niin eikös olisi syytä lepuuttaa pumppua alhaisilla DC:llä ?
Mitä muuten tarkoitat "lähellä tavoitetta" ? Puhutaanko desimaaleista vai kokonaisista asteista ?
Tavoitehan minulla on 22.3C ja huoneessa on melkein 24C.
Muutenhan mennään ylilämmölle niin jos kertoimet on kohillaan niin näin myös DC laskee, kun ollaan tavoitelämmössä ja ennuste näyttää, että tunnin päästä on vielä lämpimämpää. Tässä korostuu se "talon eläminen" ja siksi kertoimia pitää vähän hakea. Tuo lepuutus ilmeisesti on aikaisemmin siellä onnistunut jos DC on ollut 30?
 

heebo1974

Aktiivinen jäsen
Muutenhan mennään ylilämmölle niin jos kertoimet on kohillaan niin näin myös DC laskee, kun ollaan tavoitelämmössä ja ennuste näyttää, että tunnin päästä on vielä lämpimämpää. Tässä korostuu se "talon eläminen" ja siksi kertoimia pitää vähän hakea. Tuo lepuutus ilmeisesti on aikaisemmin siellä onnistunut jos DC on ollut 30?
Juu tämä pelkkä visuaalinen toteutus ei kuitenkaan kerro koko totuutta. :)
Täytyy katsoa, jos laittaisi ML scriptin ainakin lepäämään hetkeksi ja ottaisi tämän LDC toteututuksen kokeiluun.
Tässä ainakin se hyvä puoli, että on sen verran yksinkertainen, että ehkä itsekin osaa jotain kertoimia vaihdella kun vaan vähän pääsee sisään.

Alkaa HA:ssa olemaan aika perkeleen paljon erilaisia sensoreita, vipuja jne. pelkästään ilpeille. Kun ei ole viitsinyt oikein mitään vielä poistaa, kun ei tiedä vaikka palaisi alkuperäiseen omaan (ei tarveohjattuun) systeemiin.
Sitten kun nimeämisiä en ole oikein systemaattisesti tehnyt, niin soppa on valmis. Nytkin tässä LDC:ssä käytin noita ML scriptin entityjä ja muutamaan piti tehdä taas uusia.. :)
 

heebo1974

Aktiivinen jäsen
Laita mulle sun sensori niin katson löydänkö jotain.
YAML:
{% set T = states('sensor.ruuvitag_eac5_temperature_filtered2') | float(0) %}
{% set Tset = states('input_number.daikin_setpoint_base') | float(0) %}
{% set prev = states('input_number.demand_locked') | float(0) %}
{% set T_out = states('sensor.outside_filtered_faikout_stylish') | float(0) %}

{# --- 0) Kylmäkerroin ulkolämpötilasta --- #}
{% set gain_base =
     1.4 if T_out < -10 else
     1.2 if T_out < -5 else
     1.0 if T_out < 2 else
     0.9 %}

{# --- Lopullinen gain --- #}
{% set gain = gain_base %}

{# --- 1) Perustarve sisälämpötilavirheestä --- #}
{% set e = T - Tset %}
{% if e | abs < 0.05 %}
  {% set e = 0 %}
{% endif %}

{% set N_base = 40 + (-e * 40 * gain) %}
{% set N_base = [100, [40, N_base] | max] | min %}

{# --- 2) Ennusteen mukainen bias --- #}
{% set T_future = states('sensor.lampotila_ennuste_1h') | float(0) %}
{% set e_future = T_future - Tset %}

{% if e_future < -0.2 %}
  {% set offset_1h = 5 %}
{% elif e_future > 0.2 %}
  {% set offset_1h = -5 %}
{% else %}
  {% set offset_1h = 0 %}
{% endif %}

{# --- 2b) Trendikorjattu ohjaus --- #}
{% set N_trend = N_base + offset_1h %}
{% set N_trend = [100, [40, N_trend] | max] | min %}

{# --- 3) Sulatuksen jälkeinen rajoitus kytkimellä --- #}
{% if is_state('input_boolean.sulatusrajoitus', 'on') %}
  {% set N_scaled = 90 %}
{% else %}
  {% set scale = 1.20 %}
  {% set N_scaled = N_trend * scale %}
  {% set N_scaled = [100, [40, N_scaled] | max] | min %}
{% endif %}

{# --- Pyöristetään 10 % portaisiin --- #}
{% set N_scaled = ((N_scaled / 10) | round(0) * 10) %}

{# --- 4) Deadband + aikahystereesi (10 min) --- #}
{% set diff = (N_scaled - prev) | abs %}
{% set age = (now() - states.input_number.demand_locked.last_changed).total_seconds() %}

{# --- Minimiaskel 10 % molempiin suuntiin --- #}
{% set threshold = 10 %}

{# --- 20 % muutos sallitaan heti (alas tai ylös) --- #}
{% if diff >= 20 %}
  {{ N_scaled | int }}

{# --- YLÖSPÄIN: sallitaan aina kun diff >= 10 --- #}
{% elif N_scaled > prev and diff >= threshold %}
  {{ N_scaled | int }}

{# --- ALASPÄIN: sallitaan vain jos 600 s täynnä ja diff >= 10 --- #}
{% elif N_scaled < prev and age > 600 and diff >= threshold %}
  {{ N_scaled | int }}

{# --- Muuten pidetään edellinen arvo --- #}
{% else %}
  {{ prev | int }}
{% endif %}
 

heebo1974

Aktiivinen jäsen
Räpelsin nyt demand_lockedia.
...
75 -> DC90
80 -> DC90
85 -> DC85
90 -> DC90
95 -> DC95
100 -> DC100

Eli kaikki alle 85:en antaa aina DC90.
 

Luukku

Vakionaama
Joo siinä hystereesissä on jotain häikkää eli ei saa last changed tietoa varmaankaan. Tarpeeksi suuri säätö pitäisi mennä ilman viivettä.
 

Luukku

Vakionaama
Minulla oli sulatusrajoitus boolean ON. Varmaan tuota pitää ohjata erikseen automaatiolla päälle tarvittaessa ?

katso liitettä 112734
Joo sillä olen hillinnyt leudoimmilla keleillä sulatuksen jälkeistä ryntäilyä. Nyt en muista onko enää käytössäkään, kun QO on kokoajan päällä. Tuon voi poistaa, jos ei ole tarvetta.
Edit: nyt lukemat näyttää paremmilta.
 

heebo1974

Aktiivinen jäsen
Taidan nyt väkertää tämän uudelleen ja nimeämällä sensoreita LDC etuliitteellä. On sitten helppo päättää säilyttääkö, vaiko hylkääkö.
Teen samalla molemmille pumpuille sensorit ja automaatiot. Oma dasboardi myös käyttöön ja omat graafit. Saa nähä otanko vielä tänään tuotantoon, vai joskus myöhemmin. 😁

EDIT: Ainiin pitää vielä se sun sääpisteytyshomma ottaa mukaan. Jos saat sen illalla vaikka tuupattua tänne.
 

heebo1974

Aktiivinen jäsen
Olikos tuon demand_lockedin tarkoitus esim. pakkasilla pitää isomaa minimi DC:tä ? Jos kyllä, niin kannattaisiko valita esim. kaksi tai kolme eri arvoa pakkasten perusteella ? Niinkui ML scriptissäkin on vaihtoehtoina: (-5…-10°C), (-11…-16°C) ja (≤ -16°C)).
 

Luukku

Vakionaama
Olikos tuon demand_lockedin tarkoitus esim. pakkasilla pitää isomaa minimi DC:tä ? Jos kyllä, niin kannattaisiko valita esim. kaksi tai kolme eri arvoa pakkasten perusteella ? Niinkui ML scriptissäkin on vaihtoehtoina: (-5…-10°C), (-11…-16°C) ja (≤ -16°C)).
Se locked on vaan sen prev tiedon takia. Kylmäkerroin (eli mitä pienensit aikaisemmin) huolehtii pakkaskelistä.
 

Luukku

Vakionaama
Tässä näitä sääkerroin systeemin templareita:
1. Sisälämpötilan pisteytys. Siinä on input.number pienelle kalibroinnille. Vaatii input numberin.
Koodi:
{# --- 1) Sisälämpötila pisteytys --- #}

{% set Ti = states('sensor.sisälämpötila')|float(0) %}
          {% set kerroin = states('input_number.sisalampo_kalibrointi')|float(1) %}
          {% set Ti_score = (22 - Ti) * 0.5 * kerroin %}
          {{ Ti_score|round(3) }}

2. Ulkolämpötilan pisteytys
Koodi:
{# --- 2) Ulkolämpötila pisteytys --- #}
      
          {% set dT = states('sensor.ulkolampo_derivaatta') | float(0) %}
{% set T_out = states('sensor.ulkolampotila') | float(0) %}

{# 1) Derivaatta: laskeva lämpötila lisää pisteitä #}
{% set score_dt = (0 - dT) %}

{# 2) Pakkasbonus: mitä kylmempi, sitä enemmän pisteitä #}
{% set score_temp = (0 - T_out) if T_out < 0 else 0 %}

{# 3) Yhteispisteet #}
{% set score = score_dt + score_temp %}

{# 4) Jaetaan 10:llä #}
{{ [score / 10, 0] | max | round(3) }}

3. Ilmanpaine pisteytys, ilmanpaine tieto jostain sääpalvelusta tai RuuviTagin anturista, myös sisällä mitattu paine käy. Tee derivaatta sensori.
Koodi:
{# --- 3) Ilmanpaine pisteytys --- #}

{% set dP = states('sensor.ilmanpaine_derivaatta')|float(0) %}
          {# positiivinen dP = paine nousee → kylmenee → pisteitä #}
          {{ [dP, 0]|max|round(3) }}

4. Tuuli fasadi pisteytys, tiedot FMI palvelusta esim (HA integraatio). Kertoimet voi muuttaa oman sijainnin mukaan mistä pahin viima käy.
Koodi:
{# --- 4) Tuuli fasadi pisteytys --- #}
    
          {% set s = states('sensor.wind_direction') %}
{% set map = {
  'N': 0.95,
  'NE': 1.00,
  'E': 0.95,
  'NW': 0.6,
  'W': 0.5,
  'SE': 0.4,
  'SW': 0.3,
  'S': 0.3
} %}
{% set wfac = map.get(s, 0.5) %}

{% set v = states('sensor.wind_speed')|float(0) %}
{% set wnorm = [v/10, 1]|min %}

{{ (wfac * wnorm)|round(3) }}

5. Lämmityksen ennakointikerroin eli se mikä laitetaan sinne templateen, joka laskee sitä DC%. Tässä input.number hienosäätö tuulikertoimelle.
Vaatii input.numberin.
Koodi:
{% set t = states('sensor.lampotilan_pisteytys')|float(0) %}
{% set p = states('sensor.ilmanpaine_pisteytys')|float(0) %}
{% set ti = states('sensor.sisalampotila_pisteytys')|float(0) %}
{% set wfac = states('sensor.tuuli_fasadi_pisteytys')|float(0) %}
{% set wmult = states('input_number.tuulikerroin')|float(1.0) %}

{{ (t + p + ti*1.2 + wfac*wmult)|round(3) }}

Edit: Tuulikerroin input.number min 1 max 10 (step 0,1)
Sisälämpötila input.number min -2 max 2 (step 0,1)
 
Viimeksi muokattu:

heebo1974

Aktiivinen jäsen
Joo sillä olen hillinnyt leudoimmilla keleillä sulatuksen jälkeistä ryntäilyä. Nyt en muista onko enää käytössäkään, kun QO on kokoajan päällä. Tuon voi poistaa, jos ei ole tarvetta.
Hmm.. Joudun varmaan Comforan tapauksessa hyödyntämään tuota, koska siinä ei ole QO:ta.
 

heebo1974

Aktiivinen jäsen
Noniin, tämä systeemi on nyt käytössä, lukuunottamatta sulatusrajoitusta comforalle ja noita säävaikutuksia en vielä myöskään jaksanut viritellä.
Katsotaan, että lähtee nyt yleensä pyörimään.

EDIT: Ja sillä lisäyksellä, että setpointin hoitaa tuo oma nordpool viritelmäni.
 
Viimeksi muokattu:

Luukku

Vakionaama
Oliko sulla joku valmis automaatio tuolle sulatusrajoitukselle. Ei nyt jotenkin jaksaisi miettiä yhtään logiikkaa.
Ei näytä olevan käytössä nyt, mutta tee binääri sensori mikä menee "true", kun comfora sulattaa ( liquid 0)
Koodi:
template:
  - binary_sensor:
      - name: "Daikin Liquid Nolla"
        state: >
          {% set liquid = states('sensor.daikin_comfora_liquid') | float(999) %}
          {{ liquid == 0 }}

sitten lisäät tuon tähän
Koodi:
{# --- 3) Sulatuksen jälkeinen rajoitus kytkimellä --- #}
{% if is_state('binary_sensor.comfora_liquid_tjsp', 'true') %}
  {% set N_scaled = 90 %}
{% else %}
  {% set scale = 1.20 %}
  {% set N_scaled = N_trend * scale %}
  {% set N_scaled = [100, [40, N_scaled] | max] | min %}
{% endif %}

Tuo palautuu sitten false, kun liquid on yli nollan. Jos tarvii pitempää aikaa niin siihen pitää lisätä hystereesiä.
 

Luukku

Vakionaama
EDIT: Ja sillä lisäyksellä, että setpointin hoitaa tuo oma nordpool viritelmäni.
Säätääkö Nordpool tuota samaa setpointtia minkä laitoit tähän DC ohjaukseen, toivottavasti? Eli kun Nordpool säätää setpointtia niin LDC ottaa sen huomioon, kun säätää DC:tä:)
Eli Nordpool vaikutus menee tähän automaattisesti:
Koodi:
{# --- 1) Perustarve sisälämpötilavirheestä --- #}
{% set e = T - Tset %}
{% if e | abs < 0.05 %}
  {% set e = 0 %}
{% endif %}
 

heebo1974

Aktiivinen jäsen
Se locked on vaan sen prev tiedon takia. Kylmäkerroin (eli mitä pienensit aikaisemmin) huolehtii pakkaskelistä.
Oletko tehnyt tuolle lockedille jonkin automaation? Eli ilmeisesti, kun DC muuttuu, kirjoitetaan vanha tieto tuohon ? Vai onko se vaan olemassa, ettei tule mitään unavailable tietoa ?
 

heebo1974

Aktiivinen jäsen
Säätääkö Nordpool tuota samaa setpointtia minkä laitoit tähän DC ohjaukseen, toivottavasti? Eli kun Nordpool säätää setpointtia niin LDC ottaa sen huomioon, kun säätää DC:tä:)
Eli Nordpool vaikutus menee tähän:
Koodi:
{# --- 1) Perustarve sisälämpötilavirheestä --- #}
{% set e = T - Tset %}
{% if e | abs < 0.05 %}
  {% set e = 0 %}
{% endif %}
Kyllä.
 

heebo1974

Aktiivinen jäsen
Pitihän minun vähän puukottaa tuota koodia. Muutin sitä, että se suostuu menemään 30% saakka. 🤓
Saahan tuota muutettua, jos ei tunnu hyvältä.
 

heebo1974

Aktiivinen jäsen
Juu ilman muuta, Faikoutillahan sinne pääsee. Miltäs dc:t ja lämpötilat näyttää?
Vielä vähän aikaista, kun olen räpeltänyt ja löysin pari omaa sensorivirhettäkin. Oli daikin2:en templateen jäänyt pari daikin1:en entityä. :)
Toistaiseksi on tarjonnut vasta DC40:stä, vaikka ollaan kyllä yli setpointin. No ilmeisesti sen pitää olla "reilusti" yli, ennenkuin alkaa mennä noin alas.'

EDIT: PItääkin kokeilla developer modessa vähän tutkailla miten noi arvot vaikuttaa.
 
Back
Ylös Bottom