Senec Integration

Hallo,

ich möchte gerne meine Senec PV Anlage in HA integrieren.
Hat das schon Mal jemand gemacht?
Es gibt wohl mehrere Addons?
Welches soll ich nehmen?
Meine PV Anlage ist von 2024 / 2025.

Vielen Dank

Hallo vished,
ich habe seit 2023 eine Anlage mit Senec Home V3 Hybrid Duo am Laufen und diese seit etwa drei Monaten in HA eingebunden.
Ich verwende die „SENEC.Home V2.x/V3/V4 System“ Integration aus dem HACS. Davon verwende ich zwei Konfigs: Einmal die WEBAPI für die Langzeitwerte und den intern verbauten WR.
Klappt bisher problemlos.

Anleitung bin der Zugehörigen auf Github gefolgt: Link

Grüße, Marc

1 „Gefällt mir“

Perfekt - danke.
Das hat geklappt.

Wie sieht das bei dir im Energie Dashboard aus?
Die Entitäten habe ich nicht 100 % die gleichen, wie in der Doku?

Bei mir sieht das so aus, hab ich gerade schnell eingerichtet.
Sieht bei dir aus, als wärst du im Konfig-Screen. Oben links über den Pfeil zurück komme man in die Dashboardansicht.

Einen Batteriespeicher hast du nicht?

Bei mir sieht es so aus:

Doch, hatte das für das Energy Dashboard aber nur mal schnell eingerichtet und der Punkt hat gefehlt.

Hallo,
habe auch einen Senec Speicher über die „SENEC.Home V2.x/V3/V4 System“ in HA eingebunden. Habe mir eigene Diagramme mit Hilfe von Plotly erstellt, bzw. abgekupfert. Vielleicht könnt ihr das gebrauchen.


Code:

type: custom:plotly-graph
entities:
  - entity: sensor.direktverbrauch
    filters:
      - map_y_numbers: Math.round(Number(y))
    name: Direktverbrauch
    type: scatter
    mode: lines
    statistic: mean
    period: auto
    fillcolor: rgba(202,217,125,1)
    stackgroup: b
    line:
      shape: spline
      color: "#CAD97D"
      width: 0
  - entity: sensor.akku_entladung
    filters:
      - map_y_numbers: Math.round(Number(y))
    name: Akku Entladung
    type: scatter
    mode: lines
    stackgroup: b
    statistic: mean
    period: auto
    fillcolor: rgba(108,155,196,1)
    line:
      shape: spline
      color: "#6C9BC4"
      width: 0
  - entity: sensor.netzbezug
    filters:
      - map_y_numbers: Math.round(Number(y))
      - filter: y>0
    name: Netzbezug
    type: scatter
    mode: lines
    statistic: mean
    period: auto
    fillcolor: rgba(238,122,6,1)
    stackgroup: b
    line:
      shape: spline
      color: "#EE7A06"
      width: 0
  - entity: sensor.akku_beladung
    filters:
      - map_y_numbers: Math.round(Number(y))
    name: Akku Beladung
    type: scatter
    mode: lines
    statistic: mean
    period: auto
    fillcolor: rgba(170,225,252,1)
    stackgroup: b
    line:
      shape: spline
      color: "#AAE1FC"
      width: 0
  - entity: sensor.netzeinspeisung
    filters:
      - map_y_numbers: Math.round(Number(y))
      - filter: y>0
    name: Netzeinspeisung
    type: scatter
    mode: lines
    statistic: mean
    period: auto
    fillcolor: rgba(205,92,92,1)
    stackgroup: b
    line:
      shape: spline
      color: "#CD5C5C"
      width: 0
  - entity: sensor.verbrauch
    filters:
      - map_y_numbers: Math.round(Number(y))
    name: Verbrauch
    show_value: false
    type: scatter
    mode: lines
    statistic: mean
    period: auto
    line:
      shape: spline
      width: 1
      color: "#0C0B0B"
  - entity: sensor.senec_webapi_acculevel_now
    type: scatter
    mode: lines
    statistic: max
    period: auto
    line:
      shape: hv
      width: 0.7
      color: "#7032FF"
    filters:
      - filter: y>0
      - map_y_numbers: Math.round(Number(y))
    name: $ex `Akku Füllstand ${ys.at(-1)}%`
  - entity: sensor.verbrauch
    filters:
      - map_y_numbers: Math.round(Number(y))
    type: indicator
    mode: number
    value: $ex ys.at(-1)
    bgcolor: white
    title:
      text: Verbrauch
      font:
        size: 10
        color: black
        weight: 1000
    number:
      suffix: W
      valueformat: ","
      font:
        size: 10
        color: black
        weight: 1000
    domain:
      x:
        - 0
        - 0.1
      "y":
        - 0.99
        - 1
  - entity: sensor.netzbezug
    filters:
      - map_y_numbers: Math.round(Number(y))
    type: indicator
    mode: number
    value: $ex ys.at(-1)
    bgcolor: white
    title:
      text: Netzbezug
      font:
        size: 10
        color: "#EE7A06"
        weight: 1000
    number:
      suffix: W
      valueformat: ","
      font:
        size: 10
        color: "#EE7A06"
        weight: 1000
    domain:
      x:
        - 0.15
        - 0.25
      "y":
        - 0.99
        - 1
  - entity: sensor.erzeugung
    filters:
      - map_y_numbers: Math.round(Number(y))
    type: indicator
    mode: number
    value: $ex ys.at(-1)
    bgcolor: white
    title:
      text: Erzeugung
      font:
        size: 10
        color: null
        weight: 1000
    number:
      suffix: W
      valueformat: ","
      font:
        size: 10
        color: null
        weight: 1000
    domain:
      x:
        - 0.25
        - 0.4
      "y":
        - 0.99
        - 1
  - entity: sensor.direktverbrauch
    filters:
      - map_y_numbers: Math.round(Number(y))
    type: indicator
    mode: number
    value: $ex ys.at(-1)
    bgcolor: white
    title:
      text: Direktverbrauch
      font:
        size: 10
        color: green
        weight: 1000
    number:
      suffix: W
      valueformat: ","
      font:
        size: 10
        color: green
        weight: 1000
    domain:
      x:
        - 0.4
        - 0.55
      "y":
        - 0.99
        - 1
  - entity: sensor.netzeinspeisung
    filters:
      - map_y_numbers: Math.round(Number(y))
    type: indicator
    mode: number
    value: $ex ys.at(-1)
    bgcolor: white
    title:
      text: Netzeinspeisung
      font:
        size: 10
        color: "#CD5C5C"
        weight: 1000
    number:
      suffix: W
      valueformat: ","
      font:
        size: 10
        color: "#CD5C5C"
        weight: 1000
    domain:
      x:
        - 0.55
        - 0.7
      "y":
        - 0.99
        - 1
  - entity: sensor.akku_beladung
    filters:
      - map_y_numbers: Math.round(Number(y))
    type: indicator
    mode: number
    value: $ex ys.at(-1)
    bgcolor: white
    title:
      text: Beladung
      font:
        size: 10
        color: "#6C9BC4"
        weight: 1000
    number:
      suffix: W
      valueformat: ","
      font:
        size: 10
        color: "#6C9BC4"
        weight: 1000
    domain:
      x:
        - 0.7
        - 0.85
      "y":
        - 0.99
        - 1
  - entity: sensor.akku_entladung
    filters:
      - map_y_numbers: Math.round(Number(y))
    type: indicator
    mode: number
    value: $ex ys.at(-1)
    bgcolor: white
    title:
      text: Entladung
      font:
        size: 10
        color: "#0066CC"
        weight: 1000
    number:
      suffix: W
      valueformat: ","
      font:
        size: 10
        color: "#0066CC"
        weight: 1000
    domain:
      x:
        - 0.85
        - 0.999
      "y":
        - 0.99
        - 1
card_mod:
  style: |
    ha-card {
        border-width: 0px;
       }
title: Verbrauchsdiagramm
layout:
  legend:
    "y": -0.25
    x: 0.02
  paper_bgcolor: rgba(0,0,0,0)
  plot_bgcolor: rgba(0,0,0,0)
  margin:
    t: 25
  height: 550
  xaxis:
    rangeselector:
      "y": 1.15
      buttons:
        - count: 6
          step: hour
        - count: 1
          step: day
        - count: 7
          step: day
        - count: 10
          step: day
    gridcolor: rgba(238,235,235,0.5)
    showgrid: false
    showspikes: true
    linecolor: "#fff"
    spikethickness: 2
    spikedash: dot
    spikecolor: "#999999"
    spikemode: across
  yaxis:
    minallowed: 0
    showgrid: true
    gridcolor: rgba(238,235,235,0.6)
    linecolor: null
    title:
      font:
        size: 11
      text: W
    tickfont:
      size: 10
    side: left
  yaxis2:
    minallowed: 0
    showgrid: false
    gridcolor: rgba(238,235,235,0.6)
    linecolor: null
    linewidth: 0
    range:
      - 0
      - 101
    title:
      font:
        size: 8
        color: "#7032FF"
      text: "%"
    tickfont:
      size: 8
      color: "#7032FF"
    side: right
hours_to_show: 24
refresh_interval: 5
view_layout:
  grid-area: view2
  place-items: center
  place-content: center
  align-items: center
background: "#fff"
autorange_after_scroll: true
defaults:
  yaxes:
    fixedrange: true

zusätzlich habe ich noch analog zum Senec-Chart 2 Balkendiagramme für tägliche und monatliche Verbräuche erstellt, eine Kombination ist mir noch nicht gelungen, ich arbeite daran.


Code:

type: custom:plotly-graph
defaults:
  yaxes:
    fixedrange: true
  entity:
    period: day
    type: bar
    statistic: state
    texttemplate: "%{y:.1f}"
    textposition: auto
entities:
  - entity: sensor.direktverbrauch_tag
    name: Direktverbrauch
    visible: true
    yaxis: y3
    marker:
      color: "#CAD97D"
      opacity: 0.5
    filters:
      - filter: i>0 && i < xs.length - 1
      - fn: |
          ({ys,xs,hass}) => ({
            xs: [...xs, new Date().setHours(5,0,0)],
            ys: [...ys, hass.states['sensor.direktverbrauch_tag'].state],
          })
      - force_numeric
    time_offset: 5h
  - entity: sensor.direktverbrauch_tag
    name: Direkti // !!nur zur Berechnung!!
    internal: true
    visible: legendonly
    marker:
      color: magenta
      opacity: 2
    filters:
      - filter: i>0 && i < xs.length - 1
      - fn: |
          ({ys,xs,hass}) => ({
            xs: [...xs, new Date().setHours(5,0,0)],
            ys: [...ys, hass.states['sensor.direktverbrauch_tag'].state],
          })
      - force_numeric
      - store_var: dir
  - entity: sensor.erzeugung_tag
    name: Erzeugung
    marker:
      color: "#4169E1"
      opacity: 2
    filters:
      - filter: i>0 && i < xs.length - 1
      - fn: |
          ({ys,xs,hass}) => ({
            xs: [...xs, new Date().setHours(-5,0,0)],
            ys: [...ys, hass.states['sensor.erzeugung_tag'].state],
          })
      - store_var: erz
    time_offset: "-5h"
  - entity: sensor.akku_entladung_tag
    name: Akku Entladung
    marker:
      color: "#6C9BC4"
      opacity: 2
    filters:
      - filter: i>0 && i < xs.length - 1
      - fn: |
          ({ys,xs,hass}) => ({
            xs: [...xs, new Date().setHours(-5,0,0)],
            ys: [...ys, hass.states['sensor.akku_entladung_tag'].state],
          })
      - force_numeric
    time_offset: "-5h"
  - entity: sensor.akku_entladung_tag
    name: Akku Entladung
    internal: true
    marker:
      color: "#6C9BC4"
      opacity: 2
    filters:
      - filter: i>0 && i < xs.length - 1
      - fn: |
          ({ys,xs,hass}) => ({
            xs: [...xs, new Date().setHours(0,0,0)],
            ys: [...ys, hass.states['sensor.akku_entladung_tag'].state],
          })
      - force_numeric
      - store_var: entl
  - entity: sensor.netzbezug_tag
    name: Netzbezug
    marker:
      color: "#EE7A06"
      opacity: 0.9
    filters:
      - filter: i>0 && i < xs.length - 1
      - fn: |
          ({ys,xs,hass}) => ({
            xs: [...xs, new Date().setHours(-5,0,0)],
            ys: [...ys, hass.states['sensor.netzbezug_tag'].state],
          })
    time_offset: "-5h"
  - entity: sensor.verbrauch_tag
    name: Verbrauch // !!nur zur Berechnung!!
    internal: true
    marker:
      color: "#428c75"
      opacity: 2
    filters:
      - filter: i>0 && i < xs.length - 1
      - fn: |
          ({ys,xs,hass}) => ({
            xs: [...xs, new Date().setHours(5,0,0)],
            ys: [...ys, hass.states['sensor.verbrauch_tag'].state],
          })
      - force_numeric
      - store_var: verb
  - entity: sensor.verbrauch_tag
    name: Verbrauch
    marker:
      color: "#428c75"
      opacity: 1
    filters:
      - filter: i>0 && i < xs.length - 1
      - fn: |
          ({ys,xs,hass}) => ({
            xs: [...xs, new Date().setHours(5,0,0)],
            ys: [...ys, hass.states['sensor.verbrauch_tag'].state],
          })
      - force_numeric
    time_offset: 5h
  - entity: sensor.akku_beladung_tag
    name: Akku Beladung
    marker:
      color: "#AAE1FC"
      opacity: 2
    filters:
      - filter: i>0 && i < xs.length - 1
      - fn: |
          ({ys,xs,hass}) => ({
            xs: [...xs, new Date().setHours(5,0,0)],
            ys: [...ys, hass.states['sensor.akku_beladung_tag'].state],
          })
    time_offset: 5h
  - entity: sensor.netzeinspeisung_tag
    name: Netzeinspeisung
    marker:
      color: rgba(205,92,92,1)
      opacity: 2
    filters:
      - filter: i>0 && i < xs.length - 1
      - fn: |
          ({ys,xs,hass}) => ({
            xs: [...xs, new Date().setHours(5,0,0)],
            ys: [...ys, hass.states['sensor.netzeinspeisung_tag'].state],
          })
    time_offset: 5h
  - entity: ""
    name: Autarkie
    type: scatter
    stackgroup: 0
    fillcolor: rgba(202,217,125,0)
    mode: lines+markers
    line:
      shape: hv
      width: 0.5
      color: null
      dash: dot
    filters:
      - load_var: dir
      - filter: i>=0
      - map_y_numbers: (((y+vars.entl.ys[i])/vars.verb.ys[i])*100).toFixed(1)
    unit_of_measurement: "%"
    marker:
      color: |-
        $ex ys.map(y => {
          let value = parseFloat(y);
          return value > 90 ?"darkgreen" : 
                 value > 60 ? "MidnightBlue" : 
                 value > 3 ? "red" : 
                 value > 2 ? "orange" : 
                 value > 1 ? "darkblue" : 
                 value > 0.5 ? "blue" : "green";
        })
  - entity: ""
    name: ""
    type: bar
    showlegend: false
    texttemplate: null // !!Abstandhalter für 1. Balken!!
    hoverinfo: name
    marker:
      color: transparent
      opacity: 0.1
    yaxis: y3
    filters:
      - load_var: erz
      - filter: i>=0
      - map_y_numbers: (y/1000).toFixed(0)
    unit_of_measurement: kWh
    time_offset: "-5h"
layout:
  paper_bgcolor: rgba(0,0,0,0)
  plot_bgcolor: rgba(0,0,0,0)
  barmode: stack
  bargap: 0.2
  uniformtext:
    minsize: 10
    mode: show
  modebar:
    orientation: v
    remove: zoom
  margin:
    t: 25
    l: 50
    r: 60
  height: 500
  legend:
    "y": -0.25
    x: 0.02
  xaxis:
    rangeselector:
      "y": 1.15
      buttons:
        - count: 1
          step: day
        - count: 7
          step: day
        - count: 10
          step: day
        - count: 30
          step: day
    gridcolor: rgba(238,235,235,0.3)
    autorange: true
    showgrid: true
    linewidth: 0
    linecolor: null
    nticks: 7
    tickformat: |-
      %d %b
      %Y
  yaxis:
    visible: true
    autorange: true
  yaxis2:
    side: right
    range:
      - 0
      - 101
  yaxis3:
    visible: false
    side: left
    matches: "y"
hours_to_show: 7d
refresh_interval: 5
title: Energiedaten täglich
view_layout:
  position: main

hierfür werden noch zusätzlich Verbrauchhelfer benötigt.
Monatlich:

Code:

type: custom:plotly-graph
defaults:
  yaxes:
    fixedrange: true
  entity:
    period: month
    type: bar
    unit_of_measurement: kWh
    statistic: state
    texttemplate: "%{y:.1f}"
    textposition: auto
entities:
  - entity: sensor.direktverbrauch_kwh
    name: Direktverbrauch
    textposition: inside
    visible: true
    yaxis: y3
    marker:
      color: "#CAD97D"
      opacity: 0.5
    filters:
      - filter: i>=0
      - delta
      - force_numeric
    time_offset: 120h
  - entity: sensor.direktverbrauch_kwh
    name: Direktverbrauch
    internal: true
    yaxis: y3
    marker:
      color: "#CAD97D"
      opacity: 0.5
    filters:
      - filter: i>=0
      - delta
      - force_numeric
      - store_var: dir
  - entity: sensor.senec_webapi_powergenerated_total
    name: Erzeugung
    marker:
      color: "#4169E1"
      opacity: 2
    filters:
      - filter: i>=0
      - delta
      - store_var: erz
    time_offset: "-120h"
  - entity: sensor.senec_webapi_accuimport_total
    name: Akku Entladung
    marker:
      color: "#6C9BC4"
      opacity: 2
    filters:
      - filter: i>=0
      - delta
      - force_numeric
      - store_var: entl
    time_offset: "-120h"
  - entity: sensor.senec_webapi_gridimport_total
    name: Netzbezug
    marker:
      color: "#EE7A06"
      opacity: 0.9
    filters:
      - filter: i>=0
      - delta
    time_offset: "-120h"
  - entity: sensor.senec_webapi_consumption_total
    name: Verbrauch // nur zur Berechnung
    internal: true
    marker:
      color: "#428c75"
      opacity: 2
    filters:
      - filter: i>=0
      - delta
      - force_numeric
      - store_var: verb
  - entity: sensor.senec_webapi_consumption_total
    name: Verbrauch
    marker:
      color: "#428c75"
      opacity: 2
    filters:
      - filter: i>=0
      - delta
      - force_numeric
    time_offset: 120h
  - entity: sensor.senec_webapi_accuexport_total
    name: Akku Beladung
    marker:
      color: "#AAE1FC"
      opacity: 2
    filters:
      - filter: i>=0
      - delta
    time_offset: 120h
  - entity: sensor.senec_webapi_gridexport_total
    name: Netzeinspeisung
    marker:
      color: rgba(205,92,92,1)
      opacity: 2
    filters:
      - filter: i>=0
      - delta
    time_offset: 120h
  - entity: ""
    name: Autarkie
    type: scatter
    stackgroup: 0
    fillcolor: rgba(202,217,125,0)
    mode: lines+markers
    line:
      shape: hv
      width: 0.5
      color: null
      dash: dot
    filters:
      - load_var: dir
      - filter: i>=0
      - map_y_numbers: (((y+vars.entl.ys[i+1])/vars.verb.ys[i+1])*100).toFixed(1)
    unit_of_measurement: "%"
    time_offset: "-120h"
    marker:
      color: |-
        $ex ys.map(y => {
          let value = parseFloat(y);
          return value > 50 ?"green" : 
                 value > 4 ? "red" : 
                 value > 3 ? "darkorange" : 
                 value > 2 ? "orange" : 
                 value > 1 ? "darkblue" : 
                 value > 0.5 ? "blue" : "green";
        })
  - entity: ""
    name: ddd
    type: bar
    texttemplate: null
    showlegend: false
    hoverinfo: name
    marker:
      color: null
      opacity: 0.7
    yaxis: y3
    filters:
      - load_var: erz
      - filter: i>=0
      - map_y_numbers: (y/10000).toFixed(0)
    unit_of_measurement: kWh
    time_offset: "-120h"
layout:
  paper_bgcolor: rgba(0,0,0,0)
  plot_bgcolor: rgba(0,0,0,0)
  barmode: stack
  bargap: 0.1
  bargroupgap: 0
  uniformtext:
    minsize: 10
    mode: show
  modebar:
    orientation: v
    remove: zoom
  margin:
    t: 25
    l: 50
    r: 60
  height: 500
  legend:
    "y": -0.25
    x: 0.02
  xaxis:
    rangeselector:
      "y": 1.15
      buttons:
        - count: 3
          step: month
        - count: 6
          step: month
        - count: 12
          step: month
    gridcolor: rgba(238,235,235,0.3)
    autorange: true
    showgrid: true
    linewidth: 0
    linecolor: null
    nticks: 6
    tickformat: |-
      %b
       %Y
  xaxis2:
    visible: false
    matches: x
  yaxis:
    side: left
    visible: true
  yaxis2:
    range:
      - 0
      - 100
  yaxis3:
    visible: false
    side: left
    matches: "y"
hours_to_show: 6M
refresh_interval: 5
title: Energiedaten monatlich
view_layout:
  position: main
modebar:
  orientation: h
  remove: pan

gerne weiter verbessern oder abkupfern oder nachfragen, das Forum lebt davon.
Gruß Hans

1 „Gefällt mir“