#!/usr/bin/python3 # --- # Script to generate Power Share and Panel OK sensors for the solar panels # by serial number. import sys import jinja2 as j2 # Serial Numbers for Panel Inverters INVERTER_SNS = [ 202147113780, 202147116830, 202147117162, 202147117631, 202147122858, 202147123517, 202147125027, 202147125590, 202147125734, 202147125902, 202147126079, 202147126357, 202147126997, 202147128369, 202147129445, 202147130152, 202147130290, ] # Jinja2 Snippet for Panel Average Sensor PANEL_AVERAGE_SENSOR = '''--- # ----------------------------------------------------------------------------- # Panel/Inverter Monitor Sensors - name: Envoy Inverter Average Power platform: min_max type: mean entity_ids:[% for sn in serial_numbers %] - sensor.envoy_202221032900_inverter_[[sn]] [%- endfor %] ''' # Jinja2 Snippet for Panel Power Share Sensors PANEL_SHARE_SENSORS = '''--- # ----------------------------------------------------------------------------- # Panel/Inverter Monitor Template Sensors sensor:[% for sn in serial_numbers %] - name: Envoy 202221032900 Inverter [[sn]] Power Share unit_of_measurement: "%" availability: "{{ states('sensor.envoy_inverter_average_power')|float > 5 }}" state: > {% if states('sensor.envoy_inverter_average_power')|float == 0 %} undefined {% else %} {{ (100 * states('sensor.envoy_202221032900_inverter_[[sn]]')|float / states('sensor.envoy_inverter_average_power')|float ) | round(1) }} {% endif %} [% endfor %] ''' def main(): """Generate Power Share Sensor Section for the YAML File.""" env = j2.Environment( block_start_string='[%', block_end_string='%]', variable_start_string='[[', variable_end_string=']]', comment_start_string='[#', comment_end_string='#]', ) with open('panel_average_sensor.yaml', 'w') as f: tmpl = env.from_string(PANEL_AVERAGE_SENSOR) f.write(tmpl.render(serial_numbers=INVERTER_SNS)) with open('panel_template_sensors.yaml', 'w') as f: tmpl = env.from_string(PANEL_SHARE_SENSORS) f.write(tmpl.render(serial_numbers=INVERTER_SNS)) if __name__ == '__main__': main()