PH-803W ist wohl ein Wasserqualitäts-Sensor, den ein Freund von mir in Verwendung hat und in seine IP Symcon-Heimautomation einbinden möchte.

Allerdings hat der Sensor keine offene API, sondern sendet seine Werte an eine Handyapp.
Für den IOBroker hatte jemand eine Lösung auf GitHub veröffentlicht und hier fand' ich noch ein python-Skript, um an die Werte zu kommen.

Allerdings wäre für IP Symcon ein PHP-Skript notwendig, also musste ich ran.
Zum Glück hatte der Entwickler der IOBroker-Lösung auch noch eine gute Dokumentation beigelegt, welche HEX-Werte zu senden sind und wie die Antworten zu interpretieren sind, so dass die Sache kein großes Problem war.

Folgender Code holt sich einmal die aktuellen Werte des PH-803W und gibt sie aus.
Die tatsächliche IP-Adresse des PH-803W ist noch einzufügen:

<?php
// Connect
$socket = socket_create(AF_INET, SOCK_STREAM, 0);
if (!$socket){
  exit("Couldn't create socket: [".socket_last_error($socket)."] ".socket_last_error($socket)socket_strerror($errorCode)."<br/>");
  }
if (!socket_connect($socket, '192.168.178.99', 12416)) { // <-- IP-Adresse des PH-803W
  exit("Couldn't create socket: [".socket_last_error($socket)."] ".socket_last_error($socket)socket_strerror($errorCode)."<br/>");
  }

// Passcode anfordern
$send = "0000000303000006";
socket_send($socket, hex2bin($send), strlen($send)/2, MSG_EOF);
$response = socket_read($socket, 1024);
$passcode = substr(bin2hex($response), 20);

// Login mit diesem Passcode
$send = "000000030f000008000a$passcode";
socket_send($socket, hex2bin($send), strlen($send)/2, MSG_EOF);
$response = socket_read($socket, 1024);

if (bin2hex($response) == "000000030400000900") { // Login erfolgreich
  // Werte anfragen
  $send = "000000030400009002";
  socket_send($socket, hex2bin($send), strlen($send)/2, MSG_EOF);
  $response = bin2hex(socket_read($socket, 1024));
  //var_dump($response);
  if (substr($response, 0, 8) != "00000003") {
    echo("Invalides Prefix.");
    return;
    }
  if (hexdec(substr($response, 8, 2)) != strlen($response)/2-5) {
    echo("Invalide Antwort-Länge.");
    return;
    }
  $data = substr($response, 16);
  //echo("$data<br/><br/>");
  $in_water = substr($data, 0, 2) == "04";
  $orp_on   = substr($data, 2, 2) == "02";
  $ph_on    = substr($data, 2, 2) == "03";
  $ph       = hexdec(substr($data, 4, 4))/100;
  $redox    = hexdec(substr($data, 8, 4))-2000;
  echo("$in_water - $orp_on - $ph_on - $ph - $redox<br/>");
  }
?>

Das Skript ist stark vereinfacht und der Code, um die Werte nach IP Symcon zu übertragen ist noch nicht vorhanden, doch sind diese paar Zeilen Code vielleicht ein guter Anhaltspunkt, sollte jemand vor ähnlichen Herausforderungen stehen.

Während ich hier nur einmal ein Login durchführe und nach Werten frage, wäre die korrekte Herangehensweise wahrscheinlich, das Login durchzuführen und dann in einer Schleife all 4 Sekunden das Gerät anzupingen und darauf zu warten, dass es bei Werte-Änderung aktuelle Werte sendet.
Ich lege jedem diese Protokoll-Dokumentation ans Herzen.