FHEM Forum

FHEM => Sonstiges => Thema gestartet von: ChrisA4 am 15 September 2022, 14:15:35

Titel: DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: ChrisA4 am 15 September 2022, 14:15:35
Hallo

Ich stehe vor einem Schaltungsproblem.

Habe eine PV Anlage, Smartmeter und drei Heizstäbe mit jje 2,5kW. Diese möchte ich gerne in einem Abwechsungsrad ( HZ1 ist der erste am Montag, der zweite am Dienstag und der dritte am Mittwoch, HZ2 ist der zweite am Montag, der dritte am dienstag usw.) damit jeder Heizstab gleichmässig belastet wird und je nach überschuss, zuerst der erste dann der zweite dann der dritte und in umgekehrte reihenfolge bei abschwächen des Überschusses schalten. Damit die Relais nicht hin und her schalten wie ein gescheuchtes Huhn (kommt eine Wolke PV Leistung weg nach 2 sek wieder da oder ist Bewölkt und kommt für 2sek die Sonne usw) dachte ich mir ich setze den wait timer ein und warte eine Zeitspanne ab ob sich der Wert nach dem Schwellwert hält oder wieder zurücksetzt (bei zurücksetzen soll der Befehl zum schalten nicht ausgeführt werden, erst wenn die Zeit abgelaufen ist und der Wert unter eine schwelle bleibt soll geschalten werden.

Derzeit wird nach ablauf der zeit immer geschalten egal ob sich der Wert zurücksetzt oder nicht.

Hier meine DOIF`S

defmod Heizstab1 DOIF ([09:00-20:00|1] and [Wechselrichter:PowerFlow_Site_P_PV] > 2500 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER2] eq "off" and [MQTT2_4fach:POWER3] eq "off") (set MQTT2_4fach POWER1 on)
DOELSEIF ([09:00-20:00|2] and [Wechselrichter:PowerFlow_Site_P_PV] > 7500 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER2] eq "on" and [MQTT2_4fach:POWER3] eq "on") (set MQTT2_4fach POWER1 on)
DOELSEIF ([09:00-20:00|3] and [Wechselrichter:PowerFlow_Site_P_PV] > 5000 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER2] eq "off" and [MQTT2_4fach:POWER3] eq "on") (set MQTT2_4fach POWER1 on)
DOELSEIF ([09:00-20:00|4] and [Wechselrichter:PowerFlow_Site_P_PV] > 2500 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER2] eq "off" and [MQTT2_4fach:POWER3] eq "off") (set MQTT2_4fach POWER1 on)
DOELSEIF ([09:00-20:00|5] and [Wechselrichter:PowerFlow_Site_P_PV] > 7500 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER2] eq "on" and [MQTT2_4fach:POWER3] eq "on") (set MQTT2_4fach POWER1 on)
DOELSEIF ([09:00-20:00|6] and [Wechselrichter:PowerFlow_Site_P_PV] > 5000 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER2] eq "on" and [MQTT2_4fach:POWER3] eq "off") (set MQTT2_4fach POWER1 on)
DOELSEIF ([09:00-20:00|0] and [Wechselrichter:PowerFlow_Site_P_PV] > 5000 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER2] eq "off" and [MQTT2_4fach:POWER3] eq "on") (set MQTT2_4fach POWER1 on)
DOELSEIF ([09:00-20:00|1] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER2] eq "off" and [MQTT2_4fach:POWER3] eq "off") (set MQTT2_4fach POWER1 off)
DOELSEIF ([09:00-20:00|2] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER2] eq "on" and [MQTT2_4fach:POWER3] eq "on") (set MQTT2_4fach POWER1 off)
DOELSEIF ([09:00-20:00|3] and  [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER2] eq "off" and [MQTT2_4fach:POWER3] eq "on") (set MQTT2_4fach POWER1 off)
DOELSEIF ([09:00-20:00|4] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER2] eq "off" and [MQTT2_4fach:POWER3] eq "off") (set MQTT2_4fach POWER1 off)
DOELSEIF ([09:00-20:00|5] and  [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER2] eq "on" and [MQTT2_4fach:POWER3] eq "on") (set MQTT2_4fach POWER1 off)
DOELSEIF ([09:00-20:00|6] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER2] eq "on" and [MQTT2_4fach:POWER3] eq "off") (set MQTT2_4fach POWER1 off)
DOELSEIF ([09:00-20:00|0] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER2] eq "off" and [MQTT2_4fach:POWER3] eq "on") (set MQTT2_4fach POWER1 off)
DOELSEIF ([20:01-08:59]) (set MQTT2_4fach POWER1 off)
attr Heizstab1 checkall all
attr Heizstab1 room ,Keller,Technikraum
attr Heizstab1 wait 0:20:15:0:20:15:15:20:0:15:20:0:15:15:0


defmod Heizstab2 DOIF ([09:00-20:00|1] and [Wechselrichter:PowerFlow_Site_P_PV] > 5000 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER1] eq "on" and [MQTT2_4fach:POWER3] eq "off") (set MQTT2_4fach POWER2 on)
DOELSEIF ([09:00-20:00|2] and [Wechselrichter:PowerFlow_Site_P_PV] > 2500 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER1] eq "off" and [MQTT2_4fach:POWER3] eq "off") (set MQTT2_4fach POWER2 on)
DOELSEIF ([09:00-20:00|3] and [Wechselrichter:PowerFlow_Site_P_PV] > 7500 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER1] eq "on" and [MQTT2_4fach:POWER3] eq "on") (set MQTT2_4fach POWER2 on)
DOELSEIF ([09:00-20:00|4] and [Wechselrichter:PowerFlow_Site_P_PV] > 7500 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER1] eq "on" and [MQTT2_4fach:POWER3] eq "on") (set MQTT2_4fach POWER2 on)
DOELSEIF ([09:00-20:00|5] and [Wechselrichter:PowerFlow_Site_P_PV] > 5000 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER1] eq "off" and [MQTT2_4fach:POWER3] eq "on") (set MQTT2_4fach POWER2 on)
DOELSEIF ([09:00-20:00|6] and [Wechselrichter:PowerFlow_Site_P_PV] > 2500 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER1] eq "off" and [MQTT2_4fach:POWER3] eq "off") (set MQTT2_4fach POWER2 on)
DOELSEIF ([09:00-20:00|0] and [Wechselrichter:PowerFlow_Site_P_PV] > 7500 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER1] eq "on" and [MQTT2_4fach:POWER3] eq "on") (set MQTT2_4fach POWER2 on)
DOELSEIF ([09:00-20:00|1] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER1] eq "on" and [MQTT2_4fach:POWER3] eq "off") (set MQTT2_4fach POWER2 off)
DOELSEIF ([09:00-20:00|2] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER1] eq "off" and [MQTT2_4fach:POWER3] eq "off") (set MQTT2_4fach POWER2 off)
DOELSEIF ([09:00-20:00|3] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER1] eq "on" and [MQTT2_4fach:POWER3] eq "on") (set MQTT2_4fach POWER2 off)
DOELSEIF ([09:00-20:00|4] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER1] eq "on" and [MQTT2_4fach:POWER3] eq "on") (set MQTT2_4fach POWER2 off)
DOELSEIF ([09:00-20:00|5] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER1] eq "off" and [MQTT2_4fach:POWER3] eq "on") (set MQTT2_4fach POWER2 off)
DOELSEIF ([09:00-20:00|6] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER1] eq "off" and [MQTT2_4fach:POWER3] eq "off") (set MQTT2_4fach POWER2 off)
DOELSEIF ([09:00-20:00|0] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER1] eq "on" and [MQTT2_4fach:POWER3] eq "on") (set MQTT2_4fach POWER2 off)
DOELSEIF ([20:01-08:59]) (set MQTT2_4fach POWER2 off)
attr Heizstab2 checkall all
attr Heizstab2 room ,Keller,Technikraum
attr Heizstab2 wait 15:0:20:20:15:0:20:15:20:0:0:15:20:0:0


defmod Heizstab3 DOIF ([09:00-20:00|1] and [Wechselrichter:PowerFlow_Site_P_PV] > 7500 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER1] eq "on" and [MQTT2_4fach:POWER2] eq "on") (set MQTT2_4fach POWER3 on)
DOELSEIF ([09:00-20:00|2] and [Wechselrichter:PowerFlow_Site_P_PV] > 5000 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER1] eq "off" and [MQTT2_4fach:POWER2] eq "on") (set MQTT2_4fach POWER3 on)
DOELSEIF ([09:00-20:00|3] and [Wechselrichter:PowerFlow_Site_P_PV] > 2500 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER1] eq "off" and [MQTT2_4fach:POWER2] eq "off") (set MQTT2_4fach POWER3 on)
DOELSEIF ([09:00-20:00|4] and [Wechselrichter:PowerFlow_Site_P_PV] > 5000 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER1] eq "on" and [MQTT2_4fach:POWER2] eq "off") (set MQTT2_4fach POWER3 on)
DOELSEIF ([09:00-20:00|5] and [Wechselrichter:PowerFlow_Site_P_PV] > 2500 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER1] eq "off" and [MQTT2_4fach:POWER2] eq "off") (set MQTT2_4fach POWER3 on)
DOELSEIF ([09:00-20:00|6] and [Wechselrichter:PowerFlow_Site_P_PV] > 7500 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER1] eq "on" and [MQTT2_4fach:POWER2] eq "on") (set MQTT2_4fach POWER3 on) DOELSEIF ([09:00-20:00|0] and [Wechselrichter:PowerFlow_Site_P_PV] > 2500 and [Wechselrichter:Einspeisung] > 2700 and [MQTT2_4fach:POWER1] eq "off" and [MQTT2_4fach:POWER2] eq "off") (set MQTT2_4fach POWER3 on) DOELSEIF ([09:00-20:00|1] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER1] eq "on" and [MQTT2_4fach:POWER2] eq "on") (set MQTT2_4fach POWER3 off)
DOELSEIF ([09:00-20:00|2] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER1] eq "off" and [MQTT2_4fach:POWER2] eq "on") (set MQTT2_4fach POWER3 off)
DOELSEIF ([09:00-20:00|3] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER1] eq "off" and [MQTT2_4fach:POWER2] eq "off") (set MQTT2_4fach POWER3 off)
DOELSEIF ([09:00-20:00|4] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER1] eq "on" and [MQTT2_4fach:POWER2] eq "off") (set MQTT2_4fach POWER3 off)
DOELSEIF ([09:00-20:00|5] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER1] eq "off" and [MQTT2_4fach:POWER2] eq "off") (set MQTT2_4fach POWER3 off)
DOELSEIF ([09:00-20:00|6] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER1] eq "on" and [MQTT2_4fach:POWER2] eq "on") (set MQTT2_4fach POWER3 off)
DOELSEIF ([09:00-20:00|0] and [Wechselrichter:Einspeisung] < 400 and [MQTT2_4fach:POWER1] eq "off" and [MQTT2_4fach:POWER2] eq "off") (set MQTT2_4fach POWER3 off)
DOELSEIF ([20:01-08:59]) (set MQTT2_4fach POWER3 off)
attr Heizstab3 checkall all
attr Heizstab3 room ,Keller,Technikraum
attr Heizstab3 wait 20:15:0:15:0:20:0:0:15:20:15:20:0:20:0


Hat jemand eine Idee wo der Fehler liegt, bin mit meinem Latein am Ende.
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: DetlefR am 16 September 2022, 19:35:44
ZitatHat jemand eine Idee wo der Fehler liegt, bin mit meinem Latein am Ende.

Nicht böse gemeint. Aber der Slider unter dem Codefenster ist zu schmal. ;)
Das ganze ist einfach zu unübersichtlich.

Ich habe das so verstanden:
Wenn "Einspeisung" > 2700 soll der Rest verheizt werden.
Bei "PowerFlow_Site_P_PV" >2500 mit einem Heizstand >5000 mit 2 und größer 7500 mit drei.
Damit es nicht "klappert" sollen die Heizstäbe eine Mindesteinschaltdauer haben.
Und damit sie sich nicht "abnutzen", sollen sie auch noch "rotieren"

Soweit richtig?
Dann kannst du das probieren. Der Code wird so nicht lauffähig sein, da ich a.) die Vorraussetzungen bei dir nicht kenne und b.) sicher noch einige Änderungen vorgenommen werden müssen.
define n_heizstab notify Wechselrichter:PowerFlow_Site_P_PV:.* {
return if (ReadingsVal('Wechselrichter','Einspeisung',3000)<2700);
my $rotation=floor(time()/84600)%3;
my @relais=['rp_hzg1','rp_hzg2','rp_hzg3'];
if ($EVTPART1>2500){
fhem("set $relais[rotation] on-for-timer 600");
$rotation-=1;
}
if ($EVTPART1>5000){
fhem("set $relais[rotation] on-for-timer 600");
$rotation-=1;
}
if ($EVTPART1>7500){
fhem("set $relais[rotation] on-for-timer 600");
}
}

Voraussetzung ist, dass du für dein "MQTT2_4fach" Readingsproxy für jedes Relais einrichtest. Und dort "Setextension" aktiviert ist.

Gruß
Detlef
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: TomLee am 16 September 2022, 20:40:13
OT

@DetlefR

Ich hab deinen mir zuletzt gezeigten Code noch nicht verinnerlicht, noch keine Zeit gehabt Stück für Stück auch nachzuvollziehen, sehe  8) aber das er machen sollte wie du sagtest, genauso sehe ich hier (auf den ersten Blick) das man deinen zuletzt gezeigten Code optimaler mit einem Hash umsetzt, ist dir das bewusst ?
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: DetlefR am 16 September 2022, 20:53:19
OT OT

@TomLee
Das zeigst du mir am besten mal an einem Beispiel wie du das meinst. Geht auch per PM
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: TomLee am 16 September 2022, 21:28:04
Ich meine ich hab das hier (https://forum.fhem.de/index.php/topic,112785.msg1071245.html#msg1071245) mitgenommen, per PM hat keiner was davon ausser wir zwei.
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: ChrisA4 am 17 September 2022, 08:10:31
Ertsmal Danke für eure Antworten


Zitat von: DetlefR am 16 September 2022, 19:35:44
Nicht böse gemeint. Aber der Slider unter dem Codefenster ist zu schmal. ;)
Das ganze ist einfach zu unübersichtlich.

Ich habe das so verstanden:
Wenn "Einspeisung" > 2700 soll der Rest verheizt werden.
Bei "PowerFlow_Site_P_PV" >2500 mit einem Heizstand >5000 mit 2 und größer 7500 mit drei.
Damit es nicht "klappert" sollen die Heizstäbe eine Mindesteinschaltdauer haben.
Und damit sie sich nicht "abnutzen", sollen sie auch noch "rotieren"

Soweit richtig?

Nicht so Ganz

Heizstab 1 (Stufe 1) soll bei Überschuss Heizen wenn >2500 PV Leistung und > 2700 Einspeisung
Heizstab 2 (Stufe 2) soll bei weiterem erreichen des Überschusses von >2700 und einer PV Leistug von >5000 Heizen, aber wieder abschalten bei unterschreitung der Werte,
dabei aber abwarten von einigen sekunden ob es nur eine Wolke war oder doch länger keine einstrahlung vorhanden ist, sonst schaltet alles in sekundentakt.

Das gleiche mit HZ3 >2700 Einspeisung und >7500 PV 

Habe bemerkt das der Smartmeter alle 5 sek neue Werte gibt.
ein Reading ist zb

PV 3000
Einspeisung 2900
HZ1 Schaltet

nach 5 sek
pv 3500
einspeisung 2000 da zb E Herd an

hz 1 sollte warten 10 sek ob der wert wieder auf
pv 3000
einspeisung 2900 zurück kehrt
damit nicht aus und gleich wieder ein ist

momentanes problem
wert ist wieder auf pv 3000
und einspeisung 2900
HZ1 schaltet trotzdem nach 10 sek aus und dann wieder ein , sollte eigentlich in diesem fall nicht schalten


Hoffe ich habs etwas erklären können was ich haben möchte


PS: meine Antworten könnten manchmal etwas länger dauern da ich viel unterwegs bin
Danke euch nochmal
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: DetlefR am 17 September 2022, 11:39:22
ZitatNicht so Ganz
Die if Bedingungen lassen sich einfach anpassen.
Genau so die Einschaltdauer der Readingsproxy von 600 Sekunden auf 10 Sekunden einstellen.
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: ChrisA4 am 18 September 2022, 08:08:30
Es sollte nicht immer min. von x zeit schalten,
sondern solange schalten wie die bedingung vorhanden ist und nur eine x zeit abwarten bei bedingungswechsel ob diese auch bleibt oder wieder zurückkehrt
und die heizstäbe stufenmäßig dazuschalten und dass für jeden tag mit einem anderen HZ Stab beginnend

Stufe              1;2;3

Mo Hz Stab     1;2;3
Di                    2;3;1
Mi                    3;1;2
do                   1;2;3
fr                     2;3;1
sa                   3;2;1
so                   2;1;3
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: DetlefR am 18 September 2022, 11:56:50
"on-for-timer" heisst schalte den Heizstab für xx Sekunden ein.

Dein Smartmeter sendet alle 5 Sekunden neue Werte. Wenn für z.B. HZ.Stab 2 die Bedingung zutrifft, wird er für 10 Sekunden eingeschalten. Wenn beim nächsten mal die Bedingung immer noch zutrifft, wird er für weitere wieder für 10 Sekunden eingeschalten. usw. usw.
Wenn die Bedingung nicht mehr zutrifft, schaltet er sich nach 2 Perioden (2*5Sekunden) allein aus.

Die Rotation ergibt sich durch
my $rotation=floor(time()/84600)%3;
my @relais=['rp_hzg1','rp_hzg2','rp_hzg3'];

rp_hzg1 bis 3 müssen durch die wirklichen Namen der ReadingsProxy ersetzt werden
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: ChrisA4 am 19 September 2022, 06:41:35
Danke
Werd es heute probieren

Frage : Wenn es erreigniss nicht mehr zutrifft schalten dann alle drei zugleich aus oder stufenmäßig zurück
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: Beta-User am 19 September 2022, 07:14:35
Kleine Anmerkungen noch - man braucht nicht unbedingt einen readingsProxy.

Zum einen könnte man das MQTT2_DEVICE einfach "splitten" und für jedes Relay eine eigene Instanz generieren. Die könnte dann auch direkt "SetExtensions" (also u.A. on-for-timer).

Zum anderen kann man das auch mit benannten fhem (!)-sleep lösen.

Hier mal ein dummy zum Knobeln:
defmod du_test dummy
attr du_test readingList state
attr du_test setList on off
attr du_test useSetExtensions 1
attr du_test userReadings Status:on { fhem("sleep 5 moving_$name quiet;;setreading $name Status closed");; return 'moving' }
attr du_test webCmd on-for-timer 0.2

(zum Hintergrund siehe https://forum.fhem.de/index.php/topic,127649.0.html (https://forum.fhem.de/index.php/topic,127649.0.html), und es sei darauf hingewiesen, dass man was tun muss, damit man sieht, was passiert...)
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: DetlefR am 19 September 2022, 12:24:17
ZitatWenn es erreigniss nicht mehr zutrifft schalten dann alle drei zugleich aus oder stufenmäßig zurück
Das kommt auf das "Ereignis" an.
Wenn "PowerFlow_Site_P_PV" langsam zurückgeht, wird auch ein Relais nach dem anderen ausgehen.(leichte Bewölkung)
Wenn "PowerFlow_Site_P_PV" innerhalb einer Messperiode unter 2500 geht und dort bleibt, geht nach 10 Sek. alles aus (dunkele Wokle) ;)

Aber etwas anderes ist mir noch aufgefallen. Wenn ein Heizstab eingeschalten wird, geht die Einspeisung zurück.
Ich habe mal versucht das zu berücksichtigen.

define n_heizstab notify Wechselrichter:PowerFlow_Site_P_PV:.* {
my $Einspeisung=ReadingsVal('Wechselrichter','Einspeisung',3000);
my $rotation=floor(time()/84600)%3;
my @relais=['rp_hzg1','rp_hzg2','rp_hzg3'];
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");
}
}


Wenn der betreffende Heizstab schon an ist, dann muss die Einspeisung noch über 100 sein. Ansonsten 2700.
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: ChrisA4 am 19 September 2022, 14:16:19
Zitat von: DetlefR am 16 September 2022, 19:35:44
Voraussetzung ist, dass du für dein "MQTT2_4fach" Readingsproxy für jedes Relais einrichtest. Und dort "Setextension" aktiviert ist.
Hab zwar jetzt endlich geschafft ein Readingsproxy zu erstellen aber bekomme kein Setextension hin

Heizstab_Relais_1: unknown attribute setextension. Type 'attr Heizstab_Relais_1 ?' for a detailed list.

Hab voll den durchblick verloren
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: DetlefR am 19 September 2022, 14:57:42
Sorry. ??? Mein Fehler. Setextension ist bei Readingsproxy von Hause aus mit drin.
Es sollten
blink
...
on
off
on-for-timer
...toggle
zur Verfügung stehen.
Schalten und Rückmeldung funktioniert darüber?
Wenn nicht schick mal das Ergebnis von
list -r Heizstab_Relais_1
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: Beta-User am 19 September 2022, 15:09:04
Zitat von: Beta-User am 19 September 2022, 07:14:35
Kleine Anmerkungen noch - man braucht nicht unbedingt einen readingsProxy.

Zum einen könnte man das MQTT2_DEVICE einfach "splitten" und für jedes Relay eine eigene Instanz generieren. Die könnte dann auch direkt "SetExtensions" (also u.A. on-for-timer).

Zum anderen kann man das auch mit benannten fhem (!)-sleep lösen.

[...]
Anders gesagt: das splitten ist einfacher als readingsProxy...

SetExtensions setzen aber (in der Anzeige in FHEMWEB) immer voraus, dass das Device on und off versteht. Bei readingsProxy klappt das dann, wenn setList passend gesetzt ist ;) .
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: ChrisA4 am 19 September 2022, 15:13:23
Zitat von: DetlefR am 19 September 2022, 14:57:42
Sorry. ??? Mein Fehler. Setextension ist bei Readingsproxy von Hause aus mit drin.
Es sollten
blink
...
on
off
on-for-timer
...toggle
zur Verfügung stehen.
Schalten und Rückmeldung funktioniert darüber?
Wenn nicht schick mal das Ergebnis von
list -r Heizstab_Relais_1

define Heizstab_Relais_1 readingsProxy MQTT2_4fach:POWER1

setstate Heizstab_Relais_1 off
setstate Heizstab_Relais_1 2022-09-19 14:57:37 lastCmd on
setstate Heizstab_Relais_1 2022-09-19 15:02:24 state off
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: DetlefR am 19 September 2022, 15:44:25
OT
ZitatAnders gesagt: das splitten ist einfacher als readingsProxy...
Das ist, wie vieles, Geschmackssache. Mich würde es stören, wenn ein phys. Gerät als 4 Geräte in FHEM angelegt ist. Zwar mit gesonderten Namen für die Relais aber ansonsten gleichen Readings.
Mit Readingsproxy habe ich zwar auch mehrere zusätzliche Geräte, aber die stehen alle in Bezug zu einem "Master". Ich weiß nicht ob das beim splitten auch so ist.
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: Beta-User am 19 September 2022, 16:13:58
Zitat von: DetlefR am 19 September 2022, 15:44:25
OTDas ist, wie vieles, Geschmackssache. Mich würde es stören, wenn ein phys. Gerät als 4 Geräte in FHEM angelegt ist. Zwar mit gesonderten Namen für die Relais aber ansonsten gleichen Readings.
Mit Readingsproxy habe ich zwar auch mehrere zusätzliche Geräte, aber die stehen alle in Bezug zu einem "Master". Ich weiß nicht ob das beim splitten auch so ist.
a) ist es NICHT so, dass die split-Geräte (zwingend) alle Readings aus dem Haupt-Gerät haben müssen. Man kann das verhindern, und wenn man es per attrTemplate macht, ist es in der Regel so, dass im ersten Kanal auch alles landet, was mit der MCU zu tun hat, aber nichts, was mit den Kanälen zu tun hätte, und anders rum ist es genauso...
b) Für Querbeziehungen kann man "associatedWith" nutzen und/oder comment. Wird per attrTemplate beides gesetzt.

Ergo: bevor du irgendwelche RTL in die Welt setzt, befasse dich mit den Details...

PS: Technisch machen benannte sleep auch nichts wesentlich anderes als die on-for-timer in den SetExtensions... Man muss es nur verstehen wollen ;) .
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: DetlefR am 19 September 2022, 16:39:37
@ChrisA4
Leg den Readingsproxy mal so an.

define Heizstab_Relais_1 readingsProxy MQTT2_4fach:POWER1
attr Heizstab_Relais_1 setFn {($CMD eq "on")?"POWER1 ON":"POWER1 OFF";;}
attr Heizstab_Relais_1 setList on off


Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: DetlefR am 19 September 2022, 16:43:48
OT
@Beta-User
Es gibt meistens mehr als eine Lösung. Man muss sich dann nur entscheiden.

ZitatPS: Technisch machen benannte sleep auch nichts wesentlich anderes als die on-for-timer in den SetExtensions... Man muss es nur verstehen wollen ;) .
Das habe ich schon :D. "moving" für das Garagentor macht auch optisch was her. Es gibt nun aber mal on-for-timer. Auch zum anklicken. Warum soll ich das nicht nutzen.
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: ChrisA4 am 19 September 2022, 16:50:32
Zitat von: DetlefR am 19 September 2022, 16:39:37

Leg den Readingsproxy mal so an.

define Heizstab_Relais_1 readingsProxy MQTT2_4fach:POWER1
attr Heizstab_Relais_1 setFn {($CMD eq "on")?"POWER1 ON":"POWER1 OFF";;}
attr Heizstab_Relais_1 setList on off


hab ich und schalten geht

kleine frage dazu am ende die ;; was macht das fürn einen unterschied, hab vorher ohne diese ;; probiert und schalten auch??
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: Beta-User am 19 September 2022, 16:52:35
Zitat von: DetlefR am 19 September 2022, 16:43:48
OT
@Beta-User
Es gibt meistens mehr als eine Lösung. Man muss sich dann nur entscheiden.
Ja. Aber man sollte vor der Entscheidung alle Argumente kennen. Daher die Klarstellungen von meiner Seite.

Zitat
Es gibt nun aber mal on-for-timer. Auch zum anklicken. Warum soll ich das nicht nutzen.
Weil es immer mehrere Möglichkeiten gibt. Hier ging es darum, im Hintergrund eine Lösung zu haben, die automatisiert läuft?
Für die braucht man eben eigentlich nicht 4 Devices mehr und man muss auch nichts klicken können.

Für den Rest würde ich weiter die "split"-Variante empfehlen, da kann man ohne Klimmzüge drumrum einfach drauflosklicken, wie man lustig ist und hat in Summe ein Device weniger. Und die Frage, ob man per Sprachsteuerung was machen will, darf man auch direkt beantworten :P .
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: TomLee am 19 September 2022, 16:54:39
Zitat von: ChrisA4 am 19 September 2022, 16:50:32
kleine frage dazu am ende die ;; was macht das fürn einen unterschied, hab vorher ohne diese ;; probiert und schalten auch??

https://forum.fhem.de/index.php/topic,121514.msg1173758.html#msg1173758 (https://forum.fhem.de/index.php/topic,121514.msg1173758.html#msg1173758)
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: ChrisA4 am 19 September 2022, 17:03:55
@DetlefR

Hab jetzt meine Readingsproxys angelgt und alle schaltet.
Wollte jetzt das notify abgeändert übernehmen

define Heizpatrone notify Wechselrichter:PowerFlow_Site_P_PV:.* {
my $Einspeisung=ReadingsVal('Wechselrichter','Einspeisung',3000);
my $rotation=floor(time()/84600)%3;
my @relais=['Heizstab_Relais_1','Heizstab_Relais_2','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");
}
}


und bekomme diesen Fehler

Missing right curly or square bracket at (eval 11521417) line 1, at end of line
syntax error at (eval 11521417) line 1, at EOF

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 }, try help.
Unknown command $rotation-=1, try help.
Unknown command }, try help.
Unknown command }, try help.


Was hab ich jetzt wieder falsch ?!?
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: Beta-User am 19 September 2022, 17:09:29
bin zwar nicht DetlevR, schlage aber mal vor, das notify nur mit leerem Perl-Code anzulegen, und hinterher den Rest in das DEF-Feld einzutragen.

Erster Schritt also:
define Heizpatrone notify Wechselrichter:PowerFlow_Site_P_PV:.* {}

Danach kannst du dich ja mal mit "escapen" und "Maskieren" befassen. Dazu mal die RAW-Definition des fertigen Devices ansehen.
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: DetlefR am 19 September 2022, 17:35:09
@ChrisA4

So wie Beta-User geschrieben hat.
Erst mal das leere Notify anlegen.
Dann auf "DEF" Klicken und da lässt sich dann der gesamte Inhalt austauschen.
Anschliessend den Klick auf "modify Heizpatrone" nicht vergessen ;D

Einen Fehler habe ich gerade noch gesehen. Bei allen drei if Zeilen habe ich am Ende die { vergessenif (($EVTPART1>2500) && ($Einspeisung>(ReadingsVal($relais[$rotation],'state','on')=~ /on/i ? 100:2700))){
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: ChrisA4 am 19 September 2022, 17:37:24
und das mit @relais und $relais
ist das richtig so?
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: Beta-User am 19 September 2022, 17:42:28
Zitat von: ChrisA4 am 19 September 2022, 17:37:24
und das mit @relais und $relais
ist das richtig so?
https://perldoc.perl.org/perldata

Dafür sind aber etwas viele Klammern verteilt, einen Teil könnte man weglassen....
(Sonst erzeugt man uU. Arrays oder Hashes, wo eigentlich keine sein sollen ;) ).
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: TomLee am 19 September 2022, 17:49:55
Auch wenn https://perldoc.perl.org  "die" Doku ist, find ich für einen Anfänger https://perlmaven.com/perl-arrays erstmal zum einlesen und verstehen besser.
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: ChrisA4 am 19 September 2022, 17:52:40
aber wenn ich unter
   my @relais=['Heizstab_Relais_1','Heizstab_Relais_2','Heizstab_Relais_3']

dann müsste ich doch im if befehl
  if (($EVTPART1>2500) && ($Einspeisung>(ReadingsVal($relais[$rotation],'state','on')=~ /on/i ? 100:2700))){
fhem("set $relais[$rotation] on-for-timer 10")

statt $relais doch @relais stehen
oder verstehe ich da was falsch
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: TomLee am 19 September 2022, 17:57:02
Es verlinken die letzten zwei Beiträge zur Antwort, bei meinem Link scrollt man etwas runter liest keine Minute und hat verstanden.
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: ChrisA4 am 19 September 2022, 18:03:18
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.
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: DetlefR am 19 September 2022, 18:05:05
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.
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: DetlefR am 19 September 2022, 18:12:57
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");
}
}
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: TomLee am 19 September 2022, 18:19:27
Habs nicht ausprobiert, ich meine man kann sich in den if mindestens zweimal die öffnenden und schliessenden Klammern sparen.
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: ChrisA4 am 19 September 2022, 18:29:27
@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
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: ChrisA4 am 20 September 2022, 13:38:27
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
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: Beta-User am 20 September 2022, 13:58:55
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).
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: DetlefR am 20 September 2022, 15:29:20
Ist "Bezug" = "-Einspeisung" oder ein eigenes Reading?

Und haben alle drei Heizstäbe die gleiche Leistung?
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: ChrisA4 am 20 September 2022, 18:04:25
Bezug ist ein eigenes reading

ja alle 2,5kw
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: DetlefR am 20 September 2022, 19:53:01
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 ;)
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: ChrisA4 am 20 September 2022, 20:36:05
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 ???
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: DetlefR am 21 September 2022, 16:18:55
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.



Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: ChrisA4 am 21 September 2022, 17:16:27
OK Danke jetzt ist etwas licht im dunkeln

werde es testen und berichten

Danke nachmal
Titel: Antw:DOIF erst schalten nach Zeit und Schwellwert überschreitung
Beitrag von: Skusi am 25 September 2022, 10:24:25
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.