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.