Fehlermeldungen im Script

Hallo Gemeinde,

jetzt wirds peinlich (für mich).

Ein Freund hat mir damals geholfen ein Stromerfassungs Script zu schreiben…ok, nicht geholfen, er hat es
alleine geschrieben…

Nun über die Jahre hagelt es immer mehr Fehlermeldungen, und ich will die mal ausmerzen…

Könnt ihr mir hier einen Tip geben ?
Der gleiche Fehler kommt in verschiedenen Scripten vor…

Hier:

$zaehlerGesamt[$i]+=$months[$ii+$i*12];

oder hier:

$zaehlerGesamtKosten[$i]+=$monthsKosten[$ii+$i*12];

Fehlermeldung:

Notice: a non well formed numeric value encountered in........

Ich wäre da über einen kleinen Lösungsvorschlag sehr dankbar :slight_smile:

LG
Sascha

Hallo,

das ist so schwer zu sagen, wo der Fehler liegt, ohne den Code insgesamt zu kennen.

Die Meldung besagt ja, das ein numerischer Wert erwartet wurde, aber nicht vorhanden ist.

Und jeder der beteiligten Variablen könnte das sein
$i und $ii werden in der Berechnung des Index der Arrays verwendet, und mit den Array-Elemente selbst wird ja eine Addition durchgeführt.

Das könnten z.B. vorher nicht auf 0 initialisierte Variablen sein oder nicht vorhandenen und damit nicht initialisierte Array-Elemente.

Ich würde in das Script einbauen, das alle betroffenen Variablen (i & ii) ausgegeben werden und auch die Arrays

so etwa


echo "i=$i, ii=$ii" . PHP_EOL;
echo "zaehlerGesamt=" . print_r($zaehlerGesamt, true) . PHP_EOL;

usw…

und dann sieht man ja, welchen Wert die Variablen haben und wo man im Code ansetzen muss.

Das hat vermutlich damit zu tun, das mit IPS 5 ja php 7.2 zum Einsatz kommt und da deutlich bessere Absicherung und strikteres Typchecking vorhanden ist …

demel

Aber bitte nicht mit Echo oder Print_r.
Da wird weder der Datentyp ausgegeben, noch der eigentliche Rohwert.
So wird z.b. bei Float die local mit Komma benutzt.
Var_dump ist da zum debbugen besser geeignet.
Michael

ok…danke für die hilfreichen Antworten !

Also rührt der Fehler Hauptsächlich daher, das die Variablen nicht anständig initialisiert wurden ?
Das würde ich ja einfach in den Griff bekommen :slight_smile:

Ich versuch mich mal daran :slight_smile:

LG
Sascha

Nein nicht zwangsläufig, sie kommt daher weil eine Variable irgendwann für eine Berechnung benutzt wird, obwohl sie gar keine Zahl enthält (sondern z.b. ein String).
Michael

oh…ok…na das kann ja ne suche werden…das sind sehr viele einzelscripte, die immer wieder über „include“ zusammengeführt werden…puh…da hab ich ja was vor mir :slight_smile:
Leider sind diese scripte nicht von mir selber geschrieben…

LG
Sascha

oha…das übersteigt gerade mein Können :frowning:

Der Fehler:

A non well formed numeric value encountered in.....

kommt in Zeile:
52
55
59

Ich weiß gerade gar nicht, wo ich anfangen soll…
Der Author des Scripts ist leider nicht mehr greifbar…
Meine Stromerfassung steht gerade still…
Meine Frau will dadurch die Scheidung (na gut, das war jetzt übertrieben :), alles in Ordnung bei uns :))

Kann man hier schon mehr sehen, woran es liegen könnte, bzw. wie man es wieder zum laufen bringt ?
(ich habe die betroffenen Zeilen mal kommentiert…)

<? include(IPS_GetScriptFile(20872 /*[Unsere Wohnung\Stromkostenerfassung_V3.4_Programm\Konfig]*/ ));include(IPS_GetScriptFile(36055 /*[Unsere Wohnung\Stromkostenerfassung_V3.4_Programm\IDs]*/ ));date_default_timezone_set("Europe/Berlin");$monthsNeu="";$monthsKostenNeu="";$counterVarArray=explode(" ",getValue($counterVarID));$zaehlerJahresEndStandArray=explode(" ",getValue($zaehlerJahresEndStandID));
$aktuell=range(0,$nZaehler-1);for($i=0;$i<$nZaehler;$i++){$aktuell[$i]=($counterVarArray[$i]-$zaehlerJahresEndStandArray[$i])/1000;}$mon=getdate()["mon"];$months=explode(" ",getValue($monateID));$monthsKosten=explode(" ",getValue($monateKostenID));
for($i=0;$i<$nZaehler;$i++){
	$months[$mon-1+$i*12]=$aktuell[$i];
	for($ii=$i*12;$ii<$mon-1+$i*12;++$ii){
		$months[$mon-1+$i*12]-=abs($months[$ii]);
	}
	$months[$mon - 1 + $i*12] *= $zaehlerTyp[$i];
}
for($i = 0; $i < $nZaehler; $i++){
	// Monatswerte
	for($ii = 0; $ii < 12; $ii++){
		if($i == $nZaehler-1 && $ii == 11){
			$monthsNeu .= $months[$ii + $i*12];

			if($ii == $mon-1){
			   if($zaehlerTyp[$i] == 1){
					$monthsKostenNeu .= $months[$ii + $i*12]*$kWh_p;
				}
				else{
					$monthsKostenNeu .= $months[$ii + $i*12]*$kWh_p_v;
				}
			}
			else{
				$monthsKostenNeu .= $monthsKosten[$ii + $i*12];
			}
		}
		else{
			$monthsNeu .= $months[$ii + $i*12]." ";

			if($ii == $mon-1){
			   if($zaehlerTyp[$i] == 1){
			      $monthsKostenNeu .= $months[$ii + $i*12]*$kWh_p." ";
				}
				else{
			      $monthsKostenNeu .= $months[$ii + $i*12]*$kWh_p_v." ";
				}
			}
			else{
				$monthsKostenNeu .= $monthsKosten[$ii + $i*12]." ";
			}
		}
	}
}
$months=explode(" ",getValue($monateID));
$monthsKosten=explode(" ",getValue($monateKostenID));
$zaehlerGesamt=range(0,$nZaehler-1);
$zaehlerGesamtKosten=range(0,$nZaehler-1);
for($i=0;$i<$nZaehler;$i++)
{$zaehlerGesamt[$i]=0;
for($ii=0;$ii<12;++$ii)
{$zaehlerGesamt[$i]+=$months[$ii+$i*12];} // Fehler
$zaehlerGesamtKosten[$i]=0;
for($ii=0;$ii<12;++$ii)
{$zaehlerGesamtKosten[$i]+=$monthsKosten[$ii+$i*12];}} // Fehler
$sums=range(0,11);for($i=0;$i<12;++$i){(float)$sums[$i]=0;}
for($i=0;$i<12;++$i)
{for($ii=0;$ii<$nZaehler;++$ii)
{$sums[$i]+=$months[12*$ii+$i];}} // Fehler
$sumsKosten=range(0,11);
for($i=0;$i<12;++$i)
{(float)$sumsKosten[$i]=0;}
for($i=0;$i<12;++$i)
{for($ii=0;$ii<$nZaehler;++$ii)
{$sumsKosten[$i]+=$monthsKosten[12*$ii+$i];}}
$overallSum=0;for($i=0;$i<12;++$i)
{$overallSum+=$sums[$i];}$overallSumKosten=0;
for($i=0;$i<12;++$i)
{$overallSumKosten+=$sumsKosten[$i];}
(float)$nDay=(getdate()["0"]-getValue($jahresAnfangsZeitID))/60/60/24;
$zaehlerGesamtDurchschnitt=range(0,$nZaehler-1);
for($i=0;$i<$nZaehler;$i++)
{$zaehlerGesamtDurchschnitt[$i]=$zaehlerGesamt[$i]/$nDay;}
$zaehlerGesamtKostenDurchschnitt=range(0,$nZaehler-1);
$zaehlerGesamtKostenDurchschnitt=range(0,$nZaehler-1);
for($i=0;$i<$nZaehler;$i++)
{$zaehlerGesamtKostenDurchschnitt[$i]=$zaehlerGesamtKosten[$i]/$nDay;}
$overallSumDurchschnitt=$overallSum/$nDay;$overallSumKostenDurchschnitt=$overallSumKosten/$nDay;
$zaehlerTagesEndStandArray=explode(" ",getValue($zaehlerTagesEndStandID));

$tagesverbrauch = range(0, $nZaehler-1);
for($i = 0; $i < $nZaehler; $i++){
	$tagesverbrauch[$i] = (($counterVarArray[$i] - $zaehlerTagesEndStandArray[$i])/1000)*$zaehlerTyp[$i];
}

$tagesverbrauchKosten = range(0, $nZaehler-1);
for($i = 0; $i < $nZaehler; $i++){
	if($zaehlerTyp[$i] == 1){
		$tagesverbrauchKosten[$i] = $tagesverbrauch[$i]*$kWh_p;
	}
	else{
  		$tagesverbrauchKosten[$i] = $tagesverbrauch[$i]*$kWh_p_v;
	}
}

$tagesSumme = 0;
$tagesSummeKosten = 0;
for($i = 0; $i < $nZaehler; $i++){
	$tagesSumme += $tagesverbrauch[$i];
	$tagesSummeKosten += $tagesverbrauchKosten[$i];
}


$erwarteterJahresverbrauch=$overallSum/$nDay*365*$anzahlErwarteterMonate/12;$erwarteterJahresverbrauchKosten=$overallSumKosten/$nDay*365*$anzahlErwarteterMonate/12;$erwartetetRueckzahlung=$anzahlErwarteterMonate*$monatsAbschlag+$extraAbschlag-$anzahlErwarteterMonate*$monatlicheGrundgebuehr-$overallSumKosten/$nDay*365*$anzahlErwarteterMonate/12;if($nDay>1){setValue($erwarteteRueckzahlungID,$erwartetetRueckzahlung);setValue($erwarteterJahresverbrauchID,$erwarteterJahresverbrauch);setValue($erwarteterJahresverbrauchKostenID,$erwarteterJahresverbrauchKosten);}setValueString($monateID,$monthsNeu);setValueString($monateKostenID,$monthsKostenNeu)
;//echo("test");
?>

Schönen Sonntag, und danke für eure Hilfe !
Sascha

Hallo
$months wird in Zeile 45 als String erstellt.
Du brauchst zum addieren in Zeile 52 aber ein Integer.
Probier mal statt zB in Zeile 52 statt

$zaehlerGesamt[$i]+=$months[$ii+$i*12];} // Fehler

das

$zaehlerGesamt[$i]+=intval($months[$ii+$i*12]);} // Fehler

intval konvertiert von String nach Integer
http://php.net/manual/de/function.intval.php

Super…das scheint es zu sein !!!
leider brauche ich anscheinend eine Float und keine Integer…
Gibt es sowas auch um aus einem String eine Float zu machen ?

LG
Sascha

P.s.: Ich hab mal todesmutig „floatval“ benutzt…das scheint zu gehen :slight_smile:

Genau richtig
http://php.net/manual/de/function.floatval.php

Leider funktionieren die scripte noch nicht richtig…
anscheinend brauche ich manchmal ein integer und manchmal eine float…puh…
da kostet wieder nerven…
Das EINZIGE Script auf dem Server, was nicht von mir ist :frowning:
Nicht das meine immer fehlerfrei laufen…aber bei meinen finde ich wenigstens die Fehler :slight_smile:

Aber dieses Stromscript is so aufgeblasen…schwer(für mich), da den Fehler zu finden…

LG
Sascha

au Backe…

Hallo Gemeinde,

das glaubt mir keiner…ich hab eine Änderung im Script versucht, hat nicht geklappt…hab sie wieder rückgängig gemacht und seitdem einen völlig neuen fehler in dem Script bekommen…ok…um die Wahrheit zu sagen…ich zweifel natürlich erstmal an mir gerade…

Könnt ihr mir einen Tip geben, wo ich hier nach dem Fehler suchen muss, bzw wie die Lösung aussehen könnte ?

(ich stolper da immer noch durch mein Stromerfassungs Script, was nicht von mir geschrieben wurde :()

Vielen lieben Dank,
Sascha

for($i=0;$i<$nZaehler;$i++){
	$months[$mon-1+$i*12]=$aktuell[$i];
	for($ii=$i*12;$ii<$mon-1+$i*12;++$ii){
		$months[$mon-1+$i*12]-=abs($months[$ii]); // Hier wir der Fehler erkannt
	}
	$months[$mon - 1 + $i*12] *= $zaehlerTyp[$i];
}
Undefined offset 1 in C:..... on line 21 

Hallo Sascha,

ich kann Dir zwar momentan nicht helfen, aber Du würdest den Lesern Deiner Beiträge extrem helfen, wenn Du mal Deine Tastatur überprüft, da scheint etwas mit dem Punkt nicht in Ordnung zu sein. Es erscheinen immer so viele Punkte … … …
Dankeschön!

Ich kenne zwar das Skript nicht, aber das Minus an der Stelle passt bestimmt nicht.

Gesendet von iPhone mit Tapatalk

Wenn Du das Skript nicht kennst, warum soll -= an der Stelle dann „bestimmt nicht“ passen :confused:

PHP: Zuweisungsoperatoren - Manual

Nur cool bleiben, nun sehe ich es auch.

Kannst Dich ja weiter mit den Punkten unterhalten. Vielleicht findest Du ja noch ein d. [emoji6]

Gesendet von iPhone mit Tapatalk

Die Fehlermeldung klingt so, als wäre dein $months-Array leer oder habe nur ein Element. Die Schleife geht aber weiter und der Index 1 existiert halt nicht. Wie sieht das Array denn aus? Gebe es sonst einfach mal per var_dump aus oder zeige uns den Code, der das Array generiert.

ok, vielen Dank für die Antworten.

Ich bin gerade auf dem Sprung, werde heute Abend das Array mal „dumpen“.
Ich meld mich dann, wie es gelaufen ist.

Auf jeden Fall schon mal vielen Dank für die Hilfe !

LG
Sascha