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!!
WOW - świetny materiał - dziękuję! Zabieram się za testy ![]()
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… ![]()
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:

@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 ![]()
Cześć ![]()
Aby wziąć temperature wywiewu trzeba by montować termometr, a nie każdy chce to robić ![]()
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') }}"
- Dodałem warunek dla włączonej centrali (praca wentylatorów)
- Dodałem sprawdzenie dostępności i działania bypasu oraz centrali - availability
- 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.
A w definicji modbus nazwa dla rekuperatora jest “reku”?
tak mi sie wydaje, tutaj caly yaml:
# Loads default set of integrations. Do not remove.
default_config:
# Load frontend themes from the themes folder
frontend:
themes: !include_dir_merge_named themes
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
http:
use_x_forwarded_for: true
trusted_proxies:
- 127.0.0.1
# REKUPERATOR MODBUS
modbus:
- type: tcp
host: 192.168.18.8
port: 502
name: reku
timeout: 5
delay: 2
sensors:
- name: "Rekuperator Temperatura Czerpnia"
slave: 10
address: 16
input_type: input
scan_interval: 29
data_type: int16
unit_of_measurement: °C
scale: 0.1
precision: 1
- name: "Rekuperator Temperatura Nawiew"
slave: 10
address: 17
input_type: input
scan_interval: 29
data_type: int16
unit_of_measurement: °C
scale: 0.1
precision: 1
- name: "Rekuperator Temperatura Wywiew"
slave: 10
address: 18
input_type: input
scan_interval: 29
data_type: int16
unit_of_measurement: °C
scale: 0.1
precision: 1
- name: "Rekuperator Temperatura za FPX"
slave: 10
address: 19
input_type: input
scan_interval: 29
data_type: int16
unit_of_measurement: °C
scale: 0.1
precision: 1
- name: "Rekuperator Temperatura PCB"
slave: 10
address: 22
input_type: input
data_type: int16
scan_interval: 59
unit_of_measurement: °C
scale: 0.1
precision: 1
- name: "Rekuperator Strumień nawiew"
slave: 10
address: 256
input_type: holding
scan_interval: 2
data_type: int16
unit_of_measurement: m3/h
scale: 1
precision: 1
- name: "Rekuperator Strumień wywiew"
slave: 10
address: 257
input_type: holding
scan_interval: 2
data_type: int16
unit_of_measurement: m3/h
scale: 1
precision: 1
- name: "Rekuperator lato zima"
scan_interval: 11
data_type: int16
slave: 10
address: 4209
input_type: holding
- name: "Rekuperator Bypass"
scan_interval: 11
data_type: int16
slave: 10
address: 4320
input_type: holding
- name: "Rekuperator tryb pracy"
scan_interval: 6
data_type: int16
slave: 10
address: 4208
input_type: holding
- name: "Rekuperator speedmanual"
scan_interval: 5
data_type: int16
unit_of_measurement: "%"
slave: 10
address: 4210
input_type: holding
- name: "Rekuperator fpx flaga"
scan_interval: 29
data_type: int16
unit_of_measurement: ""
slave: 10
address: 4192
input_type: holding
- name: "Rekuperator FPX tryb"
scan_interval: 29
data_type: int16
unit_of_measurement: ""
slave: 10
address: 4198
input_type: holding
- name: "Rekuperator Alarm"
scan_interval: 63
slave: 10
data_type: int16
address: 8192
input_type: holding
unit_of_measurement: ""
- name: "Rekuperator Error"
scan_interval: 63
slave: 10
address: 8193
data_type: int16
input_type: holding
unit_of_measurement: ""
- name: "Rekuperator FPX zabezpieczenie termiczne"
scan_interval: 63
slave: 10
address: 8208
data_type: int16
input_type: holding
unit_of_measurement: ""
- name: "Rekuperator Awaria Wentylatora Nawiewu"
scan_interval: 63
slave: 10
address: 8222
data_type: int16
input_type: holding
unit_of_measurement: ""
- name: "Rekuperator Awaria Wentylatora Wywiewu"
scan_interval: 63
slave: 10
address: 8223
data_type: int16
input_type: holding
unit_of_measurement: ""
- name: "Rekuperator Awaria CF Nawiewu"
scan_interval: 63
slave: 10
address: 8330
data_type: int16
input_type: holding
unit_of_measurement: ""
- name: "Rekuperator Awaria CF Wywiewu"
scan_interval: 63
slave: 10
address: 8331
data_type: int16
input_type: holding
unit_of_measurement: ""
- name: "Rekuperator Wymiana Filtrów"
scan_interval: 63
slave: 10
address: 8444
data_type: int16
input_type: holding
unit_of_measurement: ""
binary_sensors:
- name: "Rekuperator Silownik bypassu"
scan_interval: 21
slave: 10
address: 9
- name: "Rekuperator Potwierdzenie pracy"
scan_interval: 1
slave: 10
address: 11
switches:
- name: "Rekuperator Wietrzenie"
scan_interval: 1
slave: 10
address: 4224
command_on: 7
command_off: 0
verify:
- name: "Rekuperator Pusty Dom"
scan_interval: 5
slave: 10
address: 4224
command_on: 11
command_off: 0
verify:
- name: "Rekuperator bypass"
scan_interval: 7
slave: 10
address: 4320
command_on: 0
command_off: 1
verify:
- name: "Rekuperator Kominek"
scan_interval: 5
slave: 10
address: 4224
command_on: 2
command_off: 0
verify:
- name: "Rekuperator Okna"
scan_interval: 5
slave: 10
address: 4224
command_on: 10
command_off: 0
verify:
- name: "Rekuperator ON/OFF"
scan_interval: 5
slave: 10
address: 4387
command_on: 1
command_off: 0
verify:
- name: "Rekuperator mode"
scan_interval: 1
slave: 10
address: 4208
command_on: 0
command_off: 1
verify:
- name: "Rekuperator zima"
scan_interval: 7
slave: 10
address: 4209
command_on: 1
command_off: 0
verify:
utility_meter:
rekuperator_odzysk_energii_godzina:
source: sensor.rekuperator_odzyskana_energia
cycle: hourly
rekuperator_odzysk_energii_dzien:
source: sensor.rekuperator_odzyskana_energia
cycle: daily
rekuperator_odzysk_energii_miesiac:
source: sensor.rekuperator_odzyskana_energia
cycle: monthly
rekuperator_odzysk_energii_rok:
source: sensor.rekuperator_odzyskana_energia
cycle: yearly
template:
sensor:
- name: "Rekuperator Sprawność"
unique_id: "sensor.rekuperator_sprawnosc"
icon: "mdi:percent"
unit_of_measurement: "%"
state: >-
{% if is_state('binary_sensor.rekuperator_silownik_bypassu', 'off') %}
{% set t1 = states('sensor.rekuperator_temperatura_czerpnia') | float %}
{% set t2 = states('sensor.rekuperator_temperatura_nawiew') | float %}
{% set t3 = states('sensor.rekuperator_temperatura_wywiew') | float %}
{{ (((t2 - t1) / (t3 - t1)) * 100|float) | round(2, default=0) }}
{% else %}
0
{% endif %}
- name: "Rekuperator Wysterowanie Nawiew"
unique_id: "sensor.rekuperator_wysterowanie_nawiew"
icon: "mdi:percent"
unit_of_measurement: "%"
state: >
{% set flowN = states('sensor.rekuperator_strumien_nawiew') | float %}
{{ ((flowN * 100) / 320 |float) | round(2, default=0) }}
- name: "Rekuperator Wysterowanie wywiew"
unique_id: "sensor.rekuperator_wysterowanie_wywiew"
icon: "mdi:percent"
unit_of_measurement: "%"
state: >
{% set flowW = states('sensor.rekuperator_strumien_wywiew') | float %}
{{ ((flowW * 100) / 320|float) | round(2, default=0) }}
- name: "Rekuperator Odzyskana Moc"
unique_id: "sensor.rekuperator_odzyskana_moc"
icon: "mdi:counter"
unit_of_measurement: "W"
state: >-
{% if is_state('binary_sensor.rekuperator_silownik_bypassu', 'off') %}
{% set strumienN = states('sensor.rekuperator_strumien_nawiew') | float %}
{% set tcz = states('sensor.rekuperator_temperatura_czerpnia') | float %}
{% set tn = states('sensor.rekuperator_temperatura_nawiew') | float %}
{% if states('sensor.rekuperator_temperatura_czerpnia')|float < states('sensor.rekuperator_strumien_nawiew')|float %}
{{ ((((tn - tcz) * strumienN * 1200) / 3600)|float) | round(2, default=0) }}
{% else %}
{{ (((((tn - tcz) * strumienN * 1200) / 3600) * -1)|float) | round(2, default=0) }}
{% endif %}
{% else %}
0
{% endif %}
sensor:
- platform: integration
source: sensor.rekuperator_odzyskana_moc
name: rekuperator_odzyskana_energia
unit_prefix: k
round: 3
EDIT:
ok sorki, mialem zle entity…nie wiem jak ja to przeoczylem
powinno byc: number.rekuperator_predkosc
zamiast input_boolean.test
Hej
Mam podpiete reku do modbusa przez wpiety elfin ew11 wifi, czy zeby polaczyc tez particle’a potrzebuje rowniez drugi taki moduł i bedzie to hulać? Posiadam oczywiscie modbus divider
Pzdr
tak potrzebujesz 2 - ja tak mam i działa.




