Doif falscher Zweig wird ausgelöst - aber warum?

Begonnen von Chris_XXX, 10 Juli 2021, 08:16:34

Vorheriges Thema - Nächstes Thema

Chris_XXX

Hallo zusammen,
ich komme bei meinem DoIf einfach nicht weiter. Kann mir jemand sagen warum bei dem Wert SolarEdge:Bezug_Einspeisung = -1000 der zweite Zweig, also decr, ausgelöst wird? Aber nur wenn GoECharger:amp_current < GoECharger:amp_max_wallbox aus dem ersten Zweig nicht erfüllt ist?

Internals:
   DEF        ## 1 ## incr
(([SolarEdge:Bezug_Einspeisung:d] lt -700)  ## speist mehr als 700W ins Netz? ## 1 ## incr
and ([GoECharger:car_state] == 2)                          ## beim Laden? 2=Laden 1=nix muss noch geändert werden
and ([GoECharger:allow_charging] == 1) ## Laden ist erlaubt
and ([GoECharger:amp_current] < [GoECharger:amp_max_wallbox]))    ## akt. Ladestrom < max?
  (set GoECharger amp_current [GoECharger:amp_current:d:$1+1])
##
## 2 ## decr
DOELSEIF (([SolarEdge:Bezug_Einspeisung:d] gt -300)
and ([GoECharger:car_state] == 2)
and ([GoECharger:allow_charging] == 1)
and ([GoECharger:amp_current] > 6))
  (set GoECharger amp_current [GoECharger:amp_current:d:$1-1])
DOELSE
  ()
   FUUID      5fa3a6e0-f33f-4f30-6997-3cbc50a3172ae99a
   MODEL      FHEM
   NAME       di_GoE_max_PV_ohne_aus
   NOTIFYDEV  global
   NR         301
   NTFY_ORDER 50-di_GoE_max_PV_ohne_aus
   STATE      deactivated
   TYPE       DOIF
   VERSION    24643 2021-06-16 07:26:15
   READINGS:
     2021-07-07 16:54:51   mode            deactivated
     2021-07-07 16:54:51   state           deactivated
   Regex:
   attr:
     cmdState:
       0:
         incr
       1:
         decr
     repeatcmd:
       30
       10
       30
     repeatsame:
     wait:
     waitdel:
   condition:
   do:
     0:
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   cmdState   incr|decr
   comment    1Phasig Ampere 230V*A=kw
6A=1,38, 7A=1,6, 8A=1,85, 9A=2 10A=2,3 \
11A=2,5, 12A=2,76, 13A=3, 14A=32,
15A=3,45, 16A=3,68 \
3Phasig Ampere*0.69=kW \
(6A=4.14, 7A=4.83, 8A=5.52, 9A=6.21, 10A=6.9, \
11A=7.59, 12A=8.28, 13A=8.97, 14A=9.66, \
15A=10.35, 16A=11.04

Ladung wird hier bei zu wenig Strom nicht unterbrochen.
   disable    1
   do         always
   loglevel   0
   repeatcmd  30:10:30
   room       E-Auto


Sobald GoECharger:amp_current = GoECharger:amp_max_wallbox wird mein Ladestrom immer um 1 herunter gesetzt und danach wieder um 1 erhöht.   Ich verstehe es nicht....

Viele Grüße
Christian

Nobbynews

#1
Zitat von: Chris_XXX am 10 Juli 2021, 08:16:34
Internals:
   DEF        ## 1 ## incr
(([SolarEdge:Bezug_Einspeisung:d] lt -700)  ## speist mehr als 700W ins Netz? ## 1 ## incr
and ([GoECharger:car_state] == 2)                          ## beim Laden? 2=Laden 1=nix muss noch geändert werden

##
## 2 ## decr
DOELSEIF (([SolarEdge:Bezug_Einspeisung:d] gt -300)
and ([GoECharger:car_state] == 2)

Da Du Zahlen und keine Strings vergleichen möchtest, würde ich aus "lt" ein "<" und aus "gt" ein ">" machen.

Edit:
Hab´s gerde mal simpel getest.
my $a ="-700";
my $a1= -700;
my $b ="-500";
my $b1 = -500;

if ($b lt $a) {
print "Zeichenkette1 $b < $a";}
if ($b gt $a) {
print "Zeichenkette2 $b > als $a";}
print"\n";
if ($b1 < $a1) {
print "Zahlen1 $b < $a";}
if ($b1 > $a1) {
print "Zahlen2 $b1 > $a1";}


Das gibt folgendes Ergebnis:
Zeichenkette1 -500 < -700
Zahlen2 -500 > -700


Und mit my $a ="-700";
my $a1= -700;
my $b ="-1000";
my $b1 = -1000;

das Ergebnis:
Zeichenkette1 -1000 < -700
Zahlen1 -1000 < -700


MadMax-FHEM

#2
Weil du es dem DOIF genau so gesagt hast, zumindest wenn ich das richtig deute... ;)

Der einzige Unterschied (wenn SolarEdge:Bezug_Einspeisung zwischen -700 und -300) bei deinen Zweigen ist doch GoECharger:amp_current

EDIT: hinzu kommt genau was Nobbynews geschrieben hat bzgl. Vergleiche...

Sobald/solange GoECharger:amp_current  kleiner als GoECharger:amp_max_wallbox passt Zweig eins und es wird erhöht.

Ist es gleich GoECharger:amp_max_wallbox, dann passt Zweig zwei, ist ja verm. größer als 6 und wird herunter gezählt.
Dann ist es ja wieder gleich GoECharger:amp_max_wallbox und wird hoch gezählt usw.

Ich nutze kein DOIF aber so sieht es für mich aus...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Chris_XXX

#3
Hallo zusammen,
danke für eure Antworten. Theoretisch soweit halbwegs verständlich. Aber: Das hatte ich schon so. Nach einem Update von Fhem in der Vergangenheit kam es dann auf einmal zu einem Fehler im Doif.
Zitat2021.06.18 13:48:27 3: eval: di_GoE_max_PV: warning in condition c04
2021.06.18 13:48:42 1: PERL WARNING: Argument "" isn't numeric in numeric eq (==) at (eval 6690) line 1.
2021.06.18 13:48:42 3: eval: di_GoE_max_PV: warning in condition c01
2021.06.18 13:48:42 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 6693) line 1.
Daraufhin habe ich auf lt und gt gewechselt. Warum mein Argument nicht numeric ist hab ich ehrlich gesagt nicht vestanden. Könnt ihr vielleicht mein Brett vorm Kopf vertreiben?

Es ist ja auch nicht so dass das ganze gar nicht funktioniert. Prinzipell wird in die richtige Richtung geregelt. Nur ist da ein gewisses pendeln drin.

VG
Christian

Nobbynews

#4
Das Problem mit den warnings habe ich aktuell auch
https://forum.fhem.de/index.php/topic,121971.0.html

Da ich anscheinend damit nicht alleine bin, kommt bei mir langsam der Verdacht auf, dass es sich um ein Problem mit DOIF handeln könnte.


Edit: Mein Problem scheint sich erledigt zu haben. Es lag nicht an DOIF.
Norbert

Damian

Zitat von: Nobbynews am 10 Juli 2021, 13:29:28
Das Problem mit den warnings habe ich aktuell auch
https://forum.fhem.de/index.php/topic,121971.0.html

Da ich anscheinend damit nicht alleine bin, kommt bei mir langsam der Verdacht auf, dass es sich um ein Problem mit DOIF handeln könnte.

Norbert

Das glaube ich nicht, die Warnungen sind reine Perl-Warnungen - dann müsste Perl kaputt sein ;)

Hast du den Filter eingebaut, wie ich dir im Thread vorgeschlagen habe?

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Nobbynews

Zitat von: Damian am 10 Juli 2021, 20:23:30
Hast du den Filter eingebaut, wie ich dir im Thread vorgeschlagen habe?
Nein, habe ich bewusst noch nicht gemacht.
Ich wollte erst einmal einen Durchlauf mit stacktrace und verbose=5 abwarten.

Norbert

Prof. Dr. Peter Henning

Zitatdann müsste Perl kaputt sein

Perl ist schon ziemlich kaputt - aber das sollte den TE nicht davon abhalten, sich die Typologie in Perl mal etwas genauer anzusehen.

Ich kenne jedenfalls ziemlich viele Strings, die kleiner als "-700" sind.

Beispielsweise ergibt auch ("-100" lt "-700) den Wahrheitswert "true".


LG

pah