Poolsteuerung anbinden

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Benutzeravatar
seppy
Beiträge: 738
Registriert: 24. Sep 2015 20:25
Answers: 4
Wohnort: Bonn

Poolsteuerung anbinden

Beitrag von seppy »

Hi,
ich habe mir einen Pool gebaut und will diesen natürlich möglichst voll automatisieren. Dazu habe ich auf den PoolController von PoolDigital zurückgegriffen. Da ich mit dem Pool noch nicht komplett fertig bin und Winterpause habe konnte ich es aber nicht abwarten den Controller testweise in Betrieb zu nehmen. Dazu habe ich die OneWire Schnittstelle in Betrieb genommen und messe jetzt über den Controller die Temperatur im Außenbereich und im Technikraum:
snip_PoolController2.png
snipPoolController.JPG
Alles gut und schön soweit. ABER ich will natürlich auch alle Infos in meinem openHAB anzeigen und nutzen können, bzw. auch in der anderen Richtung.
Netterweise bieten die Jungs vom PoolController eine simple Schnittstelle sofort an. Über den Aufruf http://192.168.XXX.XXX/GetState.csv bekomme ich ein CSV mit allen relevanten Infos geliefert.
Ich habe einen kleinen CSV Parser in Javascript hergenommen und extrahiere mir so in diesem Fall die beiden Temperaturwerte. Die Items sehen wie folgt aus:

Code: Alles auswählen

Number PoolControllerTempBecken
	"Temperatur Becken [%.1f °C]"
	<temperature>
	{http="<[http://192.168.XXX.XXX/GetState.csv:60000:JS(poolctrl_temp1.js)]"}	

Number PoolControllerTempTechnik
	"Temperatur Technikraum [%.1f °C]"
	<temperature>
	{http="<[http://192.168.XXX.XXX/GetState.csv:60000:JS(poolctrl_temp2.js)]"}
Als Beispiel mit vollständigem Code der CSV Parser:

Code: Alles auswählen

/**
* Javascript Transformator, aus dem Rückgabe CSV des PoolControllers den passenden Wert extrahiert.
* Wenn ja wird die Kalenderbezeichnung des Tages zurückgegeben, wenn nicht ein false
*/
var col = 8;
function CSVToArray( strData, strDelimiter ){
    // Check to see if the delimiter is defined. If not,
    // then default to comma.
    strDelimiter = (strDelimiter || ",");

    // Create a regular expression to parse the CSV values.
    var objPattern = new RegExp(
        (
            // Delimiters.
            "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +

            // Quoted fields.
            "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +

            // Standard fields.
            "([^\"\\" + strDelimiter + "\\r\\n]*))"
        ),
        "gi"
        );


    // Create an array to hold our data. Give the array
    // a default empty first row.
    var arrData = [[]];

    // Create an array to hold our individual pattern
    // matching groups.
    var arrMatches = null;


    // Keep looping over the regular expression matches
    // until we can no longer find a match.
    while (arrMatches = objPattern.exec( strData )){

        // Get the delimiter that was found.
        var strMatchedDelimiter = arrMatches[ 1 ];

        // Check to see if the given delimiter has a length
        // (is not the start of string) and if it matches
        // field delimiter. If id does not, then we know
        // that this delimiter is a row delimiter.
        if (
            strMatchedDelimiter.length &&
            strMatchedDelimiter !== strDelimiter
            ){

            // Since we have reached a new row of data,
            // add an empty row to our data array.
            arrData.push( [] );

        }

        var strMatchedValue;

        // Now that we have our delimiter out of the way,
        // let's check to see which kind of value we
        // captured (quoted or unquoted).
        if (arrMatches[ 2 ]){

            // We found a quoted value. When we capture
            // this value, unescape any double quotes.
            strMatchedValue = arrMatches[ 2 ].replace(
                new RegExp( "\"\"", "g" ),
                "\""
                );

        } else {

            // We found a non-quoted value.
            strMatchedValue = arrMatches[ 3 ];

        }


        // Now that we have our value string, let's add
        // it to the data array.
        arrData[ arrData.length - 1 ].push( strMatchedValue );
    }

    // Return the parsed data.
    return( arrData );
}

(function(i) {
    var data = CSVToArray(input,",")
    var offset = data[3][col];
    var gain = data[4][col];
    var value = data[5][col];
    var result = offset + ( gain * value);
    return (Number(result).toFixed(2));
})(input)
Eine Regel ist in diesem Fall nicht notwendig, da alle Anpassungen bereist im Javascript gemacht werden.
Sobald ich weitere Funktionen des PoolControllers in Betrieb genommen habe, liefere ich Euch hier ein Update!

Grüße,
Seppy
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Homematic und HomematicIP über Raspberrymatic (RaspPi 4 4GB) mit 2x HMLAN. Steuerung und Visualisierung durch OpenHAB2 auf RaspPi in Hutschienengehäuse im Sicherungskasten. Rund 100 Aktoren/Sensoren

- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung

Ernest Strotz
Beiträge: 8
Registriert: 21. Okt 2018 17:34

Re: Poolsteuerung anbinden

Beitrag von Ernest Strotz »

Hallo seppy,
Inzwischen ist der Sommer vorbei und ich hoffe der Pool war im Einsatz.
Ich wäre interessiert zu erfahren wie die Ankopplung an OpenHAB sich bewährt hat.
Auch wäre es sinnvoll zu wissen über welche Addons und Parameter die Ankopplung klappt.
Bitte für Laien verständlich. Ich bin nicht Informatiker.

Vielen Dank im Voraus,
Ernest

Benutzeravatar
seppy
Beiträge: 738
Registriert: 24. Sep 2015 20:25
Answers: 4
Wohnort: Bonn

Re: Poolsteuerung anbinden

Beitrag von seppy »

Ernest Strotz hat geschrieben:Hallo seppy,
Inzwischen ist der Sommer vorbei und ich hoffe der Pool war im Einsatz.
Ich wäre interessiert zu erfahren wie die Ankopplung an OpenHAB sich bewährt hat.
Auch wäre es sinnvoll zu wissen über welche Addons und Parameter die Ankopplung klappt.
Bitte für Laien verständlich. Ich bin nicht Informatiker.

Vielen Dank im Voraus,
Ernest
Hi Ernest,
ja der Pool war quasi rund um die Uhr im Einsatz. Ich bin mit der Anbindung super zufrieden. Ich habe die Beleuchtungssteuerung des Pools komplett openHAB überlassen. Der Controller hatte für die Beleuchtung keine Steuerungsfunktion inne.

Die Umsetzung habe ich oben beschrieben, welche Infos fehlen denn? Das genutzte Binding ist das http Binding. Wenn Du Deine Frage etwas konkretisierst helfe ich Dir gerne.

Grüße,
Seppy


Gesendet von iPhone mit Tapatalk
Homematic und HomematicIP über Raspberrymatic (RaspPi 4 4GB) mit 2x HMLAN. Steuerung und Visualisierung durch OpenHAB2 auf RaspPi in Hutschienengehäuse im Sicherungskasten. Rund 100 Aktoren/Sensoren

- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung

Ernest Strotz
Beiträge: 8
Registriert: 21. Okt 2018 17:34

Re: Poolsteuerung anbinden

Beitrag von Ernest Strotz »

Hallo seppy,

Danke für die schnelle Antwort.

Laut Deiner Aussage geht das Auslesen relativ einfach.

Also was ich machen will:
Mein Pool wird augenblicklich über eine SPS gesteuert die alle Funktionen bewerkstelligt. Niveau-Reglung/pH-Reglung/Redox-Regelung/temperaturabhängige Steuerung der Filterpumpe/sowie einige Sicherheitsabschaltungen.
Die Poolsteuerung hat keine Netzwerkanbindung.
Alle Messwerte werden über Modbus an OpenHAB weitergegeben sodass ich dieselben aus der Ferne überwachen kann.
Da die Steuerung in letzter Zeit etwas schwächelt, spiele ich mit dem Gedanken diese auszutauschen bevor sie den Geist ganz aufgibt.
Ich bin dabei auf Deinen Beitrag im Forum gestossen. Das PoolDigital-Gerät gefällt mir recht gut.
Obwohl die Poolsteuerung von PollDigital direkt aus der Ferne gesteuert werden kann, möchte ich die OpenHAB Anbindung doch weiter ausnutzen.

Meine OpenHAB läuft auf einem Raspberry3 und erfasst eine Vielzahl von Plug-Ins
- KNX für Beleuchtung und Rolläden
- Z-Wave für Temperatur-, Feuchte- Leistungsmessung sowie Schalten von Zwischensteckern
- Fritzbox zur Steuern der Heizkörperventile
- Tinkerforge zur Messung der Temperaturen und Steuerung der Zentralheizung
- Modbus für die Überwachung des Pools
- Weather für Anzeige von Wetterdaten.

Ich war mit openhab1 eingestiegen und dann zu openhab2 gewechselt.
Von Programmierung habe ich leider wenig Ahnung, kam mit OpenHAB bis jetzt jedoch gut zurecht.
Von der Ausbildung bin ich Elektroingenieur, habe dies allerdingst vor dem digitalen Zeitalter studiert (60-ziger Jahre des vorigen Jahrhunderts)
Da ich seit einigen Jahren den Ruhestand geniesse, bleibt mir viel Zeit mich mit Hausautomation zu befassen.

Also mit den in Deinem Beitrag vorgeschlagenen Items komme ich klar, bei dem CSV-Parser bin ich jedoch überfordert.
Ist der Parser notwendig oder können alle Messwerte mittels Items ausgelesen werden ?

Ich werde mir eine Steuerung von PoolDigital besorgen und kann mich dann während der langen Winterabenden damit beschäftigen.
Falls ich überhaupt nicht klar komme, melde ich mich.

Grüsse
Ernest

Benutzeravatar
seppy
Beiträge: 738
Registriert: 24. Sep 2015 20:25
Answers: 4
Wohnort: Bonn

Re: Poolsteuerung anbinden

Beitrag von seppy »

Hi,
der Controller bietet nur eine CSV Schittstelle zum Auslesen der verschiedenen Status. Deshalb ist der Parser m.E. notwendig. Aber die komplexität hält sich in Grenzen, da Du nur im letzten Codeblock die Zeile und die Spalte Deines gewünschten Wertes angeben musst. Dieser Rückgabewert wird dann in das Item gespeichert. Im Prinzip ist der Parser die Sprache für die Übersetzung in ein Item.
Besorg Dir den Controller und den Rest bekommst Du auch hin ... oder Du fragst hier ;)

Grüße,
Seppy
Homematic und HomematicIP über Raspberrymatic (RaspPi 4 4GB) mit 2x HMLAN. Steuerung und Visualisierung durch OpenHAB2 auf RaspPi in Hutschienengehäuse im Sicherungskasten. Rund 100 Aktoren/Sensoren

- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung

Ernest Strotz
Beiträge: 8
Registriert: 21. Okt 2018 17:34

Re: Poolsteuerung anbinden

Beitrag von Ernest Strotz »

Danke seppy,

Der Controller ist bestellt.
Ich melde mich sobald ich weiter bin.

Ernest

Ernest Strotz
Beiträge: 8
Registriert: 21. Okt 2018 17:34

Re: Poolsteuerung anbinden

Beitrag von Ernest Strotz »

hallo seppy,
Mein controller ist angekommen und wurde gleich zu Testzwecken in Betrieb genommen.
Ich habe zwei Temperaturfühler angeklemmt und als "Pool" und"Aussen" konfiguriert.
Die Konfigurierung der Poolsteuerung war problemlos möglich.

Nun soll die Anbindung an Openhab erfolgen.
Ich habe die Add-on's "HTTP Binding" und "Javascript transformation" installiert.
Dann habe ich im Unterverzeichnis "/transform/" eine Datei " poolctrl_tempX.js "erzeugt und Deinen Javascript Parser hineinkopiert.
Anschliessend habe ich im Unterverzeichnis "/items/" eine Items-datei erstellt mit den von dir angegebenen Items.
Die Items erscheinen im Basic UI mit Text und Einheiten, jedoch ohne die Werte.
Laut Log-Datei wird die CSV-Datei vom Controller eingelesen, jedoch die Werte werden nicht umgesetzt.
Mir ist nicht klar, welche Angabe ich im Item unter :JS(??????_???.js)]} eintragen soll um die gewünschten Werte zu bekommen.
Wie schon gesagt, habe ich von Javascript keine Ahnung.

Ich bin auf Hilfe angewiesen.

Ernest


Hier der Text den die Log-Datei in regelmässigen Abständen wiederholt:

2018-10-31 12:44:56.814 [WARN ] [ab.binding.http.internal.HttpBinding] - Transformation 'JS(poolctrl_Aussen.js)' threw an exception. [response=SYSINFO,1.7.0,90778,1,3,35,0,4,3,2
Time,n.a.,n.a.,Filterdruck,Niveau,CPU Temp,Redox,pH,Pool,Absorber,Rücklauf,Aussen,n.a.,n.a.,n.a.,n.a.,FilterPumpe,Magnetventil,Chlor,pH-,n.a.,n.a.,n.a.,n.a.,TASTER1,TASTER2,TASTER3,TASTER4,n.a.,n.a.,n.a.,n.a.,n.a.,n.a.,n.a.,n.a.,Cl Rest,pH- Rest,pH+ Rest,Cl consumption,pH- consumption,pH+ consumption
h,mV,mV,Bar,cm,C,mV,pH,C,C,C,C,C,C,C,C,--,--,--,--,--,--,--,--,cm/s,--,--,--,--,--,--,--,--,--,--,--,%,%,%,ml,ml,ml
0,0,0,-0.400,-25,147.5,0.0,0.0,-0.4,0,0,0.6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1,0.0625,0.0625,0.0000125,0.390625,-0.00468750,0.0625,0.0078125,0.0625,0.0625,0.0625,0.0625,0.0625,0.0625,0.0625,0.0625,1,1,1,1,1,1,1,1,0.001617183658,1,1,1,1,1,1,1,1,1,1,1,0.1,0.1,0.1,1,1,1
3116,0,0,0,0,21401,250,1232,350,0,0,336,0,0,0,0,1,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,1000,1000,1000,0,0,0]
org.openhab.core.transform.TransformationException: An error occurred while loading script.
at org.openhab.core.transform.TransformationHelper$TransformationServiceDelegate.transform(TransformationHelper.java:67) [229:org.openhab.core.compat1x:2.3.0]
at org.openhab.binding.http.internal.HttpBinding.execute(HttpBinding.java:194) [228:org.openhab.binding.http:1.12.0]
at org.openhab.core.binding.AbstractActiveBinding$BindingActiveService.execute(AbstractActiveBinding.java:144) [229:org.openhab.core.compat1x:2.3.0]
at org.openhab.core.service.AbstractActiveService$RefreshThread.run(AbstractActiveService.java:166) [229:org.openhab.core.compat1x:2.3.0]

Benutzeravatar
udo1toni
Beiträge: 13854
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Poolsteuerung anbinden

Beitrag von udo1toni »

Der Aufruf in den Klammern ist der Dateiname des JavaScript Parsers. Leider unterstützt der Transformation Service (derzeit noch?) keine Parameterübergabe. Das Javascript bekommt einfach die komplette Antwort des http Requests. Du musst den Parser also mehrfach anlegen, für jeden abzufragenden Wert einmal, und anschließend in jeder Datei ganz hinten - im Block, der so aussieht:

Code: Alles auswählen

(function(i) {
    var data = CSVToArray(input,",")
    var offset = data[3][col];
    var gain = data[4][col];
    var value = data[5][col];
    var result = offset + ( gain * value);
    return (Number(result).toFixed(2));
})(input)
den Zahlenwert bei Value (im Code "5") anpassen, um die unterschiedlichen Temperaturen zu bekommen. Im Transformation Aufruf musst Du dann die unterschiedlichen Dateinamen angeben.

@seppy:
Ich habe leider auch nicht den vollen Durchblick bei JavaScript. Falls es eine Möglichkeit gibt, bei JavaScript festzustellen, mit welchem Dateinamen die Funktion aufgerufen wurde, könnte man den Code einmal als datei anlegen und dann für jeden Parameter-Wert einen Symlink erzeugen, also z.B.
PoolTemperaturen.js <-Original
PoolTemperaturen_1.js <-SymLink auf PoolTemperaturen.js
PoolTemperaturen_2.js <-SymLink auf PoolTemperaturen.js

Im Parser müsste dann der Dateiname ausgewertet werden und die Zahl im Aufruf entsprechend gesetzt werden. Vorteil wäre, dass man bei Änderungen im Code diese nur einmal abspeichern muss, außerdem braucht ein Symlink nur ein paar Byte im Dateisystem.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
seppy
Beiträge: 738
Registriert: 24. Sep 2015 20:25
Answers: 4
Wohnort: Bonn

Re: Poolsteuerung anbinden

Beitrag von seppy »

Hi,

ich habe mal mit einer ähnlichen Idee wie udi1toni schreibt experimentiert. Letztendlich war es mir aber der Aufwand nicht wert. Ich lese 5 Werte des Controllers aus und habe halt die paar KB kopiert ... schöner wäre anders. Aber es funktioniert.
@Ernest: der Hinweis von udi1toni ist genau der Richtige ;-)

Grüße,
Seppy
Homematic und HomematicIP über Raspberrymatic (RaspPi 4 4GB) mit 2x HMLAN. Steuerung und Visualisierung durch OpenHAB2 auf RaspPi in Hutschienengehäuse im Sicherungskasten. Rund 100 Aktoren/Sensoren

- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung

Ernest Strotz
Beiträge: 8
Registriert: 21. Okt 2018 17:34

Re: Poolsteuerung anbinden

Beitrag von Ernest Strotz »

Hallo Seppy
Hallo Udi1toni

Danke für die Hinweise. Das mit einer JavaScript Datei für jeden Wert ist jetzt klar.
Die Bemerkung Value Code"5" anpassen leuchtet mir jedoch noch nicht ein. Ich hatte verstanden dass die Angaben für data [3] data [4] und data [5] die Werte für offset, gain und value(Rohwert) für eine Datensatz darstellen und dass die Variable col=8 am Anfang des Scripts bestimmt um welchen Datensatz es sich dabei handelt.

Beim Versuch die csv-Datei zu entwirren hat der Script von Seppy zwar Werte ausgegeben aber diese ergaben keinen Sinn.
Wenn ich hingegen anstatt der IP-Adresse meiner Pool-Steuerung die Adresse der Demodatei von PoolDigital eingebe, erhalte ich saubere Werte für die Temperaturen (halt nicht von meinen). Der Script scheint irgendetwas durcheinander zu schmeissen.

Inzwischen habe ich mit Erfolg versucht die Werte mit einem wesentlich einfacheren Script auszulesen.
und zwar:

(function(csv) {
var arr = csv.split(",");
return arr[181];
})(input);

wobei arr[181] die Position des auszulesenden Wertes (hier Rohwert der ersten Temperatur) darstellt.
Man muss dann zwar mal zählen, aber der Aufwand ist gering.
Die Rohwerte passe ich dann mit openhab-rules an. Für die Temperaturen extrahiere ich nur die Rohwerte, da die gain- und offset-Werte im nachhinein nicht mehr ändern. Für pH und Redox lese ich mir ebenfalls die gain- und offset-Werte aus, da diese ansonsten bei jeder Kalibrierung der Sonden geändert werden müssten.
Die Werte für die Relais setze ich mit einer MAP-Funktion im Item in die Texte "0=Auto-Aus","1=Auto-Ein","2=Hand-Aus","3=Hand-Ein" um.
Ich werde die Steuerung erst im Frühjahr in meinen Pool einbauen und erst dann Werte für pH und Redox erhalten.

Ernest

Antworten