Modbus solaredge scalefactor problem

Hello
I made a modbus connestion from Hassio to solaredge inverter .
I’m accesing current power and powerfactor.
I have to calculate power with current power divide by1 or divide by 10 or 100 or 1000 depending on powerfactor, the powerfactor is 0,-1,-2 or -3
I have made a template but it does not work.
please help :slight_smile: `
sepower:
friendly_name: ‘SEMoč’

     value_template: >-
       {% if is_state('sensor.sepf', '0') %}
         {{sensor.sepwr}}
       {% elif is_state('sensor.sepf', '-1') %}
         {{sensor.sepwr/10}}
       {% elif is_state('sensor.sepf', '-2') %}
         {{sensor.sepwr/100}}
         
       {% elif is_state('sensor.sepf', '-3') %}
         {{sensor.sepwr/1000}}
       {% else %}
         0
       {% endif %}
      `

Maybe use
{{sensor.sepwr | float / 10}}

It is working if I put a number instead of sensor.sepwr, but does not work with sensor.sepwr .
it’s like, there is nothing in the sensor.sepwr

here is the hole thing
but still does not work
I get 0.0

  - platform: modbus
    scan_interval: 300
    registers:
      - name: sepwr
        unit_of_measurement: W
        slave: 1
        register: 40083
        scale: 1
      - name: AC_Voltage
        unit_of_measurement: V
        slave: 1
        register: 40080
        scale: 0.1
      - name: SEPF
        unit_of_measurement: q
        slave: 1
        register: 40084
  - platform: template

    sensors:          
      sepower:
         friendly_name: 'SEMoč'
         unit_of_measurement: W
         value_template: >-
           {% if is_state('sensor.sepf', '0') %}
             {{states.sensor.sepwr | float / 1}}
           {% elif is_state('sensor.sepf', '-1') %}
             {{states.sensor.sepwr | float / 10}}
           {% elif is_state('sensor.sepf', '-2') %}
             {{states.sensor.sepwr | float / 100}}
             
           {% elif is_state('sensor.sepf', '-3') %}
             {{states.sensor.sepwr | float / 1000}}
           {% else %}
             0
           {% endif %}

Ahh, sorry, needs to be

{{ states.sensor.sepwr.state | float / 1 }}

if the sensor.sepwr has a numeric value.
Check in Dev Tools/states.

Thank you :slight_smile:

here is the vorking code

modbus:
   type: tcp
   host: 192.168.1.24
   port: 502 

  - platform: modbus
    type: tcp
    host: 192.168.1.24
    port: 502
    scan_interval: 10
    registers:
      - name: sepwr
        unit_of_measurement: W
        slave: 1
        register: 40083
        scale: 1
      - name: AC_Voltage
        unit_of_measurement: V
        slave: 1
        register: 40080
        scale: 0.1
      - name: SEPF
        unit_of_measurement: q
        slave: 1
        register: 40084
        
   
        
  - platform: template
 #če je numerična vrednost je treba state zraven napisat
    sensors:          
      sepower:
         friendly_name: 'SEMoč'
         unit_of_measurement: W
         value_template: >-
           {% if is_state('sensor.sepf', '0') %}
             {{states.sensor.sepwr.state | float / 1}}
           {% elif is_state('sensor.sepf', '-1') %}
             {{states.sensor.sepwr.state | float / 10}}
           {% elif is_state('sensor.sepf', '-2') %}
             {{states.sensor.sepwr.state | float / 100}}
           {% elif is_state('sensor.sepf', '-3') %}
             {{states.sensor.sepwr.state | float / 1000}}
           {% else %}
             0
           {% endif %}
1 Like

Hi pirpy,

you can massivly tighten your code by replacing the value_template by:

value_template: "{{states('sensor.I_AC_Power_RAW')|float * 10**states('sensor.I_AC_Power_SF')|float}}"