elupus / esphome-nibe

Esphome components for nibe heat pumps
MIT License
68 stars 20 forks source link

Virtual RMU not passing temperature to Nibe F1145 heat pump #78

Closed accomco closed 1 month ago

accomco commented 1 month ago

Most importantly @elupus, enormous thanks for both this component and your Nibe Uplink integration. The latter provided us with years of sterling service and we really appreciate your time and dedication.

So like others, having been obliged to transfer to MyUplink, we decided to implement a local solution using esphome-nibe.

The transfer has been seamless, but the one feature we’d really like to get back is the ability to pass back a temperature reading to the heat pump (which we did before using the smart thermostats feature). The virtual RMU was just what we wanted.

Unfortunately, we cannot get the heat pump to recognise the virtual RMU temperature we're trying to pass to it.

Below is our configuration, which builds fine (‘system: 3’ in place of ‘address: RMU40_S3’ per your convo with @svollebregt).

The ‘passback’ temperature (from HA) appears correctly in a climate entity within the esphome integration, but I cannot get this to reflect in the heat pump. On the F1145, S3 and RMU for S3 has been enabled within service menu 5.2.

I’ve also tried this adapting the code, enabling RMU for S1. In this case, the passback temperature in the esphome integration becomes the BT50 room sensor temperature.

I have also tried enabling and disabling the menu 1.9.4 ‘Control Room sensor syst 1’ option.

I've a suspicion that one of the elements in the config might be conflicting. Apologies if I’m making an obvious mistake, but any advice on getting this to work - as @OnlyRobin has managed - would be really welcome!

substitutions:
  name: "nibe-gw"
  friendly_name: Nibe_GW

esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  min_version: 2024.6.0
  name_add_mac_suffix: false

esp32:
  board: m5stack-atom
  framework:
    type: arduino

# Enable logging
logger:
  baud_rate: 0

# Enable Home Assistant API
api:

ota:
  - platform: esphome
    password: !secret ota_password

wifi:
  power_save_mode: none
  ssid: !secret wifi_ssid
  password: !secret wifi_password

# Optional manual IP
  manual_ip:
    static_ip: 192.168.0.XXX
    gateway: 192.168.0.1
    subnet: 255.255.255.0

external_components:
  - source: 
      type: git
      url: https://github.com/elupus/esphome-nibe.git
    components: [ nibegw ]

uart:
  id: my_uart
  rx_pin: GPIO22
  tx_pin: GPIO19
  baud_rate: 9600

nibegw:

  # If you have a named uart instance, you can specify this here.
  uart_id: my_uart

  udp:
    # The target address(s) to send data to. May also be multicast addresses.
    target:
      - ip: 192.168.0.XXX
        port: 9999

    # List of source address to accept read/write from, may be empty for no filter, but
    # this is not recommended.
    source:
    #  - 192.168.255.254

    # Optional port this device will listen to to receive read requests. Defaults to 9999
    # read_port: 9999

    # Optional port this device will listen to to receive write request. Defaults to 10000
    # write_port: 10000

  acknowledge:
    - MODBUS40

    # Enable a dummy RMU40 accessory to receive updates
    # to certain registers faster. This should not be
    # enabled if you have an actual RMU40.
    - RMU40_S4

  # Constant replies to certain requests can be made
  constants:
    - address: MODBUS40
      token: ACCESSORY
      data: [
            0x0A, # MODBUS version low
            0x00, # MODBUS version high
            0x02, # MODBUS address?
      ]

    # Accessory version response
    - address: RMU40_S4
      token: ACCESSORY
      data: [
            0xEE, # RMU ?
            0x03, # RMU version low
            0x01, # RMU version high
      ]

    # Unknown response that nibepi uses
    - address: RMU40_S4
      token: RMU_DATA
      command: RMU_WRITE
      data: [
            0x63,
            0x00,
      ]

    # Constant fixed temperature to avoid pump going into alarm.
    - address: RMU40_S4
      token: RMU_WRITE
      data: [
            0x06, # Temperature
            0x14, # degrees low
            0x00, # degrees high
      ]
# Add a virtual RMU on S3
climate:
  - platform: nibegw
    name: s3
    system: 3
    sensor: current_temperature_s3

# Add a temperature sensor taken from home assistant to use for virtual RMU
sensor:
  - platform: homeassistant
    id: current_temperature_s3
    entity_id: sensor.nibe_passback_thermostat
elupus commented 1 month ago

Did you switch the mode of the cimate entity in home assistant from auto to heat cool?

accomco commented 1 month ago

Yes, I switched the climate entity which appears in esphome to Heat/Cool (without which it does not display a current_temperature attribute). The S1 climate entity created by esphome-nibe is on 'heat' - the pump rejects it being set to heat/cool. Any ideas?

image

elupus commented 1 month ago

Do you have 3 climate systems? To control any real temperature it need to be linked to an actual climate system on your pump.

A standard pump only has system 1. For extra climate systems you need stuff like ECS addon which has separate circulation pump.

So set it to run on system 1.

OnlyRobin commented 1 month ago

Hi @accomco

I have it like this,

# Accessory version response
- address: RMU40_S4
  token: ACCESSORY
  data: [
        0xEE, # RMU ?
        0x03, # RMU version low
        0x01, # RMU version high
  ]

# Unknown response that nibepi uses
- address: RMU40_S4
  token: RMU_DATA
  command: RMU_WRITE
  data: [
        0x63,
        0x00,
  ]

# Constant fixed temperature to avoid pump going into alarm.
- address: RMU40_S4
  token: RMU_WRITE
  data: [
        0x06, # Temperature
        0x14, # degrees low
        0x00, # degrees high
  ]

Add a virtual RMU on S1, if you have a real one choose system 2/3/4

climate:

Add a temperature sensor taken from home assistant to use for virtual RMU

svollebregt commented 1 month ago

For me it works, but I have set all instances for the RMU to S1 (response, sensor and acknowledge) and enabled RMU1 in my F1255.

accomco commented 1 month ago

Hi all, thanks very much for suggestions.

We only operate System 1, and I have previously tried the following config with the RMU enabled for S1 (other settings per previous post):


# Add a virtual RMU on S1
climate:
  - platform: nibegw
    name: s1
    system: 1
    sensor: current_temperature_s1

# Add a temperature sensor taken from home assistant to use for virtual RMU
sensor:
  - platform: homeassistant
    id: current_temperature_s1
    entity_id: sensor.nibe_passback_thermostat

With the above config, the pass back temperature is ignored, the pump uses the BT50 temperature, and the additional climate entity (Nibe_GW s1) shows the BT10 temperature.

I shall try @svollebregt suggestion (setting ‘response’ and ‘acknowledge’ to RMU40_S1) with the above config.

elupus commented 1 month ago

Dont add S1 system responses manually if you run a virtual rmu. They will interfere

accomco commented 1 month ago

Thanks @elupus. Can you help me out with what you mean by 'S1 system responses' please? Which of the elements in the 'Complete config' I should not include if I wish to use a virtual RMU?

elupus commented 1 month ago

You dont need any of the RMU40_XX constants.

accomco commented 1 month ago

Thanks again @elupus. Unfortunately still no joy! The RMU climate entity created by esphome is still showing the BT50 temperature reading, not the one I am passing to it. I have:

  1. Removed all RMU_40_XX constants from the config
  2. Enabled RMU on S1
  3. Turned off the 'control room sensor syst 1' in menu 1.9.4
  4. Verified that the pump is not alarming

System runs - seems to accept the virtual RMU exists - but does not accept the temperature reading from it.

Config is now:


substitutions:
  name: "nibe-gw"
  friendly_name: Nibe_GW

esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  min_version: 2024.6.0
  name_add_mac_suffix: false

esp32:
  board: m5stack-atom
  framework:
    type: arduino

# Enable logging
logger:
  baud_rate: 0

# Enable Home Assistant API
api:

ota:
  - platform: esphome
    password: !secret ota_password

wifi:
  power_save_mode: none
  ssid: !secret wifi_ssid
  password: !secret wifi_password

# Optional manual IP
  manual_ip:
    static_ip: 192.168.0.XXX
    gateway: 192.168.0.1
    subnet: 255.255.255.0

external_components:
  - source: 
      type: git
      url: https://github.com/elupus/esphome-nibe.git
    components: [ nibegw ]

uart:
  id: my_uart
  rx_pin: GPIO22
  tx_pin: GPIO19
  baud_rate: 9600

nibegw:

  # If you have a named uart instance, you can specify this here.
  uart_id: my_uart

  udp:
    # The target address(s) to send data to. May also be multicast addresses.
    target:
      - ip: 192.168.0.XXX
        port: 9999

    # List of source address to accept read/write from, may be empty for no filter, but
    # this is not recommended.
    source:
    #  - 192.168.255.254

    # Optional port this device will listen to to receive read requests. Defaults to 9999
    # read_port: 9999

    # Optional port this device will listen to to receive write request. Defaults to 10000
    # write_port: 10000

  acknowledge:
    - MODBUS40

# Add a virtual RMU on S1
climate:
  - platform: nibegw
    name: s1
    system: 1
    sensor: current_temperature_s1

# Add a temperature sensor taken from home assistant to use for virtual RMU
sensor:
  - platform: homeassistant
    id: current_temperature_s1
    entity_id: sensor.nibe_passback_thermostat

Log is showing esphome-nibe publishing the 'pass back' temp to the RMU (in this case 23.9), but that the S1 climate entity remains unaffected (in this case 24.8):

INFO ESPHome 2024.9.0
INFO Reading configuration /config/esphome/nibe-gw.yaml...
INFO Starting log output from 192.168.0.199 using esphome API
INFO Successfully connected to nibe-gw @ 192.168.0.XXX in 0.011s
INFO Successful handshake with nibe-gw @ 192.168.0.XXX in 0.027s
[14:07:54][I][app:100]: ESPHome version 2024.9.0 compiled on Sep 19 2024, 13:58:12
[14:07:54][C][wifi:600]: WiFi:
[14:07:54][C][wifi:428]:   Local MAC: 
[14:07:54][C][wifi:433]:   SSID: '[redacted]
[14:07:54][C][wifi:436]:   IP Address: 192.168.0.XXX
[14:07:54][C][wifi:440]:   BSSID: [redacted]
[14:07:54][C][wifi:441]:   Hostname: 'nibe-gw'
[14:07:54][C][wifi:443]:   Signal strength: -65 dB ▂▄▆█
[14:07:54][C][wifi:447]:   Channel: 6
[14:07:54][C][wifi:448]:   Subnet: 255.255.255.0
[14:07:54][C][wifi:449]:   Gateway: 192.168.0.1
[14:07:54][C][wifi:450]:   DNS1: 0.0.0.0
[14:07:54][C][wifi:451]:   DNS2: 0.0.0.0
[14:07:54][C][logger:185]: Logger:
[14:07:54][C][logger:186]:   Level: DEBUG
[14:07:54][C][logger:188]:   Log Baud Rate: 0
[14:07:54][C][logger:189]:   Hardware UART: UART0
[14:07:54][C][uart.arduino_esp32:151]: UART Bus 0:
[14:07:54][C][uart.arduino_esp32:152]:   TX Pin: GPIO19
[14:07:54][C][uart.arduino_esp32:153]:   RX Pin: GPIO22
[14:07:54][C][uart.arduino_esp32:155]:   RX Buffer Size: 256
[14:07:54][C][uart.arduino_esp32:157]:   Baud Rate: 9600 baud
[14:07:54][C][uart.arduino_esp32:158]:   Data Bits: 8
[14:07:54][C][uart.arduino_esp32:159]:   Parity: NONE
[14:07:54][C][uart.arduino_esp32:160]:   Stop bits: 1
[14:07:54][C][nibegw:165]: NibeGw Climate
[14:07:54][C][nibegw:166]:  Address: 0x19
[14:07:54][C][nibegw:167]:  Sensor: current_temperature_s1
[14:07:54][C][nibegw:571]: ClimateTraits:
[14:07:54][C][nibegw:572]:   [x] Visual settings:
[14:07:54][C][nibegw:574]:       - Max temperature: 30.5
[14:07:54][C][mdns:116]: mDNS:
[14:07:54][C][mdns:117]:   Hostname: nibe-gw
[14:07:54][C][esphome.ota:073]: Over-The-Air updates:
[14:07:54][C][esphome.ota:074]:   Address: 192.168.0.XXX:3232
[14:07:54][C][esphome.ota:075]:   Version: 2
[14:07:54][C][safe_mode:018]: Safe Mode:
[14:07:54][C][safe_mode:020]:   Boot considered successful after 60 seconds
[14:07:54][C][safe_mode:021]:   Invoke after 10 boot attempts
[14:07:54][C][safe_mode:023]:   Remain in safe mode for 300 seconds
[14:07:54][C][api:139]: API Server:
[14:07:54][C][api:140]:   Address: 192.168.0.XXX:6053
[14:07:54][C][api:144]:   Using noise encryption: NO
[14:07:54][C][homeassistant.sensor:030]: Homeassistant Sensor 'current_temperature_s1'
[14:07:54][C][homeassistant.sensor:030]:   State Class: ''
[14:07:54][C][homeassistant.sensor:030]:   Unit of Measurement: ''
[14:07:54][C][homeassistant.sensor:030]:   Accuracy Decimals: 1
[14:07:54][C][homeassistant.sensor:031]:   Entity ID: 'sensor.nibe_passback_thermostat'
[14:07:54][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:07:54][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:07:55][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:07:55][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:07:55][D][climate:396]: 's1' - Sending state:
[14:07:55][D][climate:399]:   Mode: HEAT_COOL
[14:07:55][D][climate:419]:   Current Temperature: 24.90°C
[14:07:55][D][climate:425]:   Target Temperature: nan°C
[14:07:55][D][nibegw:043]: UDP Packet with 37 bytes to send
[14:07:56][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:07:56][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:07:56][D][nibegw:043]: UDP Packet with 86 bytes to send
[14:07:57][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:07:57][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:07:57][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:07:57][D][nibegw:106]: Response to address: 0x19 token: 0x63 bytes: 6
[14:07:58][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:07:58][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:07:59][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:07:59][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:07:59][D][climate:396]: 's1' - Sending state:
[14:07:59][D][climate:399]:   Mode: HEAT_COOL
[14:07:59][D][climate:419]:   Current Temperature: 24.90°C
[14:07:59][D][climate:425]:   Target Temperature: nan°C
[14:07:59][D][nibegw:043]: UDP Packet with 37 bytes to send
[14:08:00][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:08:00][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:08:00][D][nibegw:043]: UDP Packet with 86 bytes to send
[14:08:01][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:08:01][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:08:01][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:08:01][D][nibegw:106]: Response to address: 0x19 token: 0x60 bytes: 0
[14:08:02][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:08:02][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:08:02][D][nibegw:043]: UDP Packet with 7 bytes to send
[14:08:03][I][nibegw:155]: Publishing to rmu: 0x19 temp: 23.900000 -> F6.00
[14:08:03][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:08:03][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:08:03][D][climate:396]: 's1' - Sending state:
[14:08:03][D][climate:399]:   Mode: HEAT_COOL
[14:08:03][D][climate:419]:   Current Temperature: 24.80°C
[14:08:03][D][climate:425]:   Target Temperature: nan°C
[14:08:03][D][nibegw:043]: UDP Packet with 37 bytes to send
[14:08:04][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:08:04][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:08:04][D][nibegw:043]: UDP Packet with 86 bytes to send
[14:08:05][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:08:05][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:08:05][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:08:05][D][nibegw:224]: Responding to rmu: 0x19 index: 0x6 data: F6.00
[14:08:05][D][nibegw:106]: Response to address: 0x19 token: 0x60 bytes: 7
[14:08:06][D][nibegw:043]: UDP Packet with 6 bytes to send
[14:08:06][D][nibegw:043]: UDP Packet with 6 bytes to send

F1145 running the latest Nibe firmware (9699R7). Might you have any ideas?

elupus commented 1 month ago

Have you turned on the flag to use room temperature to control the climate system in the pump?

accomco commented 1 month ago

Yes, I have tried with this flag (in menu 1.9.4) set to on, and also to off.

svollebregt commented 1 month ago

If you have both a BT50 and RMU40 it will by default use the BT50. I disconnected mine.

accomco commented 1 month ago

Great minds. I have just returned from doing just that, after which all works as it should. Thanks to all.