Komische Daten in Variable seit Update 5.0

Hallo zusammen,

Ich habe letztens Symcon auf 5.0 upgedatet, alles fein, alles gut, leider werden nun 2 Variablen mit einem völlig komischen Wert vollgeschrieben:

2018_09_25_10_24_47_komische Daten1.png

dies ist ein berechneter Prozent-Wert (Eigenverbrauch Aktuell der PV Anlage), der eigentlich sekündlich errechnet wird und über einen Timer mit Script in eine geloggte Variable geschrieben wird.

Nun habe ich in dem Übergabe Script schon gefiltert, alles unter 0 und über 100 -> weg:

$Wert = GetValueFloat(40643);
 if($Wert>=100){
     $Wert = 100;
 }
 elseif($Wert<=0){
     $Wert = 0;
 }
 SetValueFloat(30684,$Wert);

diese werte werden Lustigerweise auch nur ab ca 19:00 abends und 8:00 Morgens geschrieben. und immer der Selbe wert: 2147483647,00

Zu dieser Zeit ist der Wert normal 0,00.

Wenn ich auf der Variable „Nach Referenzen suchen“ klicke kommt nur der Chart, die Archive Instanz und natürlich das Übergabescript.

Selbiges Problem besteht bei der Eigenverbrauchs-Variable in % für den heutigen Tag. Auch hier um die gleiche Zeit und selber Wert: 2147483647,00

auch in dem Berechnungsscript wird alles >=100 und <=0 verworfen:

if($Eigenverbrauchheutepercent>=100){
    $Eigenverbrauchheutepercent=100;
}
elseif($Eigenverbrauchheutepercent<=0){
    $Eigenverbrauchheutepercent=0;
}

Auch hier keine ungewöhnlichen Referenzen zu finden.

leider werden einige Werte am anfang ca 19:00 mit der Funktion „Zeitspanne Löschen“ nicht entfernt, die muss ich immer händisch einzeln löschen.
Was mich hier verwundert, in der Archivverwaltung wird mir der Wert nicht angezeigt. hier steht „0,00“.
Nur über den CSV export wird der wert 2147483647,00 angezeigt.

Ich verstehe die Welt nicht mehr :confused:… kann mir jemand helfen?

danke!

Hast du schon herausfinden können, an welcher Stelle dieser Wert das erste mal auftaucht? Du hast in deinem Ablauf ja mehrere Stufen. Diese kannst du ja mal mit IPS_LogMessage prüfen. Dies würde ich erstmal in deinem Berechnungsskript machen.

Und was genau funktioniert beim Löschen von Datensätzen nicht? Hast du hier ein reproduzierbares Beispiel? Also optimalerweise eine csv-Datei, bei welcher dies bei einer gewissen Zeit immer fehlschlägt?

So komisch ist die Zahl gar nicht. Wenn man sie als HEX sieht
ist es 7FFF FFFF .
Irgendein Ueberlauf in der Berechnung ?

Gesendet von iPad mit Tapatalk

Hi,

vielen Dank für deine Antwort, ich lasse ab jetzt bei Wertabweichung (außerhalb 0-100) den Wert in die LOG Datei schreiben.

Allerdings glaube ich nicht, dass dieser Wert tatsächlich aus der Berechnung stammt. Ich filtere ich ja schon auf den bereich 0-100. Trotzdem taucht dieser Wert auf. :confused:.

Sollte PHP 7 hier anders reagieren, und auch werte unter 0 schreiben, oder die Filterung nicht wirksam sein, kann es ja nicht sein, dass immer genau der selbe wert kommt… der würde sich ja verändern, wehnigstens zu letzter nacht, oder auch zur zweiten Variable, die dieses Phänomen hat.

Eigenverbrauch des Tages wir wiefolgt berechnet:


$ZPVjetzt 							= Getvaluefloat(54096);
$Zpv2200 							= Getvaluefloat(51639);
$ZGL2359 							= GetValueFloat(42484);
$ZGLjetzt 							= GetValueFloat(39466);

$Eigenverbrauchheutepercent 		= round((((($ZPVjetzt-$Zpv2200)-($ZGLjetzt-$ZGL2359))*100)/($ZPVjetzt-$Zpv2200)),2,PHP_ROUND_HALF_DOWN);

if($Eigenverbrauchheutepercent>=100){
    IPS_LogMessage($_IPS['SELF'],"EV % Tag // beträgt nun zuviel: $Eigenverbrauchheutepercent"); 
    $Eigenverbrauchheutepercent=100;
}
elseif($Eigenverbrauchheutepercent<=0){
     IPS_LogMessage($_IPS['SELF'],"EV % Tag // beträgt nun zu wehnig: $Eigenverbrauchheutepercent");
    $Eigenverbrauchheutepercent=0;
}

SetValueFloat(53817,$Eigenverbrauchheutepercent);

Ausschnitt aus dem Script, es wird weit mehr berechnet, €, kwh usw. für den laufenden tag.

das alles wird praktisch aus den Zählerständen berechnet. „ZPV“ heisst Zähler PV und „ZGL“ heisst Zähler Gesamt Lieferung. das andere sind die hilfsvariablen, die um die jeweiligen Uhrzeiten gesetzt werden.

Zum Thema „mehrer Stufen“, die werte kommen als erstes von den Zählern und werden in eine Variable geschrieben, hier sind keine Auffälligkeiten erkennbar. (ist in Graphen leicht zu erkennen).
danach kommt schon dieses berechnungsscript. eventuell die PHP_Round falsch verwendet?

Werde hoffentlich abends dazu kommen, und zu den Fraglichen Zeiten kontrollieren…
Heute nacht war es von 18:53 bis heute 7:22

Zu deiner zweiten Frage, das hat heute mal funktioniert.
bei den letzten malen blieb immer am Anfang und 18:55 Datensätze übrig.

heute gings wieder.

Ich werde mich wieder melden.

Am rande:
Interessant wäre, wenn man im Archiv mitloggen könnte, woher der fragliche wert kommt.
Oder auch beim bearbeiten von scripten, nach dem „Ausführen drücken“ rechts oder unten eine Spalte eingeblendet werden würde, in der alle Werte aller Variablen im Script aufgeführt werden würden.

Lg

hi 1007,

du hast recht, das ist schon komisch…

was meinst du mit Überlauf in der Berechnung? wie kann ich das kontrollieren / herausfinden?
Lasse nun die Laufzeit des Scriptes auch ins log schreiben, evtl findet sich da was…

Danke im voraus…

Servus
was ist wenn die Variable irgendwo zu NaN (not a number) also Unendlich wird ?
Üblicherweise scheiten dann die diversen ><= Abfragen.

Also probiere entweder per PHP zu überprüfen ob es eine vailde Float/Zahl ist.
das ist aber blöd zu debuggen, da du den fehlerfall ja nciht exakt reproduzieren kannst.
Also mach es umgekehrt:
zzt. überschreibst du alles das >100 und <0 ist und prüfst dann aber nicht weiter. Wenn also ein NaN daherkommt ist keine Bedingung erfüllt und die Zahl wird nicht überschrieben

Besser wird es vielLeicht wenn du abfrägst ob die Zahl >0 UND kleiner <100 ist, und sie erst dann wegschreibst.

gruß
bb

Hi bbernhard,

das ist wirds sein!

ich hatte nicht gewusst, dass es NaN gibt, bzw. habs nicht in Verbindung gebracht.

hab das natürlich gleich geändert. nach kurzem Googlen gibts das auch schöner:
is_nan() prüft ob die zahl NaN ist,
is_finite() prüft ob die Zahl unendlich ist.

ich schließe daraus, dass beides möglich ist, Unendlich und „NaN“.
damit könnte man auch arbeiten.

aber die Prüfung „kleiner 100 UND größer 0“ reicht mir eigentlich aus.

vielen Dank euch beiden für die Hilfe! - und wieder was dazu gelernt!