Hauptmenü

notify Erweitern

Begonnen von mcbuh, 14 Februar 2022, 13:31:31

Vorheriges Thema - Nächstes Thema

mcbuh

Ich stehe etwas auf dem Schlauch.
Habe ein notify, welches abhängig von der Stromeinspeisung meine Wallbox steuern soll.

Folgendes habe ich aktuell:

define Wallbox_ntfy notify Strom:feed_L1.* { if(ReadingsVal("Strom","feed_L1","") <1500) { fhem("set Wallbox amp_current 6") }}

Soweit so gut, dieser Teil funktioniert auch. Ich möchte jetzt noch zusätzlich Wert zwischen 1500-1800 so wie 1800-2200 angeben und damit amp_Current erhöhen.
Kann einer von euch helfen?

Beta-User

https://wiki.fhem.de/wiki/Trick_der_Woche#Struktur_von_.22else_if.22_Verzweigungen

Du musst dabei halt darauf achten, dass die "logische Treppe" in der richtigen Reihenfolge abgegangen wird...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

mcbuh

Meinst du also die Reihenfolge:

<2200
<1800
<1500
???

Oder kann ich auch werte von bis eingeben?

Otto123

#3
Ich denke der Wert steht schon in $EVTPART1?
Dann mach doch einfach so (Code für Raw Definition wegen Zeilenumbruch \):
defmod Wallbox_ntfy notify Strom:feed_L1.* { \
if($EVTPART1 < 1500) { fhem("set Wallbox amp_current 6") }\
if($EVTPART1 >= 1500 && $EVTPART1 < 1800 ) { fhem("set Wallbox amp_current x") }\
if($EVTPART1 >= 1800 && $EVTPART1 < 2200 ) { fhem("set Wallbox amp_current x") }\
}
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Nobbynews

#4
Zitat von: mcbuh am 14 Februar 2022, 13:50:56
Meinst du also die Reihenfolge:
Oder kann ich auch werte von bis eingeben?
Vereinfacht ungefähr so:

... Strom:feed_L1.* {
my $strom = ReadingsNum("Strom","feed_L1","");
my $soll = 0;
if ($strom < 1500 ) {$soll = 6}
elsif ($strom >= 1500 && $strom < 1800) {$soll = 8}
elsif ($strom >= 1800 && $strom < 2200) {$soll = 10}
fhem ("set Wallbox_amp amp_current $soll");
}

Beta-User

Das "else" impliziert bereits, dass die andere Bedingung NICHT eingetreten war, es geht also kürzer:

... Strom:feed_L1.* {
my $strom = ReadingsNum("Strom","feed_L1","");
my $soll = 0;
if ($strom < 1500 ) {$soll = 6}
elsif ($strom < 1800) {$soll = 8}
elsif ($strom < 2200) {$soll =10}
fhem ("set Wallbox_amp amp_current $soll");
}

"and" sollte man auch DIREKT aus dem Perl-Sprachschatz streichen und ALLE "und" und "oder"-Verkettungen ausschließlich symbolisch schreiben (&& bzw. ||).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

mcbuh

Vielen dank für eure Hilfe, werde es heute Abend mal testen. :)

Beta-User

...dann mal viel Erfolg...

Noch ein paar Anmerkungen: $EVTPART1 wie von Otto123 vorgeschlagen ist der "direkte" Weg - vorausgesetzt, da kommt immer eine Zahl in $EVTPART1.

Falls doch via ReadingsNum: Da du keine "Extrapolation" brauchst, sind "einfache Quotes schneller, und wenn man schon numerisch denkt, kann man den Ersatzwert auch numerisch angeben (auch wenn einem Perl das mit "leer" in der Regel nicht übel nimmt und als "unwahr" bewertet):my $strom = ReadingsNum('Strom','feed_L1',0);
Ansonsten musst du noch entscheiden, ob wirklich immer ein Wert gesetzt werden soll (dann kann man das am Ende so wieder zusammenlaufen lassen), oder ob ggf. einfach abgebrochen werden soll.

Hier noch eine Variante, die schlicht nichts macht für den Fall, dass irgendwas überhaupt-nicht-numerisches im Reading steht:
... Strom:feed_L1.* {
my $strom = ReadingsNum('Strom','feed_L1',300000); #alternativ: $EVTPART1
return if $strom >=2200;
my $soll;
if ($strom < 1500 ) {$soll = 6}
elsif ($strom < 1800) {$soll = 8}
elsif ($strom < 2200) {$soll =10}
fhem ("set Wallbox_amp amp_current $soll");
}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Nobbynews

Zitat von: Beta-User am 14 Februar 2022, 15:10:57
Da du keine "Extrapolation" brauchst, sind "einfache Quotes schneller,

fhem ("set Wallbox_amp amp_current $soll");

Dann aber auch:
fhem ('set Wallbox_amp amp_current '.$soll)

Beta-User

...an der Stelle braucht er es aber, und dann finde ich es in Doppelquotes (oder "qq") besser lesbar. Punkt-concats meide ich zwischenzeitlich, wenn es irgend sinnvoll geht.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Nobbynews

Zitat von: Beta-User am 14 Februar 2022, 15:57:39
...an der Stelle braucht er es aber, und dann finde ich es in Doppelquotes (oder "qq") besser lesbar. Punkt-concats meide ich zwischenzeitlich, wenn es irgend sinnvoll geht.
Das Gemeine an dieser Variante ist mMn halt, dass man schnell das nötige Leerzeichen vergisst und sich dann dumm und dämlich sucht.

Und ist es nicht eigentlich die "Interpolation"???

mcbuh

#11
Zitat von: Beta-User am 14 Februar 2022, 14:09:19
Das "else" impliziert bereits, dass die andere Bedingung NICHT eingetreten war, es geht also kürzer:

... Strom:feed_L1.* {
my $strom = ReadingsNum("Strom","feed_L1","");
my $soll = 0;
if ($strom < 1500 ) {$soll = 6}
elsif ($strom < 1800) {$soll = 8}
elsif ($strom < 2200) {$soll =10}
fhem ("set Wallbox_amp amp_current $soll");
}



"and" sollte man auch DIREKT aus dem Perl-Sprachschatz streichen und ALLE "und" und "oder"-Verkettungen ausschließlich symbolisch schreiben (&& bzw. ||).

Nachdem ich am verzweifeln war und feststellen musste, das es 1.500 und nicht 1500 ist, habe ich mich für diesen Weg entschieden. Funktioniert einwandfrei, vielen Dank euch allen

mcbuh

Hier noch mein vollständiges notiy
Strom:feed_L1.* {
my $strom = ReadingsNum("Strom","feed_L1","");
my $soll = 0;
if ($strom < 1.500 ) {$soll = 6}
elsif ($strom < 1.800) {$soll = 7}
elsif ($strom < 2.100) {$soll = 8}
elsif ($strom < 2.300) {$soll = 9}
elsif ($strom < 2.600) {$soll = 10}
elsif ($strom < 2.800) {$soll = 11}
elsif ($strom < 3.100) {$soll = 12}
elsif ($strom < 3.300) {$soll = 13}
elsif ($strom < 3.600) {$soll = 14}
elsif ($strom < 3.800) {$soll = 15}
elsif ($strom < 4.200) {$soll = 16}
fhem ("set Wallbox amp_current $soll");
}

Otto123

#13
Gegenvorschlag :)
Strom:feed_L1.* set Wallbox amp_current {(round $EVTPART1/0.26 , 0)}

Falls die Grenzen ein Problem sind:
Strom:feed_L1.* {my $x = round $EVTPART1/0.26 , 0 ; if($x >= 6 && $x <= 16 ) {fhem("set Wallbox amp_current $x")} }/code]
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz