LogoControl und FHEM

Bei meinen Experimenten zum Thema „Funksteckdosen an der LOGO“ bin ich darauf aufmerksam geworden, dass die Steuerung von HomeMatic-Komponenten auch über einen FHEM-Server möglich ist. Dieser läuft beispielsweise auch problemlos auf einem Raspberry Pi, den ich ja bereits im Einsatz habe. Als zusätzliche Hardware zur Ansteuerung von HomeMatic-Komponenten benötigt man dann noch einen LAN-Konfigurationsadapter oder einen CUL-Stick für USB. Ersteren hatte ich ebenfalls bereits zu Hause und finde diesen aufgrund der Netzwerkschnittstelle auch die bessere Wahl, da dieser nicht direkt neben dem FHEM-Server (bei mir ist der Pi im 19″-Metall-Käfig im Keller untergebracht) platziert werden muss, sondern nach optimalem Empfang ausgerichtet werden kann z.B. im Flur im Erdgeschoss (vorausgesetzt man hat dort eine LAN-Dose). Bei mir habe ich damit vom Keller bis zum Spitzboden und sogar im Garten Empfang.

Die Einrichtung von FHEM (ob auf Pi oder anderer Plattform) will ich hier nicht weiter erklären, das haben andere schon zur Genüge getan (Google ist dein Freund). Auch sollte die hier gezeigte Lösung unabhängig von HomeMatic sein und prinzipiell mit jedem mit FHEM kompatiblen Protokoll funktionieren. Aus diesem Grund beschreibe ich hier lediglich die Änderungen, welche vorzunehmen sind, wenn man bereits einen funktionierenden(!) FHEM-Server hat und diesen mit der LOGO koppeln möchte. Mit „koppeln“ meine ich hier übrigens ausdrücklich nicht, dass alle LOGO Ein-/Ausgänge an FHEM übermittelt werden und die Automatisierungslogik nun komplett mit FHEM abgebildet wird. Damit wäre die LOGO ja nur noch eine sehr teure per Ethernet steuerbare Relais-Karte, wofür sie nicht gedacht ist. Für die grundsätzliche Automatisierung möchte ich weiter die LOGO verwenden und nur da wo es technisch nur schwer bzw. nicht möglich ist durch FHEM ergänzen (in meinem Fall Funksteckdosen, Fenster-Drehgriffkontakte…).

Vorbereitung

FHEM-Server

In FHEM die Datei 99_logoUtils.pm anlegen mit folgendem Inhalt:

package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
 my ($hash) = @_;
}

##########################################################
# LogoControl Notify Handler
#
sub SetLogoControlState($)
{
 my ($obj) = @_;
 my $comment = AttrVal($obj,"comment","");

 if ($comment =~ /LogoStateAddress=(\d+)\.(\d)/ ){
  my $url = "http://localhost:8088/rest/bytes/$1/bits/$2";

  if (Value($obj) eq "on" || Value($obj) eq "open"){
   GetFileFromURL($url."?set=1" );
  }
  elsif (Value($obj) eq "off" || Value($obj) eq "closed"){
   GetFileFromURL($url."?set=0" );
  } 
 }
 return,
}
1;

Ich gehe davon aus, dass euer FHEM-Server auf dem gleichen Rechner läuft wie LogoControl (ist wegen der Latenzzeiten auch zu empfehlen). Falls dies nicht der Fall ist müsst ihr „localhost“ in der URL durch den Hostnamen ersetzen auf dem LogoControl zu erreichen ist.

Anschließend in der fhem.cfg folgenden Eintrag hinzufügen:

define logoControlNotifier notify HM_.* {SetLogoControlState("@")}

Damit habt ihr einen Notify eingerichtet, der auf die Events aller Geräte reagiert die mit „HM_“ beginnen (bei mir beginnen alle HomeMatic-Geräte mit HM_, wenn die Geräte bei euch anders heißen bitte anpassen). Keine Angst: der Notify tut erst mal nichts, sondern wird erst aktiv wenn im „comment“ Attribut eines FHEM-Geräts ein bestimmter Befehl eingetragen wurde(mehr dazu später).

LOGO Schaltprogramm

Ladet euch den UDF-Block » Fhem-Out herunter und installiert ihn in eurem UDF-Library Verzeichnis von LOGO!Soft. Anschließend wird es Zeit sich Gedanken um die VM Speicherbelegung eurer LOGO Gedanken zu machen. Wir brauchen nämlich in der LOGO einige Bytes in denen FHEM den Zustand seine Geräte schreiben kann. Bitte lest dazu auch diesen Artikel. Ich habe für Zustände von FHEM-Geräten den 0xx Speicherbereich gewählt (1xx war ja für LOGO 1, 2xx für LOGO 2 usw.). Das erste FHEM-Gerät legt bei mir also seinen Status in Byte 0 und Bit 0 (Adresse 0.0) auf der Server-LOGO ab. Wenn diese Information nun auch auf den anderen (Client-)LOGOs verfügbar sein soll, müssen noch Lese-Befehle in den Etherneteinstellungen auf diesen LOGOs konfiguriert werden. Ich habe bei mir dazu entsprechende Lese-Anweisungen in die Ethernet-Konfiguration der 3 anderen LOGOs eingefügt, welche pauschal die Bytes 000-004 auf jeder LOGO verfügbar macht. So habe ich auch hier wieder ein einheitliches Schema und auf jeder LOGO das erste FHEM-Gerät unter der Adresse 0.0 zur Verfügung. Wie ein einzelnes FHEM-Gerät dann in das LOGO-Schaltprogramm integriert wird, erfahrt ihr im nächsten Kapitel.

FHEM-Gerät mit LOGO koppeln

Die folgenden Schritte müssen für jedes FHEM-Gerät, das mit der LOGO gekoppelt werden soll einmal durchgeführt werden. Es sind dazu Änderungen am LOGO-Schaltprogramm, an der LogoControl-Konfiguration und am FHEM-Gerät selbst nötig.

FHEM-Gerät konfigurieren

Diese Teil ist nur notwendig, wenn das FHEM-Gerät bei Statusänderungen seinen aktuellen Zustand an die LOGO melden soll (z.B. Sensor oder evtl. Funksteckdose). Dazu haben wir im Kapitel „Vorbereitungen“ bereit den Notify registriert, der uns die Einrichtung erleichtert. Alles was wir nun noch tun müssen ist beim entsprechenden Gerät (hier HM_Funksteckdose_1) ein „comment“-Attribut hinzuzufügen.

Comment-Attribut für LogoControl

Der Inhalt muss dabei die Form „LogoStateAddress=x.y“ haben, wobei x das Byte und y das Bit (0-7) angibt, das je nach Zustand des FHEM-Geräts auf 1 (bei Zustand „on“) oder 0 (bei Zustand „off“) gesetzt werden soll. Anschließend nicht vergessen mit „Save Config“ die Änderungen zu speichern. Das wars! Der Trick des Notify ist, dass dieser bei Zustandsänderungen immer die Funktion „SetLogoControlState()“ in unserem Skript in 99_logoUtils.pm aufruft. Das wiederum prüft ob zu dem Gerät, dass den Notify ausgelöst hat, ein comment-Attribut existiert, welches eine LogoStateAddress-Angabe enthält und schreibt dann die Zustandsänderung über die Webservice-Schnittstelle von LogoControl an diese Adresse der LOGO.

LOGO-Schaltprogramm

Hier muss wieder unterschieden werden, ob es sich beim FHEM-Gerät um einen Sensor oder einen Aktor handelt.

Sensor

Wenn es nur ein Sensor ist, reicht es im LOGO-Schaltprogramm einen einfachen Netzwerkeingang einzubauen und auf die VM-Adresse zu konfigurieren, an die FHEM den Zustand schreibt (siehe „comment“-Attribut in „FHEM-Gerät konfigurieren“). Damit haben wir den aktuellen Zustand immer auf dem Netzwerkeingang.

Aktor

Wenn es sich um einen Aktor handelt, wollen wir von der LOGO dagegen einen Schaltbefehl an FHEM übermitteln. Diese erledigen wir mit Triggern in LogoControl. Kurz erklärt, überwacht ein Trigger den Zustand eines Bits, Bytes, Words oder DWords im LOGO VM-Speicher und kann beim Eintreffen von vorher festgelegten Werten eine Methode ausführen. Welche Methode das ist wird in LogoControl festgelegt. Also müssen wir nur dafür sorgen, dass im VM-Speicher ein Bit gesetzt wird. Dies macht man am einfachsten über einen Merker. Wenn z.B. die Funksteckdose eingeschaltet werden soll, muss im Schaltprogramm einfach nur z.B. Merker 3 auf 1 gesetzt werden, und zwar so lange wie die Funksteckdose an bleiben soll. Wird der Merker wieder auf 0 gesetzt, schaltet auch die Funksteckdose aus. Merker und Funksteckdose sind also gleich geschaltet.

Das gilt so lange, bis man die Funksteckdose von außen (z.B. manuell am Gerät, über FHEM oder per Fernbedienung) schaltet. Dann laufen Merker und Funksteckdose nämlich nicht mehr Synchron. Das synchronisiert sich zwar nach spätestens einem erfolglosem Schaltversuch der LOGO zwar wieder von alleine, aber schön ist das trotzdem nicht. Fatal ist dies sogar bei der Nutzung einer „Alles-Aus-Funktion“ in der LOGO, welche alle Verbraucher im Haus beim Verlassen ausschalten soll. Denn hier schaltet die Funksteckdose nach zuvor manueller Bedienung evtl. nicht ab!

Aus diesem Grund müssen wir also den aktuellen Zustand der Funksteckdose von FHEM miteinbeziehen und haben somit den Fall, dass wir Aktor und Sensor gleichzeitig benötigen. Um dieses Handling im Schaltprogramm zu vereinfachen habe ich einen eigenen UDF-Block erstellt.

Der UDF-Block „FhemOut“

FhemOut2

Download “Fhem-Out” Fhem-Out.zip – 2 KB

Der UDF-Block FhemOut kann immer dann verwendet werden, wenn von der LOGO aus ein einfacher Aktor in FHEM geschaltet werden soll. Mit „einfach“ meine ich, dass es sich um einen rein digitalen Aktor handelt, der lediglich an-/ausschalten kann, z.B. eine Funksteckdose. Er löst das oben unter „Aktor“ geschilderte Problem, dass die Logo eine FHEM-Schaltoperation in Abhängigkeit vom aktuellen Zustand ausführen muss. Über den Eingang „Fhem Status“ wird der tatsächliche Zustand des FHEM Aktors ins Schaltprogramm eingeschleust. Dazu Verbindet ihr einen Netzwerkeingang, der den Zustand des FHEM-Aktors einliest mit diesem Eingang. Der Ausgang „Fhem Merker“ spiegelt dann immer den aktuellen Zustand des Aktors wieder und muss mit einem Merker verbunden werden. Ändert sich der Zustand dieses Merkers (z.B. über einen der 3 Eingänge Trg, S und R), so löst dies einen in LogoControl definierten Trigger aus, der den FHEM Aktor analog zum Merker schaltet.  Merker und FHEM-Aktor sind somit immer synchron. Wie diese Trigger in LogoControl definiert werden erkläre ich im nächsten Abschnitt.

LogoControl

Ihr müsst nun in LogoControl ein neues Device hinzufügen. Ob Attribut und/oder Methode/Trigger benötigt werden hängt vom FHEM-Gerät und Anwendungsfall ab. Das Attribut ist nur notwendig, wenn der Zustand des FHEM-Geräts auch an die LOGO übertragen werden bzw. über den Webservice/TCP-Kanal von LogoControl verfügbar sein soll. Das ist z.B. bei einem reinen Sensor (z.B. Fensterkontakt) der Fall. Dieser hat dann aber auch keine Methoden oder Trigger.

Soll die LOGO oder LogoControl das FHEM-Gerät dagegen nur ein-/auschalten können (z.B. Funksteckdose) ohne den Zustand wissen zu müssen, ist kein Attribut notwendig, dafür jedoch Methoden und Trigger. In manchen Fällen macht es jedoch trotzdem Sinn für eine Funksteckdose ein Attribut zu definieren und so den Schaltzustand in der LOGO abfragen zu können. Etwa, weil die Funksteckdose extern (manuell am Gerät oder per HomeMatic Fernbedienung) geschaltet wurde und die LOGO darauf reagieren muss. Die folgende Konfiguration zeigt somit die maximale Ausbaustufe für eine bidirektionale Kommunikation:

<device id="41" name="Funksteckdose 1" type="light">
	<attribute id="1" name="state" address="0.1" datatype="bit">
		<valuetext value="0" text="aus" />
		<valuetext value="1" text="an" />
	</attribute>
	<method id="1" name="off" url="http://localhost:8083/fhem?cmd=set HM_Funksteckdose_1 off" />
	<method id="2" name="on" url="http://localhost:8083/fhem?cmd=set HM_Funksteckdose_1 on" />
	<trigger address="400.1" datatype="bit">
		<onValue value="0" method="1" />
		<onValue value="1" method="2" />
	</trigger>
</device>
Attribute

Unter „address“ muss hier die Adresse angegeben werden an welcher der Zustand des FHEM-Geräts gelesen werden kann. Die Adresse entspricht der, die wir unter „FHEM-Gerät konfigurieren“ im comment-Attribut festgelegt haben.

Method

Hier definieren wir die zur Verfügung stehenden FHEM-Methoden (Aktionen) des FHEM-Geräts. Der Parameter „url“ muss dabei die komplette URL zur Ausführung der FHEM-Aktion (hier „set HM_Funksteckdose_1 off“) enthalten.

Trigger

Ein Trigger überwacht den Zustand eines Bits, Bytes, Words oder DWords im LOGO VM-Speicher und kann beim Eintreffen von definierten Bedingungen eine Methode ausführen. Damit kann z.B. ein an die LOGO angeschlossener Taster eine Funksteckdose in FHEM schalten. Die zu überwachende Speicheradresse wird mit „address“ angegeben, die Länge der zu lesenden Bytes bestimmt sich über den „datatype“ (bit, byte, word, dword). Über das onValue-Element kann dann festgelegt werden, welche Methode beim Eintreffen eines Wertes getriggert werden soll.

Ich verwende zum Auslösen von Triggern immer Merker, die ich in meinem LOGO-Schaltprogramm gesetzt habe (hinter den FhemOut-Baustein, siehe oben). Wer mein Speicherbelegungsschema verwendet: Merker 3 der Logo 2 ist dann an Adresse 200.2 zu finden. Diese Adresse muss nun bei „address“ eingetragen werden.