Neoom Beeam Rest API

I’m getting my system (with NEOOM) next week, thanks a lot guys for your work! I hope I can get the data into HA too with only basic coding skills. :slight_smile:

Do you have a beeam box in use? You can query this at no cost.

Unfortunately I could not reach anyone at neoom (telephone is not possible), but after contacting the local representative I got the update :raised_hands:.

Hi Marcel,

I got my BEAAM yesterday and copy pasted your yaml-lines from your post in my config.yaml … of course I changed the IP and token before. Unfortunately there are lots of errors when I want to save the config.yaml, like:

“end of stream or a document seperator is expected” in lots of lines. do I miss something? Do i have to add anything else into my config?

thanks for your input here!

Hi,

The yaml-lines are in a separate file which i called “rest.yaml”. In the configuration.yaml i added then the following lines:

# Sensoren hinzufuegen
rest: !include rest.yaml

I have done this so that the configuration.yaml does not become too large.

Hope this helps.

Came across this post and wanted to say thank you. i took your script and added some values for my heat pump and wallbox. also added some tapo smart plugs to monitor the rest of my electrical devices.

Just one question regarding the grid input and output. because i can’t get this to work correctly.
can you tell me how you configured this?

My parents decided to buy a neoom solar system. I made my own thread with a few questions. I hope that people that already use Neoom can help us. You guys seem to be able to use it in HA so I think that you might be able to answer the questions we have. Thanks!

Hi,

I’ve been using the Beaam for several months now, and data transmission has worked without any issues until yesterday. In my opinion, the Beaam received a firmware update to version 1.70 yesterday. I also noticed that for a while, no live data was available in the app. This seems to be working again in the app as of today, but in Home Assistant, the live data is still missing.

Cumulative data such as consumed_cal and energy_exported are still working. However, for values like power_production, I get the error that the entity is not provided by the REST sensor. When I manually query the API, I also receive “null” as the response.

BR
Daniel

I also have a PV with battery with the neoom beaam. Since it is very poor in functionality and expensive I do not use it anymore, but use the native PV-Integration, In my case “Solax Inverter Modbus”. This integration is working out of the box, is for free, quite powerful, did work all the time since 2 years, has reqular updates and is local and thus not dependend on internet or functioning of the cloud of a manufacturer.

When installing “Solax Inverter Modbus” you have to be aware, that just one instanve can be connected to modbus. Thus I did disconnect Neoom Beam (and never missed it). If you want to connect both you need to do this via a modbus multiplexer.

“Solax Inverter Modbus” supports several other brands as well, if yours is not supported I am pretty confident, that you will find an appropriate native integration for your PV-system.

My Inverter is in the same subnet, neoom beaam is currently connected to it via network. can you tell me, how home-assistant can access to inverter?

Neoom Beaam is configured for communicating over port 502/tcp, but solax integration does not work, either if port is chaning from 80 to 502.

The inverter remains at the same IP-address and Port. However as stated above only one instance of a modbus maste can be acive. Thus either neoom beaam or Solax Inverter Modbus Integration of Home Asistant can be active. I did remove Neoom Beaam from the TCP-IP Network at all as Neoom Beaam was of no use at all to me
The only way to connect both would be to add a modbus multiplexer (a piece of hardware.

My parents want to keep the Neoom App as they like it for convenience.

To the people that got it running via Rest-API: Does this still work? If yes… Can someone please share their working config? Thanks!

Hey Guys,

can you help me why are my “power_grid_input” have the same value than “power_grid_output”?

      # Stromnetz (aktueller Netzbezug)
      - name: "neoom_power_grid_input"
        unique_id: "power_grid_input"
        #value_template: "{{ value_json['energyFlow']['states'] | selectattr('key', 'eq', 'POWER_GRID') | map(attribute='value') | first }}"
        value_template: "{{ (value_json['energyFlow']['states'] | selectattr('key', 'eq', 'POWER_GRID') | map(attribute='value') | first) * -1 if (value_json['energyFlow']['states'] | selectattr('key', 'eq', 'POWER_GRID') | map(attribute='value') | first) < 0 else (value_json['energyFlow']['states'] | selectattr('key', 'eq', 'POWER_GRID') | map(attribute='value') | first) }}"
        unit_of_measurement: "Wh"
        device_class: energy
        state_class: total
        icon: "mdi:TransmissionTower"

      # Stromnetz (aktuelle Einspeisung)
      - name: "neoom_power_grid_output"
        unique_id: "power_grid_output"
        #value_template: "{{ value_json['energyFlow']['states'] | selectattr('key', 'eq', 'POWER_GRID') | map(attribute='value') | first }}"
        #value_template: "{{ (value_json['energyFlow']['states'] | selectattr('key', 'eq', 'POWER_GRID') | map(attribute='value') | first) * -1 if (value_json['energyFlow']['states'] | selectattr('key', 'eq', 'POWER_GRID') | map(attribute='value') | first) < 0 else (value_json['energyFlow']['states'] | selectattr('key', 'eq', 'POWER_GRID') | map(attribute='value') | first) }}"
        value_template: "{{ (value_json['energyFlow']['states'] | selectattr('key', 'eq', 'POWER_GRID') | map(attribute='value') | first * -1) if (value_json['energyFlow']['states'] | selectattr('key', 'eq', 'POWER_GRID') | map(attribute='value') | first) < 0 else 0 }}"
        unit_of_measurement: "Wh"
        device_class: energy
        state_class: total
        icon: "mdi:TransmissionTower"

same with template original from neeom:

# Stromnetz (aktueller Netzbezug in Watt)

      - name: "neoom_power_grid_input"

        unique_id: "power_grid_input"

        value_template: "{{ (value_json['energyFlow']['states'] | selectattr('key', 'eq', 'POWER_GRID') | map(attribute='value') | first) * -1 if (value_json['energyFlow']['states'] | selectattr('key', 'eq', 'POWER_GRID') | map(attribute='value') | first) < 0 else (value_json['energyFlow']['states'] | selectattr('key', 'eq', 'POWER_GRID') | map(attribute='value') | first) }}"

        unit_of_measurement: "W"

        device_class: power

        state_class: total

        icon: "mdi:TransmissionTower"

      # Stromnetz (aktuelle Einspeisung in Watt)

      - name: "neoom_power_grid_output"

        unique_id: "power_grid_output"

        value_template: "{{ (value_json['energyFlow']['states'] | selectattr('key', 'eq', 'POWER_GRID') | map(attribute='value') | first * -1) if (value_json['energyFlow']['states'] | selectattr('key', 'eq', 'POWER_GRID') | map(attribute='value') | first) < 0 else 0 }}"

        unit_of_measurement: "W"

        device_class: energy

        state_class: total

        icon: "mdi:TransmissionTower"

Do you have any idea? In Energy Flow Chart it shows me the same input and output.

https://upload.adminforge.de/r/CqT0eSuq9f#BEt6d41P0A59VHnSd0SLv/cXVVxFGKqiVVXOMkgeCVs=

The real data from neoom is this:

https://upload.adminforge.de/r/dRUnppbejx#3OqE8H23c5lcRvKKb6LeiQ8tmEgtZGxe63zfCqtln4I=

Sorry I can´t upload media files as new user.

Thanks.

Yes, it’s still working. On my Beaam is currently the software version 1.74.2 installed - no problems.

Here my current sensors in the rest.yaml file:

# BEAAM Status
- resource: http://10.10.10.10/api/v1/site/state
  headers:
    Authorization: "Bearer sk_beaam_xxxxx" #Put your bearer token here, but do not delete Bearer at the beginning
    Content-Type: "application/json"
  method: GET
  scan_interval: 15  # Intervall für API-Aufrufe in Sekunden
    
  sensor:
    # Batterie (aktueller Ladestand)
    - name: "neoom_self_sufficiency"
      unique_id: "self_sufficiency"
      value_template: "{{ (value_json['energyFlow']['states'] | selectattr('key', 'eq', 'SELF_SUFFICIENCY') | map(attribute='value') | first) }}"
      unit_of_measurement: "%"
      device_class: power
      state_class: measurement
      icon: "mdi:HomePercentOutline"
      
    # Batterie (aktuelle Leistung in Watt)
    - name: "neoom_storage_power_beaam"
      unique_id: "storage_power_beaam"
      value_template: "{{ (value_json['energyFlow']['states'] | selectattr('key', 'eq', 'POWER_STORAGE') | map(attribute='value') | first) }}"
      unit_of_measurement: "W"
      device_class: power
      state_class: measurement
      icon: "mdi:home-battery"

# BEAAM Battery
- resource: http://10.10.10.10/api/v1/things/GUID/states
  headers:
    Authorization: "Bearer sk_beaam_xxxxx" #Put your bearer token here, but do not delete Bearer at the beginning
    Content-Type: "application/json"
  method: GET
  scan_interval: 15  # Intervall für API-Aufrufe in Sekunden
    
  sensor:
    # Batterie (aktueller Output in Watt)
    - name: "neoom_storage_output"
      unique_id: "storage_output"
      value_template: "{{ 0 if (value_json['states'] | selectattr('key', 'eq', 'ACTIVE_POWER') | map(attribute='value') | first) < 0 else (value_json['states'] | selectattr('key', 'eq', 'ACTIVE_POWER') | map(attribute='value') | first) }}"
      unit_of_measurement: "W"
      device_class: power
      state_class: measurement
      icon: "mdi:BatteryArrowDownOutline"      
      
    # Batterie (aktueller Input in Watt)
    - name: "neoom_storage_input"
      unique_id: "storage_input"
      value_template: "{{ (value_json['states'] | selectattr('key', 'eq', 'ACTIVE_POWER') | map(attribute='value') | first * -1) if (value_json['states'] | selectattr('key', 'eq', 'ACTIVE_POWER') | map(attribute='value') | first) < 0 else 0 }}"
      unit_of_measurement: "W"
      device_class: power
      state_class: measurement
      icon: "mdi:BatteryArrowUpOutline"
      
    # Batterie (Ladezustand)
    - name: "neoom_state_of_charge"
      unique_id: "state_of_charge"
      value_template: "{{ (value_json['states'] | selectattr('key', 'eq', 'STATE_OF_CHARGE') | map(attribute='value') | first) }}"
      unit_of_measurement: "%"
      device_class: battery
      state_class: measurement
      icon: "mdi:BatteryHeartVariant"                  
      
    # Batterie (aktuelle Leistung in Watt)
    - name: "neoom_storage_power"
      unique_id: "storage_power"
      value_template: "{{ (value_json['states'] | selectattr('key', 'eq', 'POWER') | map(attribute='value') | first) }}"
      unit_of_measurement: "W"
      device_class: power
      state_class: measurement
      icon: "mdi:home-battery"

    # Batterie (aktuelle Leistung in Watt)
    - name: "neoom_storage_active_power"
      unique_id: "storage_active_power"
      value_template: "{{ (value_json['states'] | selectattr('key', 'eq', 'ACTIVE_POWER') | map(attribute='value') | first) }}"
      unit_of_measurement: "W"
      device_class: power
      state_class: measurement
      icon: "mdi:home-battery"

# BEAAM Inverter
- resource: http://10.10.10.10/api/v1/things/GUID/states  
  headers:
    Authorization: "Bearer sk_beaam_xxxxx" #Put your bearer token here, but do not delete Bearer at the beginning
    Content-Type: "application/json"
  method: GET
  scan_interval: 15  # Intervall für API-Aufrufe in Sekunden
    
  sensor:
    # Stromproduktion alle Panel (aktuelle Leistung in Watt)
    - name: "neoom_power_panels"
      unique_id: "power_panels"
      value_template: "{{ (value_json['states'] | selectattr('key', 'eq', 'INPUTS_POWER') | map(attribute='value') | first)[0] + (value_json['states'] | selectattr('key', 'eq', 'INPUTS_POWER') | map(attribute='value') | first)[1] }}"
      unit_of_measurement: "W"
      device_class: power
      state_class: measurement
      icon: "mdi:SolarPanel"
    
    # Stromproduktion Panel West (aktuelle Leistung in Watt)
    - name: "neoom_power_panelwest"
      unique_id: "power_panelwest"
      value_template: "{{ (value_json['states'] | selectattr('key', 'eq', 'INPUTS_POWER') | map(attribute='value') | first)[0] }}"
      unit_of_measurement: "W"
      device_class: power
      state_class: measurement
      icon: "mdi:SolarPanel"
            
    # Stromproduktion Panel Osten (aktuelle Leistung in Watt)
    - name: "neoom_power_paneleast"
      unique_id: "power_paneleast"
      value_template: "{{ (value_json['states'] | selectattr('key', 'eq', 'INPUTS_POWER') | map(attribute='value') | first)[1] }}"
      unit_of_measurement: "W"
      device_class: power
      state_class: measurement
      icon: "mdi:SolarPanel"

# BEAAM AC (Grid)      
- resource: http://10.10.10.10/api/v1/things/GUID/states
  headers:
    Authorization: "Bearer sk_beaam_xxxxx" #Put your bearer token here, but do not delete Bearer at the beginning
    Content-Type: "application/json"
  method: GET
  scan_interval: 15  # Intervall für API-Aufrufe in Sekunden
    
  sensor:
    # Stromnetz (aktueller Bezug in Watt)
    - name: "neoom_power_grid_input"
      unique_id: "power_grid_input"
      value_template: "{{ 0 if (value_json['states'] | selectattr('key', 'eq', 'ACTIVE_POWER') | map(attribute='value') | first) < 0 else (value_json['states'] | selectattr('key', 'eq', 'ACTIVE_POWER') | map(attribute='value') | first) }}"
      unit_of_measurement: "W"
      device_class: power
      state_class: measurement
      icon: "mdi:TransmissionTower"
      
    # Stromnetz (aktuelle Einspeisung)
    - name: "neoom_power_grid_output"
      unique_id: "power_grid_output"
      value_template: "{{ (value_json['states'] | selectattr('key', 'eq', 'ACTIVE_POWER') | map(attribute='value') | first * -1) if (value_json['states'] | selectattr('key', 'eq', 'ACTIVE_POWER') | map(attribute='value') | first) < 0 else 0 }}"
      unit_of_measurement: "W"
      device_class: power
      state_class: measurement
      icon: "mdi:TransmissionTower"      
      
# BEAAM Ladestation
- resource: http://10.10.10.10/api/v1/things/GUID/states
  headers:
    Authorization: "Bearer sk_beaam_xxxxx" #Put your bearer token here, but do not delete Bearer at the beginning
    Content-Type: "application/json"
  method: GET
  scan_interval: 15  # Intervall für API-Aufrufe in Sekunden
    
  sensor:
    # Ladestation (aktueller Verbrauch in Watt)
    - name: "neoom_car_charger"
      unique_id: "car_charger"
      value_template: "{{ (value_json['states'] | selectattr('key', 'eq', 'ACTIVE_POWER') | map(attribute='value') | first) }}"
      unit_of_measurement: "W"
      device_class: power
      state_class: measurement
      icon: "mdi:EVStation"      

# BEAAM Boiler - Strom
- resource: http://10.10.10.10/api/v1/things/GUID/states
  headers:
    Authorization: "Bearer sk_beaam_xxxxx" #Put your bearer token here, but do not delete Bearer at the beginning
    Content-Type: "application/json"
  method: GET
  scan_interval: 15  # Intervall für API-Aufrufe in Sekunden
    
  sensor:
    # Boiler (aktueller Verbrauch in Watt)
    - name: "neoom_boiler_power"
      unique_id: "water_boiler_power"
      value_template: "{{ (value_json['states'] | selectattr('key', 'eq', 'POWER') | map(attribute='value') | first) }}"
      unit_of_measurement: "W"
      device_class: power
      state_class: measurement
      icon: "mdi:WaterBoiler"

# BEAAM Boiler - Temperatur
- resource: http://10.10.10.10/api/v1/things/GUID/states
  headers:
    Authorization: "Bearer sk_beaam_xxxxx" #Put your bearer token here, but do not delete Bearer at the beginning
    Content-Type: "application/json"
  method: GET
  scan_interval: 15  # Intervall für API-Aufrufe in Sekunden
    
  sensor:
    # Boiler (Temperatur 1)
    - name: "neoom_boiler_temp01"
      unique_id: "water_boiler_temp01"
      value_template: "{{ (value_json['states'] | selectattr('key', 'eq', 'TEMPERATURES') | map(attribute='value') | first)[0] | round(0) }}"
      unit_of_measurement: "°C"
      device_class: temperature
      state_class: measurement
      icon: "mdi:WaterBoiler"

    # Boiler (Temperatur 2)
    - name: "neoom_boiler_temp02"
      unique_id: "water_boiler_temp02"
      value_template: "{{ (value_json['states'] | selectattr('key', 'eq', 'TEMPERATURES') | map(attribute='value') | first)[1] | round(0) }}"
      unit_of_measurement: "°C"
      device_class: temperature
      state_class: measurement
      icon: "mdi:WaterBoiler"

Replace the string “GUID” with the corresponding value, see the post up.

In the “Netzbezug” you calculate the value *-1, this you must do only for the “Einspeisung”:

Compare your value_template with my current configuration, I just posted the current one.

I have the same issue as @Dominik1 . power_grid_input” have the same value as “power_grid_output. Any idea how to get the right values there?