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
Member
Member
Berichten: 59
Lid geworden op: 12 dec 2020, 13:56
Uitgedeelde bedankjes: 2 keer
Bedankt: 2 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.
Cloud service: Filen.io : referral link: https://filen.io/r/8cb06eb8c246ea3f902d3ec46473d4a3
liegebeestig
Elite Poster
Elite Poster
Berichten: 2389
Lid geworden op: 01 jun 2006, 15:16
Uitgedeelde bedankjes: 43 keer
Bedankt: 80 keer
Recent bedankt: 1 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: 16
Lid geworden op: 4 maanden geleden
Bedankt: 1 keer

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
Member
Member
Berichten: 59
Lid geworden op: 12 dec 2020, 13:56
Uitgedeelde bedankjes: 2 keer
Bedankt: 2 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.
Cloud service: Filen.io : referral link: https://filen.io/r/8cb06eb8c246ea3f902d3ec46473d4a3
ppallen
Starter
Starter
Berichten: 16
Lid geworden op: 4 maanden geleden
Bedankt: 1 keer

@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
Member
Member
Berichten: 59
Lid geworden op: 12 dec 2020, 13:56
Uitgedeelde bedankjes: 2 keer
Bedankt: 2 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?
Cloud service: Filen.io : referral link: https://filen.io/r/8cb06eb8c246ea3f902d3ec46473d4a3
ppallen
Starter
Starter
Berichten: 16
Lid geworden op: 4 maanden geleden
Bedankt: 1 keer

@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
Member
Member
Berichten: 59
Lid geworden op: 12 dec 2020, 13:56
Uitgedeelde bedankjes: 2 keer
Bedankt: 2 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'] }}
Cloud service: Filen.io : referral link: https://filen.io/r/8cb06eb8c246ea3f902d3ec46473d4a3
ppallen
Starter
Starter
Berichten: 16
Lid geworden op: 4 maanden geleden
Bedankt: 1 keer

@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?
Gebruikersavatar
conda
Member
Member
Berichten: 59
Lid geworden op: 12 dec 2020, 13:56
Uitgedeelde bedankjes: 2 keer
Bedankt: 2 keer

@ppallen Ik ga binnenkort de volledige code posten, maar ben nog een feat erin aan het steken, maar deze is nog niet getest.

Ik ben nog bezig met de feature als de de import prijzennegatief worden, om dan de batterij aan het net te laden.
Gezien alle stukken met elkaar moeten samenwerken, is het belangrijk om het te testen.
Probleem is natuurlijk dat eerst de omstandigheden moeten voorvallen. Dat is dus weer even wachten op mooi weer in een weekend. :-D

Ik zal de code trachten al dit weekend volledig te posten, zo kan je al een stuk verder, maar weet dat er nog getest moet worden met 1 feature.
Cloud service: Filen.io : referral link: https://filen.io/r/8cb06eb8c246ea3f902d3ec46473d4a3
ppallen
Starter
Starter
Berichten: 16
Lid geworden op: 4 maanden geleden
Bedankt: 1 keer

@conda bedankt voor de info. Kijk ernaar uit om dit om te zetten naar mijn installatie en mijn ervaringen te delen.
Gebruikersavatar
conda
Member
Member
Berichten: 59
Lid geworden op: 12 dec 2020, 13:56
Uitgedeelde bedankjes: 2 keer
Bedankt: 2 keer

@ppallen Super! Het is vooral de bedoeling om kennis te delen met anderen die het oppikken en misschien nog wat beter maken. De feature waar ik nog mee bezig ben is in eerste versie klaar, dus die zit er in, maar is nog dus nog niet getest. Vandaag heb ik jammer genoeg niet zoveel tijd. Ik heb gemerkt dat ik de code hier niet in zijn geheel kan delen in wegens meer dan 13000 karakters. :lol: Ik bots dus op een limiet, maar ik was al eerder van plan om de code in zijn geheel te delen via github. Ik ben begonnen met een pagina aan te maken en de omschrijving is klaar. Morgen tracht ik de code erop te zetten en zal de link hier posten.
In zijn geheel zal het wat handiger en duidelijker zijn via die weg, gezien ik er nog wat screenshots kan aan toevoegen etc... Wordt dus zeker vervolgd.

De volgende features zitten er momenteel in:

1. Zero export when export price is negative → Only generate energy used in the house.

2. Negative import prices → Charge the battery during the 3 most negative price hours (still in test phase).

3. Smart selling → Sell excess energy at peak prices in the morning/evening, if solar forecast is strong (March–September).

4. Delayed battery charging → Wait until export prices are lowest.

5. Winterflow → Charge battery during the 4 cheapest hours at night if solar forecast <15 kWh and price spread is significant.

6. Dunkelflaute mode → Use battery during hours when import prices are above a defined threshold.
Cloud service: Filen.io : referral link: https://filen.io/r/8cb06eb8c246ea3f902d3ec46473d4a3
ppallen
Starter
Starter
Berichten: 16
Lid geworden op: 4 maanden geleden
Bedankt: 1 keer

Top, dank U voor de opsomming van de features. via GitHub kunnen dan eventueel ook pull requests gemaakt worden voor fixes of features en is er version tracking.

Ik heb de setup met 2 omvormers en heb daar reeds een splitting voor gemaakt zodat beide array’s op basis van hun verdeling naar beneden geregeld worden op basis van de vermogens verdeling tussen beide omvormers.
guido4096
Pro Member
Pro Member
Berichten: 228
Lid geworden op: 03 sep 2017, 11:13
Uitgedeelde bedankjes: 24 keer
Bedankt: 32 keer

Volgens mij kan alles wat je wil al via https://evcc.io ?
ppallen
Starter
Starter
Berichten: 16
Lid geworden op: 4 maanden geleden
Bedankt: 1 keer

@guido4096 ik heb EVCC draaien voor mijn laadpaal sturing maar batterij sturing werkt niet heb reeds alle verschillende opties geprobeerd maar kan de batterij niet sturen. EVCC geeft aan dat dit gaat maar werkt bij mij niet. Heb ook op GitHub de issues hierover gelezen en de verschillende oplossingen die naar voor gebracht zijn geprobeerd maar zonder positief resultaat.Tevens ook zero export is geen functionaliteit die EVCC heeft of ik heb ergens overheen gekeken.
Gebruikersavatar
conda
Member
Member
Berichten: 59
Lid geworden op: 12 dec 2020, 13:56
Uitgedeelde bedankjes: 2 keer
Bedankt: 2 keer

ppallen schreef: 1 maand geleden
Ik heb de setup met 2 omvormers en heb daar reeds een splitting voor gemaakt zodat beide array’s op basis van hun verdeling naar beneden geregeld worden op basis van de vermogens verdeling tussen beide omvormers.
Nice! :beerchug: Dat is uiteindelijk de bedoeling, dat je je eigen ding ermee kan doen. Ik heb zelf ook inspiratie gehaald van anderen om dan vervolgens mijn eigen ding te doen.
Het is vooral de bedoeling dat je het kan gebruiken om naar je eigen hand te zetten.

Zo moet je geen EMS systemen aanschaffen om daarna abonnementskosten aan je been gesmeerd te krijgen. (been there)

Toegevoegd na 4 minuten 4 seconden:
https://github.com/condacum/SMA-Modbus- ... ent-system

Zo! Hier is de link zoals beloofd. :angel:

Maar zoals eerder gezegd. De feature van het opladen als de importprijzen negatief gaan is nog niet getest, dus daar kan nog een foutje in zitten. Ook moet dat samenwerken met de andere features. Tot hiertoe nog geen foutjes ontdekt, maar de omstandigheden moeten zich eerst terug voordoen. :P
Cloud service: Filen.io : referral link: https://filen.io/r/8cb06eb8c246ea3f902d3ec46473d4a3
ppallen
Starter
Starter
Berichten: 16
Lid geworden op: 4 maanden geleden
Bedankt: 1 keer

@conda bedankt voor het delen van de flow ga daar eens induiken.
Op GitHub zag ik ook U dashboard en de grafiek met de forecast. Ik ben al een tijdje aan het proberen om deze te maken maar het lukte niet. Dank U dat je ook deze info gedeeld hebt.
Gebruikersavatar
conda
Member
Member
Berichten: 59
Lid geworden op: 12 dec 2020, 13:56
Uitgedeelde bedankjes: 2 keer
Bedankt: 2 keer

@ppallen Heb ondertussen nog een aantal wijzigingen aangebracht. Enkele flows zijn makkelijker gemaakt en hier en daar nog wat onzuiverheden uitgehaald.
Deze versie 1.2 draait nu enkele weken en tot hiertoe geen foutjes meer opgemerkt.
Cloud service: Filen.io : referral link: https://filen.io/r/8cb06eb8c246ea3f902d3ec46473d4a3
ppallen
Starter
Starter
Berichten: 16
Lid geworden op: 4 maanden geleden
Bedankt: 1 keer

@conda heb ondertussen de sensors aangemaakt en de flows ingelezen maar heb nog niet alle ding en kunnen aanpassen. Staat op de planning voor dit weekend. Zal de nieuwe flows downloaden en deze importeren.
Gebruikersavatar
conda
Member
Member
Berichten: 59
Lid geworden op: 12 dec 2020, 13:56
Uitgedeelde bedankjes: 2 keer
Bedankt: 2 keer

Zal de nieuwe flows downloaden en deze importeren.
@ppallen Goed idee. Heb getracht om, naast de foutjes eruit te halen, ook het geheel leesbaarder te maken door tekst toe te voegen. Ook heb ik nog een knop (boolean) toegevoegd, zodat je naast de automatisering van het verkopen, ook gewoon handmatig kan triggeren indien gewenst.

Geef gerust wat feedback als je wat verder staat.
Cloud service: Filen.io : referral link: https://filen.io/r/8cb06eb8c246ea3f902d3ec46473d4a3
ppallen
Starter
Starter
Berichten: 16
Lid geworden op: 4 maanden geleden
Bedankt: 1 keer

@conda Hoe heb je volgende sensor opgezet?

highest_peak_of_the_day:
friendly_name: "Highest Peak of the Day"
unique_id: highest_peak_of_the_day_sensor
unit_of_measurement: "kW"
value_template: >
{% set current_value = states('sensor.dsmr_consumption_quarter_hour_peak_electricity_average_delivered') | float(0) %}
{% set highest_value = states('sensor.highest_peak_of_the_day') | float(0) %}
{% set current_time = states('sensor.time') %}

{% if current_time == '00:00' or highest_value > 100000 %}
0
{% else %}
{{ [current_value, highest_value] | max }}
{% endif %}
Waar haal je de quarter en highest piek waardes?

Ik heb een homewizard P1 meter maar daar zit geen kwartier waardes

Toegevoegd na 11 minuten 18 seconden:
@conda Welke node red plugins gebruik je voor de flows?

Bij het importeren heb ik een aantal elementen die niet herkend worden. Krijg daar unkown: gate, unknown: within-time-switch, unknown: traffic, unknown: controletimer
thomasdb
Plus Member
Plus Member
Berichten: 174
Lid geworden op: 05 sep 2024, 22:11
Uitgedeelde bedankjes: 44 keer
Bedankt: 21 keer
Recent bedankt: 2 keer
Provider
Te Koop forum

@ppallen
ik heb wel kwartierwaardes op de homewizard , dit zijn mijn sensoren

Energie export

Energie export tarief 1

Energie export tarief 2

hoofdteller net - dagtarief

hoofdteller net - nachttarief

hoofdteller net - totaal

kwartierwaarde hoofdteller net

kwh vandaag

Piekverbruik huidige maand

Spanning fase 1

Stroom fase 1

Tarief

Vermogen

Vermogen fase 1

en dan nog deze opgezet in homeassistant zodat ik de hoogste kwartierwaarde van de dag kan zien ook

template:
- sensor:
- name: "electricity_delivery_power_daily_15m_max"
state: >
{% if is_number(states('sensor.electricity_delivery_power_daily_15m_max')) %}
{% if ((now().hour == 0) and (now().minute < 15)) %}
{{ states('sensor.p1_meter_xxxxxxxxxxx_active_average_demand') | float }}
{% else %}
{% if ((states('sensor.electricity_delivery_power_daily_15m_max') | float) < (states('sensor.p1_meter_xxxxxxxxxxx_active_average_demand')) | float) %}
{{ states('sensor.p1_meter_xxxxxxxxxxxxx_active_average_demand') or 0 | float }}
{% else %}
{{ states('sensor.electricity_delivery_power_daily_15m_max') | float }}
{% endif %}
{% endif %}
{% else %}
0
{% endif %}
unit_of_measurement: "watt"
ppallen
Starter
Starter
Berichten: 16
Lid geworden op: 4 maanden geleden
Bedankt: 1 keer

@thomasdb ik heb volgende waarden maar geen kwartier:

Energie export
29.175,96 kWh

Energie export tarief 1
21.121,47 kWh

Energie export tarief 2
8.054,50 kWh

Energie import tarief 1
2.214,37 kWh

Energie import tarief 2
3.501,87 kWh

Energy import
5.716,24 kWh

Gemiddeld verbruik
2 W

Net afname kWh
0,21 kWh

Piekverbruik huidige maand
5.911 W

Spanning fase 1
229 V

Spanning fase 2
232 V

Spanning fase 3
225 V

Stroom
9,63 A

Stroom fase 1
4,60 A

Stroom fase 2
1,96 A

Stroom fase 3
3,07 A

Tarief
2

Vermogen
1 W

Vermogen fase 1
-1.033 W

Vermogen fase 2
402 W

Vermogen fase 3
633 W

Welke versie van firmware toont homewizard? bij mij is dit:
Wi-Fi P1 Meter (HWE-P1)
door HomeWizard
Firmware: 5.1903
thomasdb
Plus Member
Plus Member
Berichten: 174
Lid geworden op: 05 sep 2024, 22:11
Uitgedeelde bedankjes: 44 keer
Bedankt: 21 keer
Recent bedankt: 2 keer
Provider
Te Koop forum

hoe vind ik deze firmwareversie
sinds ik hem een goede 2 jaar terug gekocht heb staan zijn cloud en internet access uit

edit, gevonden

Firmware: 4.14

DSMR versie
50

ik zie wel dat u 3 fase heeft, hier is het mono, misschien ligt het daaraan?
of staat de sensor disabled
sensor.p1_meter_xxxxxxxxxxx_active_average_demand
deze enablen dan
ppallen
Starter
Starter
Berichten: 16
Lid geworden op: 4 maanden geleden
Bedankt: 1 keer

@thomasdb Ik zie dat je de active average demand daar als sensor hebt.

Deze is in nu de gemiddeld verbruik sensor in homewizard. Bij mij is dit sensor.p1_meter_active_average_demand
thomasdb
Plus Member
Plus Member
Berichten: 174
Lid geworden op: 05 sep 2024, 22:11
Uitgedeelde bedankjes: 44 keer
Bedankt: 21 keer
Recent bedankt: 2 keer
Provider
Te Koop forum

Afbeelding https://thomasdb.eu/img/kwartier.jpg
hier geeft die de kwartierwaarden
ziet het er bij jou zo niet uit?

edit link aangepast webserver liet maar 10 connecties toe

als het nog niet werkt stuur me je email dan email ik eventueel de picture. het toont dat de grafiek van die sensor een zaagtand is die optelt en en na elk kwartier weer naar 0 terugvalt
Laatst gewijzigd door thomasdb 3 weken geleden, in totaal 4 gewijzigd.
ppallen
Starter
Starter
Berichten: 16
Lid geworden op: 4 maanden geleden
Bedankt: 1 keer

Hallo @thomasdb
De link werkt niet voor mij. Krijg cloudflare fout
Gebruikersavatar
conda
Member
Member
Berichten: 59
Lid geworden op: 12 dec 2020, 13:56
Uitgedeelde bedankjes: 2 keer
Bedankt: 2 keer

ppallen schreef: 3 weken geleden @conda Hoe heb je volgende sensor opgezet?

highest_peak_of_the_day:
friendly_name: "Highest Peak of the Day"
unique_id: highest_peak_of_the_day_sensor
unit_of_measurement: "kW"
value_template: >
{% set current_value = states('sensor.dsmr_consumption_quarter_hour_peak_electricity_average_delivered') | float(0) %}
{% set highest_value = states('sensor.highest_peak_of_the_day') | float(0) %}
{% set current_time = states('sensor.time') %}

{% if current_time == '00:00' or highest_value > 100000 %}
0
{% else %}
{{ [current_value, highest_value] | max }}
{% endif %}
Waar haal je de quarter en highest piek waardes?

Ik heb een homewizard P1 meter maar daar zit geen kwartier waardes

Toegevoegd na 11 minuten 18 seconden:
@conda Welke node red plugins gebruik je voor de flows?

Bij het importeren heb ik een aantal elementen die niet herkend worden. Krijg daar unkown: gate, unknown: within-time-switch, unknown: traffic, unknown: controletimer
Deze sensor sensor.dsmr_consumption_quarter_hour_peak_electricity_average_delivered is een sensor die ik via de dsmr integratie uitlees. Het zou kunnen dat de homewizard deze data niet uit je meter haalt. Ik heb een p1 lezer van https://smartgateways.nl/en/read-out-sm ... r-p1-dsmr/, waar ik kon kiezen voor de Belgische meter. Deze stuurt de data uit de meter door naar Home assistant.

De template van de sensor hierboven zet je in je configuratie.yaml en deze maakt dan de sensor aan, die je man uitlezel op je dashboard.
Het enige wat deze template doet is de hoogste waarde van de dag onthouden en morgen begint die opnieuw.

Op zich heb je deze sensor niet per se nodig. die komt niet voor in de automatiseringen zelf, maar is meer ter info voor op je dashboard en om de hoogste piek van de maand visueel te maken in een apexchart. Dat is die met die rode balkjes op mijn dashboard.



Goed dat je even aanhaalt van de elementen die niet herkend worden. Nu je het aanhaalt bedenk ik mij dat dit extra nodes in node red zijn die je moet installeren via
Node red --> menu rechts boven (hamburgermenu) --> manage palette --> klik install --> search modules : gate, within-time-switch, traffic, controletimer

Dit zijn enkele ontbrekende nodes, die niet standaard in node red zitten. My bad :| . Dat zal ik nog moeten toevoegen aan mijn github, want dat was uit mijn gedachten gegaan. Sorry daarvoor.
Laatst gewijzigd door conda 3 weken geleden, in totaal 1 gewijzigd.
Cloud service: Filen.io : referral link: https://filen.io/r/8cb06eb8c246ea3f902d3ec46473d4a3
thomasdb
Plus Member
Plus Member
Berichten: 174
Lid geworden op: 05 sep 2024, 22:11
Uitgedeelde bedankjes: 44 keer
Bedankt: 21 keer
Recent bedankt: 2 keer
Provider
Te Koop forum

@conda mijn sensor doet hetzelfde met andere code :D
Gebruikersavatar
conda
Member
Member
Berichten: 59
Lid geworden op: 12 dec 2020, 13:56
Uitgedeelde bedankjes: 2 keer
Bedankt: 2 keer

@thomasdb Meerdere manieren om hetzelfde te bereiken. :beerchug:
conda schreef: 3 weken geleden extra nodes in node red zijn die je moet installeren via
Node red --> menu rechts boven (hamburgermenu) --> manage palette --> klik install --> search modules : gate, within-time-switch, traffic, controletimer
Zo ineens toegevoegd op github. :-D
Cloud service: Filen.io : referral link: https://filen.io/r/8cb06eb8c246ea3f902d3ec46473d4a3
ppallen
Starter
Starter
Berichten: 16
Lid geworden op: 4 maanden geleden
Bedankt: 1 keer

@conda heb je misschien de juiste add-on namen? voor within-time-switch ook geeft hij nog fouten voor time-inject. Heb de library afgezocht maar vind deze niet en ook niet direct via google

Never mind,chatGPT to the rescue!
Module is: node-red-contrib-sun-position
Voor de gate is het: node-red-contrib-simple-gate
Gebruikersavatar
conda
Member
Member
Berichten: 59
Lid geworden op: 12 dec 2020, 13:56
Uitgedeelde bedankjes: 2 keer
Bedankt: 2 keer

@ppallen Ik zie dat ik te laat ben :P , maar zal ze toevoegen voor anderen. Dit zijn de nodes die je nog moet toevoegen dus:
- node-red-contrib-simple-gate
- node-red-contrib-time-range-switch
- node-red-contrib-traffic
- node-red-contrib-controltimer
Ik denk dat dit het volledige lijstje is.

Heb het ineens aan de github toegevoegd.
Vandaar is feedback belangrijk. :wink: Die nodes gebruik al een paar jaar en dan vergeet je dat die er niet standaard inzaten. :lol:

Tussen de lijnen door heb ik de indruk dat je wel goed aan de slag bent. Van zodra je alle nodes hebt is het "Off to the races!". :banana:

Heb je alle registers al kunnen testen of ze allemaal reageren?

Laat gerust weten hoe het loopt. Ben benieuwd.
Misschien goed om flow per flow op te starten om te zien hoe alles zich gedraagt.
Wat zeker belangrijk is, is dat je tijd hebt om in te grijpen als je iets opmerkt dat hij anders reageert dan je verwacht had, zodat je direct kan gaan kijken waar het zit.
Je kan hiervoor disable selected nodes gebruiken en flow per flow testen.
Het klinkt misschien pretentieus, maar hier werkt het momenteel als een tierelier. Gezien ik niet weet of je systeem exact hetzelfde is, is het raadzaam om stap per stap (lees flow per flow) te gaan.

Had jij een gewone energiemeter of ook die Home Manager 2?

Waar ik bijvoorbeeld nog aan denkt is dat je in de functienode van de active power slider waar *80 staat, die waarde moet aanpassen aan je eigen omvormer.
Anders gaat hij bij het beperkten van de opwek dit niet in dezelfde verhouding weergeven. Die *80 verwijst naar mijn omvormer 8 kw piek. Heb jij een 5 Kw piek, dan moet je hier *50 van maken of heb je een 10 Kw piek omvormer, dan maak je hier *100 van. Je systeem gaat wel correct werken, want ik heb de indruk dat dat voor alle omvormers gelijk is en dat elke omvormer dit zelf in verhouding aanpast aan de capaciteit van de omvormer zelf, maar de waarde zal anders fout weergegeven worden op je dashboard. Dat schept verwarring natuurlijk.

Ik zal mogelijks vandaag niet meer kunnen reageren wegens werkverplichtingen, maar ben vanavond laat of morgen terug present voor het vervolg. :angel:
Cloud service: Filen.io : referral link: https://filen.io/r/8cb06eb8c246ea3f902d3ec46473d4a3
ppallen
Starter
Starter
Berichten: 16
Lid geworden op: 4 maanden geleden
Bedankt: 1 keer

Hallo @conda

Allereerst hartelijk bedankt voor het delen van de flows en de snelle reacties op vragen.

Heb de flows geladen en ben nu aan het nagaan welke items ik moet aanpassen vanwege andere namen van sensors of de flows moet aanpassen aan mijn setup.
Jij hebt één omvormer die zowel de batterij als de panelen stuurt, ik heb 3 omvormers, 2 voor de panelen en 1 voor de batterij. Vandaag dat ik wat zaken moet twerken en aanpassen.

De register van de batterij heb ik reeds getest en die werkt, die voor de panelen moet ik nog testen gezien ik momenteel een home manager 2.0 heb moet ik deze dus eerst uit sunny portal gaan verwijderen zoals je al eerder aangaf maar wil eerst alles nakijken alvorens die stap te zetten zodat de dingen kunnen werken.

Zit nu een aantal debug nodes toe te voegen om te kijken hoe alles zich gedraagt en dan is de volgende stap om de home manager los te koppelen van de home manager.

Maar nogmaals bedankt voor alle hulp

Toegevoegd na 37 minuten 49 seconden:
@conda

In de summer flow heb je de conditions to export in the morning en evening, daar wordt de battery SOC, de Solcast forecast rechecked, dan de derde stap heeft geen entiteit, is dit correct? Als laatste wordt de sensor.adjusted_current_electricity_export_price gecheckt. controleer je hier tegen de actuele export prijs aangepast volgens de electriciteits formule van U energie leverancier?

Wat zijn de volgende volgende binary sensors?
- binary_sensor.cheapest_4_hours_of_the_day
- binary_sensor.most_expensive_hour_in_the_evening
- binary_sensor.most_expensive_hour_in_the_morning

Heb je hier meer info over hoe je deze hebt aangelegd?

Toegevoegd na 7 uren 40 minuten 40 seconden:
@conda

Vraagje over de flow elementen in aangehechte screenshot.
Afbeelding

Link naar foto: https://1drv.ms/i/c/28b95636b44a5f37/EU ... A?e=msudbV

Hoe werkt dit?
Onder export price pos, de sensor voor de injectie prijs wordt gecheckt en als de prijs positief is dan belanden we in de switch.
Maar tegen wat checked die switch juist?

Afbeelding

Link naar foto: https://1drv.ms/i/c/28b95636b44a5f37/Eb ... w?e=QuAxlk
De waarden die hier vermeld zijn komen deze van de geplande forecast sensor?
Gebruikersavatar
conda
Member
Member
Berichten: 59
Lid geworden op: 12 dec 2020, 13:56
Uitgedeelde bedankjes: 2 keer
Bedankt: 2 keer

@ppallen
Allereerst hartelijk bedankt voor het delen van de flows en de snelle reacties op vragen.
Graag gedaan. Het is bij mij allemaal ook begonnen vanuit een zekere ergernis (zie begin thread), waardoor mijn doel is dat anderen het mogen gebruiken en tweaken naar eigen goeddunken. Ik gebruik zelf graag open source software, omdat ik de openheid en de energie die iemand erin heeft gestoken zelf ook kan waarderen. Vandaar probeer ik, naar eigen vermogen, ook iets te delen waar anderen hopelijk iets aan hebben. Misschien helpt het ook natuurlijk dat dit eerder een hobby is en dat ik niet mijn boterham hiermee verdien. :angel:
In de summer flow heb je de conditions to export in the morning en evening, daar wordt de battery SOC, de Solcast forecast rechecked, dan de derde stap heeft geen entiteit, is dit correct?
De derde node time within heeft inderdaad geen entiteit. Deze node zorgt er enkel voor dat er tijdens de flow tijdens deze twee vooropgestelde uren data kan doorlaten. Buiten de vooropgestelde uren gaat de data langs de tweede (onderste) poort en onderbreekt de flow. Technisch gezien hoeven stap 2 en stap 3 er niet tussen te zitten, maar deze zitten er tussen voor meer zekerheid.

Stap 2 de recheck heb ik erin gestoken omdat 1 keer hij toch om 0:00 had verkocht terwijl dit niet het goedkoopste uur was. Ik heb een vermoeden dat dit omwille van latency van data of syncronisatie van tijd of iets dergelijk moet zijn geweest, omdat de dag ervoor 0:00 wel het duurste uur was. Vandaar de delay van 5 seconden en de recheck. Ik heb het niet meer voorgehad.

De stap erna is de "Selling mode on" input boolean dat de automatisering van de flow kan onderbreken. Jij kan dan beslissen om bijvoorbeeld het verkopen niet plaats kan vinden omdat je een feestje hebt en je energie liever volledig zelf gebruikt bijvoorbeeld. De laatste stap selling on (boolean) switcht de "actual selling" flow aan of uit. Met deze boolean kan je handmatig verkopen triggeren als je deze op je dashboard zet.

Als laatste wordt de sensor.adjusted_current_electricity_export_price gecheckt. controleer je hier tegen de actuele export prijs aangepast volgens de electriciteits formule van U energie leverancier?
Klopt inderdaad. Elke sensor die je op mijn dashboard ziet, betreft de prijs, is de adjusted versie waar de prijsformule van mijn leverancier in zit. Ik ben zelf klant bij Ecopower.

Deze specifieke sensor is dus:

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


De adjusted import ziet er in mijn geval zo uit:

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

Ik heb voor alle sensoren op mijn dashboard een aangepaste sensor gecreëerd via de configuration.yaml. Hierdoor heb je de prijs die jij betaalt op je factuur in real time en niet de groothandelsprijs.
Wat zijn de volgende volgende binary sensors?
- binary_sensor.cheapest_4_hours_of_the_day
- binary_sensor.most_expensive_hour_in_the_evening
- binary_sensor.most_expensive_hour_in_the_morning
Dit zijn binary sensoren die enkel on en off weergeven tijdens de uren die in de naam van de sensor staat.
"Most expensive hour in the evening" is bijvoorbeeld het duurste uur tussen 12 's middags en 0 uur 's nachts.
Enkel dat uur zal de sensor op on staan en verkoop triggeren.
De "cheapest 4 hours of the day" zal de sensor enkel op on staan tijdens deze uren. Dit omdat de batterij in de winter indien te weinig opwek verwacht wordt zal laden tijdens de vier goedkoopste uren van de dag. Deze zijn niet noodzakelijk de aaneensluitende 4 goedkoopste uren, al kan je dat wel kiezen bij de aanmaak van de sensor.

Ik heb ook een sensor met enkel het goedkoopste uur dat ik dan weer gebruik om mijn vaatwasser en wasmachine te starten in de zomer en winter.
Dat is niet altijd op hetzelfde uur dus. In de zomer is dit overdag en in de winter is dit eerder 's nachts.

Om de algemene prijsdata binnen te halen maak ik gebruik van de Epex spot integratie. Ik heb andere integraties ook gebruikt, maar deze werkt naar mijn gevoel het meest betrouwbaar. Deze integratie heeft via HACS een extra integratie dat "Epex Spot sensor" heet.
Via deze integratie, dat je via HACS moet downloaden, kan je dit soort binaire sensoren aanmaken.
Deze zijn dus handig om te gebruiken in allerhande automatiseringen.

De algemene Epex spot integratie heeft ook een de sensor.epex_spot_data_rank. Deze wordt ook gebruikt in een van de flows. Deze ordent alle uren van goedkoop naar duur, waarbij goedkoop 0 is en het duurste uur het getal 23 krijgt. Je zou deze sensor ook kunnen vervangen door een gecreëerde sensor die op de 2 goedkoopste uren aan gaat, maar gezien ik deze sensor ter beschikking heb, heb ik deze gebruikt in de flow.
Vraagje over de flow elementen in aangehechte screenshot.
Afbeelding

Link naar foto: https://1drv.ms/i/c/28b95636b44a5f37/EU ... A?e=msudbV

Hoe werkt dit?
Onder export price pos, de sensor voor de injectie prijs wordt gecheckt en als de prijs positief is dan belanden we in de switch.
Maar tegen wat checked die switch juist?
Ik zal kort trachten te omschrijven hoe de flow in het algemeen werkt. Dit is het meest ingewikkelde stuk, waar ik verschillende pogingen in heb moeten ondernemen en letterlijk uren mee ben bezig geweest om goed te krijgen, omdat er veel factoren zijn waarmee rekening moet gehouden worden en de ene factor impact heeft op de andere.
Bovendien mag de ene flow, de andere niet in de weg zitten. Je kan niet uitgesteld laden en verkopen tegelijk bijvoorbeeld. Hier moet je rekening mee houden. Elke flow die erbij gecreërd wordt, maakt het hele geheel ingewikkelder. :twisted:

Ik denk dat het op zich wel helder is dat deze flow charging mode aanzet of uit zet in zijn geheel. Charging mode aan= omvormer regelt alles en charging mode uit = overschot exporteren naar het net, zodat de batterij niet op zal laden, maa rop een later moment.
De flow begint met het checken van de overschot van de zon en triggert de flow van zodra er meer opwek is, dan verbruik in huis.
Vervolgens checkt hij de voorspelling (forecast today). Is deze lager dan 25, dan gaat charging mode aan en is deze hoger, dan begint de fun en moet hij uitstellen met opladen. :-D
Hij check dan eerst de batterij: is deze lager dan 20%, --> charging mode af en gaat hij eerst laden met de opwek tot 20% en dan pas werkt de flow verder.
Vervolgens checkt hij of de exportprijs wel positief is --> indien niet moet hij beginnen opladen, want de stroom is niets waard en je gaat anders betalen voor de export.
Laten we ervan uitgaan dat alles positief is. Hij begon te checken of er genoeg opwek is --> dan is de batterij minimum 20% --> is de prijs positief, dan gaat hij zowel de switch node in als daarboven door die twee gates richting charging mode off.

Ik begin met het bovenste stuk met de twee gates.
Als alle voorwaarden zijn voldaan, gaat hij charging mode uit zetten. Op dat moment gaat je batterij niet laden, wat de bedoeling is.
Hij checkt eerst of je op dat moment toevallig aan het verkopen bent en sluit indien nodig de weg richting chargin modeoff af. Dit is om te voorkomen dat het moment je aan het verkopen bent, dit door deze flow gestopt wordt. Alle vier grote flows (alle flows te samen) mogen elkaar geen stokken in de wielen steken.
Ben je niet aan het verkopen op dat moment dan wordt dit stuk niet onderbroken.

Ik spring naar de switch node:

Om even te herhalen: Hij checkt bij begin van de hele flow of er meer opwek ik dan verbruik --> dan checkt hij of er voldoende opwek is vandaag --> hij checkt of de batterij 20% is en of de exportprijs wel positief is. Als deze voorwaarden voldaan zijn ging hij inhet bovenste stuk charging mode uitzetten.
Die switch node zorgt ervoor dat hij op het goede moment charging mode terug aan zet en je batterij gaat laden op een uitgesteld moment.
Zoals je correct aan hebt gegeven gaat de waarde van today forecast in deze node en verlaat die via het juiste kanaal <25, tussen 25 en 30, tussen 30 en 35 en >35 de switch node.

Is de waarde kleiner dan 25, dus de forecast today is minder dan 25 Kwh, dan sluit hij de bovenste gate af. Zo stopt hij dat hij die dag de batterij uitgesteld kan laden van zodra er meer opwek is dan huisverbruik. In het begin checkte hij al wat te opwek is en zie je dat die naar charging mode on gaat als de waarde kleiner is dan 25. Je batterij wordt niet uitgesteld geladen.

Is de waarde van today forecast tussen 20 en 25, dan verlaat die de switch node 1 trapje hoger en belandt in de time within node, die ervoor zorgt dat om 11:00 charging mode wordt aangezet.

Is de waarde today forecast tussen 30 en 35, dan gaat die om 12 uur je batterij beginnen laden.

Tot slot als de waarde today forecast groter is dan 35, gaat hij pas om 1 uur beginnen laden.

Het moment van opladen wordt op die manier uitgesteld aan de hand van de hoeveelheid dat er verwacht wordt dat er vandaag geproduceerd zal worden.

Kort samengevat: Alle nodes in de flow die eronder staan (13:01 turn on charging mode) en verder eronder, zijn erop gericht om te intervenieren als plots er toch minder opwek is wegens een wolk. Je huisverbruik schiet de lucht in wegens je koffietoestel of iets anders.
Als toch plots je huisverbruik terug de opwek overschrijdt, dan wil je uiteraard dat hij terug stroom uit je batterij gebruik en niet van het net.
Alles daaronder is daarop gericht. Je wil ook niet dat de andere van de grote flows elkaar tegenwerken, dus zijn eronder allerlei voorwaarden om te reageren op plotse veranderingen of andere flows die actief zijn. Dat is heel kort door de bocht, maar alles moet met elkaar samenwerken.
Link naar foto: https://1drv.ms/i/c/28b95636b44a5f37/Eb ... w?e=QuAxlk
De waarden die hier vermeld zijn komen deze van de geplande forecast sensor?
Kort samengevat: inderdaad. Dat is correct. :-D



Ik hoop dat mijn uitleg hierboven vooral wat leesbaar en begrijpbaar is. :lol:


Het is natuurlijk aan te raden om de waarde in de switch node aan te passen aan de grote van je eigen systeem, gewoonten en verbruikers. Is je opwek groter, kan je de waarden gerust groter maken.
Dat moet je gaandeweg ondervinden. Deze waarden zijn een goede balans voor mijn systeem, maar daarom niet voor elk systeem. Ik heb er een ruime marge in gestoken, zodat mijn batterij ook vol geraakt bij een afwijkende voorspelling van de today forecast.
Het uiteindelijke doel is om je batterij op te laden met de goedkoopste stroom, maar dat de batterij op het einde van de dag wel vol geraakt. Hangt dus samen met de grote van je systeem en eventueel oriëntatie, grote van je batterij, etc...
Cloud service: Filen.io : referral link: https://filen.io/r/8cb06eb8c246ea3f902d3ec46473d4a3
ppallen
Starter
Starter
Berichten: 16
Lid geworden op: 4 maanden geleden
Bedankt: 1 keer

@conda Wou U even een update geven, heb de flows aangepast naar mijn entiteiten en deze week via debug de flows gevolgd. Tot nu toe verloopt alles zoals verwacht. Morgen ga ik nu mijn installatie in Sunny Portal verwijderen en dan het beheer volledig door de flows laten beheren.
Plaats reactie

Terug naar “Home automation en domotica”