DOIF erst schalten nach Zeit und Schwellwert überschreitung

Begonnen von ChrisA4, 15 September 2022, 14:15:35

Vorheriges Thema - Nächstes Thema

TomLee

Es verlinken die letzten zwei Beiträge zur Antwort, bei meinem Link scrollt man etwas runter liest keine Minute und hat verstanden.

ChrisA4

jetzt steh ich auf den nächsten fehler und komm nicht weiter

2022.09.19 18:01:13 3: Heizpatrone return value: Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
IF: no left bracket: { fhem("set $relais[$rotation] on-for-timer 10")
Unknown command $rotation-=1, try help.
Unknown command }
if, try help.
Unknown command $rotation-=1, try help.
Unknown command }
if, try help.
Unknown command }
}, try help.

DetlefR

Zitatstatt $relais doch @relais stehen
oder verstehe ich da was falsch

Noch ein Fehler von mir :(.
my @relais=('Heizstab_Relais_1','Heizstab_Relais_2','Heizstab_Relais_3');
Sollte es heissen.
Einfach erklärt. Mit @ bezieht es sich auf das ganze Array. Ein einzelnes Element wird mit $relais[0] angesprochen.

DetlefR

Zitatjetzt steh ich auf den nächsten fehler und komm nicht weiter
Da ist irgendetwas ganz durcheinander gekommen.
Geh im Notify auf "DEF" und ersetze alles was im Editorfenster steht damit.
Wechselrichter:PowerFlow_Site_P_PV:.* {
my $Einspeisung=ReadingsVal('Wechselrichter','Einspeisung',3000);
my $rotation=floor(time()/84600)%3;
my @relais=('Heizstab_Relais_1','Heizstab_Relais_3','Heizstab_Relais_3');
if (($EVTPART1>2500) && ($Einspeisung>(ReadingsVal($relais[$rotation],'state','on')=~ /on/i ? 100:2700))){
fhem("set $relais[$rotation] on-for-timer 10");
$rotation-=1;
}
if (($EVTPART1>5000) && ($Einspeisung>(ReadingsVal($relais[$rotation],'state','on')=~ /on/i ? 100:2700))){
fhem("set $relais[$rotation] on-for-timer 10");
$rotation-=1;
}
if (($EVTPART1>7500) && ($Einspeisung>(ReadingsVal($relais[$rotation],'state','on')=~ /on/i ? 100:2700))){
fhem("set $relais[$rotation] on-for-timer 10");
}
}

TomLee

Habs nicht ausprobiert, ich meine man kann sich in den if mindestens zweimal die öffnenden und schliessenden Klammern sparen.

ChrisA4

@DetlefR

Hab noch einen kleinen fehler gefunden
my @relais=('Heizstab_Relais_1','Heizstab_Relais_3','Heizstab_Relais_3');
zweimal Heizstab 3

Im log hab ich derzeit keinen fehler drinnen

@Alle
Leider hab ich zuwenig PV Leistung mehr um weiter zu probieren
Werds in den nächsten Tagen weiter testen und euch berichten

Danke nochmal an alle für eure unterstützung

ChrisA4

so hier mein bericht

schaltungen funktionieren

aber

es schauckelt sich leider, so wie bei meiner ursprünglichen einstellung, ein aus;ein aller heizstäbe zugleich auf

also wenn

PV Leistug >3000 ist und einspeisen > 2700 ist wird der erste heizstab geschalten dann hab ich pv>3000 und einspeisung 200;
mehr pv leistung;
pv leistung >6000 und einspeisen >2700 zweiter heizstab dann pv>6000 und einspeisung 200
jetzt kommt der e herd mit 2000 hinzu und ich habe bezug von 1800 alle heizstäbe schalten zugleich ab habe ich dann pv>6000 und einspeisung von 4500 und beide schalten wieder ein, da ja für beide die bedingung da ist, und so spielt sich das eine weile ab .
hier ist der springede punkt das ich mit meinen DOIF`s und den wait timer im ersten beitrag versucht habe eine zeitspanne  oder besser stufenmässig zurückschalte
also wenn pv>6000 und bezug 1800 dann heizstab 2 (Stufe2) aus und die werte abwarten ob bedingung für heizstab bleibt oder ich die näcste stufe abschalten muss
und so auch wieder beim einschalten der heozstäbe

hoffe es so vertändlich

Beta-User

Na ja, du weißt ja, welche an sind, und könntest dann anhand der Differenz ermitteln, welche du ausschalten mußt, damit kein Bezug mehr stattfindet (und die richtigen rotierend ausgeschaltet werden).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

DetlefR

Ist "Bezug" = "-Einspeisung" oder ein eigenes Reading?

Und haben alle drei Heizstäbe die gleiche Leistung?

ChrisA4


DetlefR

#40
Das bringt gleich eine andere Sicht. Macht es aber letztendlich auch einfacher.
Mal sehen ob ich es richtig verstanden haben.
Einspeisung und Bezug: einer von beiden muss immer 0 sein. Richtig?

EinspBezugNr.RelHzgPowErgErl
27000002700 12700 Einsp. noch kein Rel an. d.h 1. Rel kann an
2000125002700 1200 Einsp. und ber. 1 Rel an.d.h. es kann an bleiben
52000125007200 25200 Einsp. und ber. 1 Rel an. d.h. 2 Rel können an
01500125001500 01500 Bezug und 1 Rel an. Das muss aus
01500250003500 11500 Bezug und 2 Rel. an. Es genügt eins abzuschalten
Ich habe mal versucht ein paar Beispiele in eine Tabelle zu bringen.
Umgesetzt sieht das ganze dann so aus.


Wechselrichter:PowerFlow_Site_P_PV:.* {
my $Einspeisung=ReadingsVal('Wechselrichter','Einspeisung',3000);
my $rotation=floor(time()/84600)%3;
my $Bezug=ReadingsVal('Wechselrichter','Bezug',3000);
my @relais=('Heizstab_Relais_1','Heizstab_Relais_2','Heizstab_Relais_3');
#Einspeisung oder Verbrauch
my $hzgpower=$Einspeisung-$Bezug;
#Wieviel Heizung ist schon
foreach my $rel(@relais){
$hzgpower+=ReadingsVal($rel,'state','on')=~/on/i ? 2500:0;
}
if ($hzgpower>2500){
fhem("set $relais[$rotation] on-for-timer 10");
$rotation-=1;
}
if ($hzgpower>5000){
fhem("set $relais[$rotation] on-for-timer 10");
$rotation-=1;
}
if ($hzgpower>7500){
fhem("set $relais[$rotation] on-for-timer 10");
}
}


Inc. Tippfehler und falscher Readingsnamen ;)

ChrisA4

ZitatEinspeisung und Bezug: einer von beiden muss immer 0 sein. Richtig?

ja

Dachte es ist einfacher wenn einspeisung weniger wie 200 ist, ohne mit bezug zu rechnen

wie rechnet es wenn sich mal die waschmaschine, trockner oder ähnliches in den verbrauch addiert?

Zitat5200   0   1   2500   7200 2   5200 Einsp. und ber. 1 Rel an. d.h. 2 Rel können an

bei stufe 2 einsp 5200:warum so hoch ?

wenn ich bedenke

erzeugung 6000 abzüglich 2500 von hzstuffe 1 und hausverbrauch 500 sind einspeisung 3000 deshalb die >2700 und nicht 5200 oder?

wenn ich dann noch die dritte stuffe rechne,also nach deiner tabelle, dann komm ich auf 7700 plus hzgpow 7500 komm ich auf 15200 ich hab leider nur 10kw ???

DetlefR

ZitatDachte es ist einfacher wenn einspeisung weniger wie 200 ist, ohne mit bezug zu rechnen
Du kannst den "Bezug" in Grenzen beeinflussen, indem die Heizstäbe abgeschalten werden.

Zitat5200   0   1   2500   7200 2   5200 Einsp. und ber. 1 Rel an. d.h. 2 Rel können an
Das ist viel eicht etwas optimistisch. 8)
Wenn 5200 eingespeist werden, obwohl schon 1x2500 verheizt werden, dann stehen 7200 zur Verfügung und es kann ein zweites Relais eingeschalten werden.

Zitatwie rechnet es wenn sich mal die waschmaschine, trockner oder ähnliches in den verbrauch addiert?
Dann ist der Bezug höher bzw. Einspeisung geringer.
Zitat0 3000 1 2500 -500
3000 Bezug. Davon 2500 durch einen Heizstab. Auch wenn der abgeschalten wird sind es noch 500 Bezug. D.h. es wird jetzt kein Heizstab mehr eingeschalten.

Die Rechnung erfolgt jetzt etwas anders. Die erzeugte Leistung ist erst mal sekundär. Auch der andere Verbrauch muss nicht berücksichtigt werden, da er sich automatisch in Einspeisung/Bezug wiederspeigelt.

Wird etwas eingespeist? Wenn Ja, wird davon schon etwas verheizt? Das was eingespeist wird und das was bereits verheizt wird, kann ich verheizen. Also x/2500 = Anzahl Relais ein. Die bereits eingeschaltenen Heizstäbe sollen ja an bleiben. Nur wenn noch genügend Leistung zur Verfügung steht, dann kommt noch einer dazu. Bzw. einer weg wenn die Leistung nicht reicht.

Anderes herum.
Wird etwas bezogen? Wenn Ja, kann ich Heizstäbe abschalten? Wenn ja, dann schalte nach Möglichkeit soviel Heizstäbe ab, dass der Bezug wieder 0 wird.




ChrisA4

OK Danke jetzt ist etwas licht im dunkeln

werde es testen und berichten

Danke nachmal

Skusi

Ich stehe gerade vor dem selben Problem und bekomme langsam einen Knoten im Kopf.

Ich habe aber ,glaube ich, eine Lösung gefunden.

Ich habe meinem meinem SML Stromzähler Device ein User Reading verpasst, das die aktuelle Einspeisung  mit den aktuellen Leistungen meiner 2 Ölradiatoren, die ich zum verheizen benutze, verrechnet.

Auf dieses Reading das ich noch mit dem Aggregator auf Mittelwert alle 60 Sekunden gezähmt habe, triggert mein Stufen DOIF zum zuschalten der Radiatoren.

So ich der Wert auf den ich reagiere immer der aktuelle Überschuss, egal welche Leistung gerade verheizt wird.

userReading:

Ueberschuss {sprintf "%.0f",((ReadingsVal($NAME,"SML_Watt_Summe",0) - ReadingsVal("Radiator1","power",0) - ReadingsVal("Radiator2","power",0)))}


DOIF:

defmod Heizen_mit_PV_Ueberschuss DOIF ([Stromzaehler:Ueberschuss] > -490)\
(set Radiator1 off, set Radiator2 off) \
\
DOELSEIF ([Stromzaehler:Ueberschuss] <= -490 and [Stromzaehler:Ueberschuss] > -740)\
(set Radiator1 on, set Radiator2 off) \
\
DOELSEIF ([Stromzaehler:Ueberschuss] <= -740 and [Stromzaehler:Ueberschuss] > -1330)\
(set Radiator1 off, set Radiator2 on)\
\
DOELSEIF ([Stromzaehler:Ueberschuss] <= -1330)\
(set Radiator1 on, set Radiator2 on)


Bin aber noch am testen. Die Schaltstufen sind auf die Leistungen der Radiatoren abgestimmt und um 100 W nach oben verschoben. Die Überlegung ist das es auch günstiger ist als Gas wenn ich nur ca 70 % der Nennleistung aus der Einspeisung nehme.
RPI3B, SIGNALduino, NanoCul868 (a-culfw), JeeLink Clone (LaCrosse), Firmata  für FB Heizung,Wasser+Gas+Klingel+Lux, Somfy Rolladen, Pollin Steckd.,TX29DTH,ESPEasy an S0 Stromz., MAX Fensterkontakte, IButton, SonOff Tasmota, ESP LED Controler