Ich krieg ein Script nicht zum laufen

Hallo, ich kommen einfach nicht weiter.
Wenn ich den GetURL Link mauell aufrufe funktioniert das Umschalten.
Aber das Script macht nichts, wenn die Änderungen anstehen.
Er holt den wirklichen Zustand des Emetersi n die Variable 18901, aber wenn ich die wieder Einlese als $EMeter_Zustand ändert sich da nichts.

Der Erklärtext des Herstellers:


Emeter-Simulation
=================

Befehl zur Zustandsabfrage
---------------------------

    HTTP-Request:
    `http://localhost:8008/?Emeter`

    Ergebnis-String (z.Bsp.):
    `Emeter=off`


Befehl zum Setzen der Simulationsart
------------------------------------

    `http://localhost:8008/?Emeter=MODUS`

    wobei **MODUS** zu ersetzen ist durch
    - `off` = E-Meter-Simulation AUS                         
    - `1`   = real gemessene Daten senden 

Wo ist mein Fehler?
Bernd

SetValueString(18901, Sys_GetURLContent("http://192.168.6.14:8008/?Emeter"));
$EMeter_Zustand = GetValueString (18901);
If (($BHKW_Betrieb == True) and ($SOC_Batt > 40) and ($EMeter_Zustand == 'Emeter=1')) 
   {Sys_GetURLContent("http://192.168.6.14:8008/?Emeter=off");
   SetValueBoolean(54839, false);}

If (($BHKW_Betrieb == False) and ($EMeter_Zustand == 'Emeter=off')) 
   {Sys_GetURLContent("http://192.168.6.14:8008/?Emeter=1");
      SetValueBoolean(54839, true);}

$EMeter_Zustand = GetValueString (18901);
$EmeterBPR = GetValueBoolean (54839);
echo "18901 = ".$EMeter_Zustand." \r\n";
echo "54839 = ".$EmeterBPR." \r\n";

18901 = Emeter=1 
54839 = 1 

Sind diese Bedingungen überhaupt erfüllt, damit er ausschalten kann?

Um eine Änderung zu sehen, muss man dan nicht nochmal den Status mit ?Emeter abfragen? Nur den erstmalig gespeicherten Wert der Variable auszugeben war doch nicht das Ziel, oder? GGfls muss man auch noch eine gewisse Zeit warten, bis der Befehl ausgführt ist.

BTW: $BHKW_Betrieb == True/False läßt sich ersetzen durch ($BHKW_Betrieb) bzw (!$BHKW_Betrieb), ansonste besser 3 === verwenden, damit auch der Typ passt

Beide Bedingungen sind erfüllt und ohne die EMeter variable wird das Emeter auch ausgeschaltet.
Aber so wird jedes mal wenn das Script abläuft, der Befehl zum Emeter gesendet.
Das würde ich gerne abfangen.
mit den === hat es auch nicht funktioniert.

Der Witz ist ja das
SetValueString(18901, Sys_GetURLContent("http://192.168.6.14:8008/?Emeter"));
die Variable entsprechend des Zustands des EMeters füllt, aber in der IF Zeile wird es nicht ausgewertet.
Ratlos.

Ich gehe davon aus, dass deine Variable $EMeter_Zustand nicht den Wert hat, den du erwartest.
Gib den Inhalt mal direkt am Anfang vor dem ersten if aus und nicht nur am Schluss.

Wieso schreibst du den Wert überhaupt in eine IPS-Variable und liest ihn anschließend sofort wieder aus? Speichere den Wert doch in einer PHP-Variable und arbeite mit dieser. Daraus kannst du ihn ja immer noch in eine IPS-Variable schreiben, wenn du ihn peristent brauchst.

Ich vermute, dass die IPS-Variable einfach nicht so schnell aktualisiert wird und du dir mit $EMeter_Zustand = GetValueString (18901); den alten Wert der Variablen holst, womit deine Bedingung dann nicht erfüllt ist.

Meinst du das so?

SetValueString(18901, Sys_GetURLContent("http://192.168.6.14:8008/?Emeter"));

$EMeter_Zustand = GetValueString (18901);
echo "18901 = ".$EMeter_Zustand." \r\n";

If ((42128 == True) and (31990 > 40) and (18901 == "Emeter=1"))  

Die Echoausgabe wird korrekt mit „18901 = Emeter=1“ ausgelesen.
Die Zeile sieht ansonsten aus wie oben zu sehen.

Ja genau, ich meinte die Ausgabe des Variablenwertes vor dem Betreten des if-Zweigs.
Dann scheint der Wert ja zu passen.

Die if-Bedingung selbst funktioniert so mit den IDs natürlich nicht mehr, aber das ist denke ich klar.

Was passiert denn, wenn du die ersten beiden Klammern der ursprünglichen Bedingung beibehältst und nur den letzten Teil durch true ersetzt. Geht er dann immer in den Zweig?

Also so:

if (($BHKW_Betrieb == True) and ($SOC_Batt > 40) and (true)) 

Also bei mir funktioniert es mit den IDs
Er schaltet aber jetzt immer aus wenn ich (Ture) als letztes stehen habe, auch wenn die beiden vorherigen nicht stimmen.

Ich muss das noch mal in Ruhe prüfen, melde mich wieder

Ja klar funktioniert das, weil 42128 IMMER zu true ausgewertet wird (außer du nutzt als Operator ===) und 31990 IMMER größer als 40 ist. Nur macht das in deinem Kontext absolut keinen Sinn, denn du willst ja die Werte der Variablen vergleichen. Du musst dir die also schon irgendwo mit GetValue() her holen.

Das liegt an dem, was ich zuvor geschrieben habe.
Wenn du die Variablenwerte vergleichst (Inhalt vorher mit GetValue() holen) und die Bedingung dann mit dem letzten true immer noch erfüllt ist, dann stimmt irgendwas mit deinem Wert von $EMeter_Zustand nicht. Vielleicht steckt da noch irgendwo ein Leerzeichen, Steuerzeichen o.ä. im String, was zu mit der Echo-Ausgabe nicht siehst.

Okay, verstanden, ist geändert.
In der Variablen die ich mit

SetValueString(18901, Sys_GetURLContent("http://192.168.6.14:8008/?Emeter"));

fülle steht „Emeter=1“ , wenn ich mir die mit Objekt bearbeiten ansehe.
Kein Leerzeichen oder anders kann ich erkennen, kann ich mir sonst den Wert anders anzeigen lassen?

Ich habe testweise das ($BHKW_Betrieb == True) auf False gesetzt, dann schaltet er den EMeter aus.
Kann ich in dessen Programm auch sehen.
Allerdings das wieder zurück schalten auf ein, funktioniert nicht, wenn ich dort false oder
($EMeter_Zustand == „Emeter=off“)) verwende.

SetValueString(18901, Sys_GetURLContent("http://192.168.6.14:8008/?Emeter"));
$EMeter_Zustand = GetValueString (18901);
echo "18901 = ".$EMeter_Zustand." \r\n";

if (($BHKW_Betrieb == True) and ($SOC_Batt > 40) and (true)) 
 {Sys_GetURLContent("http://192.168.6.14:8008/?Emeter=off");
 SetValueBoolean(54839, false);}

If (($BHKW_Betrieb == false) and (false))
   {Sys_GetURLContent("http://192.168.6.14:8008/?Emeter=1");
      SetValueBoolean(54839, true);}

SetValueString(18901, Sys_GetURLContent("http://192.168.6.14:8008/?Emeter"));
$EMeter_Zustand = GetValueString (18901);
echo "18901-2 = ".$EMeter_Zustand." \r\n";

Bernd

Steuerzeichen würdest du nicht sehen, wenn du die Variable in der Konsole editierst, Leerzeichen schon.

Du könntest mal var_dump($EMeter_Zustand) oder echo (int)ctype_print($EMeter_Zustand); aufrufen. Dann siehst du die Länge des Strings bzw. kommt beim zweiten Befehl 0 raus, wenn irgendwelche Steuerzeichen enthalten sein sollten.

Was meinst du damit? Hast du ($BHKW_Betrieb == True) durch (false) ersetzt oder ($BHKW_Betrieb == True) durch ($BHKW_Betrieb == false)?

Im ersten Fall wäre die Bedingung niemals erfüllt und es koönnte somit auch nichts ausgeschaltet werden, im zweiten Fall würde es bedeuten, dass der Wert deiner Variablen $BHKW_Betrieb nicht dem entspricht, was du erwartest. Dann wäre aber die Bedingung nach der tommi bereits gefragt hat nicht erfüllt.

Es ist anhand dieses Code-Auschnitts wirklich nicht leicht das Problem nachzuvollziehen, da man nicht weiß, wie und wann du die Variablen befüllst.

Führe mal deinen ursprünglichen Code aus und setze vor die erste if-Anweisung folgenden Code und poste mal den Output und was du bei der Ausführung erwartet hättest.

var_dump($BHKW_Betrieb);
var_dump($SOC_Batt);
var_dump($EMeter_Zustand);

Vielleicht kommen wir dann weiter.

Das gesamte Script sieht so aus.
Ich habe ($BHKW_Betrieb == True) durch ($BHKW_Betrieb == false) ersetzt

<?
$PVPrognose = GetValueFloat (57135);
$PVLeistung = GetValueFloat (21863);
$Puffer_Energie = GetValueFloat(36264);
$Puffer_oben = GetValueFloat(46196);
$BHKW_Betrieb = GetValueBoolean (42128);
$SOC_Batt = GetValueInteger (31990);
$HZStab = GetValueBoolean (34195);

SetValueString(18901, Sys_GetURLContent("http://192.168.6.14:8008/?Emeter"));
$EMeter_Zustand = GetValueString (18901);
echo "18901 = ".$EMeter_Zustand." \r\n";

if (($BHKW_Betrieb == True) and ($SOC_Batt > 40) and (true)) 
 {Sys_GetURLContent("http://192.168.6.14:8008/?Emeter=off");
 SetValueBoolean(54839, false);}

If (($BHKW_Betrieb == false) and ($EMeter_Zustand == "Emeter=off"))
   {Sys_GetURLContent("http://192.168.6.14:8008/?Emeter=1");
      SetValueBoolean(54839, true);}

SetValueString(18901, Sys_GetURLContent("http://192.168.6.14:8008/?Emeter"));
$EMeter_Zustand = GetValueString (18901);
echo "18901-2 = ".$EMeter_Zustand." \r\n";

var_dump($BHKW_Betrieb);
var_dump($SOC_Batt);
var_dump($EMeter_Zustand);

Ausgabe

18901 = Emeter=1
18901-2 = Emeter=1
bool(false)
int(100)
string(10) "Emeter=1
"

Sorry hatte übersehen das es vor das if sollte
dann kommt das raus

18901 = Emeter=1

bool(false)
int(100)
string(10) "Emeter=1

"
18901-2 = Emeter=1

In der HTML Ansicht ist hinter 1 noch ein Leerzeichen

18901 = Emeter=1 bool(false) int(100) string(10) "Emeter=1 " 18901-2 = Emeter=1 

Na dann ist klar, wieso es nicht funktioniert:

  1. $BHKW_Betrieb hat den Wert false, somit wird die Bedingung schon mal nicht erfüllt.
  2. $EMeter_Zustand enthält, wie bereits vermutet, zwei Steuerzeichen (vermutlich \r\n), sodass dein String-Vergleich IMMER zu false ausgewertet wird und die Bedingung somit nie erfüllt ist.

Das kann also nicht funktionieren. Du musst prüfen, warum deine erste Variable false ist und aus der Variablen $EMeter_Zustand musst du die Steuerzeichen am Ende entfernen oder den Vergleich anders gestalten.

BHKW steht ja auch im Moment.
Der Wert kommt ja aus einem aktiven System.
Ist im Betrieb auch true.
Zum Test Stelle ich die Anfrage dann auf false, solange es steht, oder warte halt was passiert wenn das BHKW läuft.
Mit den Steuerzeichen hinter dem Wert frage ich den Hersteller

Ersetze mal

($EMeter_Zustand == 'Emeter=1')

durch

(trim($EMeter_Zustand) == 'Emeter=1')

Dann sollte es funktionieren.

1 „Gefällt mir“

Scheint zu funktionieren.
Beobachte es weiter

Danke dir.
Hat funktioniert, aus- wie einschalten funktioniert.
Jetzt lasse ich es laufen und schau über die nächsten Laufzeien ob das so bleibt.

Danke nochmals
Bernd