BWT Aqa Perla goes IP-Symcon

Servus Dietmar,

ja, ich habe das Problem immer noch. Könntest du mir mal deinen Code bereitstellen, wie du die Alarme aus der Anlage holst. Evtl. kann ich daraus einen Unterschied zu meiner Variante erkennen.

Wäre super!

Gruß Christian

Hallo Christian,

ich lese keine Alarme aus. Leider habe das Protokoll nicht mehr im Sinn, ich sehe mir das am WE mal an.Wenn Du deinen Code postest fällt mir das vielleicht leichter.
Ich habe mir jedochaber eine Script geschrieben, welches im Fehlerfall den Port initialisiert.
Das Script wird jede Minute gestartet und kontrolliert, ob ein Wert der Anlage seit 150 Sekunden nicht mehr aktualisiert wurde.
Falls dem so ist, wird der Port deaktiviert und der Service für den Netzwerk/USB Adapter neu gestartet. Anschließend wird der serielle Port wieder aktiviert.

Vielleicht hilft dir dieser Workaround.

Gruß,
Dietmar

<?

$data =  IPS_GetVariable(23906 /*[Wasser\Restkapazität Säule 1]*/);
$delta_t =time()-($data['VariableUpdated']);

if ($delta_t>150) {
IPS_SetProperty (59596 /*[Aqa Perla]*/, "Open", False);
IPS_ApplyChanges (59596 /*[Aqa Perla]*/);
IPS_Execute("c:\Windows\system32\sc.exe", "stop ".chr(34)."SX Virtual Link Lite".chr(34),True,true);
IPS_Sleep(4000);
IPS_Execute("c:\Windows\system32\sc.exe", "start ".chr(34)."SX Virtual Link Lite".chr(34),True,true);
IPS_Sleep(4000);
IPS_SetProperty (59596 /*[Aqa Perla]*/, "Open", True);
IPS_ApplyChanges (59596 /*[Aqa Perla]*/);
 }
?>

Hallo zusammen,

kann mir einer Sagen warum ich von meiner Perla nur ein Massenspeichergerät bekomme und kein COM Port zugewiesen?

Viele Grüße
Tim

Habe gerade mit BWT gesprochen. Die Unterstützung des USB-Portes wurde eingestellt!

Somit ist kein Auslesen mehr möglich, es wird kein COM Port mehr bereit gestellt. Zumindest ab Baujahr 06/2015 weil bei meiner geht es schon nicht mehr.

Schade, habe die Anlage wegen dem USB Port gekauft. Scheiß support von BWT!

Viele Grüße
Tim

Hallo,

habe die Salz und Wasserverbrauchsabfrage schon seit über einem Jahr problemlos am laufen, jedoch fehlt mir noch die Möglichkeit zB den Salzmangel-Alarm abzufragen. Gibt es dazu eine Möglichkeit?

Ich kann zwar die Alarme auslesen (sind 81 bei mir), jedoch ist kein aktueller dabei. Kann man diese irgendwie löschen?

Danke!

Da haben sie wohl gemerkt das dafür ein Markt wäre :wink: Das wird dann künftig vermutlich als Aufpreis in die Preisliste aufgenommen[emoji24]
Wer Mercedes kauft muss Mercedes Aufpreise zahlen… Ne Spass beiseite…
Schon komisch das so etwas rausgenommen wird… Aber sicherlich gibts da dann nur gegen Aufpreis was neues mit irgendner unnützen App fürs Handy und irgendeinem Cloud-Käse… Sonst verkauft sich ja heute scheinbar nichts mehr…

Wir sind ebenfalls gerade auf der Suche nach ner Entkalkungsanlage… Die fällt dann wohl raus und es wird einfach ne günstige Systemkomponenten Anlage von ner lokalen Firma…

Der Abruf der Alarme funktioniert soweit, allerdings bekomme ich nur Alarme von 0 bis 81 und 210 bis 256 (das sind exakt 127). Im Speicher sind allerdings über 300, wie soll man Alarme mit Nummern über 256 abrufen?
Jemand eine Idee?
Danke!

Servus,

wie kann man die Perla 4.0 direkt über Lan ins IPS bekommen?
Hat das schon jemand am laufen?

Im IO Broker Forum habe ich das gefunden, ist für mich aber leider too much…

Hi smartboard, es gibt zwar keine offizielle API für die BWT Perla 4, aber nach erfolgreicher Anmeldung auf der „webseite“ der Anlage (Kennwort wurde dir bei der Registrierung der Anlage zugeschickt) kannst du anschließend alle Daten über die Adresse string formUrl = string.Format („https://{0}/home/actualizedata“, this.BWTHost); abrufen. Antwort ist ein JSON-String: {„aktuellerDurchfluss“:„0“,„aktuellerDurchflussProzent“:„0“,„durchflussHeute“:„49“,„durchflussMonat“:„2469“,„durchflussJahr“:„105“,„wifi“:„0“,„gsm“:„85“,„isGsm“:„1“,„RegeneriemittelNachfuellenIn“:„66“,„cSignal“:„1“,„RegeneriemittelVerbleibend“:„40“}.

Ich verwende bei mir einen selbst entwickelten Windows-Dienst (c#), der Daten aus allen möglichen Quellen (Wetter, PV-Anlage, Sensoren,…) abruft und meiner Visualisierung zur Verfügung stellt. Ein Modul dieses Dienstes baut die Verbindung zur BWT auf, simuliert die Anmeldung über POST mit gefüllten Formulardaten und speichert sich das von der BWT zurückgelieferte Cookie (BWT verwendet PHPCake). Anschließend kann die BWT über die o.a. Adresse abgefragt werden.

Etwa alle 60 Minuten wird das Cookie ungültig, dann muss erneut die Anmeldung simuliert werden und das neue Cookie gespeichert werden.
Das von BWT verwendete SSL-Zertifikat ist (vermutlich absichtlich) ungültig, der Zertifikatsfehler beim Aufruf von HttpWebRequest muss entsprechend abgefangen werden:

string formUrl = string.Format („https://{0}/home/actualizedata“, this.BWTHost);
string formParams = string.Empty;
HttpWebRequest webRequest = HttpWebRequest.CreateHttp(formUrl);
webRequest.ServerCertificateValidationCallback = RemoteCertificateValidationCallback;
webRequest.ServicePoint.Expect100Continue = false;
webRequest.CookieContainer = cookies;

Gibt es denn eine API oder nur eine Webseite?

Grundsätzlich wenn das eine Webseite ist, kann man sich da auch anmelden, aber ohne genau zu wissen, was da an Daten hin und her geschickt wird, ist das schwierig. Du kannst aber z.B. mal Chrome nutzten und dort die Entwicklertools mit STRG + Umschalt + I öffnen, dort findest Du unter Network die Daten die hin und her geschickt werden.

Wenn man weis was da geschickt wird z.B. bei der Anmeldung kann man das dann zumindest theoretisch auch aus IP-Symcon mit curl machen. Um zu wissen was man genau schicken muss braucht man zumindest den Header und Postfields, dies kannst Du einsehen in den Entwicklertools in Chrome. In der Readme von EchoRemote ist das grob beschrieben wie man mit der Entwicklertools Daten einsehen kann, da kannst Du ja mal schauen was Du raus bekommst, dann kann man auch abschätzten was und wie man da senden muss. Ohne ein Gerät zu haben ist das schwierig.

Wenn Du es schaffst den JSON String abzurufen kannst Du die Werte dann einfach in Variablen in IP-Symcon ablegen

Beispiel:


$payload = '{"aktuellerDurchfluss":"0","aktuellerDurchflussProzent":"0","durchflussHeute":"49","durchflussMonat" :"2469","durchflussJahr":"105","wifi":"0","gsm":"8 5","isGsm":"1","RegeneriemittelNachfuellenIn":"66" ,"cSignal":"1","RegeneriemittelVerbleibend":"40 "}';
$data = json_decode($payload, true);
var_dump($data);
$aktuellerDurchfluss = intval($data['aktuellerDurchfluss']);
var_dump($aktuellerDurchfluss);

$aktuellerDurchflussProzent = intval($data['aktuellerDurchflussProzent']);
var_dump($aktuellerDurchflussProzent);

ich hab’ da mal was zusammengehäkelt.

sieht dann im Symcon-Objektbaum so aus:

<?
// -----------------------------------------------------
// Auslesen einiger Informationen aus einem BWT Aqa Perla 

// -----------------------------------------------------
// Ab hier individuelle Parameter

$BWT_Vars = 25370;                                                  // ID einer Kategorie im Objektbaum unter dem die Variablen gespeichert werden (muss angelegt sein)

define('LOGIN_URL', 'https://192.168.178.xxx/users/login');                      // Das ist die URL bei der wir uns authentifizieren müssen
define('DATA_URL', 'https://192.168.178.xxx/home/actualizedata');                // Und hier gibt's die Daten

$post = http_build_query(array('STLoginPWField' => 'XXXXXX'));                  // Zugangsdaten 
                                                                                // (XXXXXX ersetzen durch den Login-Code den man nach der Produktaktivierung per Email erhält)
// Bis hier individuelle Parameter
// -----------------------------------------------------
define('COOKIE_FILE', 'BWT.cookie');                                            // Ablageort für Cookie-Informationen

define('USER_AGENT', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (K HTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
                                                                                // Wir geben uns als "ordentlicher" Browser aus


// -----------------------------------------------------
// Ab hier nur noch Code
// -----------------------------------------------------
// Teil 1 Cookie holen 
echo "BWT: Cookie holen
";

$curl = curl_init();                                                            // los geht's

curl_setopt($curl, CURLOPT_URL, LOGIN_URL);                                     // URL zum Loginformular
curl_setopt($curl, CURLOPT_POST, true);                                         // Ein POST request soll es werden
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);                                  // Die Infos als URL-Codierten String schicken
 
curl_setopt($curl, CURLOPT_USERAGENT, USER_AGENT);                              // Hilft bei einer eventuellen Sessionvalidation auf Serverseite

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);                                  // keine Prüfung ob Hostname im Zertifikat
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);                              // keine Überprüfung des Peerzertifikats
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);                              // Keinen redirects folgen

curl_setopt($curl, CURLOPT_COOKIEFILE, COOKIE_FILE);                            // Hier wird der Cookie für später gespeichert
//curl_setopt($curl, CURLOPT_COOKIESESSION, true);

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);                               // Die Antwort bitte nicht an STDOUT
  
curl_exec($curl);                                                               // ok, jetzt ausführen

$curl_errno = curl_errno($curl);

if ($curl_errno > 0) {
    $curl_error = curl_error($curl);
    echo "BWT: cURL Error ($curl_errno): $curl_error
";
} else {

// keine Fehler - weiter geht's
// Teil 2 Daten holen
    echo "BWT: Daten auslesen
";

    curl_setopt($curl, CURLOPT_URL, DATA_URL);                                      // Daten-URL abrufen 
    curl_setopt($curl, CURLOPT_POST, false);                                        // Diesesmal kein POST request
    curl_setopt($curl, CURLOPT_COOKIEFILE, COOKIE_FILE);                            // Cookie mitgeben
 
    curl_setopt($curl, CURLOPT_USERAGENT, USER_AGENT);                              // Hilft bei einer eventuellen Sessionvalidation auf Serverseite
    curl_setopt($curl, CURLOPT_REFERER, LOGIN_URL);                                 // ist eigentlich nur Kür

    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);                                  // keine Prüfung ob Hostname im Zertifikat
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);                              // keine Überprüfung des Peerzertifikats
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);                              // Keinen redirects folgen

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);                               // Die Antwort bitte als Rückgabewert von curl_exec

    $response = curl_exec($curl);                                                   // GET ausführen

    curl_close($curl);                                                              // cURL Session beenden


    echo $response."
";

    $json = json_decode($response, true);

    //var_dump($json);
    //print_r($json);

    foreach ($json as $name => $value) {
        echo ($name." -> ".$value."
");
        UpdateIPSvar ($name, $value, "integer" );
    }

    echo "
Symcon Variablen aktualisiert
";
}


// -----------------------------------------------------
// Variablen anlegen und/oder aktualisierien
// -----------------------------------------------------
function UpdateIPSvar($name, $value, $type) {
Global $BWT_Vars;

	$parent = $BWT_Vars;
	$ident = str_replace(array("-", "/"), "_", $name);
		
    switch ($type){
    case "boolean":
       	$ips_type=0;
        break;
	case "integer":			
        $ips_type=1;
        break;
    case "float":
        $ips_type=2;
        break;
    case "string":
        $ips_type=3;
        break;
    default:
        echo "Unbekannter Datentyp: ".$type.PHP_EOL;
        $ips_type=3;
        break;
    }
    $var_id = @IPS_GetObjectIDByIdent($ident, $parent);
	
    if ($var_id === false){
        $var_id = IPS_CreateVariable($ips_type);
        IPS_SetName($var_id, $name);
        IPS_SetIdent($var_id, $ident);
        IPS_SetParent($var_id, $parent);
    }
	
    switch ($ips_type){
        case 0:
           if (GetValueBoolean($var_id) <> (bool)$value){
              SetValueBoolean($var_id, (bool)$value);
           }
           break;
        case 1:
            if (GetValueInteger($var_id) <> (int)$value){
               SetValueInteger($var_id, (int)$value);
            }
            break;
        case 2:
            if (GetValueFloat($var_id) <> round((float)$value,2)){
               SetValueFloat($var_id, round((float)$value,2));
            }
            break;
        case 3:
            if (GetValueString($var_id) <> $value){
               SetValueString($var_id, $value);
            }
            break;
    }
}

?>

Hallo,

Verfügen Sie über Informationen, um den Verbrauch des BWT AQA PERLA-Bluetooth auslesen zu können?

Ich danke Ihnen.

Hallo oly,

vielen Dank für die Infos und das Script.
Ich habe heute meine PERLA One in Betrieb genommen.
Das Gerät hängt in meinem LAN und die Registrierung ist gelaufen.
Es kam auch ein Email von BWT, aber darin kein Login-Passwort, sondern nur ein achtstelliger (mittig mit einem -) Produkt-Code.

Wie ist der Login-Code aufgebaut?
Hat BWT vielleicht etwas geändert?
Hast Do noch einen Tipp bevor ich beim BWT-Support anrufe?

Viele Grüße aus dem Unterallgäu
Harry

Hallo,

heute habe ich nach einem Anruf beim BWT-Support eine Email mit meinem Login-Code bekommen.
Zuvor habe ich den Registrierungs-Vorgang an der Perla One gestartet. Wichtig ist es den Port 443 freizugeben.
Über den LAN-Anschluss hatte ich es nicht hinbekommen, aber über die WLAN-Verbindung hat es funktioniert.

Alles prima, das Skript funktioniert und ist sehr gut dokumentiert. Nochmals Danke dafür.

Viele Grüße aus dem Unterallgäu
Harry

ich erhalte beim Ausführen des Scriptes folgende Meldung:

BWT: Cookie holen
BWT: Daten auslesen
{„aktuellerDurchfluss“:„0“,„aktuellerDurchflussProzent“:„0“,„durchflussHeute“:„89“,„durchflussMonat“:„89“,„durchflussJahr“:„0“,„RegeneriemittelNachfuellenIn“:„68“,„RegeneriemittelVerbleibend“:„90“}
aktuellerDurchfluss -> 0

Warning: Ident muss für jede Ebene eindeutig sein in /mnt/data/symcon/scripts/42495.ips.php on line 125
aktuellerDurchflussProzent -> 0

Warning: Ident muss für jede Ebene eindeutig sein in /mnt/data/symcon/scripts/42495.ips.php on line 125
durchflussHeute -> 89

Warning: Ident muss für jede Ebene eindeutig sein in /mnt/data/symcon/scripts/42495.ips.php on line 125
durchflussMonat -> 89

Warning: Ident muss für jede Ebene eindeutig sein in /mnt/data/symcon/scripts/42495.ips.php on line 125
durchflussJahr -> 0

Warning: Ident muss für jede Ebene eindeutig sein in /mnt/data/symcon/scripts/42495.ips.php on line 125
RegeneriemittelNachfuellenIn -> 68

Warning: Ident muss für jede Ebene eindeutig sein in /mnt/data/symcon/scripts/42495.ips.php on line 125
RegeneriemittelVerbleibend -> 90

Warning: Ident muss für jede Ebene eindeutig sein in /mnt/data/symcon/scripts/42495.ips.php on line 125

Symcon Variablen aktualisiert

Bei jedem Start des Scriptes werden alle Variablen neu angelegt.

jemad eine Idee, woran das liegt?

Danke.,
Loerdy

Hallo,

Ich habe eine AQA Perla 10, diese kommuniziert per Bluetooth.

Ich erhalte die folgenden Informationen:
Handle DATA
0001 => 01 18
0002 => 20 03 00 05 2a
0004 => 00 00
0005 => 00 18
0007 => 42 57 54 62 6c 75 65
0008 => 4e 09 00 01 2a
0009 => 00 00
000a => 02 0b 00 04 2a
000b => ff ff ff ff 00 00 ff ff
000c => 66 9a 0c 20 00 08 96 9e e2 11 9e b1 e0 f2 73 d9
000d => 10 0e 00 66 9a 0c 20 00 08 96 9e e2 11 9e b1 e1 f2 73 d9
0010 => 0c 11 00 66 9a 0c 20 00 08 96 9e e2 11 9e b1 e2 f2 73 d9
0012 => 02 13 00 66 9a 0c 20 00 08 96 9e e2 11 9e b1 e3 f2 73 d9
0013 => 00 7d 00 00 32 09 34 02 d0 07 3c 00 02 01 15 54 00 00 00 00
=> 00 7d 00 00 33 09 34 02 d0 07 3c 00 02 01 15 54 00 00 00 00
=> 00 7d 00 00 36 09 34 02 d0 07 3c 00 02 01 15 54 00 00 00 00
=> 00 7d 00 00 37 09 34 02 d0 07 3c 00 02 01 15 54 00 00 00 00
=> 30 75 00 00 6b 09 35 02 d0 07 3c 00 02 01 15 54 00 00 00 00
0014 => 02 15 00 66 9a 0c 20 00 08 96 9e e2 11 9e b1 e4 f2 73 d9
0015 => 5e 00 34 00 00 08 89 63 00 08 07 10 00 40 e2 01 00 01 00 00
=> 5e 00 34 00 00 08 00 00 3d 90 00 08 56 86 00 08 00 02 00 41
=> 5e 00 34 00 00 08 89 63 00 08 07 10 00 40 e2 01 00 01 00 00
=> 5e 00 34 00 00 00 00 00 f9 ff ff ff 00 00 00 00 70 05 00 20

Wie sind sie zu interpretieren?

Sorry, ich bin Franzose, ich benutze einen automatischen Übersetzer.

Danke schön

Hallo Loerdy,

sieht so aus als ob du die „ID einer Kategorie im Objektbaum unter dem die Variablen gespeichert werden (muss angelegt sein)“ nicht richtig eingetragen hast.

des Weiteren würde ich den Code so abändern:

$json = json_decode($response, true);

    //var_dump($json);
    //print_r($json);

    foreach ($json as $name => $value) {
        $type= gettype($value);
        //echo ($name." -> ".$value."");
        UpdateIPSvar ($name, $value, $type );
    }

    //echo "Symcon Variablen aktualisiert";

Dann wird auch der Typ der Variablen richtig gesetzt.

Hallo zusammen,

ich habe den Code mal so angepasst dass er die Daten der BWT Perla über die API bezieht.
Falls es jemand gebrauchen kann:

<?php

//Auslesen der BWT Perla über API https://bwt-real-smarthome-backend.azurewebsites.net
//ApiKey erstellen und eintragen, productcode eintragen, Kategorie erstellen und eintragen

############ hier bitte anpassen: #########################################################

$productCode    =   "XR9V-CL46";
$ApiKey         =   "M0aYaT8jQkfZGaKbGUjM9uyuYlyDlGhfKR1CKrerclkCeQZw6ETiNccTBNx1mH34TF0DfFFfMd6VZBZ5BWqoFkcIjpxvQj3vcYVMwGdlLGWLPl43xaSvZQ8ehVNUtKPOPk7lV2msx3nWBML8TSpqLmosHDQjpFM0dKzSCRxQV9VB";

$BWT_Vars = 25604;                                                  // ID einer Kategorie im Objektbaum unter dem die Variablen gespeichert werden (muss angelegt sein)

############ ab hier nicht ändern: #########################################################

$url        =   "https://bwt-real-smarthome-backend.azurewebsites.net/api/Perla/".$productCode;
$headers    = array("accept: */*","ApiKey:" .$ApiKey,);

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

$response = curl_exec($curl);                                                   // GET ausführen
curl_close($curl);                                                              // cURL Session beenden
unset($curl);

//echo $response."";

$json = json_decode($response, true);

//var_dump($json);
//print_r($json);

foreach ($json as $name => $value) 
    {
        $type= gettype($value);
        //echo ($name." -> ".$value."");
        UpdateIPSvar ($name, $value, $type );
    }

    

// -----------------------------------------------------
// Variablen anlegen und/oder aktualisierien
// -----------------------------------------------------
function UpdateIPSvar($name, $value, $type) {
Global $BWT_Vars;

	$parent = $BWT_Vars;
	$ident = str_replace(array("-", "/"), "_", $name);
		
    switch ($type){
    case "boolean":
       	$ips_type=0;
        break;
	case "integer":			
        $ips_type=1;
        break;
    case "float":
        $ips_type=2;
        break;
    case "string":
        $ips_type=3;
        break;
    default:
        //echo "Unbekannter Datentyp: ".$type. " - Variable - ".$name.PHP_EOL;
        $ips_type=3;
        break;
    }
    $var_id = @IPS_GetObjectIDByIdent($ident, $parent);
	
    if ($var_id === false){
        $var_id = IPS_CreateVariable($ips_type);
        IPS_SetName($var_id, $name);
        IPS_SetIdent($var_id, $ident);
        IPS_SetParent($var_id, $parent);
    }
	
    switch ($ips_type){
        case 0:
           if (GetValueBoolean($var_id) <> (bool)$value){
              SetValueBoolean($var_id, (bool)$value);
           }
           break;
        case 1:
            if (GetValueInteger($var_id) <> (int)$value){
               SetValueInteger($var_id, (int)$value);
            }
            break;
        case 2:
            if (GetValueFloat($var_id) <> round((float)$value,2)){
               SetValueFloat($var_id, round((float)$value,2));
            }
            break;
        case 3:
            if (GetValueString($var_id) <> $value){
               SetValueString($var_id, $value);
            }
            break;
    }
}

(productCode und ApiKey habe ich natürlich geändert :slight_smile: )

1 „Gefällt mir“

Hey Isi,

danke, klappt auf Anhieb.
Wie oft fragst Du ab?

Gruß,
Loerdy

Das freut mich!
Ich frage einmal am Tag.