Modbus connection to Aqotec - No Response received from the remote unit/Unable to decode response

Dear all,

I have been struggling for days with the connection of our district heating transfer station using Modbus.
With QModMaster I can successfully read data from it, but with modbus from Homeassistant it doesn’t work.

  • I’m using a Waveshare Modus TCP to RTU converter
  • It’s an Aqotec RM360 controller
  • I need the Heat consumption, it should be Modbus addr 43750, float according to the Vendor documentation
  • With QModMaster from my PC I can successfully read the needed data

configuration.yaml:

modbus:
  - name: fernw
    type: rtuovertcp
    host: 10.1.1.12
    port: 502
    delay: 1
    timeout: 5
    retries: 5
    retry_on_empty: true
    message_wait_milliseconds: 1000
    close_comm_on_error: false
    sensors:
      - name: fernw_heatmeter
        unit_of_measurement: kWh
        slave: 1
        address: 43750
        data_type: float32
        count: 2
        scan_interval: 10
        input_type: input

Error Message from home-assistant.log:
DEBUG (SyncWorker_6) [homeassistant.components.modbus.modbus] Pymodbus: fernw: Modbus Error: [Input/Output] No Response received from the remote unit/Unable to decode response

Have anyone an idea what’s going wrong here?

Hello @NicoEmm,

I’ve now got an Aqotec RM360 installed and would like to integrate it into my Home Assistant.

Could you please share your hardware/software setup how to read out the heat consumption?

Were you able to pass the data to HA?

Thanks in advance!

Hei guys contact me pls I am in contact with the supplier. I got an extended List (excel) and integrated it into home assistant since 6 months +. You need an Ethernet cable in the station - i can send some pictures private. Also you need to enable DHCP and Modbus in the station (i got the service code). Where are you living?

3 Likes

Here some parameters:

We changed them to:
773: Automatisch

To enable the MODBUS:

Write me for the service code :slight_smile:

2 Likes

Hello, I’ve got Modbus connected via Serial, but can’t figure out sensor data to setup HomeAssistant.

@Sweti3 Could you please send me your modbus configuration yaml?

Hi again,

just in case someone is trying the same: I just managed to connect Aqotec RM360 to HomeAssistant via serial modbus RTU using the COM A interface.

Initially the device address was set to something above 2000, thus it can’t be larger then 255. After setting a new value I was able to get and write data to registers.

Hi @Sweti3, can you share the extended List?
I am planning to integrate the Rm360 into homeassistant via modbus RTU with the help of a ESP home.

I have managed this over Modbus TCP. Following the instructions:
RM360:

  1. Enter the service code

  2. Adjust the parameters:
    773-776 - whatever you need
    777: 502
    914: TCP/IP
    Under I/O you can check, if the TCP packets are transmitted

  3. (optional) check if the connection is successfully established using a Modbus Client with following settings:

Home Assistant:

  1. add the following line in configuration. yaml:
#Modbus
modbus: !include modbus.yaml
  1. Create a file modbus.yaml:
# TCP connection
- name: Heating
  type: tcp
  host: 192.168.1.26
  port: 502
  delay: 3
  timeout: 2

  sensors:
    - name: HeatMeter
      unit_of_measurement: kWh
      slave: 1
      address: 43750
      data_type: float32
      scan_interval: 10
      device_class: energy
  1. Restart HA, go to Settings → Devices → Entities and search for HeatMeter

Just delete the following parameters from your config:

    retries: 5
    retry_on_empty: true
    message_wait_milliseconds: 1000
    close_comm_on_error: false
    input_type: input
    count: 2

Hi @Sweti3
Do i need to buy anything to connect via eternet cable (an adaptor or something)?
My router is next to heating system to i can fairly easy bring ethernet to rm360.
How do i get the service code?

Best Regards
Brijesh

Hi @JFSolution
Did you manage to get this integerated into Home Assistant via ESP Home?
can you shareb me some refernce to modbus RTU to buy?
Best Regards
Brijesh

Hei - you just need to go on the RJ45 port on the RM360 (behind the locked front (with the key)).

Service code I send you via Message:)

For anybody interested, I’d like to share my Modbus TCP configuration for the Aqotec RM360. Feel free to use it as a template and adjust to your preferences. The template in configuration.yaml is mostly for adjusting the decimal places. Please note that the hardware configuration can be a bit different in your case, therefore I recommend to compare the values with the readings from RM360 display and the wiring diagram.

Modbus.yaml:

# TCP connection
- name: Heating
  type: tcp
  host: 192.168.1.26
  port: 502
  delay: 3
  timeout: 2

  sensors:
    ######### Temperaure probes ##########
    - name: HeatBuffer_7T5_WarmWater_HK3
      unique_id: d3f039970-ad43-HeatBuffer7T5
      unit_of_measurement: °C
      slave: 1
      address: 43090
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

    - name: HeatBuffer_9T4_TankMiddleTop
      unique_id: d3f039970-ad44-HeatBuffer9T4
      unit_of_measurement: °C
      slave: 1
      address: 43266
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

    - name: HeatBuffer_9T5_TankMiddleBottom
      unique_id: d3f039970-ad45-HeatBuffer9T5
      unit_of_measurement: °C
      slave: 1
      address: 43268
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

    - name: HeatBuffer_T10_OutsideTemp
      unique_id: d3f039970-ad46-HeatBufferT10
      unit_of_measurement: °C
      slave: 1
      address: 43000
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

    - name: HeatBuffer_T11_PrimaryReturn
      unique_id: d3f039970-ad47-HeatBufferT11
      unit_of_measurement: °C
      slave: 1
      address: 43001
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

    - name: HeatBuffer_T12_SecondaryFeed
      unique_id: d3f039970-ad48-HeatBufferT12
      unit_of_measurement: °C
      slave: 1
      address: 43002
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

    - name: HeatBuffer_T13_BoilerTop
      unique_id: d3f039970-ad49-HeatBufferT13
      unit_of_measurement: °C
      slave: 1
      address: 43354
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

    ### Not Connected ###
    #    - name: HeatBuffer_T14_BoilerBottom
    #      unique_id: d3f039970-ad53-HeatBufferT14
    #      unit_of_measurement: °C
    #      slave: 1
    #      address: 43355
    #      data_type: int16
    #      scan_interval: 1
    #      device_class: temperature
    #      state_class: measurement

    - name: HeatBuffer_T15_SecondaryReturn
      unique_id: d3f039970-ad50-HeatBufferT15
      unit_of_measurement: °C
      slave: 1
      address: 43003
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

    - name: HeatBuffer_T16_FeedHK2
      unique_id: d3f039970-ad51-HeatBufferT16
      unit_of_measurement: °C
      slave: 1
      address: 43054
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

    - name: HeatBuffer_T17_Circulation
      unique_id: d3f039970-ad52-HeatBufferT17
      unit_of_measurement: °C
      slave: 1
      address: 43027
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

    ### Not Connected ###
    # - name: HeatBuffer_T20_RL
    #   unique_id: d3f039970-ad44-HeatBuffer_T20_RL
    #   unit_of_measurement: °C
    #   slave: 1
    #   address: 43056
    #   data_type: int16
    #   scan_interval: 1
    #   device_class: temperature
    #   state_class: measurement

    - name: HeatBuffer_5T23_TankTop
      unique_id: d3f039970-ad54-HeatBuffer5T23
      unit_of_measurement: °C
      slave: 1
      address: 43377
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

    - name: HeatBuffer_5T24_TankBottom
      unique_id: d3f039970-ad55-HeatBuffer5T24
      unit_of_measurement: °C
      slave: 1
      address: 43378
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

    ########## Presets ##########
    - name: HeatPresetTemp_HK0
      unique_id: d3f039970-ad01-PresetTemp_HK0
      unit_of_measurement: °C
      slave: 1
      address: 43004
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

    - name: HeatPresetTemp_SpKr1
      unique_id: d3f039970-ad02-PresetTemp_SpKr1
      unit_of_measurement: °C
      slave: 1
      address: 43360
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

    # - name: HeatPresetTemp_Feed_HK1
    #   unique_id: d3f039970-ad03-PresetTemp_Feed_HK1
    #   unit_of_measurement: °C
    #   slave: 1
    #   address: 43026
    #   data_type: int16
    #   scan_interval: 1
    #   device_class: temperature
    #   state_class: measurement

    # - name: HeatPresetTemp_Feed_HK2
    #   unique_id: d3f039970-ad04-PresetTemp_Feed_HK2
    #   unit_of_measurement: °C
    #   slave: 1
    #   address: 43055
    #   data_type: int16
    #   scan_interval: 1
    #   device_class: temperature
    #   state_class: measurement

    ########## Status ##########
    - name: HeatOperatingState_HK1
      unique_id: d3f039970-ad05-OperatingState_HK1
      unit_of_measurement: state
      slave: 1
      address: 43032
      data_type: int16
      scan_interval: 1
      state_class: measurement

    # - name: HeatOperatingState_HK2
    #   unique_id: d3f039970-ad06-OperatingState_HK2
    #   unit_of_measurement: state
    #   slave: 1
    #   address: 43060
    #   data_type: int16
    #   scan_interval: 1
    #   state_class: measurement

    # - name: HeatOperatingState_Spkr1
    #   unique_id: d3f039970-ad07-OperatingState_Spkr1
    #   unit_of_measurement: state
    #   slave: 1
    #   address: 43363
    #   data_type: int16
    #   scan_interval: 1
    #   state_class: measurement

    - name: HeatState_Ubergabestation
      unique_id: d3f039970-ad08-State_UbergabeStation
      unit_of_measurement: state
      slave: 1
      address: 43010
      data_type: int16
      scan_interval: 1
      state_class: measurement

    - name: HeatOutputState_Pump_3
      unique_id: d3f039970-ad09-OutputState_Pump_3
      unit_of_measurement: state
      slave: 1
      address: 43029
      data_type: int16
      scan_interval: 1
      state_class: measurement

    # - name: HeatOutputState_LadePumpe_4
    #   unique_id: d3f039970-ad10-OutputState_LadePumpe_4
    #   unit_of_measurement: state
    #   slave: 1
    #   address: 43361
    #   data_type: int16
    #   scan_interval: 1
    #   state_class: measurement

    - name: HeatOutputState_Pump_8
      unique_id: d3f039970-ad11-OutputState_Pump_8
      unit_of_measurement: state
      slave: 1
      address: 43058
      data_type: int16
      scan_interval: 1
      state_class: measurement

    - name: HeatState_Mischer_M67
      unique_id: d3f039970-ad12-Status_Mischer_M67
      unit_of_measurement: state
      slave: 1
      address: 43059
      data_type: int16
      scan_interval: 1
      state_class: measurement

    - name: HeatStatus_3way_Valve_M12
      unique_id: d3f039970-ad13-Status_3way_Valve_M12
      unit_of_measurement: state
      slave: 1
      address: 43005
      data_type: int16
      scan_interval: 1
      state_class: measurement

    - name: HeatCalculated_ValvePosition_HK0
      unique_id: d3f039970-ad14-Calculated_ValvePosition_HK0
      unit_of_measurement: state
      slave: 1
      address: 43007
      data_type: int16
      scan_interval: 1
      state_class: measurement
      
    ########### HeatMeter ##########
    - name: HeatMeter
      unique_id: d3f039970-ad56-HeatMeter
      unit_of_measurement: kWh
      slave: 1
      address: 43750
      data_type: float32
      scan_interval: 1
      device_class: energy
      state_class: total_increasing

    - name: HeatFeed
      unique_id: d3f039970-ad57-HeatFeed
      unit_of_measurement: °C
      slave: 1
      address: 43758
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

    - name: HeatReturn
      unique_id: d3f039970-ad58-HeatReturn
      unit_of_measurement: °C
      slave: 1
      address: 43759
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

    - name: HeatFlow
      unique_id: d3f039970-ad59-HeatFlow
      unit_of_measurement: l/h
      slave: 1
      address: 43756
      data_type: float32
      scan_interval: 1
      device_class: volume_flow_rate
      state_class: measurement

    - name: HeatVolume_in_m3
      unique_id: d3f039970-ad60-Volume_in_m3
      unit_of_measurement: m³
      slave: 1
      address: 43752
      data_type: float32
      scan_interval: 1
      device_class: volume
      state_class: measurement

    - name: HeatActualPower_in_kW
      unique_id: d3f039970-ad61-Actual_power_in_kW
      unit_of_measurement: kW
      slave: 1
      address: 43754
      data_type: float32
      scan_interval: 1
      device_class: power
      state_class: measurement

    - name: HeatSpreizung_in_K
      unique_id: d3f039970-ad62-Spreizung_in_K
      unit_of_measurement: K
      slave: 1
      address: 43760
      data_type: int16
      scan_interval: 1
      device_class: temperature
      state_class: measurement

configuration.yaml

  # Platform Template:
  - platform: template
    sensors:
      heatfeed_act:
        friendly_name: "HeatFeed Act"
        unit_of_measurement: "°C"
        value_template: "{{ states('sensor.heatfeed') | float / 100 }}"
        attribute_templates:
          device_class: "temperature"
          state_class: "measurement"

      heatreturn_act:
        friendly_name: "HeatReturn Act"
        unit_of_measurement: "°C"
        value_template: "{{ states('sensor.heatreturn') | float / 100 }}"
        attribute_templates:
          device_class: "temperature"
          state_class: "measurement"

      heatbuffer_7t5_warmwater_act:
        friendly_name: "HeatBuffer_7T5_WarmWater_Act"
        unit_of_measurement: "°C"
        value_template: "{{ states('sensor.heatbuffer_7t5_warmwater') | int / 10 }}"
        attribute_templates:
          device_class: "temperature"
          state_class: "measurement"

      heatbuffer_9t4_tankmiddletop_act:
        friendly_name: "HeatBuffer_9T4_TankMiddleTop_Act"
        unit_of_measurement: "°C"
        value_template: "{{ states('sensor.heatbuffer_9t4_tankmiddletop') | int / 10 }}"
        attribute_templates:
          device_class: "temperature"
          state_class: "measurement"

      heatbuffer_9t5_tankmiddlebottom_act:
        friendly_name: "HeatBuffer_9T5_TankMiddleBottom_Act"
        unit_of_measurement: "°C"
        value_template: "{{ states('sensor.heatbuffer_9t5_tankmiddlebottom') | int / 10 }}"
        attribute_templates:
          device_class: "temperature"
          state_class: "measurement"

      heatbuffer_t10_outsidetemp_act:
        friendly_name: "HeatBuffer_T10_OutsideTemp_Act"
        unit_of_measurement: "°C"
        value_template: "{{ states('sensor.heatbuffer_t10_outsidetemp') | int / 10 }}"
        attribute_templates:
          device_class: "temperature"
          state_class: "measurement"

      heatbuffer_t11_primaryreturn_act:
        friendly_name: "HeatBuffer_T11_PrimaryReturn_Act"
        unit_of_measurement: "°C"
        value_template: "{{ states('sensor.HeatBuffer_T11_PrimaryReturn') | int / 10 }}"
        attribute_templates:
          device_class: "temperature"
          state_class: "measurement"

      heatbuffer_t12_secondaryfeed_act:
        friendly_name: "HeatBuffer_T12_SecondaryFeed_Act"
        unit_of_measurement: "°C"
        value_template: "{{ states('sensor.heatbuffer_t12_secondaryfeed') | int / 10 }}"
        attribute_templates:
          device_class: "temperature"
          state_class: "measurement"

      heatbuffer_t13_boilertop_act:
        friendly_name: "HeatBuffer_T13_BoilerTop_Act"
        unit_of_measurement: "°C"
        value_template: "{{ states('sensor.heatbuffer_t13_boilertop') | int / 10 }}"
        attribute_templates:
          device_class: "temperature"
          state_class: "measurement"

      heatbuffer_t15_secondaryreturn_act:
        friendly_name: "HeatBuffer_T15_SecondaryReturn_Act"
        unit_of_measurement: "°C"
        value_template: "{{ states('sensor.heatbuffer_t15_secondaryreturn') | int / 10 }}"
        attribute_templates:
          device_class: "temperature"
          state_class: "measurement"

      heatbuffer_t16_feedhk2_act:
        friendly_name: "HeatBuffer_T16_FeedHK2_Act"
        unit_of_measurement: "°C"
        value_template: "{{ states('sensor.heatbuffer_t16_feedhk2') | int / 10 }}"
        attribute_templates:
          device_class: "temperature"
          state_class: "measurement"

      heatbuffer_t17_circulation_act:
        friendly_name: "HeatBuffer_T17_Circulation_Act"
        unit_of_measurement: "°C"
        value_template: "{{ states('sensor.heatbuffer_t17_circulation') | int / 10 }}"
        attribute_templates:
          device_class: "temperature"
          state_class: "measurement"

      heatbuffer_5t23_tanktop_act:
        friendly_name: "HeatBuffer_5T23_TankTop_Act"
        unit_of_measurement: "°C"
        value_template: "{{ states('sensor.heatbuffer_5t23_tanktop') | int / 10 }}"
        attribute_templates:
          device_class: "temperature"
          state_class: "measurement"

      heatbuffer_5t24_tankbottom_act:
        friendly_name: "HeatBuffer_5T24_TankBottom_Act"
        unit_of_measurement: "°C"
        value_template: "{{ states('sensor.heatbuffer_5t24_tankbottom') | int / 10 }}"
        attribute_templates:
          device_class: "temperature"
          state_class: "measurement"

      heat_operatingstate_hk1:
        friendly_name: "HeatOperatingState_HK1_Act"
        unique_id: "d3f039970-ad05-OperatingState_HK1_Act"
        device_class: "enum"
        value_template: >
          {% set states = {
            0: 'Tagbetrieb',
            1: 'Absenkung',
            2: 'Partybetrieb',
            3: 'Nutzungszeitraum-Betrieb',
            4: 'AUS-AT-Abschaltung',
            5: 'AUS-Raumtempabschaltung',
            6: 'WW-Nachrang-Abschaltung',
            7: 'Pufferuntertemperaturabschaltung',
            8: 'extern Aus/FS',
            9: 'Nichtnutzungszeitraum/FS',
            10: 'Frostschutzbetrieb',
            11: 'Estrichausheizung',
            12: 'Handbetrieb'
          } %}
          {{ states[states('sensor.heat_operatingstate_hk1')] if states('sensor.heat_operatingstate_hk1') in states else 'Unknown' }}
        attribute_templates:
          device_class: "state"
          state_class: "measurement"

      heat_operatingstate_hk2:
        friendly_name: "HeatOperatingState_HK2_Act"
        unique_id: "d3f039970-ad06-OperatingState_HK2_Act"
        device_class: "enum"
        value_template: >
          {% set states = {
            0: 'Tagbetrieb',
            1: 'Absenkung',
            2: 'Partybetrieb',
            3: 'Nutzungszeitraum-Betrieb',
            4: 'AUS-AT-Abschaltung',
            5: 'AUS-Raumtempabschaltung',
            6: 'WW-Nachrang-Abschaltung',
            7: 'Pufferuntertemperaturabschaltung',
            8: 'extern Aus/FS',
            9: 'Nichtnutzungszeitraum/FS',
            10: 'Frostschutzbetrieb',
            11: 'Estrichausheizung',
            12: 'Handbetrieb'
          } %}
          {{ states[states('sensor.heat_operatingstate_hk2')] if states('sensor.heat_operatingstate_hk2')|int in states else 'Unknown' }}

      heat_operatingstate_spkr1:
        friendly_name: "HeatOperatingState_Spkr1_Act"
        unique_id: d3f039970-ad07-OperatingState_Spkr1_Act
        device_class: "enum"
        value_template: >
          {% set states = {
            0: 'AUS/geladen',
            1: 'Aus/Frostschutz',
            2: 'Ladepause',
            3: 'MinimaltempLdg.',
            4: 'Zeitldg.',
            5: 'einmalige Ladung händisch',
            6: 'Ladung wg. Kontakt',
            7: 'Zwangsladung aufgrund Visuanforderung',
            8: 'Desinfektion automatisch',
            9: 'Desinfektion wg. Kontakt',
            10: 'Desinfektion bis deakt. Händisch',
            11: 'Desinfektion bis Temp. Händisch',
            12: 'Handbetrieb'
          } %}
          {{ states[states('sensor.heat_operatingstate_spkr1')] if states('sensor.heat_operatingstate_spkr1')|int in states else 'Unknown' }}

      heat_state_ubergabestation:
        friendly_name: "HeatState_Ubergabestation_Act"
        unique_id: d3f039970-ad08-State_UbergabeStation_Act
        device_class: "enum"
        value_template: >
          {% set states = {
            0: 'AUS',
            1: 'EIN im Normalbetrieb',
            2: 'Station in RL-Begrenzung',
            3: 'Station in Leistungsbegrenzung',
            4: 'extern Aus',
            5: 'Handbetrieb Ventil'
          } %}
          {{ states[states('sensor.heat_state_ubergabestation')] if states('sensor.heat_state_ubergabestation')|int in states else 'Unknown' }}

#Modbus
modbus: !include modbus.yaml

Hi Markus,

can you share the extended list with the Modbus register addresses please?
Thanks :slight_smile:

Dear Adamski, which can you share me the link for the hardware you got to connect to Aqotec?

@NicoEmm Did zthe above suggestion helped you, I am planning to buy waveshare RS485 to RJ45 Ethernet for this but need to know if this helped you or not.

I used Modbus TCP, so I needed network cable only. Quite easy to setup. In this topic you have the ready solution including configuration file.

And I wouldn’t recommend the Waveshare device… Really. Why you plan to use Modbus RTU?

Dear @Adamski for me in Munich Germany, the heating provider is using the lan cable and there is only 1 lan input. Only possiblities is to connect via modbus.
so to make it easier i was thinking of Waveshare RS485 to RJ45 Ethernet Converter Module.

so that i could connect via LAN and the converter take care of communication via modbus protocol.

Any specific reasons on why you dont recommend waveshare?

I’ve tried the Waveshare RS485 to RJ45 Ethernet Converter first and failed to configure it with RM360 properly. The Diagnostic software and tutorials are in chinese. Generally the software is poor made. At some point I gave up, then found out, that Modbus TCP is much simpler. But they’re cheap, maye you’ll have more luck.

I would ask the Aqotec if their system accept one or multiple clients. If that’s the case, you could try to connect using a ethernet switch.

Another solution could be modous- proxy, but I don’t think your provider would like it.

I am using Waveshare RS485 to RJ45 PoE and it worked immediately.
The only little problem was to access the webpage for configuration, as the device comes with a static IP that might not work in your network.
To solve this you can connect the device directly to your PC and use their configuration software (VirCom). With that software you can then change the IP and then you can access the configuration using the webpage.

For the settings, I followed the instructions of this youtube video.
Then in the RM360 I set the following parameters:

  • P914 - Modbus: COM-A or RS485
  • P770 - Address: 10
  • P771 - Baudrate: 2400 (Default value)
  • P772 - Bustype: RS485

In Home Assistant the configuration looks like this:

- name: "RM360"
  type: rtuovertcp
  host: 192.168.1.20                  // Device-IP of RS485 to RJ45
  port: 502                           // Device-Port of RS485 to RJ45
  sensors:
    - name: "Total"
      unit_of_measurement: kWh
      device_address: 10              // See P770
      address: 43750
      device_class: energy
      data_type: float32
      state_class: total_increasing

I also want to say, that the support of Aqotec (and the company itself) is awesome. Every question got answered after a few hours (or even less). They even answered questions about the Waveshare device I am using (i.e. if it needs termination, if a connection to GND is required etc.).
Also it is great how open they are about the possible integrations. Most manufacturers charge a few hundred bucks to integrate their devices in anything other then their proprietary app.