Loxone - Teil 4 - FHEM-Kommunikation

Mit ** gekennzeichne Links auf dieser Seite sind Affiliatelinks.

Loxone ist zwar sehr umfangreich, aber natürlich länst 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

FHEM-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).


Newsletter

Trage Dich jetzt in den Newsletter ein und genieße dadurch viele Vorteile:

  • 5€-Gutschein als Dankeschön
  • Zugang zu exklusiven Inhalten
  • Angebote für Produkte

* Durch Angabe meiner E-Mail-Adresse erkläre ich mich damit einverstanden, dass mir regelmäßig Informationen und Produktempfehlungen aus dem Fachgebiet Smart Home zugesendet werden. Mit dem Eintrag akzeptieren Sie unsere Datenschutzbestimmungen. Meine Einwilligung kann ich jederzeit widerrufen.

Matthias Kleine

Matthias Kleine

Großer Fan und Anhänger von OpenSource-Projekten und erweiterbaren Haus-Automatisierungskomponenten. Je offener und flexibler das System, desto besser. Ich lege mich nicht auf einzelne Protokolle oder Standards fest, sondern probiere aus allen Welten das Beste zu verheiraten. Unterwegs als Softwareentwickler, Trainer und Blogger im Bereich Smart Home.

Auf YouTube und hier im Blog gibt es bereits unzählige kostenlose Videos, Informationen und Tutorials. Wenn Dir das noch nicht reicht, ist ein Training genau das richtige für Dich! Die folgenden Trainings haben den Vorteil, dass immer von Anfang an gestartet wird und Du ohne Vorwissen teilnehmen kannst.