Kostal neue Firmware aus 11/2020

Alle Wünsche die erledigt sind oder nie verwirklicht werden.

Moderator: Ulrich

Online
Janniman
Beiträge: 123
Registriert: Mi 13. Okt 2021, 09:52
Hat sich bedankt: 11 Mal
Danksagung erhalten: 6 Mal

Re: Kostal neue Firmware aus 11/2020

Beitrag von Janniman »

Richtig.
Genau das habe ich gemacht.
Da alles nicht geholfen hat, habe ich den crontab direkt editiert in /var/spool/cron.
Raspi neu gestartet. Nun sind die wenigstens gleich.

Code: Alles auswählen

[22-May-2022 20:02:30 Europe/Berlin] PHP Warning:  fopen(/var/www/html../log/solaranzeige.log): failed to open stream: No such file or directory in /var/www/html/phpinc/funktionen.inc.php on line 7227
Eventuell (zum Test) einen festen Pfad verwenden?


Ich glaube, ich muss mal den Reserve-Raspi wieder heimholen und schauen, was der so macht.
Vielleicht ist das bei mir auch eine alte funktionen.inc.php?

Jan

Bogeyof
Beiträge: 950
Registriert: Mi 13. Mai 2020, 10:04
Hat sich bedankt: 17 Mal
Danksagung erhalten: 115 Mal

Re: Kostal neue Firmware aus 11/2020

Beitrag von Bogeyof »

Ich würde nicht immer nach dem Pfad suchen, der ist schon richtig. Es ist wohl eine Fehlermeldung, die bei fehlenden Rechten entsteht.
Ist denn der Eintrag aus der anderen Crontab des Users PI entfernt? Ansonsten kommt die Fehlermeldung immer noch von diesem Eintrag.
Was steht denn in der /var/www/html/solaranzeige.log? Gibt es dort Zeilen mit dem Text Byd-Steuerung? Wenn ja wird von der Haupt Crontab die Steuerung erfolgreich durchlaufen...

Online
Janniman
Beiträge: 123
Registriert: Mi 13. Okt 2021, 09:52
Hat sich bedankt: 11 Mal
Danksagung erhalten: 6 Mal

Re: Kostal neue Firmware aus 11/2020

Beitrag von Janniman »

Es ist wohl eine Fehlermeldung, die bei fehlenden Rechten entsteht.
Da sind wir einer Meinung. Deshalb muss ich mal auf dem Reserve-Raspi nachsehen, was da anders ist.

Die "/etc/crontab" (sudo nano /etc/crontab) ist quasi leer, bis auf die drei Standardeinträge.
Die beiden anderen crontabs (in /var/spool/cron/crontabs), also die des Users "pi" und von "root" sind jetzt identisch, wie beschrieben. Das dürfte aber auch keinen Unterschied machen, da immer nur einer der beiden angemeldet ist.

Code: Alles auswählen

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.haffjx/crontab installed on Sun May 22 17:32:27 2022)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
#
# sudo mount /dev/sda3 /mnt/backup

@reboot sleep 20 && /solaranzeige/support			>/dev/null
@reboot            /var/www/html/multi_usb_init.php		>/dev/null
*     *  *  *  *    /var/www/html/multi_regler_auslesen.php	>/dev/null
*     *  *  *  *    /var/www/html/checkreboot.sh		>/dev/null
20,50 *  *  *  *    /var/www/html/wetterdaten.php		>/dev/null
*     *  *  *  *    /var/www/html/mqtt_prozess.php		>/dev/null
55   23  *  *  *    /var/www/html/wartung.php			>/dev/null
*     *  *  *  *    /var/www/html/wallbox_steuerung.php		>/dev/null
#01   */4 *  *  *    /var/www/html/awattar.php			>/dev/null
#*     *  *  *  *    /var/www/html/automation.php		>/dev/null

# diverse Backupstrategien
# Backup von Dateien
# Example of job definition:# Backup von Dateien
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
0 5	1 * *	/home/pi/script/backup.sh 			>/dev/null
0 5	15 * *	/home/pi/script/backup.sh 			>/dev/null
0 1	* * 6	/home/pi/script/backup_dateien_daily.sh
# 0 1	* * 6	/home/pi/script/sync-nas.sh
0 1	* * 6	/home/pi/script/autodelete_dateien.sh1

# Abfrage der BYD-Daten
*/5 * * * * /var/www/html/byd_daten.php 			>/dev/null
* * * * * /var/www/html/byd_steuerung.php 			>/dev/null
#
Ich gehe ins Bett, um 3:20 klingelt mein Wecker.

Lieben Gruß und entschuldige bitte, dass ich deinen Blutdruck so anhebe.
Gute Nacht!

Jan

Nachtrag: Gaaanz identisch sind sie ja doch nicht, da es bei "root" den path gibt, den es beim User "pi" nicht geben sollte. Auch das schaue ich mir morgen mal an.

Bogeyof
Beiträge: 950
Registriert: Mi 13. Mai 2020, 10:04
Hat sich bedankt: 17 Mal
Danksagung erhalten: 115 Mal

Re: Kostal neue Firmware aus 11/2020

Beitrag von Bogeyof »

Guten Morgen, Du machst Dir das Leben zu schwer. Es sollte gar keine Crontab für den User PI geben, es gehört alles in die Root Crontab. Die müssen nicht identisch sein, sondern die PI muss weg. Gehe doch mal nach /var/spool/cron/crontabs und lösche alles außer root.

Du gehst auch nicht auf die Frage ein, ob Einträge zur byd_steuerung in der solaranzeige.log sind. Durch den ebenfalls vorhandenen Eintrag zur byd_steuerung.php in der Root Crontab gehe ich davon aus, dass dies der Fall sein müsste (was beweist, dass es eigentlich funktioniert und die Fehlermeldungen in der PHP von einem anderen Aufruf stammen).

Es ist doch ganz einfach, Du kannst es ja bei Dir noch einmal testen:
User PI, Aufruf mit "/var/www/html/byd_steuerung.php" kommt Deine Fehlermeldung, mit "sudo /var/www/html/byd_steuerung.php" kommt keine Fehlermeldung und es erscheinen Einträge in der solaranzeige.log
User root, Aufruf mit "/var/www/html/byd_steuerung.php", es ist alles ist in Ordnung.

Also suchst Du seit Stunden nur, was Dir Deine Fehlermeldung in der PHP.log schreibt, dass kann nur ein Aufruf mit fehlenden Rechten sein. Wie gesagt, es gibt im Solaranzeige Standard nur die Root Crontab, mehr braucht es nicht.

Online
Janniman
Beiträge: 123
Registriert: Mi 13. Okt 2021, 09:52
Hat sich bedankt: 11 Mal
Danksagung erhalten: 6 Mal

Re: Kostal neue Firmware aus 11/2020

Beitrag von Janniman »

Moin Bogeyof.
Entschuldige die späte Antwort. Ich habe derzeit einfach zu viel zu tun.
Gehe doch mal nach /var/spool/cron/crontabs und lösche alles außer root.
Gemacht.
Du gehst auch nicht auf die Frage ein, ob Einträge zur byd_steuerung in der solaranzeige.log sind.
Hm... ich welchen Tracelevel/Einstellungen (und wo und wie hoch) soll ich da hoch setzen? Wahrscheinlich alle, weil man ja nicht weiß, wann die Rückmeldungen genau kommen. Meine Solaranzeige.log ist minimalistisch.

Code: Alles auswählen

24.05. 20:42:01    -Multi Regler Auslesen [Start].
24.05. 20:42:01    -Verarbeitung von: '1.user.config.php'   Regler: 17
24.05. 20:42:09    -Verarbeitung von: '2.user.config.php'   Regler: 17
24.05. 20:42:17    -Verarbeitung von: '3.user.config.php'   Regler: 22
24.05. 20:42:24    -Verarbeitung von: '4.user.config.php'   Regler: 30
24.05. 20:42:33    -Multi Regler Auslesen [Stop].

24.05. 20:43:01    -Multi Regler Auslesen [Start].
24.05. 20:43:01    -Verarbeitung von: '1.user.config.php'   Regler: 17
24.05. 20:43:09    -Verarbeitung von: '2.user.config.php'   Regler: 17
24.05. 20:43:17    -Verarbeitung von: '3.user.config.php'   Regler: 22
24.05. 20:43:24    -Verarbeitung von: '4.user.config.php'   Regler: 30
24.05. 20:43:33    -Multi Regler Auslesen [Stop].
Als die Tracelevel noch hochgesetzt waren, da kamen die Meldungen der byd_daten.php auch mitten im log, also zwischen den Einträgen der Regler, ohne einen eigenständigen Punkt.
Durch den ebenfalls vorhandenen Eintrag zur byd_steuerung.php in der Root Crontab gehe ich davon aus, dass dies der Fall sein müsste (was beweist, dass es eigentlich funktioniert und die Fehlermeldungen in der PHP von einem anderen Aufruf stammen).
Das mag sein, dennoch finde ich es unwahrscheinlich.
Es ist doch ganz einfach, Du kannst es ja bei Dir noch einmal testen: ...
User root, Aufruf mit "/var/www/html/byd_steuerung.php", es ist alles ist in Ordnung.
Das probiere ich aus. En minüüüüt später.
crontab geändert, Raspi neu gestartet. phplog

Code: Alles auswählen

[24-May-2022 21:41:03 Europe/Berlin] PHP Warning:  fopen(/var/www/html../log/solaranzeige.log): failed to open stream: No such file or directory in /var/www/html/phpinc/funktionen.inc.php on line 7227
Ist leider immer noch vorhanden. Das mit dem sudo voran funktionierte ja bei dem manuellen Aufruf genau soweit, dass im Terminal keine Fehlermeldung zurückgeworfen wurde. Ob es dabei Einträge in den Logs gab, das habe ich nie nachgesehen.

Jan

Bogeyof
Beiträge: 950
Registriert: Mi 13. Mai 2020, 10:04
Hat sich bedankt: 17 Mal
Danksagung erhalten: 115 Mal

Re: Kostal neue Firmware aus 11/2020

Beitrag von Bogeyof »

Langsam bin ich ratlos, ich kann dir nicht sagen wo die Fehlermeldung herkommt. Keiner hat da bisher Probleme gehabt (gut ich konnte sie mit fehlenden Rechten als User PI nachstellen, aber nicht als root oder mit sudo, die root Crontab sollte daher auch keine Probleme damit haben).
Als Test würde ich die Byd-Steuerung aus der Crontab rausnehmen. Dann erst mal sicherstellen, dass die Fehlermeldung weg ist (nicht dass sie gar nicht von der Byd-Steuerung kommt).
Anschließend den Travelevel in der Byd-Steuerung auf 8 setzen und die Steuerung per Hand aufrufen. (Als root oder als PI mit sudo).
Jetzt kontrollieren ob Daten geschrieben werden (influxdb) und ob Log Einträge auftauchen (Solaranzeige und PHP Log).
Das wäre der erste Schritt um festzustellen, ob überhaupt etwas funktioniert.

Sicherheitshalber könntest Du auch mal Deine aktuelle "byd_steuerung.php" hier anhängen. Die Prognose ist inzwischen vorhanden, oder wie ist das Problem mit den fehlenden Datenfeldern für die Abfragen in der byd_steuerung.php aktuell gelöst?

Online
Janniman
Beiträge: 123
Registriert: Mi 13. Okt 2021, 09:52
Hat sich bedankt: 11 Mal
Danksagung erhalten: 6 Mal

Re: Kostal neue Firmware aus 11/2020

Beitrag von Janniman »

Langsam bin ich ratlos, ich kann dir nicht sagen wo die Fehlermeldung herkommt.
Ich habe mal darüber geschlafen und deinen Post gelesen.
Heute habe ich Folgendes gemacht:
Beide Einträge für BYD aus der crontab entfernt. -> Fehler bleibt weiter. Uuups...
Also lag es nicht an deiner tollen Arbeit.
Mal ein Update machen? Ich bin hier immer auf dem Trip gewesen, never change a running System. Also ein Update von Solaranzeige gemacht und der Fehler ist,.... Tadaaaa -> weg.
Mist, dann muss ich mal meine Strategien überdenken. Entschuldige vielmals! Ich dachte mir, was läuft das läuft.
Sicherheitshalber könntest Du auch mal Deine aktuelle "byd_steuerung.php" hier anhängen. Die Prognose ist inzwischen vorhanden, oder wie ist das Problem mit den fehlenden Datenfeldern für die Abfragen in der byd_steuerung.php aktuell gelöst?
Das mache ich gerne.
Für die Prognose hatte ich bisher noch keine Zeit. Ich klaue mir immer mal hier 5 Minuten, mal dort. Dazu, um die Prognose einzurichten, brauche ich Zeit zu lesen, wie ihr das eingestellt habt. Ich will ja nicht wieder alles falsch machen. Accounts bei OpenWeathermap und Wounderground nutze ich ja auch schon länger (HomeMatic und Solaranzeige).

Code: Alles auswählen

#!/usr/bin/php
<?php

/*****************************************************************************
//  Solaranzeige Projekt             Copyright (C) [2015-2020]  [Ulrich Kunz]
//
//  Dieses Programm ist freie Software. Sie können es unter den Bedingungen
//  der GNU General Public License, wie von der Free Software Foundation
//  veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß
//  Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren Version.
//
//  Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es
//  Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne
//  die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN
//  BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
//
//  Ein original Exemplar der GNU General Public License finden Sie hier:
//  http://www.gnu.org/licenses/
//
//  Dies ist ein Programmteil des Programms "Solaranzeige"
//
//  Es dient der Steuerung einer BYD HVS/HVM mit Kostal Plenticore WR
//
*****************************************************************************/
setlocale(LC_TIME,"de_DE.utf8");
$path_parts = pathinfo($argv[0]);
$Pfad = $path_parts['dirname'];

if (is_file($Pfad."/1.user.config.php")) {
  // Handelt es sich um ein Multi Regler System?
  require($Pfad."/1.user.config.php");
}
else {
  require($Pfad."/user.config.php");
}
require_once($Pfad."/phpinc/funktionen.inc.php");
 
if (!isset($funktionen)) {
  $funktionen = new funktionen();
}

// Im Fall, dass man die Device manuell eingeben muss
if (isset($USBDevice) and !empty($USBDevice)) {
  $USBRegler = $USBDevice;
}
//  Ist der Standort in der user.config.php angegeben?
//  Wenn nicht dann Standort Frankfurt nehmen
if (isset($Breitengrad)) {
    $breite = $Breitengrad;
} else {
    $breite = 53.3807019;
}

if (isset($Laengengrad)) {
    $laenge = $Laengengrad;
} else {
    $laenge = 10.0300811;
}
//  Wann ist Mitternacht?
$HeuteMitternacht = strtotime('today midnight');
//  Sonnenaufgang und Sonnenuntergang berechnen (default Standort ist Frankfurt)
$now = time();
$gmt_offset = 1 + date("I");
$zenith = 50 / 60;
$zenith = $zenith + 90;
$Sonnenuntergang = date_sunset($now, SUNFUNCS_RET_TIMESTAMP, $breite, $laenge, $zenith, $gmt_offset);
$Sonnenaufgang = date_sunrise($now, SUNFUNCS_RET_TIMESTAMP, $breite, $laenge, $zenith, $gmt_offset);

$Tracelevel = 10;  //  1 bis 10  10 = Debug
$RemoteDaten = true;
$Device = "WR"; // WR = Wechselrichter
$aktuelleDaten = array();
$Version = "";
$Start = time();  // Timestamp festhalten
$aktuelleDaten["Regler"] = $Regler;
$aktuelleDaten["Objekt"] = $Objekt;
$aktuelleDaten["Firmware"] = 1.3;
//$aktuelleDaten["Produkt"]  = $aktuelleDaten["Seriennummer"];

/****************************************************************************
//  InfluxDB  Zugangsdaten ...stehen in der user.config.php
//  falls nicht, sind das hier die default Werte.
****************************************************************************/
$aktuelleDaten["InfluxAdresse"] = $InfluxAdresse;
$aktuelleDaten["InfluxPort"] = $InfluxPort;
$aktuelleDaten["InfluxUser"] =  $InfluxUser;
$aktuelleDaten["InfluxPassword"] = $InfluxPassword;
$aktuelleDaten["InfluxDBName"] = $InfluxDBName;
$aktuelleDaten["InfluxDaylight"] = $InfluxDaylight;
$aktuelleDaten["InfluxDBLokal"] = $InfluxDBLokal;
$aktuelleDaten["InfluxSSL"] = $InfluxSSL;
$aktuelleDaten["Demodaten"] = false;
$aktuelleDaten["Timestamp"] = $Start;
$aktuelleDaten["InfluxAdresse"] = "localhost";
$aktuelleDaten["InfluxPort"] = "8086";
$aktuelleDaten["InfluxDBName"] = $aktuelleDaten["InfluxDBLokal"];
$aktuelleDaten["InfluxSSL"] = false;


sleep(20);
$funktionen->log_schreiben("-------------   Start  byd_steuerung.php    --------------- ","|--",6);

$COM1 = fsockopen($WR_IP, $WR_Port, $errno, $errstr, 5);   // 5 = Timeout in Sekunden
if (!is_resource($COM1)) {
  $funktionen->log_schreiben("Kein Kontakt zum Wechselrichter ".$WR_IP."  Port: ".$WR_Port,"XX ",3);
  $funktionen->log_schreiben("Exit.... ","XX ",9);
  goto Ausgang;
}

$i = 1;
{

  /****************************************************************************
  //  CvT Anpassungen Auslesen BYD, Voltage, Temperatur, SOH
  ****************************************************************************/
  
  $shell_befehl = "perl /var/www/html/readBYD.pl";
  #print_r ($shell_befehl);
  $temp = shell_exec($shell_befehl);
  $Einzelwerte = preg_split("/[\s,\n ]+/", $temp);
  if ($Einzelwerte[0] == 0) {
     goto Ausgang;
  }
  $aktuelleDaten["CellTempHigh"] = $Einzelwerte[4];
  $aktuelleDaten["CellTempLow"] = $Einzelwerte[5];
  $aktuelleDaten["CellVoltHigh"] = $Einzelwerte[6];
  $aktuelleDaten["CellVoltLow"] = $Einzelwerte[7];
  $aktuelleDaten["SOH"] = $Einzelwerte[11];

  /****************************************************************************
  //  CvT Anpassungen Plenticore auslesen, Batterieinformationen, Stati
  ****************************************************************************/

  // Neue Register Firmware 1.44
  $rc = $funktionen->kostal_register_lesen($COM1,"040E","0002","Float");
  $aktuelleDaten["Max_Charge_Limit"] = $rc["Wert"];
  $rc = $funktionen->kostal_register_lesen($COM1,"0410","0002","Float");
  $aktuelleDaten["Max_Discharge_Limit"] = $rc["Wert"];
  $rc = $funktionen->kostal_register_lesen($COM1,"0438","0001","U16-1");
  $aktuelleDaten["ExternalControl"] = $rc["Wert"];
  $rc = $funktionen->kostal_register_lesen($COM1,"0412","0002","Float");
  $aktuelleDaten["Min_SOC_Rel"] = $rc["Wert"];
  $rc = $funktionen->kostal_register_lesen($COM1,"0414","0002","Float");
  $aktuelleDaten["Max_SOC_Rel"] = $rc["Wert"];
  $rc = $funktionen->kostal_register_lesen($COM1,"0202","0001","U16-1");
  $aktuelleDaten["Bat_Act_SOC"] = $rc["Wert"];
  $rc = $funktionen->kostal_register_lesen($COM1,"0068","0002","U32");
  $aktuelleDaten["Energiemanager_Status"] = $rc["Wert"];
  $SMTest = $rc["Wert"];
  if ($SMTest == 0) {  
     $aktuelleDaten["BatterieStatus"] = "Normal";
  }
  if ($SMTest == 64) {  
     $aktuelleDaten["BatterieStatus"] = "Tiefentladeschutz";
  }
  if ($SMTest == 32) {  
     $aktuelleDaten["BatterieStatus"] = "Ausgleichsladung";
  }
  if ($SMTest == 16) {  
     $aktuelleDaten["BatterieStatus"] = "Ruhe2";
  }
  if ($SMTest == 8) {  
     $aktuelleDaten["BatterieStatus"] = "Ruhe1";
  }
  if ($SMTest == 2) {  
     $aktuelleDaten["BatterieStatus"] = "Notladung";
  }

  /****************************************************************************
  //  Einfache Steuerungen anhand der ausgelesenen Daten für Ladung und SOC
  ****************************************************************************/

  $CellVoltHigh =   $aktuelleDaten["CellVoltHigh"];
  if ($aktuelleDaten["Max_SOC_Rel"] < 100) {
     if ($aktuelleDaten["Bat_Act_SOC"] > 80) {
        $shell_befehl = "python3 /solaranzeige/Kostal_BatMaxSOC.py -s ".$aktuelleDaten["Max_SOC_Rel"];
        $temp = shell_exec($shell_befehl);
        $funktionen->log_schreiben("MaxSOC wiederholen bei ungleich 100 Prozent ".$aktuelleDaten["Max_SOC_Rel"],"   ",5);
     }
  }
  elseif ((($aktuelleDaten["Bat_Act_SOC"] == 100) or ($CellVoltHigh > 3.6)) and ($aktuelleDaten["ExternalControl"] > 0)) {
     $shell_befehl = "python3 /solaranzeige/Kostal_BatMaxSOC.py -s 90";
     $temp = shell_exec($shell_befehl);
     $funktionen->log_schreiben("MaxSOC auf 90 setzen wegen 100 Prozent SOC oder CellVoltHigh ".$aktuelleDaten["Bat_Act_SOC"]." ".$CellVoltHigh,"   ",5);
  }

  if ($aktuelleDaten["ExternalControl"] > 1) {
    if (($aktuelleDaten["Bat_Act_SOC"] > 92) and ($aktuelleDaten["Bat_Act_SOC"] < 97)) {
       $shell_befehl = "python3 /solaranzeige/Kostal_BatMaxChargePower.py -s 3000";
       $temp = shell_exec($shell_befehl);
    }
    if ($aktuelleDaten["Bat_Act_SOC"] > 96) {
       $shell_befehl = "python3 /solaranzeige/Kostal_BatMaxChargePower.py -s 2000";
       $temp = shell_exec($shell_befehl);
    }
    if (($aktuelleDaten["Bat_Act_SOC"] < 93) and ($aktuelleDaten["Max_Charge_Limit"] < 3005)) {
       $shell_befehl = "python3 /solaranzeige/Kostal_BatMaxChargePower.py -s 5500";
       $temp = shell_exec($shell_befehl);
    }
  }
  $CellVoltLow = $aktuelleDaten["CellVoltLow"];
  if ($CellVoltLow < 2.9){
     $shell_befehl = "python3 /solaranzeige/Kostal_Bat15000.py";
     $temp = shell_exec($shell_befehl);
     $funktionen->log_schreiben("Batterieentladung gestoppt wegen CellVoltLow ".$aktuelleDaten["Bat_Act_SOC"]." ".$CellVoltLow,"   ",5);
  }
  /****************************************************************************
  //  Einfache Steuerungen für Batterie Modus (intelligent oder normal)
  ****************************************************************************/
  // Abfrage, wie hoch sind die prognostizierten Sonnenstunden
  // Abhaengig davon wird die Intelligente Batteriesteuerung ein-/ausgeschaltet
  $Sonne = "2"; // Hier die benoetigten Sonnenstundeneintragen fuer Nachmittag!
  $MinPrognose = "22000"; // Hier die Mindesprognose eintragen
  $MinSOC = "40"; // Hier den Minimum-SOC eintragen
 
  $Heute = $HeuteMitternacht + (60 * 60 * 23);
  $HeuteNachmittag = $HeuteMitternacht + (60 * 60 * 12);
  $aktuelleDaten["Query"] = "db=" . $InfluxDBLokal . "&q=" . urlencode("select last(SOC) from Batterie");
  $rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
  $SOC = $rc["results"][0]["series"][0]["values"][0][1];
  $aktuelleDaten["Query"] = "db=" . $InfluxDBLokal . "&q=" . urlencode("select (sum(eigenePrognose) + sum(eigenePrognoseL)) / 2 FROM WetterPrognose where time > " . $HeuteMitternacht . "000000000  and time <= " . $Heute . "000000000");
  $rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
  $Prognose = $rc["results"][0]["series"][0]["values"][0][1];
  $aktuelleDaten["Query"] = "db=" . $InfluxDBLokal . "&q=" . urlencode("select sum(Sonnenscheindauer1h) FROM WetterPrognose where time > " . $HeuteNachmittag . "000000000  and time <= " . $Heute . "000000000");
  $rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
  $Sonnenschein = $rc["results"][0]["series"][0]["values"][0][1];
  $funktionen->log_schreiben(var_export($rc, 1), "* ", 10);

  if ($SOC < $MinSOC) {
     // Wert ist nicht erreicht.
     $Nachricht = "Intelligente Batteriesteuerung aus, SOC: " . $SOC . " %";
     $aktuelleDaten["BatterieSteuerung"] = "I-St aus -> SOC";
     $funktionen->log_schreiben($Nachricht, "* ", 8);
     $shell_befehl = "python3 /solaranzeige/Kostal_BatN.py";
     $temp = shell_exec($shell_befehl);
  } elseif ($Prognose < $MinPrognose) {
     // Wert ist nicht erreicht.
     $Nachricht = "Intelligente Batteriesteuerung aus, Prognose: " . $Prognose . " W";
     $aktuelleDaten["BatterieSteuerung"] = "I-St aus -> Prognose";
     $funktionen->log_schreiben($Nachricht, "* ", 8);
     $shell_befehl = "python3 /solaranzeige/Kostal_BatN.py";
     $temp = shell_exec($shell_befehl);
  } elseif ($Sonnenschein < $Sonne) {
     // Wert ist nicht erreicht.
     $Nachricht = "Intelligente Batteriesteuerung aus, SonnenStd: " . $Sonnenschein . " Std";
     $aktuelleDaten["BatterieSteuerung"] = "I-St aus -> Sonne";
     $funktionen->log_schreiben($Nachricht, "* ", 8);
     $shell_befehl = "python3 /solaranzeige/Kostal_BatN.py";
     $temp = shell_exec($shell_befehl);
  } else {
     // Wert ist erreicht.
     $Nachricht = "Intelligente Batteriesteuerung ein, Prognose: " . $Prognose . " W";
     $aktuelleDaten["BatterieSteuerung"] = "Intel.-St ein";
     $funktionen->log_schreiben($Nachricht, "* ", 8);
     $shell_befehl = "python3 /solaranzeige/Kostal_BatI.py";
     $temp = shell_exec($shell_befehl);
  }
 
  /****************************************************************************
  //  Einfache Steuerungen für Batterie Nutzung
  ****************************************************************************/
  // Abfrage, wie hoch sind die prognostizierten Ertraege
  // Abhaengig davon wird die Batterienutzung ein-/ausgeschaltet
  $MinPrognose = "18000"; // Hier die Mindestprognose eintragen
  $MinSOC = "10"; // Hier den Minimum-SOC eintragen
  $NightSOC = "75"; // Hier den Minimum-SOC fuer die Nacht eintragen, damit eingeschaltet wird
  $DaySOC = "90"; // Hier den Minimum-SOC fuer den Tag zur sofortigen Umschaltung eintragen

  $aktuelleDaten["BatterieNutzung"] = "";
  $aktuelleDaten["Query"] = "db=" . $InfluxDBLokal . "&q=" . urlencode("select last(BatterieNutzung) from Batterie");
  $rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
  $LBatNutzung = $rc["results"][0]["series"][0]["values"][0][1];
  if (empty($LBatNutzung)) {
     $LBatNutzung = "Noch nicht gesetzt";
  }


  if ($SOC < 1 or $SOC > 100) {
     goto NoValue;
  }

  if ($SOC < $MinSOC) {
     // Wert ist nicht erreicht.
     if ($Prognose < $MinPrognose) {
        // Wert ist nicht erreicht.
        $Nachricht = "Batterienutzung aus, Prognose: " . $Prognose . " W";
        $aktuelleDaten["BatterieNutzung"] = "Nutzung aus -> SOC";
        $funktionen->log_schreiben($Nachricht, "* ", 8);
        $shell_befehl = "python3 /solaranzeige/Kostal_Bat15000.py";
        $temp = shell_exec($shell_befehl);
     }
  }
  // Nur im Winter !!!
  if ($SOC < 25) {
     // Wert ist erreicht.
     if (date("n") > 10 or date("n") < 2) {
		// November inkl. Januar)
        if (date("G") > 07 and date("G") < 20) {
           // nach 07:00 Uhr am Tage
           $Nachricht = "Batterienutzung aus, Winter" . $Prognose . " W";
           $aktuelleDaten["BatterieNutzung"] = "Nutzung aus -> Winter";
           $funktionen->log_schreiben($Nachricht, "* ", 8);
           $shell_befehl = "python3 /solaranzeige/Kostal_BatTC1.py";
           $temp = shell_exec($shell_befehl);
           $shell_befehl = "python3 /solaranzeige/Kostal_Bat15000.py";
           $temp = shell_exec($shell_befehl);
        }
     }
  }
  if ($SOC > $DaySOC) {
     // Wert ist erreicht.
     $Nachricht = "Batterienutzung ein, SOC: " . $SOC . " %";
     $aktuelleDaten["BatterieNutzung"] = "Nutzung ein -> SOC";
     $funktionen->log_schreiben($Nachricht, "* ", 8);
     $shell_befehl = "python3 /solaranzeige/Kostal_Bat50.py";
     $temp = shell_exec($shell_befehl);
     // Nicht Winter, dann TimeControl sofort aus !!!
     if (date("n") < 11 and date("n") > 1) {
        $shell_befehl = "python3 /solaranzeige/Kostal_BatTC0.py";
        $temp = shell_exec($shell_befehl);
     }
  }
  if ($SOC > $MinSOC) {
     // Wert ist erreicht
     if ($Prognose > $MinPrognose) {
        // Wert ist erreicht.
        $Nachricht = "Batterienutzung ein, Prognose: " . $Prognose . " W";
        $aktuelleDaten["BatterieNutzung"] = "Nutzung ein -> Prognose";
        $funktionen->log_schreiben($Nachricht, "* ", 8);
        $shell_befehl = "python3 /solaranzeige/Kostal_Bat50.py";
        $temp = shell_exec($shell_befehl);
        $shell_befehl = "python3 /solaranzeige/Kostal_BatTC0.py";
        $temp = shell_exec($shell_befehl);
     }
  }
  if ($SOC > $NightSOC) {
     // Wert ist erreicht.
     if (date("G") > 19) {
        // nach 20:00 Uhr am Tage
        $Nachricht = "Batterienutzung f�r die Nacht ein, SOC: " . $SOC . " %";
        $aktuelleDaten["BatterieNutzung"] = "Nutzung ein -> NightSOC";
        $funktionen->log_schreiben($Nachricht, "* ", 8);
        $shell_befehl = "python3 /solaranzeige/Kostal_Bat50.py";
        $temp = shell_exec($shell_befehl);
        $shell_befehl = "python3 /solaranzeige/Kostal_BatTC0.py";
        $temp = shell_exec($shell_befehl);
     }
  }
        
NoValue:;

  if (empty($aktuelleDaten["BatterieNutzung"])) {
     $aktuelleDaten["BatterieNutzung"] = $LBatNutzung;
  }

  /****************************************************************************
  //  Weitere Statusabfragen Batterie / Schaltausgang
  ****************************************************************************/
  $shell_befehl = "python3 /solaranzeige/Kostal_NEQ.py";
  $temp = shell_exec($shell_befehl);
  $Einzelwerte = preg_split("/[\s,\n :}{''\]]+/", $temp);
  $aktuelleDaten["Netzbezug"] = $Einzelwerte[5];
  if ($aktuelleDaten["Netzbezug"] > 0) {
   } else {
     $aktuelleDaten["Netzbezug"] = 0;
  }

  $shell_befehl = "python3 /solaranzeige/Kostal_BatTCQ.py";
  $Ergebnis = shell_exec($shell_befehl);
  if ($Ergebnis == 0) {
     $aktuelleDaten["TimeControl"] = "TC aus";
  } else if ($Ergebnis == 1) {
     $aktuelleDaten["TimeControl"] = "TC ein";
  }
  if (empty($aktuelleDaten["TimeControl"])) {
     $aktuelleDaten["TimeControl"] = "TC undefiniert";
  }

  $shell_befehl = "python3 /solaranzeige/Kostal_SMQ.py";
  $temp = shell_exec($shell_befehl);
  $Einzelwerte = preg_split("/[\s,\n :}{''\]]+/", $temp);
  $SMTest = $Einzelwerte[6];
  if ($SMTest == 0) {
      $aktuelleDaten["Schattenmanagement"] = "SM aus";
  }
  if ($SMTest == 1) {
      $aktuelleDaten["Schattenmanagement"] = "SM West";
  }
  if ($SMTest == 2) {
      $aktuelleDaten["Schattenmanagement"] = "SM Ost";
  }
  if ($SMTest == 3) {
      $aktuelleDaten["Schattenmanagement"] = "SM Ost+West";
  }
  if (empty($aktuelleDaten["Schattenmanagement"])) {
      $aktuelleDaten["Schattenmanagement"] = "SM undefiniert";
  }

  /****************************************************************************
  //  ENDE byd_steuerung setzen      
  ****************************************************************************/

  /****************************************************************************
  //  Die Daten werden für die Speicherung vorbereitet.
  ****************************************************************************/
  $aktuelleDaten["Regler"] = $Regler;
  $aktuelleDaten["Objekt"] = $Objekt;
  $aktuelleDaten["Firmware"] = 1.3;
  //$aktuelleDaten["Produkt"]  = $aktuelleDaten["Seriennummer"];

  /****************************************************************************
  //  InfluxDB  Zugangsdaten ...stehen in der user.config.php
  //  falls nicht, sind das hier die default Werte.
  ****************************************************************************/
  $aktuelleDaten["InfluxAdresse"] = $InfluxAdresse;
  $aktuelleDaten["InfluxPort"] = $InfluxPort;
  $aktuelleDaten["InfluxUser"] =  $InfluxUser;
  $aktuelleDaten["InfluxPassword"] = $InfluxPassword;
  $aktuelleDaten["InfluxDBName"] = $InfluxDBName;
  $aktuelleDaten["InfluxDaylight"] = $InfluxDaylight;
  $aktuelleDaten["InfluxDBLokal"] = $InfluxDBLokal;
  $aktuelleDaten["InfluxSSL"] = $InfluxSSL;


  /*********************************************************************
  //  Daten werden in die Influx Datenbank gespeichert. Zuerst Remote
  //  falls vorhanden, danach lokal
  *********************************************************************/

  $aktuelleDaten["Timestamp"] = time();

  if ($InfluxDB_remote) {

     $rc = eigenedaten_speichern($aktuelleDaten);
     $funktionen->log_schreiben("Remote: ".$rc,"|* ",7);
     #print_r ("Remote Schreiben");
  }


  $aktuelleDaten["InfluxAdresse"] = "localhost";
  $aktuelleDaten["InfluxPort"] = "8086";
  $aktuelleDaten["InfluxDBName"] = $aktuelleDaten["InfluxDBLokal"];
  $aktuelleDaten["InfluxSSL"] = false;

  $rc = eigenedaten_speichern($aktuelleDaten);
  $funktionen->log_schreiben("Lokal: ".$rc,"|* ",7);
  #print_r ("Lokales Schreiben");
  
Ausgang:;

}

$funktionen->log_schreiben("-------------   Stop  eigene_werte.php    --------------- ","|--",6);

return;
   

function eigenedaten_speichern($daten)  {

  $query = "";
  $query .= "Service ";
  $query .= "Schattenmanagement=\"" . $daten["Schattenmanagement"] . "\"";
  $query .= " ".$daten["Timestamp"];
  $query .= "\n";										        
  $query .= "Batterie ";
  $query .= "CellTempHigh=".$daten["CellTempHigh"];
  $query .= ",CellTempLow=".$daten["CellTempLow"];
  $query .= ",CellVoltHigh=".$daten["CellVoltHigh"];
  $query .= ",CellVoltLow=".$daten["CellVoltLow"];
  $query .= ",SOH=".$daten["SOH"];
  $query .= ",Min_SOC_Rel=".$daten["Min_SOC_Rel"];
  $query .= ",Max_SOC_Rel=".$daten["Max_SOC_Rel"];
  $query .= ",Max_Charge_Limit=".$daten["Max_Charge_Limit"];
  $query .= ",Max_Discharge_Limit=".$daten["Max_Discharge_Limit"];
  $query .= ",Netzbezug=".$daten["Netzbezug"];
  $query .= ",ExternalControl=".$daten["ExternalControl"];
  $query .= ",TimeControl=\"" . $daten["TimeControl"] . "\"";
  $query .= ",Energiemanager_Status=".$daten["Energiemanager_Status"];
  $query .= ",BatterieStatus=\"".$daten["BatterieStatus"]."\"";
  $query .= ",BatterieSteuerung=\"".$daten["BatterieSteuerung"]."\"";
  $query .= ",BatterieNutzung=\"".$daten["BatterieNutzung"]."\"";
  $query .= " ".$daten["Timestamp"];

  print_r ($query);

  if (isset($daten["InfluxSSL"]) and $daten["InfluxSSL"] == true) {
    $ch = curl_init('https://'.$daten["InfluxAdresse"].'/write?db='.$daten["InfluxDBName"].'&precision=s');
  }
  else {
    $ch = curl_init('http://'.$daten["InfluxAdresse"].'/write?db='.$daten["InfluxDBName"].'&precision=s');
  }

  #print_r ('http://'.$daten["InfluxAdresse"].'/write?db='.$daten["InfluxDBName"].'&precision=s');

  $i = 1;
  do {
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_TIMEOUT, 3);                //timeout in second s
    curl_setopt($ch, CURLOPT_PORT, $daten["InfluxPort"]);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
    if (!empty($daten["InfluxUser"]) and !empty($daten["InfluxPassword"])) {
      curl_setopt($ch, CURLOPT_USERPWD, $daten["InfluxUser"].":".$daten["InfluxPassword"]);
    }
    if (isset($daten["InfluxSSL"]) and $daten["InfluxSSL"] == true) {
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    }
    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $result = curl_exec($ch);
    $rc_info = curl_getinfo ($ch);
    $Ausgabe = json_decode($result,true);

    if (curl_errno($ch)) {
      $Meldung = "Curl Fehler! Daten nicht zur InfluxDB gesendet! Curl ErrNo. ".curl_errno($ch);
    }
    elseif ($rc_info["http_code"] == 200 or $rc_info["http_code"] == 204) {
      $Meldung = "OK. Daten zur InfluxDB  gesendet.";
      break;
    }
    elseif(empty($Ausgabe["error"])) {
      $i++;
      continue;
    }
    else {
      $Meldung = "Daten nicht zur InfluxDB gesendet! info: ".print_r($rc_info,1);
    }
    $i++;
    sleep(2);
    print_r ($Meldung);
  } while ($i < 3);

  curl_close($ch);
  unset($ch);

  return $Meldung;
}


?>
Diese Fehler sind jetzt in der php.log enthalten, wobei die der Keba daraus resultiert, dass diese zur Zeit komplett abgeschaltet ist. Ich hoffe, dass die anderen Fehler nicht dadurch entstehen.

Code: Alles auswählen

[25-May-2022 08:17:22 Europe/Berlin] PHP Notice:  Undefined index: series in /var/www/html/byd_steuerung.php on line 223
[25-May-2022 08:17:22 Europe/Berlin] PHP Notice:  Undefined index: series in /var/www/html/byd_steuerung.php on line 226
[25-May-2022 08:17:29 Europe/Berlin] PHP Notice:  Undefined index: Model in /var/www/html/keba_wallbox.php on line 235
Meine solaranzeige.log sieht (nach dem Hochsetzen der Tracelevel) so aus.

Code: Alles auswählen

25.05. 08:17:01    -Multi Regler Auslesen [Start].
25.05. 08:17:01    -Verarbeitung von: '1.user.config.php'   Regler: 17
25.05. 08:17:01 |----------------   Start  kostal_plenticore.php    --------------- 
25.05. 08:17:02 |----------------   Start  kostal_plenticore_math.php    --------------- 
25.05. 08:17:02    -WR1 ohne Berechnung der Summen...
25.05. 08:17:02  -Array
(
    [zentralerTimestamp] => 1653459431
    [Seriennummer] => 90523UG1
    [AnzahlPhasen] => 3
    [AnzahlStrings] => 3
    [Softwarestand] => 01.65
    [Status] => 6
    [PV_Leistung] => 5430.66
    [Energiemanager_Status] => 0
    [BatterieStatus] => Normal
    [Verbrauch_Batterie] => 0
    [Verbrauch_Netz] => 0
    [Gesamtverbrauch_Batterie] => 1041240.56
    [Gesamtverbrauch_Netz] => 1598995.13
    [Gesamtverbrauch_PV] => 312426.66
    [Verbrauch_PV] => 551
    [Gesamtverbrauch] => 2943293.25
    [AC_Frequenz] => 50.02
    [Ausgangslast] => 38.34
    [AC_Spannung_R] => 231.73
    [AC_Spannung_S] => 233.81
    [AC_Spannung_T] => 235.04
    [AC_Leistung] => 3204
    [AC_Wirkleistung] => 1789.44
    [AC_Scheinleistung] => 3668.51
    [Bat_Cycles] => 148
    [Batteriestrom] => 6.19
    [SOC] => 62
    [Batteriestatus] => 5.1042355038141E+38
    [Batterie_Temperatur] => 22
    [Batteriespannung] => 324.17
    [WattstundenGesamt] => 3530704.25
    [WattstundenGesamtHeute] => 6086.44
    [WattstundenGesamtMonat] => 722310.19
    [WattstundenGesamtJahr] => 2393652
    [PV1_Strom] => 8.56
    [PV1_Leistung] => 2725.13
    [PV1_Spannung] => 318.14
    [PV2_Strom] => 8.5
    [PV2_Leistung] => 2705.53
    [PV2_Spannung] => 318.46
    [PV3_Strom] => 0
    [PV3_Leistung] => 0
    [PV3_Spannung] => 0
    [AC_Solarleistung] => 3204
    [Bat_Act_SOC] => 62
    [Total_DC_Power] => 5430.66
    [Bat_Charge_Power] => -2006
    [Laufzeit] => 16981258
    [Temp_WR_Cab] => 53
    [Temp_WR_Sink] => 57.1
    [Temp_WR_Trans] => 47.7
    [Max_Charge_Limit] => 1999.83
    [Max_Discharge_Limit] => 4214.44
    [Min_SOC_Rel] => 5
    [Max_SOC_Rel] => 98
    [ExternalControl] => 1
    [Bat_Work_Capacity] => 8760
    [Bat_Seriennummer] => 06362112
    [Verbrauch] => 551
    [Einspeisung] => 2653
    [Ueberschuss] => 2653
    [WirkungsgradWR] => 0.58998353791252
    [Regler] => 17
    [Objekt] => WR1-Plenti
    [Firmware] => 01.65
    [Produkt] => 90523UG1
    [InfluxAdresse] => localhost
    [InfluxPort] => 8086
    [InfluxUser] => 
    [InfluxPassword] => 
    [InfluxDBName] => solaranzeige
    [InfluxDaylight] => 
    [InfluxDBLokal] => solaranzeige
    [InfluxSSL] => 
    [Demodaten] => 
    [AC_Strompreis] => 0.3061
    [AC_EEG] => 0.0694
    [AC_Einspeiselimit] => 100
    [Verbrauch_PV_k] => 551
    [Verbrauch_Netz_k] => 0
    [Verbrauch_Batterie_k] => 0
    [Verbrauch_k] => 551
    [Batterie_SOC_Wh] => 4993.2
    [Batterie_Ladeleistung] => 2006
    [Batterie_Entladeleistung] => 0
    [AC_WR_Verbrauch] => 0
    [AC_WR_Lieferung] => 3204
    [Service_VerlusteWR] => 220.66
    [PV_DC_Gesamtleistung2] => 3424.66
    [Service_DC_Gesamtinput] => 5430.66
    [Service_WirkungsgradWR2] => 0.95936773799133
    [Ueberschuss_Batterie] => 0
    [AC_EV_Erz] => 2557
    [AC_Erz_Summe] => 5210
    [AC_EV_Grad] => 0.49078694817658
    [AC_EV_Nutzung] => 551
    [AC_Autarkiegrad] => 1
    [Gesamtleistung] => 0
    [Solarleistung] => 0
    [ZusatzQuery] => AC Einspeiselimit=100,EV_Erz=2557,Erz_Summe=5210,EV_Grad=0.49078694817658,EV_Nutzung=551,Autarkiegrad=1,WR_Lieferung=3204,WR_Verbrauch=0,Strompreis=0.3061,EEG=0.0694,Verbrauch_PV_k=551,Verbrauch_Netz_k=0,Verbrauch_Batterie_k=0,Verbrauch_k=551,Ueberschuss_Batterie=0  1653459431
Batterie SOC_Wh=4993.2,Ladeleistung=2006,Entladeleistung=0  1653459431
Service VerlusteWR=220.66,DC_Gesamtinput=5430.66,WirkungsgradWR2=0.95936773799133  1653459431
PV DC_Gesamtleistung2=3424.66  1653459431
)

25.05. 08:17:02 *  -Daten zur lokalen InfluxDB [ solaranzeige ] gesendet. 
25.05. 08:17:02    -Multi-Regler-Ausgang. 7
25.05. 08:17:09    -OK. Datenübertragung erfolgreich.
25.05. 08:17:09 |----------------   Stop   kostal_plenticore.php    --------------- 
25.05. 08:17:09    -Verarbeitung von: '2.user.config.php'   Regler: 17
25.05. 08:17:09 |----------------   Start  kostal_plenticore.php    --------------- 
25.05. 08:17:10 |----------------   Start  kostal_plenticore_math.php    --------------- 
25.05. 08:17:10    -zum Piko: Gesamtberechnungen der Summen wurden durchgeführt
25.05. 08:17:10  -Array
(
    [zentralerTimestamp] => 1653459431
    [Seriennummer] => 92092TC5
    [AnzahlPhasen] => 3
    [AnzahlStrings] => 2
    [Softwarestand] => 01.65
    [Status] => 6
    [PV_Leistung] => 308.28
    [Energiemanager_Status] => 0
    [BatterieStatus] => Normal
    [Verbrauch_Batterie] => 0
    [Verbrauch_Netz] => 0
    [Gesamtverbrauch_Batterie] => 0
    [Gesamtverbrauch_Netz] => 0
    [Gesamtverbrauch_PV] => 0
    [Verbrauch_PV] => 0
    [Gesamtverbrauch] => 0.07
    [AC_Frequenz] => 50.02
    [Ausgangslast] => 0
    [AC_Spannung_R] => 231.17
    [AC_Spannung_S] => 232.96
    [AC_Spannung_T] => 234.09
    [AC_Leistung] => 269
    [AC_Wirkleistung] => 454.26
    [AC_Scheinleistung] => 527.65
    [Bat_Cycles] => 0
    [Batteriestrom] => -0
    [SOC] => 0
    [Batteriestatus] => 5.1042355038141E+38
    [Batterie_Temperatur] => 0
    [Batteriespannung] => 0
    [WattstundenGesamt] => 2771609
    [WattstundenGesamtHeute] => 379.38
    [WattstundenGesamtMonat] => 570170.44
    [WattstundenGesamtJahr] => 1843125.38
    [PV1_Strom] => 0.58
    [PV1_Leistung] => 209.76
    [PV1_Spannung] => 363.12
    [PV2_Strom] => 0.48
    [PV2_Leistung] => 98.52
    [PV2_Spannung] => 205.85
    [PV3_Strom] => 0
    [PV3_Leistung] => 0
    [PV3_Spannung] => 0
    [AC_Solarleistung] => 269
    [Bat_Act_SOC] => 0
    [Total_DC_Power] => 308.29
    [Bat_Charge_Power] => 0
    [Laufzeit] => 11445875
    [Temp_WR_Cab] => 41.5
    [Temp_WR_Sink] => 36.2
    [Temp_WR_Trans] => 35.6
    [Max_Charge_Limit] => 0
    [Max_Discharge_Limit] => 0
    [Min_SOC_Rel] => 0
    [Max_SOC_Rel] => 0
    [ExternalControl] => 0
    [Bat_Work_Capacity] => 0
    [Bat_Seriennummer] => 00000000
    [Verbrauch] => 0
    [Einspeisung] => 269
    [Ueberschuss] => 269
    [WirkungsgradWR] => 0.87255506179247
    [Regler] => 17
    [Objekt] => WR2-Piko
    [Firmware] => 01.65
    [Produkt] => 92092TC5
    [InfluxAdresse] => 
    [InfluxPort] => 8086
    [InfluxUser] => 
    [InfluxPassword] => 
    [InfluxDBName] => solaranzeige2
    [InfluxDaylight] => 
    [InfluxDBLokal] => solaranzeige2
    [InfluxSSL] => 
    [Demodaten] => 
    [AC_Strompreis] => 0.3061
    [AC_EEG] => 0.0694
    [AC_Einspeiselimit] => 100
    [Verbrauch_PV_k] => 0
    [Verbrauch_Netz_k] => 0
    [Verbrauch_Batterie_k] => 0
    [Verbrauch_k] => 0
    [Batterie_SOC_Wh] => 0
    [Batterie_Ladeleistung] => 0
    [Batterie_Entladeleistung] => 0
    [AC_WR_Verbrauch] => 0
    [AC_WR_Lieferung] => 269
    [Service_VerlusteWR] => 39.28
    [PV_DC_Gesamtleistung2] => 308.28
    [Service_DC_Gesamtinput] => 308.28
    [Service_WirkungsgradWR2] => 0.87258336577138
    [Ueberschuss_Batterie] => 0
    [AC_EV_Erz] => 0
    [AC_Erz_Summe] => 269
    [AC_EV_Grad] => 0
    [AC_EV_Nutzung] => 0
    [AC_Autarkiegrad] => 0
    [Gesamtleistung] => 5738.94
    [Solarleistung] => 3473
    [Query] => db=solaranzeige&q=select+last%28Solarleistung%29+from+AC
    [ZusatzQuery] => AC Einspeiselimit=100,EV_Erz=0,Erz_Summe=269,EV_Grad=0,EV_Nutzung=0,Autarkiegrad=0,WR_Lieferung=269,WR_Verbrauch=0,Strompreis=0.3061,EEG=0.0694,Verbrauch_PV_k=0,Verbrauch_Netz_k=0,Verbrauch_Batterie_k=0,Verbrauch_k=0,Ueberschuss_Batterie=0  1653459431
Batterie SOC_Wh=0,Ladeleistung=0,Entladeleistung=0  1653459431
Service VerlusteWR=39.28,DC_Gesamtinput=308.28,WirkungsgradWR2=0.87258336577138  1653459431
PV DC_Gesamtleistung2=308.28  1653459431
Gesamt Gesamtleistung=5738.94,Solarleistung=3473  1653459431
)

25.05. 08:17:10 *  -Daten zur lokalen InfluxDB [ solaranzeige2 ] gesendet. 
25.05. 08:17:10    -Multi-Regler-Ausgang. 7
25.05. 08:17:17    -OK. Datenübertragung erfolgreich.
25.05. 08:17:17 |----------------   Stop   kostal_plenticore.php    --------------- 
25.05. 08:17:17    -Verarbeitung von: '3.user.config.php'   Regler: 22
25.05. 08:17:17 |----------------   Start  kostal_meter.php    -------------------- 
25.05. 08:17:17 o  -Hardware Version: 4B
25.05. 08:17:17 *  -Daten zur lokalen InfluxDB [ solaranzeige3 ] gesendet. 
25.05. 08:17:17    -Multi-Regler-Ausgang. 7
25.05. 08:17:21 |----------------   Start  byd_steuerung.php    --------------- 
25.05. 08:17:22 o  -Antwort = 000100000007470304f6d344f9
25.05. 08:17:22 o  -Antwort = 000100000007470304b37b4583
25.05. 08:17:22 o  -Antwort = 0001000000054703020001
25.05. 08:17:22 o  -Antwort = 000100000007470304000040a0
25.05. 08:17:22 o  -Antwort = 000100000007470304000042c4
25.05. 08:17:22 o  -Antwort = 000100000005470302003e
25.05. 08:17:22 o  -Antwort = 00010000000747030400000000
25.05. 08:17:22 *  -Meldungsdaten von der InfluxDB  gelesen. 
25.05. 08:17:22 *  -Meldungsdaten von der InfluxDB  gelesen. 
25.05. 08:17:22 *  -Meldungsdaten von der InfluxDB  gelesen. 
25.05. 08:17:22 * -array (
  'results' => 
  array (
    0 => 
    array (
      'statement_id' => 0,
    ),
  ),
)
25.05. 08:17:22 * -Intelligente Batteriesteuerung aus, Prognose:  W
25.05. 08:17:23 *  -Meldungsdaten von der InfluxDB  gelesen. 
25.05. 08:17:24 |----------------   Stop   kostal_meter.php     ------------------- 
25.05. 08:17:24    -Verarbeitung von: '4.user.config.php'   Regler: 30
25.05. 08:17:24 |----------------   Start  keba_wallbox.php   --------------------- 
25.05. 08:17:28 |* -Lokal: OK. Daten zur InfluxDB  gesendet.
25.05. 08:17:28 |----------------   Stop  eigene_werte.php    --------------- 
25.05. 08:17:29    -Modell: 
25.05. 08:17:33    -OK. Datenübertragung erfolgreich.
25.05. 08:17:33 |----------------   Stop   keba_wallbox.php   --------------------- 
25.05. 08:17:33    -Multi Regler Auslesen [Stop].
Sollte ich die intelligente Bateriesteuerung wieder im WR aktivieren?
Der WR fängt ja gleichmorgens an den Speicher zu laden, was ich ja gerne auf den Mittag verschoben hätte, lädt auf 100% und fällt dann ab auf 98%. Die ladezeit ist je nach Speicherfülle zwischen 3 1/2 und 4 1/2 Stunden.

So, das war wieder viel zu lang für einen Post. Ich sollte erstmal etwas arbeiten.

Jan

Bogeyof
Beiträge: 950
Registriert: Mi 13. Mai 2020, 10:04
Hat sich bedankt: 17 Mal
Danksagung erhalten: 115 Mal

Re: Kostal neue Firmware aus 11/2020

Beitrag von Bogeyof »

Puh, da bin ich aber froh, dass es eine Erklärung für den Fehler gab, ich hatte langsam keine Idee mehr.
Die Logs zeigen, dass die byd-steuerung durchlaufen wird, dass das LOG-Schreiben jetzt funktioniert und leider, dass es ohne Prognose nicht geht. Da die Prognose nicht vorhanden ist, schlägt z.B. der erste Test schon zu, weil $Prognose nicht > 22000 ist, und die intelligente Steuerung wird ausschaltet.
Die Prognose bei mir liefert auch Sonnenstunden, auch hier gibt es Tests, wenn z.B. die Anzahl Sonnenstunden nach 12:00 kleiner 2 ist, dann wird lieber gleich vollgeladen.
Für eine erste Abhilfe ohne die Prognose einzubauen kannst Du mal fest in die Zeile 228 folgende 2 Zeilen einfügen:

Code: Alles auswählen

$Prognose = 25000;
$Sonnenschein = 3;
Tracelevel wieder auf 8 (oder 6 für gar nichts mehr)

Da Du die Änderungen für Digital-IO auch noch nicht eingebaut hast, kannst Du auch die von mir für Dich geänderte Steuerung nutzen, da wäre das beschriebene und die Änderungen für Digital-IO drin (Setzt MaxSOC auf 98, stoppt das Laden und Entladen nach Zellspannung und nutzt intelligente Batteriesteuerung):

Code: Alles auswählen

#!/usr/bin/php
<?php

/*****************************************************************************
//  Solaranzeige Projekt             Copyright (C) [2015-2020]  [Ulrich Kunz]
//
//  Dieses Programm ist freie Software. Sie können es unter den Bedingungen
//  der GNU General Public License, wie von der Free Software Foundation
//  veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß
//  Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren Version.
//
//  Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es
//  Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne
//  die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN
//  BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
//
//  Ein original Exemplar der GNU General Public License finden Sie hier:
//  http://www.gnu.org/licenses/
//
//  Dies ist ein Programmteil des Programms "Solaranzeige"
//
//  Es dient der Steuerung einer BYD HVS/HVM mit Kostal Plenticore WR
//
*****************************************************************************/
setlocale(LC_TIME,"de_DE.utf8");
$path_parts = pathinfo($argv[0]);
$Pfad = $path_parts['dirname'];

if (is_file($Pfad."/1.user.config.php")) {
  // Handelt es sich um ein Multi Regler System?
  require($Pfad."/1.user.config.php");
}
else {
  require($Pfad."/user.config.php");
}
require_once($Pfad."/phpinc/funktionen.inc.php");
 
if (!isset($funktionen)) {
  $funktionen = new funktionen();
}

// Im Fall, dass man die Device manuell eingeben muss
if (isset($USBDevice) and !empty($USBDevice)) {
  $USBRegler = $USBDevice;
}
//  Ist der Standort in der user.config.php angegeben?
//  Wenn nicht dann Standort Frankfurt nehmen
if (isset($Breitengrad)) {
    $breite = $Breitengrad;
} else {
    $breite = 53.3807019;
}

if (isset($Laengengrad)) {
    $laenge = $Laengengrad;
} else {
    $laenge = 10.0300811;
}
//  Wann ist Mitternacht?
$HeuteMitternacht = strtotime('today midnight');
//  Sonnenaufgang und Sonnenuntergang berechnen (default Standort ist Frankfurt)
$now = time();
$gmt_offset = 1 + date("I");
$zenith = 50 / 60;
$zenith = $zenith + 90;
$Sonnenuntergang = date_sunset($now, SUNFUNCS_RET_TIMESTAMP, $breite, $laenge, $zenith, $gmt_offset);
$Sonnenaufgang = date_sunrise($now, SUNFUNCS_RET_TIMESTAMP, $breite, $laenge, $zenith, $gmt_offset);

$Tracelevel = 6;  //  1 bis 10  10 = Debug
$RemoteDaten = true;
$Device = "WR"; // WR = Wechselrichter
$aktuelleDaten = array();
$Version = "";
$Start = time();  // Timestamp festhalten
$aktuelleDaten["Regler"] = $Regler;
$aktuelleDaten["Objekt"] = $Objekt;
$aktuelleDaten["Firmware"] = 1.3;
//$aktuelleDaten["Produkt"]  = $aktuelleDaten["Seriennummer"];

/****************************************************************************
//  InfluxDB  Zugangsdaten ...stehen in der user.config.php
//  falls nicht, sind das hier die default Werte.
****************************************************************************/
$aktuelleDaten["InfluxAdresse"] = $InfluxAdresse;
$aktuelleDaten["InfluxPort"] = $InfluxPort;
$aktuelleDaten["InfluxUser"] =  $InfluxUser;
$aktuelleDaten["InfluxPassword"] = $InfluxPassword;
$aktuelleDaten["InfluxDBName"] = $InfluxDBName;
$aktuelleDaten["InfluxDaylight"] = $InfluxDaylight;
$aktuelleDaten["InfluxDBLokal"] = $InfluxDBLokal;
$aktuelleDaten["InfluxSSL"] = $InfluxSSL;
$aktuelleDaten["Demodaten"] = false;
$aktuelleDaten["Timestamp"] = $Start;
$aktuelleDaten["InfluxAdresse"] = "localhost";
$aktuelleDaten["InfluxPort"] = "8086";
$aktuelleDaten["InfluxDBName"] = $aktuelleDaten["InfluxDBLokal"];
$aktuelleDaten["InfluxSSL"] = false;


sleep(20);
$funktionen->log_schreiben("-------------   Start  byd_steuerung.php    --------------- ","|--",6);

$COM1 = fsockopen($WR_IP, $WR_Port, $errno, $errstr, 5);   // 5 = Timeout in Sekunden
if (!is_resource($COM1)) {
  $funktionen->log_schreiben("Kein Kontakt zum Wechselrichter ".$WR_IP."  Port: ".$WR_Port,"XX ",3);
  $funktionen->log_schreiben("Exit.... ","XX ",9);
  goto Ausgang;
}

$i = 1;
{

  /****************************************************************************
  //  CvT Anpassungen Auslesen BYD, Voltage, Temperatur, SOH
  ****************************************************************************/
  
  $shell_befehl = "perl /var/www/html/readBYD.pl";
  #print_r ($shell_befehl);
  $temp = shell_exec($shell_befehl);
  $Einzelwerte = preg_split("/[\s,\n ]+/", $temp);
  if ($Einzelwerte[0] == 0) {
     goto Ausgang;
  }
  $aktuelleDaten["CellTempHigh"] = $Einzelwerte[4];
  $aktuelleDaten["CellTempLow"] = $Einzelwerte[5];
  $aktuelleDaten["CellVoltHigh"] = $Einzelwerte[6];
  $aktuelleDaten["CellVoltLow"] = $Einzelwerte[7];
  $aktuelleDaten["SOH"] = $Einzelwerte[11];

  /****************************************************************************
  //  CvT Anpassungen Plenticore auslesen, Batterieinformationen, Stati
  ****************************************************************************/

  // Neue Register Firmware 1.44
  $rc = $funktionen->kostal_register_lesen($COM1,"040E","0002","Float");
  $aktuelleDaten["Max_Charge_Limit"] = $rc["Wert"];
  $rc = $funktionen->kostal_register_lesen($COM1,"0410","0002","Float");
  $aktuelleDaten["Max_Discharge_Limit"] = $rc["Wert"];
  $rc = $funktionen->kostal_register_lesen($COM1,"0438","0001","U16-1");
  $aktuelleDaten["ExternalControl"] = $rc["Wert"];
  $rc = $funktionen->kostal_register_lesen($COM1,"0412","0002","Float");
  $aktuelleDaten["Min_SOC_Rel"] = $rc["Wert"];
  $rc = $funktionen->kostal_register_lesen($COM1,"0414","0002","Float");
  $aktuelleDaten["Max_SOC_Rel"] = $rc["Wert"];
  $rc = $funktionen->kostal_register_lesen($COM1,"0202","0001","U16-1");
  $aktuelleDaten["Bat_Act_SOC"] = $rc["Wert"];
  $rc = $funktionen->kostal_register_lesen($COM1,"0068","0002","U32");
  $aktuelleDaten["Energiemanager_Status"] = $rc["Wert"];
  $SMTest = $rc["Wert"];
  if ($SMTest == 0) {  
     $aktuelleDaten["BatterieStatus"] = "Normal";
  }
  if ($SMTest == 64) {  
     $aktuelleDaten["BatterieStatus"] = "Tiefentladeschutz";
  }
  if ($SMTest == 32) {  
     $aktuelleDaten["BatterieStatus"] = "Ausgleichsladung";
  }
  if ($SMTest == 16) {  
     $aktuelleDaten["BatterieStatus"] = "Ruhe2";
  }
  if ($SMTest == 8) {  
     $aktuelleDaten["BatterieStatus"] = "Ruhe1";
  }
  if ($SMTest == 2) {  
     $aktuelleDaten["BatterieStatus"] = "Notladung";
  }

  /****************************************************************************
  //  Einfache Steuerungen anhand der ausgelesenen Daten für Ladung und SOC
  ****************************************************************************/

  $CellVoltHigh =   $aktuelleDaten["CellVoltHigh"];
  if ($aktuelleDaten["Max_SOC_Rel"] < 98) {
     if ($aktuelleDaten["Bat_Act_SOC"] < 80) {
        $shell_befehl = "python3 /solaranzeige/Kostal_BatMaxSOC.py -s 98";
        $temp = shell_exec($shell_befehl);
        $funktionen->log_schreiben("MaxSOC wieder auf 98 Prozent setzen, ".$aktuelleDaten["Max_SOC_Rel"],"   ",5);
     }
  }
  elseif ((($aktuelleDaten["Bat_Act_SOC"] == 98) or ($CellVoltHigh > 3.6)) and ($aktuelleDaten["ExternalControl"] > 0)) {
     $shell_befehl = "python3 /solaranzeige/Kostal_BatMaxSOC.py -s 90";
     $temp = shell_exec($shell_befehl);
     $funktionen->log_schreiben("MaxSOC auf 90 setzen wegen 98 Prozent SOC oder CellVoltHigh ".$aktuelleDaten["Bat_Act_SOC"]." ".$CellVoltHigh,"   ",5);
  }

  if ($aktuelleDaten["ExternalControl"] > 0) {
    if (($aktuelleDaten["Bat_Act_SOC"] > 92) and ($aktuelleDaten["Bat_Act_SOC"] < 97)) {
        if ($aktuelleDaten["Max_Charge_Limit"] > 3050) {
           $shell_befehl = "python3 /solaranzeige/Kostal_BatMaxChargePower.py -s 3000";
           $temp = shell_exec($shell_befehl);
        }
    }
  }
  if ($aktuelleDaten["Bat_Act_SOC"] > 96) {
      if ($aktuelleDaten["Max_Charge_Limit"] > 2050) {
         $shell_befehl = "python3 /solaranzeige/Kostal_BatMaxChargePower.py -s 2000";
         $temp = shell_exec($shell_befehl);
      }
  }
  if (($aktuelleDaten["Bat_Act_SOC"] < 93) and ($aktuelleDaten["Max_Charge_Limit"] < 3050)) {
      $shell_befehl = "python3 /solaranzeige/Kostal_BatMaxChargePower.py -s 4300";
      $temp = shell_exec($shell_befehl);
  }
  $CellVoltLow = $aktuelleDaten["CellVoltLow"];
  if ($CellVoltLow < 2.9){
     $shell_befehl = "python3 /solaranzeige/Kostal_Bat15000.py";
     $temp = shell_exec($shell_befehl);
     $funktionen->log_schreiben("Batterieentladung gestoppt wegen CellVoltLow ".$aktuelleDaten["Bat_Act_SOC"]." ".$CellVoltLow,"   ",5);
  }

  /****************************************************************************
  //  Einfache Steuerungen für Batterie Modus (intelligent oder normal)
  ****************************************************************************/
  // Abfrage, wie hoch sind die prognostizierten Sonnenstunden
  // Abhaengig davon wird die Intelligente Batteriesteuerung ein-/ausgeschaltet
  $Sonne = "2"; // Hier die benoetigten Sonnenstundeneintragen fuer Nachmittag!
  $MinPrognose = "22000"; // Hier die Mindesprognose eintragen
  $MinSOC = "40"; // Hier den Minimum-SOC eintragen
 
  $Heute = $HeuteMitternacht + (60 * 60 * 23);
  $HeuteNachmittag = $HeuteMitternacht + (60 * 60 * 12);
  $aktuelleDaten["Query"] = "db=" . $InfluxDBLokal . "&q=" . urlencode("select last(SOC) from Batterie");
  $rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
  $SOC = $rc["results"][0]["series"][0]["values"][0][1];
  $aktuelleDaten["Query"] = "db=" . $InfluxDBLokal . "&q=" . urlencode("select (sum(eigenePrognose) + sum(eigenePrognoseL)) / 2 FROM WetterPrognose where time > " . $HeuteMitternacht . "000000000  and time <= " . $Heute . "000000000");
  $rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
  $Prognose = $rc["results"][0]["series"][0]["values"][0][1];
  $aktuelleDaten["Query"] = "db=" . $InfluxDBLokal . "&q=" . urlencode("select sum(Sonnenscheindauer1h) FROM WetterPrognose where time > " . $HeuteNachmittag . "000000000  and time <= " . $Heute . "000000000");
  $rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
  $Sonnenschein = $rc["results"][0]["series"][0]["values"][0][1];
  $funktionen->log_schreiben(var_export($rc, 1), "* ", 10);
  $Prognose = 25000;
  $Sonnenschein = 3;

  if ($SOC < $MinSOC) {
     // Wert ist nicht erreicht.
     $Nachricht = "Intelligente Batteriesteuerung aus, SOC: " . $SOC . " %";
     $aktuelleDaten["BatterieSteuerung"] = "I-St aus -> SOC";
     $funktionen->log_schreiben($Nachricht, "* ", 8);
     $shell_befehl = "python3 /solaranzeige/Kostal_BatN.py";
     $temp = shell_exec($shell_befehl);
  } elseif ($Prognose < $MinPrognose) {
     // Wert ist nicht erreicht.
     $Nachricht = "Intelligente Batteriesteuerung aus, Prognose: " . $Prognose . " W";
     $aktuelleDaten["BatterieSteuerung"] = "I-St aus -> Prognose";
     $funktionen->log_schreiben($Nachricht, "* ", 8);
     $shell_befehl = "python3 /solaranzeige/Kostal_BatN.py";
     $temp = shell_exec($shell_befehl);
  } elseif ($Sonnenschein < $Sonne) {
     // Wert ist nicht erreicht.
     $Nachricht = "Intelligente Batteriesteuerung aus, SonnenStd: " . $Sonnenschein . " Std";
     $aktuelleDaten["BatterieSteuerung"] = "I-St aus -> Sonne";
     $funktionen->log_schreiben($Nachricht, "* ", 8);
     $shell_befehl = "python3 /solaranzeige/Kostal_BatN.py";
     $temp = shell_exec($shell_befehl);
  } else {
     // Wert ist erreicht.
     $Nachricht = "Intelligente Batteriesteuerung ein, Prognose: " . $Prognose . " W";
     $aktuelleDaten["BatterieSteuerung"] = "Intel.-St ein";
     $funktionen->log_schreiben($Nachricht, "* ", 8);
     $shell_befehl = "python3 /solaranzeige/Kostal_BatI.py";
     $temp = shell_exec($shell_befehl);
  }
 
  /****************************************************************************
  //  Einfache Steuerungen für Batterie Nutzung
  ****************************************************************************/
  // Abfrage, wie hoch sind die prognostizierten Ertraege
  // Abhaengig davon wird die Batterienutzung ein-/ausgeschaltet
  $MinPrognose = "18000"; // Hier die Mindestprognose eintragen
  $MinSOC = "10"; // Hier den Minimum-SOC eintragen
  $NightSOC = "75"; // Hier den Minimum-SOC fuer die Nacht eintragen, damit eingeschaltet wird
  $DaySOC = "90"; // Hier den Minimum-SOC fuer den Tag zur sofortigen Umschaltung eintragen

  $aktuelleDaten["BatterieNutzung"] = "";
  $aktuelleDaten["Query"] = "db=" . $InfluxDBLokal . "&q=" . urlencode("select last(BatterieNutzung) from Batterie");
  $rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
  $LBatNutzung = $rc["results"][0]["series"][0]["values"][0][1];
  if (empty($LBatNutzung)) {
     $LBatNutzung = "Noch nicht gesetzt";
  }


  if ($SOC < 1 or $SOC > 100) {
     goto NoValue;
  }

  if ($SOC < $MinSOC) {
     // Wert ist nicht erreicht.
     if ($Prognose < $MinPrognose) {
        // Wert ist nicht erreicht.
        $Nachricht = "Batterienutzung aus, Prognose: " . $Prognose . " W";
        $aktuelleDaten["BatterieNutzung"] = "Nutzung aus -> SOC";
        $funktionen->log_schreiben($Nachricht, "* ", 8);
        $shell_befehl = "python3 /solaranzeige/Kostal_Bat15000.py";
        $temp = shell_exec($shell_befehl);
     }
  }
  // Nur im Winter !!!
  if ($SOC < 25) {
     // Wert ist erreicht.
     if (date("n") > 10 or date("n") < 2) {
		// November inkl. Januar)
        if (date("G") > 07 and date("G") < 20) {
           // nach 07:00 Uhr am Tage
           $Nachricht = "Batterienutzung aus, Winter" . $Prognose . " W";
           $aktuelleDaten["BatterieNutzung"] = "Nutzung aus -> Winter";
           $funktionen->log_schreiben($Nachricht, "* ", 8);
           $shell_befehl = "python3 /solaranzeige/Kostal_BatTC1.py";
           $temp = shell_exec($shell_befehl);
           $shell_befehl = "python3 /solaranzeige/Kostal_Bat15000.py";
           $temp = shell_exec($shell_befehl);
        }
     }
  }
  if ($SOC > $DaySOC) {
     // Wert ist erreicht.
     $Nachricht = "Batterienutzung ein, SOC: " . $SOC . " %";
     $aktuelleDaten["BatterieNutzung"] = "Nutzung ein -> SOC";
     $funktionen->log_schreiben($Nachricht, "* ", 8);
     $shell_befehl = "python3 /solaranzeige/Kostal_Bat50.py";
     $temp = shell_exec($shell_befehl);
     // Nicht Winter, dann TimeControl sofort aus !!!
     if (date("n") < 11 and date("n") > 1) {
        $shell_befehl = "python3 /solaranzeige/Kostal_BatTC0.py";
        $temp = shell_exec($shell_befehl);
     }
  }
  if ($SOC > $MinSOC) {
     // Wert ist erreicht
     if ($Prognose > $MinPrognose) {
        // Wert ist erreicht.
        $Nachricht = "Batterienutzung ein, Prognose: " . $Prognose . " W";
        $aktuelleDaten["BatterieNutzung"] = "Nutzung ein -> Prognose";
        $funktionen->log_schreiben($Nachricht, "* ", 8);
        $shell_befehl = "python3 /solaranzeige/Kostal_Bat50.py";
        $temp = shell_exec($shell_befehl);
        $shell_befehl = "python3 /solaranzeige/Kostal_BatTC0.py";
        $temp = shell_exec($shell_befehl);
     }
  }
  if ($SOC > $NightSOC) {
     // Wert ist erreicht.
     if (date("G") > 19) {
        // nach 20:00 Uhr am Tage
        $Nachricht = "Batterienutzung f?r die Nacht ein, SOC: " . $SOC . " %";
        $aktuelleDaten["BatterieNutzung"] = "Nutzung ein -> NightSOC";
        $funktionen->log_schreiben($Nachricht, "* ", 8);
        $shell_befehl = "python3 /solaranzeige/Kostal_Bat50.py";
        $temp = shell_exec($shell_befehl);
        $shell_befehl = "python3 /solaranzeige/Kostal_BatTC0.py";
        $temp = shell_exec($shell_befehl);
     }
  }
        
NoValue:;

  if (empty($aktuelleDaten["BatterieNutzung"])) {
     $aktuelleDaten["BatterieNutzung"] = $LBatNutzung;
  }

  /****************************************************************************
  //  Weitere Statusabfragen Batterie / Schaltausgang
  ****************************************************************************/
  $shell_befehl = "python3 /solaranzeige/Kostal_NEQ.py";
  $temp = shell_exec($shell_befehl);
  $Einzelwerte = preg_split("/[\s,\n :}{''\]]+/", $temp);
  $aktuelleDaten["Netzbezug"] = $Einzelwerte[5];
  if ($aktuelleDaten["Netzbezug"] > 0) {
   } else {
     $aktuelleDaten["Netzbezug"] = 0;
  }

  $shell_befehl = "python3 /solaranzeige/Kostal_BatTCQ.py";
  $Ergebnis = shell_exec($shell_befehl);
  if ($Ergebnis == 0) {
     $aktuelleDaten["TimeControl"] = "TC aus";
  } else if ($Ergebnis == 1) {
     $aktuelleDaten["TimeControl"] = "TC ein";
  }
  if (empty($aktuelleDaten["TimeControl"])) {
     $aktuelleDaten["TimeControl"] = "TC undefiniert";
  }

  $shell_befehl = "python3 /solaranzeige/Kostal_SMQ.py";
  $temp = shell_exec($shell_befehl);
  $Einzelwerte = preg_split("/[\s,\n :}{''\]]+/", $temp);
  $SMTest = $Einzelwerte[6];
  if ($SMTest == 0) {
      $aktuelleDaten["Schattenmanagement"] = "SM aus";
  }
  if ($SMTest == 1) {
      $aktuelleDaten["Schattenmanagement"] = "SM West";
  }
  if ($SMTest == 2) {
      $aktuelleDaten["Schattenmanagement"] = "SM Ost";
  }
  if ($SMTest == 3) {
      $aktuelleDaten["Schattenmanagement"] = "SM Ost+West";
  }
  if (empty($aktuelleDaten["Schattenmanagement"])) {
      $aktuelleDaten["Schattenmanagement"] = "SM undefiniert";
  }

  /****************************************************************************
  //  ENDE byd_steuerung setzen      
  ****************************************************************************/

  /****************************************************************************
  //  Die Daten werden für die Speicherung vorbereitet.
  ****************************************************************************/
  $aktuelleDaten["Regler"] = $Regler;
  $aktuelleDaten["Objekt"] = $Objekt;
  $aktuelleDaten["Firmware"] = 1.3;
  //$aktuelleDaten["Produkt"]  = $aktuelleDaten["Seriennummer"];

  /****************************************************************************
  //  InfluxDB  Zugangsdaten ...stehen in der user.config.php
  //  falls nicht, sind das hier die default Werte.
  ****************************************************************************/
  $aktuelleDaten["InfluxAdresse"] = $InfluxAdresse;
  $aktuelleDaten["InfluxPort"] = $InfluxPort;
  $aktuelleDaten["InfluxUser"] =  $InfluxUser;
  $aktuelleDaten["InfluxPassword"] = $InfluxPassword;
  $aktuelleDaten["InfluxDBName"] = $InfluxDBName;
  $aktuelleDaten["InfluxDaylight"] = $InfluxDaylight;
  $aktuelleDaten["InfluxDBLokal"] = $InfluxDBLokal;
  $aktuelleDaten["InfluxSSL"] = $InfluxSSL;


  /*********************************************************************
  //  Daten werden in die Influx Datenbank gespeichert. Zuerst Remote
  //  falls vorhanden, danach lokal
  *********************************************************************/

  $aktuelleDaten["Timestamp"] = time();

  if ($InfluxDB_remote) {

     $rc = eigenedaten_speichern($aktuelleDaten);
     $funktionen->log_schreiben("Remote: ".$rc,"|* ",7);
     #print_r ("Remote Schreiben");
  }


  $aktuelleDaten["InfluxAdresse"] = "localhost";
  $aktuelleDaten["InfluxPort"] = "8086";
  $aktuelleDaten["InfluxDBName"] = $aktuelleDaten["InfluxDBLokal"];
  $aktuelleDaten["InfluxSSL"] = false;

  $rc = eigenedaten_speichern($aktuelleDaten);
  $funktionen->log_schreiben("Lokal: ".$rc,"|* ",7);
  #print_r ("Lokales Schreiben");
  
Ausgang:;

}

$funktionen->log_schreiben("-------------   Stop  eigene_werte.php    --------------- ","|--",6);

return;
   

function eigenedaten_speichern($daten)  {

  $query = "";
  $query .= "Service ";
  $query .= "Schattenmanagement=\"" . $daten["Schattenmanagement"] . "\"";
  $query .= " ".$daten["Timestamp"];
  $query .= "\n";										        
  $query .= "Batterie ";
  $query .= "CellTempHigh=".$daten["CellTempHigh"];
  $query .= ",CellTempLow=".$daten["CellTempLow"];
  $query .= ",CellVoltHigh=".$daten["CellVoltHigh"];
  $query .= ",CellVoltLow=".$daten["CellVoltLow"];
  $query .= ",SOH=".$daten["SOH"];
  $query .= ",Min_SOC_Rel=".$daten["Min_SOC_Rel"];
  $query .= ",Max_SOC_Rel=".$daten["Max_SOC_Rel"];
  $query .= ",Max_Charge_Limit=".$daten["Max_Charge_Limit"];
  $query .= ",Max_Discharge_Limit=".$daten["Max_Discharge_Limit"];
  $query .= ",Netzbezug=".$daten["Netzbezug"];
  $query .= ",ExternalControl=".$daten["ExternalControl"];
  $query .= ",TimeControl=\"" . $daten["TimeControl"] . "\"";
  $query .= ",Energiemanager_Status=".$daten["Energiemanager_Status"];
  $query .= ",BatterieStatus=\"".$daten["BatterieStatus"]."\"";
  $query .= ",BatterieSteuerung=\"".$daten["BatterieSteuerung"]."\"";
  $query .= ",BatterieNutzung=\"".$daten["BatterieNutzung"]."\"";
  $query .= " ".$daten["Timestamp"];

  print_r ($query);

  if (isset($daten["InfluxSSL"]) and $daten["InfluxSSL"] == true) {
    $ch = curl_init('https://'.$daten["InfluxAdresse"].'/write?db='.$daten["InfluxDBName"].'&precision=s');
  }
  else {
    $ch = curl_init('http://'.$daten["InfluxAdresse"].'/write?db='.$daten["InfluxDBName"].'&precision=s');
  }

  #print_r ('http://'.$daten["InfluxAdresse"].'/write?db='.$daten["InfluxDBName"].'&precision=s');

  $i = 1;
  do {
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_TIMEOUT, 3);                //timeout in second s
    curl_setopt($ch, CURLOPT_PORT, $daten["InfluxPort"]);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
    if (!empty($daten["InfluxUser"]) and !empty($daten["InfluxPassword"])) {
      curl_setopt($ch, CURLOPT_USERPWD, $daten["InfluxUser"].":".$daten["InfluxPassword"]);
    }
    if (isset($daten["InfluxSSL"]) and $daten["InfluxSSL"] == true) {
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    }
    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $result = curl_exec($ch);
    $rc_info = curl_getinfo ($ch);
    $Ausgabe = json_decode($result,true);

    if (curl_errno($ch)) {
      $Meldung = "Curl Fehler! Daten nicht zur InfluxDB gesendet! Curl ErrNo. ".curl_errno($ch);
    }
    elseif ($rc_info["http_code"] == 200 or $rc_info["http_code"] == 204) {
      $Meldung = "OK. Daten zur InfluxDB  gesendet.";
      break;
    }
    elseif(empty($Ausgabe["error"])) {
      $i++;
      continue;
    }
    else {
      $Meldung = "Daten nicht zur InfluxDB gesendet! info: ".print_r($rc_info,1);
    }
    $i++;
    sleep(2);
    print_r ($Meldung);
  } while ($i < 3);

  curl_close($ch);
  unset($ch);

  return $Meldung;
}


?>
Ist natürlich nur eine teilweise funktionierende Lösung, da er von 3 Sonnenstunden und 25000 kWh Prognose ausgeht. Diese muss irgendwann dazukommen, damit die Steuerung insgesamt richtig arbeiten kann. Aber zum Testen und Durchatmen sollte es reichen...

Ach ja, zu den "Fehlermeldungen" in der PHP.log, das sind nur Hinweise. Im Falle der byd_steuerung ist es weil die Prognose nicht existiert, es wird aber versucht diese aus der Datenbank zu lesen. Danach wird das Ergebnis zurückgeliefert und der Index [series] existiert nicht weil die Abfrage ja fehlschlägt. Das Skript wird aber fortgesetzt und die Meldungen sind erst mal zu vernachlässigen.
Ähnliches vermute ich für keba_wallbox.php, dieses Skript wird zwar durchlaufen, aber die Wallbox antwortet ja nicht, daher kein Model...

Online
Janniman
Beiträge: 123
Registriert: Mi 13. Okt 2021, 09:52
Hat sich bedankt: 11 Mal
Danksagung erhalten: 6 Mal

Re: Kostal neue Firmware aus 11/2020

Beitrag von Janniman »

Danke dir! :D

Bogeyof
Beiträge: 950
Registriert: Mi 13. Mai 2020, 10:04
Hat sich bedankt: 17 Mal
Danksagung erhalten: 115 Mal

Re: Kostal neue Firmware aus 11/2020

Beitrag von Bogeyof »

Gib mir doch mal Deine Postleitzahl (gerne auch per PN) und Deine Anlagedaten (Ost / West / Süd / Größe in kWp und Quadratmeter, Wirkungsgrad Module) . Dann suche ich nach einer passenden Wetterstation und mache ein vorläufige prognose.php fertig. Du musst dann nur noch 2 Dateien kopieren und eine Zeile in der 1.user.config.php ändern um die Prognose zu aktivieren...

Antworten