Anyone using Duco Ventilation Communication Print Ethernet module?

The boxinfoget command cannot be accessed within 10sec of triggering the rest. Not sure why.

So you need to set different timeouts per rest command for that one to work. I didn’t need that data.

ok thanks

I’ll figure out how to set different timeouts

not sure on how other pulled power though?

The Power value is not present for the WtW systems (type D), only in the MV systems (type C).

I’m trying to connect my new Duco system the same way as described here. But it looks like I have to use different url’s. Like this: https://192.168.1.129/info/nodes/1

Did someone here have the same issue? I have a new Ducobox Energy Comfort with Communication print. Webpage is working, but I can’t find the right url’s/calls.

The result of this url https://192.168.1.129/nodeinfoget?node=1 is {“Code”:10,“Result”:“FAILED”}

Have you tried http:// ? Mine isn’t accessible through https://

SW VERSION: 16036.11.1.0 is shown on mine at bottom of home page.

Can’t find the SW version but the public api version is 2.0.

http is not working, I have to use https. I can get the with value templates like this: {{ value_json.Ventilation.FlowLvlTgt.Val }} with the resource url /info/nodes/1 for example.

Now I have to find out how to POST any data. According to the scripts files it have to be something like /action/nodes/1, but don’t know yet how add the parameters to this.

Please see: https://github.com/miezie/ducoboxopenapi-spec/blob/86616b5130ffa469bfa4519c2eafda86f25f9345/Public%20DUCO%20API%202.0%20-%20api-definition.yaml

Requested it at Duco.
All you need for post. Can you share your code?

Also I have the leveling of IAQ percentages:
IAQ Index
100% - >80% - Excellent
80% - >60% - Good
60% - >40% - Temporary acceptable
<40% - Bad

The API changed with the new Connectivity Board and strategic approach of Duco.

2 Likes

This is what I have now:

# Duco
input_select:
  ducobox_mode:
    name: DucoBox stand
    icon: mdi:target
    options:
      - "AUTO"
      - "CNT1"
      - "CNT2"
      - "CNT3"
      - "MAN1"
      - "MAN2"
      - "MAN3"

rest:
  - resource: https://192.168.1.129/info/nodes/1
    scan_interval: 15
    verify_ssl: false
    sensor:
      - name: DucoBox
        unique_id: ducobox
        value_template: "{{ value_json.Ventilation.State.Val }}"
        icon: mdi:fan
        json_attributes:
          - ventilation
          - mode
      - name: DucoBox Ventilatie
        unique_id: ducobox_target
        value_template: "{{ value_json.Ventilation.FlowLvlTgt.Val }}"
        state_class: measurement
        unit_of_measurement: "%"
      - name: DucoBox Relatieve Vochtigheid
        unique_id: ducobox_humidity
        value_template: "{{ value_json.Sensor.IaqRh.Val }}"
        device_class: humidity
        state_class: measurement
        unit_of_measurement: "%"


rest_command:
  ducobox_mode_auto:
    url: "https://192.168.1.129/nodesetoperstate?node=1&value=AUTO"
  ducobox_mode_cnt1:
    url: "https://192.168.1.129/nodesetoperstate?node=1&value=CNT1"
  ducobox_mode_cnt2:
    url: "https://192.168.1.129/nodesetoperstate?node=1&value=CNT2"
  ducobox_mode_cnt3:
    url: "https://192.168.1.129/nodesetoperstate?node=1&value=CNT3"
  ducobox_mode_man1:
    # url: "https://192.168.1.129/nodesetoperstate?node=1&value=MAN1"
    url: "https://192.168.1.129/action/nodes/1?Enum=MAN1"
  ducobox_mode_man2:
    url: "https://192.168.1.129/nodesetoperstate?node=1&Enum=MAN2"
  ducobox_mode_man3:
    url: "https://192.168.1.129/nodesetoperstate?node=1&value=MAN3"

Should it be more like this?

 ducobox_mode_man3:
    # url: "https://192.168.1.129/nodesetoperstate?node=1&value=MAN3"
    url: "https://192.168.1.129/action/nodes/1"
    method: POST
    payload: '{"Action":"SetVentilationState","Val":"MAN3"}'
    verify_ssl: false

You could fool around with https://editor.swagger.io/ :slight_smile:

Thanks! First one is working!

Awesome! Looking forward to the code. Saves me and the community loads of time.

Hmm, any idea why they came with a new model of the Communication Print which is now the Connectivity Board? One of the advantages I see is that the new Board has Wifi and Ethernet built in, the older Communication Print was Ethernet only.

Might be more powerful. But I don’t know except for the wifi. I do know that I waited for it since I learned about the new board…

I’m about to do a big renovation next year, also going to install mechanical ventilation. Currently considering the Ducobox Energy Premium (2 zone system). For most of the DIY Duco integrations into HA I see that people are able to set the fan mode (auto, manual etc).
I’m really curious whether you guys are also able to control the zone valve. I’ve read about some smart automations that have motion detection in the toilet and turn the fan to 100% after a visit :wink: However if the zone valve is set to the other zone at that moment it doesn’t make much sense.

Controlling the zone valve would also allow for non-Duco sensors to be integrated. The Duco sensors are like 200€ apiece, and it get’s expensive very quickly when you want to add a sensor to kitchen, living room, bathroom and all bedrooms.

Hope you guys keep posting the progress :slight_smile:

Controlling the zone valve would also allow for non-Duco sensors to be integrated. The Duco sensors are like 200€ apiece, and it get’s expensive very quickly when you want to add a sensor to kitchen, living room, bathroom and all bedrooms.

I think I just found a (somewhat) cheaper solution. Duco sells these RF switchboxes for 120€. They can be configured to a zone, and by closing a contact on the switchbox the system will ventilate that zone. You would need 1 per zone, and just close the contact with a shelly. Then you can use your own sensors and link them to the shelly via HA.

anyone knows how to do that? i.e. setting different timeouts per rest command?
as apparently boxinfoget command cannot be accessed within 10sec of triggering the rest

I was able to set different timeouts to get the boxinfo data as well. Very convenient to see how much bypass is open and when filter change is due, can even get an alarm on HA for it.

1 Like
platform: template
fans:
  ducobox:
    unique_id: "ducobox_ventilatie_control"
    friendly_name: "Ducobox"
    value_template: >
      {% if states('sensor.ducobox') !=  'AUTO' %}
        on
      {% else %}
        off
      {% endif %}
    turn_on:
      - service: rest_command.ducobox_mode_change
        data:
          nodeId: "1"
          state: MAN3
    turn_off:
      - service: rest_command.ducobox_mode_change
        data:
          nodeId: "1"
          state: AUTO
    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') == "CNT1" %}
        Permanent manual 1
      {% elif states('sensor.ducobox') ==  "CNT2" %}
        Permanent manual 2
      {% elif states('sensor.ducobox') == "CNT3" %}
        Permanent manual 3
      {% elif states('sensor.ducobox') ==  "MAN1" %}
        Manual 1
      {% elif states('sensor.ducobox') == "MAN2" %}
        Manual 2
      {% elif states('sensor.ducobox') ==  "MAN3" %}
        Manual 3
      {% else %}
        Auto
      {% endif %}
    set_preset_mode:
      - service: rest_command.ducobox_mode_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
            {% else %}
              AUTO
            {% endif %}

And a template fan…. Way better then drop downs and automations…

Example rest command:


ducobox_mode_change:
  url: https://[[address]/action/nodes/{{ nodeId }}
  method: POST
  headers:
    accept: "application/json"
    content_type: "application/json"
  payload: '{"Action":"SetVentilationState","Val":"{{ state }}"}'
  verify_ssl: false

Created for the new print, but you should get the hang of it…

And for the new print you can read all the nodes at once… strongly advised.


resource: https://[address]/info/nodes
scan_interval: 2
verify_ssl: false
sensor:
  - unique_id: ducobox_node1_state
    name: Ducobox - Status
    value_template: "{{ value_json['Nodes'][0]['Ventilation']['State']['Val'] }}"
  - unique_id: ducobox_node2_state
    name: Ventilatie berging - status
    value_template: "{{ value_json['Nodes'][1]['Ventilation']['State']['Val'] }}"
  - unique_id: ducobox_node3_state
    name: Ventilatie woonkamer - status
    value_template: "{{ value_json['Nodes'][2]['Ventilation']['State']['Val'] }}"
  - unique_id: ducobox_node4_state
    name: Ventilatie slaapkamer - status
    value_template: "{{ value_json['Nodes'][3]['Ventilation']['State']['Val'] }}"
  - unique_id: ducobox_node5_state
    name: Ventilatie technische ruimte - status
    value_template: "{{ value_json['Nodes'][4]['Ventilation']['State']['Val'] }}"
  - unique_id: ducobox_node6_state
    name: Ventilatie keuken - status
    value_template: "{{ value_json['Nodes'][5]['Ventilation']['State']['Val'] }}"
  - unique_id: ducobox_node7_state
    name: Ventilatie kantoor - status
    value_template: "{{ value_json['Nodes'][6]['Ventilation']['State']['Val'] }}"
  - unique_id: ducobox_node8_state
    name: Ventilatie toilet - status
    value_template: "{{ value_json['Nodes'][7]['Ventilation']['State']['Val'] }}"
  - unique_id: ducobox_node9_state
    name: Ventilatie logeerkamer - status
    value_template: "{{ value_json['Nodes'][8]['Ventilation']['State']['Val'] }}"
  - unique_id: ducobox_node10_state
    name: Ventilatie badkamer - status
    value_template: "{{ value_json['Nodes'][9]['Ventilation']['State']['Val'] }}"
  - unique_id: ducobox_node2_iaq
    name: Ventilatie berging - IAQ
    value_template: "{{ value_json['Nodes'][1]['Sensor']['IaqRh']['Val'] }}"
    device_class: aqi
    unit_of_measurement: "%"
  - unique_id: ducobox_node3_iaq
    name: Ventilatie woonkamer - IAQ
    value_template: "{{ value_json['Nodes'][2]['Sensor']['IaqCo2']['Val'] }}"
    device_class: aqi
    unit_of_measurement: "%"
  - unique_id: ducobox_node4_iaq
    name: Ventilatie slaapkamer - IAQ
    value_template: "{{ value_json['Nodes'][3]['Sensor']['IaqCo2']['Val'] }}"
    device_class: aqi
    unit_of_measurement: "%"
  - unique_id: ducobox_node5_iaq
    name: Ventilatie technische ruimte - IAQ
    value_template: "{{ value_json['Nodes'][4]['Sensor']['IaqRh']['Val'] }}"
    device_class: aqi
    unit_of_measurement: "%"
  - unique_id: ducobox_node6_iaq
    name: Ventilatie keuken - IAQ
    value_template: "{{ value_json['Nodes'][5]['Sensor']['IaqCo2']['Val'] }}"
    device_class: aqi
    unit_of_measurement: "%"
  - unique_id: ducobox_node7_iaq
    name: Ventilatie kantoor - IAQ
    value_template: "{{ value_json['Nodes'][6]['Sensor']['IaqCo2']['Val'] }}"
    device_class: aqi
    unit_of_measurement: "%"
  - unique_id: ducobox_node8_iaq
    name: Ventilatie toilet - IAQ
    value_template: "{{ value_json['Nodes'][7]['Sensor']['IaqCo2']['Val'] }}"
    device_class: aqi
    unit_of_measurement: "%"
  - unique_id: ducobox_node9_iaq
    name: Ventilatie logeerkamer - IAQ
    value_template: "{{ value_json['Nodes'][8]['Sensor']['IaqCo2']['Val'] }}"
    device_class: aqi
    unit_of_measurement: "%"
  - unique_id: ducobox_node10_iaq
    name: Ventilatie badkamer - IAQ
    value_template: "{{ value_json['Nodes'][9]['Sensor']['IaqRh']['Val'] }}"
    device_class: aqi
    unit_of_measurement: "%"
  - 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_node2_FlowLvlTgt
    name: Ventilatie berging - Flow Level Target
    value_template: "{{ value_json['Nodes'][1]['Ventilation']['FlowLvlTgt']['Val'] }}"
    unit_of_measurement: "%"
  - unique_id: ducobox_node3_FlowLvlTgt
    name: Ventilatie woonkamer - Flow Level Target
    value_template: "{{ value_json['Nodes'][2]['Ventilation']['FlowLvlTgt']['Val'] }}"
    unit_of_measurement: "%"
  - unique_id: ducobox_node4_FlowLvlTgt
    name: Ventilatie slaapkamer - Flow Level Target
    value_template: "{{ value_json['Nodes'][3]['Ventilation']['FlowLvlTgt']['Val'] }}"
    unit_of_measurement: "%"
  - unique_id: ducobox_node5_FlowLvlTgt
    name: Ventilatie technische ruimte - Flow Level Target
    value_template: "{{ value_json['Nodes'][4]['Ventilation']['FlowLvlTgt']['Val'] }}"
    unit_of_measurement: "%"
  - unique_id: ducobox_node6_FlowLvlTgt
    name: Ventilatie keuken - Flow Level Target
    value_template: "{{ value_json['Nodes'][5]['Ventilation']['FlowLvlTgt']['Val'] }}"
    unit_of_measurement: "%"
  - unique_id: ducobox_node7_FlowLvlTgt
    name: Ventilatie kantoor - Flow Level Target
    value_template: "{{ value_json['Nodes'][6]['Ventilation']['FlowLvlTgt']['Val'] }}"
    unit_of_measurement: "%"
  - unique_id: ducobox_node8_FlowLvlTgt
    name: Ventilatie toilet - Flow Level Target
    value_template: "{{ value_json['Nodes'][7]['Ventilation']['FlowLvlTgt']['Val'] }}"
    unit_of_measurement: "%"
  - unique_id: ducobox_node9_FlowLvlTgt
    name: Ventilatie logeerkamer - Flow Level Target
    value_template: "{{ value_json['Nodes'][8]['Ventilation']['FlowLvlTgt']['Val'] }}"
    unit_of_measurement: "%"
  - unique_id: ducobox_node10_FlowLvlTgt
    name: Ventilatie badkamer - Flow Level Target
    value_template: "{{ value_json['Nodes'][9]['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_node2_TimeStateRemain
    name: Ventilatie berging - tijd status resterend
    value_template: "{{ value_json['Nodes'][1]['Ventilation']['TimeStateRemain']['Val'] }}"
  - unique_id: ducobox_node3_TimeStateRemain
    name: Ventilatie woonkamer - tijd status resterend
    value_template: "{{ value_json['Nodes'][2]['Ventilation']['TimeStateRemain']['Val'] }}"
  - unique_id: ducobox_node4_TimeStateRemain
    name: Ventilatie slaapkamer - tijd status resterend
    value_template: "{{ value_json['Nodes'][3]['Ventilation']['TimeStateRemain']['Val'] }}"
  - unique_id: ducobox_node5_TimeStateRemain
    name: Ventilatie technische ruimte - tijd status resterend
    value_template: "{{ value_json['Nodes'][4]['Ventilation']['TimeStateRemain']['Val'] }}"
  - unique_id: ducobox_node6_TimeStateRemain
    name: Ventilatie keuken - tijd status resterend
    value_template: "{{ value_json['Nodes'][5]['Ventilation']['TimeStateRemain']['Val'] }}"
  - unique_id: ducobox_node7_TimeStateRemain
    name: Ventilatie kantoor - tijd status resterend
    value_template: "{{ value_json['Nodes'][6]['Ventilation']['TimeStateRemain']['Val'] }}"
  - unique_id: ducobox_node8_TimeStateRemain
    name: Ventilatie toilet - tijd status resterend
    value_template: "{{ value_json['Nodes'][7]['Ventilation']['TimeStateRemain']['Val'] }}"
  - unique_id: ducobox_node9_TimeStateRemain
    name: Ventilatie logeerkamer - tijd status resterend
    value_template: "{{ value_json['Nodes'][8]['Ventilation']['TimeStateRemain']['Val'] }}"
  - unique_id: ducobox_node10_TimeStateRemain
    name: Ventilatie badkamer - tijd status resterend
    value_template: "{{ value_json['Nodes'][9]['Ventilation']['TimeStateRemain']['Val'] }}"
  - unique_id: ducobox_node1_TimeStateEnd
    name: Ducobox - tijd status eind
    value_template: "{{ value_json['Nodes'][0]['Ventilation']['TimeStateEnd']['Val'] }}"
  - unique_id: ducobox_node2_TimeStateEnd
    name: Ventilatie berging - tijd status eind
    value_template: "{{ value_json['Nodes'][1]['Ventilation']['TimeStateEnd']['Val'] }}"
  - unique_id: ducobox_node3_TimeStateEnd
    name: Ventilatie woonkamer - tijd status eind
    value_template: "{{ value_json['Nodes'][2]['Ventilation']['TimeStateEnd']['Val'] }}"
  - unique_id: ducobox_node4_TimeStateEnd
    name: Ventilatie slaapkamer - tijd status eind
    value_template: "{{ value_json['Nodes'][3]['Ventilation']['TimeStateEnd']['Val'] }}"
  - unique_id: ducobox_node5_TimeStateEnd
    name: Ventilatie technische ruimte - tijd status eind
    value_template: "{{ value_json['Nodes'][4]['Ventilation']['TimeStateEnd']['Val'] }}"
  - unique_id: ducobox_node6_TimeStateEnd
    name: Ventilatie keuken - tijd status eind
    value_template: "{{ value_json['Nodes'][5]['Ventilation']['TimeStateEnd']['Val'] }}"
  - unique_id: ducobox_node7_TimeStateEnd
    name: Ventilatie kantoor - tijd status eind
    value_template: "{{ value_json['Nodes'][6]['Ventilation']['TimeStateEnd']['Val'] }}"
  - unique_id: ducobox_node8_TimeStateEnd
    name: Ventilatie toilet - tijd status eind
    value_template: "{{ value_json['Nodes'][7]['Ventilation']['TimeStateEnd']['Val'] }}"
  - unique_id: ducobox_node9_TimeStateEnd
    name: Ventilatie logeerkamer - tijd status eind
    value_template: "{{ value_json['Nodes'][8]['Ventilation']['TimeStateEnd']['Val'] }}"
  - unique_id: ducobox_node10_TimeStateEnd
    name: Ventilatie badkamer - tijd status eind
    value_template: "{{ value_json['Nodes'][9]['Ventilation']['TimeStateEnd']['Val'] }}"
1 Like

Thanks for this. Would you mind sharing your Duco related config file for the new API’s entirely? Still figuring out templates and rest services in HA…