Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Tester
  4. Test Adapter fronius-solarweb

NEWS

  • wichtiges UPDATE für controller 7.2.2 im stable
    HomoranH
    Homoran
    9
    1
    584

  • Neues YouTube-Video: Visualisierung im Devices-Adapter
    BluefoxB
    Bluefox
    16
    1
    2.9k

  • Neuer ioBroker-Blog online: Monatsrückblick März/April 2026
    BluefoxB
    Bluefox
    8
    1
    3.0k

Test Adapter fronius-solarweb

Geplant Angeheftet Gesperrt Verschoben Tester
247 Beiträge 49 Kommentatoren 62.0k Aufrufe 43 Beobachtet
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • T TimoWald

    Wo finde ich die Liste mit den Registern?

    L Offline
    L Offline
    legro
    schrieb am zuletzt editiert von legro
    #224

    @TimoWald sagte in Test Adapter fronius-solarweb:

    Wo finde ich die Liste mit den Registern?

    NACHTRAG

    • Du benötigst für meine hier zitierte Lösung ein Fronius Smartmeter, dessen Register werden im JavaScript über die Modbus ID = 200 referenziert.
    • Der Ohmpilot hat wohl einen eigenen Modbus und IP. In diesem Thread findest du vermutlich alles, was du brauchst.

    Raspberry Pi 5 mit 8GB + 120GB SSD + Coordinator COD-m + ioBroker ..

    1 Antwort Letzte Antwort
    0
    • L legro

      @TimoWald sagte in Test Adapter fronius-solarweb:

      Genauso Ähnlich wollte ich es auch aufbauen.

      Damit du nicht ganz von vorne anfangen musst, hier meine oben beschriebene Lösung in Form eines JavaScripts ..

      let partsDate = {jahr: '', monat: '', tag: ''}
      let eventPV = null
      let eventFromGrid = null
      let eventEnergyTotal = null
      
      function setPartsDate() {
          let alleMonate = ['Januar', 'Februar', 'Maerz', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember']
          let d = new Date()
          partsDate = {jahr: d.getFullYear().toString(), monat: alleMonate[d.getMonth()], tag: d.getDate().toString()}
      }
      
      setPartsDate()
      
      schedule({hour: 0, minute: 0}, function () {
          setPartsDate()
          //TagesStartwert für PV
          setState(`0_userdata.0.Fronius.Modbus.atHome.startDayWhPV`,getState(`modbus.2.holdingRegisters.1.40186_ActWh`).val,true)
          setState(`0_userdata.0.Counter.Strom.startTagPV`,getState(`modbus.2.holdingRegisters.1.40186_ActWh`).val,true)
          //TagesStartwert für Export
          setState(`0_userdata.0.Fronius.Modbus.toGrid.startDayWh`,getState(`modbus.2.holdingRegisters.200.40107_TotWhExp`).val,true)
          setState(`0_userdata.0.Counter.Strom.startTagVerkaufStrom`,getState(`modbus.2.holdingRegisters.200.40107_TotWhExp`).val,true)
          //TagesStartwert für Import
          setState(`0_userdata.0.Fronius.Modbus.fromGrid.startDayWh`,getState(`modbus.2.holdingRegisters.200.40115_TotWhImp`).val,true)    
          setState(`0_userdata.0.Counter.Strom.startTagBezugStrom`,getState(`modbus.2.holdingRegisters.200.40115_TotWhImp`).val,true)
          //TagesStartWert für Gas
          setState('0_userdata.0.Counter.Gas.startTagGas',getState('0_userdata.0.Counter.Gas.volGas').val,true)
      })
      
      eventFromGrid = on({id: `modbus.2.holdingRegisters.200.40115_TotWhImp`, change: 'gt'}, (obj) => {
          let aktImp = obj.state.val - getState(`0_userdata.0.Fronius.Modbus.fromGrid.startDayWh`).val
          setState(`0_userdata.0.Fronius.Modbus.fromGrid.tmpDayWh`,aktImp,true)
          let tmpPV = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${partsDate.jahr}.${partsDate.monat}.fromGridWh`).val)
          tmpPV[Number(partsDate.tag)-1] = aktImp
          setState(`0_userdata.0.Fronius.Monatstabellen.${partsDate.jahr}.${partsDate.monat}.fromGridWh`,JSON.stringify(tmpPV),true)
      })
      
      eventPV = on({id: `modbus.2.holdingRegisters.200.40107_TotWhExp`, change: 'gt'}, (obj) => {
          let aktExp = obj.state.val - getState(`0_userdata.0.Fronius.Modbus.toGrid.startDayWh`).val
          setState('0_userdata.0.Fronius.Modbus.toGrid.tmpDayWh',aktExp,true)
          let tmpPV = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${partsDate.jahr}.${partsDate.monat}.toGridWh`).val)
          tmpPV[Number(partsDate.tag)-1] = aktExp
          setState(`0_userdata.0.Fronius.Monatstabellen.${partsDate.jahr}.${partsDate.monat}.toGridWh`,JSON.stringify(tmpPV),true)
      })
      
      eventEnergyTotal = on({id: `modbus.2.holdingRegisters.1.40186_ActWh`, change: 'gt'}, (obj) => {
          let aktGen = obj.state.val - getState(`0_userdata.0.Fronius.Modbus.atHome.startDayWhPV`).val
          setState(`0_userdata.0.Fronius.Modbus.atHome.tmpDayWhPV`,aktGen,true)
          let tmpPV = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${partsDate.jahr}.${partsDate.monat}.solarWh`).val)
          tmpPV[Number(partsDate.tag)-1] = aktGen
          setState(`0_userdata.0.Fronius.Monatstabellen.${partsDate.jahr}.${partsDate.monat}.solarWh`,JSON.stringify(tmpPV),true)
      })
      

      Da ich keinen Ohmpilot habe, musst du dir hierzu die Register leider selbst suchen.

      T Online
      T Online
      TimoWald
      schrieb am zuletzt editiert von
      #225

      @legro Was genau mache ich mit dem Javascript?

      L 1 Antwort Letzte Antwort
      0
      • T TimoWald

        @legro Was genau mache ich mit dem Javascript?

        L Offline
        L Offline
        legro
        schrieb am zuletzt editiert von
        #226

        @TimoWald sagte in Test Adapter fronius-solarweb:

        @legro Was genau mache ich mit dem Javascript?

        Du kannst findest zumindest einige der von dir gewünschten Datenpunkte in dem Script. Darüber hinaus dokumentiert das Script mein Vorgehen, wie man die Daten in eigenen Monatstabellen ablegen kann.

        Wenn du das Ganze ggf. ähnlich gestalten willst, helfe ich gerne.

        Raspberry Pi 5 mit 8GB + 120GB SSD + Coordinator COD-m + ioBroker ..

        T 1 Antwort Letzte Antwort
        0
        • L legro

          @TimoWald sagte in Test Adapter fronius-solarweb:

          @legro Was genau mache ich mit dem Javascript?

          Du kannst findest zumindest einige der von dir gewünschten Datenpunkte in dem Script. Darüber hinaus dokumentiert das Script mein Vorgehen, wie man die Daten in eigenen Monatstabellen ablegen kann.

          Wenn du das Ganze ggf. ähnlich gestalten willst, helfe ich gerne.

          T Online
          T Online
          TimoWald
          schrieb am zuletzt editiert von
          #227

          @legro Sorry aber ich kann echt nix mit dem Script anfangen.
          Aktuell sieht es bei mir so aus.

          5f9a52b3-115d-4908-98e5-584f9a53352b-grafik.png

          L 1 Antwort Letzte Antwort
          0
          • T TimoWald

            @legro Sorry aber ich kann echt nix mit dem Script anfangen.
            Aktuell sieht es bei mir so aus.

            5f9a52b3-115d-4908-98e5-584f9a53352b-grafik.png

            L Offline
            L Offline
            legro
            schrieb am zuletzt editiert von legro
            #228

            @TimoWald sagte in Test Adapter fronius-solarweb:

            @legro Sorry aber ich kann echt nix mit dem Script anfangen.
            Aktuell sieht es bei mir so aus.

            Irgendwie geht‘s mir wie dir: Mit deiner Abbildung kann ich nichts anfangen.

            Hast du die Modbus Register (noch) nicht in deine ioBroker Installation eingefügt? Das ist ganz schön viel Arbeit. Aber auch hier musst du das Rad nicht neu erfinden. Ich habe in diesem Beitrag alles zusammengetragen, was man benötigt, den GEN24 via Modbus auszulesen und zu steuern. Am einfachsten importierst du die TSV Datei(en), die du benötigst, dann musst die vielen Datenpunkte nicht selbst erstellen.

            Wenn du dies erledigt hast, solltest du etwa das Register „ modbus.2.holdingRegisters.1.40186_ActWh“ finden, dass ich in dem Script in Zeile 17 referenziere. Dieses Register enthält beim GEN24 die seit Inbetriebnahme erzeugte Energie (DC) in der Einheit KWh.

            Raspberry Pi 5 mit 8GB + 120GB SSD + Coordinator COD-m + ioBroker ..

            1 Antwort Letzte Antwort
            0
            • L Offline
              L Offline
              legro
              schrieb am zuletzt editiert von
              #229

              @timowald
              Diese TSV Datei kann in der Modbus Instanz importiert werden.

              _address	deviceId	name	description	unit	type	len	factor	offset	formula	role	room	poll	wp	cw	isScale
              40000	1	SID	Well-known value. Uniquely identifies this as a SunSpec Modbus Map		uint32be	2	1	0		value		true			
              40002	1	ID	Well-known value. Uniquely identifies this as a sunspec model common (1)		uint16be	1	1	0		value		true			
              40003	1	L	Length of sunspec model common (1)		uint16be	1	1	0		value		true			
              40004	1	MN	Manufacturer		string	16	1	0		value		true			
              40020	1	Md	Device		string	16	1	0		value		true			
              40036	1	Opt	Options (not supported)		string	8	1	0		value		true			
              40044	1	Vr	SW version of inverter		string	8	1	0		value		true			
              40052	1	SN	Serialnumber of the inverter		string	8	1	0		value		true			
              40068	1	DA	Modbus Device Address		uint16be	1	1	0		value		true			
              40069	1	ID	Well-known value. Uniquely identifies this as a sunspec model inverter (10x)		uint16be	1	1	0		value		true			
              40070	1	L	Length of sunspec model inverter (10x)		int16be	1	1	0		value		true			
              40071	1	A	AC Current	A	uint16be	1	1	0		value		true			
              40072	1	AhA	Phase A Current	A	uint16be	1	1	0		value		true			
              40073	1	AphB	Phase B Current	A	uint16be	1	1	0		value		true			
              40074	1	AphC	Phase C Current	A	uint16be	1	1	0		value		true			
              40075	1	A_SF	Current Scale Factor		int16be	1	1	0		value		true			
              40076	1	PPVphAB	Phase Voltage AB	V	uint16be	1	1	0		value		true			
              40077	1	PPVphBC	Phase Voltage BC	V	uint16be	1	1	0		value		true			
              40078	1	PPVphAC	Phase Voltage AC	V	uint16be	1	1	0		value		true			
              40079	1	PhVphA	Phase Voltage AN	V	uint16be	1	1	0		value		true			
              40080	1	PhVphB	Phase Voltage BN	V	uint16be	1	1	0		value		true			
              40081	1	PhVphC	Phase Voltage CN	V	uint16be	1	1	0		value		true			
              40082	1	V_SF	Voltage Scale Factor		int16be	1	1	0		value		true			
              40083	1	W	AC Power	W	int16be	1	1	0	x * Math.pow(10, sf['40084'])	value		true			
              40084	1	W_SF	Power Scale Factor		int16be	1	1	0		value		true			true
              40085	1	Hz	Line Frequency	Hz	uint16be	1	1	0		value		true			
              40086	1	Hz_SF	Frequency Scale Factor		int16be	1	1	0		value		true			
              40087	1	VA	AC Apparent Power	VA	int16be	1	1	0		value		true			
              40088	1	VA_SF	Scaling Factor Apparent Power		int16be	1	1	0		value		true			
              40089	1	VAr	AC Reactive Power	VAR	int16be	1	1	0		value		true			
              40090	1	VAr_SF	Scaling Factor AC Reactive Power		int16be	1	1	0		value		true			
              40091	1	PF	AC Power Factor	Pct	int16be	1	1	0		value		true			
              40092	1	PF_SF	Scaling Factor AC Power Factor		int16be	1	1	0		value		true			
              40093	1	WH	AC Energy	Wh	uint32be	2	1	0	x * Math.pow(10, sf['40095'])	value		true			
              40095	1	WH_SF	Scaling Factor AC Energy		int16be	1	1	0		value		true			true
              40096	1	DCA	DC Current (not supported)	A	uint16be	1	1	0		value		false			
              40097	1	DCA_SF	Scaling Factor DC Current (not supported)		int16be	1	1	0		value		false			
              40098	1	DCV	DC Voltage (not supported)	V	uint16be	1	1	0		value		false			
              40099	1	DCV_SF	Scaling Factor DC Voltage (not supported)		int16be	1	1	0		value		false			
              40100	1	DCW	DC Power	W	int16be	1	1	0	x * Math.pow(10, sf['40101'])	value		true		false	
              40101	1	DCW_SF	Scaling Factor DC Power		int16be	1	1	0		value		true		false	true
              40102	1	TmpCab	Cabinet Temperature	C	int16be	1	1	0		value		true			
              40103	1	TmpSnk	Heat Sink Temperature (not supported)	C	int16be	1	1	0		value		false			
              40104	1	TmpTms	Transformer Temperature (not supported)	C	int16be	1	1	0		value		false			
              40105	1	TmpOt	Other Temperature (not supported)	C	int16be	1	1	0		value		false			
              40106	1	Tmp_SF	Scaling Factor Temperature	C	int16be	1	1	0		value		true			
              40107	1	St	Enumerated value.  Operating state		uint16be	1	1	0		value		true			
              40108	1	StVnd	Vendor specific operating state code		uint16be	1	1	0		value		true			
              40109	1	Evt1	Bitmask value. Event fields		uint32be	2	1	0		value		true			
              40111	1	Evt2	Reserved for future use		uint32be	2	1	0		value		true			
              40113	1	EvtVnd1	Vendor defined events		uint32be	2	1	0		value		true			
              40115	1	EvtVnd2	Vendor defined events		uint32be	2	1	0		value		true			
              40117	1	EvtVnd3	Vendor defined events (not supported)		uint32be	2	1	0		value		false			
              40119	1	EvtVnd4	Vendor defined events (not supported)		uint32be	2	1	0		value		false			
              40121	1	ID	Well-known value. Uniquely identifies this as a sunspec model nameplate (120)		uint16be	1	1	0		value		true			
              40122	1	L	Length of sunspec model nameplate (120)		uint16be	1	1	0		value		true			
              40123	1	DERTyp	Type of DER device. Default value is 4 to indicate PV device.		uint16be	1	1	0		value		true			
              40124	1	WRtg	Continuous power output capability of the inverter.	W	uint16be	1	1	0		value		true			
              40125	1	WRtg_SF	Scale Factor		int16be	1	1	0		value		true			
              40126	1	VARtg	Continuous Volt-Ampere capability of the inverter.	VA	uint16be	1	1	0		value		true			
              40127	1	VARtg_SF	Scale Factor		int16be	1	1	0		value		true			
              40128	1	VArRtgQ1	Continuous VAR capability of the inverter in quadrant 1.		int16be	1	1	0		value		true			
              40129	1	VArRtgQ2	Continuous VAR capability of the inverter in quadrant 2.		int16be	1	1	0		value		true			
              40130	1	VArRtgQ3	Continuous VAR capability of the inverter in quadrant 3.		int16be	1	1	0		value		true			
              40131	1	VArRtgQ4	Continuous VAR capability of the inverter in quadrant 4.		int16be	1	1	0		value		true			
              40132	1	VArRtg_SF	Scaling Factor		int16be	1	1	0		value		true			
              40133	1	ARtg	Maximum RMS AC current level capability of the inverter.		uint16be	1	1	0		value		true			
              40134	1	ARtg_SF	Scale Factor		int16be	1	1	0		value		true			
              40135	1	PFRtgQ1	Minimum power factor capability of the inverter in quadrant 1.		int16be	1	1	0		value		true			
              40136	1	PFRtgQ2	Minimum power factor capability of the inverter in quadrant 2.		int16be	1	1	0		value		true			
              40137	1	PFRtgQ3	Minimum power factor capability of the inverter in quadrant 3.		int16be	1	1	0		value		true			
              40138	1	PFRtgQ4	Minimum power factor capability of the inverter in quadrant 4.		int16be	1	1	0		value		true			
              40139	1	PFRtg_SF	Scale Factor		int16be	1	1	0		value		true			
              40140	1	WHRtg	Nominal energy rating of storage device.		uint16be	1	1	0		value		true			
              40141	1	WHRtg_SF	Scale Fator		int16be	1	1	0		value		true			
              40142	1	AhrRtg	The usable capacity of the battery.  Maximum charge minus minimum charge from a technology capability perspective (Amp-hour capacity rating).		uint16be	1	1	0		value		false			
              40143	1	AhrRtg_SF	Scale factor for amp-hour rating.		int16be	1	1	0		value		false			
              40144	1	MaxChaRte	Maximum rate of energy transfer into the storage device.	W	uint16be	1	1	0		value		true			
              40145	1	MaxChaRte_SF	Scale factor		int16be	1	1	0		value		true			
              40146	1	MaxDisChaRte	Maximum rate of energy transfer out of the storage device.	W	uint16be	1	1	0		value		true			
              40147	1	MaxDisChaRte_SF	Scale Factor		int16be	1	1	0		value		true			
              40148	1	Pad	Pad register.		uint16be	1	1	0		value		true			
              40149	1	ID	Well-known value. Uniquely identifies this as a sunspec model settings (121)		uint16be	1	1	0		value		true			
              40150	1	L	Length of sunspec model settings (121)		uint16be	1	1	0		value		true			
              40151	1	WMax	Setting for maximum power output. Default to WRtg.	W	uint16be	1	1	0		value		true			
              40152	1	VRef	Voltage at the PCC.	V	uint16be	1	1	0		value		true			
              40153	1	VRefOfs	Offset  from PCC to inverter.	V	int16be	1	1	0		value		true			
              40154	1	VMax	Setpoint for maximum voltage.	V	uint16be	1	1	0		value		false			
              40155	1	VMin	Setpoint for minimum voltage.	V	uint16be	1	1	0		value		false			
              40156	1	VAMax	Setpoint for maximum apparent power. Default to VARtg.	VA	uint16be	1	1	0		value		true			
              40157	1	VArMaxQ1	Setting for maximum reactive power in quadrant 1. Default to VArRtgQ1.	var	int16be	1	1	0		value		true			
              40158	1	VArMaxQ2	Setting for maximum reactive power in quadrant 2. Default to VArRtgQ2.	var	int16be	1	1	0		value		true			
              40159	1	VArMaxQ3	Setting for maximum reactive power in quadrant 3. Default to VArRtgQ3.	var	int16be	1	1	0		value		true			
              40160	1	VArMaxQ4	Setting for maximum reactive power in quadrant 4. Default to VArRtgQ4.	var	int16be	1	1	0		value		true			
              40161	1	WGra	Default ramp rate of change of active power due to command or internal action.	% WMax/sec	uint16be	1	1	0		value		false			
              40162	1	PFMinQ1	Setpoint for minimum power factor value in quadrant 1. Default to PFRtgQ1.		int16be	1	1	0		value		true			
              40163	1	PFMinQ1	Setpoint for minimum power factor value in quadrant 2. Default to PFRtgQ2.		int16be	1	1	0		value		true			
              40164	1	PFMinQ2	Setpoint for minimum power factor value in quadrant 3. Default to PFRtgQ3.		int16be	1	1	0		value		true			
              40165	1	PFMinQ2	Setpoint for minimum power factor value in quadrant 4. Default to PFRtgQ4.		int16be	1	1	0		value		true			
              40166	1	VArAct	VAR action on change between charging and discharging: 1=switch 2=maintain VAR characterization.		uint16be	1	1	0		value		false			
              40167	1	ClcTotVA	Calculation method for total apparent power. 1=vector 2=arithmetic.		uint16be	1	1	0		value		false			
              40168	1	MaxRmpRte	Setpoint for maximum ramp rate as percentage of nominal maximum ramp rate. This setting will limit the rate that watts delivery to the grid can increase or decrease in response to intermittent PV generation.	% WGra	uint16be	1	1	0		value		false			
              40169	1	ECPNomHz	Setpoint for nominal frequency at the ECP.	Hz	uint16be	1	1	0		value		false			
              40170	1	ConnPh	Identity of connected phase for single phase inverters. A=1 B=2 C=3.		uint16be	1	1	0		value		false			
              40171	1	WMax_SF	Scale factor for real power.		int16be	1	1	0		value		true			
              40172	1	VRef_SF	Scale factor for voltage at the PCC.		int16be	1	1	0		value		true			
              40173	1	VRefOfs_SF	Scale factor for offset voltage.		uint16be	1	1	0		value		true			
              40174	1	VMinMax_SF	Scale factor for min/max voltages.		int16be	1	1	0		value		true			
              40175	1	VAMax_SF	Scale factor for apparent power.		int16be	1	1	0		value		true			
              40176	1	VArMax_SF	Scale factor for reactive power.		int16be	1	1	0		value		true			
              40177	1	WGra_SF	Scale factor for default ramp rate.		int16be	1	1	0		value		false			
              40178	1	PFMin_SF	Scale factor for minimum power factor.		int16be	1	1	0		value		true			
              40179	1	Scale factor for maximum ramp percentage.	Scale factor for maximum ramp percentage. (not supported)		int16be	1	1	0		value		false			
              40180	1	ECPNomHz_SF	Scale factor for nominal frequency. (not supported)		int16be	1	1	0		value		false			
              40181	1	ID	Well-known value. Uniquely identifies this as a sunspec model status (122)		uint16be	1	1	0		value		true			
              40182	1	L	Length of sunspec model status (122)		uint16be	1	1	0		value		true			
              40184	1	PVConn	PV inverter present/available status. Enumerated value.		uint16be	1	1	0		value		true			
              40184	1	StorConn	Storage inverter present/available status. Enumerated value.		uint16be	1	1	0		value		true			
              40185	1	ECPConn	ECP connection status: disconnected=0  connected=1.		uint16be	1	1	0		value		true			
              40186	1	ActWh	AC lifetime active (real) energy output.	Wh	uint64be	4	1	0		value		true			
              40216	1	StActCtl	Bit Mask indicating which inverter controls are currently active.		uint32be	2	1	0		value		true			
              40218	1	TmSrc	Source of time synchronization.		string	4	1	0		value		true			
              40222	1	Tms	Seconds since 01-01-2000 00:00 UTC		uint32be	2	1	0		value		true			
              40225	1	Ris	Isolation resistance.		uint16be	1	1	0		value		true			
              40226	1	Ris_SF	SF		uint16be	1	1	0		value		true			
              40227	1	ID	Well-known value. Uniquely identifies this as a sunspec model controls (123)		uint16be	1	1	0		value		true			
              40228	1	L	Length of sunspec model controls (123)		uint16be	1	1	0		value		true			
              40229	1	Conn_WinTms	Time window for connect/disconnect.		uint16be	1	1	0		value		true			
              40230	1	Conn_RvrtTms	Timeout period for connect/disconnect.		uint16be	1	1	0		value		true			
              40231	1	Conn	Enumerated valued.  Connection control.		uint16be	1	1	0		value		true			
              40232	1	WMaxLimPct	Set power output to specified level.		uint16be	1	1	0		value		true			
              40233	1	WMaxLimPct_WinTms	Time window for power limit change.		uint16be	1	1	0		value		true			
              40234	1	WMaxLimPct_RvrtTms	Timeout period for power limit.		uint16be	1	1	0		value		true			
              40235	1	WMaxLimPct_RmpTms	Ramp time for moving from current setpoint to new setpoint.		uint16be	1	1	0		value		true			
              40236	1	WMaxLim_Ena	Enumerated valued.  Throttle enable/disable control.		uint16be	1	1	0		value		true			
              40237	1	OutPFSet	Set power factor to specific value - cosine of angle.		int16be	1	1	0		value		true			
              40238	1	OutPFSet_WinTms	Time window for power factor change.		uint16be	1	1	0		value		true			
              40239	1	OutPFSet_RvrtTms	Timeout period for power factor.		uint16be	1	1	0		value		true			
              40240	1	OutPFSet_RmpTms	Ramp time for moving from current setpoint to new setpoint.		uint16be	1	1	0		value		true			
              40241	1	OutPFSet_RmpTms	Ramp time for moving from current setpoint to new setpoint.		uint16be	1	1	0		value		true			
              40243	1	VArMaxPct	Reactive power in percent of VArMax.		int16be	1	1	0		value		true			
              40245	1	VArPct_WinTms	Time window for VAR limit change.		uint16be	1	1	0		value		true			
              40246	1	VArPct_RvrtTms	Timeout period for VAR limit.		uint16be	1	1	0		value		true			
              40247	1	VArPct_RmpTms	Ramp time for moving from current setpoint to new setpoint.		uint16be	1	1	0		value		true			
              40248	1	VArPct_Mod	Enumerated value. VAR percent limit mode.		uint16be	1	1	0		value		true			
              40249	1	VArPct_Ena	Enumerated valued.  Percent limit VAr enable/disable control.		uint16be	1	1	0		value		true			
              40250	1	WMaxLimPct_SF	Scale factor for power output percent.		int16be	1	1	0		value		true			
              40251	1	OutPFSet_SF	Scale factor for power factor.		int16be	1	1	0		value		true			
              40252	1	VArPct_SF	Scale factor for reactive power percent.		int16be	1	1	0		value		true			
              40253	1	ID	Well-known value. Uniquely identifies this as a sunspec model mppt (160)		uint16be	1	1	0		value		true			
              40254	1	L	Length of sunspec model mppt (160)		uint16be	1	1	0		value		true			
              40255	1	DCA_SF	Current Scale Factor		int16be	1	1	0		value		true			true
              40256	1	DCV_SF	Voltage Scale Factor		int16be	1	1	0		value		true			true
              40257	1	DCW_SF	Power Scale Factor		int16be	1	1	0		value		true			true
              40258	1	DCWH_SF	Energy Scale Factor		int16be	1	1	0		value		true			true
              40261	1	N	Number of Modules		uint16be	1	1	0		value		true			
              40263	1	module/1/ID	Input ID		uint16be	1	1	0		value		true			
              40264	1	module/1/IDStr	Input ID Sting	8	string	2	1	0		value		true			
              40272	1	module/1/DCA	DC Current	A	uint16be	1	1	0	x * Math.pow(10, sf['40255'])	value		true			
              40273	1	module/1/DCV	DC Voltage	V	uint16be	1	1	0	x * Math.pow(10, sf['40256'])	value		true			
              40274	1	module/1/DCW	DC Power	W	uint16be	1	1	0	x * Math.pow(10, sf['40257'])	value		true			
              40275	1	module/1/DCWH	Lifetime Energy	Wh	uint32be	2	1	0	x * Math.pow(10, sf['40258'])	value		true			
              40277	1	module/1/Tms	Timestamp	s	uint16be	1	1	0		value		true			
              40283	1	module/2/ID	Input ID		uint16be	1	1	0		value		true			
              40284	1	module/2/IDStr	Input ID String		string	8	1	0		value		true			
              40292	1	module/2/DCA	DC Current	A	uint16be	1	1	0	x * Math.pow(10, sf['40255'])	value		true			
              40293	1	module/2/DCV	DC Voltage	V	uint16be	1	1	0	x * Math.pow(10, sf['40256'])	value		true			
              40294	1	module/2/DCW	DC Power	W	uint16be	1	1	0	x * Math.pow(10, sf['40257'])	value		true			
              40295	1	module/2/DCWH	Lifetime Energy	Wh	uint32be	2	1	0	x * Math.pow(10, sf['40258'])	value		true			
              40297	1	module/2/Tms	Timestamp	s	uint32be	2	1	0		value		true			
              40303	1	module/3/ID	Input ID		uint16be	1	1	0		value		true			
              40304	1	module/3/IDStr	Input ID String		string	8	1	0		value		true			
              40312	1	module/3/DCA	DC Current	A	uint16be	1	1	0	x * Math.pow(10, sf['40255'])	value		true			
              40313	1	module/3/DCV	DC Voltage	V	uint16be	1	1	0	x * Math.pow(10, sf['40256'])	value		true			
              40314	1	module/3/DCW	DC Power	W	uint16be	1	1	0	x * Math.pow(10, sf['40257'])	value		true			
              40315	1	module/3/DCWH	Lifetime Energy	Wh	uint32be	2	1	0	x * Math.pow(10, sf['40258'])	value		true			
              40317	1	module/3/Tms	Timestamp	s	uint32be	2	1	0		value		true			
              40323	1	module/4/ID	Input ID		uint16be	1	1	0		value		true			
              40324	1	module/4/IDStr	Input ID String		string	8	1	0		value		true			
              40332	1	module/4/DCA	DC Current	A	uint16be	1	1	0	x * Math.pow(10, sf['40255'])	value		true			
              40333	1	module/4/DCV	DC Voltage	V	uint16be	1	1	0	x * Math.pow(10, sf['40256'])	value		true			
              40334	1	module/4/DCW	DC Power	W	uint16be	1	1	0	x * Math.pow(10, sf['40257'])	value		true			
              40335	1	module/4/DCWH	Lifetime Energy	Wh	uint32be	2	1	0	x * Math.pow(10, sf['40258'])	value		true			
              40337	1	module/4/Tms	Timestamp	s	uint32be	2	1	0		value		true			
              40343	1	ID	Well-known value. Uniquely identifies this as a sunspec model storage (124)		uint16be	1	1	0		value		true			
              40344	1	L	Length of sunspec model storage (124)		uint16be	1	1	0		value		true			
              40345	1	WChaMax	Set point for maximum charge	W	uint16be	1	1	0		value		true			
              40346	1	WChaGra	Setpoint for maximum charging rate. Default is MaxChaRte.	%/s	uint16be	1	1	0		value		true			
              40347	1	WDisChaGra	Setpoint for maximum discharge rate. Default is MaxDisChaRte.	%/s	uint16be	1	1	0		value		true			
              40348	1	StorCtl_Mod	Activate hold/discharge/charge storage control mode. Bitfield value.		uint16be	1	1	0		value		true			
              40350	1	MinRsvPct	Setpoint for minimum reserve for storage as a percentage of the nominal maximum storage.	%	uint16be	1	1	0	x * Math.pow(10, sf['40364'])	value		true			
              40351	1	ChaState	Currently available energy as a percent of the capacity rating.	%	uint16be	1	1	0	x * Math.pow(10, sf['40365'])	value		true			
              40354	1	ChaSt	Charge status of storage device. Enumerated value.		uint16be	1	1	0		value		true			
              40355	1	OutWRte	Percent of max discharge rate.	%	int16be	1	1	0	x * Math.pow(10, sf['40368'])	value		true			
              40356	1	InWRte	Percent of max charging rate.	%	int16be	1	1	0		value		true			
              40358	1	InOutWRte_RvrtTms	Timeout period for charge/discharge rate.	s	uint16be	1	1	0		value		true			
              40360	1	ChaGriSet			uint16be	1	1	0		value		true			
              40361	1	WChaMax_SF	Scale factor for maximum charge.		int16be	1	1	0		value		true			
              40362	1	WChaDisChaGra_SF	Scale factor for maximum charge and discharge rate.		int16be	1	1	0		value		true			
              40364	1	MinRsvPct_SF	Scale factor for minimum reserve percentage.		int16be	1	1	0		value		true			true
              40365	1	ChaState_SF	Scale factor for available energy percent.		int16be	1	1	0		value		true			true
              40368	1	InOutWRte_SF	Scale factor for percent charge/discharge rate.		int16be	1	1	0		value		true			true
              40369	1	ID	Identifies this as End block		uint16be	1	1	0		value		true			
              40370	1	L	Length of model block		uint16be	1	1	0		value		true			
              40000	200	SID	Well-known value. Uniquely identifies this as a SunSpec Modbus Map		uint32be	2	1	0		value		true			
              40002	200	ID	Well-known value. Uniquely identifies this as a sunspec model common (1)		uint16be	1	1	0		value		true			
              40003	200	L	Length of sunspec model common (1)		uint16be	1	1	0		value		true			
              40004	200	Mn	Smart Meter Manufacturer		string	16	1	0		value		true			
              40020	200	MD	Smart Meter Model		string	16	1	0		value		true			
              40036	200	Opt	Smart Meter Name		string	8	1	0		value		true			
              40044	200	Vr	SW version of 		string	8	1	0		value		true			
              40052	200	SN	Smart Meter Serialnumber		string	16	1	0		value		true			
              40068	200	DA	Modbus Device Address		uint16be	1	1	0		value		true			
              40069	200	ID	Well-known value. Uniquely identifies this as a sunspec model ac_meter (20x)		uint16be	1	1	0		value		true			
              40070	200	L	Length of sunspec model ac_meter (20x)		uint16be	1	1	0		value		true			
              40071	200	A	Total AC Current	A	int16be	1	1	0		value		true			
              40072	200	AhA	Phase A Current	A	int16be	1	1	0		value		true			
              40073	200	AhB	Phase B Current	A	int16be	1	1	0		value		true			
              40074	200	AphC	Phase C Current	A	int16be	1	1	0		value		true			
              40075	200	A_SF	Current scale factor		int16be	1	1	0		value		true			
              40076	200	PhV	Line to Neutral AC Voltage (average of active phases)	V	int16be	1	1	0		value		true			
              40077	200	PhVphA	Phase Voltage AN	V	int16be	1	1	0		value		true			
              40078	200	PhVphB	Phase Voltage BN	V	int16be	1	1	0		value		true			
              40079	200	PhVphC	Phase Voltage CN	V	int16be	1	1	0		value		true			
              40080	200	PPV	Line to Line AC Voltage (average of active phases)	V	int16be	1	1	0		value		true			
              40081	200	PhVphAB	Phase Voltage AB	V	int16be	1	1	0		value		true			
              40082	200	PhVphBC	Phase Voltage AB	V	int16be	1	1	0		value		true			
              40083	200	PhVphAC	Phase Voltage AB	V	int16be	1	1	0		value		true			
              40084	200	V_SF	Voltage scale factor		int16be	1	1	0		value		true			
              40085	200	Hz	Frequency	Hz	int16be	1	1	0		value		true			
              40086	200	Hz_SF	Frequency scale factor		int16be	1	1	0		value		true			
              40087	200	W	Total Real Power	W	int16be	1	1	0	x * Math.pow(10, sf['40091'])	value		true		true	
              40088	200	WphA	Watts phase A	W	int16be	1	1	0		value		true			
              40089	200	WphB	Watts phase B	W	int16be	1	1	0		value		true			
              40090	200	WphC	Watts phase C	W	int16be	1	1	0		value		true			
              40091	200	W_SF	Real Power scale factor		int16be	1	1	0		value		true			true
              40092	200	VA	AC Apparent Power	VA	int16be	1	1	0		value		true			
              40093	200	VAphA	VA phase A	VA	int16be	1	1	0		value		true			
              40094	200	VAphB	VA phase B	VA	int16be	1	1	0		value		true			
              40095	200	VAphC	VA phase C	VA	int16be	1	1	0		value		true			
              40096	200	VA_SF	Apparent Power scale factor	VA	int16be	1	1	0		value		true			
              40097	200	VAR	Reactive Power	VA	int16be	1	1	0		value		true			
              40098	200	VARphA	VAR phase A	VA	int16be	1	1	0		value		true			
              40099	200	VARphB	VAR phase B	VA	int16be	1	1	0		value		true			
              40100	200	VARphC	VAR phase C	VA	int16be	1	1	0		value		true			
              40101	200	VAR_SF	Reactive Power scale factor		int16be	1	1	0		value		true			
              40102	200	PF	Power Factor	Pct	int16be	1	1	0		value		true			
              40103	200	PFphA	PF phase A	Pct	int16be	1	1	0		value		true			
              40104	200	PFphB	PF phase B	Pct	int16be	1	1	0		value		true			
              40105	200	PFphC	PF phase C	Pct	int16be	1	1	0		value		true			
              40106	200	PF_SF	Power Factor scale factor		int16be	1	1	0		value		true			
              40107	200	TotWhExp	Total Real Energy Exported	Wh	uint32be	2	1	0	x * Math.pow(10, sf['40123'])	value		true			
              40109	200	TotWhExpPhA	Total Watt-hours Exported phase A	Wh	uint32be	2	1	0		value		true			
              40111	200	TotWhExpPhB	Total Watt-hours Exported phase B	Wh	uint32be	2	1	0		value		true			
              40113	200	TotWhExpPhC	Total Watt-hours Exported phase C	Wh	uint32be	2	1	0		value		true			
              40115	200	TotWhImp	Total Real Energy Imported	Wh	uint32be	2	1	0	x * Math.pow(10, sf['40123'])	value		true			
              40117	200	TotWhImpPhA	Total Watt-hours Imported phase A	Wh	uint32be	2	1	0		value		true			
              40119	200	TotWhImpPhB	Total Watt-hours Imported phase B	Wh	uint32be	2	1	0		value		true			
              40121	200	TotWhImpPhC	Total Watt-hours Imported phase C	Wh	uint32be	2	1	0		value		true			
              40123	200	TotWh_SF	Real Energy scale factor		int16be	1	1	0		value		true			true
              40124	200	TotVAhExp	Total Apparent Energy Exported	VAh	uint32be	2	1	0		value		true			
              40126	200	TotVAhExpPhA	Total VA-hours Exported phase A	VAh	uint32be	2	1	0		value		true			
              40128	200	TotVAhExpPhB	Total VA-hours Exported phase B	VAh	uint32be	2	1	0		value		true			
              40130	200	TotVAhExpPhC	Total VA-hours Exported phase C	VAh	uint32be	2	1	0		value		true			
              40132	200	TotVAhImp	Total Apparent Energy Imported	VAh	uint32be	2	1	0		value		true			
              40134	200	TotVAhImpPhA	Total VA-hours Imported phase A	VAh	uint32be	2	1	0		value		true			
              40136	200	TotVAhImpPhB	Total VA-hours Imported phase B	VAh	uint32be	2	1	0		value		true			
              40138	200	TotVAhImpPhV	Total VA-hours Imported phase C	VAh	uint32be	2	1	0		value		true			
              40140	200	TotVAh_SF	Apparent Energy scale factor		int16be	1	1	0		value		true			
              40174	200	Evt	Meter Event Flags		uint32be	2	1	0		value		true			
              40176	200	ID	Identifies this as End block		uint16be	1	1	0		value		true			
              40177	200	L	Length of model block		uint16be	1	1	0		value		true			
              
              

              Raspberry Pi 5 mit 8GB + 120GB SSD + Coordinator COD-m + ioBroker ..

              1 Antwort Letzte Antwort
              0
              • L legro

                @TimoWald sagte in Test Adapter fronius-solarweb:

                Genauso Ähnlich wollte ich es auch aufbauen.

                Damit du nicht ganz von vorne anfangen musst, hier meine oben beschriebene Lösung in Form eines JavaScripts ..

                let partsDate = {jahr: '', monat: '', tag: ''}
                let eventPV = null
                let eventFromGrid = null
                let eventEnergyTotal = null
                
                function setPartsDate() {
                    let alleMonate = ['Januar', 'Februar', 'Maerz', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember']
                    let d = new Date()
                    partsDate = {jahr: d.getFullYear().toString(), monat: alleMonate[d.getMonth()], tag: d.getDate().toString()}
                }
                
                setPartsDate()
                
                schedule({hour: 0, minute: 0}, function () {
                    setPartsDate()
                    //TagesStartwert für PV
                    setState(`0_userdata.0.Fronius.Modbus.atHome.startDayWhPV`,getState(`modbus.2.holdingRegisters.1.40186_ActWh`).val,true)
                    setState(`0_userdata.0.Counter.Strom.startTagPV`,getState(`modbus.2.holdingRegisters.1.40186_ActWh`).val,true)
                    //TagesStartwert für Export
                    setState(`0_userdata.0.Fronius.Modbus.toGrid.startDayWh`,getState(`modbus.2.holdingRegisters.200.40107_TotWhExp`).val,true)
                    setState(`0_userdata.0.Counter.Strom.startTagVerkaufStrom`,getState(`modbus.2.holdingRegisters.200.40107_TotWhExp`).val,true)
                    //TagesStartwert für Import
                    setState(`0_userdata.0.Fronius.Modbus.fromGrid.startDayWh`,getState(`modbus.2.holdingRegisters.200.40115_TotWhImp`).val,true)    
                    setState(`0_userdata.0.Counter.Strom.startTagBezugStrom`,getState(`modbus.2.holdingRegisters.200.40115_TotWhImp`).val,true)
                    //TagesStartWert für Gas
                    setState('0_userdata.0.Counter.Gas.startTagGas',getState('0_userdata.0.Counter.Gas.volGas').val,true)
                })
                
                eventFromGrid = on({id: `modbus.2.holdingRegisters.200.40115_TotWhImp`, change: 'gt'}, (obj) => {
                    let aktImp = obj.state.val - getState(`0_userdata.0.Fronius.Modbus.fromGrid.startDayWh`).val
                    setState(`0_userdata.0.Fronius.Modbus.fromGrid.tmpDayWh`,aktImp,true)
                    let tmpPV = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${partsDate.jahr}.${partsDate.monat}.fromGridWh`).val)
                    tmpPV[Number(partsDate.tag)-1] = aktImp
                    setState(`0_userdata.0.Fronius.Monatstabellen.${partsDate.jahr}.${partsDate.monat}.fromGridWh`,JSON.stringify(tmpPV),true)
                })
                
                eventPV = on({id: `modbus.2.holdingRegisters.200.40107_TotWhExp`, change: 'gt'}, (obj) => {
                    let aktExp = obj.state.val - getState(`0_userdata.0.Fronius.Modbus.toGrid.startDayWh`).val
                    setState('0_userdata.0.Fronius.Modbus.toGrid.tmpDayWh',aktExp,true)
                    let tmpPV = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${partsDate.jahr}.${partsDate.monat}.toGridWh`).val)
                    tmpPV[Number(partsDate.tag)-1] = aktExp
                    setState(`0_userdata.0.Fronius.Monatstabellen.${partsDate.jahr}.${partsDate.monat}.toGridWh`,JSON.stringify(tmpPV),true)
                })
                
                eventEnergyTotal = on({id: `modbus.2.holdingRegisters.1.40186_ActWh`, change: 'gt'}, (obj) => {
                    let aktGen = obj.state.val - getState(`0_userdata.0.Fronius.Modbus.atHome.startDayWhPV`).val
                    setState(`0_userdata.0.Fronius.Modbus.atHome.tmpDayWhPV`,aktGen,true)
                    let tmpPV = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${partsDate.jahr}.${partsDate.monat}.solarWh`).val)
                    tmpPV[Number(partsDate.tag)-1] = aktGen
                    setState(`0_userdata.0.Fronius.Monatstabellen.${partsDate.jahr}.${partsDate.monat}.solarWh`,JSON.stringify(tmpPV),true)
                })
                

                Da ich keinen Ohmpilot habe, musst du dir hierzu die Register leider selbst suchen.

                F Offline
                F Offline
                Friedo
                schrieb am zuletzt editiert von
                #230

                @legro Hallo .Danke für die Inspiration . Die Tageswerte bekomme ich so super abgefragt. Leider bekomme ich das mit der Aufsummierung in den Monatswerten nicht hin. Ich habe zwar Objekte für den jeweiligen Tageswerte erstellt aber er wird nicht gefüllt . Wenn möglich bitte um genaues Vorgehen bzgl. der Monatswerte. Vielen Dank.

                1 Antwort Letzte Antwort
                0
                • T Online
                  T Online
                  TimoWald
                  schrieb am zuletzt editiert von
                  #231

                  In welcher Adresse sind denn die Tageswerte?

                  1 Antwort Letzte Antwort
                  0
                  • F Offline
                    F Offline
                    Friedo
                    schrieb am zuletzt editiert von
                    #232

                    Hallo. Oha, da ist mir ein Fehler im Post unterlaufen . Die Tageswerte werden sehr wohl gefüllt. Die Monatswerte nur nicht. . Danke für die Hilfe.👍
                    0_userdata.0.Fronius.Monatstabellen.2026.01.fromGridWh
                    So ist der Objektpunkt der Monatswerte benannt und ist vom Typ Liste.
                    LG.

                    1 Antwort Letzte Antwort
                    0
                    • F Offline
                      F Offline
                      Friedo
                      schrieb am zuletzt editiert von Friedo
                      #233

                      Hab es mit chatGPT gelöst...

                      1 Antwort Letzte Antwort
                      0
                      • HomoranH Homoran verschob dieses Thema von Tester am
                      • HomoranH Homoran verschob dieses Thema von ...nicht in offiziellem Repo am
                      • NegaleinN Offline
                        NegaleinN Offline
                        Negalein
                        schrieb am zuletzt editiert von
                        #234

                        Hallo

                        ich habe hier nichts gefunden oder übersehn.

                        Liefert der Adapter den Autarkiegrad, bzw. wie wird der aus den vorhandenen DP berechnet?

                        ° Node.js & System Update ---> sudo apt update, iob stop, sudo apt full-upgrade
                        ° Node.js Fixer ---> iob nodejs-update
                        ° Fixer ---> iob fix

                        T 1 Antwort Letzte Antwort
                        0
                        • NegaleinN Negalein

                          Hallo

                          ich habe hier nichts gefunden oder übersehn.

                          Liefert der Adapter den Autarkiegrad, bzw. wie wird der aus den vorhandenen DP berechnet?

                          T Offline
                          T Offline
                          tombox
                          schrieb am zuletzt editiert von
                          #235

                          @Negalein er liefert nur was in der app angezeigt wird

                          NegaleinN 2 Antworten Letzte Antwort
                          0
                          • T tombox

                            @Negalein er liefert nur was in der app angezeigt wird

                            NegaleinN Offline
                            NegaleinN Offline
                            Negalein
                            schrieb am zuletzt editiert von
                            #236

                            @tombox sagte:

                            er liefert nur was in der app angezeigt wird

                            seh ich im Webportal

                            3ae6bef0-601a-494b-93e4-4515db91ac9c-image.jpeg

                            und das in der App

                            422f40a5-54af-4e54-8b1c-c814438eb52e-image.jpeg

                            ° Node.js & System Update ---> sudo apt update, iob stop, sudo apt full-upgrade
                            ° Node.js Fixer ---> iob nodejs-update
                            ° Fixer ---> iob fix

                            1 Antwort Letzte Antwort
                            0
                            • T tombox

                              @Negalein er liefert nur was in der app angezeigt wird

                              NegaleinN Offline
                              NegaleinN Offline
                              Negalein
                              schrieb am zuletzt editiert von Negalein
                              #237

                              @tombox sagte:

                              er liefert nur was in der app angezeigt wird

                              hab es jetzt per Script berechnet

                              /**
                               * -----------------------------------------------------------------------------
                               * Fronius SolarWeb Autarkiegrad
                               * -----------------------------------------------------------------------------
                               * Version:     1.1.0
                               * Author:      Christian Wimmer
                               * Copyright:   (c) 2026 Christian Wimmer
                               * License:     MIT
                               *
                               * Description:
                               * Berechnet den aktuellen Autarkiegrad anhand der Fronius SolarWeb Daten
                               * und schreibt das Ergebnis nach:
                               *
                               *   0_userdata.0.Fronius.Autarkiegrad
                               *
                               * Es wird automatisch der letzte verfügbare Tag mit gültigen Daten
                               * verwendet, damit der Wert nach Mitternacht nicht auf 0 % fällt.
                               *
                               * Formel:
                               *   (EnergyDirectConsumption + EnergyBattDischarge)
                               *   / EnergyConsumptionTotal * 100
                               * -----------------------------------------------------------------------------
                               */
                              
                              const VERSION = '1.1.0';
                              
                              const base = 'fronius-solarweb.0.6f41428b-0208-4f01-ab38-c11b57543b46.day';
                              const dpResult = '0_userdata.0.Fronius.Autarkiegrad';
                              
                              log(`Fronius Autarkiegrad v${VERSION} gestartet`, 'info');
                              
                              // Datenpunkt anlegen falls nicht vorhanden
                              if (!existsState(dpResult)) {
                                  createState(dpResult, 0, {
                                      name: 'PV Autarkiegrad',
                                      type: 'number',
                                      role: 'value.percent',
                                      unit: '%',
                                      read: true,
                                      write: false
                                  });
                              }
                              
                              function getValue(dp) {
                                  if (!existsState(dp)) {
                                      return 0;
                                  }
                              
                                  const state = getState(dp);
                              
                                  if (!state || state.val === null || state.val === undefined) {
                                      return 0;
                                  }
                              
                                  const val = parseFloat(state.val);
                              
                                  return isNaN(val) ? 0 : val;
                              }
                              
                              function calculateAutarkie() {
                              
                                  let day = new Date().getDate();
                              
                                  // Letzten Tag mit Verbrauchsdaten suchen
                                  while (day > 0) {
                              
                                      const consumptionTest = getValue(
                                          `${base}.EnergyConsumptionTotal.values.${day}`
                                      );
                              
                                      if (consumptionTest > 0) {
                                          break;
                                      }
                              
                                      day--;
                                  }
                              
                                  if (day === 0) {
                                      log('Keine gültigen Fronius-Daten gefunden.', 'warn');
                                      return;
                                  }
                              
                                  const consumption = getValue(
                                      `${base}.EnergyConsumptionTotal.values.${day}`
                                  );
                              
                                  const direct = getValue(
                                      `${base}.EnergyDirectConsumption.values.${day}`
                                  );
                              
                                  const battery = getValue(
                                      `${base}.EnergyBattDischarge.values.${day}`
                                  );
                              
                                  let autarkie = 0;
                              
                                  if (consumption > 0) {
                                      autarkie = ((direct + battery) / consumption) * 100;
                                  }
                              
                                  autarkie = Math.round(autarkie * 10) / 10;
                              
                                  setState(dpResult, autarkie, true);
                              
                                  log(
                                      `Autarkiegrad: ${autarkie}% | Tag=${day} | Verbrauch=${consumption} | Direkt=${direct} | Batterie=${battery}`,
                                      'info'
                                  );
                              }
                              
                              // Alle 15 Minuten aktualisieren
                              schedule('*/15 * * * *', calculateAutarkie);
                              
                              // Beim Start sofort berechnen
                              calculateAutarkie();
                              

                              ° Node.js & System Update ---> sudo apt update, iob stop, sudo apt full-upgrade
                              ° Node.js Fixer ---> iob nodejs-update
                              ° Fixer ---> iob fix

                              1 Antwort Letzte Antwort
                              0
                              • L Offline
                                L Offline
                                legro
                                schrieb am zuletzt editiert von legro
                                #238

                                Mittlerweile habe ich unsere Visualisierung zum dritten Mal überarbeitet. Herausgekommen ist u.a. dabei eine View mit vier Ansichten: Kosten, Energie (AC), Quoten und Energie (DC).

                                2fdb1b5d-2211-4056-bbb9-77e962e91b78-image.jpeg
                                93b7004b-7ecb-40b4-9735-d79b5792a8ff-image.jpeg

                                19722fdb-82c7-44e1-8651-c45b78c6d234-image.jpeg

                                Die Berechnung der Quoten (Autarkie und Eigenverbrauch) habe ich aus den Daten der AC-Werte errechnet; diese sind somit echte Werte, nicht etwa die etwas geschönten aus der App, die auf den DC-Werten basieren. Der Gesamtwirkungsgrad (AC/DC) beinhaltet somit alle Verluste aus DC->AC Wandlung und in/aus Batterie. Da bei uns nur ein geringer Teil der Energie in der Batterie zwischengespeichert wird, ist der Wirkungsgrad mit über 91% recht hoch.

                                Die in den Views angegebenen Wirkungsgrade beruhen ebenfalls auf AC-Werten. Sie basieren aus mittlerweile über drei Jahre gesammelten Daten.

                                In den Zeilen 71 bis 78 findet man die Berechnung der Werte für Autarkie und Eigenquote. Die verwendeten Daten stammen zwar aus den ECharts-Diagrammen (s. FlexCharts-Adapter von @jrbwh ), aber ihre Herkunft findet man in den Zeilen 53 - 69 erläutert.

                                Bei weiteren Fragen - insbesondere zu dem im Skript nicht dokumentierten Programmcode - helfe ich gerne weiter.

                                function getAktMonthYear() {
                                    return {
                                        month: G_getMonthAsNumber(getState('0_userdata.0.Fronius.flexCharts.selMonth').val),
                                        year: getState('0_userdata.0.Fronius.flexCharts.selYear').val
                                        }
                                }
                                
                                function checkTarifStrom(d) {
                                    let arr = JSON.parse(getState('0_userdata.0.Energie_Tarife.Strom.StromBezug').val)
                                    for(let i=0; i<arr.length; i++) {
                                        if(new Date(arr[i].Zeitraum.Start) <= d && d <= new Date(arr[i].Zeitraum.Ende)) {
                                            return {Verkaufspreis: arr[i].Verkaufspreis, Energiepreis: arr[i].Energiepreis}
                                        }
                                    }
                                    return 0
                                }
                                //############################ chartEnergieYear: Monatsenergien ############################
                                
                                
                                function refreshYear() {
                                
                                    let aktYear = getState('0_userdata.0.Fronius.flexCharts.selYear').val
                                    let dataMonths = []
                                
                                    //Diagramm Energien in KWh im RAM allokieren
                                    let jsonChartKWh = '0_userdata.0.Fronius.flexCharts.chartEnergieYear'
                                    let yearChartKWh = JSON.parse(getState(jsonChartKWh).val)
                                    //Diagramm Autarkie&Effizienz in % im RAM allokieren
                                    let jsonChartAutPrc = '0_userdata.0.Fronius.flexCharts.chartEffienzYear'
                                    let yearChartAutPrc = JSON.parse(getState(jsonChartAutPrc).val)
                                    //Diagramm Kosten im RAM allokieren
                                    let jsonChartKosten = '0_userdata.0.Fronius.flexCharts.chartKostenYear'
                                    let yearChartKosten = JSON.parse(getState(jsonChartKosten).val)
                                    //Diagramm Energie DC im RAM allokieren
                                    let jsonChartYearDC = '0_userdata.0.Fronius.flexCharts.chartYearDC'
                                    let yearChartDC = JSON.parse(getState(jsonChartYearDC).val)
                                
                                    yearChartKWh.series[0].data = []  //fromGridKWh
                                    yearChartKWh.series[1].data = []  //toGridKWh
                                    yearChartKWh.series[2].data = []  //fromSolarKWh (Eigenverbrauch)
                                
                                    yearChartAutPrc.series[0].data = [] //Autarkie
                                    yearChartAutPrc.series[1].data = [] //Eigenverbrauch
                                
                                    yearChartKosten.series[0].data = [] //fromGridEuro
                                    yearChartKosten.series[1].data = [] //toGridEuro
                                    yearChartKosten.series[2].data = [] //EigenverbrauchEuro
                                
                                    yearChartDC.series[0].data =[] //dcGartenhaus
                                    yearChartDC.series[1].data =[] //dcTerrasse
                                
                                    for (let i=1;i<13;i++) {
                                        //Monatstarif - Der Stromtarif ändert sich nur zum Monatswechsel
                                        let tarif = checkTarifStrom(new Date(`${aktYear}-('0'+ ${('0' + i).slice(-2)}-15`))
                                
                                        //fromGrid
                                        let fromGridKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktYear}.${G_getMonthLongName(i)}.fromGridWh`).val)
                                        yearChartKWh.series[0].data.push(G_runden(fromGridKWh.reduce((sum, item) => sum + item, 0) / 1000,3))
                                        yearChartKosten.series[0].data.push(G_runden(tarif.Energiepreis * yearChartKWh.series[0].data[i-1],3))        
                                
                                        //toGrid
                                        let toGridKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktYear}.${G_getMonthLongName(i)}.toGridWh`).val)
                                        yearChartKWh.series[1].data.push(G_runden(toGridKWh.reduce((sum, item) => sum + item, 0) / 1000,3))
                                        yearChartKosten.series[1].data.push(G_runden(tarif.Verkaufspreis * yearChartKWh.series[1].data[i-1],3))
                                
                                        //fromSolar bzw. Eigenverbrauch
                                        let fromSolarKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktYear}.${G_getMonthLongName(i)}.solarWh`).val)
                                        yearChartKWh.series[2].data.push(G_runden(fromSolarKWh.reduce((sum, item) => sum + item, 0) / 1000 - yearChartKWh.series[1].data[i-1],3))
                                        yearChartKosten.series[2].data.push(G_runden(tarif.Energiepreis * yearChartKWh.series[2].data[i-1],3))
                                
                                        //Autarkie
                                        let gesamtVerbrauch = yearChartKWh.series[0].data[i-1] + yearChartKWh.series[2].data[i-1]
                                        let eigenVerbrauch = yearChartKWh.series[2].data[i-1]
                                        let autarkieQuote = eigenVerbrauch / gesamtVerbrauch
                                        let gesamtSolar = yearChartKWh.series[2].data[i-1] + yearChartKWh.series[1].data[i-1]
                                        let eigenQuote = eigenVerbrauch / gesamtSolar
                                        yearChartAutPrc.series[0].data.push(G_runden(100*autarkieQuote,2))
                                        yearChartAutPrc.series[1].data.push(G_runden(100*eigenQuote,2))
                                
                                        //Energien DC
                                        let dcGartenhausKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktYear}.${G_getMonthLongName(i)}.dcGartenhausKWh`).val)
                                        dcGartenhausKWh ||= []
                                        yearChartDC.series[0].data.push(G_runden(dcGartenhausKWh.reduce((sum, item) => sum + item,0) / 1000,3))
                                        let dcTerrasseKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktYear}.${G_getMonthLongName(i)}.dcTerrasseKWh`).val)
                                        dcTerrasseKWh ||= []
                                        yearChartDC.series[1].data.push(G_runden(dcTerrasseKWh.reduce((sum, item) => sum + item,0) / 1000,3))
                                
                                    }
                                
                                    //Jahresummen
                                    // - fromGrid
                                    let fromGridKWhJahressumme = yearChartKWh.series[0].data.reduce((sum, item) => sum + item, 0)
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.summeJahrFromGridKWh', fromGridKWhJahressumme, true)
                                    let fromGridEuroJahressumme = yearChartKosten.series[0].data.reduce((sum, item) => sum + item, 0)
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.summeJahrFromGridEuro', fromGridEuroJahressumme, true)
                                
                                    // - toGrid
                                    let toGridKWhJahressumme = yearChartKWh.series[1].data.reduce((sum, item) => sum + item, 0)
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.summeJahrToGridKWh', toGridKWhJahressumme, true)
                                    let toGridEuroJahressumme = yearChartKosten.series[1].data.reduce((sum, item) => sum + item, 0)
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.summeJahrToGridEuro', toGridEuroJahressumme, true)
                                
                                    // - eigenverbrauch
                                    let eigenverbrauchKWhJahressumme = yearChartKWh.series[2].data.reduce((sum, item) => sum + item, 0)
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.summeJahrEigenverbrauchKWh', eigenverbrauchKWhJahressumme, true)
                                    let eigenverbrauchEuroJahressumme = yearChartKosten.series[2].data.reduce((sum, item) => sum + item, 0)
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.summeJahrEigenverbrauchEuro', eigenverbrauchEuroJahressumme, true)
                                    //Gesamtverbrauch
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.summeJahrKonsumKWh', eigenverbrauchKWhJahressumme + fromGridKWhJahressumme, true)
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.summeJahrKonsumEuro', eigenverbrauchEuroJahressumme + fromGridEuroJahressumme, true)
                                
                                    //Titelzeilen
                                    yearChartKWh.title.text = 'elektrische Energien in ' + aktYear
                                    yearChartKosten.title.text = 'Energienkosten in ' + aktYear
                                    yearChartAutPrc.title.text = 'Autarkie/Eigenquoten in ' + aktYear
                                    yearChartDC.title.text = 'elektrische Energie DC in ' + aktYear
                                    //x-Achse beschriften
                                    yearChartKWh.xAxis[0].data = Array.from({length: 12}, (tmp,i) => G_shrtMonths[i])
                                    //yearChartKWh.xAxis[0].data = Array.from({length: 12}, (tmp,i) => i+1)
                                
                                    //Diagrammm als JSON im Objektbaum ablegen
                                    setState(jsonChartKWh,JSON.stringify(yearChartKWh),true)
                                    setState(jsonChartAutPrc,JSON.stringify(yearChartAutPrc),true)
                                    setState(jsonChartKosten,JSON.stringify(yearChartKosten),true)
                                    setState(jsonChartYearDC,JSON.stringify(yearChartDC),true)
                                
                                }
                                
                                
                                //############################ chartEnergieMonth : Tagesenergien ############################
                                
                                
                                function refreshMonth() {
                                
                                    let aktMonthYear = getAktMonthYear()
                                    let tarif = checkTarifStrom(new Date(`${aktMonthYear.year}-('0'+ ${('0' + aktMonthYear.month).slice(-2)}-15`))
                                
                                    //Diagramm Energien in KWh im RAM allokieren
                                    let jsonChartKWh = '0_userdata.0.Fronius.flexCharts.chartEnergieMonth'
                                    let monthChartKWh = JSON.parse(getState(jsonChartKWh).val)
                                    //Diagramm Autarkie&Effizienz in % im RAM allokieren
                                    let jsonChartAutPrc = '0_userdata.0.Fronius.flexCharts.chartEffizienzMonth'
                                    let monthChartAutPrc = JSON.parse(getState(jsonChartAutPrc).val)
                                    //Diagramm Kosten in € im RAM allokieren
                                    let jsonChartKosten = '0_userdata.0.Fronius.flexCharts.chartKostenMonth'
                                    let monthChartKosten = JSON.parse(getState(jsonChartKosten).val)
                                    //Diagramm Energie DC im RAM allokieren
                                    let jsonChartMonthDC = '0_userdata.0.Fronius.flexCharts.chartMonthDC'
                                    let monthChartDC = JSON.parse(getState(jsonChartMonthDC).val)
                                    
                                    //Tabelle fromGridKWh in KWh im RAM allokieren
                                    let fromGridKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktMonthYear.year}.${G_getMonthLongName(aktMonthYear.month)}.fromGridWh`).val)
                                    fromGridKWh = fromGridKWh.map(item => item / 1000)
                                    //Tabelle toGridKWh in KWh im RAM allokieren
                                    let toGridKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktMonthYear.year}.${G_getMonthLongName(aktMonthYear.month)}.toGridWh`).val)
                                    toGridKWh = toGridKWh.map(item => G_runden(item/1000,3))
                                    let fromSolarKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktMonthYear.year}.${G_getMonthLongName(aktMonthYear.month)}.solarWh`).val) 
                                    fromSolarKWh = fromSolarKWh.map(item => item / 1000) //erzeugte Solarenergie AC
                                    //Tabelle eigenVerbrauch
                                    let eigenVerbrauchKWh = fromSolarKWh.map((item, i) => G_runden(item - toGridKWh[i],3)) //Eigenverbrauch AC
                                    let gesamtVerbrauchKWh = eigenVerbrauchKWh.map((item, i) => G_runden(item + fromGridKWh[i],3)) //Gesamtverbrauch AC
                                
                                    //Tabelle dcGartenhausKWh und dcTerrasseKWh in KWh im RAM allokieren
                                    let dcGartenhausKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktMonthYear.year}.${G_getMonthLongName(aktMonthYear.month)}.dcGartenhausKWh`).val)
                                    dcGartenhausKWh ||= []
                                    dcGartenhausKWh = dcGartenhausKWh.map(item => G_runden(item / 1000,3))
                                    let dcTerrasseKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktMonthYear.year}.${G_getMonthLongName(aktMonthYear.month)}.dcTerrasseKWh`).val)
                                    dcTerrasseKWh ||= []
                                    dcTerrasseKWh = dcTerrasseKWh.map(item => G_runden(item / 1000,3))
                                
                                    //Energiesummen
                                    // - fromGrid
                                    let fromGridKWhSum = fromGridKWh.reduce((sum, item) => sum + item, 0)
                                    let fromGridEuroSum = fromGridKWhSum * tarif.Energiepreis
                                    // - toGrid
                                    let toGridKWhSum = toGridKWh.reduce((sum, item) => sum + item, 0)
                                    let toGridEuroSum = toGridKWhSum * tarif.Verkaufspreis
                                    // - Eigenverbrauch    
                                    let eigenverbrauchKWhSum = fromSolarKWh.reduce((sum, item) => sum + item) - toGridKWhSum
                                    let eigenverbrauchEuroSum = eigenverbrauchKWhSum * tarif.Energiepreis
                                    //Gesamtverbrauch bzw. Konsum
                                    let konsumKWhSum = fromGridKWhSum + eigenverbrauchKWhSum
                                    let konsumEuroSum = konsumKWhSum * tarif.Energiepreis
                                    //Energien DC
                                
                                
                                    //Summen in Objekte Speichern
                                    // - fromGrid
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.sumMonatFromGridKWh',fromGridKWhSum,true)
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.sumMonatFromGridEuro',fromGridEuroSum,true)
                                    // - toGrid
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.sumMonatToGridKWh',toGridKWhSum,true)
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.sumMonatToGridEuro',toGridEuroSum,true)
                                    // - Eigenverbrauch
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.sumMonatEigenverbrauchKWh',eigenverbrauchKWhSum,true)
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.sumMonatEigenverbrauchEuro',eigenverbrauchEuroSum,true)
                                    // - Konsum
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.sumMonatKonsumKWh',konsumKWhSum,true)
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.sumMonatKonsumEuro',konsumEuroSum,true)
                                
                                    //Titelzeilen
                                    //Energien AC
                                    monthChartKWh.title.text = 'elektrische Energien im '
                                    monthChartKWh.title.text = (aktMonthYear.month == 3) ? monthChartKWh.title.text.concat('März') : monthChartKWh.title.text.concat(G_getMonthLongName(aktMonthYear.month))
                                    monthChartKWh.title.text = monthChartKWh.title.text.concat(' (' + aktMonthYear.year + ')')
                                    //Kosten
                                    monthChartKosten.title.text = 'Stromkosten im '
                                    monthChartKosten.title.text = (aktMonthYear.month == 3) ? monthChartKosten.title.text.concat('März') : monthChartKosten.title.text.concat(G_getMonthLongName(aktMonthYear.month))
                                    monthChartKosten.title.text = monthChartKosten.title.text.concat(' (' + aktMonthYear.year + ')')
                                    //Quoten
                                    monthChartAutPrc.title.text = 'Autarkie&Eigenquote im '
                                    monthChartAutPrc.title.text = (aktMonthYear.month == 3) ? monthChartAutPrc.title.text.concat('März') : monthChartAutPrc.title.text.concat(G_getMonthLongName(aktMonthYear.month))
                                    monthChartAutPrc.title.text = monthChartAutPrc.title.text.concat(' (' + aktMonthYear.year + ')')
                                    //Energien DC
                                    monthChartDC.title.text = 'elektrische Energien DC im '
                                    if (aktMonthYear.month == 3) {
                                        monthChartDC.title.text = monthChartDC.title.text + 'März'
                                    } else {
                                        monthChartDC.title.text = monthChartDC.title.text + G_getMonthLongName(aktMonthYear.month)
                                    }
                                    monthChartDC.title.text = monthChartDC.title.text +' (' + aktMonthYear.year + ')'
                                    //x-Achse beschriften
                                    //x-Achse
                                    monthChartKWh.xAxis[0].data = Array.from({length: G_getDaysOfMonth(aktMonthYear.year, aktMonthYear.month)}, (tmp,i) => i+1)
                                    monthChartKosten.xAxis[0].data = Array.from({length: G_getDaysOfMonth(aktMonthYear.year, aktMonthYear.month)}, (tmp,i) => i+1)
                                    monthChartAutPrc.xAxis[0].data = Array.from({length: G_getDaysOfMonth(aktMonthYear.year, aktMonthYear.month)}, (tmp,i) => i+1)
                                    monthChartDC.xAxis[0].data = Array.from({length: G_getDaysOfMonth(aktMonthYear.year, aktMonthYear.month)}, (tmp,i) => i+1)
                                    //y-Achsenwerte eintragen ..
                                    //Netzbezug, Einspeisung, Eigenverbrauch
                                    monthChartKWh.series[0].data = fromGridKWh
                                    monthChartKWh.series[1].data = toGridKWh
                                    monthChartKWh.series[2].data = eigenVerbrauchKWh
                                    //Kosten: Netzbezug, Einspeisung, Eigenverbrauch
                                    monthChartKosten.series[0].data = fromGridKWh.map((item,i) => item * tarif.Energiepreis)
                                    monthChartKosten.series[1].data = toGridKWh.map((item,i) => item * tarif.Verkaufspreis)
                                    monthChartKosten.series[2].data = eigenVerbrauchKWh.map((item,i) => item * tarif.Energiepreis)
                                    //Autarkie&Eigenverbrauch
                                    monthChartAutPrc.series[0].data = eigenVerbrauchKWh.map((item, i) => G_runden(100*item / gesamtVerbrauchKWh[i],1)) //Autarkie
                                    monthChartAutPrc.series[1].data = eigenVerbrauchKWh.map((item,i) => G_runden(100*item / fromSolarKWh[i],1)) //Eigenquote
                                
                                    //Energien DC
                                    monthChartDC.series[0].data = dcGartenhausKWh
                                    monthChartDC.series[1].data = dcTerrasseKWh
                                
                                
                                    //Diagrammme als JSON im Objektbaum ablegen
                                    setState(jsonChartKWh,JSON.stringify(monthChartKWh),true)
                                    setState(jsonChartKosten,JSON.stringify(monthChartKosten),true)
                                    setState(jsonChartAutPrc,JSON.stringify(monthChartAutPrc),true)
                                    setState(jsonChartMonthDC,JSON.stringify(monthChartDC),true)
                                }
                                
                                
                                //############################ Scheduler & Trigger ############################
                                
                                
                                //alle 4 Minuten die Anzeige aktualisieren
                                
                                schedule('*/4 * * * *', () => {
                                    refreshMonth(); refreshYear()
                                    setState('0_userdata.0.Fronius.flexCharts.rfhButton',0,false)
                                });
                                
                                on({id:'0_userdata.0.Fronius.flexCharts.selMonth',change: 'any'},(obj) => {
                                    refreshMonth()
                                    setState('0_userdata.0.Fronius.flexCharts.rfhButton',0,false)
                                })
                                
                                on({id:'0_userdata.0.Fronius.flexCharts.selYear',change: 'any'},(obj) => {
                                    //G_setListYears('0_userdata.0.Fronius.Monatstabellen', '0_userdata.0.Fronius.Charts.lstYears')
                                    setStateAsync('0_userdata.0.Fronius.flexCharts.rfhButton',0,false)
                                    G_setListMonths(getState('0_userdata.0.Fronius.flexCharts.selYear').val, '0_userdata.0.Fronius.Monatstabellen',
                                        '0_userdata.0.Fronius.flexCharts.lstMonths')
                                    refreshYear(); refreshMonth()
                                    setState('0_userdata.0.Fronius.flexCharts.rfhButton', 0, false)
                                })
                                
                                on({id:'0_userdata.0.Fronius.flexCharts.buttonAktualisieren',change: 'any'},(obj) => {
                                    refreshMonth(); refreshYear()
                                    setState('0_userdata.0.Fronius.flexCharts.rfhButton',0,false)
                                })
                                
                                
                                //############################ Skriptstart ############################
                                
                                //listMonths des zugehörigen DropDown-Widgets füllen
                                G_setListYears('0_userdata.0.Fronius.Monatstabellen', '0_userdata.0.Fronius.flexCharts.lstYear')
                                //listYears des zugehörigen DropDown-Widgets füllen
                                G_setListMonths(getState('0_userdata.0.Fronius.flexCharts.selYear').val, '0_userdata.0.Fronius.Monatstabellen',
                                    '0_userdata.0.Fronius.flexCharts.lstMonths')
                                

                                Raspberry Pi 5 mit 8GB + 120GB SSD + Coordinator COD-m + ioBroker ..

                                NegaleinN 1 Antwort Letzte Antwort
                                1
                                • L legro

                                  Mittlerweile habe ich unsere Visualisierung zum dritten Mal überarbeitet. Herausgekommen ist u.a. dabei eine View mit vier Ansichten: Kosten, Energie (AC), Quoten und Energie (DC).

                                  2fdb1b5d-2211-4056-bbb9-77e962e91b78-image.jpeg
                                  93b7004b-7ecb-40b4-9735-d79b5792a8ff-image.jpeg

                                  19722fdb-82c7-44e1-8651-c45b78c6d234-image.jpeg

                                  Die Berechnung der Quoten (Autarkie und Eigenverbrauch) habe ich aus den Daten der AC-Werte errechnet; diese sind somit echte Werte, nicht etwa die etwas geschönten aus der App, die auf den DC-Werten basieren. Der Gesamtwirkungsgrad (AC/DC) beinhaltet somit alle Verluste aus DC->AC Wandlung und in/aus Batterie. Da bei uns nur ein geringer Teil der Energie in der Batterie zwischengespeichert wird, ist der Wirkungsgrad mit über 91% recht hoch.

                                  Die in den Views angegebenen Wirkungsgrade beruhen ebenfalls auf AC-Werten. Sie basieren aus mittlerweile über drei Jahre gesammelten Daten.

                                  In den Zeilen 71 bis 78 findet man die Berechnung der Werte für Autarkie und Eigenquote. Die verwendeten Daten stammen zwar aus den ECharts-Diagrammen (s. FlexCharts-Adapter von @jrbwh ), aber ihre Herkunft findet man in den Zeilen 53 - 69 erläutert.

                                  Bei weiteren Fragen - insbesondere zu dem im Skript nicht dokumentierten Programmcode - helfe ich gerne weiter.

                                  function getAktMonthYear() {
                                      return {
                                          month: G_getMonthAsNumber(getState('0_userdata.0.Fronius.flexCharts.selMonth').val),
                                          year: getState('0_userdata.0.Fronius.flexCharts.selYear').val
                                          }
                                  }
                                  
                                  function checkTarifStrom(d) {
                                      let arr = JSON.parse(getState('0_userdata.0.Energie_Tarife.Strom.StromBezug').val)
                                      for(let i=0; i<arr.length; i++) {
                                          if(new Date(arr[i].Zeitraum.Start) <= d && d <= new Date(arr[i].Zeitraum.Ende)) {
                                              return {Verkaufspreis: arr[i].Verkaufspreis, Energiepreis: arr[i].Energiepreis}
                                          }
                                      }
                                      return 0
                                  }
                                  //############################ chartEnergieYear: Monatsenergien ############################
                                  
                                  
                                  function refreshYear() {
                                  
                                      let aktYear = getState('0_userdata.0.Fronius.flexCharts.selYear').val
                                      let dataMonths = []
                                  
                                      //Diagramm Energien in KWh im RAM allokieren
                                      let jsonChartKWh = '0_userdata.0.Fronius.flexCharts.chartEnergieYear'
                                      let yearChartKWh = JSON.parse(getState(jsonChartKWh).val)
                                      //Diagramm Autarkie&Effizienz in % im RAM allokieren
                                      let jsonChartAutPrc = '0_userdata.0.Fronius.flexCharts.chartEffienzYear'
                                      let yearChartAutPrc = JSON.parse(getState(jsonChartAutPrc).val)
                                      //Diagramm Kosten im RAM allokieren
                                      let jsonChartKosten = '0_userdata.0.Fronius.flexCharts.chartKostenYear'
                                      let yearChartKosten = JSON.parse(getState(jsonChartKosten).val)
                                      //Diagramm Energie DC im RAM allokieren
                                      let jsonChartYearDC = '0_userdata.0.Fronius.flexCharts.chartYearDC'
                                      let yearChartDC = JSON.parse(getState(jsonChartYearDC).val)
                                  
                                      yearChartKWh.series[0].data = []  //fromGridKWh
                                      yearChartKWh.series[1].data = []  //toGridKWh
                                      yearChartKWh.series[2].data = []  //fromSolarKWh (Eigenverbrauch)
                                  
                                      yearChartAutPrc.series[0].data = [] //Autarkie
                                      yearChartAutPrc.series[1].data = [] //Eigenverbrauch
                                  
                                      yearChartKosten.series[0].data = [] //fromGridEuro
                                      yearChartKosten.series[1].data = [] //toGridEuro
                                      yearChartKosten.series[2].data = [] //EigenverbrauchEuro
                                  
                                      yearChartDC.series[0].data =[] //dcGartenhaus
                                      yearChartDC.series[1].data =[] //dcTerrasse
                                  
                                      for (let i=1;i<13;i++) {
                                          //Monatstarif - Der Stromtarif ändert sich nur zum Monatswechsel
                                          let tarif = checkTarifStrom(new Date(`${aktYear}-('0'+ ${('0' + i).slice(-2)}-15`))
                                  
                                          //fromGrid
                                          let fromGridKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktYear}.${G_getMonthLongName(i)}.fromGridWh`).val)
                                          yearChartKWh.series[0].data.push(G_runden(fromGridKWh.reduce((sum, item) => sum + item, 0) / 1000,3))
                                          yearChartKosten.series[0].data.push(G_runden(tarif.Energiepreis * yearChartKWh.series[0].data[i-1],3))        
                                  
                                          //toGrid
                                          let toGridKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktYear}.${G_getMonthLongName(i)}.toGridWh`).val)
                                          yearChartKWh.series[1].data.push(G_runden(toGridKWh.reduce((sum, item) => sum + item, 0) / 1000,3))
                                          yearChartKosten.series[1].data.push(G_runden(tarif.Verkaufspreis * yearChartKWh.series[1].data[i-1],3))
                                  
                                          //fromSolar bzw. Eigenverbrauch
                                          let fromSolarKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktYear}.${G_getMonthLongName(i)}.solarWh`).val)
                                          yearChartKWh.series[2].data.push(G_runden(fromSolarKWh.reduce((sum, item) => sum + item, 0) / 1000 - yearChartKWh.series[1].data[i-1],3))
                                          yearChartKosten.series[2].data.push(G_runden(tarif.Energiepreis * yearChartKWh.series[2].data[i-1],3))
                                  
                                          //Autarkie
                                          let gesamtVerbrauch = yearChartKWh.series[0].data[i-1] + yearChartKWh.series[2].data[i-1]
                                          let eigenVerbrauch = yearChartKWh.series[2].data[i-1]
                                          let autarkieQuote = eigenVerbrauch / gesamtVerbrauch
                                          let gesamtSolar = yearChartKWh.series[2].data[i-1] + yearChartKWh.series[1].data[i-1]
                                          let eigenQuote = eigenVerbrauch / gesamtSolar
                                          yearChartAutPrc.series[0].data.push(G_runden(100*autarkieQuote,2))
                                          yearChartAutPrc.series[1].data.push(G_runden(100*eigenQuote,2))
                                  
                                          //Energien DC
                                          let dcGartenhausKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktYear}.${G_getMonthLongName(i)}.dcGartenhausKWh`).val)
                                          dcGartenhausKWh ||= []
                                          yearChartDC.series[0].data.push(G_runden(dcGartenhausKWh.reduce((sum, item) => sum + item,0) / 1000,3))
                                          let dcTerrasseKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktYear}.${G_getMonthLongName(i)}.dcTerrasseKWh`).val)
                                          dcTerrasseKWh ||= []
                                          yearChartDC.series[1].data.push(G_runden(dcTerrasseKWh.reduce((sum, item) => sum + item,0) / 1000,3))
                                  
                                      }
                                  
                                      //Jahresummen
                                      // - fromGrid
                                      let fromGridKWhJahressumme = yearChartKWh.series[0].data.reduce((sum, item) => sum + item, 0)
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.summeJahrFromGridKWh', fromGridKWhJahressumme, true)
                                      let fromGridEuroJahressumme = yearChartKosten.series[0].data.reduce((sum, item) => sum + item, 0)
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.summeJahrFromGridEuro', fromGridEuroJahressumme, true)
                                  
                                      // - toGrid
                                      let toGridKWhJahressumme = yearChartKWh.series[1].data.reduce((sum, item) => sum + item, 0)
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.summeJahrToGridKWh', toGridKWhJahressumme, true)
                                      let toGridEuroJahressumme = yearChartKosten.series[1].data.reduce((sum, item) => sum + item, 0)
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.summeJahrToGridEuro', toGridEuroJahressumme, true)
                                  
                                      // - eigenverbrauch
                                      let eigenverbrauchKWhJahressumme = yearChartKWh.series[2].data.reduce((sum, item) => sum + item, 0)
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.summeJahrEigenverbrauchKWh', eigenverbrauchKWhJahressumme, true)
                                      let eigenverbrauchEuroJahressumme = yearChartKosten.series[2].data.reduce((sum, item) => sum + item, 0)
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.summeJahrEigenverbrauchEuro', eigenverbrauchEuroJahressumme, true)
                                      //Gesamtverbrauch
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.summeJahrKonsumKWh', eigenverbrauchKWhJahressumme + fromGridKWhJahressumme, true)
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.summeJahrKonsumEuro', eigenverbrauchEuroJahressumme + fromGridEuroJahressumme, true)
                                  
                                      //Titelzeilen
                                      yearChartKWh.title.text = 'elektrische Energien in ' + aktYear
                                      yearChartKosten.title.text = 'Energienkosten in ' + aktYear
                                      yearChartAutPrc.title.text = 'Autarkie/Eigenquoten in ' + aktYear
                                      yearChartDC.title.text = 'elektrische Energie DC in ' + aktYear
                                      //x-Achse beschriften
                                      yearChartKWh.xAxis[0].data = Array.from({length: 12}, (tmp,i) => G_shrtMonths[i])
                                      //yearChartKWh.xAxis[0].data = Array.from({length: 12}, (tmp,i) => i+1)
                                  
                                      //Diagrammm als JSON im Objektbaum ablegen
                                      setState(jsonChartKWh,JSON.stringify(yearChartKWh),true)
                                      setState(jsonChartAutPrc,JSON.stringify(yearChartAutPrc),true)
                                      setState(jsonChartKosten,JSON.stringify(yearChartKosten),true)
                                      setState(jsonChartYearDC,JSON.stringify(yearChartDC),true)
                                  
                                  }
                                  
                                  
                                  //############################ chartEnergieMonth : Tagesenergien ############################
                                  
                                  
                                  function refreshMonth() {
                                  
                                      let aktMonthYear = getAktMonthYear()
                                      let tarif = checkTarifStrom(new Date(`${aktMonthYear.year}-('0'+ ${('0' + aktMonthYear.month).slice(-2)}-15`))
                                  
                                      //Diagramm Energien in KWh im RAM allokieren
                                      let jsonChartKWh = '0_userdata.0.Fronius.flexCharts.chartEnergieMonth'
                                      let monthChartKWh = JSON.parse(getState(jsonChartKWh).val)
                                      //Diagramm Autarkie&Effizienz in % im RAM allokieren
                                      let jsonChartAutPrc = '0_userdata.0.Fronius.flexCharts.chartEffizienzMonth'
                                      let monthChartAutPrc = JSON.parse(getState(jsonChartAutPrc).val)
                                      //Diagramm Kosten in € im RAM allokieren
                                      let jsonChartKosten = '0_userdata.0.Fronius.flexCharts.chartKostenMonth'
                                      let monthChartKosten = JSON.parse(getState(jsonChartKosten).val)
                                      //Diagramm Energie DC im RAM allokieren
                                      let jsonChartMonthDC = '0_userdata.0.Fronius.flexCharts.chartMonthDC'
                                      let monthChartDC = JSON.parse(getState(jsonChartMonthDC).val)
                                      
                                      //Tabelle fromGridKWh in KWh im RAM allokieren
                                      let fromGridKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktMonthYear.year}.${G_getMonthLongName(aktMonthYear.month)}.fromGridWh`).val)
                                      fromGridKWh = fromGridKWh.map(item => item / 1000)
                                      //Tabelle toGridKWh in KWh im RAM allokieren
                                      let toGridKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktMonthYear.year}.${G_getMonthLongName(aktMonthYear.month)}.toGridWh`).val)
                                      toGridKWh = toGridKWh.map(item => G_runden(item/1000,3))
                                      let fromSolarKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktMonthYear.year}.${G_getMonthLongName(aktMonthYear.month)}.solarWh`).val) 
                                      fromSolarKWh = fromSolarKWh.map(item => item / 1000) //erzeugte Solarenergie AC
                                      //Tabelle eigenVerbrauch
                                      let eigenVerbrauchKWh = fromSolarKWh.map((item, i) => G_runden(item - toGridKWh[i],3)) //Eigenverbrauch AC
                                      let gesamtVerbrauchKWh = eigenVerbrauchKWh.map((item, i) => G_runden(item + fromGridKWh[i],3)) //Gesamtverbrauch AC
                                  
                                      //Tabelle dcGartenhausKWh und dcTerrasseKWh in KWh im RAM allokieren
                                      let dcGartenhausKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktMonthYear.year}.${G_getMonthLongName(aktMonthYear.month)}.dcGartenhausKWh`).val)
                                      dcGartenhausKWh ||= []
                                      dcGartenhausKWh = dcGartenhausKWh.map(item => G_runden(item / 1000,3))
                                      let dcTerrasseKWh = JSON.parse(getState(`0_userdata.0.Fronius.Monatstabellen.${aktMonthYear.year}.${G_getMonthLongName(aktMonthYear.month)}.dcTerrasseKWh`).val)
                                      dcTerrasseKWh ||= []
                                      dcTerrasseKWh = dcTerrasseKWh.map(item => G_runden(item / 1000,3))
                                  
                                      //Energiesummen
                                      // - fromGrid
                                      let fromGridKWhSum = fromGridKWh.reduce((sum, item) => sum + item, 0)
                                      let fromGridEuroSum = fromGridKWhSum * tarif.Energiepreis
                                      // - toGrid
                                      let toGridKWhSum = toGridKWh.reduce((sum, item) => sum + item, 0)
                                      let toGridEuroSum = toGridKWhSum * tarif.Verkaufspreis
                                      // - Eigenverbrauch    
                                      let eigenverbrauchKWhSum = fromSolarKWh.reduce((sum, item) => sum + item) - toGridKWhSum
                                      let eigenverbrauchEuroSum = eigenverbrauchKWhSum * tarif.Energiepreis
                                      //Gesamtverbrauch bzw. Konsum
                                      let konsumKWhSum = fromGridKWhSum + eigenverbrauchKWhSum
                                      let konsumEuroSum = konsumKWhSum * tarif.Energiepreis
                                      //Energien DC
                                  
                                  
                                      //Summen in Objekte Speichern
                                      // - fromGrid
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.sumMonatFromGridKWh',fromGridKWhSum,true)
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.sumMonatFromGridEuro',fromGridEuroSum,true)
                                      // - toGrid
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.sumMonatToGridKWh',toGridKWhSum,true)
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.sumMonatToGridEuro',toGridEuroSum,true)
                                      // - Eigenverbrauch
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.sumMonatEigenverbrauchKWh',eigenverbrauchKWhSum,true)
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.sumMonatEigenverbrauchEuro',eigenverbrauchEuroSum,true)
                                      // - Konsum
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.sumMonatKonsumKWh',konsumKWhSum,true)
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.sumMonatKonsumEuro',konsumEuroSum,true)
                                  
                                      //Titelzeilen
                                      //Energien AC
                                      monthChartKWh.title.text = 'elektrische Energien im '
                                      monthChartKWh.title.text = (aktMonthYear.month == 3) ? monthChartKWh.title.text.concat('März') : monthChartKWh.title.text.concat(G_getMonthLongName(aktMonthYear.month))
                                      monthChartKWh.title.text = monthChartKWh.title.text.concat(' (' + aktMonthYear.year + ')')
                                      //Kosten
                                      monthChartKosten.title.text = 'Stromkosten im '
                                      monthChartKosten.title.text = (aktMonthYear.month == 3) ? monthChartKosten.title.text.concat('März') : monthChartKosten.title.text.concat(G_getMonthLongName(aktMonthYear.month))
                                      monthChartKosten.title.text = monthChartKosten.title.text.concat(' (' + aktMonthYear.year + ')')
                                      //Quoten
                                      monthChartAutPrc.title.text = 'Autarkie&Eigenquote im '
                                      monthChartAutPrc.title.text = (aktMonthYear.month == 3) ? monthChartAutPrc.title.text.concat('März') : monthChartAutPrc.title.text.concat(G_getMonthLongName(aktMonthYear.month))
                                      monthChartAutPrc.title.text = monthChartAutPrc.title.text.concat(' (' + aktMonthYear.year + ')')
                                      //Energien DC
                                      monthChartDC.title.text = 'elektrische Energien DC im '
                                      if (aktMonthYear.month == 3) {
                                          monthChartDC.title.text = monthChartDC.title.text + 'März'
                                      } else {
                                          monthChartDC.title.text = monthChartDC.title.text + G_getMonthLongName(aktMonthYear.month)
                                      }
                                      monthChartDC.title.text = monthChartDC.title.text +' (' + aktMonthYear.year + ')'
                                      //x-Achse beschriften
                                      //x-Achse
                                      monthChartKWh.xAxis[0].data = Array.from({length: G_getDaysOfMonth(aktMonthYear.year, aktMonthYear.month)}, (tmp,i) => i+1)
                                      monthChartKosten.xAxis[0].data = Array.from({length: G_getDaysOfMonth(aktMonthYear.year, aktMonthYear.month)}, (tmp,i) => i+1)
                                      monthChartAutPrc.xAxis[0].data = Array.from({length: G_getDaysOfMonth(aktMonthYear.year, aktMonthYear.month)}, (tmp,i) => i+1)
                                      monthChartDC.xAxis[0].data = Array.from({length: G_getDaysOfMonth(aktMonthYear.year, aktMonthYear.month)}, (tmp,i) => i+1)
                                      //y-Achsenwerte eintragen ..
                                      //Netzbezug, Einspeisung, Eigenverbrauch
                                      monthChartKWh.series[0].data = fromGridKWh
                                      monthChartKWh.series[1].data = toGridKWh
                                      monthChartKWh.series[2].data = eigenVerbrauchKWh
                                      //Kosten: Netzbezug, Einspeisung, Eigenverbrauch
                                      monthChartKosten.series[0].data = fromGridKWh.map((item,i) => item * tarif.Energiepreis)
                                      monthChartKosten.series[1].data = toGridKWh.map((item,i) => item * tarif.Verkaufspreis)
                                      monthChartKosten.series[2].data = eigenVerbrauchKWh.map((item,i) => item * tarif.Energiepreis)
                                      //Autarkie&Eigenverbrauch
                                      monthChartAutPrc.series[0].data = eigenVerbrauchKWh.map((item, i) => G_runden(100*item / gesamtVerbrauchKWh[i],1)) //Autarkie
                                      monthChartAutPrc.series[1].data = eigenVerbrauchKWh.map((item,i) => G_runden(100*item / fromSolarKWh[i],1)) //Eigenquote
                                  
                                      //Energien DC
                                      monthChartDC.series[0].data = dcGartenhausKWh
                                      monthChartDC.series[1].data = dcTerrasseKWh
                                  
                                  
                                      //Diagrammme als JSON im Objektbaum ablegen
                                      setState(jsonChartKWh,JSON.stringify(monthChartKWh),true)
                                      setState(jsonChartKosten,JSON.stringify(monthChartKosten),true)
                                      setState(jsonChartAutPrc,JSON.stringify(monthChartAutPrc),true)
                                      setState(jsonChartMonthDC,JSON.stringify(monthChartDC),true)
                                  }
                                  
                                  
                                  //############################ Scheduler & Trigger ############################
                                  
                                  
                                  //alle 4 Minuten die Anzeige aktualisieren
                                  
                                  schedule('*/4 * * * *', () => {
                                      refreshMonth(); refreshYear()
                                      setState('0_userdata.0.Fronius.flexCharts.rfhButton',0,false)
                                  });
                                  
                                  on({id:'0_userdata.0.Fronius.flexCharts.selMonth',change: 'any'},(obj) => {
                                      refreshMonth()
                                      setState('0_userdata.0.Fronius.flexCharts.rfhButton',0,false)
                                  })
                                  
                                  on({id:'0_userdata.0.Fronius.flexCharts.selYear',change: 'any'},(obj) => {
                                      //G_setListYears('0_userdata.0.Fronius.Monatstabellen', '0_userdata.0.Fronius.Charts.lstYears')
                                      setStateAsync('0_userdata.0.Fronius.flexCharts.rfhButton',0,false)
                                      G_setListMonths(getState('0_userdata.0.Fronius.flexCharts.selYear').val, '0_userdata.0.Fronius.Monatstabellen',
                                          '0_userdata.0.Fronius.flexCharts.lstMonths')
                                      refreshYear(); refreshMonth()
                                      setState('0_userdata.0.Fronius.flexCharts.rfhButton', 0, false)
                                  })
                                  
                                  on({id:'0_userdata.0.Fronius.flexCharts.buttonAktualisieren',change: 'any'},(obj) => {
                                      refreshMonth(); refreshYear()
                                      setState('0_userdata.0.Fronius.flexCharts.rfhButton',0,false)
                                  })
                                  
                                  
                                  //############################ Skriptstart ############################
                                  
                                  //listMonths des zugehörigen DropDown-Widgets füllen
                                  G_setListYears('0_userdata.0.Fronius.Monatstabellen', '0_userdata.0.Fronius.flexCharts.lstYear')
                                  //listYears des zugehörigen DropDown-Widgets füllen
                                  G_setListMonths(getState('0_userdata.0.Fronius.flexCharts.selYear').val, '0_userdata.0.Fronius.Monatstabellen',
                                      '0_userdata.0.Fronius.flexCharts.lstMonths')
                                  
                                  NegaleinN Offline
                                  NegaleinN Offline
                                  Negalein
                                  schrieb am zuletzt editiert von
                                  #239

                                  @legro sagte:

                                  insbesondere zu den im Skript

                                  von wo bekommst du die Daten?
                                  Ich seh bei dir nur 0_userdata.0.Fronius

                                  ° Node.js & System Update ---> sudo apt update, iob stop, sudo apt full-upgrade
                                  ° Node.js Fixer ---> iob nodejs-update
                                  ° Fixer ---> iob fix

                                  L 1 Antwort Letzte Antwort
                                  0
                                  • NegaleinN Negalein

                                    @legro sagte:

                                    insbesondere zu den im Skript

                                    von wo bekommst du die Daten?
                                    Ich seh bei dir nur 0_userdata.0.Fronius

                                    L Offline
                                    L Offline
                                    legro
                                    schrieb am zuletzt editiert von legro
                                    #240

                                    @Negalein sagte:

                                    von wo bekommst du die Daten?
                                    Ich seh bei dir nur 0_userdata.0.Fronius

                                    Die Daten stammen aus meinen in diesem Thread zuvor beschriebenen Monatstabellen. Hier findest du beschrieben, wie sie gefüllt werden können. Die Daten selbst werden dem Modbus-Adapter entnommen.

                                    Raspberry Pi 5 mit 8GB + 120GB SSD + Coordinator COD-m + ioBroker ..

                                    NegaleinN 1 Antwort Letzte Antwort
                                    0
                                    • L legro

                                      @Negalein sagte:

                                      von wo bekommst du die Daten?
                                      Ich seh bei dir nur 0_userdata.0.Fronius

                                      Die Daten stammen aus meinen in diesem Thread zuvor beschriebenen Monatstabellen. Hier findest du beschrieben, wie sie gefüllt werden können. Die Daten selbst werden dem Modbus-Adapter entnommen.

                                      NegaleinN Offline
                                      NegaleinN Offline
                                      Negalein
                                      schrieb am zuletzt editiert von
                                      #241

                                      @legro sagte:

                                      Die Daten stammen aus meinen in diesem Thread zuvor beschriebenen Monatstabelle

                                      ah, du holst sie mit Modbus ab.
                                      Das muss ich mir jetzt auch endlich mal anschaun.

                                      ° Node.js & System Update ---> sudo apt update, iob stop, sudo apt full-upgrade
                                      ° Node.js Fixer ---> iob nodejs-update
                                      ° Fixer ---> iob fix

                                      1 Antwort Letzte Antwort
                                      0
                                      • L Offline
                                        L Offline
                                        legro
                                        schrieb am zuletzt editiert von
                                        #242

                                        So siehst meine dazugehörige Objekt-Struktur aus ..

                                        5ea13e8f-e454-4e8d-9556-163262e4003c-image.jpeg

                                        Raspberry Pi 5 mit 8GB + 120GB SSD + Coordinator COD-m + ioBroker ..

                                        L 1 Antwort Letzte Antwort
                                        0
                                        • L legro

                                          So siehst meine dazugehörige Objekt-Struktur aus ..

                                          5ea13e8f-e454-4e8d-9556-163262e4003c-image.jpeg

                                          L Offline
                                          L Offline
                                          legro
                                          schrieb am zuletzt editiert von legro
                                          #243

                                          Die Datenpunkte enthalten Arrays mit den Tageswerten.

                                          Raspberry Pi 5 mit 8GB + 120GB SSD + Coordinator COD-m + ioBroker ..

                                          1 Antwort Letzte Antwort
                                          0

                                          Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

                                          Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

                                          Mit deinem Input könnte dieser Beitrag noch besser werden 💗

                                          Registrieren Anmelden
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          566

                                          Online

                                          33.0k

                                          Benutzer

                                          83.3k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2026
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe