Loxone - Teil 4 - FHEM-Kommunikation

Mit ** gekennzeichnete Links auf dieser Seite sind Affiliatelinks.

Loxone - Teil 4 - FHEM-Kommunikation
Loxone - Teil 4 - FHEM-Kommunikation
  • Matthias Kleine
  • 09.12.2018
  • Hardware
  • Integration

Loxone ist zwar sehr umfangreich, aber natürlich längst nicht so flexibel wie beispielsweise FHEM. So gut wie jeden Gerätetyp, jedes Protokoll und jeden Hersteller bekommt man in FHEM ans laufen. Es wäre doch schade, wenn man diese Welt nicht beachten würde, oder? In diesem Beitrag erkläre ich Dir also, wie Du auf möglichst intelligente Art und Weise deine FHEM-Installation mit Loxone verheiraten kannst. Dabei möchte hunderte Zeilen Code vermeiden - alles soll möglichst einfach zu verstehen und zu warten sein. Es gibt Beiträge zu diesem Thema, in welchen zig Funktionen und Notify angelegt werden müssen. All das ist aber nicht notwendig. Aber schau selbst.

Was Du brauchst?

  • Ein Loxone-System
  • Eine FHEM-Installation

Video

Lox-Kurs

Befehle

Änderungen in Loxone empfangen

99_myLoxoneUtils.pm

##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;
use IO::Socket::INET;

sub myLoxoneUtils_Initialize($$) {
  my ($hash) = @_;
}

# Enter you functions below _this_ line.

sub sendUdpMsg($$$) {
	my ($dest, $port, $cmd) = @_;

	my $socket = IO::Socket::INET->new(
		Proto => 'udp',
		PeerPort => $port,
		PeerAddr => $dest
	) or return 0;

	$socket->send($cmd) or return 0;

	return 1;
}

1;

Dann folgt das globale Notify, welches alle Informationen automatisch zu Loxone schickt. Bitte achte darauf, die IP und auch den Port entsprechend anzupassen.

defmod n_publish_loxone notify .*:.* {}
.*:.* {
	if (AttrVal($NAME, 'loxone', 'nein') eq 'ja') {
		my $reading = "";
		my $message = "";

		if ($EVENT =~ qr/(.*?): (.*)/p) {
			$reading = $1;
			$message = $2;
		} else {
			$reading = "state";
			$message = $EVENT;
		}

		sendUdpMsg('192.168.44.10', 7500, "$NAME ($reading): $message");
	}
}

Damit das funktioniert, muss auf jedem Gerät, für welches Du Dich in Loxone interessierst, ein Attribut angelegt werden. So können wir auf ganz einfache Art und Weise neue Geräte in Loxone bekannt machen. Und zwar ohne etwas neues zu programmieren oder neue Funktionen einfügen zu müssen.

Das Attribut wird dafür im Global-Device hinterlegt. So wird es auf jedem Gerät im Dropdown verfügbar.

Bitte das Attribut per Hand ans Ende schreiben und nicht direkt den Befehl ausführen, ansonsten ersetzt es alle bisherigen user-Attribute!

attr global userattr loxone:ja,nein

Danach kann in Loxone mit dem Virtuellen Eingang (UDP) auf dem gleichen Port (hier 7500) auf eingehende Nachrichten gewartet werden. Um das Ganze zu testen, muss natürlich eine Änderung ausgelöst werden. Wenn Du so lange nicht warten möchtest, kannst Du per Hand mit setreading auch einfach einen neuen Wert setzen.

Ich empfehle, die Events für alle Geräte so weit wie möglich einzuschränken. Das entlastet in diesem Fall nicht nur Loxone, sondern minimiert auch die Anzahl der Events FHEM (siehe event-on-change-reading, event-on-update-reading).

Auf diesem Weg können nur Zahlenwerte übermittelt werden - möchtest Du Werte wie “offen” oder “geschlossen” übermitteln, würde ich dafür in FHEM ein userReading anlegen, welches “offen” in 1 und “geschlossen” in 0 umwandelt (usw.)

Befehle zu FHEM senden

Um Informationen von Loxone zu FHEM zu senden, müssen aktuell zwei Dinge vorausgesetzt werden:

  • Das CSRF-Token muss auf none gesetzt werden
  • FHEM darf nicht über HTTPS / SSL / TLS angesteuert werden

Sind diese beiden Vorraussetzen erfüllt, können ganz einfach mit virtuellen HTTP Ausgangsfehlen die Kommandos übermittelt werden. Als Adresse wird dabei einfach die IP und der Port in Loxone hinterlegt (OHNE Slash am Ende). Beispiele:

  • http://192.168.44.11:8083
  • http://benutzer:passwort@192.168.44.11:8083

Die Einzelnen Befehle bei EIN und AUS werden wie folgt definiert:

  • /fhem?cmd=set%20BU_Deckenlicht%20on&XHR=1
  • /fhem?cmd=set%20BU_Deckenlicht%20off&XHR=1

Es ist darauf zu achten, dass die Leerzeichen durch %20 ersetzt werden müssen. Außerdem sollte &XHR=1 als weiterer GET-Parameter mit übergeben werden, damit FHEM keine HTML-Antwort zusammenbauen muss (diese interessiert Loxone eh nicht).

Du willst mehr?

Smart-Home-Trainings von A-Z

Steig noch tiefer in die Themen ein und meistere Deine Projekte! Über 13.000 Teilnehmer konnten sich schon von der Qualität der Online-Kurse überzeugen.

ioBroker-Master-Kurs

ioBroker-Master-Kurs

Mehr Infos
Hausbau-Kurs

Hausbau mit KNX

Mehr Infos
Lox-Kurs

Lox-Kurs

Mehr Infos
Node-RED-Master-Kurs

Node-RED-Master-Kurs

Mehr Infos