Projekt

Smart CO2 Barometer Temp Humi Sensor

 

     

 

 

GLAB Logo

 

Version 1.0


 

Dokument Version:

 

Version:                  1.0

Datum:                    2019.12.28

Autor:                      GINTHER, Andreas

Sprache:                 Deutsch

 

 

GLAB:

 

GLAB Logo GLAB steht für Ginther Laboratories.

Es handelt sich hier weder um eine Firma noch ein gemeldetes Gewerbe.

Es werden damit lediglich Konstruktionen, Architekturen und Erfindungen bezeichnet welche im privaten eigennützigen Gebrauch entstehen.

 

Nur mit Zustimmung von Ginther Andreas dürfen mit GLAB gekennzeichnete Software, Hardware und Konzepte verwendet werden.

Es wir keinerlei Haftung oder Gewährleistung für dessen übernommen.

 

 

In Kooperation mit:

 

 

 

Image result for paessler

 

Image result for betalayout logo

 

https://www.logolynx.com/images/logolynx/2b/2bb66dba6c07ffeacd588865cc106d7e.png

 


 

Zusammenfassung:

 

Mit dem GLAB CO2 - Barometer - TH Sensor kann im Außenbereich stationär CO2, Luftdruck, Temperatur und Feuchtigkeit zuverlässig gemessen und Langzeitgrafen mit den gewonnenen Daten aufgezeichnet werden.

 

Der Sensor wird per PoE Power over Ethernet mit Strom versorgt und überträgt über 3 UART Ports die unterschiedlichen Sensor Messdaten per ASCII und Modbus über TCP.

 

Der Sensor ist in einem spritzwasserdichten Gehäuse mit Flanschbefestigung für den Außenbereich konzipiert. Alle Sensoren sind mit Insektenabwehr versehen.

 

 


Inhaltsverzeichnis

 

 

 

1       Projekt 4

1.1        CO2 Sensor 4

1.2        Temperatur und Feuchte Sensor 5

1.3        Luftdruck Sensor 6

1.4        UART – LAN Modul 7

1.5        PoE – LAN Modul 8

1.6        GLAB Sensor – LAN / UART Interface Schaltung. 9

1.7        GLAB Sensor – LAN / UART Interface Platine. 10

1.8        Insekten Abwehr 14

1.9        Gehäuse. 15

1.10     Frontplatte. 17

1.11     UART – LAN Modul Konfiguration. 21

1.12     Modbus Protokoll 22

1.13     Modbus Frame rotronic Sensoren. 23

1.14     PowerShell Programm Modbus. 24

1.15     PowerShell Programm ASCII 27

1.16     PowerShell Programm PRTG.. 31

1.17     PRTG Sensoren. 33

1.18     PRTG Grafen. 34

1.19     PRTG Map. 36

1.20     HomeMatic und Pocket Control Integration. 37

1.21     Anbringung im Außenbereich. 39

 


 

1      Projekt

 

Projekt Anforderungen und Beschreibung:

 

·       Messen von CO2, Luftdruck, Temperatur und Feuchtigkeit im Außenbereich

(Sensor mit Langzeitstabilität hoher Messhäufigkeit und Lebensdauer)

·       Messen der Temperatur des Gehäuseinneren (Überprüfung der Betriebstemperatur)

·       Übertragen der Daten von der seriellen UART Schnittstelle per Modbus TCP Protokoll über Ethernet

·       Parsen vom Modbus Frame über TCP mit Windows PowerShell

·       Stromversorgung des Modules mit PoE, keine extra Stromversorgung notwendig

·       Langzeitaufzeichnung und Darstellung mit PRTG

·       Spritzwasserdichtes, robustes Metall Gehäuse mit Befestigungsflansch

·       Insekten Abwehr

 

1.1     CO2 Sensor

 

Der Rotronic CO2 Fühler eignet sich bestens für Büroräume und Anwendungen, wo die Raumluftqualität eine große Auswirkung haben. Zusammen mit anderen Messparameter können diese Fühler perfekt ins RMS integriert werden.

 

Merkmale:

     

 


 

1.2     Temperatur und Feuchte Sensor

 

Der digitale Fühler zeichnet sich durch seine hohe Leistungsfähigkeit aus. Sehr geringer Stromverbrauch, höchste Messgenauigkeit und Messresultate innerhalb von 50 ms sind die wichtigsten Kernpunkte. Ermöglicht wird dies durch den neuen AirChip4000, welcher zusammen mit dem HYGROMER® HT-1 Sensor ein Leistungsfähiges Duo bildet.

 

Merkmale:

      https://www.rotronic.com/media/catalog/product/cache/6/image/9df78eab33525d08d6e5fb8d27136e95/h/c/hc2a-s_pfad.jpg

 

Für die Montage der Sensoren ist ein Einbaustecker verfügbar auf den die Sensoren aufgeschraubt werden und ausreichend Halt haben.

 

 


 

1.3     Luftdruck Sensor

 

The MS5561C is a SMD-hybrid device including a precision piezo-resistive pressure sensor and an ADC-Interface IC. It uses a three-wire serial interface for communication. The module dimensions of 4.75 mm x 4.25 mm and a height of only 1.6 mm allows for up-to-date SMD design. It provides a 16-bit data word from a pressure and temperature dependent voltage. The MS5561C is a low power, low voltage device with automatic power down (ON/OFF) switching. A 3-wire interface is used for all communications with a micro-controller.

 

Merkmale:

 

Air Pressure Sensor Module - MS6651, PIC16F690 (Serial Enabled) 017-MB-SM11111 Sure Electronics in Australia (Feature image)

 


 

1.4     UART – LAN Modul

 

Es wird ein Modul eingesetzt (USR-TCP232-ED2) von www.usriot.com welches 3 UART Ports über eine Ethernet LAN Schnittstelle übertragen kann. Über eine Web Oberfläche können die Ports konfiguriert werden.

Danach können über TCP oder UDP die Daten der UART Ports empfangen werden.

Auf dem Modul arbeitet ein Cortex-M4 Prozessor mit 512Kb Speicher.

Damit ist eine Verarbeitung von 115200 Baud Rate problemlos möglich.

Die seriell empfangenen Daten können dann auch per Modbus über TCP je Port übertragen werden.

 

 


 

1.5     PoE – LAN Modul

 

Das gesamte Modul mit all seinen Komponenten soll per PoE mit Strom versorgt werden.

Hierzu wird ein PoE Modul eingesetzt. Dadurch ist die Anbringung des Sensors im Außenbereich ohne aufwendige Verkabelung möglich.

 

Das PoE Modul kann per Daten und Storm Modus A oder per Separate Strom Modus B versorgt werden.

Es wird der Modus A gewählt, weil die meisten PoE Switche über die Daten Leitungen die 48V Versorgungsspannung lagern.

 

Das ganze Gerät verbraucht im Mess- Betrieb ~1,2W.

 


 

1.6     GLAB Sensor – LAN / UART Interface Schaltung

5V, PoE, MCU, UART Ports, Konnektivität, Signalisierung und Bedienelemente werden verbunden.


 

1.7     GLAB Sensor – LAN / UART Interface Platine

 

Es wird eine Platine entworfen mit allen notwendigen Komponenten:

·       UART – LAN Modul als Tochterplatine

·       PoE – LAN Modul

·       PoE – LAN Transformer

·       LED Treiber

·       5 V Versorgungsspannung und Sensoren Stecker

·       MB-SM11111 Luftdruck Sensor als Tochterplatine

 


 

Auf der Platine ist die Ethernet Buchse ist nach hinten versetzt damit im engen Gehäuse der RJ45 Stecker Platz findet.

 

 


Das PoE Modul wird zwecks Wärmeableitung verlötet. Das UART – LAN Modul wird aufgesteckt.

 

 


 

Die MB-SM11111 und UART – LAN Modul Tochterplatine zum Austauschen aufgesteckt.

Die Lufteinlässe für die Luftdruck Messung sind im Chip auf der Platine.

 

 


 

1.8     Insekten Abwehr

 

Der Luftdruck wird von der Tochterplatine im inneren des Gehäuses gemessen.

Hierzu ist ein Sinterfilter angebracht um einen Luftdruckausgleich zu ermöglichen.

Dieser dient zugleich als effiziente Insekten- und Staubabwehr.

 

Der CO2 und TH Sensor ist im äußeren des Gehäuses angeschraubt und ebenfalls mit einer Insektenabwehr versehen.

 

 

 


 

1.9     Gehäuse

 

Oben ist der Ethernet RJ45 Anschluss mit einem wasserdichten Harting Cat.6 Industriestecker.

      

 

Im Gehäuse inneren ist genug Platz für die Sensor Anschlüsse die als kurze Kabel unterhalb der Platine Platz finden. Es werden JST Stecker verwendet.

 


 

Ein kurzes Ethernet Kabel verbindet die Platine zum Harting Gehäusestecker.

Das ganze Gerät wird stehend montiert und ist spritzwasserdicht.

 

 


 

1.10 Frontplatte

 

Die Frontplatte ist aus Aluminium natureloxiert 1,5mm stark und mit Digitaldruck (Inkjet Tinte 120°C eingebrannt).

Im Gehäusedeckel ist eine 1,5mm tiefe Einfräsung damit die Frontplatte plan eingeklebt werden kann.

 


 

 


 

Damit das Gehäuse spritzwasserdicht wird werden als LEDs Hohllichtleiter mit einem sehr flüssigen 2 Komponenten Kleber eingeklebt und vor den LEDs dann beim zuschrauben platziert.

Die Senkkopfschrauben auf der Gehäuseunterseite sind mit einer Schraubendichtung spritzwasserfest abgedichtet.

 

     

 

     

 


 

Das Gerät in Betrieb, soll nicht in direktem Luftstrom >1m/s und nicht in direkter Sonneneinstrahlung montiert werden. Die Siebe der Insekten Abwehr können von außen zugänglich gereinigt werden.

 

 


 

1.11 UART – LAN Modul Konfiguration

 

Mit einer Weboberfläche kann das Modul konfiguriert werden.

IP Adresse und TTL Port Konfiguration und weitere können eingestellt werden.

Gemäß dem RMS HCD und RMS CCD sind diese UART Parameter einzustellen:

19200 Bit/s, 8 Data Bits, 1 Stop Bits, Parity no, Flow control no.

 

Das PowerShell Programm welches dann die Daten abgreift verbindet sich an Port 231 / 223 TCP per Modbus Protokoll und an Port 232 per ASCII. Alle Ports können über das LAN parallel und konfliktfrei angesprochen werden. Für den TCP Socket muss der Arbeitsmodus auf Modbus TCP eingestellt werden.

Dadurch wird die Modbus Prüfsummenberechnung vom Sensor bis zum Modul vom Modul selbst vorgenommen. Weiterführend stellt denn TCP eine korrekte Übertragung sicher.

 

 

Mit dem Reset Taster auf der Platine kann das Modul neu gestartet werden.

Mit dem Defaults Taster kann das Modul auf Werkseinstellungen zurückgesetzt werden.

 


 

1.12 Modbus Protokoll

 

Das Modbus Protokoll ist ein Kommunikationsprotokoll, das auf einer Master/Slave Architektur basiert.

Bei der Datenübertragung werden drei verschiedene Betriebsarten unterschieden:

·       Modbus RTU

·       Modbus ASCII

·       Modbus TCP

 

In diesem Sensor wird Modbus TCP verwendet.

Modbus TCP ist RTU sehr ähnlich, allerdings werden TCP/IP-Pakete verwendet, um die Daten zu übermitteln. Der TCP-Port 502 ist für Modbus TCP reserviert.

 

Protokollaufbau

 

 

Dadurch, dass hier keine CRC-Prüfsummenbytes zu berechnen sind, ist die Implementierung eines Treibers für die TCP-Schnittstelle einfacher als für die serielle Schnittstelle, sofern man auf eine vorhandene TCP-Implementierung aufsetzen kann.

 

Die Daten vom CO2 und Temperatur/Feuchtigkeitssensor werden über eine UART Schnittstelle mit dem Modbus Protokoll zum UART – Ethernet Umsetzer übertragen.

Der UART – Ethernet Umsetzer kann die Daten auch als ein Modbus TCP Protokoll über das Ethernet zur Verfügung stellen.

Damit vereinfacht sich die folgende Datenverarbeitung.

Es wird ein PowerShell Modbus Client in einer Funktion erstellt welcher dann die Nutzdaten lesbar in eine die Windows Registry Datenbank schreiben kann.

 


 

1.13 Modbus Frame rotronic Sensoren

 

Für die rotronic Sensoren sind Protokollbeschreibungen vorhanden welche alle notwendigen Parameter beschreiben.

 

 

Der CO2 Sensor bringt eine kleine Besonderheit mit. Die CO2 Werte bei der Modbus Ausgabe stimmen nicht mit den aktuellen tatsächlichen Werten überein, weil ein Multiplikationswert für die Ausgabe existiert. Damit wird die Genauigkeit der Messwerte bei der Konvertierung zwischen Float- und Integer-Werten möglichst hoch. So muss beispielsweise der Dezimale CO2 Wert vom Modbus Register durch 15 dividiert werden um den realen Wert in ppm zu bekommen.

Sensor Range   Division Value

0…2000ppm     15

0…5000ppm     6

0…10000ppm   3


 

1.14 PowerShell Programm Modbus

 

Auf dem Hausautomation Server läuft ein PowerShell Programm welches den TCP Datenstrom per Modbus Protokoll liest und dann die Frames auswertet und die Daten in die Windows Registry zwischenspeichert.

Von dort können dann andere Programme unabhängig und parallel die Daten wieder abgreifen und weiterverwenden.

Es wird Paessler PRTG Network Monitor eingesetzt mit mehreren PowerShell Sensoren zum Zeichnen von Langzeit Grafen und dem darstellen in der PRTG Map als Internet Seite.

 

Das PowerShell Programm (Modbus) als Treiber für die HCD Sensoren und lesen der Messdaten:

 

# Rotronic RMS UART - TCP Reader and Modbus Frame Parser (Windows PowerShell)

# written by Ginther Andreas (GLAB) 2018 http://www.the-ginthers.net/

# Version 2.0.0 (2020.02.01)

 

# Database Instance = GABC1017

# TCP Port          = 231

# Run in 32 bit mode

 

# -----------------------------------

 

# Parametering

Remove-Variable -Name * -ErrorAction SilentlyContinue

$TCPHost = 'gabc1017.glab.dom'

$TCPPort = '231'

$SerialMust = '8000200' # using for data validation

 

# Initializing

$REGDB = 'HKLM:\SOFTWARE\SOFTWARE64\GLAB\GABC1017\'

 

# Initializing Logging

$LOGPATH = "C:\ProgramData\GLAB\GABC1017"

If(!(Test-Path $LOGPATH)) {New-Item -ItemType Directory -Force -Path $LOGPATH}

$LOGDATE = Get-Date -UFormat "%Y%m%d"

$LOG = $LOGPATH + '\' + 'Sensor1_' + $LOGDATE + '.log'

If(!(Test-Path $LOGPATH)) {New-Item -ItemType Directory -Force -Path $LOGPATH}

$LOGAGE = (Get-Date).AddDays(-7)

Get-ChildItem -Path $LOGPATH -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $LOGAGE } | Remove-Item -Force

(Get-Date -UFormat '%Y%m%d %H%M%S ') + 'Initializing Logging' | Add-Content -Path $LOG

 

# Build Modbus Request Data

[byte[]]$TCPSendBuffer=00,110   # Transaction identifier

$TCPSendBuffer+=00,00                # Protocol identifier

$TCPSendBuffer+=00,06                # Length

$TCPSendBuffer+=01                          # Modbus slave address

$TCPSendBuffer+=04                          # Function code (Read Input Registers)

$TCPSendBuffer+=00,00           # Start address

$TCPSendBuffer+=00,03           # Number of coils

 

# Send Modbus Request Data

Write-Host 'Send data request...'

(Get-Date -UFormat '%Y%m%d %H%M%S ') + 'Send data request...' | Add-Content -Path $LOG

$TCPClient = New-Object System.Net.Sockets.TCPClient($TCPHost, $TCPPort)

$TCPNetStream  = $TCPClient.GetStream()

$TCPNetStream.Write($TCPSendBuffer,0,$TCPSendBuffer.Length)

Start-Sleep -Milliseconds 50

 

# Receive Modbus Data

Write-Host 'Read data...'

(Get-Date -UFormat '%Y%m%d %H%M%S ') + 'Read data...' | Add-Content -Path $LOG

[byte[]]$TCPReceiveBuffer = New-Object System.Byte[] (32)

$ReceivedBytes = $TCPNetStream.Read($TCPReceiveBuffer, 0, 32);

$TCPNetStream.Close()

$TCPClient.Close()

Write-Host -ForegroundColor Magenta 'TCP connection closed'

 

# Process Data

IF($ReceivedBytes -ne 0 -and $ReceivedBytes -eq 15)

{

    Write-Host -ForegroundColor Green 'Data received'

    (Get-Date -UFormat '%Y%m%d %H%M%S ') + 'Data received' | Add-Content -Path $LOG

    # Get Data from Array

    $ResultData = $TCPReceiveBuffer[9..16]

 

    # Depending on the data from the specific device you may need to reverse the byte order

    [byte[]] $Bytes1 = $ResultData[1],$ResultData[0]

    [byte[]] $Bytes2 = $ResultData[3],$ResultData[2]

    [byte[]] $Bytes3 = $ResultData[5],$ResultData[4]

   

    # Convert to decimal

    $Decimal1 = [bitconverter]::ToUInt16($Bytes1,0);

    $Decimal2 = [bitconverter]::ToUInt16($Bytes2,0);

    $Decimal3 = [bitconverter]::ToUInt16($Bytes3,0);

    Write-Host -ForegroundColor Cyan 'Modbus Byte 1 (dec) = ' $Decimal1

    Write-Host -ForegroundColor Cyan 'Modbus Byte 2 (dec) = ' $Decimal2

    Write-Host -ForegroundColor Cyan 'Modbus Byte 3 (dec) = ' $Decimal3

 

    # Math

    # Sensor Range   Division Value

    # 0…2000ppm      15

    # 0…5000ppm      6

    # 0…10000ppm     3

    $Math3 = $Decimal3/15

    Write-Host -ForegroundColor Green 'CO2 (ppm) = ' $Math3

    (Get-Date -UFormat '%Y%m%d %H%M%S ') + 'CO2 (ppm) =  ' + $Math3 | Add-Content -Path $LOG

 

    # Calculate serial number

    [byte[]] $BytesSerial = $ResultData[3],$ResultData[2],$ResultData[1],$ResultData[0]

    $Serial = [bitconverter]::ToInt32($BytesSerial,0);

    New-ItemProperty -Path ($REGDB) -Name 'Sensor1-Serial' -PropertyType string -Value $Serial -Force

 

    IF($Serial -eq $SerialMust -or $Decimal3 -eq '')

    {

        Write-Host -ForegroundColor Green 'Data SerialNo ok'

        (Get-Date -UFormat '%Y%m%d %H%M%S ') + 'Data SerialNo ok' | Add-Content -Path $LOG

 

        # Write value to Registry database

        New-ItemProperty -Path ($REGDB) -Name Sensor1-CO2 -PropertyType string -Value $Math3 -Force

 

        # Count good Frames

        $CounterGoodFrames = Get-ItemPropertyValue -Path ($REGDB) -Name 'Sensor1-CounterGoodFrames'

        New-ItemProperty -Path ($REGDB) -Name 'Sensor1-CounterGoodFrames' -PropertyType QWord -Value ($CounterGoodFrames + 1) -Force

        New-ItemProperty -Path ($REGDB) -Name 'Sensor1-CounterGoodFramesTime' -PropertyType String -Value (Get-Date) -Force

    }

    ELSE

    {

        Write-Host -ForegroundColor Red 'Data SerialNo fail'

        (Get-Date -UFormat '%Y%m%d %H%M%S ') + 'Data SerialNo fail' | Add-Content -Path $LOG

        (Get-Date -UFormat '%Y%m%d %H%M%S ') + 'SerialNo Parameter = ' + $SerialMust | Add-Content -Path $LOG

               

        # Write value to Registry database

        New-ItemProperty -Path ($REGDB) -Name Sensor1-SerialFail -PropertyType string -Value $Serial -Force

       

        # Count bad Frames

        $CounterBadFrames = Get-ItemPropertyValue -Path ($REGDB) -Name 'Sensor1-CounterBadFrames'

        New-ItemProperty -Path ($REGDB) -Name 'Sensor1-CounterBadFrames' -PropertyType QWord -Value ($CounterBadFrames + 1) -Force

        New-ItemProperty -Path ($REGDB) -Name 'Sensor1-CounterBadFramesTime' -PropertyType String -Value (Get-Date) -Force

        (Get-Date -UFormat '%Y%m%d %H%M%S ') + 'Data1 = ' + $Decimal1 | Add-Content -Path $LOG

        (Get-Date -UFormat '%Y%m%d %H%M%S ') + 'Data2 = ' + $Decimal2 | Add-Content -Path $LOG

        (Get-Date -UFormat '%Y%m%d %H%M%S ') + 'Data3 = ' + $Decimal3 | Add-Content -Path $LOG

        (Get-Date -UFormat '%Y%m%d %H%M%S ') + 'TCP Receive Buffer' | Add-Content -Path $LOG

        Add-Content -Path $LOG -Value $ResultData

    }

}

ELSE

{

    Write-Host -ForegroundColor Red 'Data not received'

    (Get-Date -UFormat '%Y%m%d %H%M%S ') + 'Data not received' | Add-Content -Path $LOG

 

    # Count no Frames

    $CounterNoFrames = Get-ItemPropertyValue -Path ($REGDB) -Name 'Sensor1-CounterNoFrames'

    New-ItemProperty -Path ($REGDB) -Name 'Sensor1-CounterNoFrames' -PropertyType QWord -Value ($CounterNoFrames + 1) -Force

    New-ItemProperty -Path ($REGDB) -Name 'Sensor1-CounterNoFramesTime' -PropertyType String -Value (Get-Date) -Force

    (Get-Date -UFormat '%Y%m%d %H%M%S ') + 'TCP Receive Buffer' | Add-Content -Path $LOG

    Add-Content -Path $LOG -Value $ResultData

}

 

(Get-Date -UFormat '%Y%m%d %H%M%S ') + '--------------------' | Add-Content -Path $LOG

 

# Get PRTG counter values

$CounterGoodFrames = Get-ItemPropertyValue -Path ($REGDB) -Name 'Sensor1-CounterGoodFrames'

$CounterBadFrames = Get-ItemPropertyValue -Path ($REGDB) -Name 'Sensor1-CounterBadFrames'

$CounterNoFrames = Get-ItemPropertyValue -Path ($REGDB) -Name 'Sensor1-CounterNoFrames'

 

# Write XML for PRTG

[string]$prtgresult=""

$prtgresult+="<?xml version=""1.0"" encoding=""Windows-1252"" ?>`r`n"

$prtgresult+="<prtg>`r`n"

$prtgresult+="    <result>`r`n"

$prtgresult+="        <channel>GoodFrames</channel>`r`n"

$prtgresult+="        <mode>Absolute</mode>`r`n"

$prtgresult+="        <customunit>Frames</customunit>`r`n"

$prtgresult+="        <value>$CounterGoodFrames</value>`r`n"

$prtgresult+="        <float>1</float>`r`n"

$prtgresult+="    </result>`r`n"

$prtgresult+="    <result>`r`n"

$prtgresult+="        <channel>BadFrames</channel>`r`n"

$prtgresult+="        <mode>Absolute</mode>`r`n"

$prtgresult+="        <customunit>Frames</customunit>`r`n"

$prtgresult+="        <value>$CounterBadFrames</value>`r`n"

$prtgresult+="        <float>1</float>`r`n"

$prtgresult+="    </result>`r`n"

$prtgresult+="    <result>`r`n"

$prtgresult+="        <channel>NoFrames</channel>`r`n"

$prtgresult+="        <mode>Absolute</mode>`r`n"

$prtgresult+="        <customunit>Frames</customunit>`r`n"

$prtgresult+="        <value>$CounterNoFrames</value>`r`n"

$prtgresult+="        <float>1</float>`r`n"

$prtgresult+="    </result>`r`n"

$prtgresult+="</prtg>"

 

if ($errorfound) {

       write-host "Error Found. Ending with EXIT Code" ([xml]$prtgresult).prtg.error

}

write-host "Sending PRTGRESULT to STDOUT"

$prtgresult

 

if ($errorfound) {

       exit ([xml]$prtgresult).prtg.error

}

 

 


 

1.15 PowerShell Programm ASCII

 

Auf dem Hausautomation Server läuft ein PowerShell Programm welches den TCP Datenstrom per ASCII liest und dann den Text auswertet und die Daten in die Windows Registry zwischenspeichert.

Von dort können dann andere Programme unabhängig und parallel die Daten wieder abgreifen und weiterverwenden.

Es wird Paessler PRTG Network Monitor eingesetzt mit mehreren PowerShell Sensoren zum Zeichnen von Langzeit Grafen und dem darstellen in der PRTG Map als Internet Seite.

 

Das PowerShell Programm (TCP Socket) als Treiber für den MS5561 und lesen der ASCII Messdaten:

 

# Sure MB-SM11111 - MS5561 UART - TCP Reader and ASCII Frame Parser (Windows PowerShell)

# written by Ginther Andreas (GLAB) 2018 http://www.the-ginthers.net/

# Version 2.0.0 (2020.02.01)

 

# Database Instance = GABC1017

# TCP Port          = 232

# Run in 32 bit mode

 

# -----------------------------------

 

# Initializing

$TCPHost = 'gabc1017.glab.dom'

$TCPPort = '232'

$REGDB = 'HKLM:\SOFTWARE\SOFTWARE64\GLAB\GABC1017\'

 

$ErrorActionPreference = "Continue"

 

# Initializing the TCP port

$TCPIP = [System.Net.Dns]::GetHostAddresses($TCPHost)

$TCPAddress = [System.Net.IPAddress]::Parse($TCPIP)

# Create the TCP endpoint

$TCPConnection = New-Object System.Net.IPEndPoint $TCPAddress, $TCPPort

# Create the TCP Socket

$TCPAddress = [System.Net.Sockets.AddressFamily]::InterNetwork

$TCPSocketType = [System.Net.Sockets.SocketType]::Stream

$TCPProtocolType = [System.Net.Sockets.ProtocolType]::TCP

$TCPSocket = New-Object System.Net.Sockets.Socket $TCPAddress, $TCPSocketType, $TCPProtocolType

$TCPSocket.TTL = 36

$TCPSocket.SendTimeout = 1000

$TCPSocket.ReceiveTimeout = 1000

$TCPSocket.ReceiveBufferSize = 64

# Connect

$TCPSocket.Connect($TCPConnection)

IF($TCPSocket.Connected)

{

    Write-Host -ForegroundColor Green "TCP Socket ok"

}

ELSE

{

    Write-Host -ForegroundColor Red "TCP Socket failed"

}

 

 

# Read data pressure

$getdataloop = 1

Do {

    # Read the sensor

    $TCPBuffer = $null

    $TCPReceive = $null

    $TCPStream = $null

    $TCPValuePre = $null

    $TCPValueSuf = $null

    $TCPValue = $null

    $PortDataByteArraySerial = $null

    $PortDataByteArraySerial = New-Object System.Collections.ArrayList

    Write-Host 'Data reading...'

    [Byte[]]$request = 0x24, 0x73, 0x75, 0x72, 0x65, 0x20, 0x70, 0x0d, 0x0a  # sending '$sure p' to the sensor to get the pressure data

    $TCPSocket.Send($request)

    Start-Sleep -Milliseconds 1000 # it takes a bit time that the device answer with data

    # Read received bytes

    IF($TCPSocket.Available)

    {

        $TCPBuffer = New-Object System.Byte[] 64

        $TCPReceive = $TCPSocket.Receive($TCPBuffer)

        Write-Host 'TCP data received:'

        # Read as string

        $TCPEncoding = New-object -TypeName System.Text.AsciiEncoding

        $TCPStream = $TCPEncoding.GetString($TCPBuffer)

        $TCPBuffer.Clear()

        # validating

        $TCPValuePre = $TCPStream.Substring(0,13)

        $TCPValueSuf = $TCPStream.Substring(19,5)

        Write-Host 'TCP value pre:' $TCPValuePre

        Write-Host 'TCP value suf:' $TCPValueSuf

        IF($TCPValuePre -eq 'Air pressure:' -and $TCPValueSuf -eq ' mbar')

        {

            Write-Host -ForegroundColor Green 'Data validation - ok'

            $TCPValue = $TCPStream.Substring(13,6)

            $getdataloop++

            $getdataloop++

            $getdataloop++

            $getdataloop++

            Write-Host -ForegroundColor Cyan 'Air pressure:' $TCPValue 'mbar'

            # Write value to Registry database

            $TCPValueP = $TCPValue

            New-ItemProperty -Path ($REGDB) -Name Pressure_mbar -PropertyType string -Value $TCPValueP -Force

            # Count good Frames

            $CounterGoodFramesP = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterGoodFramesP'

            New-ItemProperty -Path ($REGDB) -Name 'CounterGoodFramesP' -PropertyType QWord -Value ($CounterGoodFramesP + 1) -Force

 

        }

        ELSE

        {

            Start-Sleep -Milliseconds 1000

            Write-Host 'Data validation - failed'

            $getdataloop++

            # Count bad Frames

            $CounterBadFramesP = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterBadFramesP'

            New-ItemProperty -Path ($REGDB) -Name 'CounterBadFramesP' -PropertyType QWord -Value ($CounterBadFramesP + 1) -Force

            New-ItemProperty -Path ($REGDB) -Name 'LastBadFramesP' -PropertyType String -Value $TCPStream -Force

        }

    }

    ELSE

    {

        Start-Sleep -Milliseconds 1000

        Write-Host 'TCP data not received !'

        $getdataloop++

        # Count no Frames

        $CounterNoFramesP = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterNoFramesP'

        New-ItemProperty -Path ($REGDB) -Name 'CounterNoFramesP' -PropertyType QWord -Value ($CounterNoFramesP + 1) -Force

    }

}

Until ($getdataloop -gt 4)

 

Start-Sleep -Milliseconds 1000

 

 

# Read data sensor temperature

$getdataloop = 1

Do {

    # Read the sensor

    $TCPBuffer.Clear()

    $TCPBuffer = $null

    $TCPReceive = $null

    $TCPStream = $null

    $TCPValuePre = $null

    $TCPValueSuf = $null

    $TCPValue = $null

    $PortDataByteArraySerial = $null

    $PortDataByteArraySerial = New-Object System.Collections.ArrayList

    Write-Host 'Data reading...'

    [Byte[]]$request = 0x24, 0x73, 0x75, 0x72, 0x65, 0x20, 0x74, 0x2d, 0x63, 0x0d, 0x0a  # sending '$sure t-c' to the sensor to get the sensor temperature data

    $TCPSocket.Send($request)

    Start-Sleep -Milliseconds 1000 # it takes a bit time that the device answer with data

    # Read received bytes

    IF($TCPSocket.Available)

    {

        $TCPBuffer = New-Object System.Byte[] 64

        $TCPReceive = $TCPSocket.Receive($TCPBuffer)

        Write-Host 'TCP data received:'

        # Read as string

        $TCPEncoding = New-object -TypeName System.Text.AsciiEncoding

        $TCPStream = $TCPEncoding.GetString($TCPBuffer)

        $TCPBuffer.Clear()

        # validating

        $TCPValuePre = $TCPStream.Substring(0,15)

        $TCPValueSuf = $TCPStream.Substring(22,8)

        Write-Host 'TCP value pre:' $TCPValuePre

        Write-Host 'TCP value suf:' $TCPValueSuf

        IF($TCPValuePre -eq 'Temperature(C):' -and $TCPValueSuf -eq 'Celsiur' -or ' Celsiu')

        {

            Write-Host -ForegroundColor Green 'Data validation - ok'

            $TCPValue = $TCPStream.Substring(15,7).TrimEnd(' ') # with a positive value it needs to trim the space

            $getdataloop++

            $getdataloop++

            $getdataloop++

            $getdataloop++

            Write-Host -ForegroundColor Cyan 'Temperature(C):' $TCPValue 'Celsius'

            # Write value to Registry database

            $TCPValueT = $TCPValue

            New-ItemProperty -Path ($REGDB) -Name Temperature_c -PropertyType string -Value $TCPValueT -Force

            # Count good Frames

            $CounterGoodFramesT = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterGoodFramesT'

            New-ItemProperty -Path ($REGDB) -Name 'CounterGoodFramesT' -PropertyType QWord -Value ($CounterGoodFramesT + 1) -Force

        }

        ELSE

        {

            Start-Sleep -Milliseconds 1000

            Write-Host 'Data validation - failed'

            $getdataloop++

            # Count bad Frames

            $CounterBadFramesT = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterBadFramesT'

            New-ItemProperty -Path ($REGDB) -Name 'CounterBadFramesT' -PropertyType QWord -Value ($CounterBadFramesT + 1) -Force

            New-ItemProperty -Path ($REGDB) -Name 'LastBadFramesT' -PropertyType String -Value $TCPStream -Force

        }

    }

    ELSE

    {

        Start-Sleep -Milliseconds 1000

        Write-Host 'TCP data not received !'

        $getdataloop++

        # Count no Frames

        $CounterNoFramesT = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterNoFramesT'

        New-ItemProperty -Path ($REGDB) -Name 'CounterNoFramesT' -PropertyType QWord -Value ($CounterNoFramesT + 1) -Force

    }

}

Until ($getdataloop -gt 4)

 

Start-Sleep -Milliseconds 1000

 

 

# Read data height

$getdataloop = 1

Do {

    # Read the sensor

    $TCPBuffer.Clear()

    $TCPBuffer = $null

    $TCPReceive = $null

    $TCPStream = $null

    $TCPValuePre = $null

    $TCPValueSuf = $null

    $TCPValue = $null

    $PortDataByteArraySerial = $null

    $PortDataByteArraySerial = New-Object System.Collections.ArrayList

    Write-Host 'Data reading...'

    [Byte[]]$request = 0x24, 0x73, 0x75, 0x72, 0x65, 0x20, 0x68, 0x0d, 0x0a  # sending '$sure h' to the sensor to get the height data

    $TCPSocket.Send($request)

    Start-Sleep -Milliseconds 1000 # it takes a bit time that the device answer with data

    # Read received bytes

    IF($TCPSocket.Available)

    {

        $TCPBuffer = New-Object System.Byte[] 64

        $TCPReceive = $TCPSocket.Receive($TCPBuffer)

        Write-Host 'TCP data received:'

        # Read as string

        $TCPEncoding = New-object -TypeName System.Text.AsciiEncoding

        $TCPStream = $TCPEncoding.GetString($TCPBuffer)

        $TCPBuffer.Clear()

        # validating

        $TCPValuePre = $TCPStream.Substring(0,7)

        $TCPValueSuf = $TCPStream.Substring(12,7)

        Write-Host 'TCP value pre:' $TCPValuePre

        Write-Host 'TCP value suf:' $TCPValueSuf

        IF($TCPValuePre -eq 'Height:' -and $TCPValueSuf -eq ' meters')

        {

            Write-Host -ForegroundColor Green 'Data validation - ok'

            $TCPValue = $TCPStream.Substring(7,5)

            $getdataloop++

            $getdataloop++

            $getdataloop++

            $getdataloop++

            Write-Host -ForegroundColor Cyan 'Height:' $TCPValue 'Meters'

            # Write value to Registry database

            $TCPValueH = $TCPValue

            New-ItemProperty -Path ($REGDB) -Name Height_m -PropertyType string -Value $TCPValueH -Force

            # Count good Frames

            $CounterGoodFramesH = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterGoodFramesH'

            New-ItemProperty -Path ($REGDB) -Name 'CounterGoodFramesH' -PropertyType QWord -Value ($CounterGoodFramesH + 1) -Force

        }

        ELSE

        {

            Start-Sleep -Milliseconds 1000

            Write-Host 'Data validation - failed'

            $getdataloop++

            # Count bad Frames

            $CounterBadFramesH = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterBadFramesH'

            New-ItemProperty -Path ($REGDB) -Name 'CounterBadFramesH' -PropertyType QWord -Value ($CounterBadFramesH + 1) -Force

            New-ItemProperty -Path ($REGDB) -Name 'LastBadFramesH' -PropertyType String -Value $TCPStream -Force

 

        }

    }

    ELSE

    {

        Start-Sleep -Milliseconds 1000

        Write-Host 'TCP data not received !'

        $getdataloop++

        # Count no Frames

        $CounterNoFramesH = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterNoFramesH'

        New-ItemProperty -Path ($REGDB) -Name 'CounterNoFramesH' -PropertyType QWord -Value ($CounterNoFramesH + 1) -Force

    }

}

Until ($getdataloop -gt 4)

 

 

# Close the TCP connection

$TCPSocket.Disconnect($TCPConnection)

$TCPSocket.Close()

$TCPSocket.Dispose()

Write-Host -ForegroundColor Magenta "TCP Socket closed"

 

 

# Program Counters

$CounterGoodFramesP = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterGoodFramesP'

$CounterGoodFramesT = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterGoodFramesT'

$CounterGoodFramesH = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterGoodFramesH'

$CounterBadFramesP = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterBadFramesP'

$CounterBadFramesT = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterBadFramesT'

$CounterBadFramesH = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterBadFramesH'

$CounterNoFramesP = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterNoFramesP'

$CounterNoFramesT = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterNoFramesT'

$CounterNoFramesH = Get-ItemPropertyValue -Path ($REGDB) -Name 'CounterNoFramesH'

 

 

# Write XML for PRTG

[string]$prtgresult=""

$prtgresult+="<?xml version=""1.0"" encoding=""Windows-1252"" ?>`r`n"

$prtgresult+="<prtg>`r`n"

$prtgresult+="    <result>`r`n"

$prtgresult+="        <channel>GoodFramesP</channel>`r`n"

$prtgresult+="        <mode>Absolute</mode>`r`n"

$prtgresult+="        <customunit>Frames</customunit>`r`n"

$prtgresult+="        <value>$CounterGoodFramesP</value>`r`n"

$prtgresult+="        <float>1</float>`r`n"

$prtgresult+="    </result>`r`n"

$prtgresult+="    <result>`r`n"

$prtgresult+="        <channel>GoodFramesT</channel>`r`n"

$prtgresult+="        <mode>Absolute</mode>`r`n"

$prtgresult+="        <customunit>Frames</customunit>`r`n"

$prtgresult+="        <value>$CounterGoodFramesT</value>`r`n"

$prtgresult+="        <float>1</float>`r`n"

$prtgresult+="    </result>`r`n"

$prtgresult+="    <result>`r`n"

$prtgresult+="        <channel>GoodFramesH</channel>`r`n"

$prtgresult+="        <mode>Absolute</mode>`r`n"

$prtgresult+="        <customunit>Frames</customunit>`r`n"

$prtgresult+="        <value>$CounterGoodFramesH</value>`r`n"

$prtgresult+="        <float>1</float>`r`n"

$prtgresult+="    </result>`r`n"

$prtgresult+="    <result>`r`n"

$prtgresult+="        <channel>BadFramesP</channel>`r`n"

$prtgresult+="        <mode>Absolute</mode>`r`n"

$prtgresult+="        <customunit>Frames</customunit>`r`n"

$prtgresult+="        <value>$CounterBadFramesP</value>`r`n"

$prtgresult+="        <float>1</float>`r`n"

$prtgresult+="    </result>`r`n"

$prtgresult+="    <result>`r`n"

$prtgresult+="        <channel>BadFramesT</channel>`r`n"

$prtgresult+="        <mode>Absolute</mode>`r`n"

$prtgresult+="        <customunit>Frames</customunit>`r`n"

$prtgresult+="        <value>$CounterBadFramesT</value>`r`n"

$prtgresult+="        <float>1</float>`r`n"

$prtgresult+="    </result>`r`n"

$prtgresult+="    <result>`r`n"

$prtgresult+="        <channel>BadFramesH</channel>`r`n"

$prtgresult+="        <mode>Absolute</mode>`r`n"

$prtgresult+="        <customunit>Frames</customunit>`r`n"

$prtgresult+="        <value>$CounterBadFramesH</value>`r`n"

$prtgresult+="        <float>1</float>`r`n"

$prtgresult+="    </result>`r`n"

$prtgresult+="    <result>`r`n"

$prtgresult+="        <channel>NoFramesP</channel>`r`n"

$prtgresult+="        <mode>Absolute</mode>`r`n"

$prtgresult+="        <customunit>Frames</customunit>`r`n"

$prtgresult+="        <value>$CounterNoFramesP</value>`r`n"

$prtgresult+="        <float>1</float>`r`n"

$prtgresult+="    </result>`r`n"

$prtgresult+="    <result>`r`n"

$prtgresult+="        <channel>NoFramesT</channel>`r`n"

$prtgresult+="        <mode>Absolute</mode>`r`n"

$prtgresult+="        <customunit>Frames</customunit>`r`n"

$prtgresult+="        <value>$CounterNoFramesT</value>`r`n"

$prtgresult+="        <float>1</float>`r`n"

$prtgresult+="    </result>`r`n"

$prtgresult+="    <result>`r`n"

$prtgresult+="        <channel>NoFramesH</channel>`r`n"

$prtgresult+="        <mode>Absolute</mode>`r`n"

$prtgresult+="        <customunit>Frames</customunit>`r`n"

$prtgresult+="        <value>$CounterNoFramesH</value>`r`n"

$prtgresult+="        <float>1</float>`r`n"

$prtgresult+="    </result>`r`n"

$prtgresult+="</prtg>"

 

if ($errorfound) {

       write-host "Error Found. Ending with EXIT Code" ([xml]$prtgresult).prtg.error

}

write-host "Sending PRTGRESULT to STDOUT"

$prtgresult

 

if ($errorfound) {

       exit ([xml]$prtgresult).prtg.error

}

 

 

1.16 PowerShell Programm PRTG

 

Das PowerShell Program zum Lesen der Cache Daten und übergeben an PRTG:

 

# Registry Cache Reader and PRTG XML Interface (Windows PowerShell)

# written by Ginther Andreas (GLAB) 2020 http://www.the-ginthers.net/

# Version 1.0.0 (2020.02.16)

 

# Database Instance = GABC1017

# Run in 32 bit mode

 

# -----------------------------------

 

# Initializing

$REGDB = 'HKLM:\SOFTWARE\SOFTWARE64\GLAB\GABC1017\'

 

 

# Get Current Value

$Value = (Get-ItemPropertyValue -Path ($REGDB) -Name ("Sensor1-CO2"))

 

 

# Write PRTG XML

[string]$prtgresult=""

$prtgresult+="<?xml version=""1.0"" encoding=""Windows-1252"" ?>`r`n"

$prtgresult+="<prtg>`r`n"

$prtgresult+="    <result>`r`n"

$prtgresult+="        <channel>CO2</channel>`r`n"

$prtgresult+="        <mode>Absolute</mode>`r`n"

$prtgresult+="        <customunit>ppm</customunit>`r`n"

$prtgresult+="        <value>"+$Value+"</value>`r`n"

$prtgresult+="        <float>1</float>`r`n"

$prtgresult+='        <current value="'+$Value+'"/>' + "`r`n"

$prtgresult+="    </result>`r`n"

$prtgresult+="</prtg>"

 

if ($errorfound) {

       write-host "Error Found. Ending with EXIT Code" ([xml]$prtgresult).prtg.error

}

write-host "Sending PRTGRESULT to STDOUT"

$prtgresult

 

if ($errorfound) {

       exit ([xml]$prtgresult).prtg.error

}

 

 


 

Registry Datenbank

 

Als einfachste Datenbank wird die Windows Registry hergenommen.

Diese ist völlig ausreichend um nur temporär die Messdaten abzulegen.

 

Hier sind dann schon vom PowerShell Programm in aufbereiteter Form die einzelnen Werte vom Modbus und ASCII Frame herausgelöst.

Die Frames selbst werden auch zu Debugging Zwecken immer aktuell mit abgelegt.

Auch wie viele Frames empfangen wurden und wie viele fehlerhaft waren wird mit aufgezeichnet.

·       CounterBadFrames

·       CounterGoodFrames

·       CounterNoFrames

 

 


 

1.17 PRTG Sensoren

 

Weitere einzelne PowerShell Sensoren werden von Paessler PRTG verwendet um die Grafen zu zeichnen.

Es wird alle 30 Sekunden aufgezeichnet.

 

 

 

Der Sensor liefert folgende Daten

 

·       Ping und TCP Ports

·       PowerShell Programm Zähler gute und schlechte Frames

·       Temperatur des Sensor Gehäuseinneren

·       Außen Luftdruck in mbar

·       Außen Temperatur in °C

·       Außen Feuchtigkeit in %rH

·       Außen CO2 in ppm

 

 


 

1.18 PRTG Grafen

 

Es lassen sich nun im 30sec. Intervall Grafen des Feinstaubsensors aufzeichnen.

Sämtliche Werte mit Stunden, Tage, Monat und Jahres Grafen.

 

CO2 Werte:

 

 


 

Luftdruck Werte:

 

 


 

1.19 PRTG Map

 

Mit einer PRTG Map werden die Daten dann grafisch aufbereitet und könnten als Internet Seite verschiedensten Endgeräten und Browsern angezeigt werden.

 

In der PRTG Map werden auch andere Umwelt Einflüsse mit derselben Zeitachse mit dargestellt um Abhängigkeiten zu erkennen und Schüsse ziehen zu können.

 

Beispielsweise sieht man eine deutliche Abhängigkeit der Feinstaubwerte zu Windgeschwindigkeit und stehender Luft.

 

Beispielsweise wird festgestellt, dass der CO2 Wert eine Gemeinsamkeit mit der Luftfeuchtigkeit hat.

 

Die Feinstaubwert Spitzen entstehen während Hausbrand aktiv ist.

 

 


 

1.20 HomeMatic und Pocket Control Integration

 

Die Daten aus der Registry Cache Datenbank können nun einfach hergenommen werden und in die HomeMatic Hausautomation übertragen werden. Damit können die Werte dann auch dort angezeigt werden und weitere Programverknüpfungen und Schaltaktionen hergestellt werden.

 

Es wird dazu ein PowerShell Skript im Minuten Takt laufen gelassen als Windows Task der die Werte in eine CCU Systemvariable schreibt.

 

 

Das PowerShell Program:

 

# CO2 - CCU3 Connector (Windows PowerShell)

# query CO2, Pressure, Temperature, Humidity Cache Values and set CCU3 System Variables

# written by Ginther Andreas (GLAB) 2018 http://www.the-ginthers.net/

# Version 1.0.0 (2020.03.07)

 

# Run in 64 bit mode

 

# -----------------------------------

 

# Initializing

$REGDB = 'HKLM:\SOFTWARE\GLAB\GABC1017\'

$HomematicHost = "gabc1001.glab.dom"

$HomeMaticClient = New-Object System.Net.WebClient

 

# Get Current Value

$CO2 = (Get-ItemPropertyValue -Path ($REGDB) -Name ("Sensor1-CO2"))

$Pressure = (Get-ItemPropertyValue -Path ($REGDB) -Name ("Pressure_mbar"))

$Temperature = (Get-ItemPropertyValue -Path ($REGDB) -Name ("Sensor3-Temperature"))

$Humidity = (Get-ItemPropertyValue -Path ($REGDB) -Name ("Sensor3-Humidity"))

 

$CO2Round = [math]::Round($CO2,0)

$PressureRound = [math]::Round($Pressure,0)

$TemperatureRound = [math]::Round($Temperature,1)

$HumidityRound = [math]::Round($Humidity,0)

 

# Set BidCos Values

$HomeMaticClient.DownloadString("http://" + $HomematicHost + "/config/xmlapi/statechange.cgi?ise_id=65481&new_value="+$CO2Round)

$HomeMaticClient.DownloadString("http://" + $HomematicHost + "/config/xmlapi/statechange.cgi?ise_id=65482&new_value="+$PressureRound)

$HomeMaticClient.DownloadString("http://" + $HomematicHost + "/config/xmlapi/statechange.cgi?ise_id=65484&new_value="+$TemperatureRound)

$HomeMaticClient.DownloadString("http://" + $HomematicHost + "/config/xmlapi/statechange.cgi?ise_id=65483&new_value="+$HumidityRound)

 

 

 

Die HomeMatic Systemvariable kann dann mit einem GET Request geschrieben werden.

("http://" + $HomematicHost + "/config/xmlapi/statechange.cgi?ise_id=65481&new_value="+$CO2Round)

 

 


 

Letztlich können die Sensor Werte dann in der Pocket Control App angezeigt werden.

 

 


 

1.21 Anbringung im Außenbereich

 

Ein Gerät ist in Österreich auf dem Land installiert.

Hier sind aufgrund der Gebirgslandschaft ständig ändernde Windverhältnisse vorhanden.

 

Bei der Installation ist auf folgendes geachtet:

 

·       Keine Gefährdung durch Blitzeinschlag

·       Keiner Aussetzung von Regen

·       Nicht im direkten Wind installiert

·       Abstand von der Hausfassade wegen aufsteigender Wärmeluft

·       Von direkter Sonneneinstrahlung geschützt

·       Diebstahl- und Manipulationssicher

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

GLAB Logo