openWB_math Fehler

Die Verbindung zum Smart Home und Internet der Dinge (IoT)

Moderator: Ulrich

Antworten
limatango
Beiträge: 27
Registriert: Di 8. Nov 2022, 10:27
Hat sich bedankt: 11 Mal
Danksagung erhalten: 3 Mal

openWB_math Fehler

Beitrag von limatango »

Hallo zusammen.

Ich habe mit dem wenigen php-Wissen versucht eine openWB_math (siehe Anhang) für meine Bedürfnisse zu schreiben. Bestimmt kann man die Datei verschlanken und professioneller schreiben, aber zumindest kommen die nötigen Daten bei der openWB an.
Allerdings bekomme ich im php.log folgende Fehlermeldungen:
Bildschirmfoto 2023-04-25 um 09.25.08.png
Hier meine openWB_math:

Code: Alles auswählen

<?php
/*****************************************************************************
// Daten an die openWB Wallbox per MQTT senden.
*****************************************************************************/

$openWB_DB = "master"; // Datenbankname des Wechselrichters

$openWB_MQTT = array();
$timeFilter = " time >= ".strtotime(date("Y-m-d"))."000ms and time <= ".strtotime(date("Y-m-d")." + 1day")."000ms ";

//PV
$Measurement = "PV";
	$sql = urlencode('select * from '.$Measurement.' order by time desc limit 1');
	$ch = curl_init('http://localhost/query?db='.$openWB_DB.'&precision=s&q='.$sql);
		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
		curl_setopt($ch, CURLOPT_TIMEOUT, 15); //timeout in second s
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 12);
		curl_setopt($ch, CURLOPT_PORT, 8086);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		$Ergebnis["result"] = curl_exec($ch);
		$Ergebnis["rc_info"] = curl_getinfo ($ch);
		$Ergebnis["JSON_Ausgabe"] = json_decode($Ergebnis["result"],true,10);
		$Ergebnis["errorno"] = curl_errno($ch);
		if ($Ergebnis["rc_info"]["http_code"] == 200 or $Ergebnis["rc_info"]["http_code"] == 204) {
			$Ergebnis["Ausgabe"] = true;
		}
		curl_close($ch);
	unset($ch);
	if (!isset($Ergebnis["JSON_Ausgabe"]["results"][0]["series"])) {
		log_schreiben("Es fehlt die Datenbank master mit dem Measurement PV oder sie ist leer.","|- ",3);
		log_schreiben("Fehler: ".$Ergebnis["JSON_Ausgabe"]["results"][0]["error"],"|- ",4);
	}
	else {
		for ($h = 1; $h < count($Ergebnis["JSON_Ausgabe"]["results"][0]["series"][0]["columns"]); $h++) {
			$DB[$Ergebnis["JSON_Ausgabe"]["results"][0]["series"][0]["columns"][$h]] =
			$Ergebnis["JSON_Ausgabe"]["results"][0]["series"][0]["values"][0][$h];
		}
	log_schreiben("Datenbank: solaranzeige DB ".print_r($DB,1)," ",10);
	}
	$Ergebnis = array();

// Summe
$Measurement = "Summen";
	$sql = urlencode('select * from '.$Measurement.' order by time desc limit 1');
	$ch = curl_init('http://localhost/query?db='.$openWB_DB.'&precision=s&q='.$sql);
		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
		curl_setopt($ch, CURLOPT_TIMEOUT, 15); //timeout in second s
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 12);
		curl_setopt($ch, CURLOPT_PORT, 8086);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		$Ergebnis["result"] = curl_exec($ch);
		$Ergebnis["rc_info"] = curl_getinfo ($ch);
		$Ergebnis["JSON_Ausgabe"] = json_decode($Ergebnis["result"],true,10);
		$Ergebnis["errorno"] = curl_errno($ch);
		if ($Ergebnis["rc_info"]["http_code"] == 200 or $Ergebnis["rc_info"]["http_code"] == 204) {
			$Ergebnis["Ausgabe"] = true;
		}
		curl_close($ch);
	unset($ch);
	if (!isset($Ergebnis["JSON_Ausgabe"]["results"][0]["series"])) {
		log_schreiben("Es fehlt die Datenbank master mit dem Measurement Summen oder sie ist leer.","|- ",3);
		log_schreiben("Fehler: ".$Ergebnis["JSON_Ausgabe"]["results"][0]["error"],"|- ",4);
	}
	else {
		for ($h = 1; $h < count($Ergebnis["JSON_Ausgabe"]["results"][0]["series"][0]["columns"]); $h++) {
			$DB[$Ergebnis["JSON_Ausgabe"]["results"][0]["series"][0]["columns"][$h]] =
			$Ergebnis["JSON_Ausgabe"]["results"][0]["series"][0]["values"][0][$h];
		}
	log_schreiben("Datenbank: solaranzeige DB ".print_r($DB,1)," ",10);
	}
	$Ergebnis = array();

// AC
$Measurement = "AC";
	$sql = urlencode('select * from '.$Measurement.' order by time desc limit 1');
	$ch = curl_init('http://localhost/query?db='.$openWB_DB.'&precision=s&q='.$sql);
		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
		curl_setopt($ch, CURLOPT_TIMEOUT, 15); //timeout in second s
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 12);
		curl_setopt($ch, CURLOPT_PORT, 8086);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		$Ergebnis["result"] = curl_exec($ch);
		$Ergebnis["rc_info"] = curl_getinfo ($ch);
		$Ergebnis["JSON_Ausgabe"] = json_decode($Ergebnis["result"],true,10);
		$Ergebnis["errorno"] = curl_errno($ch);
		if ($Ergebnis["rc_info"]["http_code"] == 200 or $Ergebnis["rc_info"]["http_code"] == 204) {
			$Ergebnis["Ausgabe"] = true;
		}
		curl_close($ch);
	unset($ch);
	if (!isset($Ergebnis["JSON_Ausgabe"]["results"][0]["series"])) {
		log_schreiben("Es fehlt die Datenbank master mit dem Measurement AC oder sie ist leer.","|- ",3);
		log_schreiben("Fehler: ".$Ergebnis["JSON_Ausgabe"]["results"][0]["error"],"|- ",4);
	}
	else {
		for ($h = 1; $h < count($Ergebnis["JSON_Ausgabe"]["results"][0]["series"][0]["columns"]); $h++) {
			$DB[$Ergebnis["JSON_Ausgabe"]["results"][0]["series"][0]["columns"][$h]] =
			$Ergebnis["JSON_Ausgabe"]["results"][0]["series"][0]["values"][0][$h];
		}
	log_schreiben("Datenbank: solaranzeige DB ".print_r($DB,1)," ",10);
	}
	$Ergebnis = array();

// Batterie
$Measurement = "BAT";
	$sql = urlencode('select * from '.$Measurement.' order by time desc limit 1');
	$ch = curl_init('http://localhost/query?db='.$openWB_DB.'&precision=s&q='.$sql);
		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
		curl_setopt($ch, CURLOPT_TIMEOUT, 15); //timeout in second s
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 12);
		curl_setopt($ch, CURLOPT_PORT, 8086);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		$Ergebnis["result"] = curl_exec($ch);
		$Ergebnis["rc_info"] = curl_getinfo ($ch);
		$Ergebnis["JSON_Ausgabe"] = json_decode($Ergebnis["result"],true,10);
		$Ergebnis["errorno"] = curl_errno($ch);
		if ($Ergebnis["rc_info"]["http_code"] == 200 or $Ergebnis["rc_info"]["http_code"] == 204) {
			$Ergebnis["Ausgabe"] = true;
		}
		curl_close($ch);
	unset($ch);
	if (!isset($Ergebnis["JSON_Ausgabe"]["results"][0]["series"])) {
		log_schreiben("Es fehlt die Datenbank master mit dem Measurement BAT oder sie ist leer.","|- ",3);
		log_schreiben("Fehler: ".$Ergebnis["JSON_Ausgabe"]["results"][0]["error"],"|- ",4);
	}
	else {
		for ($h = 1; $h < count($Ergebnis["JSON_Ausgabe"]["results"][0]["series"][0]["columns"]); $h++) {
			$DB[$Ergebnis["JSON_Ausgabe"]["results"][0]["series"][0]["columns"][$h]] =
			$Ergebnis["JSON_Ausgabe"]["results"][0]["series"][0]["values"][0][$h];
		}
	log_schreiben("Datenbank: solaranzeige DB ".print_r($DB,1)," ",10);
	}
	$Ergebnis = array();


//Für das PV Modul:
$openWB_MQTT["openWB/set/pv/1/W"] = "-".round($DB["PVLeistungTotal"]);
$openWB_MQTT["openWB/set/pv/1/WhCounter"] = $DB["PVHeute"];

//Für das EVU Modul:
$openWB_MQTT["openWB/set/evu/W"] = $DB["EinspeisungBezug"];
$openWB_MQTT["openWB/set/evu/WhImported"] = $DB["BezugHeute"];
$openWB_MQTT["openWB/set/evu/WhExported"] = $DB["EinspeisungHeute"];
$openWB_MQTT["openWB/set/evu/HzFrequenz"] = $DB["Frequenz"];
$openWB_MQTT["openWB/set/evu/VPhase1"] = $DB["SpannungL1"];
$openWB_MQTT["openWB/set/evu/VPhase2"] = $DB["SpannungL2"];
$openWB_MQTT["openWB/set/evu/VPhase3"] = $DB["SpannungL3"];
$openWB_MQTT["openWB/set/evu/APhase1"] = $DB["NETZStromL1"];
$openWB_MQTT["openWB/set/evu/APhase2"] = $DB["NETZStromL2"];
$openWB_MQTT["openWB/set/evu/APhase3"] = $DB["NETZStromL3"];
$openWB_MQTT["openWB/set/evu/WPhase1"] = $DB["NETZLeistungL1"];
$openWB_MQTT["openWB/set/evu/WPhase2"] = $DB["NETZLeistungL2"];
$openWB_MQTT["openWB/set/evu/WPhase3"] = $DB["NETZLeistungL3"];

//Für das Speicher Modul:
$openWB_MQTT["openWB/set/houseBattery/W"] = $DB["Leistung"];
$openWB_MQTT["openWB/set/houseBattery/%Soc"] = $DB["SOC"];
$openWB_MQTT["openWB/set/houseBattery/WhImported"] = $DB["BatterieLadungHeute"];
$openWB_MQTT["openWB/set/houseBattery/WhExported"] = $DB["BatterieEntladungHeute"];


// Die Pipe wird geöffnet
// Ab hier werden die MQTT Topics in die Pipe geschrieben

$fifoPath = "/var/www/pipe/pipe";
if (! file_exists($fifoPath)) {
$funktionen->log_schreiben("Pipe wird neu erstellt."," ",5);
posix_mkfifo($fifoPath, 0644);
}
$fifo = fopen($fifoPath, "w+");
if (is_resource($fifo)) {
foreach($openWB_MQTT as $key=>$wert) {
$rc = fwrite($fifo, $key." ".$wert."\r\n");
$funktionen->log_schreiben($key." ".$wert." rc: ".$rc," ",10);
}
$rc = fwrite($fifo,"|");
fclose($fifo);
}
?>
Woher kommt der Fehler und könnte mir jemand helfen, die Datei zu optimieren?

Vielen Dank

Benutzeravatar
Ulrich
Administrator
Beiträge: 5503
Registriert: Sa 7. Nov 2015, 10:33
Wohnort: Essen
Hat sich bedankt: 152 Mal
Danksagung erhalten: 875 Mal
Kontaktdaten:

Re: openWB_math Fehler

Beitrag von Ulrich »

Die Fehlermeldung hat nichts mit openWB zu tun.

Bitte füge in die Datei mqtt_prozess.php in Zeile 234 zwei Schrägstrichhe ein.
so:

Code: Alles auswählen

// $client->loop();
$client->disconnect();
unset($client);
und prüfe bitte einmal, ob das Problem dann beseitigt ist.
-----------------------------------------------------
Ulrich . . . . . . . . [Projekt Administrator]

limatango
Beiträge: 27
Registriert: Di 8. Nov 2022, 10:27
Hat sich bedankt: 11 Mal
Danksagung erhalten: 3 Mal

Re: openWB_math Fehler

Beitrag von limatango »

Hallo Ulrich.

Besten Dank. Die besagte Fehlermeldung ist weg und die Daten kommen weiterhin wie gewünscht an, sodass eine Überschussladung realisiert werden kann.

Soll ich die openWB_math im Unterforum zur Verfügung stellen oder gäbe es noch Optimierungsbedarf?

Off-topic:
Die sofarsolar.php spuckt sporadisch andere Fehlermeldungen im php.log, bei denen ich davon ausgehe, dass es womöglich an der Menge der Daten liegen könnte, die ich vom Wechselrichter abrufe:
Beispiel: PHP Notice: Trying to access array offset on value of type bool in /var/www/html/sofarsolar.php on line 361

Die Meldung kommt sehr unregelmäßig und bezieht sich auf verschiedene lines. Es ist auch nicht die Original-PHP von dir. Ich habe sie modifiziert.
Weil es nicht hierher gehört könnte ich einen eigenen Thread im passenden Forum eröffnen.
Bildschirmfoto 2023-04-25 um 18.21.00.png
Bildschirmfoto 2023-04-25 um 18.21.32.png

Antworten

Zurück zu „MQTT und der Rest der Welt“