Automatisierte Poolsteuerung

Hallo Forengemeinde,

nach einigen Jahren des Überlegens hatte ich mich entschlossen in 2014 ein Poolprojekt zu starten. Nicht so ganz gross (4,5mx3mx1,5m), da unser Haus am Hang liegt und der Pool in die Terrassierung des Grundstücks eingefügt werden musste.

Nachdem ich aufgrund des guten Wetters noch den Rohbau und die Zu- und Ableitungen fertig bekommen habe, wollte ich mir über die Winterpause Gedanken machen, wie ich den Pool den steuern werde. Mir war relativ schnell klar, dass ich keine Lust habe alle paar Tage die Werte von Hand zu messen und mit Chemie einzustellen.

Ich habe mir also eine kleine Anforderungsliste gebaut:

  1. Visualisierung in IP-Symcon Webfront muss gehen
  2. Poolsteuerung muss autark von anderen Systemen funktionieren
  3. Automatische Dosierung, dieses bedingt automatische Messung der Werte
  4. Temperaturmessung wäre schön, ginge aber auch direkt mit 1-W und IPS
  5. Pumpen und Solarventilsteuerung
  6. Preislich sollte das Ganze erschwinglich bleiben, ein paar hunderter vielleicht.

Im Grunde, so sollte man meinen eigentlich nicht so schwierig. Beim googeln hat mich dann aber fast der Schlag getroffen: Die kommerziellen Systeme liegen alle im mehrfachen vierstelligen Bereich.

Ich habe ich dann aber an einen Beitrag vor einigen Jahren erinnert, wo ich glaube @swissboy mit einem Privatentwickler Kontakt hatte, der solche Steuerungen baut. Die Daten sind wohl, da das Protokoll offen liegt auch in IPS visualisierbar.

Ich habe ein wenig weiter gegoogelt, und habe die Webseite tatsächlich wiedergefunden:

http://rz-home.de/~fkiesow/Solarsteuerung/solarsteuerung.htm

Wie man nachlesen kann, werden alle meine Anforderungen erfüllt oder übererfüllt:

  • Zeitliche Filterpumpen Steuerung
  • Temperaturabhängige Solarabsorber Steuerung
  • Dosier Steuerung ( pH-, pH+, Chlor, Salzelektrolyse)
  • DMX512 Steuerung ( 16 Ch DMX Steuerung, ArtNet)
  • Funk Gateway Steuerung (EnOcean, Thermokon STC)
    -Benachrichtigungsoption via email

Visualisierung von:

  • Pool Temperaturwerte
  • pH und Redox Messwerte
  • pH / CL Kanister- Restmenge
  • Kesseldruckwerte
  • Füllstandshöhen
  • Feuchtesensoren
  • Durchflussmenge(Messarmatur)

Und vor allem, der Preis für die Steuerung (natürlich ohne Elektroden, Armaturen, etc) lag bei unter 500€ :):):slight_smile:

Nach ein paar eMails, die alle extrem schnell und vor allem super nett beantwortet wurden, habe ich mich entschieden, das Teil zu kaufen. Da die aktuellen Platinen zu diesem Zeitpunkt gerade beim Bestücker waren, bat mich Frank, so heißt der Entwickler, noch ein wenig zu warten, was für mich kein Problem darstellte.

Der Hammer war, dass ich kurze Zeit später von einem anderen Nutzer der Steuerung kontaktiert wurde, ob ich im Rahmen einer Sammelbestellung noch Zubehör, d.h. Elektroden, usw bestellen wollte. Das war natürlich ideal, konnte ich mir so von den Poolbesitzern mit Erfahrung mir ein Paket zusammenstellen lassen, und ich musste nicht aufwendig recherchieren. Nachdem diese Teile fast zeitgleich mit den bestückten Platinen ankamen, haben die beiden untereinander den Versand geregelt und gestern dann das Paket - rechtzeitig vor Weihnachten zum Ausprobieren - auf den Weg geschickt.

Das ganze soll heute geliefert werden. Ich bin mal gespannt und werde hier weiter berichten. Ich bin mir sicher, dass hier im Nutzerkreis auch der eine oder andere Poolbesitzer ist oder dazukommt.

wupperi

Fast diegleichen Überlegungen hatte ich diese Jahr auch. Da die Anforderungen etwas anders sind als bei Dir, hab ich mich für ein Pokeys entschieden. Wichtig war mir, dass die Steuerung autark läuft und trotzdem mit IPS kommuniziert. Die Aufgaben sind dabei

  1. Schalten der Filterpumpe (simple Zeitschaltung)
  2. Kontrolle der Dosierpumpe für pH-minus
  3. Kontrolle der Elektrolyse
  4. Steuerung der Rolloabdeckung (Auswerten des Hallsensors im Rolladenmotor, darüber Bestimmung der Endlagen, Motor bremsen beim Erreichen der Endlage, Blockieren der Gegenstromanlage bei Rolladenfahrt, Einschalten der Sprayreinigung beim Öffnen)
  5. Wahl des Filterkreislaufs (Rollo offen und Aussentemp über 20º -> Schwallwassertank und Überlaufrinne, sonst interne Ansaugfittinge
  6. Wasserstandskontrolle vom Schwallwassertank, auffüllen oder abpumpen (Da das Abpumpen bei Starkregen kritisch ist und der Technikschacht absaufen könnte, gibt es hierfür noch ein Backup mit einer zweiten Pumpe mit Schwimmerschalter)
    7.Temperaturüberwachung, Heizkreislauf einschalten und WP überwachen. Wenn der Holzvergaser läuft, wird statt WP der HV genutzt, unter -2º Aussentemperatur läuft der WP-Kreislauf zum Frostschutz mit
  7. Falls der Holzvergaser seine Wärme nicht los wird und die Puffer voll sind, geht die Wärme lieber in den Pool, bevor die TAS anspringen könnte
  8. ein paar kleine Spielereien mit Licht und Springbrunnen in Pool und Überlaufrinne , abhängig von Helligkeit und gewähltem Filterkreislauf.

Alles in allem ist das Ganze doch komplizierter geworden als anfangs gedacht, die letzten Rohre für den HV werden vielleicht noch diese Jahr fertig. Pokeys läuft mit IPS in den Grundzügen, ist aber noch in Arbeit. Der HV soll wahrscheinlich auch noch ein Pokeys bekommen, aber das dauert noch.

Sobald das alles vorzeigbar ist, werd ich es mal posten

So long,
Sven

Hallo Wupperi,

da sich gerade unsere Poolsteuerung verabschiedet hat, bin ich auf der Suche nach einer neuen Steuerung.
Wie sind denn deine Erfahrungen bisher mit der WEBbasierten Steuerung?

Kannst du bitte kurz berichten.

Braucht man für die Filterpumpe zusätzliche Relais/Schütze? Oder kann die Steuerung direkt diese Last schalten.

Gruß Jogel

Sorry, habe den Beitrag eben erst gesehen, aber Du hattest ja auch per PN gefragt :slight_smile:
Ja, die Relais des Controllers schalten nur Kleinlasten. Da muss ein Last-Relais dazwischen. Zur Sicherheit habe ich an meine Kontroller-Dosierpumpen Ausgänge noch Treppenhausautomaten dran.

Meine Erfahrungen sind durchweg positiv nach nunmehr 5 Monaten. Kein Ausfall, tut genau was es soll, und das wichtigste: Immer gutes Wasser. Wurde durch meine Referenzmessungen mit dem Scuba II bestätigt.

Das Allerneueste: Ich habe gerade eine Chlor Elektrode zusätzlich zu der Redox und PH Elektrode eingebaut. Dazu dann einen Potentiostaten von Frankie und Lembi (Die bauen die Steuerung). Das Ding misst jetzt mein freies Chlor direkt, ohne Redox Umweg. Bisher stimmen die Werte absolut mit denen vom Scuba überein.

Ich kann also jetzt direkt den Chlorwert in IP-Symcon ablesen. Klasse!

Danke für die Info,

ich habe mittlerweile ja auch den PoolController in Betrieb.
Leider bisher nur die Relais. und Temperatur-Sensoren. mir war es wichtig erstmal die defekte Steuerung zu ersetzen.
Ich habe schon gesehen, dass du fleissig ausgebaut hast, dass steht bei mir auch noch an. Aber eins nach dem anderen. Bin auch begeistert. Kann es eigentlich gar nicht erwarten, das ich weiter ausbaue.
Die Einbindung in IPS steht bei mir auch noch an. Bisher habe ich das Skript hier aus dem Forum laufen (ohne Archiv), mit einem Timerintervall von 30sec um zu schauen ob der PoolController das beantworten kann. Und bisher keine Probleme.
Dieses Skript erzeugt in den meisten Fällen Textvariablen. Das gefällt mir persönlich nicht, ich hätte gern Integer.
muss mal schauen wie ich das löse. Ich als Programierlaie habe nur die Idee das ich zu jeder Textvariable eine Intergervariable anlege und bei jeder Änderung in der Textvariable ein Script aufzurufen, das dann daraus die Intergervariable updatetet. Ist nicht das schönste, aber ich trau mir nicht zu, das Orginalsript zu ändern.
Habe ich das richtig verstanden, das du die Wärmepumpe über einen Ferngesteuerten Schalter, der die internen Taster bedient und nicht direkt über HTML das Relais schaltest? Ich habe gar keine Ahnung ob das Schalten per HTML überhaupt funktionieren würde.

Gruß Jogel

Gruß Jogel

:slight_smile: Freut mich wupperi das das Teil bei dir so gut laueft… Ich musste kurzfristig den Controller weg geben da unser whirlpool nicht so lief wie er Sollte… Aber Schon bald kommt Wieder Ein pool oder whirlpool und da beschaff ich den controller Wieder. Wo setzt du das Ein?

Habe einen 19cbm Pool. Läuft cht perfekt das Teil. Mit der Chlorsonde sogar mit direkter Chlorgehaltablesung. Die stimmt auch gut mit meinem Scuba ueberein.

Nächster Schritt wird dann wohl seinndie Dosierung von Redox auf Chlorgehalt umzustellen.

So mache das auch, allerdinsg floats, dann habe ich die Kommagenauigkeit:



?$string_rueck_solar=getvalue(24452 /*[Pool\Poolcontroller\Solar und Pool Control\10_Rücklauf Solar]*/);$string_rueck_wp=getvalue(23559 /*[Pool\Poolcontroller\Solar und Pool Control\11_Rücklauf WP]*/);$string_solar_fuehler=getvalue(36783 /*[Pool\Poolcontroller\Solar und Pool Control\12_Solarfühler]*/);$string_pumpenschacht=getvalue(34402 /*[Pool\Poolcontroller\Solar und Pool Control\13_Pumpenschacht]*/);$string_aussen=getvalue(56538 /*[Pool\Poolcontroller\Solar und Pool Control\14_Aussen]*/);$string_unterverteilung=getvalue(33358 /*[Pool\Poolcontroller\Solar und Pool Control\15_Unterverteilung]*/);$string_kesseldruck=getvalue(55350 /*[Pool\Poolcontroller\Solar und Pool Control\3_Kesseldruck]*/);$string_chlor=getvalue(51449 /*[Pool\Poolcontroller\Solar und Pool Control\1_Chlor]*/);//echo ($string_chlor);
$float_rueck_solar = tofloat($string_rueck_solar);$float_rueck_wp = tofloat($string_rueck_wp);$float_solar_fuehler = tofloat ($string_solar_fuehler);$float_pumpenschacht = tofloat($string_pumpenschacht);$float_aussen = tofloat($string_aussen);$float_unterverteilung = tofloat ($string_unterverteilung);$float_kesseldruck = tofloat($string_kesseldruck);$float_chlor = tofloat($string_chlor);
setvalue (13498 /*[Pool\Poolcontroller\Floatvars\Temp_Rück_Solar]*/,$float_rueck_solar);setvalue (18881 /*[Pool\Poolcontroller\Floatvars\Temp_Rück_WP]*/, $float_rueck_wp);setvalue (44957 /*[Pool\Poolcontroller\Floatvars\Temp_Solarfühler]*/, $float_solar_fuehler);setvalue (13195 /*[Pool\Poolcontroller\Floatvars\Temp_Pumpenschacht]*/, $float_pumpenschacht);setvalue (19427 /*[Pool\Poolcontroller\Floatvars\Temp_Aussen]*/, $float_aussen);setvalue (14248 /*[Pool\Poolcontroller\Floatvars\Temp_Unterverteilung]*/, $float_unterverteilung);setvalue (11935 /*[Pool\Poolcontroller\Floatvars\Kesseldruck]*/, $float_kesseldruck);setvalue (36568 /*[Pool\Poolcontroller\Floatvars\Freies Chlor]*/,$float_chlor);
function tofloat($num) {    $dotPos = strrpos($num, '.');    $commaPos = strrpos($num, ',');    $sep = (($dotPos > $commaPos) && $dotPos) ? $dotPos :        ((($commaPos > $dotPos) && $commaPos) ? $commaPos : false);
    if (!$sep) {        return floatval(preg_replace("/[^0-9]/", "", $num));    }
    return floatval(        preg_replace("/[^0-9]/", "", substr($num, 0, $sep)) . '.' .        preg_replace("/[^0-9]/", "", substr($num, $sep+1, strlen($num)))    );}

?>


EDIT: Der Code oben ist 1:1 aus meinem IPS kopiert, und hier mit PHP Tags eingefügt. Irgendwie werden CRLF nicht übernommen :frowning:

Ja, ist im Grunde eine kombinierte Hard/Softwarelösung. IPS wertet Stromangebot von der PV aus -> IPS schaltet 1-Wire Modul -> Poolcontroller wertet Schaltzustand 1-Wire aus -> Poolcontroller schaltet Vorlaufventil zur Wärmepumpe wenn bestimmte Regeln im Controller zutreffen.

Das ganze einfach über html zu schalten ist mir gar nicht eingefallen. Ich habe gerade mal im Handbuch nachgesehen, man kann nur die aktuellen Zustände am Controller auslesen, aber nicht setzen. Geht also nur über den hardwareweg mit DigitalIn.

Interessieren würde mich das Teil auch mal, aber ich finde leider so gar keine Unterlagen dazu.
Gibt es ein PDF oder ein anderes Dokument, das man sich mal ansehen könnte?

Es gibt eine 100-seitige Doku. Ich würde die ungern versenden, weil ich das copyright nicht habe. Wenn Du Dich aber an Frank per eMail wendest, dann sendet er i.d.R. diese Doku gerne zu.

Hallo Wupperi,

ich bin auch gerade dabei mir diesen Poolcontroller anzuschaffen, wie hast du den eingebunden?
kannst du ev. deinen Script Posten?

danke
Tom

Das Skript stammt nicht von mir, gibt es hier auch woanders im Forum. Deswegen: Credits an den Author.
Ich poste es trotzdem mal:


<?// Version 1.0 Poolserver Installationsscript//Config !! URL MUSS angepasst werden-----------------------------------------------------------------------------------------------------------------------------------------//Nicht vergessen für die Variablen die Ihr loggen möchtet in den Variablensettings//dann das Logging aktivieren

//URL-Adresse des Solar/Pool Control zbsp. http://192.168.1.30 oder http://www.deinpoolserver.com und wenn anderer Port als 80 mit http://www.deinpoolserver.com:81$IPPoolServerAdr="http://x.x.x.x";

//In Minuten Abfrageintervall-Aktualisierung festlegen (Default 5 Minuten)$RescanInterval=1;

//Profi/Spezialsettings nicht nötig-------------------------------------------------------------------------------------------------------------------------------------------set_time_limit(15); //Timeout auf 15 Sekunden für Script erhöhen, kann oder muss in seltenen Fällen erhöht werden$debug=true;


//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------//Ab hier bitte nichts mehr ändern -------------------------------------------------------------------------------------------------------------------------------------------// Version 1.0 Poolserver Installationsscript
//Für nächste Version Vorbereitungen$user="admin";$pwd="";
//Wert 0 = 8 Relais, Wert 1 = 16 Relais//Unterstützt wird aktuell erst nur die 8 Relais-Variante$Rel8or16=0;
//Anzeigen der Taster Digitaleingänge//Unterstützt wird aktuell die Anzeige der entsprechenden Taster-Digaleingänge noch nicht aufgrund CSV-Strukturfehler$DigitInShow=true;
//Usernamen: ADC[1..5], Redox, pH, Temperatur[1..8],Relais[1..8], digital Input[1..4], Allenfalls Spezialversionen Relais 9-16 NICHT Implementierte Version$row=0;
$IPPoolServerAdrPure = $IPPoolServerAdr;$IPPoolServerAdr.="/GetState.csv";$RescanInterval=$RescanInterval*60;
if (($handle = fopen($IPPoolServerAdr, "r")) !== FALSE) {    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {          $num = count($data);
          for ($col=0; $col < $num; $col++) {                    $ContentRowCol[$row][$col]= $data[$col];          }
          $row++;    }    fclose($handle);}else{    Echo "FEHLER: Es konnte keine Verbindung hergestellt werden, prüfen Sie bitte die Settings";    IPS_SetScriptTimer($IPS_SELF,60);}                                                                                                                                                                if($debug==true)                                                                                                                                                                    print_r($ContentRowCol);if(substr(trim($ContentRowCol[0][1]),0,3)=="1.6"){    if(count($ContentRowCol)==6)    {//Grob Datenstruktur prüfen
        $object = IPS_GetObject($IPS_SELF);        $parentID = $object['ParentID'];
        //Installer        if ($IPS_SENDER == "Execute")        {              IPS_SetHidden($IPS_SELF, true);              IPS_SetName($IPS_SELF, "ReadSolarPoolControlData");              $parentObject = IPS_GetObject($parentID);              if ($parentObject['ObjectType'] !== 1)              {                  $instanceID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");                   IPS_SetParent($instanceID, $parentID);                  $parentID = $instanceID;                  IPS_SetParent($IPS_SELF, $parentID);                  IPS_SetName($instanceID, "Solar und Pool Control");
                  IPS_SetScriptTimer($IPS_SELF,10);              }              else              {                  //Installation ist durch, Scripttimer auf gewünschen Intervall setzen                  IPS_SetScriptTimer($IPS_SELF,$RescanInterval);              }        }        else        {          $PoolServerInstanceID = $parentID;
            $poolserverurl = CreateVariableByName($parentID, "PoolServerURL", 3, $profile = "~String");            SetValueString($poolserverurl, $IPPoolServerAdrPure);
            $username = CreateVariableByName($parentID, "Username", 3, $profile = "~String");            SetValueString($username, $user);
            $password = CreateVariableByName($parentID, "Password", 3, $profile = "~String");            SetValueString($password, $pwd);
            $countrowfix = count($ContentRowCol);
            @IPS_CreateVariableProfile("PoolServer_Relais", 1);            IPS_SetVariableProfileAssociation("PoolServer_Relais", 0, "Aus Automatik", "", -1);            IPS_SetVariableProfileAssociation("PoolServer_Relais", 1, "Ein Automatik", "", -1);            IPS_SetVariableProfileAssociation("PoolServer_Relais", 2, "Aus Handbetrieb", "", -1);            IPS_SetVariableProfileAssociation("PoolServer_Relais", 3, "Ein Handbetrieb", "", -1);
            //Row 0 hat für uns uninteressante Werte - Systeminfo etc.            for ($row=1; $row < count($ContentRowCol); $row++) {
                //Beschriftung/Ueberschrift aus Row 1 draus generieren wir Variablen zu den Überschriften                if($row==1)                {                      for ($col=0; $col < count($ContentRowCol[$row])-12; $col++) {
                        if($col < 16)                        {//Alle anderen Bezeichnungen vorher                             $ContentRowCol[$countrowfix][$col]=CreateVariableByName($PoolServerInstanceID, $col."_".$ContentRowCol[$row][$col], 3, $profile = "~String");                         }                            else                            {//Relais bezeichnung                             $ContentRowCol[$countrowfix][$col]=CreateVariableByName($PoolServerInstanceID, $col."_".$ContentRowCol[$row][$col], 1, $profile = "PoolServer_Relais");                         }                      }                }
                //Massbezeichnung, Profile und Assoziationen + Suffix in IPS hieraus generieren                if($row==2)                {                      for ($col=0; $col < count($ContentRowCol[$row])-12; $col++) {                         if(trim($ContentRowCol[$row][$col])!="--" && trim($ContentRowCol[$row][$col])!="n.a.")                         {                            @IPS_CreateVariableProfile ("PoolServer_".trim($ContentRowCol[$row][$col]), 3);                            @IPS_SetVariableProfileText ("PoolServer_".trim($ContentRowCol[$row][$col]),""," ".trim($ContentRowCol[$row][$col]));
                             CreateVariableByName($PoolServerInstanceID, $col."_".$ContentRowCol[1][$col], 3, $profile = "PoolServer_".trim($ContentRowCol[$row][$col]));                             }                      }                }
                //OFFSET aus Row3, GAIN aus Row4 und Value aus Row5 - Verwenden wir für Berechnung und hängen Endwert an Array als neue Row an                //Achtung Werte ab Position 16 müssen nicht mehr Berechnet werden da es Relais oder ON/OFF Komponenten sind                if($row==3)               {                      for ($col=0; $col < 24; $col++) {                         if($col==0) //Spezialfall Zeit-Time                         {                            $ContentRowCol[$countrowfix+1][$col]=$ContentRowCol[$row+2][$col];                         }                         else                          {                              $ContentRowCol[$countrowfix+1][$col]=($ContentRowCol[$row+2][$col]*$ContentRowCol[$row+1][$col])+$ContentRowCol[$row][$col];                            }                            SetValueString($ContentRowCol[$countrowfix][$col],$ContentRowCol[$countrowfix+1][$col]);                      }                }
                //Relais und Schalter entsprechend Automatisch, Aus, Ein, Hand setzen                if($row==5)                {                    $ena=0;                    $state=0;                    $i=0;
                      for ($col=16; $col < count($ContentRowCol[$row])-12; $col++) {                         if($ContentRowCol[$row][$col]==0)                            {//Aus Automatik                              $ContentRowCol[$countrowfix+1][$col]=0;                              }                         elseif($ContentRowCol[$row][$col]==1)                         {//Ein Automatik                              $ContentRowCol[$countrowfix+1][$col]=1;                          }                         elseif($ContentRowCol[$row][$col]==2)                         {//Aus Handbetrieb                              $ContentRowCol[$countrowfix+1][$col]=2;                            }                          elseif($ContentRowCol[$row][$col]==3)                          {//Ein Handbetrieb                              $ContentRowCol[$countrowfix+1][$col]=3;                          }                          SetValueInteger($ContentRowCol[$countrowfix][$col],$ContentRowCol[$countrowfix+1][$col]);                          $i++;                       }                 }            }                                                                                                                                                            if($debug==true)                                                                                                                                                                            print_r($ContentRowCol);            IPS_SetScriptTimer($IPS_SELF,$RescanInterval);        }    }    else    {        Echo "FEHLER: Die Datenstruktur stimmt nicht, handelt es sich beim Gerät um einen Solar/Pool-Control?";        IPS_SetScriptTimer($IPS_SELF,60);    }}else{    Echo "FEHLER: Die Firmware entspricht nicht dem geforderten Stand mit 1.5.1";    IPS_SetScriptTimer($IPS_SELF,60);}
//Funktionsdefinitionenfunction CreateVariableByName($id, $name, $type, $profile = "") {     $vid = @IPS_GetVariableIDByName($name, $id);
     if($vid === false)     {         $vid = IPS_CreateVariable($type);         IPS_SetParent($vid, $id);         IPS_SetName($vid, $name);         IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']);     }     else     {     }
      if(strpos($name, "n.")>0)           IPS_SetHidden($vid, true);      else            IPS_SetHidden($vid, false);
     if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
     return $vid; }?>

EDIT: Weiss jemand, warum die CR/LF nicht mehr funktionieren, beim posten eines Skripts?

danke, das ging ja schnell :wink:

dann hab ich ja erst mal was zum spielen wenn der Controller da ist.

Tom

Hallo Wupperi, ist das noch meine Original 1.0 Version oder hast du da schon eigene Änderungen drin? Musste den Poolcontroller leider wieder abgeben da der Pool mit weg ging. Nun beschaff ich vermutlich wieder einen aber muss noch schauen welche Version 8/16Relais.

Gesendet von iPhone mit Tapatalk

Das ist zu 99,9% noch Deine Version. Ich habe nur den Versionsnummerncheck angepasst. Parallel habe ich noch ein anderes Skript gemacht, welches die numerischen Werte die Dein Skript als String ablegt in Floats wandelt.

Hallo zusammen,

was kostet der Controller denn eigentlich, wenn man fragen darf ?

Viel gelesen habe ich ja schon drüber.

Gruß Robert

Die Jungs von pooldigital helfen Dir da gerne persönlich weiter.

Hallo!

Hier glaube ich das mal richtig… hierher stammt auch das Script welches mein Pooldigital seit einigen verwendet!

Nach der Umstellung auf IPS 5.0 kommen Fehlermeldungen aus dem Abfragescript - ReadSolarPoolControlData
Bekomme für fast alle Variablen des Projektes die Meldungen:

VariableManager | Profile ~String is not available since IP-Symcon 5.0. Just use an empty profile. This will be an error in future versions! Check your IPS_SetVariableCustomProfile usage for VariableID 40632

Ich vermute die abgekündigte Funktion IPS_SetVariableCustomProfile macht das Problem.
Wie löse ich das am einfachsten?
Was muss am Script anders werden - oder wie habt Ihr das gelöst?

LG
Alexander

Hallo Alexander,

ich hab auch den Pool Controller und im Sommer das Script geändert, versuch das geänderte Script mal


<?
// Version 1.0 Poolserver Installationsscript
//Config !! URL MUSS angepasst werden-----------------------------------------------------------------------------------------------------------------------------------------
//Nicht vergessen für die Variablen die Ihr loggen möchtet in den Variablensettings
//dann das Logging aktivieren
//URL-Adresse des Solar/Pool Control zbsp. http://192.168.1.30 oder http://www.deinpoolserver.com und wenn anderer Port als 80 mit http://www.deinpoolserver.com:81
$IPPoolServerAdr="http://192.168.0.211";

//In Minuten Abfrageintervall-Aktualisierung festlegen (Default 5 Minuten)
$RescanInterval=60;

//Profi/Spezialsettings nicht nötig-------------------------------------------------------------------------------------------------------------------------------------------
set_time_limit(15); //Timeout auf 15 Sekunden für Script erhöhen, kann oder muss in seltenen Fällen erhöht werden
$debug=false;
#$debug=true;
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Ab hier bitte nichts mehr ändern -------------------------------------------------------------------------------------------------------------------------------------------
// Version 1.0 Poolserver Installationsscript

//Für nächste Version Vorbereitungen
$user="";
$pwd="";

//Wert 0 = 8 Relais, Wert 1 = 16 Relais
//Unterstützt wird aktuell erst nur die 8 Relais-Variante
$Rel8or16=0;

//Anzeigen der Taster Digitaleingänge
//Unterstützt wird aktuell die Anzeige der entsprechenden Taster-Digaleingänge noch nicht aufgrund CSV-Strukturfehler
$DigitInShow=true;

//Usernamen: ADC[1..5], Redox, pH, Temperatur[1..8],Relais[1..8], digital Input[1..4], Allenfalls Spezialversionen Relais 9-16 NICHT Implementierte Version
$row=0;

$IPPoolServerAdrPure = $IPPoolServerAdr;
$IPPoolServerAdr.="/GetState.csv";
//$RescanInterval=$RescanInterval*60;

if (($handle = @fopen($IPPoolServerAdr, "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
         $num = count($data);

         for ($col=0; $col < $num; $col++) {
                 $ContentRowCol[$row][$col]= $data[$col];
         }

        $row++;
    }
    fclose($handle);
}
else
{
   Echo "FEHLER: Es konnte keine Verbindung hergestellt werden, prüfen Sie bitte die Settings";
   IPS_SetScriptTimer($IPS_SELF,60);
}
if($debug==true)
  print_r($ContentRowCol);

//print_r($ContentRowCol);
if (!isset($ContentRowCol[0][1])) goto Abbruch;
if(substr(trim($ContentRowCol[0][1]),0,3)=="1.6")
{
   if(count($ContentRowCol)==6)
   {//Grob Datenstruktur prüfen

      $object = IPS_GetObject($IPS_SELF);
      $parentID = $object['ParentID'];

      //Installer
      if ($IPS_SENDER == "Execute")
      {
           IPS_SetHidden($IPS_SELF, true);
           IPS_SetName($IPS_SELF, "ReadSolarPoolControlData");
           $parentObject = IPS_GetObject($parentID);
           if ($parentObject['ObjectType'] !== 1)
           {
               $instanceID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
                IPS_SetParent($instanceID, $parentID);
               $parentID = $instanceID;
               IPS_SetParent($IPS_SELF, $parentID);
               IPS_SetName($instanceID, "Pool Controller");

               IPS_SetScriptTimer($IPS_SELF,10);
           }
           else
           {
              //Installation ist durch, Scripttimer auf gewünschen Intervall setzen
              IPS_SetScriptTimer($IPS_SELF,$RescanInterval);
           }
      }
      else
      {
         $PoolServerInstanceID = $parentID;

         $poolserverurl = CreateVariableByName($parentID, "PoolServerURL", 3, $profile = "~String");
         SetValueString($poolserverurl, $IPPoolServerAdrPure);

         $username = CreateVariableByName($parentID, "Username", 3, $profile = "~String");
         SetValueString($username, $user);

         $password = CreateVariableByName($parentID, "Password", 3, $profile = "~String");
         SetValueString($password, $pwd);

         $countrowfix = count($ContentRowCol);

         @IPS_CreateVariableProfile("PoolServer_Relais", 1);
         IPS_SetVariableProfileAssociation("PoolServer_Relais", 0, "Aus (Auto)", "", -1);
         IPS_SetVariableProfileAssociation("PoolServer_Relais", 1, "Ein (Auto)", "", -1);
         IPS_SetVariableProfileAssociation("PoolServer_Relais", 2, "Aus (Manu)", "", -1);
         IPS_SetVariableProfileAssociation("PoolServer_Relais", 3, "Ein (Manu)", "", -1);

         //Row 0 hat für uns uninteressante Werte - Systeminfo etc.
         for ($row=1; $row < count($ContentRowCol); $row++) {

            //Beschriftung/Ueberschrift aus Row 1 draus generieren wir Variablen zu den Überschriften
            if($row==1)
            {
                  $clrestvar = CreateVariableByName($PoolServerInstanceID, "36"."_"."Cl Rest", 2, $profile = "");
                  $phminusrestvar = CreateVariableByName($PoolServerInstanceID, "37"."_"."pH- Rest", 2, $profile = "");
                  $phplusrestvar = CreateVariableByName($PoolServerInstanceID, "38"."_"."pH+ Rest", 2, $profile = "");
                  $clconsvar = CreateVariableByName($PoolServerInstanceID, "39"."_"."Cl Verbrauch", 2, $profile = "");
                  $phminusconsvar = CreateVariableByName($PoolServerInstanceID, "40"."_"."pH- Verbrauch", 2, $profile = "");
                  $phplusconsvar = CreateVariableByName($PoolServerInstanceID, "41"."_"."pH+ Verbrauch", 2, $profile = "");
                  for ($col=0; $col < count($ContentRowCol[$row])-12; $col++) {

                     if($col == 0)
                     {//Uhrzeit
                        $ContentRowCol[$countrowfix][$col]=CreateVariableByName($PoolServerInstanceID, $col."_".$ContentRowCol[$row][$col], 3, $profile = "~String"); // String
                     }

                     if($col < 16)
                     {//Alle anderen Bezeichnungen vorher

	                     if(($col > 7 and $col < 16) or $col ==5) //Temperatur
    	                 {
							$ContentRowCol[$countrowfix][$col]=CreateVariableByName($PoolServerInstanceID, $col."_".$ContentRowCol[$row][$col], 2, $profile = "~Temperature"); // Float
        	             }
						$ContentRowCol[$countrowfix][$col]=CreateVariableByName($PoolServerInstanceID, $col."_".$ContentRowCol[$row][$col], 2, $profile = ""); // Float
                     }
                     else
                     {//Relais bezeichnung
                       if ($col <> 24)
                        $ContentRowCol[$countrowfix][$col]=CreateVariableByName($PoolServerInstanceID, $col."_".$ContentRowCol[$row][$col], 1, $profile = "PoolServer_Relais");
						else $ContentRowCol[$countrowfix][$col]=CreateVariableByName($PoolServerInstanceID, $col."_".$ContentRowCol[$row][$col], 2, $profile = ""); // Float
                     }
                  }
            }

            //Massbezeichnung, Profile und Assoziationen + Suffix in IPS hieraus generieren
            if($row==2)
            {
                  for ($col=1; $col < count($ContentRowCol[$row])-12; $col++) { // start bei 1 da Zeit als String
                     if(trim($ContentRowCol[$row][$col])!="--" && trim($ContentRowCol[$row][$col])!="n.a.")
                     {
                     	if(($col > 7 and $col < 16) or $col ==5) //Temperatur
                     	{
					    }
					 else
						{
						@IPS_CreateVariableProfile ("PoolServer_".trim($ContentRowCol[$row][$col]), 2);
                        @IPS_SetVariableProfileText ("PoolServer_".trim($ContentRowCol[$row][$col]),""," ".trim($ContentRowCol[$row][$col]));
						@IPS_SetVariableProfileDigits("PoolServer_".trim($ContentRowCol[$row][$col]), 2);
                        CreateVariableByName($PoolServerInstanceID, $col."_".$ContentRowCol[1][$col], 2, $profile = "PoolServer_".trim($ContentRowCol[$row][$col]));
						}
                      }
                  }
            }

            //OFFSET aus Row3, GAIN aus Row4 und Value aus Row5 - Verwenden wir für Berechnung und hängen Endwert an Array als neue Row an
            //Achtung Werte ab Position 16 müssen nicht mehr Berechnet werden da es Relais oder ON/OFF Komponenten sind
            if($row==3)
            {
                  for ($col=0; $col < 25; $col++) {
                     if($col==0) //Spezialfall Zeit-Time
                     {
                        $h = $ContentRowCol[$row+2][$col];
                        $stunde = floor($h/256);
                        $minute = (int) $h - $stunde*256;
                        $h = sprintf("%'.02d",$stunde).":".sprintf("%'.02d",$minute);
                        $ContentRowCol[$countrowfix+1][$col]=$h;
						if (isset($ContentRowCol[$countrowfix+1][$col])) SetValueString($ContentRowCol[$countrowfix][$col],$ContentRowCol[$countrowfix+1][$col]);
                     }

                     else if ($col<16)
                     {
                        $ContentRowCol[$countrowfix+1][$col]=($ContentRowCol[$row+2][$col]*$ContentRowCol[$row+1][$col])+$ContentRowCol[$row][$col];
                     }
                      else if ($col==24)
                     {
                        $ContentRowCol[$countrowfix+1][$col]=($ContentRowCol[$row+2][$col]*$ContentRowCol[$row+1][$col])+$ContentRowCol[$row][$col];
                     }

					if($col>0)
					{
						if (isset($ContentRowCol[$countrowfix+1][$col])) ;
						{
						if ($col<16) // unter Pos 16 in float umrechnen
						{
						$WertString = $ContentRowCol[$countrowfix+1][$col];
						$float = tofloat($WertString);
						SetValue($ContentRowCol[$countrowfix][$col],$float);
						}
						}
					}
					
				  }
				  
            }

            //Relais und Schalter entsprechend Automatisch, Aus, Ein, Hand setzen
            if($row==5)
            {
               $ena=0;
               $state=0;
               $i=0;
                  SetValueFloat($clrestvar,floatval($ContentRowCol[$row][36]/10.0));
                  SetValueFloat($phminusrestvar,floatval($ContentRowCol[$row][37]/10.0));
                  SetValueFloat($phplusrestvar,floatval($ContentRowCol[$row][38]/10.0));
                  SetValueFloat($clconsvar,floatval($ContentRowCol[$row][39]));
                  SetValueFloat($phminusconsvar,floatval($ContentRowCol[$row][40]));
                  SetValueFloat($phplusconsvar,floatval($ContentRowCol[$row][41]));
               
                  for ($col=16; $col < count($ContentRowCol[$row])-12; $col++) {
                     if($ContentRowCol[$row][$col]==0)
                     {//Aus Automatik
                        $ContentRowCol[$countrowfix+1][$col]=0;
                       }
                     elseif($ContentRowCol[$row][$col]==1)
                     {//Ein Automatik
                        $ContentRowCol[$countrowfix+1][$col]=1;
                     }
                     elseif($ContentRowCol[$row][$col]==2)
                     {//Aus Handbetrieb
                        $ContentRowCol[$countrowfix+1][$col]=2;
                     }
                     elseif($ContentRowCol[$row][$col]==3)
                     {//Ein Handbetrieb
                        $ContentRowCol[$countrowfix+1][$col]=3;
                     }
                     if ($col <> 24)
                     SetValueInteger($ContentRowCol[$countrowfix][$col],$ContentRowCol[$countrowfix+1][$col]);
                      else if (isset($ContentRowCol[$countrowfix+1][$col])) SetValue($ContentRowCol[$countrowfix][$col],$ContentRowCol[$countrowfix+1][$col]);
					  #else if (isset($ContentRowCol[$countrowfix+1][$col])) SetValueString($ContentRowCol[$countrowfix][$col],$ContentRowCol[$countrowfix+1][$col]." cm/s");
                     $i++;
                     
                  }
             }
         }                                                                                                                     if($debug==true)
                                                                                                                                 print_r($ContentRowCol);
         IPS_SetScriptTimer($IPS_SELF,$RescanInterval);
      }
   }
   else
   {
      Echo "FEHLER: Die Datenstruktur stimmt nicht, handelt es sich beim Gerät um einen Solar/Pool-Control?";
      IPS_SetScriptTimer($IPS_SELF,60);
   }
}
else
{
   Echo "FEHLER: Die Firmware entspricht nicht dem geforderten Stand mit 1.5.1";
   IPS_SetScriptTimer($IPS_SELF,60);
}
Abbruch:
//Funktionsdefinitionen
function CreateVariableByName($id, $name, $type, $profile = "")
 {
     $vid = @IPS_GetVariableIDByName($name, $id);

     if($vid === false)
     {
         $vid = IPS_CreateVariable($type);
         IPS_SetParent($vid, $id);
         IPS_SetName($vid, $name);
         IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']);
     }
     else
     {
     }

// Variable einsortieren
$Nummer = $name; 
$stringposition = strpos ( $Nummer, '_' ); 
$Nummer = substr($Nummer,0,$stringposition); 
if ($Nummer =="") $Nummer = 99;
IPS_SetPosition($vid, $Nummer);





     if(strpos($name, "n.")>0)
         IPS_SetHidden($vid, true);
     else
         IPS_SetHidden($vid, false);

    if($type <> 3)
    {
     if(($profile !== "") and ($profile != 'PoolServer_cm³s')  and ($profile != 'PoolServer_m³/h') ) { IPS_SetVariableCustomProfile($vid, $profile); }
    }
     return $vid;
 }
 
 // String in float umrechnen
 function tofloat($num) {

    $negative = substr ($num,0,1);
    #print_r ($negative);
    $dotPos = strrpos($num, '.');
    $commaPos = strrpos($num, ',');
    $sep = (($dotPos > $commaPos) && $dotPos) ? $dotPos :
        ((($commaPos > $dotPos) && $commaPos) ? $commaPos : false);


    if (!$sep) {
        $rueck = floatval(preg_replace("/[^0-9]/", "", $num));
        if ($negative == "-") {
            $rueck = $rueck *-1;
         }
        return $rueck;
    }

    $rueck = (
        preg_replace("/[^0-9]/", "", substr($num, 0, $sep)) . '.' .
        preg_replace("/[^0-9]/", "", substr($num, $sep+1, strlen($num)))
    );
    if ($negative == "-") {
            $rueck = $rueck *-1;
    }
    return ($rueck);
}

?>

Hallo!

Danke für die schnelle Reaktion! Wollte vorher noch fragen:
Muss ich vorher was mit den Variablen machen?
Ich habe ja bereits Variablen an denen was dranhängt…

Oder einfach das Script gegen das alte austauschen?
LG Alexander