PRTG und Syr LexPlus 10

Auf der Seite Syr LexPlus 10 habe ich die technische Funktion des LexPlus 10 im LAN und mit der Cloud beschrieben. Diese Seite beschreibt einen PRTG-Sensor, um die Daten abzurufen.

Einfacher Sensor mit PRTG gegen die Cloud

Mein Ziel war es ja, bestimmte Daten in meine PRTG-Überwachung zu übernehmen. In der ersten Version nutze ich einfach die Cloud-Dienste und geben mich als IOPS-App aus. Die Zugangsdaten scheinen sich nicht zu ändern und alle 5 Minuten ein Anruf sollte mir ausreichen um z.B.: eine Information über Salzmangel zu bekommen. Wobei man wissen muss, das der LexPlus keinen echten Mangelsensor hat, sondern anhand des Verbrauchst bei seiner Regenerationen und der nach dem Einfüllen eingegebenen Salzmenge im Behälter errechnet, ob es reicht.

Ich habe mir aus Fiddler oder Wireshark einfach den Request ausgelesen, den die App an SyrConnect sendet, diesen Abruf per Powershell durchgeführt und die Ausgabe für PRTG umformatiert. Eigentlich ein ganz einfaches PowerShell-Script, welches PRTG nun einmal alle 5 Minuten aufruft.

# PRTG-SyrLexPlus
#
# Grabbing data from the SyrConnect Service to viaualize in my own monitoring
# You have to caputre the authentication XML manually from a IOS/Anroid-App with Fiddler, Wireshark or similar

$url = "http://syrconnect.de/WebServices/SyrControlWebServiceTest2.asmx/GetDeviceCollectionStatus"
$formFields = @{xml='<?xml version="1.0" encoding="utf-8"?>
                     <sc>
                        <si v="App-2.23.0-de-DE-iOS-iPhone-10.0.2-de.consoft.syr.connect" />
                        <us ug="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" />
                        <col>
                           <dcl dclg="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" />
                        </col>
                        <cs v="36AA"/>
                     </sc>'}
try {
   $postresult = Invoke-RestMethod `
                    -Uri $Url `
                    -Method POST `
                    -ContentType "application/x-www-form-urlencoded"`
                    -Body $formFields
}
catch {
   write-error "Error during retrieving data"
}

[hastable]$resulthash=@{}
if ($postresult) {
   foreach ($node in $postresult.sc.dvs.d.c){
      if ($node.v  -ne "") {
         $resulthash[$node.n]=$node.v
      }
      elseif ($node.dt  -ne "") {
         $resulthash[$node.n]=$node.dt
      }
      else{
         $resulthash[$node.n]=""
      }
   }
}
#$resulthash


$prtgresult = '<?xml version="1.0" encoding="UTF-8" ?>
<prtg>
   <result>
      <channel>Salzvorrat (SS1) Wochen</channel>
      <value>'+$resulthash["getSS1"]+'</value>
      <float>1</float>
   </result>
   <result>
      <channel>Restkapazitaet (RES) Liter</channel>
      <value>'+$resulthash["getRES"]+'</value>
      <float>1</float>
   </result>   
   <result>
      <channel>Weichwasserhaerte (IWH) dH</channel>
      <value>'+$resulthash["getIWH"]+'</value>
      <float>1</float>
   </result>
   <result>
      <channel>Rohwasserhaerte (OWH) dH</channel>
      <value>'+$resulthash["getOWH"]+'</value>
      <float>1</float>
   </result>
   <result>
      <channel>Wasserdruck (PRS) bar</channel>
      <value>'+$resulthash["getPRS"]/10+'</value>
      <float>1</float>
   </result>
</prtg>'

$prtgresult

Diese PS1-Datei legen Sie dann wieder in "C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML" ihres PRTG-Servers ab und pflegen die richtigen Werte für das POST ein. Dann können Sie das Script als EXE/Advanced wieder gemäß der Anleitung auf PRTG:Custom Sensor einbinden. Ein Aufruf alle Minute ist sicher zu häufig und belastet den PRTG-Server ohne Mehrwert. Ich habe nur eine überschaubare Anzahl an Sensoren und lasse ihn all 5 Minuten abfragen. Nach der ersten Messung hat PRTG auch die Kanäle gelernt und sie können Alarme einrichten.

Ich habe mir eine Warnung für den Salzvorrat eingerichtet, wenn er auf unter 2 Woche kommt.

Bei meinem aktuellen Verbraucht hält ein 25kg Sack ca. 15-20 Wochen und dank dem Status in PRTG, der Mail verpasse ich das nicht mehr und in die PRTG Mobile App ist der Sensor ebenso integriert. Parallel gibt es natürlich auch noch den einfachen ICMP-Sensor um die Erreichbarkeit zu prüfen.

Der HTTP-Sensor kann zwar genutzt werden, um den kleinen Webserver mit dem BMP-Bild zu prüfen aber ich habe eigentlich nicht vor darauf noch eine OCR-Erkennung zu machen, um weitere Daten wie z.B. die Durchflussmenge zu ermitteln. Da hoffe ich eher drauf, dass die Daten irgendwann doch mal anders abgerufen werden können

Es bleibt natürlich noch die Frage, was die sonstigen Werte der 50 gemeldeten Felder sonst alles bedeuten, die ich nicht zuordnen kann und in der App auch nicht angezeigt werden. Hier mal ein Auszug:

PS C:\temp\prtgsensoren> $postresult.sc.dvs.d.c

n                          v                          dt
-                          -                          --
getSRN                     161308410                  06.10.2016 07:18:33
getCNA                     LEXplus10
getDEN                     1
getMAC                     xx:xx:xx:x:xx:xx  (Die MAC-Adresse habe ich entfernt und ist für PRTG nicht nutzbar)
getSTA
getMAN                     Syr
getALM                                                06.10.2016 06:24:06
getCDE                     010SCA19DF0917.01.024.1...
getCS1                     83
getCS2                     0
getCS3                     0
getCYN                     0
getCYT                     00:00
getDWF                     200
getFCO                     0
getFIR                     SLP0
getFLO                     0
getNOT
getPA1                     0
getPA2                     0
getPA3                     0
getPRS                     49
getPST                     0
getRDO                     80
getRES                     2288
getRG1                     0
getRG2                     0
getRG3                     0
getRPD                     4
getRPW                     0
getRTI                     00:00
getSCR                     0
getSRE                     0
getSS1                     16
getSS2                     0
getSS3                     0
getSV1                     22
getSV2                     0
getSV3                     0
getWHU                     0
getTOR                     3
getVER                     LEX Plus V3.0
getVS1                     0
getVS2                     0
getVS3                     0
getOWH                     6
getRTH                     1
getRTM                     0
getIWH                     14
getTYP                     80

Auf dem Display gibt es mehr

Leder sehe ich hier in keinster Weise die Werte, die auf dem Display selbst sehr wohl angezeigt werden können wie z.B. die Verbräuche. Hier mal ein paar Bilder:

Leider habe ich noch keinen Wert gefunden, der zumindest die pro Stunde, Tag, Montag und Jahr kumulierten Werte bereit stellt, um diese Grafiken in PRTG zu erzeugen. Mir würde ja schon eine kleine XML/JSON/CSV-Ausgabe reichen, die man vom Webserver abrufen kann.

PRTG als SyrConnect Backend

So schön eine "offene Kommunikation" für die Untersuchung ist, so ungern mag ich, dass mein System mit Cloud-Diensten spricht. Viel lieber wäre mir, wenn ich lokal die Daten einfach per Browser, Rest-API, SNMP o.ä. abfragen kann, wie ich das bei PRTG:Kostal oder PRTG:Pluggit gemacht habe. Aktuell noch nicht umgesetzt aber in der Planung ist daher ein Umbau in der Art, dass der LexPlus nur noch "denkt" er würde mit dem Internet sprechen aber in Wirklichkeit mit dem PRTG-Server spricht. Dazu muss ich natürlich einige Einstellungen vornehmen

  • Zugang zum Internet blocken
    Das geht in der Fritz!Box recht einfach, indem ich die IP das passende Profil zuweise. Zudem kann ich den LexPlus von DHCP auf manuell konfigurierte IP-Adressen einstellen und dabei z.B. das Default Gateway untauglich machen.
  • Interner DNS umleiten
    Die Namensauflösung für connect.saocal.pl und syrconnect.consoft.de leite ich über den eigenen DNS-Service auf einen lokale IP-Adresse um. Dazu stelle ich den LexPlus von DHCP auf statische IPs um und trage meinen internen DNS-Server ein, der natürlich Anfragen auch nach extern weiterleitet. Aber ich kann dann mit Stub-Zonen die Anfragen abfragen und auf meinen "WebServer" umleiten.
  • Eigener HTTP-Service
    Auf dem PRTG-Server räume ich Port 80 frei und starte dort meinen eigenen WebServer, der die Anfragen annimmt und verarbeitet. Ich bin noch nicht sicher, ob ich das wieder per PowerShell mache oder doch mal eine ASPX-Applikation für den IIS schreibe.

Leider liefert LexPlus nur Momentan-Werte. Andererseits kann PRTG dieses ja auch selbst in eine historische Datenbank ablegen. Damit PRTG den Port 80 nicht für eine Umleitung verwendet, muss folgender Eintrag in der Registrierung addiert und der Dienst durchgestartet werden:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Paessler\PRTG Network Monitor\Server\Webserver]
"NoSSLRedirect"=dword:00000001

IoT OwnHub

Ich möchte nicht, dass das Gerät einen mir unbekannten Cloud-Dienst nutzt und von dort sogar Firmware-Updates ohne Rückfrage installieren könnte und Befehle annimmt. Aber ganz auf die Daten möchte ich auch nicht verzichten. Also versuche ich die Funktion "lokal" nachzubauen. Das kann ein RasPi sein, ein Windows Server oder auch ein NAS-Gerät (z.B. Synology, Qnap), welches 24h aktiv ist und einen kleinen Webserver mit PHP betreibt.

Aktuell ist dieser Teil noch eine Baustelle, da die Nutzung der Cloud aktuell noch aktiv ist. Ich spekuliere auch darauf, dass Syr vielleicht ihre Firmware dahingehend erweitert, dass direkte Abfragen per HTTP-GET/POST lokal möglich sind.

Weitere Links