SMA Modbus en andere zooi

Voor discussies en hulp met je smarthome en automatisering kan je hier terecht. DE plaats voor alles over home assistant, Philips hue, Zigbee, Sonoff, ...
Gebruikersavatar
conda
Starter Plus
Starter Plus
Berichten: 46
Lid geworden op: 12 dec 2020, 13:56
Bedankt: 1 keer

Jeroen_sma schreef: 04 okt 2024, 20:59 @Gijs Wassink. Hoe heb jij je kunnen aanmelden als Field tester?
Jeroen
@Jeroen_sma De periode van het fieldtesten is ondertussen voorbij. Ik heb me daar toen ook voor kunnen inschrijven. De firmware zou ondertussen uitgerold moeten zijn (versie X.15.5.R). De batterij kan je zelf terug aansturen, jammer genoeg zijn ze register 41255 vergeten te fixen. Deze wordt nog steeds overschreven.
Ik heb dit hen laten weten en hopelijk doen ze er nog iets mee. De batterij is wel terug aanstuurbaar.
liegebeestig
Elite Poster
Elite Poster
Berichten: 2370
Lid geworden op: 01 jun 2006, 15:16
Uitgedeelde bedankjes: 42 keer
Bedankt: 79 keer

Is er een manier om de nieuwe Firmware push te triggeren? Bij mij komt ie maar niet.
Gijs Wassink
Starter
Starter
Berichten: 9
Lid geworden op: 17 mei 2024, 22:37
Bedankt: 3 keer

Hierbij de centrale Class "Process" in C# waarmee ik de SMA Home Storage 9.6 kWh aanstuur.

wat inmiddels werkt:
- aansturen SMA inverter(s) via modbus
- aansturen Nefit Enviline Monoblock (warmtepomp)
- aansturen van de SMA EV Charger 22 (met hoeveel wordt de EV geladen?)
- Publiseren van de Applicatie naar RaspberryPi met pi-os (arm & arm64)
- Live ophalen van de EPEX spot-market-data via de Tibber API. (dynamische stroomprijzen)

Programma functies:
1. Batterij laden verschuiven naar de uren dat de stroomprijs laag is. (hiermee bespaar ik +/- 40,- euro/jaar)
2. Bij negatieve stroomprijzen batterij laden (stroom kopen) van het grid.
3. Bij een groot verschil in stroomprijs tussen twee opvolgende dagen eventueel stroom verkopen.
4. Tot op zekere hoogte rekening houden met zomer & winter tijd
5. Bij het laden van de EV eventuele conflikt situaties tussen EV en home batterij oplossen.
6. Per dag een email versturen met belangrijke informatie (bv. hoogste en laaste dag prijzen, verkoop / inkoop stroom enz..)

hopelijk lukt het me dit jaar nog het programma functie-compleet en bugvrij te krijgen.
Hierna wordt het geheel incl. libraries op Github gepubliseerd voor de liefhebber(s) :-D

Code: Selecteer alles

// Program..: Process.cs
// Author...: G. Wassink
// Design...:
// Date.....: 12/06/2024 Last revised: 25/10/2024
// Notice...: Copyright 1999, All Rights Reserved
// Notes....: C#12 .Net8
// Files....: None
// Programs.: 
// Publish  : dotnet publish --runtime linux-arm
// Publish  : dotnet publish --runtime linux-arm64
// Reserved.: Type Class (Process)

using System.Net;
using GWCharger;
using GWEmail;
using GWEnviline;
using GWModbus;
using GWTibber;
using SMABatteryControl.Classes;

namespace SMABatteryControl;

public class Process
{
	/* Local variables */
	private int currDay = 0;
	private readonly int eventPeriod = 360;                                                                                          // 360 seconds -> 6 minutes
	private Season season = Season.Summer;

	/* Local Objects */
	private readonly EnvilineApiClient hp = new(IPAddress.Parse("192.168.2.110"), "xxxxxx", "gijs");
	private readonly ModbusApiClient stpSE = new(IPAddress.Parse("192.168.2.109"));
	private readonly ChargerApiClient evCharger = new(IPAddress.Parse("192.168.2.103"), "xxxxxx", "xxxxxxx");
	private readonly TibberApiClient tibber = new("xxxxxx", lat: xxxxxxx, lng: xxxxx);       Netherlands -> geo-Location
	private readonly EmailUserData eMailUserData = new("xxxxxxx", "xxxxxx", "xxxxxxxx", "xxxxxxxxx", ["xxxxxxxxxx"], [""], true);
	private Timer? tmrMain = null;                                                                                                   // Event handler (Timer Object)

	/* Process Status */
	private ProcessStatus status = ProcessStatus.Idle;

	/* EPEX spot market Energy (Buying & Selling in Euro cents) */
	private const int BuyPrice = 0;                                                                                                  // Buy price		(Euro cent/kWh)
	private const int BuyMarge = 35;                                                                                              // Buy marge		(Euro cent/kWh)
	private const int SalesPrice = 35;                                                                                             // Seles price		(Euro cent/kWh) 
	private const int SalesMarge = 35;                                                                                           // Sales marge      (Euro cent/kWh)

	/* Battery -> SOC  -> Charge & Discharge power */
	private const int SOCMax = 100;                                                                                               // SOC = 100%
	private const int SOCMin = 0;                                                                                                     // SOC = 0%
	private const int SOCBuyMin = 35;                                                                                            // SOC = 35%
	private const int SOCSellMin = 75;                                                                                            // SOC = 75%
	private const int ChargePower = 5000;                                                                                     // Charge power		(Watt)  
	private const int DischargePower = 5000;                                                                                // Discharge power	(Watt) 

	/* Heatpump */
	private const int dhwTemp = 0;
	private const int indoorTempMin = 13;
	private const int indoorTempMax = 18;
	private const int indoorTempNormal = 15;
	private const int outdoorTempMin = 0;

	public void Start() => tmrMain = new Timer(MainProcess, null, 10000, (int)TimeSpan.FromSeconds(eventPeriod).TotalMilliseconds);  // Start processing in 6 minutes

	private void MainProcess(object? state)
	{
		//	tmrMain?.Change(Timeout.Infinite, Timeout.Infinite);						       // For debug purposese only 

		var currDateTime = DateTime.Now;                                                                                        // Get current DateTime (Utc->Ignore Summer/Winter time)
		season = Util.GetSeason(currDateTime);
		/* Testing */
		// var a = evCharger.Power;         // Ok
		// var b = evCharger.Mode;          // Ok
		// var r = evCharger.Reboot;        // Ok
		// var c = evCharger.SetPower(0);   // Ok
		// var m = evCharger.Mode;          // Ok
		//	evCharger.RefreshToken();
		// var et = evCharger.EnergyTotal;
		// var s = evCharger.Status;

		try
		{
			if (currDay != currDateTime.Day)                                                                                     // Switch day on Midnight
			{
				tibber.GetEPEX(currDateTime.Year, currDateTime.Month, currDateTime.Day);
				Util.InitDay(currDateTime, season, this.hp.OutdoorTemp, this.hp.IndoorTemp, this.hp.DHWTemp, stpSE.BatterySOC(), tibber, eMailUserData);

				currDay = currDateTime.Day;
				status = ProcessStatus.Break;
			}
			else if (currDateTime.Hour is 13 or 14)                                                                              // Tibber: After One o'çlock midday Tibber publishes EPEX spot market tariffs/prices for ToDay and Tomorrow  (Try for two hours)
			{
				if (!tibber.ToMorrow.Valide)                                                                                          // ? ToMorrow already Valide
				{
					tibber.GetEPEX(currDateTime.Year, currDateTime.Month, currDateTime.Day);

					if (tibber.ToMorrow.Valide)                                                                                    // Tomorrow EPEX spot market data is invalide so try load spot tariffs/prices again ()
						Util.InitDay(currDateTime, season, this.hp.OutdoorTemp, this.hp.IndoorTemp, this.hp.DHWTemp, stpSE.BatterySOC(), tibber, eMailUserData);
				}
			}

			/* ----------------------------------------  Summer season  -------------------------------------------------- */
			if (season == Season.Summer && tibber.ToDay.Valide)
			{
				if (status == ProcessStatus.BatteryChargeFromGrid)                                                                // Allwayes -> First action
				{
					stpSE.BatteryChargeFromGrid(socMax: SOCMax, power: ChargePower);
					status = stpSE.BatteryControl == BatteryControlEnum.Remote ?
																ProcessStatus.BatteryChargeFromGrid : ProcessStatus.Break;        // If stil Remote continue with BatteryChargeFromGrid
				}
				else if (status == ProcessStatus.BatteryDischargeToGrid)
				{
					stpSE.BatteryDischageToGrid(socMin: SOCSellMin, power: DischargePower);                                       // SOC minimun is 50% (summer)
					status = stpSE.BatteryControl == BatteryControlEnum.Remote ?
																ProcessStatus.BatteryDischargeToGrid : ProcessStatus.Break;
				}
				else if (evCharger.Status == ChargeStatusEnum.Charging)                                                           // EV Charger in use then -> set controle to ...... 
				{
					if (status != ProcessStatus.EVCharging)
					{
						Console.WriteLine($"EV      -> Charging {DateTime.Now:HH:mm}");

						if (tibber.ToDay.Prices[currDateTime.Hour].Energy > BuyPrice)                                             // Current Energy-price > BuyPrice
							stpSE.BatteryInverterControlIed();
						else
							stpSE.BatteryRemoteControlled();

						status = ProcessStatus.EVCharging;                                                                        // ProcessStatus.EVCharging -> Handled in the "else" to Idle 
					}
				}
				else if (status == ProcessStatus.BatteryChargeDelayed)
				{
					if (currDateTime.Hour >= tibber.ToDay.BatteryChargeMinHour)
					{
						stpSE.BatteryInverterControlIed();
						status = ProcessStatus.BatteryChargeFromPV;                                                               // ProcessStatus.BatteryChargedFromPV -> Handled in the "else" to Idle 

						Console.WriteLine($"Battery -> Charge from PV {DateTime.Now:HH:mm}");
					}
				}
				else if ((tibber.ToDay.MaxPrice - tibber.ToMorrow.MinPrice) >= SalesMarge &&
							 SalesPrice < tibber.ToMorrow.MaxPrice)                                                                // Sell: ToDay and buy-back Tomorrow
				{
					status = ProcessStatus.BatteryDischargeToGrid;                                                                 // Mandetory start Selling energy (default 1/2 hour 5000watt -> 2.5 kWh)
				}
				else if (BuyPrice > tibber.ToDay.Prices[currDateTime.Hour].Energy)                                         // Buy: ALL-TIME: by 'negative' Tibber/EPEX tariffs/prices ==> Charge the Battery  (-> Buy energy)
				{
					status = ProcessStatus.BatteryChargeFromGrid;                                                                  // Mode Start Buying energy
				}
				else if (Util.TS(currDateTime).TotalHours > tibber.ToDay.SunRise &&
							Util.TS(currDateTime).TotalHours < tibber.ToDay.SunSet)                                    // Day light time check for battery delayed charging								
				{
					if (currDateTime.Hour < tibber.ToDay.BatteryChargeMinHour && stpSE.BatteryDischarge() == 0)
					{
						stpSE.BatteryRemoteControlled();
						status = ProcessStatus.BatteryChargeDelayed;

						Console.WriteLine($"Battery -> Charge delayed to: {tibber.ToDay.BatteryChargeMinHour}:00");
					}
				}
			} /*  --------------------------------------------------  Winter season --------------------------------- */
			else if (season == Season.Winter && tibber.ToDay.Valide)
			{
				if (status == ProcessStatus.BatteryChargeFromGrid)                                                                // Allwayes -> First action
				{
					stpSE.BatteryChargeFromGrid(socMax: SOCMax, power: ChargePower);
					status = stpSE.BatteryControl == BatteryControlEnum.Remote ?
																ProcessStatus.BatteryChargeFromGrid : ProcessStatus.Break;        // If stil Remote continue with BatteryChargeFromGrid
				}
				else if (status == ProcessStatus.BatteryDischargeToGrid)
				{
					stpSE.BatteryDischageToGrid(socMin: SOCSellMin, power: DischargePower);                                       // SOC minimun is 75% (summer)
					status = stpSE.BatteryControl == BatteryControlEnum.Remote ?
																ProcessStatus.BatteryDischargeToGrid : ProcessStatus.Break;       // If stil Remote continue with BatteryChargeFromGrid
				}
				else if (evCharger.Power > 0)                                                                                                 // EV Charger in use then -> .......
				{
					Console.WriteLine($"EV      -> Charging: {DateTime.Now:HH:mm}");

					if (tibber.ToDay.Prices[currDateTime.Hour].Energy > BuyPrice)                               // Current Energy-price > BuyPrice
						stpSE.BatteryInverterControlIed();
					else
						stpSE.BatteryRemoteControlled();

					status = ProcessStatus.EVCharging;                                                                              // ProcessStatus.EVCharging -> Handled in the "else" to Idle 
				}
				else if (BuyPrice > tibber.ToDay.Prices[currDateTime.Hour].Energy)                               // ALL-TIME: By 'negative' Tibber/EPEX tariffs/prices ==> Charge the Battery  (-> Buy energy) 
				{
					if (stpSE.BatterySOC() < SOCMax) { }
					status = ProcessStatus.BatteryChargeFromGrid;                                                          // Start Buying energy

					if (hp.IndoorTemp <= indoorTempMax)                                                                           // Start HP 
						hp.IndoorTempSetpoint(indoorTempMax);
					else
						hp.IndoorTempSetpoint(indoorTempNormal);
				}
				else if ((tibber.ToDay.MaxPrice - tibber.ToMorrow.MinPrice) >= SalesMarge &&
							 SalesPrice < tibber.ToMorrow.MaxPrice &&
							 tibber.ToDay.MaxHour == currDateTime.Hour)                                                     // Sell: ToDay and buy-back Tomorrow
				{
					status = ProcessStatus.BatteryDischargeToGrid;                                                                 // Mandetory start Selling energy (default 1/2 hour 5000watt -> 2.5 kWh)
				}
				else
				{
					if (status != ProcessStatus.Idle)
					{
						stpSE.BatteryInverterControlIed();
						status = ProcessStatus.Idle;                                                                                // Do nothing until day changed to next day

						Console.WriteLine($"Idle    -> Mode started: {DateTime.Now:dd-MM-yyyy HH:mm}");
					}
				}
			}
			else
			{
				if (status != ProcessStatus.Idle)
				{
					stpSE.BatteryInverterControlIed();
					hp.IndoorTempSetpoint(indoorTempMin);

					status = ProcessStatus.Idle;                                                                                   // Do nothing until day changed to next day

					Console.WriteLine($"Idle    -> Mode started: {DateTime.Now:dd-MM-yyyy HH:mm}");
				}
			}
		}
		catch (Exception)
		{
		}
	}
	//	tmrMain?.Change(0, (int)TimeSpan.FromSeconds(eventPeriod).TotalMilliseconds);														//  
}
Laatst gewijzigd door Gijs Wassink 30 okt 2024, 10:58, in totaal 3 gewijzigd.
tomdw
Starter
Starter
Berichten: 2
Lid geworden op: 24 okt 2024, 13:57

Ik sta op het punt om een pv panelen en batterij te plaatsen en was getriggerd door het Flexio verhaal. Ik ben zelf wel wat bedreven in c# en werd zo getriggerd door deze thread. @Gijs Wassink is deze code open source beschikbaar in een git ofzo ? Ik heb wel interesse om mee te werken ... Alvast bedankt.
Gijs Wassink
Starter
Starter
Berichten: 9
Lid geworden op: 17 mei 2024, 22:37
Bedankt: 3 keer

Ik heb inmiddels de post viewtopic.php?p=1003464#p1003464 van drie weken gelegen geupdate naar mijn laatste versie:

@tomdw ik ben nog volop met het project bezig en ga het t.z.t. op GitHub publiceren.

Het project is erg gefocust op mijn situatie en als het op Github gepubliseerd is voor alle die geïnteresseerd zijn te downloaden.
tomdw
Starter
Starter
Berichten: 2
Lid geworden op: 24 okt 2024, 13:57

Bedankt voor je reactie @Gijs Wassink . Laat me zeker weten wanneer er iets beschikbaar komt op GitHub.
Bedankt alvast voor je 'process' class. Het zijn dan vooral de andere namespaces o.a. GWCharger, GWModbus die me wel tijd zouden besparen, kwestie van het warm water niet opnieuw te moeten uitvinden ...
ppallen
Starter
Starter
Berichten: 4
Lid geworden op: 4 maanden geleden

Hallo iedereen,

Ik ben momenteel aan het kijken om over te stappen naar een elektriciteitscontract met dynamische prijzen. Hiervoor ben ik aan het kijken hoe ik mijn injectie kan beperken en eventueel terug te leveren uit mijn batterij als de prijs hoog genoeg is.

Mijn setup:
  • SMA Tripower 6.O
  • Sunny Boy 4.0
  • Sunny Boy storage 5.0
  • Home Manager 2.0
Vraag die ik heb is als je het vermogen wil beperken tot je huis consumptie past je dan hetzelfde percentage toe op beide omvormers?

@conda Zou jij eventueel U node-red script willen delen?
Jeroen_sma
Starter
Starter
Berichten: 3
Lid geworden op: 19 jul 2024, 23:02
Uitgedeelde bedankjes: 2 keer

@Gijs Wassink Was je al verder met je applicatie van het sturen van de batterij op basis van prijzen enz?
Ik keek op Github maar ik die die applicatie van je nog niet staan?
Op welke device draai je eigenlijk de applicatie (PI?). Ik nieuw in een applicatie in C# draaien op een PI of ander apparaat, is dat te doen voor een beginner of beter om een ander device te gebruiken?

Groet en dank
Gebruikersavatar
conda
Starter Plus
Starter Plus
Berichten: 46
Lid geworden op: 12 dec 2020, 13:56
Bedankt: 1 keer

ppallen schreef: 4 maanden geleden Hallo iedereen,

Ik ben momenteel aan het kijken om over te stappen naar een elektriciteitscontract met dynamische prijzen. Hiervoor ben ik aan het kijken hoe ik mijn injectie kan beperken en eventueel terug te leveren uit mijn batterij als de prijs hoog genoeg is.

Mijn setup:
  • SMA Tripower 6.O
  • Sunny Boy 4.0
  • Sunny Boy storage 5.0
  • Home Manager 2.0
Vraag die ik heb is als je het vermogen wil beperken tot je huis consumptie past je dan hetzelfde percentage toe op beide omvormers?

@conda Zou jij eventueel U node-red script willen delen?
@ppallen Hier is alvast de JSON van de flow. Je kan deze rechtstreeks importeren in node red.

Code: Selecteer alles

[{"id":"ee93724ef816afff","type":"group","z":"a5ecbc5e135cb5e8","style":{"stroke":"#999999","stroke-opacity":"1","fill":"none","fill-opacity":"1","label":true,"label-position":"nw","color":"#a4a4a4"},"nodes":["b0c5d975ebd082d2","7b346b9d03da2a5f","ce42b377546436a8","9f34dffa10bb0a29","0125564bb8c4ec32","4354094496a5fc16","fc8d1ad72c792502","3ea0bc43faf83cb6","7ff509aa6544d71b","68ce8249a19893a8","168f131b7f5b2ea7","99790ef0c97f3607","dda1126b839cc582","990f904a54239bbc","2e30b1a59f495751","c476f930b588590f","7ba1bad999aa53fb","d2933282f7cf775c","3c725bb32e9aceeb","ec39bd55d1c1b248","f27fac7242369f88","97226d384540ec7c","9cfb26d4e608f9cb","1eb6a7f104e19979","e990a91daf3f1871","be5fa0892af9291b","2f33d9778262850a","9806f11126fd82fd","06560fd65450e959"],"x":34,"y":539,"w":1952,"h":482},{"id":"b0c5d975ebd082d2","type":"api-call-service","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Turn off zero export + DAC --> Reset power slider to 100%","server":"82e28109.c824c","version":7,"debugenabled":false,"action":"input_boolean.turn_off","floorId":[],"areaId":[],"deviceId":[],"entityId":["input_boolean.zero_export","input_boolean.dynamic_active_control_dac"],"labelId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"100","valueType":"num"},{"property":"topic","propertyType":"msg","value":"Turn off zero export --> Reset power slider to 100%","valueType":"str"}],"queue":"none","blockInputOverrides":false,"domain":"input_boolean","service":"turn_off","x":590,"y":980,"wires":[["7ff509aa6544d71b"]]},{"id":"7b346b9d03da2a5f","type":"api-call-service","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Turn on zero export --> set power slider to 100%","server":"82e28109.c824c","version":7,"debugenabled":false,"action":"input_boolean.turn_on","floorId":[],"areaId":[],"deviceId":[],"entityId":["input_boolean.zero_export"],"labelId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"100","valueType":"num"},{"property":"topic","propertyType":"msg","value":"Turn on zero export","valueType":"str"}],"queue":"none","blockInputOverrides":false,"domain":"input_boolean","service":"turn_on","x":560,"y":920,"wires":[["7ff509aa6544d71b"]]},{"id":"ce42b377546436a8","type":"comment","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"4 seasons flow: Zero export when export price is negative","info":"","x":270,"y":580,"wires":[]},{"id":"9f34dffa10bb0a29","type":"server-state-changed","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Export price < 0?","server":"82e28109.c824c","version":6,"outputs":2,"exposeAsEntityConfig":"","entities":{"entity":["sensor.adjusted_current_electricity_export_price"],"substring":[],"regex":[]},"outputInitially":true,"stateType":"num","ifState":"0","ifStateType":"num","ifStateOperator":"lt","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"on","valueType":"str"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":160,"y":960,"wires":[["7b346b9d03da2a5f"],["b0c5d975ebd082d2"]]},{"id":"0125564bb8c4ec32","type":"server-state-changed","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Active power limit slider","server":"82e28109.c824c","version":6,"outputs":1,"exposeAsEntityConfig":"","entities":{"entity":["input_number.active_power_limit"],"substring":[],"regex":[]},"outputInitially":false,"stateType":"str","ifState":"","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":180,"y":660,"wires":[["fc8d1ad72c792502","4354094496a5fc16"]]},{"id":"4354094496a5fc16","type":"function","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"* 100","func":"var lim = msg.payload *100;\nreturn [{payload: lim}];","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":410,"y":640,"wires":[["ec39bd55d1c1b248"]]},{"id":"fc8d1ad72c792502","type":"function","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"* 80","func":"var lim = msg.payload *80;\nreturn [{payload: lim}];","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":410,"y":720,"wires":[["3ea0bc43faf83cb6"]]},{"id":"3ea0bc43faf83cb6","type":"ha-sensor","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Active power limit sensor","entityConfig":"dbbf6dfc33b249fe","version":0,"state":"payload","stateType":"msg","attributes":[],"inputOverride":"allow","outputProperties":[],"x":690,"y":720,"wires":[[]]},{"id":"7ff509aa6544d71b","type":"api-call-service","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Active power limit slider","server":"82e28109.c824c","version":7,"debugenabled":false,"action":"input_number.set_value","floorId":[],"areaId":[],"deviceId":[],"entityId":["input_number.active_power_limit"],"labelId":[],"data":"{\"value\":{{payload}}}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"blockInputOverrides":false,"domain":"input_number","service":"set_value","output_location":"","output_location_type":"none","service_domain":"input_number","mergecontext":"","x":690,"y":780,"wires":[[]]},{"id":"68ce8249a19893a8","type":"inject","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Reset active power limit slider to 100% @ midnight","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 00 * * *","once":false,"onceDelay":0.1,"topic":"Reset active power limit slider to 100%","payload":"100","payloadType":"num","x":290,"y":780,"wires":[["7ff509aa6544d71b"]]},{"id":"168f131b7f5b2ea7","type":"comment","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Adjust dynamically \"Normalized active power limitation by PV system control\" to home consumption","info":"","x":1300,"y":580,"wires":[]},{"id":"99790ef0c97f3607","type":"function","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Power limit factor","func":"var marge = 0;\nvar Limfactor;\n\nif (msg.payload > 8000) {\n    Limfactor = (8000 + marge) / 8000;\n} else {\n    Limfactor = (msg.payload + marge) / 8000;\n}\n\nreturn [{ payload: Limfactor }];\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1250,"y":760,"wires":[["dda1126b839cc582"]]},{"id":"dda1126b839cc582","type":"function","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"abs","func":"var abs = Math.abs(msg.payload);\n\nreturn [{ payload: abs }]","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1030,"y":840,"wires":[["990f904a54239bbc"]]},{"id":"990f904a54239bbc","type":"function","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"* 100","func":"var lim = msg.payload *100 ;\nvar limit = Math.ceil(lim) ; \nreturn [{payload: limit}];","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1190,"y":840,"wires":[["2e30b1a59f495751"]]},{"id":"2e30b1a59f495751","type":"delay","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"","pauseType":"rate","timeout":"6","timeoutUnits":"seconds","rate":"1","nbRateUnits":"10","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":1360,"y":840,"wires":[["c476f930b588590f"]]},{"id":"c476f930b588590f","type":"api-call-service","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Active power limit slider","server":"82e28109.c824c","version":7,"debugenabled":false,"action":"input_number.set_value","floorId":[],"areaId":[],"deviceId":[],"entityId":["input_number.active_power_limit"],"labelId":[],"data":"{\"value\":{{payload}}}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"blockInputOverrides":false,"domain":"input_number","service":"set_value","output_location":"","output_location_type":"none","service_domain":"input_number","mergecontext":"","x":1110,"y":920,"wires":[[]]},{"id":"7ba1bad999aa53fb","type":"api-current-state","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"If zero export is on","server":"82e28109.c824c","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.zero_export","state_type":"str","blockInputOverrides":false,"outputProperties":[],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1550,"y":660,"wires":[["be5fa0892af9291b","97226d384540ec7c"],[]]},{"id":"d2933282f7cf775c","type":"poll-state","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"houseconsumption","server":"82e28109.c824c","version":3,"exposeAsEntityConfig":"","updateInterval":"1","updateIntervalType":"num","updateIntervalUnits":"seconds","outputInitially":true,"outputOnChanged":false,"entityId":"sensor.current_houseconsumption","stateType":"str","ifState":"","ifStateType":"str","ifStateOperator":"is","outputs":1,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"topic","propertyType":"msg","value":"Home consumption","valueType":"str"}],"x":1050,"y":660,"wires":[["f27fac7242369f88"]]},{"id":"3c725bb32e9aceeb","type":"comment","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Als capaciteitstarief op injectie ingaat dan moet DAC altijd aan!","info":"","x":1180,"y":620,"wires":[]},{"id":"ec39bd55d1c1b248","type":"modbus-write","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"SMA Modbus Write 41255 ( Limit )","showStatusActivities":true,"showErrors":true,"showWarnings":true,"unitid":"1","dataType":"HoldingRegister","adr":"41255","quantity":"1","server":"a3ba30e733e52b3b","emptyMsgOnFail":true,"keepMsgProperties":true,"delayOnStart":false,"startDelayTime":"","x":720,"y":620,"wires":[[],[]]},{"id":"f27fac7242369f88","type":"function","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Houseconsumption - 60","func":"// Controleer of msg.payload een geldig getal is\nif (isNaN(msg.payload)) {\n    node.warn(\"Payload is geen geldig getal: \" + msg.payload);\n    return null; // Stopt de uitvoering als het geen getal is\n}\n\n// Aftrekken: houseConsumption - 60\nvar houseConsumption = parseFloat(msg.payload);\nvar result = houseConsumption - 60;\nmsg.payload = result;\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1310,"y":660,"wires":[["7ba1bad999aa53fb"]]},{"id":"97226d384540ec7c","type":"api-current-state","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"If DAC is on","server":"82e28109.c824c","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.dynamic_active_control_dac","state_type":"str","blockInputOverrides":false,"outputProperties":[],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1050,"y":760,"wires":[["99790ef0c97f3607"],[]]},{"id":"9cfb26d4e608f9cb","type":"api-call-service","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Turn on DAC","server":"82e28109.c824c","version":7,"debugenabled":false,"action":"input_boolean.turn_on","floorId":[],"areaId":[],"deviceId":[],"entityId":["input_boolean.dynamic_active_control_dac"],"labelId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":true,"domain":"input_boolean","service":"turn_on","x":1650,"y":800,"wires":[["1eb6a7f104e19979"]]},{"id":"1eb6a7f104e19979","type":"stoptimer","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","duration":"30","units":"Minute","payloadtype":"num","payloadval":"0","name":"30 minutes timer","x":1880,"y":800,"wires":[["06560fd65450e959"],[]]},{"id":"e990a91daf3f1871","type":"api-call-service","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Turn off DAC + set powerslider to 100%","server":"82e28109.c824c","version":7,"debugenabled":false,"action":"input_boolean.turn_off","floorId":[],"areaId":[],"deviceId":[],"entityId":["input_boolean.dynamic_active_control_dac"],"labelId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"100","valueType":"num"}],"queue":"none","blockInputOverrides":true,"domain":"input_boolean","service":"turn_off","x":1760,"y":920,"wires":[["c476f930b588590f"]]},{"id":"be5fa0892af9291b","type":"api-current-state","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Grid return > 500w","server":"82e28109.c824c","version":3,"outputs":2,"halt_if":"500","halt_if_type":"num","halt_if_compare":"gt","entity_id":"sensor.electricity_meter_grid_power_return","state_type":"num","blockInputOverrides":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"on","valueType":"str"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1810,"y":660,"wires":[["2f33d9778262850a"],[]]},{"id":"2f33d9778262850a","type":"delay","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"","pauseType":"delay","timeout":"20","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1660,"y":740,"wires":[["9806f11126fd82fd"]]},{"id":"9806f11126fd82fd","type":"api-current-state","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Grid return > 500w","server":"82e28109.c824c","version":3,"outputs":2,"halt_if":"500","halt_if_type":"num","halt_if_compare":"gt","entity_id":"sensor.electricity_meter_grid_power_return","state_type":"num","blockInputOverrides":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"on","valueType":"str"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1850,"y":740,"wires":[["9cfb26d4e608f9cb"],[]]},{"id":"06560fd65450e959","type":"api-current-state","z":"a5ecbc5e135cb5e8","g":"ee93724ef816afff","name":"Battery not full?","server":"82e28109.c824c","version":3,"outputs":2,"halt_if":"100","halt_if_type":"num","halt_if_compare":"lt","entity_id":"sensor.sn_3012415982_battery_soc_total","state_type":"num","blockInputOverrides":true,"outputProperties":[],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1820,"y":860,"wires":[["e990a91daf3f1871"],[]]},{"id":"82e28109.c824c","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true},{"id":"dbbf6dfc33b249fe","type":"ha-entity-config","server":"82e28109.c824c","deviceConfig":"","name":"Active power limit","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Active power limit"},{"property":"icon","value":""},{"property":"entity_picture","value":""},{"property":"entity_category","value":"diagnostic"},{"property":"device_class","value":"power"},{"property":"unit_of_measurement","value":"W"},{"property":"state_class","value":"measurement"}],"resend":false,"debugEnabled":false},{"id":"a3ba30e733e52b3b","type":"modbus-client","name":"","clienttype":"tcp","bufferCommands":true,"stateLogEnabled":true,"queueLogEnabled":true,"failureLogEnabled":true,"tcpHost":"192.168.178.72","tcpPort":"502","tcpType":"DEFAULT","serialPort":"/dev/ttyUSB","serialType":"RTU-BUFFERD","serialBaudrate":"9600","serialDatabits":"8","serialStopbits":"1","serialParity":"none","serialConnectionDelay":"100","serialAsciiResponseStartDelimiter":"0x3A","unit_id":3,"commandDelay":1,"clientTimeout":1000,"reconnectOnTimeout":true,"reconnectTimeout":2000,"parallelUnitIdsAllowed":true,"showErrors":true,"showWarnings":true,"showLogs":true}]
Sorry voor het veel te late antwoord. Ik heb het bericht totaal gemist.

Ik zie dat jij eveneens een Home manager 2 hebt. In eerdere berichten heb ik aangegeven dat er een probleem was met een update van de firmware en dat de Home manager 2 dit modbus register telkens overschrijft. Dit is nog steeds zo, maar ik heb het kunnen oplossen. Na een tijd over en weer gemaild te hebben met iemand van SMA, gaf die de sugestie dat je de home manager ook als gewone energiemeter kan gebruiken. Als je home assistant gebruikt, dan heb je eigenlijk die functies van de home manager 2 niet meer nodig. De oplossing is dus om de connectie met SMA sunnycloud te verbreken en je installatie daar te deleten. Als je home assistant gebruikt, dan krijg je normaal gezien al je gegevens daar binnen. Op dit manier, door de verbinding te verbreken met sunny portal, stopt home manager met de baas te spelen over de omvormer en werkt dit register terug als normaal. Ik geef het even mee, want anders ga je allicht hier tegenaan lopen. Met een klassieke energiemeter van sma werkt het normaal, maar niet met home manager 2, althans niet meer dankzij die firmware update. Je zal dus voorlopig moeten kiezen vrees ik. Ik heb de keuze gemaakt en het werkt prima nu. 8)

Van mijn contact bij SMA weet ik dat ze normaal gezien in Q3 van dit jaar een nieuwe firmaware update gepland hebben, waar dynamische tarieven in vervat zitten. Benieuwd of je dan via de Home manager 2 je vermogen kan beperken bij negatieve injectieprijzen. Dit zijn een beetje de opties waar je tussen kan kiezen op dit moment.

Laat gerust weten of het gelukt is of je ergens vast loopt.

Ik heb hier mijn installatie intussen draaien naar eigen smaak.
ppallen
Starter
Starter
Berichten: 4
Lid geworden op: 4 maanden geleden

@conda hoe heb je die verbinding verbroken? Effectief de plant deleten in sunnyportal?

Hoe gebeurd dan de batterij sturing?
Ik had om te testen de netwerkkabel verwijderd maar dan had ik geen meetgegevens meer en liep de sturing totaal verkeerd en ging het systeem volledig over naar afname van het net.
Gebruikersavatar
conda
Starter Plus
Starter Plus
Berichten: 46
Lid geworden op: 12 dec 2020, 13:56
Bedankt: 1 keer

@ppallen Klopt inderdaad. Ik heb de "irretrivably delete PV system" gedaan in Sunny Portal. De Sunny Home Manager 2 is nog wel verbonden met mijn omvormer en stuurt nog wel alle gegevens naar de omvormer. Het verschil is nu dat de Home manager 2 de modbus niet meer overschrijft en ik terug alle registers kan aanspreken. De batterijsturing gebeurt nog steeds door de omvormer, maar er is geen gemoei meer van de Home manager 2. Deze gedraagt zich nu als een klassieke energiemeter en stuurt zijn gegevens naar de omvormer en de omvormer is nu terug de baas zeg maar.

Alvorens ik Sunny portal had gedropt, heb ik ook enkele maanden mijn systeem gebruikt zonder de Home Manager 2 of energiemeter. Ik had ook de netwerkkabel uit getrokken. De sturing viel dan inderdaad weg, maar heb binnen node red een basissturing nagemaakt toen. Dat werkte redelijk, maar het enige nadeel was dat wellicht door een zekere latency het geheel soms een paar seconden nodig had om te balanceren als er plots een groot verbruik was of een verbruiker plots wegviel. Je kan de sturing in principe volledig zelf overnemen, maar werkt wel beter als de omvormer dit doet. Dus nu werkt het bij mij terug als ervoren, met dat verschil dat ik geen Sunnyportal meer heb, maar dat is niet erg, gezien ik alles in Home assisant heb nu qua energiegegevens.

Als je "de plant" in Sunnyportal delete, dan ben je wel al die gegevens kwijt op dat platform. Als je de netwerkkabel in de Home manager 2 laat zitten, dan gaat die zijn gegevens gewoon naar de omvormer sturen en de batterijsturing doen.

Je bent op dat moment wel alle functies van de Home manager 2 kwijt. Je kan niet meer in het menu, gezien dat in sunny portal zat, maar de omvormer stuurt wel de batterij aan.

Ikzelf gebruikte Sunny portal niet meer, gezien Home assistant veel meer mogelijkheden heeft en ik daar nu alles in doe.

Is het gelukt om de flows in node red te openen?
ppallen
Starter
Starter
Berichten: 4
Lid geworden op: 4 maanden geleden

@conda dank U voor de snelle feedback.

De node red flow werkt prima, bedankt om deze te delen. Heb mijn 2e omvormer er ook bij gezet zodat deze alle 2 aangestuurd worden.
Moet nu de plant nog wel verwijderen maar moet eerst nog kijken hoe ik batterij besturing (buffer percentage) kan doe via node red alsook hoe ik piek shaving kan doen, heb dit nu via Sunnyportal aan staan.
Gebruikersavatar
conda
Starter Plus
Starter Plus
Berichten: 46
Lid geworden op: 12 dec 2020, 13:56
Bedankt: 1 keer

@ppallen Super! Ben blij dat je ermee verder kan.

Wat bedoel je precies met bufferpercentage? Als je kijkt in de 2de flow, dan zal hij 's ochtends alles boven de 20 procent nog verkopen op het duurste moment. Hij houdt altijd een buffer van 20 procent over. (Je kan het uiteraard aanpassen naar wens.) Op moment dat hij 's ochtends heeft verkocht tot 20 procent en je gebruikt nog een stuk van die 20 procent omdat de zon nog niet hard genoeg schijnt of je verbruik is hoger, dan gaat hij eerst met zijn overschot bijladen tot 20 procent alvorens de rest uit te stellen tot een later moment in de derde flow (no charging before noon). Op dit moment gaat hij altijd 20 procent buffer behouden of eerst terug naar 20 procent laden, tenzij je dit aanpast.

Piek shaving zit er inderdaad niet in, omdat ik die buffer van 20 procent heb voorzien en heb zelf besloten om geen piek shaving te doen, omdat het niet nodig is in mijn situatie vanaf februari tot en met november. In mijn geval heeft het niet zo een grote impact om tijdens de wintermaanden mijn piek wat te laten oplopen. Dat kan je zien in de flow van het laden van de batterij in de winter. :-D

Ieder zijn situatie, wensen en noden zijn anders natuurlijk. Dit kan je nog wel inbouwen door eerst de omstandigheden waarop je wil peakshaven in kaart te brengen en dan een nieuwe flow hiervoor te maken rekening houdend met de andere flows dat deze je niet tegenwerken op andere momenten natuurlijk.

Nog 1 vraagje: gebruikt die in je versie nog de "Rank sensor" of "the most expensive hour in de the morning" sensor? In geval dat die nog de "rank sensor" gebruikt, is het handiger om in HACS de Epex spot sensor te downloaden en gebruiken in de plaats. Hiermee kan je exacter het duurste uur 's sochtends en 's avonds mee maken. Je kan hiermee eenvoudig enkele binary sensors mee maken die aan gaan op het goedkooptste of duurste uur in de ochtend of avond. Dit is handig voor het aansturen van individuele toestellen zoals vaatwasser, wasmachine, ...

Ik ben op dit moment nog bezig met een laatste flow en dat is het opladen van de batterij als de importprijzen negatief zijn. Hij moet dan eerst wachten met opladen aan het net tot de importprijzen negatief zijn. Ervoor enkel eigen verbruik dekken en niet laden natuurlijk. Dit is nog in progressie. Die omstandigheden zijn nog niet zo vaak voorgekomen om te testen.

Ook hier is mijn setup nog in evolutie. :lol:

Ik zal binnenkort de JSON nog eens delen, want er zijn hier en daar nog enkele aanpassingen sinds de laatste gedeelde versie.

Er zijn ook nog een aantal aangepaste sensoren dat je in je config.yaml moet maken:

De Epex spot prijzen moet je natuurlijk aan je eigen formule van je dynamisch contract aanpassen.

### Adjusted EPEXSPOT electricity prices ###

adjusted_average_electricity_import_price:
friendly_name: "Adjusted Average Electricity import Price"
unit_of_measurement: "€/kWh"
value_template: >
{{ ((1.02 * states('sensor.epex_spot_data_average_price') | float)
+ 0.004 + 0.011 + 0.00392 + 0.0433 + 0.0019 + 0.0475) * 1.06 | round(3) }}
unique_id: adjusted_average_electricity_import_price

adjusted_current_electricity_import_price:
friendly_name: "Adjusted Current Electricity Import Price"
unit_of_measurement: "€/kWh"
value_template: >
{{ ((1.02 * states('sensor.epex_spot_data_price') | float)
+ 0.004 + 0.011 + 0.00392 + 0.0433 + 0.0019 + 0.0475) * 1.06 | round(3) }}
unique_id: adjusted_current_electricity_import_price

adjusted_current_electricity_export_price:
friendly_name: "Adjusted Current Electricity Export Price"
unit_of_measurement: "€/kWh"
value_template: >
{{ ((0.98 * states('sensor.epex_spot_data_price') | float)
- 0.015) * 1.00 | round(3) }}
unique_id: adjusted_current_electricity_export_price

adjusted_highest_electricity_import_price:
friendly_name: "Adjusted Highest Electricity Import Price"
unit_of_measurement: "€/kWh"
value_template: >
{{ ((1.02 * states('sensor.epex_spot_data_highest_price') | float)
+ 0.004 + 0.011 + 0.00392 + 0.0433 + 0.0019 + 0.0475) * 1.06 | round(3) }}
unique_id: adjusted_highest_electricity_import_price

adjusted_lowest_electricity_import_price:
friendly_name: "Adjusted Lowest Electricity Import Price"
unit_of_measurement: "€/kWh"
value_template: >
{{ ((1.02 * states('sensor.epex_spot_data_lowest_price') | float)
+ 0.004 + 0.011 + 0.00392 + 0.0433 + 0.0019 + 0.0475) * 1.06 | round(3) }}
unique_id: adjusted_lowest_electricity_import_price

spread_electricity_import_price:
friendly_name: "Spread Electricity Import Price"
unit_of_measurement: "€/kWh"
value_template: >
{{ (states('sensor.adjusted_highest_electricity_import_price') | float)
- (states('sensor.adjusted_lowest_electricity_import_price') | float)
| round(3) }}
unique_id: spread_electricity_import_price

current_houseconsumption:
friendly_name: "Current House Consumption"
unique_id: current_houseconsumption
unit_of_measurement: "W"
value_template: >
{{ ((states('sensor.sn_pv_power') | float(0))
- (states('sensor.electricity_meter_grid_power_return') | float(0))
+ (states('sensor.electricity_meter_grid_power_usage') | float(0))
+ (states('sensor.sn_battery_power_discharge_total') | float(0))
- (states('sensor.sn_battery_power_charge_total') | float(0)))
| round(2) }}

houseconsumption_minus_pvgen:
friendly_name: "HouseConsumption - PVGen"
unique_id: "houseconsumption_minus_pvgen"
unit_of_measurement: "W"
value_template: >
{% set house_consumption = states('sensor.current_houseconsumption') | float(0) %}
{% set pv_power = states('sensor.sn_pv_power') | float(0) %}
{{ house_consumption - pv_power }}
availability_template: >
{{ states('sensor.current_houseconsumption') not in ['unknown', 'unavailable'] and
states('sensor.sn_pv_power') not in ['unknown', 'unavailable'] }}

minimum_import_price_minus_current_import_price:
friendly_name: "MinImportPrice - CurrentImportPrice"
unique_id: "minimum_import_price_minus_current_import_price"
unit_of_measurement: "€"
value_template: >
{% set minimum_import_price = states('input_number.minimum_import_price') | float(0) %}
{% set current_import_price = states('sensor.adjusted_current_electricity_import_price') | float(0) %}
{{ minimum_import_price - current_import_price }}
availability_template: >
{{ states('input_number.minimum_import_price') not in ['unknown', 'unavailable'] and
states('sensor.adjusted_current_electricity_import_price') not in ['unknown', 'unavailable'] }}


pvgen_minus_houseconsumption:
friendly_name: "PVGen - HouseConsumption"
unique_id: "pvgen_minus_houseconsumption"
unit_of_measurement: "W"
value_template: >
{% set house_consumption = states('sensor.current_houseconsumption') | float(0) %}
{% set pv_power = states('sensor.sn_pv_power') | float(0) %}
{{ pv_power - house_consumption }}
availability_template: >
{{ states('sensor.current_houseconsumption') not in ['unknown', 'unavailable'] and
states('sensor.sn_pv_power') not in ['unknown', 'unavailable'] }}
ppallen
Starter
Starter
Berichten: 4
Lid geworden op: 4 maanden geleden

@conda In home manager is er ingesteld dat de batterij 15 % houd om Peek shaving te doen. Dus batterij ontlaad slechts tot 15% en gebruikt de rest slechts als mijn netafname boven de 2.5 kw gaat. Het systeem eens de piekbelasting over is gaat de batterij terug laden tot 15%.

Je hebt het ook over een aantal functies die ik niet blijk te hebben op basis van de flow json die je gedeeld had. Kan het zijn dat die 2e en 3e flow niet gedeeld is?
Ook het laden van de batterij zat niet in de json

Voor de prijzen gebruik ik entso en krijg ik de prijs per uur voor de volgende dag binnen

Zou je de volledige flow nog eens willen delen?
Plaats reactie

Terug naar “Home automation en domotica”