@mb-stern
Ich habs jetzt so grob am laufen.
Das ist das Skript, eine kleine Doku ist da auch drin.
<?php
//********Hier noch Doku schreiben
//Achtung toDo
//Heizkurve Fusspunkt bei PV Überschuss auf höheren Fusspunkt
//Achtung Forecast PUSH nur wenn auch noch PV Überschuss geheiztr wird OK aber noch testen
//Achtung wenn kein Froecast dann nicht das ganze Skript deaktivieren OK aber noch final testen
//Temperaturen evtl in =,1 er Schritten
//Wenn ip symcon neustartet den Wert für die Heizkurve auf 0 stellen und per Push benachrichtigen
//Winterbetrieb und Überschussbetrieb einbauen
//Alle Konstellatioen testen
//*****************************************************************************************Doku*************************************************************************************************
//20231103 @goifalracer
/* Hier wird bei der Luxtronik die Heizkurve um maximal +- 5 K verstellt. Es dient dazu um in der warmen Tageszeit die die Heizung verstärkt laufen zu lassen.
- Es gibt je nach Betriebsert (Winter oder Übergangsbetrieb) verschiedene Zeiträume die im Webfront eingestellt werden können.
- Es kann festgelegt werden ab welcher Mitteltemperatur (Luxtronik) der Sommer, Übergangs oder Winterbetrieb stattfindet.
- Je nach Betriebsart kann dann die Heizkurve unter Tags erhöht werden und nach einer bestimmten Anhebungszeit (meistens ist das nach einem langen Heiztakt), wieder angeglichen werden.
- In der Übergangszeit wird dann ca. bis 20 Uhr (Webfront) gewartet, bis die nächste Absenkung kommt, sollte die Wärmepumpe gerade heizen, wird der Heiztakt noch fertig gemacht und erst z.B. um 22 Uhr abgesenkt.
- Es wird dann im Übergangsbetrieb auch gleichzeitig über die Smart Grid Eingänge der Luxtronik die Wärmepumpe bis zum nächsten Tag gesperrt.
- Die optimalen Einstellungen und Sperrzeiten im Übergangsbetrieb sind von Haus zu Haus unterschiedlich.
- Im Sommerbetrieb sollte die Heizung nur zwischen 12 und 15 Uhr die Freigabe erhalten und hier sollte die Warmwasserbereitung stattfinden
- Der Winterbetrieb ist anlaog zum Übergangsbetrieb, nur mit dem Unterschied das die Wärmepumpe nicht gesperrt wird, es wird dann nach einer zweiten Zeit (Absenken2) noch tiefer abgesenkt.
- Die Logik und die Anschaltung der Relais für Smart Grid, sowie die Bestimmung ob gerade Sommer, Winter oder Übergangsbetrieb ist, erfolgt komplett in der Wago SPS, sollte IP Symcon mal nicht laufen oder die Luxtronik liefert keinen
Ping, dann wird dieses Skript automatisch deaktiviert.
- Bestimmte Dinge können dann noch von der Wago erledigt werden, die Heizkurve lässt sich über die WAGO nicht verstellen.
Geplant:
- PV- Überschuss über tatsächlichen Überschuss sowie über Forecast von solcast.
- Warmwassertakte verschieben, wenn Ist Temperatur bestimmtes Level noch nicht unterschritten hat.
- Weitere Absenkungen bzw. Erhöhungen bei An- Abwesenheit.*/
//Vars holen
$Istwert_Rücklauftemp = GetValueFloat(43342);
$Sollwert_Rücklauftemp_berechnet = GetValueFloat(31325);
$Istwert_Rücklauftemp = GetValueFloat(43342);
$Mitteltemp = GetValueFloat(11092);
$Warmwasser_Ist = GetValueFloat(51768);
$Aktuelle_Gesamtleistung = GetValueFloat(59815);
$Lieferleistung_PV = GetValueFloat(18736);
$Aktueller_Überschuss = GetValueFloat(27957);
$PV_Überschuss_15min = GetValueInteger(42558);
$Status_Wärmepumpe = GetValueString(22914);
//$Status_Wärmepumpe = GetValueString(32955);
var_dump($Status_Wärmepumpe);
//Forecast die nächsten 8 Stunden holen
$Forecastin1h = GetValueFloat(15688);
$Forecastin2h = GetValueFloat(15349);
$Forecastin3h = GetValueFloat(44097);
$Forecastin4h = GetValueFloat(28490);
$Forecastin5h = GetValueFloat(53868);
$Forecastin6h = GetValueFloat(30723);
$Forecastin7h = GetValueFloat(43274);
$Forecastin8h = GetValueFloat(49883);
//Übergangszeit
//Temperaturverstellung Heizkurve holen
$Ü_Mittags = GetValueFloat(12577);
$Ü_Angleichung = GetValueFloat(54590);
$Ü_Absenkung = GetValueFloat(32767);
//Winterzeit
//Temperaturverstellung Heizkurve holen
$W_Erhöhen = GetValueFloat(47720);
$W_Absenken1 = GetValueFloat(58015);
$W_Absenken2 = GetValueFloat(59807);
//Heiztakt holen
$Heizung_Heiztakt = GetValueBoolean(29403);
//aktuellen Wert der Schnellverstellung holen
$Ist_Verschiebung = GetValueFloat(43365);
//Push Prio
$Push_prio1 = GetValueBoolean(23385);
//Ping Varibale holen (Hier prüfen ob Luxtronic online ist)
$Online = GetValueBoolean(51952);
//EIN/Aus Variable holen
$EIN_AUS = GetValueBoolean(12173);
//Wichtig !!! Errorhandling Forecast einbauen und Vorgabetemperaturen prüfen auf einzuhaltene Differenz von > 1K.
//Errorhandling Forecast auf Änderungen prüfen
//Letzte Änderung ermitteln
$letzte_Änderung = date("d.m.Y H:i:s", IPS_GetVariable(15688)['VariableUpdated']);
//aktuellen UNIX time stamp
$Zeit_UNIXTS = time(); //akteulle Uhrzeit
//Variablen Timestamp in UNIX time wandeln
$letzte_Änderung_UNIXTS = strtotime($letzte_Änderung); //in Unix Zeit wandeln
//Zeit- Differenz ermitteln (in Stunden)
$DiffZeit =(($Zeit_UNIXTS - $letzte_Änderung_UNIXTS)/3600);
$Max_Diff_Zeit =24;
//Zeitbereiche bilden
$aktuelle_uhrzeit = date('H:i:s', $Zeit_UNIXTS);
var_dump($DiffZeit);
//2 Stunden Forecast setzen
if ($Forecastin1h && $Forecastin2h > 2.5)
{
SetValueBoolean(55009,true);
}
else
{
SetValueBoolean(55009,false);
}
$Forecastin2h = GetValueBoolean(55009);
//4 Stunden Forecast setzen
if ($Forecastin1h && $Forecastin2h && $Forecastin3h && $Forecastin4h > 2.5)
{
SetValueBoolean(20428,true);
}
else
{
SetValueBoolean(20428,false);
}
$Forecastin4h = GetValueBoolean(20428);
if ($EIN_AUS == true) //Schalter in Webfront
{
//Prüfen ob WP online ist
if (($Online == true) && ($DiffZeit < $Max_Diff_Zeit))
{
//Witterungsstatus holen 0 = Systemstart 1 = Sommerbetrieb, 2 = Übergangszeit 3 = Winterbetrieb
$Witterungsstatus = GetValueInteger(21458);
//Heizperiode aktiv
if (($Witterungsstatus == 2) || ($Witterungsstatus == 3))
{
$Heizperiode = true;
}
else
{
$Heizperiode = false;
}
//Heiztakt erkennen
if ($Status_Wärmepumpe == "Heizbetrieb")
{
SetValueBoolean(29403,true);
}
elseif (($Status_Wärmepumpe == "Wärmepumpe gesperrt") || ($Status_Wärmepumpe =="Keine Anforderung") || ($Status_Wärmepumpe =="Schaltspielsperre" ))
{
SetValueBoolean(29403,false);
}
//Brauchwassertakt erkennen
if ($Status_Wärmepumpe =="Brauchwasser")
{
SetValueBoolean(18537,true);
}
elseif (($Status_Wärmepumpe == "Wärmepumpe gesperrt") || ($Status_Wärmepumpe =="Keine Anforderung") || ($Status_Wärmepumpe =="Schaltspielsperre" ))
{
SetValueBoolean(18537,false);
}
//Zeiten holen
//Übergangszeit
$tÜbergangStartUNIXTS = GetValueInteger(21100);//Hier beginnt das Heizen im Übergangsbetrieb
$tÜbergangAbsenkenUNIXTS = GetValueInteger(39159);//Hier beginnt das Heizen im Übergangsbetrieb
$tÜbergangEndeUNIXTS = GetValueInteger(30981);//Hier endet das Heizen im Übergangsbetrieb
$Anhebungszeit = GetValueFloat(56551);//Hier Zeit in Webfront eingeben, welche die Dauer der Anhebung der Heizkurve bestimmt
//Wandeln
$tÜbergangStart = date("H:i:s", $tÜbergangStartUNIXTS);
$tÜbergangAbsenken = date("H:i:s", $tÜbergangAbsenkenUNIXTS);
$tÜbergangEnde = date("H:i:s", $tÜbergangEndeUNIXTS);
//Zeit berechnen wann Anhebung der Heizkurve vorbei ist
// Minuten in Stunden und Minuten aufteilen
$Stunden = floor($Anhebungszeit / 60); // Ganze Stunden
$restlicheMinuten = $Anhebungszeit % 60; // Verbleibende Minuten
// Das Ergebnis als Fließkommazahl darstellen
$ZeitinFloat = $Stunden + ($restlicheMinuten / 60);
$Zeitstempel = $tÜbergangStartUNIXTS;
$StundeninFloat = $ZeitinFloat; //als Fließkommazahl
// Umrechnen der Stunden in Sekunden
$SekundenADD = $StundeninFloat * 3600;
// Hinzufügen der Sekunden zum ursprünglichen Timestamp
$ZeitstempeNeu = $Zeitstempel + $SekundenADD;
$Anhebungszeit_berechnet = date('H:i:s', $ZeitstempeNeu);
//Nomalbetrieb in der Übergangszeit
//Sperre wird normal um 11:40 Uhr aufgehoben, hier erfolgt der erste Heiztakt im Absenkbetrieb wegen noch niegrigen AT und um den Heizstab zu unterdrücken
//Anhebung des Fusspunktes bei Aktiver Heizung (Übergangszeit).
if ($Witterungsstatus == 2)
{
if ($aktuelle_uhrzeit == $tÜbergangStart) //Heizkurve erhöhen
{
//Anheben
SetValueFloat(43365,$Ü_Mittags);
IPS_RunScript(41466);
SetValueString(28984,"Betriebsmodus Übergangszeit");
SetValueString(28984,"Heizkurve wurde auf ($Ü_Mittags °C) gesetzt (Überheizen");
SetValueFloat(54847,$Ü_Mittags);//Auf Variable im Webfront den Istwert schreiben
}
elseif ($aktuelle_uhrzeit == $Anhebungszeit_berechnet) //Angleichen nach ersten Heiztakt
{
SetValueFloat(43365,$Ü_Angleichung);
IPS_RunScript(41466);
SetValueString(28984,"Betriebsmodus Übergangszeit");
SetValueString(28984,"Heizkurve wurde auf ($Ü_Angleichung °C) gesetzt (Angleichbetrieb)");
SetValueFloat(54847,$Ü_Angleichung);//Auf Variable im Webfront den Istwert schreiben
}
if (($aktuelle_uhrzeit == $tÜbergangAbsenken) && (!$Heizung_Heiztakt)) //Nur Absenken wenn kein Heiztakt
{
//Absenken wenn aktuell kein Heiztakt besteht
SetValueFloat(43365,$Ü_Absenkung);
IPS_RunScript(41466);
SetValueString(28984,"Betriebsmodus Übergangszeit");
SetValueString(28984,"Heizkurve wurde geplant auf ($Ü_Absenkung °C) gesetzt (Absenkbetrieb)");
SetValueFloat(54847,$Ü_Absenkung);//Auf Variable im Webfront den Istwert schreiben
}
elseif (($aktuelle_uhrzeit == $tÜbergangEnde) && (! $Ist_Verschiebung == $Ü_Absenkung)) //Sperren und Absenken (absenken nur wenn vorher noch Heiztakt war)
{
//Absenken wenn Heitakt fertig ist
SetValueFloat(43365,$Ü_Absenkung);
IPS_RunScript(41466);
SetValueString(28984,"Betriebsmodus Übergangszeit");
SetValueString(28984,"Heizkurve wurde nachträglich auf ($Ü_Absenkung °C) gesetzt (Absenkbetrieb)");
SetValueFloat(54847,$Ü_Absenkung);//Auf Variable im Webfront den Istwert schreiben
}
}
//Winterbetrieb
//Zeiten holen
//Winterzeit
$tWinterErhöhenUNIXTS = GetValueInteger(17567);//Hier beginnt das Heizen im Übergangsbetrieb
$tWinterAbsenken1UNIXTS = GetValueInteger(21264);//Hier endet das Heizen im Übergangsbetrieb
$tWinterAbsenken2UNIXTS = GetValueInteger(23240);//Hier endet das Heizen im Üb
$AnhebungszeitWi = GetValueFloat(36748);//Hier Zeit in Webfront eingeben, welche die Dauer der Anhebung der Heizkurve bestimmt
//Wandeln
$tWinterStart = date("H:i:s", $tWinterErhöhenUNIXTS);
$tWinterAbsenken1 = date("H:i:s", $tWinterAbsenken1UNIXTS);
$tWinterAbsenken2 = date("H:i:s", $tWinterAbsenken2UNIXTS);
//Zeit berechnen wann Anhebung der Heizkurve vorbei ist
// Minuten in Stunden und Minuten aufteilen
$StundenWi = floor($AnhebungszeitWi / 60); // Ganze Stunden
$restlicheMinutenWi = $AnhebungszeitWi % 60; // Verbleibende Minuten
// Das Ergebnis als Fließkommazahl darstellen
$ZeitinFloatWi = $StundenWi + ($restlicheMinutenWi / 60);
$ZeitstempelWi = $tWinterErhöhenUNIXTS;
$StundeninFloatWi = $ZeitinFloatWi; //als Fließkommazahl
// Umrechnen der Stunden in Sekunden
$SekundenADDWi = $StundeninFloatWi * 3600;
// Hinzufügen der Sekunden zum ursprünglichen Timestamp
$ZeitstempelNeuWi = $ZeitstempelWi + $SekundenADDWi;
$Anhebungszeit_berechnetWi = date('H:i:s', $ZeitstempelNeuWi);
if ($Witterungsstatus == 3)
{
if ($aktuelle_uhrzeit == $tWinterStart) //Heizkurve erhöhen
{
//Anheben
SetValueFloat(43365,$W_Erhöhen);
IPS_RunScript(41466);
SetValueString(28984,"Betriebsmodus Winterzeit");
SetValueString(28984,"Heizkurve wurde auf ($W_Erhöhen °C) gesetzt (Überheizen");
SetValueFloat(54847,$W_Erhöhen);//Auf Variable im Webfront den Istwert schreiben
}
elseif ($aktuelle_uhrzeit == $Anhebungszeit_berechnetWi) //Angleichen nach ersten Heiztakt
{
SetValueFloat(43365,$W_Absenken1);
IPS_RunScript(41466);
SetValueString(28984,"Betriebsmodus Winterzeit");
SetValueString(28984,"Heizkurve wurde auf ($W_Absenken1 °C) gesetzt (Absenkbetrieb 1)");
SetValueFloat(54847,$W_Absenken1);//Auf Variable im Webfront den Istwert schreiben
}
if (($aktuelle_uhrzeit == $tWinterAbsenken1) && (!$Heizung_Heiztakt)) //Nur Absenken1 wenn kein Heiztakt
{
//Absenken wenn aktuell kein Heiztakt besteht
SetValueFloat(43365,$W_Absenken2);
IPS_RunScript(41466);
SetValueString(28984,"Betriebsmodus Winterzeit");
SetValueString(28984,"Heizkurve wurde geplant auf ($W_Absenken2 °C) gesetzt (Absenkbetrieb 2)");
SetValueFloat(54847,$W_Absenken2);//Auf Variable im Webfront den Istwert schreiben
}
elseif (($aktuelle_uhrzeit == $tWinterAbsenken2) && (!$Ist_Verschiebung == $W_Absenken2)) //Sperren und Absenken (absenken nur wenn vorher noch Heiztakt war)
{
//Absenken wenn Heitakt fertig ist
SetValueFloat(43365,$Ü_Absenkung);
IPS_RunScript(41466);
SetValueString(28984,"Betriebsmodus Winterzeit");
SetValueString(28984,"Heizkurve wurde nachträglich auf ($W_Absenken2 °C) gesetzt (Absenkbetrieb 2)");
SetValueFloat(54847,$W_Absenken2);//Auf Variable im Webfront den Istwert schreiben
}
}
}
elseif ($Push_prio1 == true)
{
if ($Online == false) //Heizung nicht online
{
WFC_PushNotification(10045, 'Heizung offline', 'Heiz-Automatik wird abgeschaltet','',0);
RequestAction(12173,false); //Überschuss Automatik abschalten
}
elseif ($DiffZeit > $Max_Diff_Zeit) //Forecast hat sich seit Stunden = $Max_Diff_Zeit nicht mahr geändert
{
WFC_PushNotification(10045, 'PV Forecast fehlgeschlagen', 'PV Überschuss-Automatik wird abgeschaltet','',0);
RequestAction(25156,false); //Überschuss Automatik abschalten
}
}
}
else//Rücksetzen damit beim deaktivieren der Automatik das setzen per Hand wieder funktioniert
{
RequestAction(25156,false);
}
Mit dem Skript wird die Kommunikation der WP abgearbeitet, wird jedesmal ausgeführt wenn an der Luxtronik was verstellt wird.
<?php
//includes
include(IPS_GetScriptFile(31140));
include(IPS_GetScriptFile(11039));
IPS_Sleep(1500);
//Verstellung Übergangszeit holen
$Verstellung_Übergabe = GetValueFloat(43365);
//Betriebsart holen
$Witterungsstatus = GetValueInteger(21458);
//Verstellung formatiren
$Verstellung_Übergabe_formatiert = ($Verstellung_Übergabe * 10);
//Status abfragen
if ($Witterungsstatus == 2)
{
$Fußpunkt_Übergabe_fertig = $Verstellung_Übergabe_formatiert;
}
// connecten
$socket = socket_create(AF_INET, SOCK_STREAM,0);
$connect = socket_connect($socket, $IpWwc, $WwcJavaPort) || exit("socket_connect fehlgeschlagen");
if ($connect == 1)
echo "PASS: Verbunden mit WWC Java Console $IpWwc Port: $WwcJavaPort <br>";
else
echo "ERROR: Nicht verbunden mit WWC Java Console <br>";
//Heizkurve verschieben
// Daten senden
$msg = pack('N*',3002); //3002 senden aktivieren
$send=socket_write($socket, $msg, 4);
//SetParameter senden;
$msg = pack('N*',1); //Parameter: 1: steht für Heizurve
$send=socket_write($socket, $msg, 4);
//Heizkurve erhöhen
$msg = pack('N*', $Fußpunkt_Übergabe_fertig); // 5 = um 0.5 Grad erhöhen, 10 = um 1 Grad erhöhen usw. 0 = wieder auf Ausgangspunkt zurück
$send=socket_write($socket, $msg, 4);
//Hier sollte man dann auf erfolgreiches senden zur Wärmepumpe überprüfen
socket_recv($socket,$Test,4,MSG_WAITALL); // lesen, sollte 3002 zurückkommen
$Test = unpack('N*',$Test);
printf('read:%s <br>',implode($Test));
socket_recv($socket,$Test,4,MSG_WAITALL); // lesen, sollte Status zurückkommen z.B. 1
$Test = unpack('N*',$Test);
printf('Status:%s <br>',implode($Test));
$Senden = $Test[1];
$Verstellung_Echo = ($Fußpunkt_Übergabe_fertig/10);
SetValueString(28984,"Sende Verstellung ($Verstellung_Echo °C) !!!");
IPS_Sleep(1500);
if ($Senden == 1){
SetValueString(28984,"Senden erfolgreich");
}
else
{
SetValueString(28984,"Senden fehlgeschlagen");
}
//Verbindung schließen
socket_close($socket);
Mit diesen Skripten lese ich die Istwerte der Steuerung.
<?php
//includes
//include "/home/pi/Novelan/config.php";
//include "/home/pi/Novelan/java_daten.php";
include(IPS_GetScriptFile(31140));
include(IPS_GetScriptFile(11039));
//Dummy Modul anlegen als Heimat der Messdaten im Selben Pfad wie das Script
$parentobject = IPS_GetObject($_IPS['SELF']);
$parentID = $parentobject['ParentID'];
//Variablen
$sBuff = 0;
$time1 = time();
$filename = "test.tst";
$JavaWerte = 0;
$refreshtime = 5; //sekunden
$status="";
echo '<meta http-equiv="refresh" content="5" >';
// connecten
$socket = socket_create(AF_INET, SOCK_STREAM,0);
$connect = socket_connect($socket, $IpWwc, $WwcJavaPort) || exit("socket_connect fehlgeschlagen");
if ($connect = 1)
echo "PASS: Verbunden mit WWC Java Console $IpWwc Port: $WwcJavaPort <br>";
else
echo "ERROR: Nicht verbunden mit WWC Java Console <br>";
$timestamp= time();
$datum = date("d.m.Y",$timestamp);
$uhrzeit = date("H:i:s",$timestamp);
printf('============================================================== <br>');
printf('Ausleszeit: %s - %s Uhr <br>',$datum,$uhrzeit);
printf('Refresh alle 5s !<br>');
printf('! TEST !<br>');
printf('============================================================== <br>');
//---------------------------------------------------------------------------
// Daten holen
$msg = pack('N*',3004);
//printf('msg:%s <br>',$msg);
$send=socket_write($socket, $msg, 4); //3004 senden
//printf('Bytes send:%d <br>',$send);
$msg = pack('N*',0);
//printf('msg:%s <br>',ord($msg));
$send=socket_write($socket, $msg, 4); //0 senden
//printf('Bytes send:%d <br>',$send);
socket_recv($socket,$Test,4,MSG_WAITALL); // Lesen, sollte 3004 zurückkommen
$Test = unpack('N*',$Test);
//printf('read:%s <br>',implode($Test));
socket_recv($socket,$Test,4,MSG_WAITALL); // Status
$Test = unpack('N*',$Test);
printf('Status:%s <br>',implode($Test));
socket_recv($socket,$Test,4,MSG_WAITALL); // Länge der nachfolgenden Werte
$Test = unpack('N*',$Test);
printf('Länge der nachfolgenden Werte:%s <br>',implode($Test));
$JavaWerte = implode($Test);
printf('============================================================== <br>');
for ($i = 0; $i < $JavaWerte; ++$i)//vorwärts
{
socket_recv($socket,$InBuff[$i],4,MSG_WAITALL); // Lesen, sollte 3004 zurückkommen
$daten_raw[$i] = implode(unpack('N*',$InBuff[$i]));
//printf('InBuff(%d): %d <br>',$i,$daten_raw[$i]);
}
//socket wieder schliessen
socket_close($socket);
// Werte anzeigen
for ($i = 0; $i < $JavaWerte; ++$i)//vorwärts
{
if ($i >= 10 & $i <= 28) // Temperaturen
{($daten_raw[$i] = $daten_raw[$i]*0.1);
//printf('(%d)%s : %.1f °C<br>',$i,$java_dataset[$i],$daten_raw[$i]);
$varid = CreateVariableByName($parentID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "Temperatur_200_C", $i);//float
setValueFloat($varid,$daten_raw[$i]);
}
if ($i == 56) // Zähler
{($daten_raw[$i] = $daten_raw[$i]/3600);
//printf('(%d)%s : %.2f h<br>',$i,$java_dataset[$i],$daten_raw[$i]);
$varid = CreateVariableByName($parentID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
setValueFloat($varid,$daten_raw[$i]);
}
if ($i == 57) // Zähler
{($daten_raw[$i] = $daten_raw[$i]);
//printf('(%d)%s : %d<br>',$i,$java_dataset[$i],$daten_raw[$i]);
$varid = CreateVariableByName($parentID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
setValue($varid,$daten_raw[$i]);
}
if ($i == 58) // Zähler
{($daten_raw[$i] = $daten_raw[$i]/3600);
//printf('(%d)%s : %.2f h<br>',$i,$java_dataset[$i],$daten_raw[$i]);
$varid = CreateVariableByName($parentID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
setValueFloat($varid,$daten_raw[$i]);
}
if ($i == 59) // Zähler
{($daten_raw[$i] = $daten_raw[$i]);
//printf('(%d)%s : %d<br>',$i,$java_dataset[$i],$daten_raw[$i]);
$varid = CreateVariableByName($parentID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
setValue($varid,$daten_raw[$i]);
}
if ($i >= 60 & $i <= 66) // Zähler
{($daten_raw[$i] = $daten_raw[$i]/3600);
//printf('(%d)%s : %d h<br>',$i,$java_dataset[$i],$daten_raw[$i]);
$varid = CreateVariableByName($parentID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
setValueFloat($varid,$daten_raw[$i]);
}
if ($i >= 95 & $i <= 99) // Errors
{
//printf('(%d)%s : %d<br>',$i,$java_dataset[$i],$daten_raw[$i]);
$varid = CreateVariableByName($parentID, $java_dataset[$i], 3, 'WP_'.$java_dataset[$i], "", $i);//integer
$FehlerDatum = date("m.d.y",$daten_raw[$i]);
setValueString($varid,$FehlerDatum);
}
if ($i >= 100 & $i <= 105) // Errors
{
//printf('(%d)%s : %d<br>',$i,$java_dataset[$i],$daten_raw[$i]);
$varid = CreateVariableByName($parentID, $java_dataset[$i], 3, 'WP_'.$java_dataset[$i], "", $i);//integer
setValueString($varid,$daten_raw[$i]);
}
if ($i == 119) // Anlagenstatus
{
// printf('(%d)%s : %d',$i,$java_dataset[$i],$daten_raw[$i]);
switch ($daten_raw[$i]) {
case 0:
$status = "Heizbetrieb";
break;
case 1:
$status = "Keine Anforderung";
break;
case 2:
$status = "Netz-Einschaltverzögerung";
break;
case 3:
$status = "Schaltspielsperre";
break;
case 4:
$status = "Wärmepumpe gesperrt";
break;
case 5:
$status = "Brauchwasser";
break;
case 6:
$status = "Estrich-Programm";
break;
case 7:
$status = "Abtauen";
break;
case 8:
$status = "Pumpenvorlauf";
break;
case 9:
$status = "Therm. Desinfektion";
break;
case 10:
$status = "Kühlbetrieb";
break;
case 11:
$status = "unbekannt";
break;
case 12:
$status = "Schwimmbad";
break;
case 13:
$status = "Heizen extern";
break;
case 14:
$status = "Brauchwasser extern";
break;
case 15:
$status = "unbekannt";
break;
case 16:
$status = "Durchflussüberwachung";
break;
case 17:
$status = "ZWE Betrieb";
break;
}
//printf ($status);
$varid = CreateVariableByName($parentID, $java_dataset[$i], 3, 'WP_'.$java_dataset[$i], "", $i);//integer
setValueString($varid,$status);
}
}
function CreateVariableByName($id, $name, $type, $ident, $profile, $position)
{
$vid = @IPS_GetObjectIDByIdent ($ident, $id);
if($vid === false)
{
$vid = IPS_CreateVariable($type);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
IPS_SetIdent($vid, $ident);
IPS_SetInfo($vid, "");
IPS_SetPosition($vid, $position);
if($profile !== "")
{
IPS_SetVariableCustomProfile($vid, $profile);
}
}
return $vid;
}
?>
<?php
$java_dataset = array("1","2","3","4","5","6","7","8","9","10",
"Temperatur_TVL_Vorlauf",
"Temperatur_TRL_Ruecklauf",
"Sollwert_TRL_HZ_Ruecklauf_Soll",
"Temperatur_TRL_ext_Ruecklauf_Extern",
"Temperatur_THG_Heissgas",
"Temperatur_TA_Aussenfuehler",
"Mitteltemperatur",
"Temperatur_TBW",
"Einst_BWS_akt",
"Temperatur_TWE_Waermequelle_Ein",
"Temperatur_TWA_Waermequelle_Aus",
"Temperatur_TFB1",
"Sollwert_TVL_MK",
"Temperatur_RFV",
"Temperatur_TFB2",
"Sollwert_TVL_MK2",
"Temperatur_TSK",
"Temperatur_TSS",
"Temperatur_TEE",
"ASDin",
"BWTin",
"EVUin",
"HDin",
"MOTin",
"NDin",
"PEXin",
"SWTin",
"AVout",
"BUPout",
"HUPout",
"MA1out",
"MZ1out",
"VENout",
"VBOout",
"VD1out",
"VD2out",
"ZIPout",
"ZUPout",
"ZW1out",
"ZW2SSTout",
"ZW3SSTout",
"FP2out",
"SLPout",
"SUPout",
"MZ2out",
"MA2out",
"Zaehler_BetrZeitVD1",
"Zaehler_BetrZeitImpVD1_Impulse_Verdichter",
"Zaehler_BetrZeitVD2",
"Zaehler_BetrZeitImpVD2",
"Zaehler_BetrZeitZWE1",
"Zaehler_BetrZeitZWE2",
"Zaehler_BetrZeitZWE3",
"Zaehler_BetrZeitWP",
"Zaehler_BetrZeitHz",
"Zaehler_BetrZeitBW",
"Zaehler_BetrZeitKue",
"Time_WPein_akt",
"Time_ZWE1_akt",
"Time_ZWE2_akt",
"Timer_EinschVerz",
"Time_SSPAUS_akt",
"Time_SSPEIN_akt",
"Time_VDStd_akt",
"Time_HRM_akt",
"Time_HRW_akt",
"Time_LGS_akt",
"Time_SBW_akt",
"Code_WP_akt",
"BIV_Stufe_akt",
"WP_BZ_akt",
"SoftStand1",
"SoftStand2",
"SoftStand3",
"SoftStand4",
"SoftStand5",
"SoftStand6",
"SoftStand7",
"SoftStand8",
"SoftStand9",
"SoftStand10",
"AdresseIP_akt",
"SubNetMask_akt",
"Add_Broadcast",
"Add_StdGateway",
"ERROR_Time0",
"ERROR_Time1",
"ERROR_Time2",
"ERROR_Time3",
"ERROR_Time4",
"ERROR_Nr0",
"ERROR_Nr1",
"ERROR_Nr2",
"ERROR_Nr3",
"ERROR_Nr4",
"AnzahlFehlerInSpeicher",
"Switchoff_file_Nr0",
"Switchoff_file_Nr1",
"Switchoff_file_Nr2",
"Switchoff_file_Nr3",
"Switchoff_file_Nr4",
"Switchoff_file_Time0",
"Switchoff_file_Time1",
"Switchoff_file_Time2",
"Switchoff_file_Time3",
"Switchoff_file_Time4",
"Comfort_exists",
"HauptMenuStatus_Zeile1",
"HauptMenuStatus_Zeile2",
"Anlagenstatus",
"HauptMenuStatus_Zeit",
"HauptMenuAHP_Stufe",
"HauptMenuAHP_Temp",
"HauptMenuAHP_Zeit",
"SH_BWW",
"SH_HZ",
"SH_MK1",
"SH_MK2",
"Einst_Kurzrpgramm",
"StatusSlave_1",
"StatusSlave_2",
"StatusSlave_3",
"StatusSlave_4",
"StatusSlave_5",
"AktuelleTimeStamp",
"SH_MK3",
"Sollwert_TVL_MK3",
"Temperatur_TFB3",
"MZ3out",
"MA3out",
"FP3out",
"Time_AbtIn",
"Temperatur_RFV2",
"Temperatur_RFV3",
"SH_SW",
"Zaehler_BetrZeitSW",
"FreigabKuehl",
"AnalogIn",
"SonderZeichen",
"SH_ZIP",
"WebsrvProgrammWerteBeobarten",
"WMZ_Heizung",
"WMZ_Brauchwasser",
"WMZ_Schwimmbad",
"WMZ_Seit",
"WMZ_Durchfluss",
"AnalogOut1",
"AnalogOut2",
"Time_Heissgas");
?>
<?php
// Hier werden die Config Variablen gespeichert
$IpWwc = "192.168.17.22";
$WwcJavaPort = "8889";
$SiteTitle = "WÄRMEPUMPE";
// Debug Ausgaben
//$DEBUG = true;
?>
Die Smart Grid Ansteuerung sowie die Bildung, ob gerade Winter, Übergangs oder Sommerbetrieb ist, läuft bei mir in der Wago SPS.
Vielleicht kannst du Dir hier was zusammenbauen.