Duco energy comfort 325 icm Home Assistant

Pagina: 1
Acties:

Vraag


Acties:
  • +1 Henk 'm!

  • laurens362
  • Registratie: Juni 2013
  • Laatst online: 23-04 18:23
Hoi,

Ik vroeg me af wat de manier is om de duco te kunnen laten communiceren met HA.
Ik wil namelijk graag de duco via home assistant kunnen besturen.

Vooralsnog het "enige" wat ik bedacht had is een rf 868 mhz controller.
Suggesties zijn welkom!

Alle reacties


Acties:
  • 0 Henk 'm!

  • bassa91
  • Registratie: Januari 2024
  • Laatst online: 21-03 23:06
Ik volg dit graag. Ben hier ook naar opzoek.

Acties:
  • +1 Henk 'm!

  • Gizz
  • Registratie: Maart 2001
  • Laatst online: 21:55

Gizz

Dunder-Mifflin, Inc.

Open AIR (open source smart ventilatieaansturing) ?

Ken verder de Duco niet, maar als ik even Google zie ik dat je hem kunt gebruiken met een Connectivity board waarmee je lokaal kunt aansturen via modbus en een REST API. Dus mogelijkheden genoeg lijkt me :)

edit: kijkend naar de technische brochure is hij ook met een 0-10V signaal aan te sturen.

[ Voor 21% gewijzigd door Gizz op 12-03-2024 15:25 ]

Canon EOS 5Dm3 + 5D + 7D + 300D + 1000FN + EF 17-40 4L + EF 35 1.4L + EF 50 1.8 + EF 80-200 2.8L + 550EX


Acties:
  • +1 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
Ik heb sinds een week een Ducobox Energy Comfort met zone kleppen en een Duco Connectivity Board.
De data die de Connectivity board geeft is, wat ik achterhaal, anders dan de oude communication Print.

Ik heb modbus getest maar gebruik zelf de restapi met homeassistant. Ik ken twee belangrijke urls met data:
https://internal-ip/info en https://internal-ip/info/nodes.

De IaqCo2 en IaqRh waardes zijn kwaliteitswaardes gebaseerd op CO2 of HR zie oa de modbus datablad https://www.duco.eu/Wes/C...l)_638487876175401607.pdf bladzijde 3. Het zijn niet de CO2 waardes in ppm en RH waardes in % maar kwaliteitslabels die Duco er aan heeft gehangen.

Ik mis in de JSON data de werkelijke RH en CO2 waardes evenals de temperatuur waardes van de aanwezige sensoren. Ik weet dat deze gegevens via de installation app bereikbaar zijn en ook de setpoints zijn aanpasbaar, echter deze app wordt door Duco alleen open gezet voor installateurs. De Duco api met de Connectivity Board is op dit moment voor particulieren zeer beperkt of is er nog een url met de missende data?

Mijn, nog in ontwikkeling zijnde, setup:
Toegevoegd in configuration.yaml
code:
1
rest: !include rest.yaml

In rest.yaml:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
- resource: https://192.168.1.14/info
  scan_interval: 3600
  verify_ssl: false
  sensor:
# general box
    - unique_id: ducobox_timefilterremain
      name: Ducobox Filter resttijd
      value_template: "{{ value_json['HeatRecovery']['General']['TimeFilterRemain']['Val'] }}"
      device_class: duration
      unit_of_measurement: "d"


- resource: https://192.168.1.14/info/nodes
  scan_interval: 15
  verify_ssl: false
  sensor:
#node 1 the ducobox
    - unique_id: ducobox_node1_state
      name: Ducobox - Status
      value_template: "{{ value_json['Nodes'][0]['Ventilation']['State']['Val'] }}"
    - unique_id: ducobox_node1_mode
      name: Ducobox - Mode
      value_template: "{{ value_json['Nodes'][0]['Ventilation']['Mode']['Val'] }}"
    - unique_id: ducobox_node1_FlowLvlTgt
      name: Ducobox - Flow Level Target
      value_template: "{{ value_json['Nodes'][0]['Ventilation']['FlowLvlTgt']['Val'] }}"
      unit_of_measurement: "%"
    - unique_id: ducobox_node1_TimeStateRemain
      name: Ducobox - tijd status resterend
      value_template: "{{ value_json['Nodes'][0]['Ventilation']['TimeStateRemain']['Val'] }}"
    - unique_id: ducobox_node1_TimeStateEnd
      name: Ducobox - tijd status eind
      value_template: "{{ value_json['Nodes'][0]['Ventilation']['TimeStateEnd']['Val'] }}"

#node 1 HR sensor
    - unique_id: ducobox_node1_iaqRh
      name: Ducobox - RH air quality
      value_template: "{{ value_json['Nodes'][6]['Sensor']['IaqRh']['Val'] }}"
      unit_of_measurement: "%"

#node3 CO2 sensor wonen zone 1
    - unique_id: ducobox_node3_iaqCO2
      name: Ducobox wonen Co2 air quality
      value_template: "{{ value_json['Nodes'][3]['Sensor']['IaqCo2']['Val'] }}"
      unit_of_measurement: "%"

#node4 CO2 sensor slapen zone 2
    - unique_id: ducobox_node4_iaqCO2
      name: Ducobox slapen Co2 air quality
      value_template: "{{ value_json['Nodes'][4]['Sensor']['IaqCo2']['Val'] }}"
      unit_of_measurement: "%"

Pas voor eigen gebruik het ip nummer, entiteiten en node id's aan.

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • 0 Henk 'm!

  • dude_123
  • Registratie: December 2017
  • Laatst online: 29-01 10:44
Ik heb ooit een poging gedaan. Het werkt wel een beetje, maar ik ben geen coder.

Wellicht hebben jullie hier iets aan:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
sensor:
  ## Duco Ventilation Box
  - platform: rest
    resource: http://[IP ADDRESS]/nodeinfoget?node=1
    name: DucoBox
    json_attributes:
      - trgt
      - actl
      - ovrl
      - mode
      - error
    value_template: "{{ value_json.state }}"
  - platform: rest
    resource: http://[IP ADDRESS]/boxinfoget
    name: DucoBox2
    json_attributes:
      - EnergyInfo
      - General
      - EnergyCalib
    value_template: "{{ value_json.performance.powernow }}"

  - platform: template
    sensors:
      duco_temp_outside:
        friendly_name: "Duco outside temperature"
        value_template: '{{ states.sensor.ducobox2.attributes["EnergyInfo"]["TempODA"] | int / 10 }}'
        unit_of_measurement: °C
      duco_temp_inside:
        friendly_name: "Duco inside temperature"
        value_template: '{{ states.sensor.ducobox2.attributes["EnergyInfo"]["TempSUP"] | int / 10 }}'
        unit_of_measurement: °C
      pressuretotal:
        friendly_name: "Duco Total Pressure"
        value_template: '{{ states.sensor.ducobox2.attributes["EnergyInfo"]["SupplyFanPressActual"] | int }}'
        unit_of_measurement: kPa
      duco_powernow:
        friendly_name: "Duco Fan speed"
        value_template: '{{ states.sensor.ducobox2.attributes["Performance"]["SupplyFanSpeed"] | int  }}'
        unit_of_measurement: rpm
      duco_poweravg:
        friendly_name: "Duco Power Average"
        value_template: '{{ states.sensor.ducobox2.attributes["Performance"]["PowerAvg"] }}'
      duco_powermax:
        friendly_name: "Duco Power Max"
        value_template: '{{ states.sensor.ducobox2.attributes["Performance"]["PowerMax"] }}'
      duco_error:
        friendly_name: "Duco Error "
        value_template: '{{ states.sensor.ducobox.attributes["error"] }}'

### Rest Commands
rest_command:
  duco_fan_set_1:
    url: http://[IP ADDRESS]/nodesetoperstate?node=1&value=MAN1&cntdwn=600
  duco_fan_set_2:
    url: http://[IP ADDRESS]/nodesetoperstate?node=1&value=MAN2&cntdwn=600
  duco_fan_set_3:
    url: http://[IP ADDRESS]/nodesetoperstate?node=1&value=MAN3&cntdwn=600


Ik heb dit snel in elkaar geprutst. De rest commands werken. Zo zet ik met automation de ducobox op stand 3 na i minuut de lamp aan op het toilet. De timeout staat dan meteen op 600 seconden.


Als ik ga kijken naar de co2 waarden dan lijken dat wel ppms te zijn:
http://[IP ADDRESS]/nodeinfoget?node=2 <-- node 1 is ducobox, node 2 is sensor in huiskamer:

"co2 443"

Ik heb daar verder nog niets mee gedaan.

edit: type vout

Acties:
  • +1 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
@dude_123 Je code is voor de Duco Communication Print, deze is/wordt vervangen door de Connectivity Board. Met je code is niets mis maar kan niet gebruikt worden voor het nieuwe board.
Verschil tussen de borden:
ItemCommunication PrintConnectivity Board
LANJaJa
WifiNeeJa
CO2 uitlezen in ppmjanee (alleen kwaliteitspercentage)
RH uitlezenJanee (alleen kwaliteitspercentage)
Temperatuur sensors uitlezenJaNee
Gebruik Installation AppNee (wifi nodig)Nee (alleen voor geverifieerde installateurs)
Uitlezen filter resttijd JaJa
Uitlezen box debietJaJa
Modbus / restapiJaJa
Bekende Rest url'shttps://[IP ADDRESS]/nodeinfoget?node=1
https://[IP ADDRESS]/boxinfoget
https://[IP ADDRESS]/api (hier vind je de belangrijkste overige url's.)

Ter beoordeling/rectificatie....

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • 0 Henk 'm!

  • dude_123
  • Registratie: December 2017
  • Laatst online: 29-01 10:44
@marnie top overzicht.

Ah, daar was ik me totaal niet bewust van. Lijkt het maar, of is het niet echt een upgrade, op de wifi na.

Acties:
  • 0 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
Lijkt het maar, of is het niet echt een upgrade, op de wifi na.
Op wifi na is het inderdaad geen upgrade. De beschikbare sensordata in de openbare local api is minder (temperaturen missen) en verslechterd (CO2 en RH). Duco belooft koppeling met domotica en gebouwenbeheersing, de koppeling (restapi/modbus) is aanwezig nu de data nog. Op dit moment is de Connectivity Board zijn geld niet waard voor gebruik in Homeassistant.

Overigens vind ik de Energy Comfort 325 als WTW een prima product, goed instelbaar naar de eigen woning, nu de domotica koppeling nog.

[ Voor 7% gewijzigd door marnie op 01-05-2024 10:15 ]

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • 0 Henk 'm!

  • Batilan
  • Registratie: December 2009
  • Laatst online: 23:12
marnie schreef op dinsdag 30 april 2024 @ 15:23:
[...]

Op wifi na is het inderdaad geen upgrade. De beschikbare sensordata in de openbare local api is minder (temperaturen missen) en verslechterd (CO2 en RH). Duco belooft koppeling met domotica en gebouwenbeheersing, de koppeling (restapi/modbus) is aanwezig nu de data nog. Op dit moment is de Connectivity Board zijn geld niet waard.
:
In 'het andere Ducobox topic' gaf je aan dat deze sensor data wel uitgelezen kan worden door de Installer app? Dat zou dus betekenen dat de informatie wel beschikbaar gesteld moet worden door de connectivity print? We weten alleen nog niet hoe?

Overigens kun je ook de Duco install kit kopen voor € 95,- welke in feite een connectivity board in een mooi doosje is (maar zonder header op het board waardoor je hem er naast moet leggen en verbinden met een lint kabeltje met een header).

Acties:
  • 0 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
In 'het andere Ducobox topic' gaf je aan dat deze sensor data wel uitgelezen kan worden door de Installer app? Dat zou dus betekenen dat de informatie wel beschikbaar gesteld moet worden door de connectivity print? We weten alleen nog niet hoe?
Ja, ik heb de wtw zelf geïnstalleerd en de installer app daarna ook. Echter van Duco kreeg ik geen akkoord voor het gebruik van de app, men beschouwt particuliere installateurs niet als installateur die toegang verkrijgt.
Ik kan de app nog wel in maar kan de installatie niet via de app uitvoeren. Wel kan ik met de app de gemeten RH waarde en CO2 waardes uitlezen van de aangesloten sensoren, in ppm bij CO2 en % bij vochtigheid. De waardes zijn aanwezig maar niet toegankelijk voor de gebruiker bij gebruik van het connectivity board.

Het kunnen uitlezen van de RH waarde in de app heeft me geholpen bij het zoeken naar de reden dat de box opeens, gedurende een paar uur, onnodig een verhoogd debiet gaf: de gemeten RH waarde was hoger dan het RH setpoint. Door het setpoint te verhogen kwam de box weer in zijn normale bedrijfsstatus. Het kunnen uitlezen van deze waardes heeft voor een gebruiker echt wel nut.

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • 0 Henk 'm!

  • Batilan
  • Registratie: December 2009
  • Laatst online: 23:12
marnie schreef op dinsdag 30 april 2024 @ 20:21:
[...]

Ja, ik heb de wtw zelf geïnstalleerd en de installer app daarna ook. Echter van Duco kreeg ik geen akkoord voor het gebruik van de app, men beschouwt particuliere installateurs niet als installateur die toegang verkrijgt.
Ik kan de app nog wel in maar kan de installatie niet via de app uitvoeren. Wel kan ik met de app de gemeten RH waarde en CO2 waardes uitlezen van de aangesloten sensoren, in ppm bij CO2 en % bij vochtigheid. De waardes zijn aanwezig maar niet toegankelijk voor de gebruiker bij gebruik van het connectivity board.

Het kunnen uitlezen van de RH waarde in de app heeft me geholpen bij het zoeken naar de reden dat de box opeens, gedurende een paar uur, onnodig een verhoogd debiet gaf: de gemeten RH waarde was hoger dan het RH setpoint. Door het setpoint te verhogen kwam de box weer in zijn normale bedrijfsstatus. Het kunnen uitlezen van deze waardes heeft voor een gebruiker echt wel nut.
OK, dus zal wellicht lastig worden aan deze data te geraken :'( (althans met eigen gebouwde software). Wel erg vervelend, ik vraag me af welk risico Duco nu precies probeert te tackelen. Dat terwijl een enthousiaste Tweaker natuurlijk vaak om advies gevraagd wordt door zijn netwerk van vrienden, familie, collega's etc. Dat moet Duco toch ook weten :)

Wellicht kunnen we er als developer wel verder mee komen, maar ik weet niet welke eisen Duco aan developers stelt. Ik vroeg me ook al af waarom ik de IaqCo2 continu op 96 bleef staan terwijl ik toch het toerental hoor varieren. Hij zal zelf wel vinden dat de kwaliteit gelijk blijft bij oplopende CO2 productie doordat ie dan ook harder gaat draaien en het CO2 niveau dus weer 'tijdig' naar beneden krijgt.

Wellicht dan toch maar een oude communication board aanschaffen (of een ESP op de seriële verbinding).

[ Voor 5% gewijzigd door Batilan op 30-04-2024 22:01 ]


Acties:
  • 0 Henk 'm!

  • Dirk Diggler
  • Registratie: Januari 2006
  • Laatst online: 23-03 14:52
Heeft iemand hier ondertussen al een manier gevonden om de gemeten waardes uit te lezen/in home assistent te krijgen?

Ik heb mijn ducobox focus gisteren geïnstalleerd, en ging er nogal naïef vanuit dat dit met de communication print out of de box zou werken, wat dus nog altijd niet het geval is. Ik ga zelf deze week eens proberen of ik via modbus extra waardes kan uitlezen.

Acties:
  • +1 Henk 'm!

  • fudgee
  • Registratie: Augustus 2024
  • Laatst online: 01-05 08:45
@Dirk Diggler met de hulp van de post van @marnie heb ik de waarde die beschikbaar zijn via de Connectivity Board Api in Home Assistant weten te krijgen (zie afbeelding hieronder). Het enige wat ik nog niet kan in HA is het aanpassen van de ventilatiestand van AUTO naar bijv. MAN1. Ik vermoed dat ik hiervoor een bepaalde API endpoint nodig heb. Ik heb alleen geen idee hoe ik erachter kom welke. De API documentatie (https://connectivity.duco.eu/) zit achter een inlogscherm waar je alleen in kan als officiele installateur.

@marnie: Weet je toevallig of en hoe ik de ventilatiestand kan aanpassen via de Rest API van de Connectivity Board?

Edit: Ik denk dat ik de API endpoint heb gevonden om de ventilatiestand (VentilationState) aan te passen:
code:
1
https://<my_ip>/action/nodes/1


Ik heb alleen nog te weinig kennis van Rest API's om te weten hoe ik de functie `SetVentilationState` kan aanpassen

Afbeeldingslocatie: https://tweakers.net/i/AS0vMkx4Ds7Spxk06xth46CM9hc=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/IJe2h6kxSrzeu6G8CGvCSRAo.png?f=user_large

[ Voor 13% gewijzigd door fudgee op 06-08-2024 13:56 ]


Acties:
  • +2 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
@marnie: Weet je toevallig of en hoe ik de ventilatiestand kan aanpassen via de Rest API van de Connectivity Board?
@fudgee
Naast de code in marnie in "Duco energy comfort 325 icm Home Assistant" heb ik
in configuration bij files toegevoegd:
YAML:
1
2
rest_command: !include rest_command.yaml
fan: !include fan.yaml

en in de nieuwe rest_command.yaml file
YAML:
1
2
3
4
5
6
7
8
9
10
11
#
# Duco WTW api change commands
#
ducobox_state_change:
  url: https://192.168.1.14/action/nodes/{{ nodeId }}
  method: POST
  headers:
    accept: "application/json"
    content_type: "application/json"
  payload: '{"Action":"SetVentilationState","Val":"{{ state }}"}'
  verify_ssl: false

Dit creëert de service RESTful Command: ducobox_state_change

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • 0 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
En in fan.yaml:
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#
# WTW Ducobox
#
- platform: template
  fans:
    ducobox:
      unique_id: ducobox_ventilatie_control
      friendly_name: "Ducobox"
      value_template: >
        {% if states('sensor.ducobox_status') != 'EMPT' %}
          on
        {% else %}
          off
        {% endif %}
      turn_on:
        - service: rest_command.ducobox_state_change
          data:
            nodeId: "1"
            state: AUTO
      turn_off:
        - service: rest_command.ducobox_state_change
          data:
            nodeId: "1"
            state: EMPT
      preset_modes:
        - "Auto"
        - "Permanent manual 1"
        - "Permanent manual 2"
        - "Permanent manual 3"
        - "Manual 1"
        - "Manual 2"
        - "Manual 3"
        - "Afwezig"
      preset_mode_template: >
        {% if states('sensor.ducobox_status') == "CNT1" %}
          Permanent manual 1
        {% elif states('sensor.ducobox_status') == "CNT2" %}
          Permanent manual 2
        {% elif states('sensor.ducobox_status') == "CNT3" %}
          Permanent manual 3
        {% elif states('sensor.ducobox_status') == "MAN1" %}
          Manual 1
        {% elif states('sensor.ducobox_status') == "MAN2" %}
          Manual 2
        {% elif states('sensor.ducobox_status') == "MAN3" %}
          Manual 3
        {% elif states('sensor.ducobox_status') == "EMPT" %}
          Afwezig
        {% else %}
          Auto
        {% endif %}
      set_preset_mode:
        - service: rest_command.ducobox_state_change
          data:
            nodeId: "1"
            state: >
              {% if preset_mode == "Permanent manual 1" %}
                CNT1
              {% elif preset_mode == "Permanent manual 2" %}
                CNT2
              {% elif preset_mode == "Permanent manual 3" %}
                CNT3
              {% elif preset_mode == "Manual 1" %}
                MAN1
              {% elif preset_mode == "Manual 2" %}
                MAN2
              {% elif preset_mode == "Manual 3" %}
                MAN3
              {% elif preset_mode == "Afwezig" %}
                EMPT
              {% else %}
                AUTO
              {% endif %}
# Ducobox wonen
    wonen:
      unique_id: ducobox_ventilatie_wonen
      friendly_name: "Wonen"
      value_template: >
        {% if states('sensor.ducobox_status') != 'EMPT' %}
          on
        {% else %}
          off
        {% endif %}
      turn_on:
        - service: rest_command.ducobox_state_change
          data:
            nodeId: "2"
            state: AUTO
      turn_off:
        - service: rest_command.ducobox_state_change
          data:
            nodeId: "2"
            state: EMPT
      preset_modes:
        - "Auto"
        - "Permanent manual 1"
        - "Permanent manual 2"
        - "Permanent manual 3"
        - "Manual 1"
        - "Manual 2"
        - "Manual 3"
      preset_mode_template: >
        {% if states('sensor.ducobox_status') == "CNT1" %}
          Permanent manual 1
        {% elif states('sensor.ducobox_status') == "CNT2" %}
          Permanent manual 2
        {% elif states('sensor.ducobox_status') == "CNT3" %}
          Permanent manual 3
        {% elif states('sensor.ducobox_status') == "MAN1" %}
          Manual 1
        {% elif states('sensor.ducobox_status') == "MAN2" %}
          Manual 2
        {% elif states('sensor.ducobox_status') == "MAN3" %}
          Manual 3
        {% else %}
          Auto
        {% endif %}
      set_preset_mode:
        - service: rest_command.ducobox_state_change
          data:
            nodeId: "2"
            state: >
              {% if preset_mode == "Permanent manual 1" %}
                CNT1
              {% elif preset_mode == "Permanent manual 2" %}
                CNT2
              {% elif preset_mode == "Permanent manual 3" %}
                CNT3
              {% elif preset_mode == "Manual 1" %}
                MAN1
              {% elif preset_mode == "Manual 2" %}
                MAN2
              {% elif preset_mode == "Manual 3" %}
                MAN3
              {% else %}
                AUTO
              {% endif %}
# Ducobox slapen
    slapen:
      unique_id: ducobox_ventilatie_slapen
      friendly_name: "Slapen"
      value_template: >
        {% if states('sensor.ducobox_status') != 'EMPT' %}
          on
        {% else %}
          off
        {% endif %}
      turn_on:
        - service: rest_command.ducobox_state_change
          data:
            nodeId: "3"
            state: AUTO
      turn_off:
        - service: rest_command.ducobox_state_change
          data:
            nodeId: "3"
            state: EMPT
      preset_modes:
        - "Auto"
        - "Permanent manual 1"
        - "Permanent manual 2"
        - "Permanent manual 3"
        - "Manual 1"
        - "Manual 2"
        - "Manual 3"
      preset_mode_template: >
        {% if states('sensor.ducobox_status') == "CNT1" %}
          Permanent manual 1
        {% elif states('sensor.ducobox_status') == "CNT2" %}
          Permanent manual 2
        {% elif states('sensor.ducobox_status') == "CNT3" %}
          Permanent manual 3
        {% elif states('sensor.ducobox_status') == "MAN1" %}
          Manual 1
        {% elif states('sensor.ducobox_status') == "MAN2" %}
          Manual 2
        {% elif states('sensor.ducobox_status') == "MAN3" %}
          Manual 3
        {% else %}
          Auto
        {% endif %}
      set_preset_mode:
        - service: rest_command.ducobox_state_change
          data:
            nodeId: "3"
            state: >
              {% if preset_mode == "Permanent manual 1" %}
                CNT1
              {% elif preset_mode == "Permanent manual 2" %}
                CNT2
              {% elif preset_mode == "Permanent manual 3" %}
                CNT3
              {% elif preset_mode == "Manual 1" %}
                MAN1
              {% elif preset_mode == "Manual 2" %}
                MAN2
              {% elif preset_mode == "Manual 3" %}
                MAN3
              {% else %}
                AUTO
              {% endif %}
# copy paste the above block for every node in your system


Hiermee kan ik de WTW box en de twee zones aanpassen in automation via een service_call of in een custom button cart:

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • +1 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
De front end cart met de Hacks: Button Card by @RomRider.
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
type: vertical-stack
cards:
  - type: custom:button-card
    color_type: label-card
    color: rgb(88, 126, 163)
    name: WTW Ducobox
    show_state: true
    styles:
      card:
        - height: 100px
    size: 100%
    icon: mdi:fan
    entity: sensor.ducobox_status
    state:
      - value: EMPT
        color: rgb(247, 15, 15)
        name: WTW staat uit
    tap_action:
      action: call-service
      service: script.ducobox_auto_mode_all
    layout: icon_name
  - type: horizontal-stack
    cards:
      - type: custom:button-card
        entity: sensor.ducobox_status
        tap_action:
          action: call-service
          service: rest_command.ducobox_state_change
          service_data:
            nodeId: '1'
            state: AUTO
        color_type: card
        color: rgb(40, 150, 214)
        icon: mdi:fan-auto
        name: WTW
        layout: icon_name
        styles:
          card:
            - height: 50px
        state:
          - value: AUTO
            color: rgb(225, 317, 55)
      - type: custom:button-card
        entity: sensor.ducobox_status
        tap_action:
          action: call-service
          service: rest_command.ducobox_state_change
          service_data:
            nodeId: '1'
            state: MAN1
        color_type: card
        color: rgb(40, 150, 214)
        icon: mdi:fan-speed-1
        name: ' '
        styles:
          card:
            - height: 50px
        state:
          - value: MAN1
            color: rgb(225, 317, 55)
      - type: custom:button-card
        entity: sensor.ducobox_status
        tap_action:
          action: call-service
          service: rest_command.ducobox_state_change
          service_data:
            nodeId: '1'
            state: MAN2
        color_type: card
        color: rgb(40, 150, 214)
        icon: mdi:fan-speed-2
        name: 900s
        layout: icon_name
        styles:
          card:
            - height: 50px
        state:
          - value: MAN2
            color: rgb(225, 317, 55)
            name: >-
              [[[ return "" +
              states["sensor.ducobox_tijd_status_resterend"].state + "s";]]]
      - type: custom:button-card
        entity: sensor.ducobox_status
        tap_action:
          action: call-service
          service: rest_command.ducobox_state_change
          service_data:
            nodeId: '1'
            state: CNT2
        color_type: card
        color: rgb(40, 150, 214)
        icon: mdi:fan-speed-2
        name: ' '
        styles:
          card:
            - height: 50px
        state:
          - value: CNT2
            color: rgb(225, 317, 55)
      - type: custom:button-card
        entity: sensor.ducobox_status
        tap_action:
          action: call-service
          service: rest_command.ducobox_state_change
          service_data:
            nodeId: '1'
            state: MAN3
        color_type: card
        color: rgb(40, 150, 214)
        icon: mdi:fan-speed-3
        name: ' '
        styles:
          card:
            - height: 50px
        state:
          - value: MAN3
            color: rgb(225, 317, 55)
  - type: horizontal-stack
    cards:
      - type: custom:button-card
        entity: sensor.ducobox_wonen_status
        tap_action:
          action: call-service
          service: rest_command.ducobox_state_change
          service_data:
            nodeId: '2'
            state: AUTO
        color_type: card
        color: rgb(40, 150, 214)
        icon: mdi:fan-auto
        name: Wonen
        styles:
          card:
            - height: 50px
        state:
          - value: AUTO
            color: rgb(225, 317, 55)
        layout: icon_name
      - type: custom:button-card
        entity: sensor.ducobox_wonen_status
        tap_action:
          action: call-service
          service: rest_command.ducobox_state_change
          service_data:
            nodeId: '2'
            state: MAN1
        color_type: card
        color: rgb(40, 150, 214)
        icon: mdi:fan-speed-1
        name: ' '
        styles:
          card:
            - height: 50px
        state:
          - value: MAN1
            color: rgb(225, 317, 55)
      - type: custom:button-card
        entity: sensor.ducobox_wonen_status
        tap_action:
          action: call-service
          service: rest_command.ducobox_state_change
          service_data:
            nodeId: '2'
            state: MAN2
        color_type: card
        color: rgb(40, 150, 214)
        icon: mdi:fan-speed-2
        name: 900s
        layout: icon_name
        styles:
          card:
            - height: 50px
        state:
          - value: MAN2
            color: rgb(225, 317, 55)
            name: >-
              [[[ return "" +
              states["sensor.ducobox_wonen_tijd_status_resterend"].state +
              "s";]]]
      - type: custom:button-card
        entity: sensor.ducobox_wonen_status
        tap_action:
          action: call-service
          service: rest_command.ducobox_state_change
          service_data:
            nodeId: '2'
            state: CNT2
        color_type: card
        color: rgb(40, 150, 214)
        icon: mdi:fan-speed-2
        name: ' '
        styles:
          card:
            - height: 50px
        state:
          - value: CNT2
            color: rgb(225, 317, 55)
      - type: custom:button-card
        entity: sensor.ducobox_wonen_status
        tap_action:
          action: call-service
          service: rest_command.ducobox_state_change
          service_data:
            nodeId: '2'
            state: MAN3
        color_type: card
        color: rgb(40, 150, 214)
        icon: mdi:fan-speed-3
        name: ' '
        styles:
          card:
            - height: 50px
        state:
          - value: MAN3
            color: rgb(225, 317, 55)
  - type: horizontal-stack
    cards:
      - type: custom:button-card
        entity: sensor.ducobox_slapen_status
        tap_action:
          action: call-service
          service: rest_command.ducobox_state_change
          service_data:
            nodeId: '3'
            state: AUTO
        color_type: card
        color: rgb(40, 150, 214)
        icon: mdi:fan-auto
        name: Slapen
        styles:
          card:
            - height: 50px
        state:
          - value: AUTO
            color: rgb(225, 317, 55)
        layout: icon_name
      - type: custom:button-card
        entity: sensor.ducobox_slapen_status
        tap_action:
          action: call-service
          service: rest_command.ducobox_state_change
          service_data:
            nodeId: '3'
            state: MAN1
        color_type: card
        color: rgb(40, 150, 214)
        icon: mdi:fan-speed-1
        name: ' '
        styles:
          card:
            - height: 50px
        state:
          - value: MAN1
            color: rgb(225, 317, 55)
      - type: custom:button-card
        entity: sensor.ducobox_slapen_status
        tap_action:
          action: call-service
          service: rest_command.ducobox_state_change
          service_data:
            nodeId: '3'
            state: MAN2
        color_type: card
        color: rgb(40, 150, 214)
        icon: mdi:fan-speed-2
        name: 900s
        layout: icon_name
        styles:
          card:
            - height: 50px
        state:
          - value: MAN2
            color: rgb(225, 317, 55)
            name: >-
              [[[ return "" +
              states["sensor.ducobox_slapen_tijd_status_resterend"].state +
              "s";]]]
      - type: custom:button-card
        entity: sensor.ducobox_slapen_status
        tap_action:
          action: call-service
          service: rest_command.ducobox_state_change
          service_data:
            nodeId: '3'
            state: CNT2
        color_type: card
        color: rgb(40, 150, 214)
        icon: mdi:fan-speed-2
        name: ' '
        styles:
          card:
            - height: 50px
        state:
          - value: CNT2
            color: rgb(225, 317, 55)
      - type: custom:button-card
        entity: sensor.ducobox_slapen_status
        tap_action:
          action: call-service
          service: rest_command.ducobox_state_change
          service_data:
            nodeId: '3'
            state: MAN3
        color_type: card
        color: rgb(40, 150, 214)
        icon: mdi:fan-speed-3
        name: ' '
        styles:
          card:
            - height: 50px
        state:
          - value: MAN3
            color: rgb(225, 317, 55)
  - type: custom:button-card
    color_type: label-card
    color: rgb(40, 150, 214)
    name: Iedereen afwezig
    show_state: false
    styles:
      card:
        - height: 100px
    size: 100%
    icon: mdi:home-export-outline
    entity: sensor.ducobox_status
    state:
      - value: EMPT
        color: rgb(225, 317, 55)
        name: WTW staat uit
    tap_action:
      action: call-service
      service: rest_command.ducobox_state_change
      data:
        nodeId: '1'
        state: EMPT
    layout: icon_name

Niet alle code is door mijzelf bedacht.
Pas de code aan voor de eigen HA omgeving, oa de ip nummers.

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • +1 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
De button cart, die bovenstaande code genereerd.
Afbeeldingslocatie: https://tweakers.net/i/c9oNKG9_68ueDxObLivZaLZlP88=/800x/filters:strip_exif()/f/image/1wGKSp2mI0Fm7QmeqBxw8RiN.png?f=fotoalbum_large
Dit is nog ruw uitgewerkt, maar werkt.

[ Voor 4% gewijzigd door marnie op 06-08-2024 21:29 ]

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • +1 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
Voorbeeld van een service_call
YAML:
1
2
3
4
service: rest_command.ducobox_state_change
data:
  nodeId: "1"
  state: MAN2

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • +1 Henk 'm!

  • fudgee
  • Registratie: Augustus 2024
  • Laatst online: 01-05 08:45
Wauw bedankt @marnie, dit is goud!

Acties:
  • +6 Henk 'm!

  • fudgee
  • Registratie: Augustus 2024
  • Laatst online: 01-05 08:45
Ik heb de code van @marnie aangepast voor mijn setup. Het grootste verschil met @marnie is dat ik één zone heb ipv twee. Deze aanpassing ging vrij snel totdat ik iets vrij specifieks wilde in de front-end. Ik wilde graag dat de kleur van een button direct oplicht bij het indrukken en de countdown timer meteen gaat lopen. Hier ben ik vervolgens een week mee bezig geweest 8)7 maar het is gelukt 8)

Afbeeldingslocatie: https://tweakers.net/i/1a0Ey6z7C3u-2sLNXVd0fQO2is8=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/N7JHKZmLHOi0i6xQ0jS8BU0f.png?f=user_large

Ik heb een script gemaakt zodat na het aanpassen van de ventilatiestand ook de nieuwe status wordt geupdate. Daarnaast maak ik in het script een countdown timer zodat ik in geval van de stand MAN1/2/3 kan zien hoe lang het duurt voordat die terug naar AUTO gaat. Ik heb eerst heel lang gekloot zonder countdown timer en de data uitgelezen via de entity "ducobox_node1_TimeStateRemain". Deze wordt alleen periodiek geupdate (1x per minuut, zie duco_rest.yaml) en uiteindelijk leek het mij wat overdreven om iedere seconde een API call te doen om deze uit te lezen. Toen heb ik geprobeerd een countdown timer te maken door gebruik te maken van deze data. Dat werkte wel maar na het aanpassen van de ventilatiestand duurt het 10 seconden voordat deze timer gaat lopen. Dus bij deze oplossing zag ik de eerste 10 seconden geen timer lopen. Uiteindelijk gewoon hard opgegeven dat de timer altijd 15 min en 10 seconden loopt.

Het mooi zichtbaar krijgen van een countdown timer in de UI was het volgende drama. Met name doordat ik geen ervaring heb in front-end programmeren, nog nooit javascript had gebruikt. De Button Card by @RomRider is fantastisch maar heeft zoveel mogelijkheden dat het lastig is de juiste te kiezen. Het is uiteindelijk gelukt door een embedded button te maken met de timer.

Op zich ben ik erg tevreden over hoe de Duco API werkt. Toch blijft het erg jammer dat ik veel informatie niet kan uitlezen (co2 ppm, luchtvochtigheid %, temperaturen van inkomende en uitgaande lucht, bypass open of dicht).

Dit is mijn eerste wat grotere projectje in home assistant waar ik mij goed op heb kunnen uitleven. Omdat andermans code mij veel geholpen heeft post ik hieronder ook mijn code, hopelijk heeft iemand er iets aan. Ook als er iemand tips heeft om mijn code te verbeteren zijn deze altijd welkom.

Mijn code bestaat uit de volgende onderdelen:
  • configuration.yaml: enkel verwijzing naar de rest.yaml, rest_command.yaml en het aanmaken van een timer
  • duco_rest.yaml: hier worden de sensoren gemaakt die uitgelezen worden via de duco api
  • rest_command.yaml: hier is de actie gemaakt om de ventilatiestand aan te passen
  • script.yaml: script waarin het aanpassen van de ventilatiestand wordt gekoppeld aan het updaten van de status van de ducobox en een timer wordt gemaakt als de stand op MAN1, MAN2 of MAN3 wordt gezet
  • <front_end>.yaml: hierin zijn de buttons gedefinieerd.
configuration.yaml
code:
1
2
3
4
5
6
rest: !include duco_rest.yaml
rest_command: !include rest_command.yaml

timer:
  duco_rest_man:
    duration: "01:00:00"



duco_rest.yaml
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
- resource: <duco_ip>/info
  scan_interval: 86400 #daily
  verify_ssl: false
  sensor:
    # general box
    - unique_id: ducobox_timefilterremain
      name: Ducobox Filter resttijd
      value_template: "{{ value_json['HeatRecovery']['General']['TimeFilterRemain']['Val'] }}"
      device_class: duration
      unit_of_measurement: "d"
      state_class: measurement

- resource: <duco_ip>/info/nodes
  scan_interval: 60
  verify_ssl: false
  sensor:
    #node 1 the ducobox
    - unique_id: ducobox_node1_state
      name: Ducobox - Status
      value_template: "{{ value_json['Nodes'][0]['Ventilation']['State']['Val'] }}"
    - unique_id: ducobox_node1_mode
      name: Ducobox - Mode
      value_template: "{{ value_json['Nodes'][0]['Ventilation']['Mode']['Val'] }}"
    - unique_id: ducobox_node1_FlowLvlTgt
      name: Ducobox - Flow Level Target
      value_template: "{{ value_json['Nodes'][0]['Ventilation']['FlowLvlTgt']['Val'] }}"
      unit_of_measurement: "%"
      state_class: measurement
    - unique_id: ducobox_node1_TimeStateRemain
      name: Ducobox - tijd status resterend
      value_template: "{{ value_json['Nodes'][0]['Ventilation']['TimeStateRemain']['Val'] }}"
    - unique_id: ducobox_node1_TimeStateEnd
      name: Ducobox - tijd status eind
      value_template: "{{ value_json['Nodes'][0]['Ventilation']['TimeStateEnd']['Val'] }}"

    #node 2 CO2 sensor wonen
    - unique_id: ducobox_node2_iaqCO2
      name: Ducobox wonen Co2 air quality
      value_template: "{{ value_json['Nodes'][1]['Sensor']['IaqCo2']['Val'] }}"
      unit_of_measurement: "%"
      state_class: measurement

    #node 58 HR sensor
    - unique_id: ducobox_node58_iaqRh
      name: Ducobox - RH air quality
      value_template: "{{ value_json['Nodes'][2]['Sensor']['IaqRh']['Val'] }}"
      unit_of_measurement: "%"
      state_class: measurement

#      https://github.com/miezie/ducoboxopenapi-spec/blob/86616b5130ffa469bfa4519c2eafda86f25f9345/Public%20DUCO%20API%202.0%20-%20api-definition.yaml
#      https://gathering.tweakers.net/forum/list_messages/2236296
#      https://community.home-assistant.io/t/anyone-using-duco-ventilation-communication-print-ethernet-module/226528/75?page=3


rest_command.yaml
code:
1
2
3
4
5
6
7
8
ducobox_state_change:
  url: <duco_ip>/action/nodes/1
  method: POST
  headers:
    accept: "application/json"
    content_type: "application/json"
  payload: '{"Action":"SetVentilationState","Val":"{{ state }}"}'
  verify_ssl: false


scripts.yaml
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
duco_state_change:
  alias: duco_state_change
  fields:
    duco_mode:
      description: the mode of the Duco ventilation
      default: AUTO
      example: MAN1
  sequence:
  - action: rest_command.ducobox_state_change
    data:
      state: '{{ duco_mode }}'
  - action: homeassistant.update_entity
    target:
      entity_id:
      - sensor.ducobox_status
    data: {}
  - if:
    - condition: template
      value_template: '{{ ''MAN'' in states(''sensor.ducobox_status'') }}'
    then:
    - action: timer.start
      target:
        entity_id: timer.duco_rest_man
      data:
        duration:
          seconds: 910
    else:
    - action: timer.finish
      target:
        entity_id: timer.duco_rest_man
  description: Change the state of Duco, options are AUTO, MAN1, MAN2, MAN3, CNT1,
    CNT2, CNT3, EMPT


De front end cart met de Hacks: Button Card by @RomRider

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
- type: vertical-stack
        cards:
          - type: custom:button-card
            entity: sensor.ducobox_status
            color_type: card
            color: rgb(40, 150, 214)
            name: >-
              [[[ return "Auto " +
              states["sensor.ducobox_flow_level_target"].state + "%";]]]
            show_icon: false
            styles:
              card:
                - height: 50px
            state:
              - value: AUTO
                color: rgb(225, 317, 55)
            tap_action:
              action: call-service
              service: script.duco_state_change
              service_data:
                duco_mode: AUTO
          - type: horizontal-stack
            cards:
              - type: custom:button-card
                entity: sensor.ducobox_status
                color_type: card
                color: rgb(40, 150, 214)
                name: Manual
                show_icon: false
                styles:
                  card:
                    - height: 50px
                state:
                  - value: MAN1
                    color: rgb(225, 317, 55)
                    styles:
                      grid:
                        - grid-template-areas: '"n n" "timer timer"'
                        - grid-template-columns: 1fr
                        - grid-template-rows: min-content min-content
                      custom-fields:
                        timer:
                          - padding-bottom: 2px
                          - align-self: middle
                          - justify-self: start
                    custom_fields:
                      timer:
                        card:
                          type: custom:button-card
                          styles:
                            card:
                              - box-shadow: none
                              - font-size: 13px
                              - background-color: rgb(225, 317, 55)
                              - border-width: 0px
                          entity: timer.duco_rest_man
                          show_state: true
                          show_name: false
                          show_icon: false
                  - value: MAN2
                    color: rgb(225, 317, 55)
                    styles:
                      grid:
                        - grid-template-areas: '"n n" "timer timer"'
                        - grid-template-columns: 1fr
                        - grid-template-rows: min-content min-content
                      custom-fields:
                        timer:
                          - padding-bottom: 2px
                          - align-self: middle
                          - justify-self: start
                    custom_fields:
                      timer:
                        card:
                          type: custom:button-card
                          styles:
                            card:
                              - box-shadow: none
                              - font-size: 13px
                              - background-color: rgb(225, 317, 55)
                              - border-width: 0px
                          entity: timer.duco_rest_man
                          show_state: true
                          show_name: false
                          show_icon: false
                  - value: MAN3
                    color: rgb(225, 317, 55)
                    styles:
                      grid:
                        - grid-template-areas: '"n n" "timer timer"'
                        - grid-template-columns: 1fr
                        - grid-template-rows: min-content min-content
                      custom-fields:
                        timer:
                          - padding-bottom: 2px
                          - align-self: middle
                          - justify-self: start
                    custom_fields:
                      timer:
                        card:
                          type: custom:button-card
                          styles:
                            card:
                              - box-shadow: none
                              - font-size: 13px
                              - background-color: rgb(225, 317, 55)
                              - border-width: 0px
                          entity: timer.duco_rest_man
                          show_state: true
                          show_name: false
                          show_icon: false
              - type: custom:button-card
                entity: sensor.ducobox_status
                tap_action:
                  action: call-service
                  service: script.duco_state_change
                  service_data:
                    duco_mode: MAN1
                color_type: card
                color: rgb(40, 150, 214)
                icon: mdi:fan-speed-1
                name: ' '
                styles:
                  card:
                    - height: 50px
                state:
                  - value: MAN1
                    color: rgb(225, 317, 55)
              - type: custom:button-card
                entity: sensor.ducobox_status
                tap_action:
                  action: call-service
                  service: script.duco_state_change
                  service_data:
                    duco_mode: MAN2
                color_type: card
                color: rgb(40, 150, 214)
                icon: mdi:fan-speed-2
                name: ' '
                styles:
                  card:
                    - height: 50px
                state:
                  - value: MAN2
                    color: rgb(225, 317, 55)
              - type: custom:button-card
                entity: sensor.ducobox_status
                tap_action:
                  action: call-service
                  service: script.duco_state_change
                  service_data:
                    duco_mode: MAN3
                color_type: card
                color: rgb(40, 150, 214)
                icon: mdi:fan-speed-3
                name: ' '
                styles:
                  card:
                    - height: 50px
                state:
                  - value: MAN3
                    color: rgb(225, 317, 55)
          - type: horizontal-stack
            cards:
              - type: custom:button-card
                entity: sensor.ducobox_status
                color_type: card
                color: rgb(40, 150, 214)
                name: Continu
                show_icon: false
                styles:
                  card:
                    - height: 50px
                state:
                  - value: CNT1
                    color: rgb(225, 317, 55)
                  - value: CNT2
                    color: rgb(225, 317, 55)
                  - value: CNT3
                    color: rgb(225, 317, 55)
              - type: custom:button-card
                entity: sensor.ducobox_status
                tap_action:
                  action: call-service
                  service: script.duco_state_change
                  service_data:
                    duco_mode: CNT1
                color_type: card
                color: rgb(40, 150, 214)
                icon: mdi:fan-speed-1
                name: ' '
                styles:
                  card:
                    - height: 50px
                state:
                  - value: CNT1
                    color: rgb(225, 317, 55)
              - type: custom:button-card
                entity: sensor.ducobox_status
                tap_action:
                  action: call-service
                  service: script.duco_state_change
                  service_data:
                    duco_mode: CNT2
                color_type: card
                color: rgb(40, 150, 214)
                icon: mdi:fan-speed-2
                name: ' '
                styles:
                  card:
                    - height: 50px
                state:
                  - value: CNT2
                    color: rgb(225, 317, 55)
              - type: custom:button-card
                entity: sensor.ducobox_status
                tap_action:
                  action: call-service
                  service: script.duco_state_change
                  service_data:
                    duco_mode: CNT3
                color_type: card
                color: rgb(40, 150, 214)
                icon: mdi:fan-speed-3
                name: ' '
                styles:
                  card:
                    - height: 50px
                state:
                  - value: CNT3
                    color: rgb(225, 317, 55)

Acties:
  • 0 Henk 'm!

  • Daan1990
  • Registratie: Oktober 2024
  • Laatst online: 13-12-2024
Hi all, even mijn eerste post op Tweakers als niet-coder. Ik wil graag meer controle over mijn Duco ventilatie systeem en zou het graag beter zichtbaar hebben in Home Assistant. Omdat ik zelf geen coder ben, kijk ik met veel interesse naar jullie uitwerkingen hier. Naast de displays die al zijn gemaakt, zou het mij erg handig lijken om ook de Co2% / RH% te zien en dan indealiter zelfs met een kleur die aangeeft of het goed (groen), medium (oranje) of slecht (rood) is - dat maakt het wat intuitiever. Daarnaast dan de ventilatie capaciteit in % op geheel / zone en daarnaast de mogelijkheid om het aan te passen: Auto stand, Manueel met timer of Manueel permanent. Heeft iemand zin om hiermee aan de slag te gaan? Het gaat mijn pet wat te boven.

Ik zou vervolgens ook graag meer automatiseren om mijn systeem iets rustiger te krijgen, bijvoorbeeld, bij waardes > 60% dan mag de box nooit meer dan 50% ventilatiecapaciteit leveren. Op dit moment word ik nog wel eens weggeblazen als de Iaq percentages eigenlijk prima zijn, bijvoorbeeld >80%.Afbeeldingslocatie: https://tweakers.net/i/-W3k5PXXGvihYNKAAsXok-Vq3CA=/800x/filters:strip_exif()/f/image/R6UBiZrqrmsltaK8kODxfsnr.png?f=fotoalbum_large

Acties:
  • 0 Henk 'm!

  • Gizz
  • Registratie: Maart 2001
  • Laatst online: 21:55

Gizz

Dunder-Mifflin, Inc.

@Daan1990 je vraag past waarschijnlijk beter hier: Optimale vraaggestuurde mechanische ventilatie

Of als het duidelijke HA-vragen zijn natuurlijk meteen in dat topic Home Assistant: Open source Python3 home automation - deel 5

Canon EOS 5Dm3 + 5D + 7D + 300D + 1000FN + EF 17-40 4L + EF 35 1.4L + EF 50 1.8 + EF 80-200 2.8L + 550EX


Acties:
  • 0 Henk 'm!

  • Daan1990
  • Registratie: Oktober 2024
  • Laatst online: 13-12-2024
Dank @Gizz voor je suggestie. Maar mijn vraag ligt toch het meest in het verlengde van hetgeen @marnie en @fudgee hier eerder hebben gedeeld. Daarom dacht ik in dit onderwerp de meeste kans te hebben om iemand zo gek te krijgen te helpen met een aangepaste versie, naar het voorbeeld van mijn schets.

Acties:
  • 0 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
@Daan1990
De Duco 325 via HA aansturen met de connectivity board is heel beperkt mogelijk. In dit forum en op de HA site staan hierover meerdere berichten.
Ik heb zelf een communication print op de kop getikt (2e hands), met deze print zijn de echte sensoren uitleesbaar en de settings ook te beïnvloeden. Ik wijzig bv het RH setpoint met HA afhankelijk van de vochtigheid buiten. Duco adviseert en verkoopt deze print niet meer.
Alternatief is mogelijk de ventilation gateway https://ventilationgateway.com/winkel/ maar even nog niet leverbaar.

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • 0 Henk 'm!

  • Daan1990
  • Registratie: Oktober 2024
  • Laatst online: 13-12-2024
Thanks @marnie, ik heb inderdaad gelezen over het verschil connectivity board en communication print. Inderdaad jammer om niet de echte Co2 in ppm en RH % te kunnen uitlezen. Echter het lezen van Duco's IaQ percentages vind ik niet persee storend. Het liefst zou ik de automatiseringsregels van de Duco box zelf begrijpen en daarop kunnen sturen. Zoals ik nu opmerk gaat de Duxobox bij IaqCo2 percentages van boven de 90% op 100% ventilatie volume draaien. Dat vind ik erg overdreven / onrustig en storend. Het liefst zou ik dus die maximale ventilatie volumes stapsgewijs instellen. Bijvoorbeeld:
- wanneer IaQ% > 90%, dan ventilatie volume maximaal 50%
- wanneer IaQ% <90% en > 80%, dan ventilatie volume maximaal 60%
- wanneer IaQ% <80% en > 70%, dan ventilatie volume maximaal 70%
- etc.

In normaal gebruik komen de IaQ percentages niet onder de 80% en heb ik zelfs met 50% ventilatie capaciteit voldoende om mijn lucht onder controle te houden.

Ik heb bovenstaande geprobeerd te benaderen door op de Energy Premium box zelf wat instellingen te wijzigen:
- Setpoint Co2 per zone heb ik op 1000ppm gezet
- Maximale Auto capaciteit heb ik teruggeschroefd tot 70%, dat is bij mij de grens om het systeem te horen.

Als ik met meer mensen in huis ben moet ik er nu zelf aan denken om de capaciteit omhoog te zetten naar 100%. Maar dan heb ik het grootste deel van de tijd (zonder bezoek) tenminste geen last van een onrustig op/af toerend systeem.

met mijn ontwerp dashboard hierboven hoop ik op een simpel overzicht om snel in HA op te kunnen sturen.

Nog meer mensen met deze uitdaging / wens?

Acties:
  • 0 Henk 'm!

  • Batilan
  • Registratie: December 2009
  • Laatst online: 23:12
Daan1990 schreef op woensdag 23 oktober 2024 @ 13:21:

Nog meer mensen met deze uitdaging / wens?
Lijkt me handig inderdaad, hoewel ik mezelf nog voorgenomen heb om zelf zo'n ventilation gateway op basis van een ESP en een passend kabeltje in elkaar te sleutelen, om zo toch direct bij de gegevens te komen, en nog gerichter te kunnen sturen. Ik heb ook nog geen luchtvochtigheids sensor in mijn Ducobox Energy, kan ik dan wellicht ook met eigen sensoren gaan sturen.

Erg vervelend dat Duco dit zo dicht heeft getimmerd, zo krijg je inderdaad gebruikers die zich afvragen waarom in hemelsnaam het ding zo gaat optoeren. We hebben er gelukkig maar af en toe last van. Enige moment dat ie naar 100% gaat is als we standje 3 in de badkamer kiezen (de installateur heeft het zo ingeregeld dat dan direct de 2 zones (begane grond en verdieping waar de badkamer is) naar 100% gaan :/

Acties:
  • 0 Henk 'm!

  • Daan1990
  • Registratie: Oktober 2024
  • Laatst online: 13-12-2024
Hi @Batilan Als je die 100% wil verlagen kan je dat zelf ook 'eenvoudig' doen in installatie menu op je DucoBox zelf. Zie pagina 10 van dit document met instructies: https://www.duco.eu/Wes/C...l)_638627050459252512.pdf

Je kan dan de 'manual' % van die specifieke RH schakelaar aanpassen van bijvoorbeeld 100% naar 80%. Dus als je dan standje 3 kiest gaat het systeem naar 80% en niet 100%. Let op dat elke schakelaar die is aangesloten op een zone, ook de ventilatie op die zone regelt. Dus een badkamer is aangemeld op algemene systeem en zal dus het hele systeem (beide zones) naar dat percentage optoeren. Dit is ook logisch, want afzuigkanalen zijn niet gesplitst in zones.

Acties:
  • 0 Henk 'm!

  • Batilan
  • Registratie: December 2009
  • Laatst online: 23:12
Daan1990 schreef op woensdag 23 oktober 2024 @ 14:58:
Hi @Batilan Als je die 100% wil verlagen kan je dat zelf ook 'eenvoudig' doen in installatie menu op je DucoBox zelf. Zie pagina 10 van dit document met instructies: https://www.duco.eu/Wes/C...l)_638627050459252512.pdf

Je kan dan de 'manual' % van die specifieke RH schakelaar aanpassen van bijvoorbeeld 100% naar 80%. Dus als je dan standje 3 kiest gaat het systeem naar 80% en niet 100%. Let op dat elke schakelaar die is aangesloten op een zone, ook de ventilatie op die zone regelt. Dus een badkamer is aangemeld op algemene systeem en zal dus het hele systeem (beide zones) naar dat percentage optoeren. Dit is ook logisch, want afzuigkanalen zijn niet gesplitst in zones.
OK, Thx. Op zich heb ik niet zoveel problemen met die 100%, ik dacht dat de sensor alleen op de betreffende zone actief zou zijn, maar is eigenlijk wel logisch aangezien afzuiging niet gesplitst is. Het is meer dat ik nog twijfel of de afstandsbediening van de begane grond niet omgewisseld is qua zone (eerder waren de AB's verdeeld over de zones en had ik het idee dat als ik de AB van de badkamer boven op 3 zette, dat beneden meer geluid gaf en omgekeerd. Wellicht even een sigaret bij de uitlaten houden om te bezien hoe de flow varieert :)

Acties:
  • 0 Henk 'm!

  • Sunz
  • Registratie: Februari 2012
  • Laatst online: 04-05 20:47
Hoi,

Heb sinds gisteren een 2dehands communication print op de kop getikt die ik nu aan HA wil toevoegen.
Beschik over een Duco Silent Connect met maar (voorlopig) twee afzuigkanalen.
Een op zolder en één in de badkamer waarop een vochtsensor staat geschakeld in de ducobox.

Sinds gisteren gestart met HA dus nog complete noob maar toch al veel opzoekwerk gedaan en kwam uit in de richting van deze pagina https://www.linkedin.com/...homeassistant-albert-smit

Echter de code waar hij naar linkt is niet meer beschikbaar :(

https://www.novaventum.nl...ration-yaml-homeassistant

Op andere forums moet je echt al goed uitkijken voor waar de code bestemd voor is want "communicatieprint" en "connectivity board" niet hetzelfde zijn.

Iemand die hiervoor over de code beschikt?

Zou graag de optie toevoegen voor een continu manuele stand bijv. (hoge luchtvochtigheid zomer, kinderen die badkamer niet sluiten, ...)

[ Voor 7% gewijzigd door Sunz op 25-10-2024 11:39 ]


Acties:
  • +1 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
Sunz schreef op vrijdag 25 oktober 2024 @ 11:37:
Hoi,

Heb sinds gisteren een 2dehands communication print op de kop getikt die ik nu aan HA wil toevoegen.
Beschik over een Duco Silent Connect met maar (voorlopig) twee afzuigkanalen.
Een op zolder en één in de badkamer waarop een vochtsensor staat geschakeld in de ducobox.

Sinds gisteren gestart met HA dus nog complete noob maar toch al veel opzoekwerk gedaan en kwam uit in de richting van deze pagina https://www.linkedin.com/...homeassistant-albert-smit

Echter de code waar hij naar linkt is niet meer beschikbaar :(

https://www.novaventum.nl...ration-yaml-homeassistant

Op andere forums moet je echt al goed uitkijken voor waar de code bestemd voor is want "communicatieprint" en "connectivity board" niet hetzelfde zijn.

Iemand die hiervoor over de code beschikt?

Zou graag de optie toevoegen voor een continu manuele stand bijv. (hoge luchtvochtigheid zomer, kinderen die badkamer niet sluiten, ...)
toon volledige bericht
Om je op weg te helpen, mijn ducobox communication print rest en rest_command codes.
Ik heb een twee zone systeem met kleppen en per zone een CO2 bedieningsensor. De RH meting zit in de ducobox.

Vergeet niet in configuration.yal toe te voegen:
YAML:
1
2
rest: !include rest.yaml
rest_command: !include rest_command.yaml



rest_command.yaml
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
duco_box_mode_auto:
  url: "http://192.168.1.73/nodesetoperstate?node=1&value=AUTO"
duco_box_mode_cnt1:
  url: "http://192.168.1.73/nodesetoperstate?node=1&value=CNT1"
duco_box_mode_cnt2:
  url: "http://192.168.1.73/nodesetoperstate?node=1&value=CNT2"
duco_box_mode_cnt3:
  url: "http://192.168.1.73/nodesetoperstate?node=1&value=CNT3"
duco_box_mode_man1:
  url: "http://192.168.1.73/nodesetoperstate?node=1&value=MAN1"
duco_box_mode_man2:
  url: "http://192.168.1.73/nodesetoperstate?node=1&value=MAN2"
duco_box_mode_man3:
  url: "http://192.168.1.73/nodesetoperstate?node=1&value=MAN3"

duco_wonen_mode_auto:
  url: "http://192.168.1.73/nodesetoperstate?node=2&value=AUTO"
duco_wonen_mode_cnt1:
  url: "http://192.168.1.73/nodesetoperstate?node=2&value=CNT1"
duco_wonen_mode_cnt2:
  url: "http://192.168.1.73/nodesetoperstate?node=2&value=CNT2"
duco_wonen_mode_cnt3:
  url: "http://192.168.1.73/nodesetoperstate?node=2&value=CNT3"
duco_wonen_mode_man1:
  url: "http://192.168.1.73/nodesetoperstate?node=2&value=MAN1"
duco_wonen_mode_man2:
  url: "http://192.168.1.73/nodesetoperstate?node=2&value=MAN2"
duco_wonen_mode_man3:
  url: "http://192.168.1.73/nodesetoperstate?node=2&value=MAN3"

duco_slapen_mode_auto:
  url: "http://192.168.1.73/nodesetoperstate?node=3&value=AUTO"
duco_slapen_mode_cnt1:
  url: "http://192.168.1.73/nodesetoperstate?node=3&value=CNT1"
duco_slapen_mode_cnt2:
  url: "http://192.168.1.73/nodesetoperstate?node=3&value=CNT2"
duco_slapen_mode_cnt3:
  url: "http://192.168.1.73/nodesetoperstate?node=3&value=CNT3"
duco_slapen_mode_man1:
  url: "http://192.168.1.73/nodesetoperstate?node=3&value=MAN1"
duco_slapen_mode_man2:
  url: "http://192.168.1.73/nodesetoperstate?node=3&value=MAN2"
duco_slapen_mode_man3:
  url: "http://192.168.1.73/nodesetoperstate?node=3&value=MAN3"



duco_box_rhsetpoint_60:
  url: "http://192.168.1.73/nodeconfigset?node=58&para=RHSetpoint&value=60"
duco_box_rhsetpoint_65:
  url: "http://192.168.1.73/nodeconfigset?node=58&para=RHSetpoint&value=65"
duco_box_rhsetpoint_70:
  url: "http://192.168.1.73/nodeconfigset?node=58&para=RHSetpoint&value=70"
duco_box_rhsetpoint_80:
  url: "http://192.168.1.73/nodeconfigset?node=58&para=RHSetpoint&value=80"
duco_box_rhsetpoint_90:
  url: "http://192.168.1.73/nodeconfigset?node=58&para=RHSetpoint&value=90"

  

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • 0 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
rest.yaml
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#
# Duco WTW scan per uur
#
- resource: http://192.168.1.73/boxinfoget
  scan_interval: 3600
  verify_ssl: false
  sensor:
  - name: "Ducobox Filter resttijd"
    unique_id: ducobox_filter_resttijd
    unit_of_measurement: "d"
    value_template: >
      {{ value_json['EnergyInfo']['FilterRemainingTime'] }}

#
# Duco WTW scan per 10 seconden
#
- resource: http://192.168.1.73/boxinfoget
  scan_interval: 10
  verify_ssl: false
  sensor:
  - name: "Ducobox temperatuur, toevoer van buiten"
    unique_id: ducobox_tempoda  
    unit_of_measurement: "°C"
    value_template: >
      {{ value_json['EnergyInfo']['TempODA'] / 10 }}

  - name: "Ducobox temperatuur, toevoer naar woning"
    unique_id: ducobox_tempsup
    unit_of_measurement: "°C"
    value_template: >
      {{ value_json['EnergyInfo']['TempSUP'] / 10 }}

  - name: "Ducobox temperatuur, afvoer van woning"
    unique_id: ducobox_tempeta
    unit_of_measurement: "°C"
    value_template: >
      {{ value_json['EnergyInfo']['TempETA'] / 10 }}

  - name: "Ducobox temperatuur, afvoer naar buiten"
    unique_id: ducobox_tempeha
    unit_of_measurement: "°C"
    value_template: >
      {{ value_json['EnergyInfo']['TempEHA'] / 10 }}

  - name: "Ducobox SupplyFanSpeed"
    unique_id: ducobox_supplyfanspeed
    unit_of_measurement: "rpm"
    value_template: >
      {{ value_json['EnergyFan']['SupplyFanSpeed'] }}

  - name: "Ducobox ExhaustFanSpeed"
    unique_id: ducobox_exhaustfanspeed
    unit_of_measurement: "rpm"
    value_template: >
      {{ value_json['EnergyFan']['ExhaustFanSpeed'] }}

  - name: "Ducobox SupplyFanPwmPercentage"
    unique_id: ducobox_supplyfanpwmpercentage
    unit_of_measurement: "%"
    value_template: >
      {{ value_json['EnergyFan']['SupplyFanPwmPercentage'] }}

  - name: "Ducobox ExhaustFanPwmPercentage"
    unique_id: ducobox_exhaustfanpwmpercentage
    unit_of_measurement: "%"
    value_template: >
      {{ value_json['EnergyFan']['ExhaustFanPwmPercentage'] }}

# Ducobox
- resource: http://192.168.1.73/nodeinfoget?node=1
  scan_interval: 10
  verify_ssl: false
  sensor:
  - name: "DucoBox"
    unique_id: ducobox
    value_template: "{{ value_json.state }}"
    icon: mdi:fan
    json_attributes:
      - node
      - devtype
      - subtype
      - netw
      - addr
      - sub
      - prnt
      - asso
      - location
      - state
      - cntdwn
      - endtime
      - mode
      - trgt
      - actl
      - ovrl
      - snsr
      - cerr
      - swversion
      - serialnb
      - temp
      - co2
      - rh
      - error
      - show
      - link

  - name: "Ducobox relatieve vochtigheid"
    unique_id: ducobox_rh
    unit_of_measurement: "%"
    value_template: >
      {{ value_json['rh'] }}

  - name: "Ducobox temperatuur"
    unique_id: ducobox_temp
    unit_of_measurement: "°C"
    value_template: >
      {{ value_json['temp'] }}

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • 0 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
rest.yaml
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
# Kleppen wonen
- resource: http://192.168.1.73/nodeinfoget?node=2
  scan_interval: 10
  verify_ssl: false
  sensor:
  - name: "Duco zoneklep wonen"
    unique_id: valve_zone_1
    value_template: "{{ value_json.state }}"
    icon: mdi:fan
    json_attributes:
      - node
      - devtype
      - subtype
      - netw
      - addr
      - sub
      - prnt
      - asso
      - location
      - state
      - cntdwn
      - endtime
      - mode
      - ovrl
      - snsr
      - cerr
      - swversion
      - serialnb
      - error
      - show
      - link

  - name: "Ducobox zoneklep woonkamer state"
    unique_id: ducobox_zoneklep_woonkamer_state
    value_template: >
      {{ value_json['state'] }}

  - name: "Ducobox zoneklep woonkamer mode"
    unique_id: ducobox_zoneklep_woonkamer_mode
    value_template: >
      {{ value_json['mode'] }}

  - name: "Ducobox zoneklep woonkamer ovrl"
    unique_id: ducobox_zoneklep_woonkamer_ovrl
    unit_of_measurement: ""
    value_template: >
      {{ value_json['ovrl'] }}

# Kleppen slapen
- resource: http://192.168.1.73/nodeinfoget?node=3
  scan_interval: 10
  verify_ssl: false
  sensor:
  - name: "Duco zoneklep slapen"
    unique_id: valve_zone_2
    value_template: "{{ value_json.state }}"
    icon: mdi:fan
    json_attributes:
      - node
      - devtype
      - subtype
      - netw
      - addr
      - sub
      - prnt
      - asso
      - location
      - state
      - cntdwn
      - endtime
      - mode
      - ovrl
      - snsr
      - cerr
      - swversion
      - serialnb
      - error
      - show
      - link

  - name: "Ducobox zoneklep slaapkamer state"
    unique_id: ducobox_zoneklep_slaapkamer_state
    value_template: >
      {{ value_json['state'] }}

  - name: "Ducobox zoneklep slaapkamer mode"
    unique_id: ducobox_zoneklep_slaapkamer_mode
    value_template: >
      {{ value_json['mode'] }}

  - name: "Ducobox zoneklep slaapkamer ovrl"
    unique_id: ducobox_zoneklep_slaapkamer_ovrl
    unit_of_measurement: ""
    value_template: >
      {{ value_json['ovrl'] }}

# Bedieningssensor woonkamer
- resource: http://192.168.1.73/nodeinfoget?node=4
  scan_interval: 10
  verify_ssl: false
  sensor:
  - name: "Duco bedieningssensor wooonkamer"
    unique_id: duco_bedieningssensor_woonkamer
    value_template: "{{ value_json.state }}"
    icon: mdi:fan
    json_attributes:
      - node
      - devtype
      - subtype
      - netw
      - addr
      - sub
      - prnt
      - asso
      - location
      - state
      - cntdwn
      - endtime
      - mode
      - ovrl
      - snsr
      - cerr
      - swversion
      - serialnb
      - temp
      - co2
      - rh
      - rssi_n2m
      - hop_via
      - rssi_n2h
      - error
      - show
      - link
  - name: "Ducobox temperatuur woonkamer"
    unique_id: ducobox_temp_woonkamer
    device_class: temperature
#    state_class: measurement
    unit_of_measurement: "°C"
    value_template: >
      {{ value_json['temp'] }}

  - name: "Ducobox CO2 woonkamer"
    unique_id: ducobox_co2_woonkamer
    unit_of_measurement: "ppm"
    value_template: >
      {{ value_json['co2'] }}


# Sensor slaapkamer
- resource: http://192.168.1.73/nodeinfoget?node=5
  scan_interval: 10
  verify_ssl: false
  sensor:
  - name: "Duco bedieningssensor slaapkamer"
    unique_id: duco_bedieningssensor_slaapkamer
    value_template: "{{ value_json.state }}"
    icon: mdi:fan
    json_attributes:
      - node
      - devtype
      - subtype
      - netw
      - addr
      - sub
      - prnt
      - asso
      - location
      - state
      - cntdwn
      - endtime
      - mode
      - ovrl
      - snsr
      - cerr
      - swversion
      - serialnb
      - temp
      - co2
      - rh
      - rssi_n2m
      - hop_via
      - rssi_n2h
      - error
      - show
      - link
  - name: "Ducobox temperatuur slaapkamer"
    unique_id: ducobox_temp_slaapkamer
    device_class: temperature
    unit_of_measurement: "°C"
    value_template: >
      {{ value_json['temp'] }}

  - name: "Ducobox CO2 slaapkamer"
    unique_id: ducobox_co2_slaapkamer
    unit_of_measurement: "ppm"
    value_template: >
      {{ value_json['co2'] }}

# Ducobox bediening op de box
- resource: http://192.168.1.73/nodeinfoget?node=52
  scan_interval: 10
  verify_ssl: false
  sensor:
  - name: "Duco box bediening"
    unique_id: duco_box_bediening
    value_template: "{{ value_json.state }}"
    icon: mdi:fan
    json_attributes:
      - node
      - devtype
      - subtype
      - netw
      - addr
      - sub
      - prnt
      - asso
      - location
      - state
      - cntdwn
      - endtime
      - mode
      - ovrl
      - snsr
      - cerr
      - swversion
      - serialnb
      - error
      - show
      - link

# Ducobox rh meter voor de box
- resource: http://192.168.1.73/nodeinfoget?node=58
  scan_interval: 10
  verify_ssl: false
  sensor:
  - name: "Duco box rh"
    unique_id: duco_box_rh
    value_template: "{{ value_json.state }}"
    icon: mdi:fan
    json_attributes:
      - node
      - devtype
      - subtype
      - netw
      - addr
      - sub
      - prnt
      - asso
      - location
      - state
      - cntdwn
      - endtime
      - mode
      - ovrl
      - snsr
      - cerr
      - swversion
      - serialnb
      - temp
      - co2
      - rh
      - error
      - show
      - link

  - name: "Duco RH sensor vochtigheid"
    unique_id: duco_rh_sensor_vochtigheid
    unit_of_measurement: "%"
    value_template: >
      {{ value_json['rh'] }}

  - name: "Duco RH sensor temperatuur"
    unique_id: duco_rh_sensor_temperatuur
    unit_of_measurement: "°C"
    value_template: >
      {{ value_json['temp'] }}

# Ducobox rhsetpoint meter
- resource: http://192.168.1.73/nodeconfigget?node=58
  scan_interval: 10
  verify_ssl: false
  sensor:
  - name: "Duco RHSetpoint"
    unique_id: duco_rhsetpoint
    unit_of_measurement: "%"
    value_template: >
      {{ value_json['RHSetpoint']['Val'] }}

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • 0 Henk 'm!

  • Sunz
  • Registratie: Februari 2012
  • Laatst online: 04-05 20:47
marnie schreef op vrijdag 25 oktober 2024 @ 16:07:
[...]

Om je op weg te helpen, mijn ducobox communication print rest en rest_command codes.
Ik heb een twee zone systeem met kleppen en per zone een CO2 bedieningsensor. De RH meting zit in de ducobox.

Vergeet niet in configuration.yal toe te voegen:
YAML:
1
2
rest: !include rest.yaml
rest_command: !include rest_command.yaml



rest_command.yaml
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
duco_box_mode_auto:
  url: "http://192.168.1.73/nodesetoperstate?node=1&value=AUTO"
duco_box_mode_cnt1:
  url: "http://192.168.1.73/nodesetoperstate?node=1&value=CNT1"
duco_box_mode_cnt2:
  url: "http://192.168.1.73/nodesetoperstate?node=1&value=CNT2"
duco_box_mode_cnt3:
  url: "http://192.168.1.73/nodesetoperstate?node=1&value=CNT3"
duco_box_mode_man1:
  url: "http://192.168.1.73/nodesetoperstate?node=1&value=MAN1"
duco_box_mode_man2:
  url: "http://192.168.1.73/nodesetoperstate?node=1&value=MAN2"
duco_box_mode_man3:
  url: "http://192.168.1.73/nodesetoperstate?node=1&value=MAN3"

duco_wonen_mode_auto:
  url: "http://192.168.1.73/nodesetoperstate?node=2&value=AUTO"
duco_wonen_mode_cnt1:
  url: "http://192.168.1.73/nodesetoperstate?node=2&value=CNT1"
duco_wonen_mode_cnt2:
  url: "http://192.168.1.73/nodesetoperstate?node=2&value=CNT2"
duco_wonen_mode_cnt3:
  url: "http://192.168.1.73/nodesetoperstate?node=2&value=CNT3"
duco_wonen_mode_man1:
  url: "http://192.168.1.73/nodesetoperstate?node=2&value=MAN1"
duco_wonen_mode_man2:
  url: "http://192.168.1.73/nodesetoperstate?node=2&value=MAN2"
duco_wonen_mode_man3:
  url: "http://192.168.1.73/nodesetoperstate?node=2&value=MAN3"

duco_slapen_mode_auto:
  url: "http://192.168.1.73/nodesetoperstate?node=3&value=AUTO"
duco_slapen_mode_cnt1:
  url: "http://192.168.1.73/nodesetoperstate?node=3&value=CNT1"
duco_slapen_mode_cnt2:
  url: "http://192.168.1.73/nodesetoperstate?node=3&value=CNT2"
duco_slapen_mode_cnt3:
  url: "http://192.168.1.73/nodesetoperstate?node=3&value=CNT3"
duco_slapen_mode_man1:
  url: "http://192.168.1.73/nodesetoperstate?node=3&value=MAN1"
duco_slapen_mode_man2:
  url: "http://192.168.1.73/nodesetoperstate?node=3&value=MAN2"
duco_slapen_mode_man3:
  url: "http://192.168.1.73/nodesetoperstate?node=3&value=MAN3"



duco_box_rhsetpoint_60:
  url: "http://192.168.1.73/nodeconfigset?node=58&para=RHSetpoint&value=60"
duco_box_rhsetpoint_65:
  url: "http://192.168.1.73/nodeconfigset?node=58&para=RHSetpoint&value=65"
duco_box_rhsetpoint_70:
  url: "http://192.168.1.73/nodeconfigset?node=58&para=RHSetpoint&value=70"
duco_box_rhsetpoint_80:
  url: "http://192.168.1.73/nodeconfigset?node=58&para=RHSetpoint&value=80"
duco_box_rhsetpoint_90:
  url: "http://192.168.1.73/nodeconfigset?node=58&para=RHSetpoint&value=90"

  
toon volledige bericht
Bedankt! Binnekort ff wat dingetjes eruit pikken voor mijn setup :)
Momenteel enkel afzuiging van zolder en badkamer met maar 1 RH sensor in de box :D
Complete noob inzake HA maar zal wel lukken zeker :D
Zonet ff de Duco app geinstalleerd..wat voor troep is dat

Acties:
  • +1 Henk 'm!

  • fudgee
  • Registratie: Augustus 2024
  • Laatst online: 01-05 08:45
Ik zag toevallig gister deze github voorbij komen: https://github.com/Sikerdebaard/ducopy, het lijkt erop alsof iemand erachter is hoe je met de connectivity board alle gegevens uitleest. Ik heb het zelf nog niet geprobeerd maar het ziet er veelbelovend uit.

Acties:
  • +3 Henk 'm!

  • Sikerdebaard
  • Registratie: Juli 2008
  • Laatst online: 14:54
fudgee schreef op zondag 3 november 2024 @ 22:19:
Ik zag toevallig gister deze github voorbij komen: https://github.com/Sikerdebaard/ducopy, het lijkt erop alsof iemand erachter is hoe je met de connectivity board alle gegevens uitleest. Ik heb het zelf nog niet geprobeerd maar het ziet er veelbelovend uit.
Ik heb deze library gemaakt. :)

Hier is een preview van een HACS integratie voor Home Assistant: https://github.com/Sikerdebaard/hacs-ducobox-connector

Let op! Dit is een preview en op dit moment read-only. Daarnaast is de plug-in voornamelijk gemaakt voor de Ducobox Energy Comfort 325 dus het kan zijn dat je ineens wat niet-bestaande sensors in je home assistant krijgt. Die worden er nog niet uit gefilterd.

Installeren gaat via de gebruikelijke HACS manier:
Ga in Home Assistant naar **HACS** via het zijmenu.
Klik op **Integraties**.
Klik rechtsboven op het menu (de drie puntjes) en kies **Custom repositories**.
Vul het volgende URL in bij **Repository URL**:

code:
1
https://github.com/Sikerdebaard/hacs-ducobox-connector


Selecteer **Integration** als categorie.
Klik op **Toevoegen**.
Installeer de integratie

- Zoek in de HACS **Integraties**-pagina naar "Ducobox Connector".
- Klik op de gevonden integratie en druk op **Installeren**.
- Wacht totdat de installatie voltooid is.
Herstart Home Assistant

- Na installatie moet je Home Assistant herstarten om de nieuwe integratie te activeren.
- Ga naar **Instellingen > Systeem > Herstarten**, en voer de herstart uit.
Automatische detectie van de Ducobox

Na het herstarten zal Home Assistant automatisch de Ducobox detecteren via mDNS/zeroconf.
Nieuwe functionaliteit en bugs worden toegevoegd wanneer ik tijd heb. Garantie tot aan de deur etc. etc.

Acties:
  • 0 Henk 'm!

  • Sunz
  • Registratie: Februari 2012
  • Laatst online: 04-05 20:47
Sikerdebaard schreef op zaterdag 16 november 2024 @ 11:02:
[...]


Ik heb deze library gemaakt. :)

Hier is een preview van een HACS integratie voor Home Assistant: https://github.com/Sikerdebaard/hacs-ducobox-connector

Let op! Dit is een preview en op dit moment read-only. Daarnaast is de plug-in voornamelijk gemaakt voor de Ducobox Energy Comfort 325 dus het kan zijn dat je ineens wat niet-bestaande sensors in je home assistant krijgt. Die worden er nog niet uit gefilterd.

Installeren gaat via de gebruikelijke HACS manier:


[...]


[...]


[...]


[...]


Nieuwe functionaliteit en bugs worden toegevoegd wanneer ik tijd heb. Garantie tot aan de deur etc. etc.
toon volledige bericht
Mooi werk! Als HA noob toch gelukt dit te installeren.
Ik gebruik wel een Duco Silent Connect. Hij vindt 1 device en 12 entities.
Jammer genoeg zijn het allemaal unknown sensors maar het geeft alvast hoop :)

Acties:
  • 0 Henk 'm!

  • Sikerdebaard
  • Registratie: Juli 2008
  • Laatst online: 14:54
Sunz schreef op zondag 17 november 2024 @ 12:27:
[...]


Mooi werk! Als HA noob toch gelukt dit te installeren.
Ik gebruik wel een Duco Silent Connect. Hij vindt 1 device en 12 entities.
Jammer genoeg zijn het allemaal unknown sensors maar het geeft alvast hoop :)
Als je weet hoe je een python package moet installeren kan ik wel ff kijken of ik je sensor data toe kan voegen.

code:
1
2
3
$ pip install ducopy
$ ducopy raw-get https://<ducobox ip>/info/nodes
$ ducopy raw-get https://<ducobox ip>/info


En stuur mij dan ff je output, het liefst via een PB. Er zit identificeerbare informatie in die dump, zoals serienummers. Dus dat wil je wellicht niet publiekelijk posten.

Acties:
  • 0 Henk 'm!

  • Baxke
  • Registratie: December 2019
  • Laatst online: 19:17
Hi,

Ik heb thuis de Duco energy comfort 325 geïnstalleerd en voorzien van een connectivity board, ervan uitgaande dat een koppeling met Home Assistant eenvoudig te realiseren was.

Na het lezen van dit topic heb ik ducopy en Python scripts via HACS geïstalleerd. Ik zie nu de Ducobox Connectivity Board bij integraties (4 apparaten, 26 entiteiten) maar nu loop ik vast.

Ik heb gelezen over het maken van een Python script, deze op te slaan in een mapje en vervolgens oproepen kunnen oproepen via een Card?

Graag wil ik de statussen uitlezen van de Duco wtw, de gemeten CO2 en luchtvochtigheidwaarden.

Kan iemand me een beetje op weg helpen?

  • Draakje5
  • Registratie: November 2011
  • Laatst online: 23:24
fudgee schreef op dinsdag 6 augustus 2024 @ 13:25:
@Dirk Diggler met de hulp van de post van @marnie heb ik de waarde die beschikbaar zijn via de Connectivity Board Api in Home Assistant weten te krijgen (zie afbeelding hieronder). Het enige wat ik nog niet kan in HA is het aanpassen van de ventilatiestand van AUTO naar bijv. MAN1. Ik vermoed dat ik hiervoor een bepaalde API endpoint nodig heb. Ik heb alleen geen idee hoe ik erachter kom welke. De API documentatie (https://connectivity.duco.eu/) zit achter een inlogscherm waar je alleen in kan als officiele installateur.

@marnie: Weet je toevallig of en hoe ik de ventilatiestand kan aanpassen via de Rest API van de Connectivity Board?

Edit: Ik denk dat ik de API endpoint heb gevonden om de ventilatiestand (VentilationState) aan te passen:
code:
1
https://<my_ip>/action/nodes/1


Ik heb alleen nog te weinig kennis van Rest API's om te weten hoe ik de functie `SetVentilationState` kan aanpassen

[Afbeelding]
toon volledige bericht
Ik heb er te weinig kaas van gegeten, maar ben ook op zoek naar dat grafiekje voor in HA.

Ik heb in command yaml de code "rest: !include rest.yaml" toegevoegd.
En ik heb Rest.yaml aangemaakt met de eerder geposte code, daar het IP adres gewijzigd naar mijn DUCO connectivity Board.

Hoe kom je achter de 'NODE' ID's? En de Entiteiten? ddoor @marnie aangegeven?

Ik heb ook de HACS add on van @Sikerdebaard toegevoegd en heb het volgende in mijn dashboard :-)
Air quality zou je idealiter in ppm willen zien ipv percentage?
Afbeeldingslocatie: https://tweakers.net/i/45jrNcLV4gnG3kOKX5Ymle_Jak8=/fit-in/4000x4000/filters:no_upscale():strip_exif()/f/image/pctI4laJJLnqwmJEY5E6MHyl.png?f=user_large

[ Voor 8% gewijzigd door Draakje5 op 26-12-2024 13:10 ]


Acties:
  • 0 Henk 'm!

  • Draakje5
  • Registratie: November 2011
  • Laatst online: 23:24
Na het updaten van HA naar Code, is mijn DUCO intergratie verdwenen. Ik krijg hem nu ook niet meer terug.
Meer die hier last van hebben?

[ Voor 85% gewijzigd door Draakje5 op 04-01-2025 14:04 ]


Acties:
  • 0 Henk 'm!

  • icecreamfarmer
  • Registratie: Januari 2003
  • Laatst online: 05-05 21:11

icecreamfarmer

en het is

marnie schreef op dinsdag 30 april 2024 @ 20:21:
[...]

Ja, ik heb de wtw zelf geïnstalleerd en de installer app daarna ook. Echter van Duco kreeg ik geen akkoord voor het gebruik van de app, men beschouwt particuliere installateurs niet als installateur die toegang verkrijgt.
Ik kan de app nog wel in maar kan de installatie niet via de app uitvoeren. Wel kan ik met de app de gemeten RH waarde en CO2 waardes uitlezen van de aangesloten sensoren, in ppm bij CO2 en % bij vochtigheid. De waardes zijn aanwezig maar niet toegankelijk voor de gebruiker bij gebruik van het connectivity board.

Het kunnen uitlezen van de RH waarde in de app heeft me geholpen bij het zoeken naar de reden dat de box opeens, gedurende een paar uur, onnodig een verhoogd debiet gaf: de gemeten RH waarde was hoger dan het RH setpoint. Door het setpoint te verhogen kwam de box weer in zijn normale bedrijfsstatus. Het kunnen uitlezen van deze waardes heeft voor een gebruiker echt wel nut.
Kun je niet een tabel maken waarbij je de PPM waarde of % vergelijkt met de waarde die consumenten kunnen zien? Dan zou je het zo kunnen vertalen.

ik zie ik zie wat jij niet ziet


Acties:
  • 0 Henk 'm!

  • Batilan
  • Registratie: December 2009
  • Laatst online: 23:12
icecreamfarmer schreef op zondag 2 februari 2025 @ 17:06:
[...]


Kun je niet een tabel maken waarbij je de PPM waarde of % vergelijkt met de waarde die consumenten kunnen zien? Dan zou je het zo kunnen vertalen.
Dat zou inderdaad mooi zijn! Ik volg nu al een tijdje de % waardes voor IaqRh en IaqCo2 maar heb sterk de indruk dat er niet perse een 1:1 relatie tussen deze getallen is. Ik bedoel dan niet alleen dat het niet linear is, maar ik vraag me ook af of bijvoorbeeld 86% voor IaqRh altijd overeenkomt met hetzelfde RH percentage. Ik hoop het natuurlijk wel :)

Acties:
  • +1 Henk 'm!

  • blubgup
  • Registratie: Augustus 2019
  • Laatst online: 06-02 19:21
Ik zie dat er recent nieuwe documentatie is van een connectivity board 2.0 voor de duco energy comfort. Ik kan deze echter online nog nergens te koop vinden, iemand hier ervaring mee? Het lijkt wel echt een ander bordje te zijn...

Acties:
  • 0 Henk 'm!

  • karma28
  • Registratie: Oktober 2015
  • Laatst online: 25-02 16:00
Sikerdebaard schreef op zaterdag 16 november 2024 @ 11:02:
[...]


Ik heb deze library gemaakt. :)

Hier is een preview van een HACS integratie voor Home Assistant: https://github.com/Sikerdebaard/hacs-ducobox-connector

Let op! Dit is een preview en op dit moment read-only. Daarnaast is de plug-in voornamelijk gemaakt voor de Ducobox Energy Comfort 325 dus het kan zijn dat je ineens wat niet-bestaande sensors in je home assistant krijgt. Die worden er nog niet uit gefilterd.

Installeren gaat via de gebruikelijke HACS manier:


[...]


[...]


[...]


[...]


Nieuwe functionaliteit en bugs worden toegevoegd wanneer ik tijd heb. Garantie tot aan de deur etc. etc.
toon volledige bericht
Kan het aan mij liggen maar ik zie helemaal niks van Duco na installatie. Ik zou tenminste in mijn overview iets van terug moeten zien maar ik zie niks.

Acties:
  • 0 Henk 'm!

  • FJA
  • Registratie: April 2009
  • Laatst online: 23:16

FJA

Ik ben me ook aan het oriënteren op de aanschaf van een Duco Energy Comfort, maar neig eerder naar de versie met een max debiet van 225, de Duco Energy Comfort D225. Weet iemand of de add-on van SikerdeBaard ook daarop werkt? En anders, valt het debiet voor de D325 met de add-on in HA ook in te stellen op de afwezigheidsstand (met een debiet van 5% van het max)?

Iets anders wat ik me afvroeg bij het doorlezen van dit topic; ik ga ervan uit dat dit hele topic draait om het uitlezen van de co2 en luchtvochtigheidssensors van Duco zelf, correct? Misschien een stomme vraag ... maar zou elke DucoBox niet gewoon aangestuurd kunnen worden met HA automations die vertrouwen op externe (zigbee) CO2 en luchtvochtigheidssensors?

[ Voor 54% gewijzigd door FJA op 08-03-2025 11:13 ]


Acties:
  • 0 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
FJA schreef op zaterdag 8 maart 2025 @ 10:52:
Ik ben me ook aan het oriënteren op de aanschaf van een Duco Energy Comfort (D325 of D225), maar doorslaggevend is of en hoe ik deze kan aansturen in Home Assistant. Ik houd dit topic dus nauwlettend in de gaten, maar word er helaas niet heel hoopvol van. Ook uit de websites en handleidingen van Duco krijg ik het idee dat ze de consument liever dom houden dan dat ze echt alle handvatten geven om de box op je eigen wensen aan te sturen ... maar goed, daar hebben we tweakers voor!

Ik ga er nu even van uit dat dit hele topic draait om het uitlezen van de co2 en luchtvochtigheidssensors van Duco zelf, correct? Misschien een stomme vraag ... maar zou elke DucoBox niet gewoon aangestuurd kunnen worden met HA automations die vertrouwen op externe (zigbee) CO2 en luchtvochtigheidssensors? En nog een aanvullende vraag: kan de add-on van SikerdeBaard het debiet alleen instellen op stand 1, 2 en 3 of kan ook de afwezigheidsstand worden geactiveerd, of misschien zelfs het debiet op precies het gewenste %? Ik ben namelijk alleenstaand in een kleine woning, en ben ook nog eens hele dagen weg van huis, dus ik wil ook de mogelijkheid hebben om het debiet op het absolute minimum in te stellen.
Ja, Duco en vele andere fabrikanten van apparatuur van huis installaties leveren het liefst via de installateur en zijn niet enthousiast over consumenten met vragen over optimalisatie van de installatie. Is in hun ogen alleen maar lastig en kost veel tijd. Ik heb onlangs gelezen, maar kan het niet terugvinden, dat de EU dit jaar nog met wetgeving komt die de fabrikant verplicht de data die men zelf uit de intstallatie haalt ook ter beschikking te stellen aan de consument. Hopelijk geeft dat een boost aan homeautomatisering en optimalisatie van installaties. Dat gezegd hebbende:

Ik heb zelf een Duco Energy Comfor D325 met twee zones met kleppen, CO2 gestuurd. Daarnaast heb ik de D325 met de oude (!) connection print https://www.123installati...x-connect-print-0000-4251 bekabeld gekoppelt aan mijn netwerk en monitor en bestuur de D325 via REST commands met Homeassistant.

De data die je met rest binnen kan halen zijn oa: alle 4 in en uitgaande temperaturen de echte CO2 waarden, RH en temp waarden van de Duco bedieningssensoren , de relatieve vochtigheid, de in en uitgaande druk, de bypass en de rest tijd van de filters. Best veel dus.

Omdat de eigen Duco sturing van de relatieve vochtigheid RH geen rekening houd met de RH buiten heb ik in homeassistant een automatisering die het setpoint van de RH aanpast afhankelijk van de RH buiten, dit vermijdt onnodig optoeren van de WTW als het mistig is of regend.
Daarnaast stuur ik de WTW hoog als de lamp van het toilet aangaat en via een paar buttons in homassistant kan ik de WTW ook bedienen.
En is er niemand thuis: gaat de WTW op het laagste niveau, is eigenlijk niet nodig omdat de CO2 regeling dat al doet.

En ja, je kan de Duco met niet Duco sensoren via Homeassistant RestCommands aansturen. Ik twijfel wel of je de WTW over een bereik van 0 tot 100% traploos kan aansturen, ik zie in mijn setup alleen drie instellingen voor low, medium en max speed. De Duco regelt zijn ventilatoren wel traploos via zijn eigen CO2 en RH opnemers, en dat doet de D325 eigenlijk heel goed.

Je hebt voor de communicatie met HA wel de oude connection print nodig, ik heb hem van marktplaats, nieuw is deze niet meer te krijgen. De nieuwe print, de connectivity board, is nutteloos voor homeautomatisering.

In het begin was het even uitzoeken maar over het algemeen ben ik tevreden over de D325: het houdt de CO2 waardes in de twee zones op een goed niveau (instelbaar) en na het douchen is de vochtigheid in de badkamer snel weer op een goed niveau.

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • 0 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
Even een toevoeging.

Ik heb de HA addon van SikerdeBaard getest maar weer gedeinstalleerd omdat deze addon geen commando's kan geven naar de Duco, vermoedelijk een beperking van de nieuwe connectivity board waarmee de addon werkt. De addon geeft wel prima data door.

[ Voor 9% gewijzigd door marnie op 08-03-2025 12:19 ]

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • 0 Henk 'm!

  • FJA
  • Registratie: April 2009
  • Laatst online: 23:16

FJA

Hey Marnie, bedankt voor je antwoord! Helaas dat die oude connect print nergens meer verkrijgbaar is, en wachten en hopen dat er een op marktplaats verschijnt is ook niet echt een optie waar ik erg warm voor loop ...
Je hebt voor de communicatie met HA wel de oude connection print nodig, ik heb hem van marktplaats, nieuw is deze niet meer te krijgen. De nieuwe print, de connectivity board, is nutteloos voor homeautomatisering.
Zeg je dat de HA add-on van SikerdeBaard de wtw-unit ook niet kan aansturen, ook niet met de nieuwe connectivity board? Wel toch? In dat geval zou de add-on van Sikerdebaard in combinatie met externe sensors een prima oplossing zijn toch? Dan rest mij alleen nog de vraag of het debiet traploos is in te stellen, OF dat de afwezigheidsstand valt in te schakelen via die add-on.

Wat dat betreft is er misschien wel een heel interessante ontwikkeling: kennelijk is er eergisteren een informatieblad voor de nieuwe connectivity board 2.0 vrijgegeven, waarin je ziet dat ook "afwezig" ingesteld kan worden. Dat is hoopgevend (voor wie daar behoefte aan heeft, net als ik :P)! Te vinden onder een van de uitklap-menu'tjes op deze pagina: https://www.duco.eu/nl/pr...ehoren/connectivity-board

Misschien dat iemand met meer verstand van dit alles daaruit misschien ook kan afleiden of de nieuwe 2.0 misschien beter te integreren zal zijn in HA. Stom genoeg kan ik geen oude versie van een soortgelijk "informatieblad modbus TCP" vinden voor de oude connectivity board, zodat ik ook niet kan vergelijken wat er veranderd is aan deze versie 2.0.

[ Voor 9% gewijzigd door FJA op 08-03-2025 18:27 ]


Acties:
  • 0 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
FJA schreef op zaterdag 8 maart 2025 @ 18:25:
Hey Marnie, bedankt voor je antwoord! Helaas dat die oude connect print nergens meer verkrijgbaar is, en wachten en hopen dat er een op marktplaats verschijnt is ook niet echt een optie waar ik erg warm voor loop ...


[...]


Zeg je dat de HA add-on van SikerdeBaard de wtw-unit ook niet kan aansturen, ook niet met de nieuwe connectivity board? Wel toch? In dat geval zou de add-on van Sikerdebaard in combinatie met externe sensors een prima oplossing zijn toch? Dan rest mij alleen nog de vraag of het debiet traploos is in te stellen, OF dat de afwezigheidsstand valt in te schakelen via die add-on.

Wat dat betreft is er misschien wel een heel interessante ontwikkeling: kennelijk is er eergisteren een informatieblad voor de nieuwe connectivity board 2.0 vrijgegeven, waarin je ziet dat ook "afwezig" ingesteld kan worden. Dat is hoopgevend (voor wie daar behoefte aan heeft, net als ik :P)! Te vinden onder een van de uitklap-menu'tjes op deze pagina: https://www.duco.eu/nl/pr...ehoren/connectivity-board

Misschien dat iemand met meer verstand van dit alles daaruit misschien ook kan afleiden of de nieuwe 2.0 misschien beter te integreren zal zijn in HA. Stom genoeg kan ik geen oude versie van een soortgelijk "informatieblad modbus TCP" vinden voor de oude connectivity board, zodat ik ook niet kan vergelijken wat er veranderd is aan deze versie 2.0.
toon volledige bericht
Ik heb ca 1 maand geleden de Sikerdebaard add-on getest en geen mogelijkheid gezien om de Duco aan te sturen, misschien even navragen bij Sikerdebaart. Daarom blijf ik het oude board gebruiken met HA en REST.

Wat betreft modbus specs voor de oude print, misschien heb je hier iets aan:
https://www.duco.eu/Wes/C...l)_638328128557957132.pdf
te vinden op https://www.duco.eu/be_nl/gearchiveerde-systemen

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • 0 Henk 'm!

  • |sWORDs|
  • Registratie: Maart 2000
  • Laatst online: 06-05 10:21

|sWORDs|

vSphere/ESXi

Ik ben dit weekend ook even bezig geweest met mijn Duco Silent Connect met Communication Print (met de javascript code van de webserver en Google Gemini 2.5 Pro):
Duco
Afbeeldingslocatie: https://tweakers.net/i/xgOKQmA1N4SBGAJRNpn1jcMmNGw=/100x75/filters:strip_exif()/f/image/mrZjhMzwrwIORgTYbAl6OQfh.png?f=fotoalbum_smallAfbeeldingslocatie: https://tweakers.net/i/YxCag2ndFqBMyF3XhF6Kbsu6ZIo=/100x75/filters:strip_icc():strip_exif()/f/image/r2ScPW1MbARf5ehB1KuVj7GX.jpg?f=fotoalbum_smallAfbeeldingslocatie: https://tweakers.net/i/VPDaXt5Z7201pW7nGs92lLRbWfI=/100x75/filters:strip_icc():strip_exif()/f/image/W20AMeWdJFZhaQKs6vzDMh5Z.jpg?f=fotoalbum_small
Afbeeldingslocatie: https://tweakers.net/i/fci2XA1x_RUbn3_fcCPvf_B-Qso=/100x75/filters:strip_icc():strip_exif()/f/image/6YcCD8ga7HO6fIxYFsSAsmfA.jpg?f=fotoalbum_smallAfbeeldingslocatie: https://tweakers.net/i/GxbcY5SQYCfEYTBEpDFAGt99IOs=/100x75/filters:strip_icc():strip_exif()/f/image/Joc8j3SX0mpChKaBjKw1JauR.jpg?f=fotoalbum_smallAfbeeldingslocatie: https://tweakers.net/i/HEkF7S-7htDJqVUTgQA6rcpdGBk=/100x75/filters:strip_icc():strip_exif()/f/image/Le0wmjzZbnoGqzE9VTC1yyU6.jpg?f=fotoalbum_small
Afbeeldingslocatie: https://tweakers.net/i/FKRSDCB8AArJvBixcyCVW7_Ufog=/100x75/filters:strip_icc():strip_exif()/f/image/W14dDB2sWwrkrcAWbPS6Ggr2.jpg?f=fotoalbum_small


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
# configuration.yaml - Versie met Legacy Template Fan

default_config:

frontend:
  themes: !include_dir_merge_named themes

automation: !include automations.yaml
script: !include scripts.yaml # Zorg dat de shortcut-scripts hierin staan!
scene: !include scenes.yaml

# --- DucoBox Basis REST Commando's ---
rest_command:
  set_ducobox_mode:
    url: "http://192.168.1.97/nodesetoperstate?node=1&value={{ state }}&t={{ now().timestamp() | int }}"
    method: GET
    verify_ssl: false
    timeout: 10
  set_ducobox_overrule:
    url: "http://192.168.1.97/nodesetoverrule?node=1&value={{ value }}&t={{ now().timestamp() | int }}"
    method: GET
    verify_ssl: false
    timeout: 10
  set_ducobox_node_config:
    url: "http://192.168.1.97/nodeconfigset?node={{ node }}&para={{ parameter }}&value={{ value }}&t={{ now().timestamp() | int }}"
    method: GET
    verify_ssl: false
    timeout: 10
  set_ducobox_box_config:
    url: "http://192.168.1.97/{{ list | default('box') }}configset?mod={{ module }}&para={{ parameter }}&value={{ value }}&t={{ now().timestamp() | int }}"
    method: GET
    verify_ssl: false
    timeout: 10

# --- RESTful Sensor Definities ---
rest:
  # ... (Alle REST sensor definities blijven hier ongewijzigd) ...
  # --- Node Info (Status, Vraag, Sensoren) ---
  - resource: "http://192.168.1.97/nodeinfoget?node=1"
    scan_interval: 15
    verify_ssl: false
    sensor:
      - name: "DucoBox State"
        unique_id: ducobox_node1_state
        value_template: "{{ value_json.state }}"
        icon: mdi:state-machine
        json_attributes:
          [
            node,
            devtype,
            location,
            state,
            cntdwn,
            endtime,
            mode,
            trgt,
            actl,
            ovrl,
            snsr,
            cerr,
            swversion,
            serialnb,
            error,
            show,
            link,
            temp,
            co2,
            rh,
          ]
      - name: "DucoBox Mode"
        unique_id: ducobox_node1_mode
        value_template: "{{ value_json.mode }}"
        icon: mdi:cog-outline
      - name: "DucoBox Target Demand"
        unique_id: ducobox_node1_target_demand
        value_template: "{{ value_json.trgt }}"
        unit_of_measurement: "%"
        icon: mdi:target
        state_class: measurement
      - name: "DucoBox Actual Level"
        unique_id: ducobox_node1_actual_level
        value_template: "{{ value_json.actl }}"
        unit_of_measurement: "%"
        icon: mdi:speedometer
        state_class: measurement
      - name: "DucoBox Temperature"
        unique_id: ducobox_node1_temp
        value_template: "{{ value_json.temp }}"
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
      - name: "DucoBox Humidity"
        unique_id: ducobox_node1_rh
        value_template: "{{ value_json.rh }}"
        device_class: humidity
        state_class: measurement
        unit_of_measurement: "%"
      - name: "DucoBox CO2"
        unique_id: ducobox_node1_co2
        value_template: "{{ value_json.co2 }}"
        device_class: carbon_dioxide
        state_class: measurement
        unit_of_measurement: "ppm"
  - resource: "http://192.168.1.97/nodeinfoget?node=137"
    scan_interval: 60
    verify_ssl: false
    sensor:
      - name: "DucoBox Kanaal CO2 Vraag"
        unique_id: ducobox_kanaal_co2_vraag_137
        value_template: "{{ value_json.snsr }}"
        unit_of_measurement: "%"
        icon: mdi:gauge-low
        state_class: measurement
  - resource: "http://192.168.1.97/nodeinfoget?node=138"
    scan_interval: 60
    verify_ssl: false
    sensor:
      - name: "DucoBox Kanaal RH Vraag"
        unique_id: ducobox_kanaal_rh_vraag_138
        value_template: "{{ value_json.snsr }}"
        unit_of_measurement: "%"
        icon: mdi:water-percent-alert
        state_class: measurement
  - resource: "http://192.168.1.97/boxinfoget"
    scan_interval: 120
    verify_ssl: false
    sensor:
      - name: "DucoBox Power Now"
        unique_id: ducobox_boxinfo_power_now
        value_template: "{{ value_json.Performance.PowerNow }}"
        device_class: power
        state_class: measurement
        unit_of_measurement: "W"
      - name: "DucoBox Power Average"
        unique_id: ducobox_boxinfo_power_avg
        value_template: "{{ value_json.Performance.PowerAvg }}"
        device_class: power
        state_class: measurement
        unit_of_measurement: "W"
      - name: "DucoBox Total Pressure"
        unique_id: ducobox_boxinfo_total_pressure
        value_template: "{{ value_json.Performance.PressureTotal }}"
        unit_of_measurement: "Pa"
        state_class: measurement
        icon: mdi:gauge
      - name: "DucoBox Calibration State"
        unique_id: ducobox_boxinfo_calib_state
        value_template: "{{ value_json.Calibration.CalibState }}"
        icon: mdi:tune-variant
      - name: "DucoBox Installer State"
        unique_id: ducobox_boxinfo_installer_state
        value_template: "{{ value_json.General.InstallerState }}"
        icon: mdi:account-wrench
  - resource: "http://192.168.1.97/board_info"
    scan_interval: 3600
    verify_ssl: false
    sensor:
      - name: "DucoBox Board Uptime Seconds"
        unique_id: ducobox_board_uptime_seconds
        value_template: "{{ value_json.uptime }}"
        unit_of_measurement: "s"
        icon: mdi:timer-outline
        state_class: total_increasing
      - name: "DucoBox Board SW Version"
        unique_id: ducobox_board_sw_version
        value_template: "{{ value_json.swversion }}"
        icon: mdi:chip
      - name: "DucoBox Board API Version"
        unique_id: ducobox_board_api_version
        value_template: "{{ value_json.apiversion }}"
        icon: mdi:api
      - name: "DucoBox Board MAC Address"
        unique_id: ducobox_board_mac_address
        value_template: "{{ value_json.mac }}"
        icon: mdi:network-outline
  - resource: "http://192.168.1.97/nodeconfigget?node=1"
    scan_interval: 3600
    verify_ssl: false
    timeout: 10
    sensor:
      - name: "DucoBox Config Node 1 AutoMin"
        unique_id: ducobox_config_node1_automin
        value_template: "{{ value_json.AutoMin.Val }}"
        unit_of_measurement: "%"
        icon: mdi:fan-minus
      - name: "DucoBox Config Node 1 AutoMax"
        unique_id: ducobox_config_node1_automax
        value_template: "{{ value_json.AutoMax.Val }}"
        unit_of_measurement: "%"
        icon: mdi:fan-plus
      - name: "DucoBox Config Node 1 Capacity"
        unique_id: ducobox_config_node1_capacity
        value_template: "{{ value_json.Capacity.Val }}"
        unit_of_measurement: "m³/h"
        icon: mdi:wind-power-outline
      - name: "DucoBox Config Node 1 Manual1 Level"
        unique_id: ducobox_config_node1_manual1
        value_template: "{{ value_json.Manual1.Val }}"
        unit_of_measurement: "%"
        icon: mdi:numeric-1-box-outline
      - name: "DucoBox Config Node 1 Manual2 Level"
        unique_id: ducobox_config_node1_manual2
        value_template: "{{ value_json.Manual2.Val }}"
        unit_of_measurement: "%"
        icon: mdi:numeric-2-box-outline
      - name: "DucoBox Config Node 1 Manual3 Level"
        unique_id: ducobox_config_node1_manual3
        value_template: "{{ value_json.Manual3.Val }}"
        unit_of_measurement: "%"
        icon: mdi:numeric-3-box-outline
      - name: "DucoBox Config Node 1 ManualTimeout"
        unique_id: ducobox_config_node1_manualtimeout
        value_template: "{{ value_json.ManualTimeout.Val }}"
        unit_of_measurement: "min"
        icon: mdi:timer-sand
      - name: "DucoBox Config Node 1 Location"
        unique_id: ducobox_config_node1_location
        value_template: "{{ value_json.Location }}"
        icon: mdi:map-marker
  - resource: "http://192.168.1.97/nodeconfigget?node=137"
    scan_interval: 3600
    verify_ssl: false
    timeout: 10
    sensor:
      - name: "DucoBox Config Node 137 CO2Setpoint"
        unique_id: ducobox_config_node137_co2setpoint
        value_template: "{{ value_json.CO2Setpoint.Val }}"
        unit_of_measurement: "ppm"
        device_class: carbon_dioxide
      - name: "DucoBox Config Node 137 TempDependent"
        unique_id: ducobox_config_node137_tempdependent
        value_template: "{{ 'ON' if value_json.TempDependent.Val == 1 else 'OFF' }}"
        icon: mdi:thermometer-auto
      - name: "DucoBox Config Node 137 SensorVisuLevel"
        unique_id: ducobox_config_node137_sensorvisulevel
        value_template: "{{ value_json.SensorVisuLevel.Val }}"
        unit_of_measurement: "%"
        icon: mdi:lightbulb-on-outline
  - resource: "http://192.168.1.97/nodeconfigget?node=138"
    scan_interval: 3600
    verify_ssl: false
    timeout: 10
    sensor:
      - name: "DucoBox Config Node 138 RHSetpoint"
        unique_id: ducobox_config_node138_rhsetpoint
        value_template: "{{ value_json.RHSetpoint.Val }}"
        unit_of_measurement: "%"
        device_class: humidity
      - name: "DucoBox Config Node 138 RHDelta"
        unique_id: ducobox_config_node138_rhdelta
        value_template: "{{ 'ON' if value_json.RHDelta.Val == 1 else 'OFF' }}"
        icon: mdi:delta
      - name: "DucoBox Config Node 138 SensorVisuLevel"
        unique_id: ducobox_config_node138_sensorvisulevel
        value_template: "{{ value_json.SensorVisuLevel.Val }}"
        unit_of_measurement: "%"
        icon: mdi:lightbulb-on-outline
  - resource: "http://192.168.1.97/boxconfigget"
    scan_interval: 3600
    verify_ssl: false
    timeout: 10
    sensor:
      # ... (Alle Box Config sensoren blijven hier ongewijzigd) ...
      - name: "DucoBox Config TimeZone"
        unique_id: ducobox_config_box_timezone
        value_template: "{{ value_json.Time.TimeZone.Val }}"
        icon: mdi:map-clock
      - name: "DucoBox Config Auto DST"
        unique_id: ducobox_config_box_autodst
        value_template: "{{ 'ON' if value_json.Time.AutoDaylightSavingTime.Val == 1 else 'OFF' }}"
        icon: mdi:clock-check-outline
      - name: "DucoBox Config Max High Level"
        unique_id: ducobox_config_box_maxhighlevel
        value_template: "{{ value_json.Fan.MaxHighLevel.Val }}"
        unit_of_measurement: "%"
        icon: mdi:fan-speed-3
      - name: "DucoBox Config Calib On Man2"
        unique_id: ducobox_config_box_calibonman2
        value_template: "{{ 'ON' if value_json.Fan.CalibOnMan2.Val == 1 else 'OFF' }}"
        icon: mdi:tune-variant
      - name: "DucoBox Config GroundBound"
        unique_id: ducobox_config_box_groundbound
        value_template: "{{ 'ON' if value_json.Fan.GroundBound.Val == 1 else 'OFF' }}"
        icon: mdi:earth-box
      - name: "DucoBox Config HeadCount"
        unique_id: ducobox_config_box_headcount
        value_template: "{{ value_json.Fan.HeadCount.Val }}"
        unit_of_measurement: "personen"
        icon: mdi:account-group
      - name: "DucoBox Config PwmInverted"
        unique_id: ducobox_config_box_pwminverted
        value_template: "{{ 'ON' if value_json.Fan.PwmInverted.Val == 1 else 'OFF' }}"
        icon: mdi:swap-horizontal-variant
      - name: "DucoBox Config VentCool Active Mon"
        unique_id: ducobox_config_box_ventcool_mon
        value_template: "{{ 'ON' if value_json.VentCool.ActiveMonday.Val == 1 else 'OFF' }}"
        icon: mdi:calendar-week
      - name: "DucoBox Config VentCool Active Tue"
        unique_id: ducobox_config_box_ventcool_tue
        value_template: "{{ 'ON' if value_json.VentCool.ActiveTuesday.Val == 1 else 'OFF' }}"
        icon: mdi:calendar-week
      - name: "DucoBox Config VentCool Active Wed"
        unique_id: ducobox_config_box_ventcool_wed
        value_template: "{{ 'ON' if value_json.VentCool.ActiveWednesday.Val == 1 else 'OFF' }}"
        icon: mdi:calendar-week
      - name: "DucoBox Config VentCool Active Thu"
        unique_id: ducobox_config_box_ventcool_thu
        value_template: "{{ 'ON' if value_json.VentCool.ActiveThursday.Val == 1 else 'OFF' }}"
        icon: mdi:calendar-week
      - name: "DucoBox Config VentCool Active Fri"
        unique_id: ducobox_config_box_ventcool_fri
        value_template: "{{ 'ON' if value_json.VentCool.ActiveFriday.Val == 1 else 'OFF' }}"
        icon: mdi:calendar-week
      - name: "DucoBox Config VentCool Active Sat"
        unique_id: ducobox_config_box_ventcool_sat
        value_template: "{{ 'ON' if value_json.VentCool.ActiveSaturday.Val == 1 else 'OFF' }}"
        icon: mdi:calendar-week
      - name: "DucoBox Config VentCool Active Sun"
        unique_id: ducobox_config_box_ventcool_sun
        value_template: "{{ 'ON' if value_json.VentCool.ActiveSunday.Val == 1 else 'OFF' }}"
        icon: mdi:calendar-week
      - name: "DucoBox Config VentCool StartTime"
        unique_id: ducobox_config_box_ventcool_starttime
        value_template: "{{ '%02d:%02d' | format(value_json.VentCool.StartTime.Val // 60, value_json.VentCool.StartTime.Val % 60) }}"
        icon: mdi:clock-start
      - name: "DucoBox Config VentCool StopTime"
        unique_id: ducobox_config_box_ventcool_stoptime
        value_template: "{{ '%02d:%02d' | format(value_json.VentCool.StopTime.Val // 60, value_json.VentCool.StopTime.Val % 60) }}"
        icon: mdi:clock-end
      - name: "DucoBox Config NightBoost Active"
        unique_id: ducobox_config_box_nightboost_active
        value_template: "{{ 'ON' if value_json.NightBoost.Active.Val == 1 else 'OFF' }}"
        icon: mdi:weather-night
      - name: "DucoBox Config NightBoost StartTemp"
        unique_id: ducobox_config_box_nightboost_starttemp
        value_template: "{{ value_json.NightBoost.StartTemp.Val }}"
        unit_of_measurement: "°C"
        device_class: temperature
      - name: "DucoBox Config NightBoost StartMonth"
        unique_id: ducobox_config_box_nightboost_startmonth
        value_template: "{{ value_json.NightBoost.StartMonth.Val }}"
        icon: mdi:calendar-month
      - name: "DucoBox Config NightBoost StopMonth"
        unique_id: ducobox_config_box_nightboost_stopmonth
        value_template: "{{ value_json.NightBoost.StopMonth.Val }}"
        icon: mdi:calendar-month
      - name: "DucoBox Config NightBoost StartTime"
        unique_id: ducobox_config_box_nightboost_starttime
        value_template: "{{ '%02d:%02d' | format(value_json.NightBoost.StartTime.Val // 60, value_json.NightBoost.StartTime.Val % 60) }}"
        icon: mdi:clock-start
      - name: "DucoBox Config NightBoost StopTime"
        unique_id: ducobox_config_box_nightboost_stoptime
        value_template: "{{ '%02d:%02d' | format(value_json.NightBoost.StopTime.Val // 60, value_json.NightBoost.StopTime.Val % 60) }}"
        icon: mdi:clock-end

# --- Template Entities (Moderne Structuur - Alleen Sensor) ---
template:
  # --- Template Sensor ---
  - sensor:
      - name: "DucoBox Board Uptime"
        unique_id: ducobox_board_uptime_friendly
        icon: mdi:timer-sand
        state: >
          {% set uptime_sec = states('sensor.ducobox_board_uptime_seconds') | int(0) %}
          {% set days = (uptime_sec // 86400) %}
          {% set hours = (uptime_sec % 86400 // 3600) %}
          {% set minutes = (uptime_sec % 3600 // 60) %}
          {% if days > 0 %}
            {{ days }}d {{ hours }}u {{ minutes }}m
          {% elif hours > 0 %}
            {{ hours }}u {{ minutes }}m
          {% else %}
            {{ minutes }}m
          {% endif %}
  # --- De moderne fan is hier verwijderd ---

# --- Legacy Template Fan ---
fan:
  - platform: template
    fans:
      ducobox_ventilation: # Dit is de 'slug' of naam van de fan entiteit
        friendly_name: "DucoBox Ventilatie" # Weergavenaam
        unique_id: "ducobox_ventilation_control" # Voor consistentie en UI beheer
        value_template: > # Voor aan/uit status
          {{ states('sensor.ducobox_node1_state') not in ['EMPT', 'unknown'] }}

        # Acties gebruiken de '- service:' syntax die eerder werkte
        turn_on:
          - service: rest_command.set_ducobox_mode
            data: { state: "AUTO" }
        turn_off:
          - service: rest_command.set_ducobox_mode
            data: { state: "EMPT" }

        preset_modes: ["Auto", "Away", "Manual 1", "Manual 2", "Manual 3"]
        preset_mode_template: > # Voor huidige preset status
          {% set current_state = states('sensor.ducobox_node1_state') %}
          {% if current_state == "MAN1" or current_state == "CNT1" %} Manual 1
          {% elif current_state == "MAN2" or current_state == "CNT2" %} Manual 2
          {% elif current_state == "MAN3" or current_state == "CNT3" %} Manual 3
          {% elif current_state == "EMPT" %} Away
          {% elif current_state.startswith("AUT") %} Auto
          {% else %} Auto
          {% endif %}
        set_preset_mode: # Actie voor instellen preset
          - service: rest_command.set_ducobox_mode
            data:
              state: >
                {% if preset_mode == "Manual 1" %} MAN1
                {% elif preset_mode == "Manual 2" %} MAN2
                {% elif preset_mode == "Manual 3" %} MAN3
                {% elif preset_mode == "Away" %} EMPT
                {% else %} AUTO
                {% endif %}

        percentage_template: "{{ states('sensor.ducobox_node1_target_demand') | int(0) }}" # Voor huidige percentage status
        set_percentage: # Actie voor instellen percentage
          - service: rest_command.set_ducobox_overrule
            data:
              value: "{{ percentage }}"

        speed_count: 100 # Om percentage controle mogelijk te maken

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# scripts.yaml

set_ducobox_automin:
  alias: "Set DucoBox AutoMin (Node 1)"
  fields:
    value:
      description: "De AutoMin waarde (%)"
      example: "25" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_node_config # Correcte syntax met '-'
      data:
        node: 1
        parameter: "AutoMin"
        value: "{{ value }}"

set_ducobox_automax:
  alias: "Set DucoBox AutoMax (Node 1)"
  fields:
    value:
      description: "De AutoMax waarde (%)"
      example: "80" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_node_config # Correcte syntax met '-'
      data:
        node: 1
        parameter: "AutoMax"
        value: "{{ value }}"

set_ducobox_capacity:
  alias: "Set DucoBox Capacity (Node 1)"
  fields:
    value:
      description: "De capaciteit (m³/h)"
      example: "400" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_node_config # Correcte syntax met '-'
      data:
        node: 1
        parameter: "Capacity"
        value: "{{ value }}"

set_ducobox_manualtimeout:
  alias: "Set DucoBox ManualTimeout (Node 1)"
  fields:
    value:
      description: "De timeout voor manuele modus (min)"
      example: "120" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_node_config # Correcte syntax met '-'
      data:
        node: 1
        parameter: "ManualTimeout"
        value: "{{ value }}"

set_ducobox_co2setpoint:
  alias: "Set DucoBox CO2 Setpoint (Node 137)"
  fields:
    value:
      description: "Het CO2 setpoint (ppm)"
      example: "800" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_node_config # Correcte syntax met '-'
      data:
        node: 137
        parameter: "CO2Setpoint"
        value: "{{ value }}"

set_ducobox_tempdependent:
  alias: "Set DucoBox TempDependent (Node 137)"
  fields:
    value:
      description: "Zet TempDependent AAN of UIT ('ON'/'OFF')"
      example: "ON" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_node_config # Correcte syntax met '-'
      data:
        node: 137
        parameter: "TempDependent"
        value: "{{ 1 if value | upper == 'ON' else 0 }}"

set_ducobox_rhsetpoint:
  alias: "Set DucoBox RH Setpoint (Node 138)"
  fields:
    value:
      description: "Het RH setpoint (%)"
      example: "70" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_node_config # Correcte syntax met '-'
      data:
        node: 138
        parameter: "RHSetpoint"
        value: "{{ value }}"

set_ducobox_rhdelta:
  alias: "Set DucoBox RH Delta (Node 138)"
  fields:
    value:
      description: "Zet RH Delta AAN of UIT ('ON'/'OFF')"
      example: "OFF" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_node_config # Correcte syntax met '-'
      data:
        node: 138
        parameter: "RHDelta"
        value: "{{ 1 if value | upper == 'ON' else 0 }}"

set_ducobox_nightboost_active:
  alias: "Set DucoBox NightBoost Active"
  fields:
    value:
      description: "Zet NightBoost AAN of UIT ('ON'/'OFF')"
      example: "OFF" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_box_config # Correcte syntax met '-'
      data:
        list: "box"
        module: "NightBoost"
        parameter: "Active"
        value: "{{ 1 if value | upper == 'ON' else 0 }}"

set_ducobox_groundbound:
  alias: "Set DucoBox GroundBound"
  fields:
    value:
      description: "Zet GroundBound AAN of UIT ('ON'/'OFF')"
      example: "ON" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_box_config # Correcte syntax met '-'
      data:
        list: "box" # 'list' was niet gespecificeerd in origineel, 'box' aangenomen
        module: "Fan"
        parameter: "GroundBound"
        value: "{{ 1 if value | upper == 'ON' else 0 }}"

Te Koop:24 Core Intel Upgradeset


Acties:
  • 0 Henk 'm!

  • Zillan
  • Registratie: November 2011
  • Laatst online: 21:33
|sWORDs| schreef op maandag 7 april 2025 @ 10:54:
Ik ben dit weekend ook even bezig geweest met mijn Duco Silent Connect met Communication Print (met de javascript code van de webserver en Google Gemini 2.5 Pro):
Duco
[Afbeelding][Afbeelding][Afbeelding]
[Afbeelding][Afbeelding][Afbeelding]
[Afbeelding]


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
# configuration.yaml - Versie met Legacy Template Fan

default_config:

frontend:
  themes: !include_dir_merge_named themes

automation: !include automations.yaml
script: !include scripts.yaml # Zorg dat de shortcut-scripts hierin staan!
scene: !include scenes.yaml

# --- DucoBox Basis REST Commando's ---
rest_command:
  set_ducobox_mode:
    url: "http://192.168.1.97/nodesetoperstate?node=1&value={{ state }}&t={{ now().timestamp() | int }}"
    method: GET
    verify_ssl: false
    timeout: 10
  set_ducobox_overrule:
    url: "http://192.168.1.97/nodesetoverrule?node=1&value={{ value }}&t={{ now().timestamp() | int }}"
    method: GET
    verify_ssl: false
    timeout: 10
  set_ducobox_node_config:
    url: "http://192.168.1.97/nodeconfigset?node={{ node }}&para={{ parameter }}&value={{ value }}&t={{ now().timestamp() | int }}"
    method: GET
    verify_ssl: false
    timeout: 10
  set_ducobox_box_config:
    url: "http://192.168.1.97/{{ list | default('box') }}configset?mod={{ module }}&para={{ parameter }}&value={{ value }}&t={{ now().timestamp() | int }}"
    method: GET
    verify_ssl: false
    timeout: 10

# --- RESTful Sensor Definities ---
rest:
  # ... (Alle REST sensor definities blijven hier ongewijzigd) ...
  # --- Node Info (Status, Vraag, Sensoren) ---
  - resource: "http://192.168.1.97/nodeinfoget?node=1"
    scan_interval: 15
    verify_ssl: false
    sensor:
      - name: "DucoBox State"
        unique_id: ducobox_node1_state
        value_template: "{{ value_json.state }}"
        icon: mdi:state-machine
        json_attributes:
          [
            node,
            devtype,
            location,
            state,
            cntdwn,
            endtime,
            mode,
            trgt,
            actl,
            ovrl,
            snsr,
            cerr,
            swversion,
            serialnb,
            error,
            show,
            link,
            temp,
            co2,
            rh,
          ]
      - name: "DucoBox Mode"
        unique_id: ducobox_node1_mode
        value_template: "{{ value_json.mode }}"
        icon: mdi:cog-outline
      - name: "DucoBox Target Demand"
        unique_id: ducobox_node1_target_demand
        value_template: "{{ value_json.trgt }}"
        unit_of_measurement: "%"
        icon: mdi:target
        state_class: measurement
      - name: "DucoBox Actual Level"
        unique_id: ducobox_node1_actual_level
        value_template: "{{ value_json.actl }}"
        unit_of_measurement: "%"
        icon: mdi:speedometer
        state_class: measurement
      - name: "DucoBox Temperature"
        unique_id: ducobox_node1_temp
        value_template: "{{ value_json.temp }}"
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
      - name: "DucoBox Humidity"
        unique_id: ducobox_node1_rh
        value_template: "{{ value_json.rh }}"
        device_class: humidity
        state_class: measurement
        unit_of_measurement: "%"
      - name: "DucoBox CO2"
        unique_id: ducobox_node1_co2
        value_template: "{{ value_json.co2 }}"
        device_class: carbon_dioxide
        state_class: measurement
        unit_of_measurement: "ppm"
  - resource: "http://192.168.1.97/nodeinfoget?node=137"
    scan_interval: 60
    verify_ssl: false
    sensor:
      - name: "DucoBox Kanaal CO2 Vraag"
        unique_id: ducobox_kanaal_co2_vraag_137
        value_template: "{{ value_json.snsr }}"
        unit_of_measurement: "%"
        icon: mdi:gauge-low
        state_class: measurement
  - resource: "http://192.168.1.97/nodeinfoget?node=138"
    scan_interval: 60
    verify_ssl: false
    sensor:
      - name: "DucoBox Kanaal RH Vraag"
        unique_id: ducobox_kanaal_rh_vraag_138
        value_template: "{{ value_json.snsr }}"
        unit_of_measurement: "%"
        icon: mdi:water-percent-alert
        state_class: measurement
  - resource: "http://192.168.1.97/boxinfoget"
    scan_interval: 120
    verify_ssl: false
    sensor:
      - name: "DucoBox Power Now"
        unique_id: ducobox_boxinfo_power_now
        value_template: "{{ value_json.Performance.PowerNow }}"
        device_class: power
        state_class: measurement
        unit_of_measurement: "W"
      - name: "DucoBox Power Average"
        unique_id: ducobox_boxinfo_power_avg
        value_template: "{{ value_json.Performance.PowerAvg }}"
        device_class: power
        state_class: measurement
        unit_of_measurement: "W"
      - name: "DucoBox Total Pressure"
        unique_id: ducobox_boxinfo_total_pressure
        value_template: "{{ value_json.Performance.PressureTotal }}"
        unit_of_measurement: "Pa"
        state_class: measurement
        icon: mdi:gauge
      - name: "DucoBox Calibration State"
        unique_id: ducobox_boxinfo_calib_state
        value_template: "{{ value_json.Calibration.CalibState }}"
        icon: mdi:tune-variant
      - name: "DucoBox Installer State"
        unique_id: ducobox_boxinfo_installer_state
        value_template: "{{ value_json.General.InstallerState }}"
        icon: mdi:account-wrench
  - resource: "http://192.168.1.97/board_info"
    scan_interval: 3600
    verify_ssl: false
    sensor:
      - name: "DucoBox Board Uptime Seconds"
        unique_id: ducobox_board_uptime_seconds
        value_template: "{{ value_json.uptime }}"
        unit_of_measurement: "s"
        icon: mdi:timer-outline
        state_class: total_increasing
      - name: "DucoBox Board SW Version"
        unique_id: ducobox_board_sw_version
        value_template: "{{ value_json.swversion }}"
        icon: mdi:chip
      - name: "DucoBox Board API Version"
        unique_id: ducobox_board_api_version
        value_template: "{{ value_json.apiversion }}"
        icon: mdi:api
      - name: "DucoBox Board MAC Address"
        unique_id: ducobox_board_mac_address
        value_template: "{{ value_json.mac }}"
        icon: mdi:network-outline
  - resource: "http://192.168.1.97/nodeconfigget?node=1"
    scan_interval: 3600
    verify_ssl: false
    timeout: 10
    sensor:
      - name: "DucoBox Config Node 1 AutoMin"
        unique_id: ducobox_config_node1_automin
        value_template: "{{ value_json.AutoMin.Val }}"
        unit_of_measurement: "%"
        icon: mdi:fan-minus
      - name: "DucoBox Config Node 1 AutoMax"
        unique_id: ducobox_config_node1_automax
        value_template: "{{ value_json.AutoMax.Val }}"
        unit_of_measurement: "%"
        icon: mdi:fan-plus
      - name: "DucoBox Config Node 1 Capacity"
        unique_id: ducobox_config_node1_capacity
        value_template: "{{ value_json.Capacity.Val }}"
        unit_of_measurement: "m³/h"
        icon: mdi:wind-power-outline
      - name: "DucoBox Config Node 1 Manual1 Level"
        unique_id: ducobox_config_node1_manual1
        value_template: "{{ value_json.Manual1.Val }}"
        unit_of_measurement: "%"
        icon: mdi:numeric-1-box-outline
      - name: "DucoBox Config Node 1 Manual2 Level"
        unique_id: ducobox_config_node1_manual2
        value_template: "{{ value_json.Manual2.Val }}"
        unit_of_measurement: "%"
        icon: mdi:numeric-2-box-outline
      - name: "DucoBox Config Node 1 Manual3 Level"
        unique_id: ducobox_config_node1_manual3
        value_template: "{{ value_json.Manual3.Val }}"
        unit_of_measurement: "%"
        icon: mdi:numeric-3-box-outline
      - name: "DucoBox Config Node 1 ManualTimeout"
        unique_id: ducobox_config_node1_manualtimeout
        value_template: "{{ value_json.ManualTimeout.Val }}"
        unit_of_measurement: "min"
        icon: mdi:timer-sand
      - name: "DucoBox Config Node 1 Location"
        unique_id: ducobox_config_node1_location
        value_template: "{{ value_json.Location }}"
        icon: mdi:map-marker
  - resource: "http://192.168.1.97/nodeconfigget?node=137"
    scan_interval: 3600
    verify_ssl: false
    timeout: 10
    sensor:
      - name: "DucoBox Config Node 137 CO2Setpoint"
        unique_id: ducobox_config_node137_co2setpoint
        value_template: "{{ value_json.CO2Setpoint.Val }}"
        unit_of_measurement: "ppm"
        device_class: carbon_dioxide
      - name: "DucoBox Config Node 137 TempDependent"
        unique_id: ducobox_config_node137_tempdependent
        value_template: "{{ 'ON' if value_json.TempDependent.Val == 1 else 'OFF' }}"
        icon: mdi:thermometer-auto
      - name: "DucoBox Config Node 137 SensorVisuLevel"
        unique_id: ducobox_config_node137_sensorvisulevel
        value_template: "{{ value_json.SensorVisuLevel.Val }}"
        unit_of_measurement: "%"
        icon: mdi:lightbulb-on-outline
  - resource: "http://192.168.1.97/nodeconfigget?node=138"
    scan_interval: 3600
    verify_ssl: false
    timeout: 10
    sensor:
      - name: "DucoBox Config Node 138 RHSetpoint"
        unique_id: ducobox_config_node138_rhsetpoint
        value_template: "{{ value_json.RHSetpoint.Val }}"
        unit_of_measurement: "%"
        device_class: humidity
      - name: "DucoBox Config Node 138 RHDelta"
        unique_id: ducobox_config_node138_rhdelta
        value_template: "{{ 'ON' if value_json.RHDelta.Val == 1 else 'OFF' }}"
        icon: mdi:delta
      - name: "DucoBox Config Node 138 SensorVisuLevel"
        unique_id: ducobox_config_node138_sensorvisulevel
        value_template: "{{ value_json.SensorVisuLevel.Val }}"
        unit_of_measurement: "%"
        icon: mdi:lightbulb-on-outline
  - resource: "http://192.168.1.97/boxconfigget"
    scan_interval: 3600
    verify_ssl: false
    timeout: 10
    sensor:
      # ... (Alle Box Config sensoren blijven hier ongewijzigd) ...
      - name: "DucoBox Config TimeZone"
        unique_id: ducobox_config_box_timezone
        value_template: "{{ value_json.Time.TimeZone.Val }}"
        icon: mdi:map-clock
      - name: "DucoBox Config Auto DST"
        unique_id: ducobox_config_box_autodst
        value_template: "{{ 'ON' if value_json.Time.AutoDaylightSavingTime.Val == 1 else 'OFF' }}"
        icon: mdi:clock-check-outline
      - name: "DucoBox Config Max High Level"
        unique_id: ducobox_config_box_maxhighlevel
        value_template: "{{ value_json.Fan.MaxHighLevel.Val }}"
        unit_of_measurement: "%"
        icon: mdi:fan-speed-3
      - name: "DucoBox Config Calib On Man2"
        unique_id: ducobox_config_box_calibonman2
        value_template: "{{ 'ON' if value_json.Fan.CalibOnMan2.Val == 1 else 'OFF' }}"
        icon: mdi:tune-variant
      - name: "DucoBox Config GroundBound"
        unique_id: ducobox_config_box_groundbound
        value_template: "{{ 'ON' if value_json.Fan.GroundBound.Val == 1 else 'OFF' }}"
        icon: mdi:earth-box
      - name: "DucoBox Config HeadCount"
        unique_id: ducobox_config_box_headcount
        value_template: "{{ value_json.Fan.HeadCount.Val }}"
        unit_of_measurement: "personen"
        icon: mdi:account-group
      - name: "DucoBox Config PwmInverted"
        unique_id: ducobox_config_box_pwminverted
        value_template: "{{ 'ON' if value_json.Fan.PwmInverted.Val == 1 else 'OFF' }}"
        icon: mdi:swap-horizontal-variant
      - name: "DucoBox Config VentCool Active Mon"
        unique_id: ducobox_config_box_ventcool_mon
        value_template: "{{ 'ON' if value_json.VentCool.ActiveMonday.Val == 1 else 'OFF' }}"
        icon: mdi:calendar-week
      - name: "DucoBox Config VentCool Active Tue"
        unique_id: ducobox_config_box_ventcool_tue
        value_template: "{{ 'ON' if value_json.VentCool.ActiveTuesday.Val == 1 else 'OFF' }}"
        icon: mdi:calendar-week
      - name: "DucoBox Config VentCool Active Wed"
        unique_id: ducobox_config_box_ventcool_wed
        value_template: "{{ 'ON' if value_json.VentCool.ActiveWednesday.Val == 1 else 'OFF' }}"
        icon: mdi:calendar-week
      - name: "DucoBox Config VentCool Active Thu"
        unique_id: ducobox_config_box_ventcool_thu
        value_template: "{{ 'ON' if value_json.VentCool.ActiveThursday.Val == 1 else 'OFF' }}"
        icon: mdi:calendar-week
      - name: "DucoBox Config VentCool Active Fri"
        unique_id: ducobox_config_box_ventcool_fri
        value_template: "{{ 'ON' if value_json.VentCool.ActiveFriday.Val == 1 else 'OFF' }}"
        icon: mdi:calendar-week
      - name: "DucoBox Config VentCool Active Sat"
        unique_id: ducobox_config_box_ventcool_sat
        value_template: "{{ 'ON' if value_json.VentCool.ActiveSaturday.Val == 1 else 'OFF' }}"
        icon: mdi:calendar-week
      - name: "DucoBox Config VentCool Active Sun"
        unique_id: ducobox_config_box_ventcool_sun
        value_template: "{{ 'ON' if value_json.VentCool.ActiveSunday.Val == 1 else 'OFF' }}"
        icon: mdi:calendar-week
      - name: "DucoBox Config VentCool StartTime"
        unique_id: ducobox_config_box_ventcool_starttime
        value_template: "{{ '%02d:%02d' | format(value_json.VentCool.StartTime.Val // 60, value_json.VentCool.StartTime.Val % 60) }}"
        icon: mdi:clock-start
      - name: "DucoBox Config VentCool StopTime"
        unique_id: ducobox_config_box_ventcool_stoptime
        value_template: "{{ '%02d:%02d' | format(value_json.VentCool.StopTime.Val // 60, value_json.VentCool.StopTime.Val % 60) }}"
        icon: mdi:clock-end
      - name: "DucoBox Config NightBoost Active"
        unique_id: ducobox_config_box_nightboost_active
        value_template: "{{ 'ON' if value_json.NightBoost.Active.Val == 1 else 'OFF' }}"
        icon: mdi:weather-night
      - name: "DucoBox Config NightBoost StartTemp"
        unique_id: ducobox_config_box_nightboost_starttemp
        value_template: "{{ value_json.NightBoost.StartTemp.Val }}"
        unit_of_measurement: "°C"
        device_class: temperature
      - name: "DucoBox Config NightBoost StartMonth"
        unique_id: ducobox_config_box_nightboost_startmonth
        value_template: "{{ value_json.NightBoost.StartMonth.Val }}"
        icon: mdi:calendar-month
      - name: "DucoBox Config NightBoost StopMonth"
        unique_id: ducobox_config_box_nightboost_stopmonth
        value_template: "{{ value_json.NightBoost.StopMonth.Val }}"
        icon: mdi:calendar-month
      - name: "DucoBox Config NightBoost StartTime"
        unique_id: ducobox_config_box_nightboost_starttime
        value_template: "{{ '%02d:%02d' | format(value_json.NightBoost.StartTime.Val // 60, value_json.NightBoost.StartTime.Val % 60) }}"
        icon: mdi:clock-start
      - name: "DucoBox Config NightBoost StopTime"
        unique_id: ducobox_config_box_nightboost_stoptime
        value_template: "{{ '%02d:%02d' | format(value_json.NightBoost.StopTime.Val // 60, value_json.NightBoost.StopTime.Val % 60) }}"
        icon: mdi:clock-end

# --- Template Entities (Moderne Structuur - Alleen Sensor) ---
template:
  # --- Template Sensor ---
  - sensor:
      - name: "DucoBox Board Uptime"
        unique_id: ducobox_board_uptime_friendly
        icon: mdi:timer-sand
        state: >
          {% set uptime_sec = states('sensor.ducobox_board_uptime_seconds') | int(0) %}
          {% set days = (uptime_sec // 86400) %}
          {% set hours = (uptime_sec % 86400 // 3600) %}
          {% set minutes = (uptime_sec % 3600 // 60) %}
          {% if days > 0 %}
            {{ days }}d {{ hours }}u {{ minutes }}m
          {% elif hours > 0 %}
            {{ hours }}u {{ minutes }}m
          {% else %}
            {{ minutes }}m
          {% endif %}
  # --- De moderne fan is hier verwijderd ---

# --- Legacy Template Fan ---
fan:
  - platform: template
    fans:
      ducobox_ventilation: # Dit is de 'slug' of naam van de fan entiteit
        friendly_name: "DucoBox Ventilatie" # Weergavenaam
        unique_id: "ducobox_ventilation_control" # Voor consistentie en UI beheer
        value_template: > # Voor aan/uit status
          {{ states('sensor.ducobox_node1_state') not in ['EMPT', 'unknown'] }}

        # Acties gebruiken de '- service:' syntax die eerder werkte
        turn_on:
          - service: rest_command.set_ducobox_mode
            data: { state: "AUTO" }
        turn_off:
          - service: rest_command.set_ducobox_mode
            data: { state: "EMPT" }

        preset_modes: ["Auto", "Away", "Manual 1", "Manual 2", "Manual 3"]
        preset_mode_template: > # Voor huidige preset status
          {% set current_state = states('sensor.ducobox_node1_state') %}
          {% if current_state == "MAN1" or current_state == "CNT1" %} Manual 1
          {% elif current_state == "MAN2" or current_state == "CNT2" %} Manual 2
          {% elif current_state == "MAN3" or current_state == "CNT3" %} Manual 3
          {% elif current_state == "EMPT" %} Away
          {% elif current_state.startswith("AUT") %} Auto
          {% else %} Auto
          {% endif %}
        set_preset_mode: # Actie voor instellen preset
          - service: rest_command.set_ducobox_mode
            data:
              state: >
                {% if preset_mode == "Manual 1" %} MAN1
                {% elif preset_mode == "Manual 2" %} MAN2
                {% elif preset_mode == "Manual 3" %} MAN3
                {% elif preset_mode == "Away" %} EMPT
                {% else %} AUTO
                {% endif %}

        percentage_template: "{{ states('sensor.ducobox_node1_target_demand') | int(0) }}" # Voor huidige percentage status
        set_percentage: # Actie voor instellen percentage
          - service: rest_command.set_ducobox_overrule
            data:
              value: "{{ percentage }}"

        speed_count: 100 # Om percentage controle mogelijk te maken

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# scripts.yaml

set_ducobox_automin:
  alias: "Set DucoBox AutoMin (Node 1)"
  fields:
    value:
      description: "De AutoMin waarde (%)"
      example: "25" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_node_config # Correcte syntax met '-'
      data:
        node: 1
        parameter: "AutoMin"
        value: "{{ value }}"

set_ducobox_automax:
  alias: "Set DucoBox AutoMax (Node 1)"
  fields:
    value:
      description: "De AutoMax waarde (%)"
      example: "80" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_node_config # Correcte syntax met '-'
      data:
        node: 1
        parameter: "AutoMax"
        value: "{{ value }}"

set_ducobox_capacity:
  alias: "Set DucoBox Capacity (Node 1)"
  fields:
    value:
      description: "De capaciteit (m³/h)"
      example: "400" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_node_config # Correcte syntax met '-'
      data:
        node: 1
        parameter: "Capacity"
        value: "{{ value }}"

set_ducobox_manualtimeout:
  alias: "Set DucoBox ManualTimeout (Node 1)"
  fields:
    value:
      description: "De timeout voor manuele modus (min)"
      example: "120" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_node_config # Correcte syntax met '-'
      data:
        node: 1
        parameter: "ManualTimeout"
        value: "{{ value }}"

set_ducobox_co2setpoint:
  alias: "Set DucoBox CO2 Setpoint (Node 137)"
  fields:
    value:
      description: "Het CO2 setpoint (ppm)"
      example: "800" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_node_config # Correcte syntax met '-'
      data:
        node: 137
        parameter: "CO2Setpoint"
        value: "{{ value }}"

set_ducobox_tempdependent:
  alias: "Set DucoBox TempDependent (Node 137)"
  fields:
    value:
      description: "Zet TempDependent AAN of UIT ('ON'/'OFF')"
      example: "ON" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_node_config # Correcte syntax met '-'
      data:
        node: 137
        parameter: "TempDependent"
        value: "{{ 1 if value | upper == 'ON' else 0 }}"

set_ducobox_rhsetpoint:
  alias: "Set DucoBox RH Setpoint (Node 138)"
  fields:
    value:
      description: "Het RH setpoint (%)"
      example: "70" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_node_config # Correcte syntax met '-'
      data:
        node: 138
        parameter: "RHSetpoint"
        value: "{{ value }}"

set_ducobox_rhdelta:
  alias: "Set DucoBox RH Delta (Node 138)"
  fields:
    value:
      description: "Zet RH Delta AAN of UIT ('ON'/'OFF')"
      example: "OFF" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_node_config # Correcte syntax met '-'
      data:
        node: 138
        parameter: "RHDelta"
        value: "{{ 1 if value | upper == 'ON' else 0 }}"

set_ducobox_nightboost_active:
  alias: "Set DucoBox NightBoost Active"
  fields:
    value:
      description: "Zet NightBoost AAN of UIT ('ON'/'OFF')"
      example: "OFF" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_box_config # Correcte syntax met '-'
      data:
        list: "box"
        module: "NightBoost"
        parameter: "Active"
        value: "{{ 1 if value | upper == 'ON' else 0 }}"

set_ducobox_groundbound:
  alias: "Set DucoBox GroundBound"
  fields:
    value:
      description: "Zet GroundBound AAN of UIT ('ON'/'OFF')"
      example: "ON" # Gecorrigeerd naar string
  sequence:
    - service: rest_command.set_ducobox_box_config # Correcte syntax met '-'
      data:
        list: "box" # 'list' was niet gespecificeerd in origineel, 'box' aangenomen
        module: "Fan"
        parameter: "GroundBound"
        value: "{{ 1 if value | upper == 'ON' else 0 }}"
toon volledige bericht
Mooi hoor, welk boardje gebruik je precies? De 2.0 of de originele?

Acties:
  • 0 Henk 'm!

  • |sWORDs|
  • Registratie: Maart 2000
  • Laatst online: 06-05 10:21

|sWORDs|

vSphere/ESXi

Zillan schreef op donderdag 10 april 2025 @ 20:51:
[...]


Mooi hoor, welk boardje gebruik je precies? De 2.0 of de originele?
De Communication Print (1.0), maar ik ben in de weekenden met een custom component bezig die ook met het Connectivity Board (2.0) kan werken, inclusief automatische detectie van de Ducobox, voor beide.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
{
  "domain": "duco",
  "name": "Duco Ventilation",
  "version": "1.1.0",
  "documentation": "https://github.com/USER/ha-duco/blob/main/README.md",
  "issue_tracker": "https://github.com/USER/ha-duco/issues",
  "codeowners": ["@USER"],
  "config_flow": true,
  "requirements": ["aiohttp>=3.8.0", "zeroconf-asyncio>=0.10.0"],
  "iot_class": "local_polling",
  "zeroconf": [
    {
      "type": "_http._tcp.local.",
      "name": "duco*"
    },
    {
      "type": "_https._tcp.local.",
      "name": "duco*"
    }
  ],
  "loggers": ["custom_components.duco"],
  "dependencies": [],
  "after_dependencies": [],
  "integration_type": "device",
  "platforms": [
    "sensor",
    "binary_sensor",
    "switch",
    "button",
    "number",
    "select",
    "text",
    "fan"
  ]
}


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# API Versions
API_V1: Final = "v1"
API_V2: Final = "v2"

# Default values
DEFAULT_SCAN_INTERVAL: timedelta = timedelta(seconds=60)
# Delays for V1 API sequential fetching
DELAY_V1_NODE_FETCH_INFO_CONFIG: Final = 0.2
DELAY_V1_NODE_FETCH_INTER_NODE: Final = 0.1
DELAY_V1_COMMAND_FINISH: Final = 1.0

# --- API V1 Specific Constants ---
V1_ENDPOINT_BOARD_INFO = "/board_info"
V1_ENDPOINT_BOXINFO_GET = "/boxinfoget"
V1_ENDPOINT_ECOINFO_GET = "/ecoinfoget"
V1_ENDPOINT_NODELIST = "/nodelist"
V1_ENDPOINT_NODEINFO_GET = "/nodeinfoget" # ?node={id}
V1_ENDPOINT_NODECONFIG_GET = "/nodeconfigget" # ?node={id}
V1_ENDPOINT_NODECONFIG_SET = "/nodeconfigset" # ?node={id}&para={name}&value={val}
V1_ENDPOINT_BOXCONFIG_GET = "/boxconfigget"
V1_ENDPOINT_BOXCONFIG_SET = "/boxconfigset" # ?mod={mod}&para={name}&value={val}
V1_ENDPOINT_ECOCONFIG_GET = "/ecoconfigget"
V1_ENDPOINT_ECOCONFIG_SET = "/ecoconfigset" # ?mod={mod}&para={name}&value={val}
V1_ENDPOINT_IPCONFIG_GET = "/ipconfigget"
V1_ENDPOINT_IPCONFIG_SET = "/ipconfigset" # ?mod={mod}&para={name}&value_A={a}...
V1_ENDPOINT_NODE_SET_OPERSTATE = "/nodesetoperstate" # ?node={id}&value={state}
V1_ENDPOINT_NODE_SET_OVERRULE = "/nodesetoverrule" # ?node={id}&value={percentage}
V1_ENDPOINT_NODE_RESET = "/nodereset" # ?node={id}
V1_ENDPOINT_NODE_LOAD_DEFAULTS = "/nodeloaddefaults" # ?node={id}
V1_ENDPOINT_NODE_SET_SHOW = "/nodeshow" # ?node={id}&value={0/1}
V1_ENDPOINT_NODE_SET_LINKMODE = "/nodesetlinkmode" # ?node={id}&value={0/1}
V1_ENDPOINT_NODE_SET_PARENT = "/nodesetparent" # ?node={id}&parent={parent_id}
V1_ENDPOINT_NODE_SET_ASSO = "/nodesetasso" # ?node={id}&asso={asso_id}
V1_ENDPOINT_BOX_SET_TIME = "/boxsettime" # ?time={unix_ts}
V1_ENDPOINT_BOX_SET_INSTALL = "/boxsetinstall" # ?set={0/1}
V1_ENDPOINT_BOX_CLEAR_NETWORK = "/boxclearnetwork"
V1_ENDPOINT_BOX_SET_CALIBRATION = "/boxsetcalib" # ?set={StartCalib/StopCalib/etc}
V1_ENDPOINT_BOARD_RESET = "/boardreset"
V1_CANCEL_OVERRULE_VALUE: Final = 255
KEY_ACTION_SUCCESS_V1 = "SUCCESS" # Case-insensitive check needed
KEY_ACTION_FAILED_V1 = "FAILED" # Case-insensitive check needed

# --- API V2 Specific Constants ---
V2_PATH_INFO = "/info"
V2_PATH_INFO_NODES = "/info/nodes"
V2_PATH_INFO_NODE_DETAIL = "/info/nodes/{node_id}"
V2_PATH_CONFIG = "/config" # GET ?module=... or PATCH body
V2_PATH_CONFIG_NODE_DETAIL = "/config/nodes/{node_id}" # GET or PATCH body
V2_PATH_ACTION = "/action" # POST body
V2_PATH_ACTION_NODE = "/action/nodes/{node_id}" # POST body
KEY_ACTION_RESULT_V2 = "ActionResult"

# V2 Action Names (Check against OpenAPI spec for precision)
V2_ACTION_SET_VENTILATION_STATE = "SetVentilationState"
V2_ACTION_SET_OVERRULE = "SetOverrule" # Confirm this is the action name
V2_ACTION_RESET_NODE = "ResetNode" # Confirm this is the action name
V2_ACTION_LOAD_DEFAULTS_NODE = "LoadDefaultsNode" # Confirm this is the action name
V2_ACTION_SET_SHOW = "SetShow" # Confirm this is the action name
V2_ACTION_SET_LINK_MODE = "SetLinkMode" # Confirm this is the action name
V2_ACTION_SET_PARENT = "SetParent" # Confirm this is the action name
V2_ACTION_SET_ASSOCIATION = "SetAssociation" # Confirm this is the action name
V2_ACTION_SET_TIME = "SetTime" # Confirm this is the action name
V2_ACTION_SET_INSTALLER_MODE = "SetInstallerMode" # Confirm this is the action name
V2_ACTION_CLEAR_NETWORK = "ClearNetwork" # Confirm this is the action name
V2_ACTION_SET_CALIBRATION = "SetCalibrationMode" # Confirm this is the action name
V2_ACTION_REBOOT = "Reboot" # Confirm this is the action name

# V2 Module Names (for PATCH /config) - Add more as needed based on spec/testing
V2_MODULE_TIMING = "Timing"
V2_MODULE_NETWORK = "Network"
V2_MODULE_MQTT = "MQTT"
V2_MODULE_IDENTIFICATION = "Identification"
V2_MODULE_FAN = "Fan"
V2_MODULE_NIGHTBOOST = "NightBoost"
V2_MODULE_VENTCOOL = "VentilationCooling" # Check exact casing/name in spec
V2_MODULE_NODECONFIG_VENT_AUTO = "VentilationAUTO"
V2_MODULE_NODECONFIG_VENT_MANUAL = "VentilationMANUAL"
V2_MODULE_NODECONFIG_SENSOR_CO2 = "SensorCO2"
V2_MODULE_NODECONFIG_SENSOR_RH = "SensorRH"
V2_MODULE_NODECONFIG_TEMP = "SensorTEMP"
V2_MODULE_NODECONFIG_NODE = "Node" # Check spec for parameters like Capacity
V2_MODULE_NODECONFIG_LOCATION = V2_MODULE_IDENTIFICATION # Location is often under Identification

# --- Common Internal Action Names ---
ACTION_SET_OPER_STATE = "SetOperState"
ACTION_SET_OVERRULE = "SetOverrule"
ACTION_RESET_NODE = "ResetNode"
ACTION_LOAD_DEFAULTS_NODE = "LoadDefaultsNode"
ACTION_SET_SHOW = "SetShow"
ACTION_SET_LINK_MODE = "SetLinkMode"
ACTION_SET_PARENT = "SetParent"
ACTION_SET_ASSOCIATION = "SetAssociation"
ACTION_SET_TIME = "SetTime"
ACTION_SET_INSTALLER_MODE = "SetInstallerMode"
ACTION_CLEAR_NETWORK = "ClearNetwork"
ACTION_SET_CALIBRATION = "SetCalibration"
ACTION_REBOOT_DEVICE = "RebootDevice"


etc.

[ Voor 117% gewijzigd door |sWORDs| op 11-04-2025 00:03 ]

Te Koop:24 Core Intel Upgradeset


Acties:
  • 0 Henk 'm!

  • marnie
  • Registratie: November 2016
  • Laatst online: 00:14
|sWORDs| schreef op donderdag 10 april 2025 @ 23:58:
[...]
De Communication Print (1.0), maar ik ben in de weekenden met een custom component bezig die ook met het Connectivity Board (2.0) kan werken, inclusief automatische detectie van de Ducobox, voor beide.
Geweldig initiatief!
Ik heb beide bordjes hier, maar gebruik nog de oude Communication Print met HA. Reden:ik stuur met Rest Command de RHsetup (Relatieve vochtigheid) aan (zodat de wtw niet onnodig optoert als het buiten regent). Zou ik met jouw code de RHSetpoint kunnen wijzigen met de Connectivity Board?
VB rest_command.yaml:
YAML:
1
2
duco_box_rhsetpoint_60:
  url: "http://192.168.x.x/nodeconfigset?node=58&para=RHSetpoint&value=60"

Ik heb even in de scripten op https://github.com/c***t/ha-duco/tree/main gezocht maar kon geen RHSetpoint vinden.

2/1-kap 1988 | Extra vloer en muurisolatie | HR++ glas | WTW: Duco Energie Comfort 325 2-zones | WP: Adlar II 6kW | CV wonen: Jaga Strada Hybrid DBH, slapen: traditionele radiatoren | Solar: Enphase oost/west/zuid 4.2kVA | Homeassistant


Acties:
  • 0 Henk 'm!

  • |sWORDs|
  • Registratie: Maart 2000
  • Laatst online: 06-05 10:21

|sWORDs|

vSphere/ESXi

Ik verwacht dat dit bij mij een PATCH naar https://IP/v2/config/nodes/138 zou zijn (UCRH als node 138), maar zo ver ben ik nog lang niet. Ik heb Gemini de code laten genereren en ik ga die eerst helemaal werkend maken met de Communication Print. Daarna ga ik een Connectivity Board lenen of bestellen en dat aan de praat maken.

Maar als je een GET op jouw node doet zou je het moeten kunnen zien en dan met PATCH aanpassen.

Probeer dit anders eens:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
// Importeer benodigde libraries
const axios = require('axios');
const https = require('https');
const bonjour = require('bonjour')(); // Initialize bonjour

// --- Configuratie ---
const FETCH_DELAY_MS = 250; // Wachttijd in ms tussen het opvragen van details per node
const MDNS_TIMEOUT_MS = 5000; // Max wachttijd (in ms) voor het vinden van apparaat via mDNS

// --- Hulpfunctie voor vertraging ---
function delay(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

// --- Functie om Duco apparaat te vinden via mDNS ---
function findDucoDevice(timeout) {
    console.log(`Zoeken naar Duco apparaat via mDNS (type: _https._tcp.local, max ${timeout / 1000}s)...`);
    return new Promise((resolve, reject) => {
        let timer;
        const browser = bonjour.find({ type: 'https' }, (service) => {
            // Controleer of de servicenaam begint met 'duco_' (zoals in duco_ABCDEF)
            if (service.name && service.name.toLowerCase().startsWith('duco_')) {
                console.log(`Duco apparaat gevonden: ${service.name} op host ${service.host}:${service.port}`);
                clearTimeout(timer); // Stop de timeout
                browser.stop(); // Stop met browsen
                resolve(service.host); // Geef de gevonden hostname terug (bv. duco_ABCDEF.local)
            }
        });

        // Start een timer voor de timeout
        timer = setTimeout(() => {
            console.error(`Timeout: Geen Duco apparaat gevonden binnen ${timeout / 1000} seconden.`);
            browser.stop();
            reject(new Error('mDNS discovery timeout'));
        }, timeout);

        // Optioneel: Handel fouten tijdens het browsen af
        browser.on('error', (err) => {
            clearTimeout(timer);
            console.error("Fout tijdens mDNS Browse:", err);
            browser.stop();
            reject(err);
        });
    });
}

// --- Functie om node details op te halen en te loggen ---
//    (Neemt nu apiClient en baseURL als argumenten)
async function fetchAndLogNodeDetails(apiClient, baseURL) {
    console.log(`\n--- Starten met ophalen van node-details van ${baseURL} ---`);

    // Stap 1: Haal de lijst met alle nodes op
    let nodes = [];
    const nodesListEndpoint = '/info/nodes';
    console.log(`\n==================================================`);
    console.log(`Stap 1: Ophalen node lijst via GET ${nodesListEndpoint}`);
    console.log(`--------------------------------------------------`);
    try {
        const response = await apiClient.get(nodesListEndpoint);
        if (response.data && Array.isArray(response.data.Nodes)) {
            nodes = response.data.Nodes;
            console.log(`Status Code: ${response.status}`);
            console.log(`${nodes.length} node(s) gevonden.`);
        } else {
            console.error("Fout: Response bevat geen geldige 'Nodes' array.");
            console.error("Ontvangen data:", JSON.stringify(response.data, null, 2));
            return;
        }
    } catch (error) {
        console.error(`!!! Fout bij ophalen node lijst (${nodesListEndpoint}):`);
        // ... (error logging zoals in vorige script) ...
        if (error.response) { console.error("Status Code:", error.response.status); console.error("Response Data:", JSON.stringify(error.response.data, null, 2)); }
        else if (error.request) { console.error("Geen response ontvangen:", error.request); }
        else { console.error("Error message:", error.message); }
        return;
    }
    console.log(`==================================================\n`);


    if (nodes.length === 0) {
        console.log("Geen nodes gevonden om details voor op te halen.");
        return;
    }

    // Stap 2: Loop door elke gevonden node en haal details op
    console.log(`Stap 2: Ophalen details per node...`);
    for (const nodeInfo of nodes) {
        const nodeId = nodeInfo.Node;

        if (typeof nodeId !== 'number') {
            console.warn(`\n!!! Ongeldige node ID gevonden, overslaan:`, nodeInfo);
            continue;
        }

        console.log(`\n##################################################`);
        console.log(`# Verwerken Node ID: ${nodeId}`);
        console.log(`##################################################`);

        const infoEndpoint = `/info/nodes/${nodeId}`;
        const configEndpoint = `/config/nodes/${nodeId}`;

        // Haal Info op
        console.log(`\n--- Ophalen Info voor Node ${nodeId} (GET ${infoEndpoint}) ---`);
        try {
            const infoResponse = await apiClient.get(infoEndpoint);
            console.log("Status Code:", infoResponse.status);
            console.log("Info Response Data:");
            console.log(JSON.stringify(infoResponse.data, null, 2));
        } catch (error) {
            console.error(`!!! Fout bij ophalen info voor Node ${nodeId} (${infoEndpoint}):`);
            // ... (error logging) ...
            if (error.response) { console.error("Status Code:", error.response.status); console.error("Response Data:", JSON.stringify(error.response.data, null, 2)); }
            else if (error.request) { console.error("Geen response ontvangen."); }
            else { console.error("Error message:", error.message); }
        }

        await delay(FETCH_DELAY_MS);

        // Haal Config op
        console.log(`\n--- Ophalen Config voor Node ${nodeId} (GET ${configEndpoint}) ---`);
        try {
            const configResponse = await apiClient.get(configEndpoint);
            console.log("Status Code:", configResponse.status);
            console.log("Config Response Data:");
            console.log(JSON.stringify(configResponse.data, null, 2));
        } catch (error) {
            console.error(`!!! Fout bij ophalen config voor Node ${nodeId} (${configEndpoint}):`);
            // ... (error logging) ...
            if (error.response) { console.error("Status Code:", error.response.status); console.error("Response Data:", JSON.stringify(error.response.data, null, 2)); }
             else if (error.request) { console.error("Geen response ontvangen."); }
             else { console.error("Error message:", error.message); }
        }

         await delay(FETCH_DELAY_MS);
    }

    console.log(`\n--- Ophalen van alle node-details voltooid ---`);
}


// --- Hoofd uitvoer functie ---
async function runScript() {
    let discoveredHost;
    try {
        discoveredHost = await findDucoDevice(MDNS_TIMEOUT_MS);
    } catch (error) {
        console.error("Kon Duco apparaat niet vinden via mDNS. Script stopt.", error.message);
        bonjour.destroy(); // Sluit bonjour netjes af
        return; // Stop het script
    }

    // Construct Base URL en API Client nu we de host weten
    const baseURL = `https://${discoveredHost}/v2/`;

    const httpsAgent = new https.Agent({
        rejectUnauthorized: false // Blijft nodig voor .local hostnames
    });

    const apiClient = axios.create({
        baseURL: baseURL,
        timeout: 10000,
        httpsAgent: httpsAgent,
        headers: {
            'Content-Type': 'application/json'
            // GEEN Authenticatie header hier
        }
    });

    // Roep de functie aan die de node details ophaalt
    await fetchAndLogNodeDetails(apiClient, baseURL);

    // Sluit bonjour netjes af aan het einde
    bonjour.destroy();
    console.log("Bonjour service afgesloten.");
}

// --- Script uitvoeren ---
runScript();


Hoe te gebruiken:
* Zorg dat je Node.js geïnstalleerd hebt.
* Sla de code op in een bestand, bijvoorbeeld duco_mdns_reader.js.
* Open je terminal of command prompt in de map waar je het bestand hebt opgeslagen.
* Installeer de benodigde libraries: npm install axios bonjour
* Voer het script uit: node duco_mdns_reader.js
Het script zal nu eerst proberen het Duco-apparaat op je netwerk te vinden via mDNS. Als dat lukt, gebruikt het de gevonden hostname om vervolgens (zonder authenticatie) de lijst met nodes op te halen en daarna per node de info- en configuratiedetails.

Ik heb trouwens alleen maar mechanische ventilatie met twee boxsensoren (CO2/RH), als ik wat verder ben kan ik wel wat hulp gebruiken van mensen met WTW, ventielen, kleppen, bestuurbare ventilatiestrips en RF bediening/ruimtesensoren.

[ Voor 150% gewijzigd door |sWORDs| op 11-04-2025 16:40 ]

Te Koop:24 Core Intel Upgradeset


Acties:
  • +1 Henk 'm!

  • |sWORDs|
  • Registratie: Maart 2000
  • Laatst online: 06-05 10:21

|sWORDs|

vSphere/ESXi

Ik heb nog wat bugs te fixen en een paar functies om toe te voegen, maar dit is hoever ik met v1 gekomen ben:
v1
Afbeeldingslocatie: https://tweakers.net/i/alFTglOZyGpmkdBr_8b_rHeqewE=/100x75/filters:strip_exif()/f/image/Pic1OFKM1Lnx9WM4yJXMPfI0.png?f=fotoalbum_smallAfbeeldingslocatie: https://tweakers.net/i/jrLL67iIIude9SQRtHlxc_sGMk4=/100x75/filters:strip_exif()/f/image/b6JV182Ky0URFMSYFNNDBaZf.png?f=fotoalbum_smallAfbeeldingslocatie: https://tweakers.net/i/CfvUw70jsQiEni0fU1q923Ii6eY=/100x75/filters:strip_exif()/f/image/5IVWdEzT6OIqJG25gXsk3L91.png?f=fotoalbum_small
Afbeeldingslocatie: https://tweakers.net/i/kwtVVHxs_r6HcrZ4rb_g7UpoJv8=/100x75/filters:strip_exif()/f/image/E4k7HP1K8pGwYxd82Y4wEigV.png?f=fotoalbum_smallAfbeeldingslocatie: https://tweakers.net/i/b2Gqi2jl1Xvyw7PGqHKrYWRBQUY=/100x75/filters:strip_exif()/f/image/9WlN9ZAsnFzFuQN0i7hfwQdo.png?f=fotoalbum_smallAfbeeldingslocatie: https://tweakers.net/i/DjKIbqmyxKfLuyCBFNSHy-GOyGs=/100x75/filters:strip_exif()/f/image/5j31dLrsuJby1rrzCDVqGJMn.png?f=fotoalbum_small
Afbeeldingslocatie: https://tweakers.net/i/_mMzgj5CoURC_IxeZ5V5vA8q1R8=/100x75/filters:strip_exif()/f/image/cWhApzg9fqHJ7pFGUNxmdVgr.png?f=fotoalbum_smallAfbeeldingslocatie: https://tweakers.net/i/PVEWYokQgo5u9Wf57aXL2zL29NU=/100x75/filters:strip_exif()/f/image/k4KHHRH12UzVS3mpJ1qumc0L.png?f=fotoalbum_smallAfbeeldingslocatie: https://tweakers.net/i/QYHaT_Gshna89h1jdT8WcvbYnbM=/100x75/filters:strip_exif()/f/image/FvHKFbj2iXfgjWSlayUHAT8j.png?f=fotoalbum_small
Afbeeldingslocatie: https://tweakers.net/i/-vfF7eriwZ0-Dez-7S4cj_Jfr7E=/100x75/filters:strip_exif()/f/image/OFRXFVFZxCy9GHE5QobrTkgk.png?f=fotoalbum_smallAfbeeldingslocatie: https://tweakers.net/i/Mtus8v1WIAENfq98ShzXgH9oHKA=/100x75/filters:strip_exif()/f/image/uCVXmldkYtjqkWp9Yl15Gs8W.png?f=fotoalbum_smallAfbeeldingslocatie: https://tweakers.net/i/ASFhXcmzYxGR3jh4SK_gXs0iCN0=/100x75/filters:strip_exif()/f/image/AJa2RkbKERff5XfSRnIQrGJj.png?f=fotoalbum_small
Afbeeldingslocatie: https://tweakers.net/i/gxQxZGPy0GoyECSk_Gr2grjJbqw=/100x75/filters:strip_exif()/f/image/irnjtTXHrBb5mqo9v202WLvB.png?f=fotoalbum_small

Te Koop:24 Core Intel Upgradeset


Acties:
  • +1 Henk 'm!

  • kokx
  • Registratie: Augustus 2006
  • Laatst online: 06-05 08:08

kokx

WIN

Mocht iemand hier nog iets in zoeken, voor ESPhome heb ik een component geschreven om met alleen een ESP32 een Duco box te besturen.

Documentatie is hier te vinden.

Gezien het niet gemerged is in ESPhome, moet je het component nog wel toevoegen:

code:
1
2
3
4
external_components:
  - source: github://pr#7993
    components:
      - duco

[ Voor 9% gewijzigd door kokx op 05-05-2025 20:26 ]


Acties:
  • 0 Henk 'm!

  • roelofz
  • Registratie: Oktober 2002
  • Laatst online: 06-05 12:36
Dit klinkt heel interessant, lijkt wel een nieuwe wereld.
Even wat gezocht hiernaar maar nog niet direct duidelijk wat je er allemaal mee kan en voor moet doen.

Hoe begin en stap je in deze wereld (begrijpelijk als je niet hier een hele howto neer wilt leggen)?
Pagina: 1