MrIceman11 / e3dc-homeassistant

ADD e3dc Data to your HomeAssistant
43 stars 13 forks source link

Better Package Import #2

Closed Roemer closed 1 year ago

Roemer commented 1 year ago

Hallo Thanks for your summary. I have also had my own take on it, based mostly on your one. Instead of creating a new one, I'll show you how I did it and what is different and maybe you want to use some of it.

Differences are:

  1. Create a packages\e3dc folder and in there two files modbus.yaml and sensors.yaml
  2. I load the whole package with:
    homeassistant:
    packages: !include_dir_merge_named packages/
  3. The content of the files is as follows:
    1. modbus.yaml
      
      e3dc_modbus:
      modbus:
      - name: "e3dc"
      type: tcp
      host: !secret e3dc_ip
      port: 502
      retry_on_empty: true
      sensors:
      # Identification Block
      - name: E3DC Modbus Firmware
        unique_id: e3dc_modbus_firmware
        address: 40001
        data_type: uint16
        scan_interval: 86400
      - name: E3DC Manufacturer
        unique_id: e3dc_manufacturer
        address: 40003
        data_type: string
        count: 16
        scan_interval: 86400
      - name: E3DC Model
        unique_id: e3dc_model
        address: 40019
        data_type: string
        count: 16
        scan_interval: 86400
      - name: E3DC Serial Number
        unique_id: e3dc_serial_number
        address: 40035
        data_type: string
        count: 16
        scan_interval: 86400
      - name: E3DC Firmware Release
        unique_id: e3dc_firmware_release
        address: 40051
        data_type: string
        count: 16
        scan_interval: 86400
      # Power Data
      - name: E3DC Solar Power
        unique_id: e3dc_solar_power
        unit_of_measurement: W
        device_class: power
        data_type: int32
        address: 40067
        scan_interval: 2
        swap: word
      - name: E3DC Battery Power
        unique_id: e3dc_battery_power
        unit_of_measurement: W
        device_class: power
        data_type: int32
        address: 40069
        scan_interval: 2
        swap: word
      - name: E3DC Power Consumption House
        unique_id: e3dc_house_consumption_power
        unit_of_measurement: W
        device_class: power
        data_type: int32
        address: 40071
        scan_interval: 2
        swap: word
      - name: E3DC Grid Power
        unique_id: e3dc_grid_power
        unit_of_measurement: W
        device_class: power
        data_type: int32
        address: 40073
        scan_interval: 2
        swap: word
      - name: E3DC Autarky and Consumption
        unique_id: e3dc_autarky_and_consumption
        data_type: int16
        address: 40081
        scan_interval: 60
      - name: E3DC Battery State of Charge
        unique_id: e3dc_battery_state_of_charge
        unit_of_measurement: "%"
        device_class: battery
        data_type: int16
        address: 40082
        scan_interval: 30
      - name: E3DC Emergency Power State
        unique_id: e3dc_emergency_power_state
        data_type: int16
        address: 40083
        scan_interval: 10
    3. `sensors.yaml`

e3dc_sensors: sensor:

Templates

- platform: template
  sensors:
    e3dc_grid_export_power:
      unique_id: e3dc_grid_export_power
      friendly_name: "E3DC Grid Export Power"
      unit_of_measurement: "W"
      device_class: power
      value_template: >
        {% set power = states('sensor.e3dc_grid_power') | int(0) %}
        {% if power > 0 %}
          0
        {% else -%}
          {{ power | abs }} 
        {% endif %}
    e3dc_grid_import_power:
      unique_id: e3dc_grid_import_power
      friendly_name: E3DC Grid Import Power
      unit_of_measurement: W
      device_class: power
      value_template: >
        {% set power = states('sensor.e3dc_grid_power') | int(0) %}
        {% if power > 0 %}
          {{ power }}
        {% else -%}
          0
        {% endif %}
    e3dc_battery_charge_power:
      unique_id: e3dc_battery_charge_power
      friendly_name: E3DC Battery Charging Power
      unit_of_measurement: W
      device_class: power
      value_template: >
        {% set power = states('sensor.e3dc_battery_power') | int(0) %}
        {% if power | int >= 0 %}
          {{ power }}
        {% endif %}
    e3dc_battery_discharge_power:
      unique_id: e3dc_battery_discharge_power
      friendly_name: E3DC Battery Discharging Power
      unit_of_measurement: W
      device_class: power
      value_template: >
        {% set power = states('sensor.e3dc_battery_power') | int(0) %}
        {% if power <= 0 %}
          {{ power | abs }} 
        {% endif %}
    e3dc_autarky:
      friendly_name: "E3DC Autarky"
      unique_id: e3dc_autarky
      unit_of_measurement: "%"
      value_template: "{{ (states('sensor.e3dc_autarky_and_consumption')|int(0) / 256)|round(0,'floor') }}"
    e3dc_own_consumption:
      friendly_name: "E3DC Own Consumption Ratio"
      unique_id: e3dc_own_consumption_ratio
      unit_of_measurement: "%"
      value_template: "{{ ((states('sensor.e3dc_autarky_and_consumption')|int(0) / 256 - states('sensor.e3dc_autarky')|int(0)) * 256)|round(0,'floor') }}"
    e3dc_emergency_power_state_text:
      friendly_name: E3DC Emergency Power State Text
      unique_id: e3dc_emergency_power_state_text
      value_template: >
        {% set eps = states('sensor.e3dc_emergency_power_state') %}
        {% if eps == '0' %}
          nicht unterstützt
        {% elif eps == '1' %}
          aktiv
        {% elif eps == '2' %}
          inaktiv
        {% elif eps == '3' %}
          nicht verfügbar
        {% elif eps == '4' %}
          falsche Position
        {% else %}
          unbekannt
        {% endif %}

# Integrations
- platform: integration
  source: sensor.e3dc_grid_import_power
  name: E3DC Grid Import Energy
  unit_prefix: k
  round: 2
- platform: integration
  source: sensor.e3dc_grid_export_power
  name: E3DC Grid Export Energy
  unit_prefix: k
  round: 2
- platform: integration
  source: sensor.e3dc_solar_power
  name: E3DC Solar Energy
  unit_prefix: k
  round: 2
- platform: integration
  source: sensor.e3dc_battery_power
  name: E3DC Builtin Battery Energy
  unit_prefix: k
  round: 2
- platform: integration
  source: sensor.e3dc_battery_charge_power
  name: E3DC Battery Charge Energy
  unit_prefix: k
  round: 2
- platform: integration
  source: sensor.e3dc_battery_discharge_power
  name: E3DC Battery Discharge Energy
  unit_prefix: k
  round: 2
Roemer commented 1 year ago

I extended it and also added utility_meter for creating daily/weekly/monthly sensors for better graphs or exporting to prometheus. For this, I added the file utility_meters with the following content:

e3dc_utility_meters:
  utility_meter:
    # Solar Energy
    e3dc_solar_daily_energy:
      source: sensor.e3dc_solar_energy
      unique_id: e3dc_solar_daily_energy
      name: E3DC Solar Daily Energy
      cycle: daily
    e3dc_solar_monthly_energy:
      source: sensor.e3dc_solar_energy
      unique_id: e3dc_solar_monthly_energy
      name: E3DC Solar Monthly Energy
      cycle: monthly
    e3dc_solar_yearly_energy:
      source: sensor.e3dc_solar_energy
      unique_id: e3dc_solar_yearly_energy
      name: E3DC Solar Yearly Energy
      cycle: yearly
    # Grid Import Energy
    e3dc_grid_import_daily_energy:
      source: sensor.e3dc_grid_import_energy
      unique_id: e3dc_grid_import_daily_energy
      name: E3DC Grid Import Daily Energy
      cycle: daily
    e3dc_grid_import_monthly_energy:
      source: sensor.e3dc_grid_import_energy
      unique_id: e3dc_grid_import_monthly_energy
      name: E3DC Grid Import Monthly Energy
      cycle: monthly
    e3dc_grid_import_yearly_energy:
      source: sensor.e3dc_grid_import_energy
      unique_id: e3dc_grid_import_yearly_energy
      name: E3DC Grid Import Yearly Energy
      cycle: yearly
    # Grid Import Energy Cost
    e3dc_grid_import_daily_energy_cost:
      source: sensor.e3dc_grid_import_energy_cost
      unique_id: e3dc_grid_import_daily_energy_cost
      name: E3DC Grid Import Daily Energy Cost
      cycle: daily
    e3dc_grid_import_monthly_energy_cost:
      source: sensor.e3dc_grid_import_energy_cost
      unique_id: e3dc_grid_import_monthly_energy_cost
      name: E3DC Grid Import Monthly Energy Cost
      cycle: monthly
    e3dc_grid_import_yearly_energy_cost:
      source: sensor.e3dc_grid_import_energy_cost
      unique_id: e3dc_grid_import_yearly_energy_cost
      name: E3DC Grid Import Yearly Energy Cost
      cycle: yearly
    # Grid Export Energy
    e3dc_grid_export_daily_energy:
      source: sensor.e3dc_grid_export_energy
      unique_id: e3dc_grid_export_daily_energy
      name: E3DC Grid Export Daily Energy
      cycle: daily
    e3dc_grid_export_monthly_energy:
      source: sensor.e3dc_grid_export_energy
      unique_id: e3dc_grid_export_monthly_energy
      name: E3DC Grid Export Monthly Energy
      cycle: monthly
    e3dc_grid_export_yearly_energy:
      source: sensor.e3dc_grid_export_energy
      unique_id: e3dc_grid_export_yearly_energy
      name: E3DC Grid Export Yearly Energy
      cycle: yearly
    # Grid Export Energy Compensation
    e3dc_grid_export_daily_energy_compensation:
      source: sensor.e3dc_grid_export_energy_compensation
      unique_id: e3dc_grid_export_daily_energy_compensation
      name: E3DC Grid Export Daily Energy Compensation
      cycle: daily
    e3dc_grid_export_monthly_energy_compensation:
      source: sensor.e3dc_grid_export_energy_compensation
      unique_id: e3dc_grid_export_monthly_energy_compensation
      name: E3DC Grid Export Monthly Energy Compensation
      cycle: monthly
    e3dc_grid_export_yearly_energy_compensation:
      source: sensor.e3dc_grid_export_energy_compensation
      unique_id: e3dc_grid_export_yearly_energy_compensation
      name: E3DC Grid Export Yearly Energy Compensation
      cycle: yearly
    # Battery Charge Energy
    e3dc_battery_charge_daily_energy:
      source: sensor.e3dc_battery_charge_energy
      unique_id: e3dc_battery_charge_daily_energy
      name: E3DC Battery Charge Daily Energy
      cycle: daily
    e3dc_battery_charge_monthly_energy:
      source: sensor.e3dc_battery_charge_energy
      unique_id: e3dc_battery_charge_monthly_energy
      name: E3DC Battery Charge Monthly Energy
      cycle: monthly
    e3dc_battery_charge_yearly_energy:
      source: sensor.e3dc_battery_charge_energy
      unique_id: e3dc_battery_charge_yearly_energy
      name: E3DC Battery Charge Yearly Energy
      cycle: yearly
    # Battery Discharge Energy
    e3dc_battery_discharge_daily_energy:
      source: sensor.e3dc_battery_discharge_energy
      unique_id: e3dc_battery_discharge_daily_energy
      name: E3DC Battery Discharge Daily Energy
      cycle: daily
    e3dc_battery_discharge_monthly_energy:
      source: sensor.e3dc_battery_discharge_energy
      unique_id: e3dc_battery_discharge_monthly_energy
      name: E3DC Battery Discharge Monthly Energy
      cycle: monthly
    e3dc_battery_discharge_yearly_energy:
      source: sensor.e3dc_battery_discharge_energy
      unique_id: e3dc_battery_discharge_yearly_energy
      name: E3DC Battery Discharge Yearly Energy
      cycle: yearly
MrIceman11 commented 1 year ago

Hallo, Thangs for Sharing your Config! I will definitely use it.

Roemer commented 1 year ago

You can put all files in an e3dc subfolder in packages to have them neatly together. Also I had to add method: left to all integration sensors to prevent spikes (eg. when I didn't use grid power for 12 hours and then suddenly a lot of grid power, that would otherwise generate a huuge spike).

MrIceman11 commented 1 year ago

Yes, good idea. Was implemented like this!

Roemer commented 1 year ago

I think this is added and we can close this issue.