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.
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");
}
}
- Ein Notify anlegen, dass auf neue Werte auf PowerFlow_Site_P_PV reagiert
- Gleich wieder zurück wenn Einspeisung <2700 ist
- $rotation sind die Tage seit 1970 %3. Ergibt also 0,1 oder2
- Das sind die Namen der Relais die geschaltet werden sollen
- Wenn $EVTPART1 d.h. PowerFlow_Site_P_PV>2500 ist das erste Relais für 10 min einschalten
- $rotation-1 d.h das nächste Relais
- usw bis Relais 3
Voraussetzung ist, dass du für dein "MQTT2_4fach" Readingsproxy für jedes Relais einrichtest. Und dort "Setextension" aktiviert ist.
Gruß
Detlef
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 ?
OT OT
@TomLee
Das zeigst du mir am besten mal an einem Beispiel wie du das meinst. Geht auch per PM
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.
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
ZitatNicht so Ganz
Die if Bedingungen lassen sich einfach anpassen.
Genau so die Einschaltdauer der Readingsproxy von 600 Sekunden auf 10 Sekunden einstellen.
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
"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
Danke
Werd es heute probieren
Frage : Wenn es erreigniss nicht mehr zutrifft schalten dann alle drei zugleich aus oder stufenmäßig zurück
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...)
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.
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
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
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 ;) .
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
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.
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 ;) .
@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
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.
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??
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 .
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)
@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 ?!?
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.
@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))){
und das mit @relais und $relais
ist das richtig so?
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 ;) ).
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.
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
Es verlinken die letzten zwei Beiträge zur Antwort, bei meinem Link scrollt man etwas runter liest keine Minute und hat verstanden.
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.
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.
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");
}
}
Habs nicht ausprobiert, ich meine man kann sich in den if mindestens zweimal die öffnenden und schliessenden Klammern sparen.
@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
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
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).
Ist "Bezug" = "-Einspeisung" oder ein eigenes Reading?
Und haben alle drei Heizstäbe die gleiche Leistung?
Bezug ist ein eigenes reading
ja alle 2,5kw
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?
Einsp | Bezug | Nr.Rel | HzgPow | Erg | Erl |
2700 | 0 | 0 | 0 | 2700 1 | 2700 Einsp. noch kein Rel an. d.h 1. Rel kann an |
200 | 0 | 1 | 2500 | 2700 1 | 200 Einsp. und ber. 1 Rel an.d.h. es kann an bleiben |
5200 | 0 | 1 | 2500 | 7200 2 | 5200 Einsp. und ber. 1 Rel an. d.h. 2 Rel können an |
0 | 1500 | 1 | 2500 | 1500 0 | 1500 Bezug und 1 Rel an. Das muss aus |
0 | 1500 | 2 | 5000 | 3500 1 | 1500 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 ;)
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 ???
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.
OK Danke jetzt ist etwas licht im dunkeln
werde es testen und berichten
Danke nachmal
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.