Rekuperator Particle+ od Thesslagreen

Czy ktoś z Was integrował dodatkowo Particle+ od Thesslagreen?
Aktualnie udało mi się bez problemu pobrać dane z rekuperatora (800) poprzez modbus divider + eflin, jednak dostęp do rejestrów Particle+ jest niedostępny.

Pobrałeś dane z rejestrów przez Mobus ale dostęp do rejestrów jest niedostępny, coś mi tu nie pasuje, prosze rozwiń to. Podaj dane do dokumentacji Modbus rekuperatora.

Particle+ to taki dodatkowy moduł od Thesslagreen.

Instalator założył mi Modbus Divider (Thessla Green) do którego wpięty jest rekuperator, Particle+ (Thessla Green) oraz panel Air++. Dwa pozostałe gniazda są “Terminowane”.

Używając EW11 jestem w stanie wpiąć się do gniazda w Modbus Divider i pobierać dane w opisany powyżej sposób. Aby komunikacja działała, Air++ musi być wypięty niestety (czy tak powinno być?)

Chcąc dopisać funkcje np. powiadomienie o wymianie filtra cząstek w Particle, zakładam że powinienem się kierować tym dokumentem (https://thesslagreen.com/wp-content/uploads/MODBUS_USER_Particle_08.2021.01.pdf) opisującym komunikację.
Niestety urządzenie nie przekazuje żadnych komunikacji do utworzonych encji w HA.

W związku z tym:

  • Czy ktoś ma jakieś doświadczenia w komunikacji z Particlem?
  • Czy ktoś ma doświadczenia z tym Modbus divider i może podpowiedzieć czego się po nim spodziewać w tym kontekście?
  • A może lepiej dokupić drugi EW11 i podpiąć go do Particle+ dedykowany? (Z tym że tak też póki co nie działa)

@folwarczny czyli teraz wszystkie urządzenia są podpięte do Modbus Divider i są sterowane przez panel Air++, zarówno rekuperator jak i oczyszczacz powietrza Particle+, parametry tych urządzeń są widoczne na panelu Air++, tak? Z opisu wynikałoby, że to panel Air++ jest masterem w komunikacji Modbus RTU.
Jeżeli podłączasz EW11 to zakładam, że w tym momencie panel Air++ jest odłączony od magistrali Modbus, wtedy bez problemu możesz odczytać dane z rekuperatura ale nie możesz odczytać danych z oczyszczacza, tak?

Dokładnie tak - w AirPlus widać oba urządzenia

Przy próbach wziąłeś pod uwagę, że oba urządzenia mogą mieć różne DeviceID (slave) ?

Tak Particle wg. dokumentacji powinien mieć Slave jako 30

Ja, próbując to ogarnąć, na początek próbowałbym się połączyć z każdy z urządzeń z osobna ( z pominięciem Modbus Divider). Następnie z dwoma poprzez Modbus Divider z wyłączonym Air++.
Można też spróbować “podsłuchać” wszystkie ramki raw na magistrali Air++ i z dokumentacją protokołu ModbusRTU zobaczyć co tam lata.
Ze względu na to, że w modbusie może być tylko jeden master (którym prawdopodobnie jest Air++) łatwo nie będzie.

edit… nie przeczytałem nigdzie jaka jest transmisja pomiędzy Air++ <> Modbus Divider (wcale nie musi to być modbus) i oba jako komplet stanowią mastera dla podłączonych jednostek.

@folwarczny mam nadzieję, że poniższa wiadomość pomoże Ci w rozwiązaniu problemu.
To jest w miarę dokładny opis mojej integracji, ale jeżeli masz jakieś pytania to śmiało pytaj.

Mój system składa się z Rekuperatora serii 4, particle+, Modbus devicer’a i wyświetlacza Air++.
Wszystkie komponenty działają równocześnie i pomimo, iż Reku i particle są podpięte przez Modbus do HA to Air++ nadal jest dostępny normalnie.

Używam do integracji dwóch modułów RS485-ETH od WaveShare - https://www.waveshare.com/rs485-to-eth.htm
dostępnych na Allegro i w wielu sklepach.

Reku i Particle+ posiadają dodatkowe gniazdo RJ45 umożliwiające integracje równolegle do pracy z Air++ oraz Modbus deviderem.

Poniżej kompletna konfiguracja dla mojego układu z wszystkimi rejestrami które uznałem za sensowne, ale jeżeli coś jeszcze Cię interesuje, to poniższa lista powinna łatwo wytłumaczyć jak zaciągnąć co chcesz, czytając ściągawkę od Thessla Green, którą wrzuciłeś powyżej.

Tutaj mój panel rekuperacji/filtra, czerpiący garściami z integracji innych na tym forum i poza nim.
Yaml mogę również przesłać do wglądu.

Tutaj config modbus:

modbus:
  - name: rs485particle
    type: rtuovertcp
    host: <adres IP>
    port: 8889
    delay: 2
    sensors:
      - name: Particle+ PM2.5 out
        address: 50
        count: 1
        data_type: int16
        device_class: pm25
        input_type: holding
        scale: 1
        scan_interval: 10
        slave: 31
        unit_of_measurement: µg/m³
        state_class: measurement
        unique_id: particle_pm2.5
      - name: Particle+ fan speed
        address: 64
        scan_interval: 5
        data_type: int16
        unit_of_measurement: '%'
        slave: 31
        input_type: holding
        unique_id: particle_fanspeed
      - name: Particle+ pre filter
        address: 4114
        scan_interval: 3600
        data_type: int16
        unit_of_measurement: '%'
        slave: 31
        input_type: holding
        unique_id: particle_prefilter
      - name: Particle+ HEPA filter
        address: 4115
        scan_interval: 3600
        data_type: int16
        unit_of_measurement: '%'
        slave: 31
        input_type: holding
        unique_id: particle_hepafilter
      - name: Particle+ Operational
        slave: 31
        address: 41
        scan_interval: 1
        input_type: holding
        unique_id: particle_operarational
    switches:
      - name: Particle+ ON/OFF
        address: 16
        slave: 31
        write_type: holding
        command_on: 1
        command_off: 0
        verify:
        unique_id: particle_onoff
  - name: rs485
    type: rtuovertcp
    host: <adres IP>
    port: 8888
    delay: 2
    sensors:
      - name: Incoming air temperature
        address: 16
        count: 1
        data_type: int16
        device_class: temperature
        input_type: input
        precision: 2
        scale: 0.1
        scan_interval: 10
        slave: 11
        unit_of_measurement: °C
        state_class: measurement
        unique_id: recu_outside_temp
      - name: Room supply temperature
        address: 17
        count: 1
        data_type: int16
        device_class: temperature
        input_type: input
        precision: 2
        scale: 0.1
        scan_interval: 10
        slave: 11
        unit_of_measurement: °C
        state_class: measurement
        unique_id: recu_supply_temp
      - name: Room exhaust temperature
        address: 18
        count: 1
        data_type: int16
        device_class: temperature
        input_type: input
        precision: 2
        scale: 0.1
        scan_interval: 10
        slave: 11
        unit_of_measurement: °C
        state_class: measurement
        unique_id: recu_exhaust_temp
      - name: Server room temperature
        address: 22
        count: 1
        data_type: int16
        device_class: temperature
        input_type: input
        precision: 2
        scale: 0.1
        scan_interval: 10
        slave: 11
        unit_of_measurement: °C
        state_class: measurement
        unique_id: recu_ambient_temp
      - name: Air supply flow
        address: 256
        count: 1
        data_type: int16
        input_type: holding
        precision: 2
        scale: 1
        scan_interval: 10
        slave: 11
        unit_of_measurement: m³
        state_class: measurement
        unique_id: recu_supply_flow
      - name: Air exhaust flow
        address: 257
        count: 1
        data_type: int16
        input_type: holding
        precision: 2
        scale: 1
        scan_interval: 10
        slave: 11
        unit_of_measurement: m³
        state_class: measurement
        unique_id: recu_exhaust_flow
      - name: Rekuperator speedmanual
        address: 4210
        scan_interval: 5
        data_type: int16
        unit_of_measurement: '%'
        slave: 11
        input_type: holding 
    binary_sensors:
      - name: Ventilation bypass
        slave: 11
        address: 9
        scan_interval: 10
        input_type: coil
        device_class: opening
        unique_id: recu_bypass
      - name: Fan Operational
        slave: 11
        address: 11
        scan_interval: 1
        input_type: coil
        device_class: moving
        unique_id: recu_fansON
    switches:
      - name: Airing
        address: 4224
        slave: 11
        write_type: holding
        command_on: 7
        command_off: 0
        verify:
        unique_id: recu_airing
      - name: Open windows
        address: 4224
        slave: 11
        write_type: holding
        command_on: 10
        command_off: 0
        verify:
        unique_id: recu_open_windows
      - name: Away mode
        address: 4224
        slave: 11
        write_type: holding
        command_on: 11
        command_off: 0
        verify:
        unique_id: recu_away_mode
      - name: Fireplace mode
        slave: 11
        write_type: holding
        scan_interval: 5
        address: 4224
        command_on: 2
        command_off: 0
        verify:
        unique_id: recu_fireplace
      - name: Operating mode - Auto
        address: 4208
        slave: 11
        write_type: holding
        scan_interval: 1
        command_on: 0
        command_off: 1  
        verify:
        unique_id: recu_mode_auto
      - name: Bypass
        address: 4320
        slave: 11
        write_type: holding
        scan_interval: 5
        command_on: 0
        command_off: 1
        verify:
        unique_id: recu_bypass
      - name: Winter mode
        address: 4209
        slave: 11
        write_type: holding
        scan_interval: 5
        command_on: 1
        command_off: 0  
        verify:
        unique_id: recu_winter
      - name: Recu ON/OFF
        address: 4387
        slave: 11
        write_type: holding
        scan_interval: 5
        command_on: 1
        command_off: 0
        verify:
        unique_id: recu_onoff

Domyślam się, że pewnie jest jakiś mądry sposób na wykonanie tego wszystkiego z jednym modułem RS485-ETH oraz podejściem poprzez Modbus devider, ale nie miałem wiedzy/umiejętności jak to zrobić a konsultacja z niezwykle pomocnym serwisantem z Thessli umocniła mnie w przekonanie, że nie ma sensu kombinować za 80 PLN.

Polecam się na przyszłość, jeżeli masz jakieś pytania.

Czołem!!

1 polubienie

WOW - świetny materiał - dziękuję! Zabieram się za testy :slight_smile:

Tego nie rozumiem bo przecież wszystko jest wpięte do Modbus devider. Czy to oznacza, że zarówno rekuperator jak i oczyszczacz, ma dwa porty umożliwiające podłączenie do Modbus?

Czy parametry transmisji RS485 dla obu konwerterów są takie same?

@folwarczny
Nie ma sprawy!! Pomagam, jak i mnie pomagano… :laughing:

Jeżeli jesteś wzrokowcem to tutaj świetny filmik (od @Jabol) youtube kilkakrotnie już cytowany na tym forum , odnośnie integracji Thessla Green - #164 Komunikacja z rekuperatorem Thessla Green z użyciem MODBUS'a i integracja z Home Assistant - YouTube

Jest w nim kilka niedomówień i brakujących informacji, jak przykładowo skąd wziąć temperaturę wyrzutni skoro Reku jej nie podaje (@Jabol), ale to pomniejsze kwestie dalej w procesie integracji.
Ogólnie bardzo pomocny materiał!

Jest tam ujęcie panelu z opisami portów do Air++ i ModRTU równocześnie. Wspominam o tym, bo z tego co rozumiem był to jeden z Twoich głównych problemów.
Tutaj screen:
image

@macek:
#1: Dokładnie tak, ma nawet więcej niż 2 porty, ale nas interesują tylko 2 - jeden dla Air++ a drugi Modbus.
#2: Co rozumiesz przez parametry transmisji? Z tego co pamiętam to wszystkie ustawienia z wyjątkiem portów (patrz YAML) są takie same.

Wygląda na to że udało się przy użyciu Dividera dostać do rejestrów Particle, ale prawdopodobnie jest on uszkodzony - mam wizytę serwisu w przyszłym tygodniu - zobaczymy co to da :slight_smile:

Cześć :wink:
Aby wziąć temperature wywiewu trzeba by montować termometr, a nie każdy chce to robić :wink:

Ja też, ale z powodu padniętych łożysk wentylatora - błąd S30 (nie startuje wiatrak nawiewu).
Niemniej jednak, na pewno wypytam Pana o dodatkowe szczegóły integracji.
Może uda się to jakoś uprościć u mnie.

Dodatkowo upiękniłem i wzmocniłem trochę sensory opisane powyżej, aby nie były tak podatne na tworzenie zupełnie bzdurnych odczytów, kiedy coś się złego dzieje z centralą lub jest wyłączona.

sensor:
      - name: "Ventilation energy efficiency"
        unique_id: "recu_energy_efficiency"
        icon: "mdi:percent"
        unit_of_measurement: "%"
        state: >-
          {% if is_state('binary_sensor.ventilation_bypass', 'off') and is_state('binary_sensor.fan_operational', 'on') %}
            {% set t1 = states('sensor.incoming_air_temperature') | float %}
            {% set t2 = states('sensor.room_supply_temperature') | float %}
            {% set t3 = states('sensor.room_exhaust_temperature') | float %}
            {{ (((t2 - t1) / (t3 - t1)) * 100|float) | round(2, default=0) }}
          {% elif is_state('binary_sensor.ventilation_bypass', 'on') and is_state('binary_sensor.fan_operational', 'on') %}
            0
          {% endif %}
        availability: "{{ is_state('binary_sensor.ventilation_bypass', ['on', 'off']) and is_state('binary_sensor.fan_operational', 'on') }}"

      - name: "Ventilation supply flow rate"
        unique_id: "recu_supply_flow_rate_percent"
        icon: "mdi:percent"
        unit_of_measurement: "%"
        state: >
          {% set flowN = states('sensor.air_supply_flow') | float %}
          {{ ((flowN * 100) / 420 |float) | round(2, default=0) }}

      - name: "Ventilation exhaust flow rate"
        unique_id: "recu_exhaust_flow_rate_percent"
        icon: "mdi:percent"
        unit_of_measurement: "%"
        state: >
          {% set flowW = states('sensor.air_exhaust_flow') | float %}
          {{ ((flowW * 100) / 420|float) | round(2, default=0) }}

      - name: "Ventilation power recovery"
        unique_id: "recu_power_recovery"
        icon: "mdi:counter"
        unit_of_measurement: "W"
        state: >-
          {% if is_state('binary_sensor.ventilation_bypass', 'off') and is_state('binary_sensor.fan_operational', 'on') %}
            {% set strumienN = states('sensor.air_supply_flow') | float %}
            {% set tcz = states('sensor.incoming_air_temperature') | float %}
            {% set tn = states('sensor.room_supply_temperature') | float %}
            {% if states('sensor.incoming_air_temperature')|float < states('sensor.air_supply_flow')|float %}
                {{ ((((tn - tcz) * strumienN * 1200) / 3600)|float) | round(2, default=0) }}
            {% else %}
                {{ (((((tn - tcz) * strumienN * 1200) / 3600) * -1)|float) | round(2, default=0) }}
            {% endif %}
          {% elif is_state('binary_sensor.ventilation_bypass', 'on') and is_state('binary_sensor.fan_operational', 'on') %}
            0
          {% endif %}
        availability: "{{ is_state('binary_sensor.ventilation_bypass', ['on', 'off']) and is_state('binary_sensor.fan_operational', 'on') }}"
  1. Dodałem warunek dla włączonej centrali (praca wentylatorów)
  2. Dodałem sprawdzenie dostępności i działania bypasu oraz centrali - availability
  3. Użyłem Elif dla rozpoznania 0 wartości, tak aby odrzucać zupełnie wartości kiedy nie ma bypassu lub centrala nie pracuje.

Zrobiłem to ponieważ, po tym, jak centrala przestałą pracować w nocy, a czujniki nadal tworzył dane, miałem pełno odczytów z gatunku -1000% sprawności oraz +/-7000W odzysku.
@Jabol - możesz przemyśleć aktualizację Twojego kodu dla ludzi w filmie.

Zastanawiam się, czy przesłać linka do tej części w drugim temacie integracji, ale nie chce robić bałaganu.

1 polubienie