Hallo Zusammen,
mir fehlt leider ein wenig der Ansatz und hoffe jemand kann mit einen Tipp geben.
Ich habe einen Stromspeicher, bei dem man die Ausgangsleistung über einen PWM Ausgang gesteuert werden kann (set XYZ PWM [port] [Wert 0-1024]). Ich hätte gerne ein Dummy, das diesen Wert übergibt und ein DOIF, dass die Stellgrößer auf Basis des aktuellen Verbrauchs (OBIS Stromzähler) festlegt. Am liebsten so, kein Strom eingespeist oder bezogen wird (also Ziel ist Stromzähler = 0), wobei die Regelung nur einsetzen soll, wenn der Stromzähler außerhalb von -10W bis +10W liegt.
PMW 0 = 310W
PWM 1024 = 30W
Über heiße Tipps wäre ich sehr dankebar.
Danke,
Simon
Überlege:
- welche Device:Readings triggern sollen, und in welcher Kombination
- welches set Kommando dann abhängig davon ausgeführt werden muss
Dann deine Logik in Pseudocode:
- wenn Reading xxx von Device nnn grösser als -10 und kleiner als +10 ist, und Reading yyyy von Device mmm so ist, dann "set device wert"
- wenn ....
und liefere noch ein "list" von den betroffenen Devices
Dann kann man anfangen ein DOIF zu bauen
Hallo amenomade,
danke für deine Schnelle Rückmeldung.
Nach deinem Denkanstoß würde ich mal so starten:
([SpeicherOutput.state] <> "off" and (([Stromzaehler.power] < -10 or [Stromzaehler.power] > 10)) (set SpeicherOutput.state (Stromzaehler.power / 3 + SpeicherOutput.state))
Auf Deutsch:
Wenn der Stromspeicher nicht aus ist und der Stromzähler einen Wert ausserhalb -10 bis +10W anzeigt, regle den Stromspeicher nach (Die Formel kommt daher, dass 300W ca. 100% entsprechen)
Denkst Du das klappt so vom Prinzip?
Nun müsste irgendwie noch folgendes rein:
- Wenn der Stromspeicher schon auf 100% ist muss er nicht mehr nach oben Regeln.
- Wenn der Stromspeicher schon auf 10% ist (weiterrunter gehts nicht und das entspricht ca. 30-35W) und trotzdem noch 40W Einspeisung sind, schalte nach 30sek den Speicher ab
Das könnte man vielleicht so lösen:
([SpeicherOutput.state] <> "off" and [Stromzaehler.power] > 10 and [SpeicherOutput.state] < 100) (set SpeicherOutput.state (Stromzaehler.power / 3 + SpeicherOutput.state))
elseif
([SpeicherOutput.state] <> "off" and [Stromzaehler.power] < -40 and [SpeicherOutput.state] <= 10) (set SpeicherOutput off) 'hier fehlt noch die Zeit berücksichtigung
elseif
([SpeicherOutput.state] <> "off" and (([Stromzaehler.power] < -10 or [Stromzaehler.power] > 10)) (set SpeicherOutput.state (Stromzaehler.power / 3 + SpeicherOutput.state)
Dann fehlt nur:
- Was das den Stromspeicher anschaltet
- Was das sicherstellt, dass der SpeicherOutput wert nicht unter 10 und über 100 geht
- ein DOIF, dass die "Prozent" des SpeicherOutput in "set ESP PWM 15 0-1024" umwandelt
Und jetzt kommst Du :-).
Danke und viele Grüße,
Simon
List vom Stromzähler (Bezugsgröße)
Internals:
DEF /dev/ttyUSB0@@9600,8,N,1 SML
DeviceName /dev/ttyUSB0@@9600,8,N,1
FD 13
FUUID 5ec22a0e-f33f-2d68-ceb5-a5d43fab8c33577c
MeterType SML
NAME Stromzaehler
NR 207
PARTIAL
STATE -4170.8 W
TYPE OBIS
READINGS:
2020-06-20 08:10:48 0.118.7.0.22.255 0
2020-06-23 14:15:16 1.0.0.0.9.255 06-45-4D-48-01-07-19-80-4D-11
2020-06-21 23:10:56 122.119.7.129.129.255 -1e+30
2020-06-23 14:15:16 129.129.199.130.3.255 EMH
2020-06-23 14:15:16 129.129.199.130.5.255 4611-9F0C-C0DF-4091-B0B7-7F6E-E984-96F2-89C3-305D-F7F3-0026-5D56-E11E-97DA-C1DE-E3FD-4DCD-7805-6F59-7428-B477-72E7-40A2-01
2020-06-23 13:53:45 Version EMH454D48010719804D11
2020-06-23 14:15:16 power -4170.8
2020-06-22 20:44:18 state opened
2020-06-23 14:15:16 total_consumption 14607672.2
2020-06-23 14:15:16 total_consumption_Ch1 1287.5
2020-06-23 14:15:16 total_consumption_Ch2 14606384.7
2020-06-23 14:15:16 total_feed 35015760
2020-06-23 14:15:16 total_feed_Ch1 35015760
2020-06-23 14:15:16 total_feed_Ch2 0
helper:
BUFFER
EoM -1
SPEED
SPEED2
TRIGGERTIME 1592851458.26458
Channels:
DEVICES:
2
directions:
Attributes:
interval 2
room PV Anlage
stateFormat {ReadingsVal("$name","power", 0)." W"}
List vom Regelungsdummy (Regelgröße) -> Allerdings brauchts hier noch ein DOIF, dass die "Prozent" in "set ESP PWM 15 0-1024" umwandelt
Internals:
FUUID 5ee3f0ea-f33f-2d68-2066-a49c7d320ca8cddd
NAME SpeicherOutput
NR 224
STATE off %
TYPE dummy
READINGS:
2020-06-23 06:20:15 state off
Attributes:
room PV Anlage
stateFormat {ReadingsVal("$name","state", 0)." %"}
verbose 1
webCmd off:Pwr
widgetOverride Pwr:slider,10,5,100
List vom Stromspeicher, das angibt, wieviel Leistung der Stromspeicher gerade bring. Allerdings ist das für die Regelung nicht unbedingt notwendig
Internals:
DEF 192.168.0.56
FUUID 5ec04872-f33f-2d68-53f7-37d01509a6cddc5f
HOST 192.168.0.56
INTERVAL 2
NAME StromSpeicher
NEXTUPDATE Tue Jun 23 15:00:58 2020
NR 167
STATE 142.332 W on
TIMEOUT 1
TYPE TPLinkHS110
READINGS:
2020-06-23 15:00:56 active_mode none
2020-06-23 15:00:56 alias Stromspeicher
2020-06-23 15:00:56 current 0.725
2020-06-23 15:00:56 daily_average 4533.73913043478
2020-06-23 15:00:56 daily_total 3.989
2020-06-23 15:00:56 decode_json ok
2020-06-23 15:00:56 dev_name Smart Wi-Fi Plug With Energy Monitoring
2020-06-23 15:00:56 deviceId 8006F257CF48E683CCC198216ACD811E1A1D4DB9
2020-06-23 15:00:56 err_code 0
2020-06-23 15:00:56 feature TIM:ENE
2020-06-23 15:00:56 fwId 00000000000000000000000000000000
2020-06-23 15:00:56 hwId 044A516EE63C875F9458DA25C2CCC5A0
2020-06-23 15:00:56 hw_ver 2.0
2020-06-23 15:00:56 icon_hash
2020-06-23 15:00:56 latitude 48.2471
2020-06-23 15:00:56 led_off 0
2020-06-23 15:00:56 longitude 12.4893
2020-06-23 15:00:56 mac AC:84:C6:89:E6:5A
2020-06-23 15:00:56 model HS110(EU)
2020-06-23 15:00:56 monthly_total 104.276
2020-06-23 15:00:56 next_action -None-
2020-06-23 15:00:56 oemId 1998A14DAA86E4E001FD7CAF42868B5E
2020-06-23 15:00:56 on_time 18169
2020-06-23 15:00:56 power 142.332
2020-06-23 15:00:56 relay_state 1
2020-06-23 15:00:56 rssi -66
2020-06-23 15:00:56 state on
2020-06-23 15:00:56 sw_ver 1.5.6 Build 191125 Rel.083657
2020-06-23 15:00:56 time 2020-6-23 15:0:54
2020-06-23 15:00:56 total 21.892
2020-06-23 15:00:56 type IOT.SMARTPLUGSWITCH
2020-06-23 15:00:56 updating 0
2020-06-23 15:00:56 voltage 237.7
Attributes:
disable 0
interval 2
room PV Anlage
stateFormat {ReadingsVal("$name","power", 0)." W ".ReadingsVal("$name","state", 0)}
verbose 2
Zitat([SpeicherOutput.state] <> "off" and [Stromzaehler.power] > 10 and [SpeicherOutput.state] < 100) (set SpeicherOutput.state (Stromzaehler.power / 3 + SpeicherOutput.state))
elseif
([SpeicherOutput.state] <> "off" and [Stromzaehler.power] < -40 and [SpeicherOutput.state] <= 10) (set SpeicherOutput off) 'hier fehlt noch die Zeit berücksichtigung
elseif
([SpeicherOutput.state] <> "off" and (([Stromzaehler.power] < -10 or [Stromzaehler.power] > 10)) (set SpeicherOutput.state (Stromzaehler.power / 3 + SpeicherOutput.state)
Na, dann hast Du schon fast alles? Nur ein bisschen Syntax:
([SpeicherOutput] ne "off" and [Stromzaehler:power] > 10 and [SpeicherOutput] < 100) (set SpeicherOutput ([Stromzaehler:power] / 3 + [SpeicherOutput]))
DOELSEIF
usw
ZitatWas das den Stromspeicher anschaltet
Was ist der Befehl dafür in deinem Fhem? Einfach dann ein (set....) in den DOIF Befehle hinzufügen
ZitatWas das sicherstellt, dass der SpeicherOutput wert nicht unter 10 und über 100 geht
Ein zusätzliches DOELSEIF mit Befehl (set... off) ?
Zitatein DOIF, dass die "Prozent" des SpeicherOutput in "set ESP PWM 15 0-1024" umwandelt
Warum den Umgang über ein dummy? Da könnte man direkt im DOIF mit einem Reading machen. Das ist nur ein Dreisatz oder?
Hallo Zusammen,
danke amenomade und einigen Stunden rum probieren, hab ich nun meine ersten beiden (komplexeren) DOIFs hinbekommen.
1. Ein DOIF das mit aus meinem Steuer Dummy (off bzw 10 bis 100%) mein PWM bzw. Schaltsignal erzeugt
2. Ein DOIF, dass auf Basis des aktuellen Stromverbrauchs, meine "Steuer Dummy" regelt bzw. an und abschaltet (Regelung erfolg von 10%-100%, bevor abgeschaltet wird, muss 60sek nicht bezogen werden, bevor eingeschaltet wird muss 30sek Strom bezogen werden).
Hier nun die beiden DOIFs
Internals:
DEF ([SpeicherOutput:state] ne "off" and [Stromzaehler:power] > 10 and [SpeicherOutput:state:d0] < 100 and ([Stromzaehler:power:d0] / 3 + [SpeicherOutput]) >100) (set SpeicherOutput 100)
DOELSEIF
([SpeicherOutput:state] ne "off" and [Stromzaehler:power] > 10 and [SpeicherOutput:state:d0] < 100) (set SpeicherOutput {([Stromzaehler:power:d0] / 3 + [SpeicherOutput:state:d0])})
DOELSEIF
([SpeicherOutput:state] ne "off" and [Stromzaehler:power] < -50 and [SpeicherOutput:state:d0] <= 10) (set SpeicherOutput off)
DOELSEIF
([SpeicherOutput:state] ne "off" and [Stromzaehler:power] < -10 and [SpeicherOutput:state:d0] > 6 and ([Stromzaehler:power:d0] / 3 + [SpeicherOutput:state:d0]) < 10) (set SpeicherOutput 10)
DOELSEIF
([SpeicherOutput:state] ne "off" and [Stromzaehler:power] < -6 and [SpeicherOutput:state:d0] > 10) (set SpeicherOutput {([Stromzaehler:power:d0] / 3 + [SpeicherOutput:state:d0])})
DOELSEIF
([SpeicherOutput:state] eq "off" and [Stromzaehler:power] > 50) (set SpeicherOutput 50)
FUUID 5eee55b3-f33f-2d68-f98e-636990ce3ecde99e
MODEL FHEM
NAME SpeicherOutput_Controlldoif
NOTIFYDEV global,SpeicherOutput,Stromzaehler
NR 283
NTFY_ORDER 50-SpeicherOutput_Controlldoif
STATE cmd_2
TYPE DOIF
VERSION 21842 2020-05-02 16:00:20
READINGS:
2020-06-27 21:37:27 Device Stromzaehler
2020-06-27 21:33:13 cmd 2
2020-06-27 21:33:13 cmd_event Stromzaehler
2020-06-27 21:33:13 cmd_nr 2
2020-06-27 21:30:48 e_SpeicherOutput_STATE off
2020-06-27 21:30:48 e_SpeicherOutput_state off
2020-06-27 21:37:27 e_Stromzaehler_power -3
2020-06-27 21:30:32 mode enabled
2020-06-27 21:33:13 state cmd_2
2020-06-27 21:31:22 wait_timer no timer
Regex:
accu:
cond:
SpeicherOutput:
0:
&STATE ^SpeicherOutput$
state ^SpeicherOutput$:^state:
1:
state ^SpeicherOutput$:^state:
2:
state ^SpeicherOutput$:^state:
3:
state ^SpeicherOutput$:^state:
4:
state ^SpeicherOutput$:^state:
5:
state ^SpeicherOutput$:^state:
Stromzaehler:
0:
power ^Stromzaehler$:^power:
1:
power ^Stromzaehler$:^power:
2:
power ^Stromzaehler$:^power:
3:
power ^Stromzaehler$:^power:
4:
power ^Stromzaehler$:^power:
5:
power ^Stromzaehler$:^power:
attr:
cmdState:
cmdpause:
10
wait:
0:
0
1:
0
2:
60
3:
0
4:
0
5:
30
waitdel:
condition:
0 ::ReadingValDoIf($hash,'SpeicherOutput','state') ne "off" and ::ReadingValDoIf($hash,'Stromzaehler','power') > 10 and ::ReadingValDoIf($hash,'SpeicherOutput','state','','d0') < 100 and (::ReadingValDoIf($hash,'Stromzaehler','power','','d0') / 3 + ::InternalDoIf($hash,'SpeicherOutput','STATE')) >100
1 ::ReadingValDoIf($hash,'SpeicherOutput','state') ne "off" and ::ReadingValDoIf($hash,'Stromzaehler','power') > 10 and ::ReadingValDoIf($hash,'SpeicherOutput','state','','d0') < 100
2 ::ReadingValDoIf($hash,'SpeicherOutput','state') ne "off" and ::ReadingValDoIf($hash,'Stromzaehler','power') < -50 and ::ReadingValDoIf($hash,'SpeicherOutput','state','','d0') <= 10
3 ::ReadingValDoIf($hash,'SpeicherOutput','state') ne "off" and ::ReadingValDoIf($hash,'Stromzaehler','power') < -10 and ::ReadingValDoIf($hash,'SpeicherOutput','state','','d0') > 6 and (::ReadingValDoIf($hash,'Stromzaehler','power','','d0') / 3 + ::ReadingValDoIf($hash,'SpeicherOutput','state','','d0')) < 10
4 ::ReadingValDoIf($hash,'SpeicherOutput','state') ne "off" and ::ReadingValDoIf($hash,'Stromzaehler','power') < -6 and ::ReadingValDoIf($hash,'SpeicherOutput','state','','d0') > 10
5 ::ReadingValDoIf($hash,'SpeicherOutput','state') eq "off" and ::ReadingValDoIf($hash,'Stromzaehler','power') > 50
do:
0:
0 set SpeicherOutput 100
1:
0 set SpeicherOutput {([Stromzaehler:power:d0] / 3 + [SpeicherOutput:state:d0])}
2:
0 set SpeicherOutput off
3:
0 set SpeicherOutput 10
4:
0 set SpeicherOutput {([Stromzaehler:power:d0] / 3 + [SpeicherOutput:state:d0])}
5:
0 set SpeicherOutput 50
6:
helper:
DEVFILTER ^global$|^Stromzaehler$|^SpeicherOutput$
NOTIFYDEV global|Stromzaehler|SpeicherOutput
event 129.129.199.130.3.255: EMH,1.0.0.0.9.255: 06-45-4D-48-01-07-19-80-4D-11,total_consumption: 14611014.2,total_feed: 35136206.7,total_consumption_Ch1: 1287.5,total_feed_Ch1: 35136206.7,total_consumption_Ch2: 14609726.7,total_feed_Ch2: 0,power: -3,129.129.199.130.5.255: 4611-9F0C-C0DF-4091-B0B7-7F6E-E984-96F2-89C3-305D-F7F3-0026-5D56-E11E-97DA-C1DE-E3FD-4DCD-7805-6F59-7428-B477-72E7-40A2-01
globalinit 1
last_timer 0
sleepdevice Stromzaehler
sleepsubtimer -1
sleeptimer -1
timerdev Stromzaehler
timerevent 129.129.199.130.3.255: EMH,1.0.0.0.9.255: 06-45-4D-48-01-07-19-80-4D-11,total_consumption: 14611014.2,total_feed: 35136206.7,total_consumption_Ch1: 1287.5,total_feed_Ch1: 35136206.7,total_consumption_Ch2: 14609726.7,total_feed_Ch2: 0,power: 29,129.129.199.130.5.255: 4611-9F0C-C0DF-4091-B0B7-7F6E-E984-96F2-89C3-305D-F7F3-0026-5D56-E11E-97DA-C1DE-E3FD-4DCD-7805-6F59-7428-B477-72E7-40A2-01
triggerDev Stromzaehler
timerevents:
129.129.199.130.3.255: EMH
1.0.0.0.9.255: 06-45-4D-48-01-07-19-80-4D-11
total_consumption: 14611014.2
total_feed: 35136206.7
total_consumption_Ch1: 1287.5
total_feed_Ch1: 35136206.7
total_consumption_Ch2: 14609726.7
total_feed_Ch2: 0
power: 29
129.129.199.130.5.255: 4611-9F0C-C0DF-4091-B0B7-7F6E-E984-96F2-89C3-305D-F7F3-0026-5D56-E11E-97DA-C1DE-E3FD-4DCD-7805-6F59-7428-B477-72E7-40A2-01
timereventsState:
129.129.199.130.3.255: EMH
1.0.0.0.9.255: 06-45-4D-48-01-07-19-80-4D-11
total_consumption: 14611014.2
total_feed: 35136206.7
total_consumption_Ch1: 1287.5
total_feed_Ch1: 35136206.7
total_consumption_Ch2: 14609726.7
total_feed_Ch2: 0
power: 29
129.129.199.130.5.255: 4611-9F0C-C0DF-4091-B0B7-7F6E-E984-96F2-89C3-305D-F7F3-0026-5D56-E11E-97DA-C1DE-E3FD-4DCD-7805-6F59-7428-B477-72E7-40A2-01
triggerEvents:
129.129.199.130.3.255: EMH
1.0.0.0.9.255: 06-45-4D-48-01-07-19-80-4D-11
total_consumption: 14611014.2
total_feed: 35136206.7
total_consumption_Ch1: 1287.5
total_feed_Ch1: 35136206.7
total_consumption_Ch2: 14609726.7
total_feed_Ch2: 0
power: -3
129.129.199.130.5.255: 4611-9F0C-C0DF-4091-B0B7-7F6E-E984-96F2-89C3-305D-F7F3-0026-5D56-E11E-97DA-C1DE-E3FD-4DCD-7805-6F59-7428-B477-72E7-40A2-01
triggerEventsState:
129.129.199.130.3.255: EMH
1.0.0.0.9.255: 06-45-4D-48-01-07-19-80-4D-11
total_consumption: 14611014.2
total_feed: 35136206.7
total_consumption_Ch1: 1287.5
total_feed_Ch1: 35136206.7
total_consumption_Ch2: 14609726.7
total_feed_Ch2: 0
power: -3
129.129.199.130.5.255: 4611-9F0C-C0DF-4091-B0B7-7F6E-E984-96F2-89C3-305D-F7F3-0026-5D56-E11E-97DA-C1DE-E3FD-4DCD-7805-6F59-7428-B477-72E7-40A2-01
internals:
all SpeicherOutput:STATE
readings:
all SpeicherOutput:state Stromzaehler:power
trigger:
uiState:
uiTable:
Attributes:
cmdpause 10
do always
wait 0:0:60:0:0:30
Internals:
CFGFN
DEF ([SpeicherOutput:state] eq "off") (set ESP gpio 16 off) DOELSEIF ([SpeicherOutput:state] ne "off") ((set ESP gpio 16 on), (set ESP pwm 15 {(1020 -([SpeicherOutput:state:d1] - 10)*11.3)}))
FUUID 5ef3c137-f33f-2d68-22d8-561fa4e351f3576c
MODEL FHEM
NAME SpeicherOutput_PWMdoif
NOTIFYDEV SpeicherOutput,global
NR 11875
NTFY_ORDER 50-SpeicherOutput_PWMdoif
STATE cmd_2
TYPE DOIF
VERSION 21842 2020-05-02 16:00:20
READINGS:
2020-06-27 21:33:13 Device SpeicherOutput
2020-06-27 21:33:13 cmd 2
2020-06-27 21:33:13 cmd_event SpeicherOutput
2020-06-27 21:33:13 cmd_nr 2
2020-06-27 21:33:13 e_SpeicherOutput_state 42.6666666666667
2020-06-24 23:34:47 mode enabled
2020-06-27 21:33:13 state cmd_2
Regex:
accu:
cond:
SpeicherOutput:
0:
state ^SpeicherOutput$:^state:
1:
state ^SpeicherOutput$:^state:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'SpeicherOutput','state') eq "off"
1 ::ReadingValDoIf($hash,'SpeicherOutput','state') ne "off"
do:
0:
0 set ESP gpio 16 off
1:
0 (set ESP gpio 16 on), (set ESP pwm 15 {(1020 -([SpeicherOutput:state:d1] - 10)*11.3)})
2:
helper:
DEVFILTER ^global$|^SpeicherOutput$
NOTIFYDEV global|SpeicherOutput
event 42.6666666666667
globalinit 1
last_timer 0
sleeptimer -1
timerdev SpeicherOutput
timerevent 42.6666666666667
triggerDev SpeicherOutput
DOIF_eventa:
cmd_nr: 2
cmd: 2
cmd_event: SpeicherOutput
cmd_2
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: SpeicherOutput
state: cmd_2
timerevents:
42.6666666666667
timereventsState:
state: 42.6666666666667
triggerEvents:
42.6666666666667
triggerEventsState:
state: 42.6666666666667
internals:
readings:
all SpeicherOutput:state
trigger:
uiState:
uiTable:
Attributes:
checkall event
do always
readingList [SpeicherOutput:state]
Viele Grüße,
Simon