[Modul] Ondilo ICO zum Erfassen von Messwerten eines Pools

IPSymconOndilo

Dokumentation:

Kurzanleitung:

PHP Modul für IP-Symcon 5.2. Der Ondilo ICO ist ein kleines Messgerät das Messwerte wie Temperatur, pH-Wert, Redoxpotential, Teilchenverschmutzung in einem Pool misst, aufzeichnet und diese Daten per WLAN an IP-Symcon übergeben kann. Eine Anbindung erfolgt über Authentifizierung durch IP-Symcon mit IP-Symcon Connect an der Ondilo API um so alle Geräte die unter dem Benutzernamen angemeldet sind auslesen zu können.

1. Funktionsumfang:

Auslesen der Messwerte:

[ul]
[li]pH Wert
[/li][li]Wassertemperatur
[/li][li]Teilchen im Wasser (total dissolved solids) in ppm
[/li][li]Redoxpotential in mV
[/li][/ul]

2. Voraussetzungen

[ul]
[li]IP-Symcon 5.2
[/li][li]Ondilo ICO Benutzerkonto
[/li][li]Ondilo ICO
[/li][li]IP-Symcon Connect
[/li][/ul]

3. Installation

a. Laden des Moduls

Im Modul Store

Ondilo ICO

eingeben und installieren.

b. Einrichtung in IP-Symcon

Zunächst ist in der IO Instanz eine Verbindung zum Ondilo Account herzustellen. Danach über den Konfigurator die Geräteinstanzen anlegen lassen. In der Geräte Instanz nach dem erstmaligen Öffnen einmalig auf Poolinformation auslesen drücken, um die Werte des Ondilo ICO abzurufen.

  1. Funktionsreferenz

Die Geräteinstanz liest die Messdaten selbstständig zyklisch aus.
Weitere Funktionen siehe ausführliche Dokumentation (s.o).

  • reserviert -

Hy!
Modul funktioniert super!
Leider kommen keine Werte beim salzgehalt an!
Warum?
Mfg
Maxx

Welchen Wert meinst Du genau mit Saltzgehalt? Ansonsten aktualisieren sich die Werte bei Dir? Was steht denn im Debug Fenster der Instanz?

das kommt bei mir an!
dump.txt (31.8 KB)dump1.txt (10.3 KB)

Mfg
Maxx

Ich habe wohl einfach Salt übersehen als Wert, das kann ich noch ergänzen.

kannst Du bitte mal


$units = Ondilo_GetUserUnits(12345); // 12345 Objekt ID Ondilo ICO instanz
var_export($units);

ausführen und die Ausgabe posten, damit man die benutzte Einheit von Salt anschauen kann.

Und bitte auch noch


$config = Ondilo_GetPoolConfiguration(12345); // 12345 Objekt ID Ondilo ICO instanz
var_export($config);

posten, damit man sieht wo die Standard Grenzen für Salt liegen.

1.Ausgabe:
Warning:
Notice: Undefined property: stdClass::$conductivity in C:\ProgramData\Symcon\modules.store\fonzo.ondilo\Ondillo Cloud\module.php on line 379

Notice: Undefined property: stdClass::$hardness in C:\ProgramData\Symcon\modules.store\fonzo.ondilo\Ondillo Cloud\module.php on line 382
RESULT:{„orp“:„MILLI_VOLT“,„pressure“:„HECTO_PASCAL“,„salt“:„PART_PER_MILLION“,„speed“:„KILOMETER_PER_HOUR“,„tds“:„PART_PER_MILLION“,„temperature“:„CELSIUS“,„volume“:„CUBIC_METER“} in C:\ProgramData\Symcon\modules.store\fonzo.ondilo\Ondilo Device\module.php on line 419

Fatal error: Uncaught TypeError: json_decode() expects parameter 1 to be string, bool given in C:\ProgramData\Symcon\modules.store\fonzo.ondilo\Ondilo Device\module.php:431
Stack trace:
#0 C:\ProgramData\Symcon\modules.store\fonzo.ondilo\Ondilo Device\module.php(431): json_decode(false)
#1 C:\ProgramData\Symcon\scripts__generated.inc.php(3075): OndiloDevice->GetUserUnits()
#2 C:\ProgramData\Symcon\scripts\58621.ips.php(2): ONDILO_GetUserUnits(22348)
#3 {main}
thrown in C:\ProgramData\Symcon\modules.store\fonzo.ondilo\Ondilo Device\module.php on line 431

2.Ausgabe:
‚{„temperature_low“:20,„temperature_high“:25,„ph_low“:7,„ph_high“:7.4,„orp_low“:650,„orp_high“:750,„salt_low“:3000,„salt_high“:5000,„tds_low“:250,„tds_high“:2000,„pool_guy_number“:null,„maintenance_day“:5}‘

Danke für die Rückmeldung, kannst dann mal ein Update im Beta Kanal machen und Salz als Variable aktivieren und schauen ob der Wert jetzt aktualisiert wird. Warum jetzt conductivity und hardness nicht vorliegt, kann ich zwar nicht nachvollziehen, aber das wird jetzt geprüft ob das zurückgemeldet wird oder nicht.

Perfekt!
:loveips::loveips::loveips::loveips::loveips:

Sollte dann jetzt auch normal im Stable verfügbar sein, kannst also wieder umstellen.

Hallo Fonzo

Ich hab entdeckt, dass es bei dem Modul einige Funktionen gibt. Ganz im speziellen würde mich ineteressieren was folgene machen

ONDILO_ReadPoolInformation
ONDILO_RequestDataFromParent
ONDILO_SetWebFrontVariable
ONDILO_Update
ONDILO_GetListActiveRecommendations
.
Was ich gerne machen würde, weil es das offenbar gibt, ist, aktuelle Meldungen/Empfehlungen einzulesen. Dafür denke ich ist die ONDILO_GetListActiveRecommendations zuständig. Das Validate interessiert mich jetzt im moment noch nicht, vielleicht. Schau ma mal.
Weiters würde ich gerne einen Button einbauen, der aktiv die Daten aktualisiert. Ob jetzt neue Daten da sind oder nicht, ist mal egal. Hintergrund ist der, Mein ICO hat eben mal die WLAN Verbindung verloren und ich hab mit dem Handy und Bluetooth die Messwerte heruntergeladen. Das geht in der App, aber dazu ist eine Bluetoothverbindung notwendig. In IPS hätte es mir allerdings zu lange gedauert, bis die Werte da sind. Daher der Button. Was nehme ich da her? Bin mir nicht sicher, welche Funktion das macht.
Vielen Dank.

Wollte eben die Funktion zum Validieren der Meldung verwenden und hab dann folgede Fehlermedung erhalten

Notice: Undefined variable: response in C:\ProgramData\symcon\modules\.store\fonzo.ondilo\Ondillo Cloud\module.php on line 604
RESULT: in C:\ProgramData\symcon\modules\.store\fonzo.ondilo\Ondilo Device\module.php on line 683

Mein Code im Skript schaut so aus

$WebHookID="";
$WebHookID=$_GET["ID"];
if($WebHookID != "")
{
    ONDILO_ValidateRecommendation(15799,$WebHookID);
    header("Location:".$_SERVER['HTTP_REFERER']."#17134",true); 
}

Ist bei mir der Fehler?

Liest die Poolinformationen aus

Interne Funktion, nicht mehr direkt zugänglich. Fordert Daten von der IO Instanz an.

Wird vom Konfigurationsformular aufgerufen, sobald eine Auswahl getroffen wurde eine Variable für den Webfront anzulegen.

Wird automatisch durch einen internen Timer zyklisch aufgrufen und aktualisiert sämtliche Geräte Daten. Sollte daher nicht manuell oder über ein Skript aufgerufen werden, da die Aktualisierung automatisch erfolgt.

Falls Empfehlungen vorhanden sein sollten, kann man diese mit der Methode abrufen.

Du bekommst dann einen Array zurück, könnte theoretisch noch im Webfront ergänzt werden.

Das geht über Update, allerdings sollte man immer schauen das man nicht an API Limits läuft und dann gesperrt wird.

Danke für die Aufklärung. Das mit den Meldungen hab ich ja schon soweit einbauen können, da ich heute eine bekommen hab. Beim Bestätigen bekomm ich einen Fehler. Wobei ich mir halt nicht sicher bin, ob das an meinem Code liegt.

Da ich nie Empfehlungen ausgelesen hatte, war da noch ein Fehler drinnen. Zu beachten ist, dass die richtige ID übergeben wird, diese sollte in der Antwort auf


ONDILO_GetListActiveRecommendations

enthalten sein.

Perfekt. Jetzt funktioniert es. Vielen Dank!
Hier nochmal der gesamte code zum Auslesen und Anzeige in einer HTML-Box. Besttigen geht auch, aber so gefällt mir die Lösung noch nicht.

<?php

//Start writing your code here
$WebHookID="";
$WebHookID=$_GET["ID"];
if($WebHookID != "")
{
    ONDILO_ValidateRecommendation(15799,strval($WebHookID));
    header("Location:".$_SERVER['HTTP_REFERER']."#17134",true); 
}

$Empfehlung=json_decode(ONDILO_GetListActiveRecommendations(15799),true);
$Anzahl = count($Empfehlung);

if ($Anzahl == 0 ) { 
    $Empfehlung_HTML="Keine neuen Empfehlungen vorhanden.";
}
else
{
    $Empfehlung_HTML="<table style=\"width:100%\">";
    $Empfehlung_HTML = $Empfehlung_HTML."<tr><th>Titel</th><th>Nachricht</th><th>Erstellt</th><th>Status</th><th>Bestätigen</th></tr>";
    for ($i=0;$i<=$Anzahl-1;$i++)
    {
        $Empfehlung_HTML = $Empfehlung_HTML."<tr>";
        $Empfehlung_HTML = $Empfehlung_HTML."
                            <td>".$Empfehlung[$i]["title"]."</td>"."
                            <td>".$Empfehlung[$i]["message"]."</td>"."
                            <td>".$Empfehlung[$i]["created_at"]."</td>"."
                            <td>".$Empfehlung[$i]["status"]."</td>"."
                            <td><a href=\"/hook/ICOValidieren?ID=".$Empfehlung[$i]["id"]."\">Ok</a>".
                            "</td>";
        $Empfehlung_HTML = $Empfehlung_HTML."</tr>";
    }
    $Empfehlung_HTML = $Empfehlung_HTML."</table>";
    WFC_PushNotification(17134,"Pool","Es sind neue Empfehlungen vorhanden!","",0);
    WFC_SendNotification(17134,"Pool","Es sind neue Empfehlungen vorhanden!","",0);
}
SetValue(49458,$Empfehlung_HTML);

Falls Du Dir irgendwas in Form eine HTMLBox zurecht gebaut hast und das soweit auf Funktion getestet hast, kannst Du ja vielleicht den Inhalt der HTMLBox mal zur Verfügung stellen, dann kann das noch in das Modul ergänzt werden.

Ich hab oben den Code reingestellt.
Deine Funktion lieft folgendes

"[{"id":1042072,"title":"Add 246 g of pH+","message":"Your pH level is low. I suggest adding pH increaser to improve your sanitizer performance and balance your water.","created_at":"2020-07-09T05:15:11+0000","updated_at":"2020-07-09T05:15:11+0000","status":"waiting","deadline":"2020-07-11T00:00:00+0000"}]"

Wie ich erfahren hab ist das ein json Format. Mit „json_decode“ hab ich es in zweidimensionales array verfrachtet. Es können theoretisch mehrere Meldungen auf einmal kommen. Und diese beziehen sich nicht immer auf die Chemie. Einmal die Woche kommt die Erinnerung zum Reinigen und wenn das Wetter schlecht wird, dann kommt die Empfehlung, den Pool zuzumachen. Leider kommen die Meldungen auf Englisch. Oder glücklicherweise. Ich hätte es auf französisch erwartet ;-). Wichtig ist eigentlich nur die ID für die Bestätigung. Der Status wechselt beim validieren. In der App sehe ich die Meldung noch und könnte auf „Fertig“ wechseln. Ich denke validieren bedeutet für sie, ich habs gesehen und fertig ich habs getan. Die mit Status validiert (oder wie auch immer der heißt) sehe ich in IPS nicht mehr. Braucht auch keiner.

Ich hab das mal ungeschaut durch den google translator laufen lassen. Keine Ahnung ob man den in IPS on demand verwenden kann, aber das Ergebnis ist nicht mal so schlecht.

{"id": 1042072, "title": "246 g pH + hinzufügen", "message": "Ihr pH-Wert ist niedrig. Ich empfehle, den pH-Wert zu erhöhen, um die Leistung Ihres Desinfektionsmittels zu verbessern und Ihr Wasser auszugleichen.", "created_at" " 11T00: 00: 00 + 0000 "}]

Kommt dem Text sehr nahe, der in der App angezeigt wird. Da ist er auf Deutsch. Wobei ich denke die lassen den auch automatisiert Übersetzten.

Solltest du noch etwas brauchen, gerne. Die nächste Meldung kommt bestimmt, schon alleine weil das Wochenende kommt ;-).

Hallo Fonzo

Hier meine letzte Version vom Aufbau der Box mit den Meldungen ink. Bestätigung mit JavaSkript.

<?php

//Start writing your code here
if($_IPS['SENDER'] == 'WebHook') {
    $WebHookID="";
    $WebHookID=$_GET["ID"];
    ONDILO_ValidateRecommendation(15799,strval($WebHookID));
}

$Empfehlung=json_decode(ONDILO_GetListActiveRecommendations(15799),true);
$Anzahl = count($Empfehlung);

if ($Anzahl == 0 ) { 
    $Empfehlung_HTML="Keine neuen Empfehlungen vorhanden.";
}
else
{
    $Empfehlung_HTML="<script>
                      function Confirm(ID) {
                        window.xhrGet=function xhrGet(o) {var HTTP = new XMLHttpRequest(); HTTP.open('GET',o.url,true);HTTP.send(); }; window.xhrGet({ url: 'hook/ICOValidieren?ID='+ID });
                      }</script>";
    $Empfehlung_HTML=$Empfehlung_HTML."<table style=\"width:100%\">";
    $Empfehlung_HTML = $Empfehlung_HTML."<tr><th>Titel</th><th>Nachricht</th><th>Erstellt</th><th>Status</th><th>Bestätigen</th></tr>";
    for ($i=0;$i<=$Anzahl-1;$i++)
    {
        $Empfehlung_HTML = $Empfehlung_HTML."<tr>";
        $Empfehlung_HTML = $Empfehlung_HTML."
                            <td>".$Empfehlung[$i]["title"]."</td>"."
                            <td>".$Empfehlung[$i]["message"]."</td>"."
                            <td>".$Empfehlung[$i]["created_at"]."</td>"."
                            <td>".$Empfehlung[$i]["status"]."</td>"."
                            <td><div class=\"center\"><button onclick=\"Confirm(".$Empfehlung[$i]["id"].")\">Ok</button></div>".
                            "</td>";
        $Empfehlung_HTML = $Empfehlung_HTML."</tr>";
    }
    $Empfehlung_HTML = $Empfehlung_HTML."</table>";
    WFC_PushNotification(17134,"Pool","Es sind neue Empfehlungen vorhanden!","",0);
    WFC_SendNotification(17134,"Pool","Es sind neue Empfehlungen vorhanden!","",0);
}
SetValue(49458,$Empfehlung_HTML);

@Fonzo
Du hast ja die Variable für Salz eingebaut und auch wählbar gemacht. Ich hab sie nicht gewählt (doch einmal weil ich neugierig war) und jetzt geht die nimma weg. Der Schalter ist auf false, aber wenn ich die Variable lösche, dann taucht sie nach jedem Neustart vom Dienst wieder auf :wink:
Das Ding ist echt hartnäckig :smiley: