Loxone Webservices und PowerShell

Windows PowerShell im Smart Home? Die Kombination Loxone Webservices und PowerShell ist vielleicht etwas ungewöhnlich, wer aber mit der PowerShell den Loxone Miniserver ansteuern möchte, findet hier ein paar Beispiele und ein dazu passendes Skript.

Loxone Webservices

Bevor es mit dem Skript losgeht, wollte ich kurz die drei Beispiele erklären.

Beispiel 1 (Invoke Web Request – Write Digital)

Hier wird auf den Baustein Taster mit dem Namen push-button ein Tastimpuls durch pulse (Tr) gesendet. Es wäre auch ein on (O) oder off (R) zum ein und ausschalten möglich. Weitere Varianten sind in der Loxone Hilfe für Webservices erklärt.

http://192.168.1.123/dev/sps/io/push-button/pulse

Nach der erfolgreichen Authentifizierung erhält man folgende Antwort im XML Format.

<?xml version="1.0" encoding="UTF-8"?>
<LL Code="200" value="1" control="dev/sps/io/VI2"/>

Beispiel 2 (Invoke Web Request 2 – Read Digital)

Kurz und einfach, der Zustand (ON oder OFF) vom Taster aus Beispiel 1 wird wieder ausgelesen.

http://192.168.1.123/dev/sps/io/push-button/all

Bei einem Baustein muss zusätzlich /all angegeben werden, damit “Value” auch mit dem aktuellen Zustand gefüllt wird. Bei einem virtuellen digitalen Eingang wird z. B. das /all nicht benötigt.

<?xml version="1.0" encoding="UTF-8"?>
<LL Code="200" value="1" control="dev/sps/io/push-button/all">
  <output value="1" nr="1" name="Q"/>
  <SpecialState value="0.000" nr="1" uuid="0ee808f9-0355-577c-ffff82ce834b2918"/>
  <SpecialState value="0.000" nr="2" uuid="0ee808f9-0355-577d-ffff82ce834b2918"/>
</LL>

Beispiel (Invoke Web Request 3 – Read Analog)

Hier wird der analoge Sensor AWI8 (1-Wire Temperaturfühler) abgefragt.

http://192.168.1.123/dev/sps/io/AWI8

Der Wert wird im Powershell Skript so aufbereitet, dass er später als Zahl in Formeln etc. verwendet werden kann.

<?xml version="1.0" encoding="UTF-8"?>
<LL Code="200" value="21.4°C" control="dev/sps/io/AWI8"/>

Der Code entspricht dem Status für den abgesetzten Befehl. Code 200 bedeutet OK, Code 404 erscheint wenn der Sensor/Baustein nicht gefunden wurde.

Verwendungszweck

  • Man kann die Druckjobs in der Druckerwarteschlange überwachen und bei vorhandenen Druckjobs die geschaltete Steckdose vom Drucker einschalten.
  • Wenn die am Server / Computer angeschlossene USV z. B. einen Stromausfall meldet, kann diese Information an den Loxone Miniserver weitergeben werden. Zu dem Thema USV und Powershell ist noch ein Beitrag geplant.
  • Aus dem Loxone Miniserver können Daten ausgelesen und diese in eine MSSQL Datenbank geschrieben werden. Wobei ich diese Kombination im privaten Umfeld als eher unwahrscheinlich sehe.

Es gibt sicherlich noch viel mehr Ideen. Schreibt gerne eure Idee als Kommentar!

Skript

Es müssen mindestens die Variablen ComputerName, Username und je nachdem wie das Skript eingesetzt werden soll, noch VIDigital sowie VIAnalog an die Umgebung angepasst werden. Die Anmeldedaten werden in den Bereichen “Create Password File” und “Create Credential Object” verarbeitet. Das Passwort wird beim ersten Start des Skripts abgefragt und in einer Datei abgespeichert. Das Kennwort ist an den User gebunden und kann nicht auf anderen Systemen verwendet werden.

############################################################
# LOXONE
#
# Author: Stefan Nikolaus
# Source: www.nikolaus-lueneburg.de

############################################################
# Variables

$ComputerName = "192.168.1.123" # Loxone IP Adresse
$Username = "LoxUser" # Loxone User

$PasswordFolder = "C:\temp\"
$Extension = ".sec"

$VIDigital = "push-button"
$VIAnalog = "AWI8"

############################################################
# Create Password File

$PasswordFilename = $ComputerName + $Extension
$FullPath = Join-Path $PasswordFolder $PasswordFilename

if (Test-Path $FullPath)
{
    Write-Host "Password file exist" -ForegroundColor Green
}
else
{
    Try
    {
        Read-Host -assecurestring | ConvertFrom-SecureString | Out-File (Join-Path $PasswordFolder $PasswordFilename)
    }
    Catch
    {
      Write-Host $_.Exception.Message
      break
    }
    Write-Host "Writing password file to" $FullPath -ForegroundColor Green
}

############################################################
# Create Credential Object

# Load Password File
$Password = cat $FullPath | ConvertTo-SecureString

# Create Credential Object
Write-Host "Creating credential object" -ForegroundColor Green
$Credential = New-Object -typename System.Management.Automation.PSCredential -ArgumentList $Username, $Password

############################################################
# Global Variables

$LoxoneURL = "http://" + $ComputerName + "/dev/sps/io/"

############################################################
# Invoke Web Request 1 - Write Digital

$URL1 = $LoxoneURL + $VIDigital + "/pulse"

Write-Host "Invoke Web Request (Write)" -ForegroundColor Green
Try
{
    $WebRequest1 = Invoke-WebRequest -URI $URL1 -Credential $Credential -ErrorAction Stop #-Verbose
}
Catch
{
  Write-Host $_.Exception.Message
  break
}

$xmlContent1 = $WebRequest1.Content

Write-Host "Status " -NoNewline
if ($xmlContent.LL.Code -eq 200)
{
    Write-Host "OK" -BackgroundColor DarkGreen
}
else
{
    Write-Host "Failed" -BackgroundColor Red
}

Start-Sleep 1

############################################################
# Invoke Web Request 2 - Read Digital

$URL2 = $LoxoneURL + $VIDigital + "/all"

Write-Host "Invoke Web Request (Read Digital)" -ForegroundColor Green
Try
{
    $WebRequest2 = Invoke-WebRequest -URI $URL2 -Credential $Credential -ErrorAction Stop #-Verbose
}
Catch
{
  Write-Host $_.Exception.Message
  break
}

$xmlContent = $WebRequest2.Content

Write-Host "Light is " -NoNewline

if ($xmlContent.LL.value -eq "1")
{
    Write-Host "ON" -BackgroundColor DarkGreen
}
else
{
    Write-Host "OFF" -BackgroundColor Red
}

############################################################
# Invoke Web Request 3 - Read Analog

$URL3 = $LoxoneURL + $VIAnalog

Write-Host "Invoke Web Request (Read Digital)" -ForegroundColor Green
Try
{
    $WebRequest3 = Invoke-WebRequest -URI $URL3 -Credential $Credential -ErrorAction Stop #-Verbose
}
Catch
{
  Write-Host $_.Exception.Message
  break
}

$xmlContent = $WebRequest3.Content
[float]$tempvalue = $xmlContent.LL.value -replace "([^\d.])"
Write-Host "Sensorvalue " -NoNewline

Write-Host $tempvalue -BackgroundColor DarkGreen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert