Wärmepumpen mit Luxtronik 2 auslesen, verarbeiten und erweitern - AlphaInnotec, Novelan und andere

OK, hab jetzt unten einfach
$array[268]->SetParent = 41072;
ergänzt.
Fehler bleibt aber bestehen.

okay, dann prüfe jetzt noch bitte die WPValue… da stehen bei mir bis in Zeile 259 was drin, also bis Schlüssel 259. Ergänze das auch noch bis…sagen wir 270…
also

„Unbekannt 259“,
„Unbekannt 260“,
„Unbekannt 261“,
„Unbekannt 262“,
„Unbekannt 263“,
„Unbekannt 264“,
„Unbekannt 265“,
„Unbekannt 266“,
„Unbekannt 267“,
„Unbekannt 268“,
„Unbekannt 269“,
„Unbekannt 270“,
);
Danach sollte der Hinweis mit dem fehlenden Schlüssel weg sein.

Super, hat geklappt. Ich danke dir

@mb-stern
Also ich verwende auch die Befehle zum Schreiben wie du.
Momentan um die Wärmepumpe von den Takten her in den Stunden ab 12 Uhr zu bringen.

Ich passe hier diese Werte an.

1: Temperatur SetBack
	Value: -5 bis +5
   Allow only integer temperature or with decimal .5
	$setValue = int($realValue * 2) * 5;

kann hiermit ganz gut den Rücklauf Soll verstellen.

Was würdest du noch gerne verstellen können?
Mir fällt spontan die Schnellladung vom Brauchwasser ein.

Was machst du da ganz genau, kapiere das nicht?
Und die Befehle sind mir irgendwie fremd, was hast du für eine Firmware drauf? Ist das immer noch Java?
Habe gelesen dass ab FW 3.81 die Kommunikation über Websocket läuft.
Ich habe zwar V3.86.1 (r7762) drauf aber noch keien Verbindung über Websockets hingekriegt. Java läuft aber weiterhin…

Ich habe die 2.81 drauf. Werde da auch nichts ändern.
Ich schreibe einfach eine Temperaturänderung an die Steuerung und je nach Mitteltemperatur sende ich dann Absenkungen oder zur Mittagszeit Erhöhungen.
Somit nutze ich die warmen Stunden um leicht zu überheizen und in den kalten Stunden heize ich nachts nur so viel wie nötig. Aktuell ist die Heizung nachts ganz aus. Die macht aktuell um 12 uhr einen 2 Stunden langen Heiztakt + Warmwasser, das reicht bis zum nächsten Tag um 12 Uhr.

Ich bin momentan noch am testen, wenn ich etwas weiter bin stelle ich das mal hier ein.

@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&auml;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 &#176C<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.

Hi,

vielen Dank für das tolle Skript - hatte das mal vor der IP-Symcon Zeit direkt auf meiner Wago implementiert mit vielen Try & Errors. So schaut mir das deutlich bequemer aus.

Bei dem Skript habe ich beim Test-Ausführen von wpWorking folgende Meldungen und bin für jede Hilfe dankbar:

OK - Verbunden mit WWC Java Console 192.168.50.120 Port: 8888
Warning: bcmul(): bcmath function argument is not well-formed in C:\ProgramData\Symcon\scripts\21639.ips.php on line 44

Warning: Cannot auto-convert value for parameter pVariableType (invalid stod argument) in C:\ProgramData\Symcon\scripts\21639.ips.php on line 34

Warning: Root kann nicht geändert werden in C:\ProgramData\Symcon\scripts\21639.ips.php on line 36

Warning: Variable #0 existiert nicht in C:\ProgramData\Symcon\scripts\21639.ips.php on line 37

Warning: Variable mit dem Namen Vorlauf konnte nicht gefunden werden in C:\ProgramData\Symcon\scripts\55479.ips.php on line 14

Warning: Variable #0 existiert nicht in C:\ProgramData\Symcon\scripts\55479.ips.php on line 14

Bei Problem/Warnung 1 folgende Änderung versucht - ohne Erfolg:
return bcmul((string)$data, (string)((float)‚0.1‘), 2); bcmul will wohl string formate haben…

damit geht es dann für Fehler 1:
return bcdiv($data, 10, 2); funktioniert wohl

Allerdings kann das Skript wohl die Variablen nicht erstellen… dazu fehlt mir die Erfahrung in Symcon.

Ich bin begeisterter Nutzer vom Skript , welches @tomquenten1 hier zur Verfügung gestellt hat.
Alpha Innotec hat die letzten Monate viele neue Firmwareversionen für den Lux2 Controller rausgebracht.

Nutzt jemand schon die aktuelle Firmware, und kann bestätigen das das tolle Skript noch funktioniert.

bekommt man da auch den Wert
vom Abtaubedarf ausgelesen ?

Ich hänge mich mal an die Frage mit ran :wink:

Und wofür braucht du den wert ?

Codeschnipsel für den Abtaubedarf (wie lange es noch dauert bis es soweit ist)…

if ($i == 141) // Abtauen in ...
	{
	   $varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 3, 'WP_'.$java_dataset[$i], "", $i);//integer
       $time = $daten_raw[$i]; // time duration in seconds

        $hours = floor($time / (60 * 60));
        $time -= $hours * (60 * 60);

        $minutes = floor($time / 60);
        $time -= $minutes * 60;
        
        $WPseit = "{$hours}h {$minutes}m";
		SetValue($varid,$WPseit);
    }

bei meiner LWDV wird der Abtaubedarf in % angegeben :thinking:

Die meisten Werte stehen zuverlässig in diesem Wiki
Etwas anderes kenne ich nicht…
Java Webinterface - LoxWiki - LoxWiki (atlassian.net)

1 „Gefällt mir“

die Liste ist gut, weil viele IDs eine vernüftige Beschreibung haben :+1:

wie sähe der code aus wenn ich alles doch in Sekunden haben möchte ?

Müsst so klappen

if ($i == 141) // Abtauen in (Sekunden)
{
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 3, 'WP_'.$java_dataset[$i], "", $i);//integer	
setValue($varid,$daten_raw[$i];
 }

Besten dank klappt gut

Es gibt nun ein Modul für die Luxtronic…
[Modul] WPLUX Symcon - IP-Symcon / PHP-Module (Diskussion) - IP-Symcon Community

1 „Gefällt mir“