ReadingsProxy: Unterschied zwischen den Versionen

Aus FHEMWiki
K (Link zum EnOcean_Starter_Guide, Tippfehler)
 
(31 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt)
Zeile 3: Zeile 3:
|ModPurpose=Aufsplitten von Mehrfachgeräten in einzelne FHEM-Devices
|ModPurpose=Aufsplitten von Mehrfachgeräten in einzelne FHEM-Devices
|ModType=h
|ModType=h
<!-- |ModCategory= (noch?) nicht verwendet -->
|ModCmdRef=readingsProxy
|ModCmdRef=readingsProxy
|ModTechName=33_readingsProxy.pm
|ModTechName=33_readingsProxy.pm
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=430 Andre / justme1968]}}
|ModForumArea=Automatisierung
Das Fhem-[[:Kategorie:Hilfsmodul|Hilfsmodul]] [[readingsProxy]] bietet die Möglichkeit ein Reading oder einen Teil eines Readings eines Devices als eigenständiges Device zu verwenden.
|ModOwner=Andre ({{Link2FU|430|Forum}} / [[Benutzer Diskussion:justme|Wiki]])}}
Hiermit können z.b. mehrfach Sensoren und Aktoren (1-wire 2- oder 8-fach Schalter, EnOcean Serienschalter, ...) in einzeln bedienbare Geräte aufgeteilt werden.


Sobald das proxy Device on und off bereitstellt, stehen über die SetExtentions auch on-for-timer, on-till, blink, usw. zur Verfügung.  
Eventuell ist es nötig, die Readings eines Gerätes durch ein anderes, eigenständiges Gerät verwalten (auslesen, beschreiben) zu lassen.  Auf diese Weise könnten auch neue Readings für ein Gerät (indirekt) erstellt werden, welches über diese Eigenschaften ursprünglich gar nicht verfügt. Auch können beispielsweise Mehrfachsensoren und Aktoren (1-Wire 2- oder 8-fach Schalter, EnOcean Serienschalter, ...) einzeln bedienbaren Geräte zugeordnet.


Hier soll eine Sammlung von Beispielen zur Verwendung des ''readingsProxy'' mitsamt der zugehörigen Screenshots entstehen.
Hierzu dient das FHEM-[[:Kategorie:Hilfsmodul|Hilfsmodul]] [[readingsProxy]]. Sobald das Proxy Device ''on'' und ''off'' bereitstellt, stehen über die [http://fhem.de/commandref.html#setExtensions setExtentions] auch ''on-for-timer'', ''on-till'', ''blink'', usw. zur Verfügung.  


== Beispiele ==
Für das Proxy Device sind keine speziellen Voraussetzungen nötig.
Achtung: Die Beispiele enthalten keine Maskierungen oder Verdoppelungen für ; und Zeilenende, sondern sind so angegeben, wie sie in Fhemweb, in der command box oder nach Klick auf DEF eingegeben werden. Beim manuellen Einfügen in eine [[Konfiguration|Konfigurationsdatei]] sind diese Maskierungen oder Verdoppelungen natürlich vorzunehmen.


== Anwendung ==


=== 1-wire dual switch (DS2406) mit OWDevice als input (erster Kanal) ===
=== Definition ===
<code>define myProxy readingsProxy myDS2406:latch.A
attr myProxy valueFn {($VALUE == 1)?"on":"off"}</code>


Im Folgenden wird das Readingsproxy auch als ''Proxy Device'' oder nur ''Proxy'' bezeichnet.


=== 1-wire 8-fach switch (DS2408) mit OWSWITCH als Output (erster Kanal)===
Das Readingsproxy ist ein eigenständiges Gerät und wird durch den Befehl
  <code>define SchalterA readingsProxy OWX:xxx
define <name> readingsProxy <device>:<reading>
definiert. Dabei bezieht sich <device> auf das Gerät, dessen Reading durch den Proxy verwaltet werden soll, <reading> ist das zu verwaltende Reading. Sind Wildcards wie .* und RegEx möglich?
 
=== Attribute ===
Attribute mit spezieller Bedeutung für Proxy Devices:
;readingFnAttributes
:...
;setFn
 
setFn Mit setFn können set-Befehl an das übergeordnete Gerät (parent device) durchgereicht werden. setFn ist ein Attribut, es muss aber eine Funktion übergeben werden. Dazu wird am besten ein Beispiel präsentiert.
 
Das parent device <MQTT device> sei ein MQTT-Gerät, bei dem ein set-Befehl zum ein- oder ausschalten wie folgt lautet
set  <MQTT-device> switch1 on/off.
Der Zustand des Schalters wird im Reading myswitch1 wiedergegeben. Dann kann man ein ReadingsProxy definieren, dass auf dieses Reading Bezug nimmt
defmod <Proxy-device> readingsProxy <MQTT-device>:myswitch1
Damit set-Befehle übergeben werden, wird nun setFn wie folgt festgelegt
attr <Proxy-device> setFn {($CMD eq "on")?"switch1 on":"switch1 off"}
Zuerst einmal handelt es sich um einen Perl-Ausdruck, was man an den geschweiften Klammern erkennt. Weiter erkennt man eine Funktion, die Eingaben wie die Variable $CMD besitzt und in Abhängigkeit von dieser Eingabe einen Rückgabe (direkt an MQTT-device) geben wird. Verwendet werden können die folgenden Variablen: $CMD (das vom Proxy ausgelöste set-Kommando), $DEVICE (der Name des parent-Geräts), $READING (der Name des betreffenden Reading), wahrscheinlich auch $VALUE (der Wert des betreffenden Readings) and $ARGS (unklar). Der oben stehende Befehl ist eine if-then-else Abfrage: Wenn das Kommando "on" lautete (genauer ''set <Proxy-device> on''), dann wird ''switch1 on'' an das MQTT-Gerät übergeben und es wird damit ''set <MQTT-device> switch1 on'' aufgerufen. War der Befehl nicht on, wird ''set <MQTT-device> switch1 off'' aufgerufen.
 
;getFn
Hier gilt das oben für setFn gesagte, nur dass es sich in diesem Fall nicht um einen set-Befehl, sondern einen get-Befehl handelt.
 
;valueFn
valueFn bestimmt, wie sich das Reading state des Readingsproxy berechnet. Ist dieses Attribut nicht gesetzt, so ändert sich das Reading nicht. Ist das Attribut definiert, so sollte es sich um eine Perl-Funktion handeln (d.h. eingerahmt in geschweifte Klammern), die dann definiert, wie sich state ermittelt. Im folgenden Fall
attr <Proxy-device> valueFn {($VALUE == 0)?"off":"on"}
ist das Reading state gleich off, wenn der Wert des parent Devices (auf das sich readingProxy bezieht) gleich null ist. In allen anderen Fällen ist der Zustand state gleich on. Wieder können die Variablen $CMD (das vom Proxy ausgelöste set-Kommando), $DEVICE (der Name des parent-Geräts) und $READING (der Name des betreffenden Readings) sowie $VALUE (Wert des Readings) verwendet werden.
 
Noch einmal zusammengefasst. Legt man valueFn und setFn wie oben beschrieben fest, so hat man
set <Proxy-device> on            ===>    set <MQTT-device> switch1 on
<MQTT-device>:myswitch1 = "on"    ===>    <Proxy-device>:state = "on"
 
== Anwendungsbeispiele ==
Achtung: Die Beispiele enthalten keine Maskierungen oder Verdoppelungen für {{Taste|;}} und ''Zeilenende'', sondern sind so angegeben, wie sie in [[FHEMWEB]] im Befehl-Eingabefeld oder nach Klick auf ''DEF'' eingegeben werden. Bei manuellem Einfügen in eine [[Konfiguration|Konfigurationsdatei]] sind diese Maskierungen oder Verdoppelungen natürlich vorzunehmen.
 
=== 1-Wire dual switch (DS2406) mit OWDevice als input (erster Kanal) ===
<pre style="width:500px;">
define myProxy readingsProxy myDS2406:latch.A
attr myProxy valueFn {($VALUE == 1)?"on":"off"}
</pre>
 
=== 1-Wire 8-fach switch (DS2408) mit OWSWITCH als Output (erster Kanal)===
<pre style="width:500px;">
  define SchalterA readingsProxy OWX:xxx
   attr SchalterA setFn {($CMD eq "on")?"output A off":"output A on"}
   attr SchalterA setFn {($CMD eq "on")?"output A off":"output A on"}
   attr SchalterA setList on off
   attr SchalterA setList on off
   attr SchalterA valueFn {($VALUE == 0)?"off":"on"}
   attr SchalterA valueFn {($VALUE == 0)?"off":"on"}
   attr SchalterA webCmd on:off</code>
   attr SchalterA webCmd on:off
 
</pre>


=== on/off vertauschen ===
=== on/off vertauschen ===
<code>define proxy readingsProxy meineLampe:state
<pre style="width:500px;">
define proxy readingsProxy meineLampe:state
  attr proxy setFn {($CMD eq "on")?"off":"on"}
  attr proxy setFn {($CMD eq "on")?"off":"on"}
  attr proxy valueFn {($VALUE eq "on")?"off":"on"}</code>
  attr proxy valueFn {($VALUE eq "on")?"off":"on"}
</pre>


=== Schalter für das GästeWLAN einer Fritzbox ===
<pre style="width:500px;">
define Gast_WLAN readingsProxy Fritzbox:box_guestWlan
attr Gast_WLAN setList guestWlan:on,off
</pre>
=== Vereinzelung eines MySensors-Temperatur-Readings ===
<pre style="width:500px;">
define Aussentemperatur_Nord readingsProxy MYSENSOR_97:temperature2
attr Aussentemperatur_Nord stateFormat state °C
</pre>


=== EnOcean Serienschalter ===
=== EnOcean Serienschalter ===
Siehe auch [[EnOcean_Starter_Guide#Aufteilung_der_Kan.C3.A4le_in_unabh.C3.A4ngige_Devices| EnOcean Starter Guide]]
{{Randnotiz|RNTyp=i|RNText=Ab [[version|Modulversion]] 11866/31.7.2016 von '''10_EnOcean.pm''' besitzen auch virtuelle Schalter die Readings channel[A-D]. Ein readingsProxy sollte ab dieser Modulversion besser von diesen Readings, analog des Beispiels im [[EnOcean Starter Guide#Mehrkanalige_bidirektionale_Aktoren|EnOcean Starter Guide]], abgeleitet werden. Auf Devices anderer Module ist das gezeigte Beispiel weiterhin übertragbar}}
<code>#Kanal A zur Steuerung mit on und off
Siehe auch [[EnOcean Starter Guide#Aufteilung der Kanäle in unabhängige Devices|EnOcean Starter Guide]]
<pre style="width:500px;">
#Kanal A zur Steuerung mit on und off
  define Schalter_channelA readingsProxy Schalter:state
  define Schalter_channelA readingsProxy Schalter:state
  attr Schalter_channelA setFn {($CMD eq "on")?"AI":"A0";;}
  attr Schalter_channelA setFn {($CMD eq "on")?"AI":"A0";;}
Zeile 51: Zeile 105:
  attr Schalter_channelB setList on off
  attr Schalter_channelB setList on off
  attr Schalter_channelB valueFn {$LASTCMD}
  attr Schalter_channelB valueFn {$LASTCMD}
  attr Schalter_channelB webCmd on:off</code>
  attr Schalter_channelB webCmd on:off
</pre>
 
=== setExtensions für Geräte implementieren ===
Wenn ein (Original-)Device von sich aus die [http://fhem.de/commandref.html#setExtensions setExtentions] nicht unterstützt, kann das durch Verwendung eines Proxy Device behoben/implementiert werden. Sobald ein Proxy Device ''on'' und ''off'' bereitstellt, stehen über die setExtensions auch ''on-for-timer'', ''on-till'', ''blink'', usw. zur Verfügung.
 
<pre style="width:600px;">
define STECKD_TEST readingsProxy STECKD_BAUHS:state
attr STECKD_TEST setFn {($CMD eq "on")?"angle 3874":"angle 3873";}
attr STECKD_TEST setList on off
attr STECKD_TEST valueFn {$LASTCMD}
</pre>
 
Beispiel aus diesem {{Link2Forum|Topic=22753|LinkText=Forenthread}} übernommen. (Anmerkung: Die im Forenthread noch verwendete Lösung über setFN mit "readingsSingleUpdate" sowie valueFn {} ist nach Einführung von $LASTCMD in readingsProxy nicht mehr notwendig. Dementsprechend wurde hier die neuere Variante mit $LASTCMD genutzt)
 
 
=== Shellkommando zum Schalten verwenden ===
 
<pre style="width:800px;">
define <name> readingsProxy <name>
attr <name> setList on off
attr <name> setFn { fhem('"<shell command to execute> '. ($CMD eq 'on' ?'<on>':'<off>') .'"') }
</pre>
 
===Button für eine bestimmte Harmony Activity im Frontend und Homekit===
siehe [[Harmony#Button_f.C3.BCr_eine_bestimmte_Activity_im_Frontend_und_Homekit_.C3.BCber_readingsProxy|harmony]]


== Links ==
* Forenthema zur {{Link2Forum|Topic=16827|LinkText=Vorstellung des Moduls}}
* Forenthema zur Fragestellung "{{Link2Forum|Topic=16374|LinkText=DS2408 Ports aufsplitten}}"
* Forenthema zur Fragestellung "{{Link2Forum|Topic=13841|LinkText=Zwei Icons für Channel A und B}}"


[[Kategorie:HOWTOS]]
[[Kategorie:HOWTOS]]
[[Kategorie:Code Snippets]]
[[Kategorie:Code Snippets]]

Aktuelle Version vom 7. Februar 2019, 20:14 Uhr


readingsProxy
Zweck / Funktion
Aufsplitten von Mehrfachgeräten in einzelne FHEM-Devices
Allgemein
Typ Hilfsmodul
Details
Dokumentation EN / DE
Support (Forum) Automatisierung
Modulname 33_readingsProxy.pm
Ersteller Andre (Forum / Wiki)
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


Eventuell ist es nötig, die Readings eines Gerätes durch ein anderes, eigenständiges Gerät verwalten (auslesen, beschreiben) zu lassen. Auf diese Weise könnten auch neue Readings für ein Gerät (indirekt) erstellt werden, welches über diese Eigenschaften ursprünglich gar nicht verfügt. Auch können beispielsweise Mehrfachsensoren und Aktoren (1-Wire 2- oder 8-fach Schalter, EnOcean Serienschalter, ...) einzeln bedienbaren Geräte zugeordnet.

Hierzu dient das FHEM-Hilfsmodul readingsProxy. Sobald das Proxy Device on und off bereitstellt, stehen über die setExtentions auch on-for-timer, on-till, blink, usw. zur Verfügung.

Für das Proxy Device sind keine speziellen Voraussetzungen nötig.

Anwendung

Definition

Im Folgenden wird das Readingsproxy auch als Proxy Device oder nur Proxy bezeichnet.

Das Readingsproxy ist ein eigenständiges Gerät und wird durch den Befehl

define <name> readingsProxy <device>:<reading>

definiert. Dabei bezieht sich <device> auf das Gerät, dessen Reading durch den Proxy verwaltet werden soll, <reading> ist das zu verwaltende Reading. Sind Wildcards wie .* und RegEx möglich?

Attribute

Attribute mit spezieller Bedeutung für Proxy Devices:

readingFnAttributes
...
setFn

setFn Mit setFn können set-Befehl an das übergeordnete Gerät (parent device) durchgereicht werden. setFn ist ein Attribut, es muss aber eine Funktion übergeben werden. Dazu wird am besten ein Beispiel präsentiert.

Das parent device <MQTT device> sei ein MQTT-Gerät, bei dem ein set-Befehl zum ein- oder ausschalten wie folgt lautet

set  <MQTT-device> switch1 on/off.

Der Zustand des Schalters wird im Reading myswitch1 wiedergegeben. Dann kann man ein ReadingsProxy definieren, dass auf dieses Reading Bezug nimmt

defmod <Proxy-device> readingsProxy <MQTT-device>:myswitch1

Damit set-Befehle übergeben werden, wird nun setFn wie folgt festgelegt

attr <Proxy-device> setFn {($CMD eq "on")?"switch1 on":"switch1 off"} 

Zuerst einmal handelt es sich um einen Perl-Ausdruck, was man an den geschweiften Klammern erkennt. Weiter erkennt man eine Funktion, die Eingaben wie die Variable $CMD besitzt und in Abhängigkeit von dieser Eingabe einen Rückgabe (direkt an MQTT-device) geben wird. Verwendet werden können die folgenden Variablen: $CMD (das vom Proxy ausgelöste set-Kommando), $DEVICE (der Name des parent-Geräts), $READING (der Name des betreffenden Reading), wahrscheinlich auch $VALUE (der Wert des betreffenden Readings) and $ARGS (unklar). Der oben stehende Befehl ist eine if-then-else Abfrage: Wenn das Kommando "on" lautete (genauer set <Proxy-device> on), dann wird switch1 on an das MQTT-Gerät übergeben und es wird damit set <MQTT-device> switch1 on aufgerufen. War der Befehl nicht on, wird set <MQTT-device> switch1 off aufgerufen.

getFn

Hier gilt das oben für setFn gesagte, nur dass es sich in diesem Fall nicht um einen set-Befehl, sondern einen get-Befehl handelt.

valueFn

valueFn bestimmt, wie sich das Reading state des Readingsproxy berechnet. Ist dieses Attribut nicht gesetzt, so ändert sich das Reading nicht. Ist das Attribut definiert, so sollte es sich um eine Perl-Funktion handeln (d.h. eingerahmt in geschweifte Klammern), die dann definiert, wie sich state ermittelt. Im folgenden Fall

attr <Proxy-device> valueFn {($VALUE == 0)?"off":"on"}

ist das Reading state gleich off, wenn der Wert des parent Devices (auf das sich readingProxy bezieht) gleich null ist. In allen anderen Fällen ist der Zustand state gleich on. Wieder können die Variablen $CMD (das vom Proxy ausgelöste set-Kommando), $DEVICE (der Name des parent-Geräts) und $READING (der Name des betreffenden Readings) sowie $VALUE (Wert des Readings) verwendet werden.

Noch einmal zusammengefasst. Legt man valueFn und setFn wie oben beschrieben fest, so hat man

set <Proxy-device> on             ===>    set <MQTT-device> switch1 on
<MQTT-device>:myswitch1 = "on"    ===>    <Proxy-device>:state = "on"

Anwendungsbeispiele

Achtung: Die Beispiele enthalten keine Maskierungen oder Verdoppelungen für ; und Zeilenende, sondern sind so angegeben, wie sie in FHEMWEB im Befehl-Eingabefeld oder nach Klick auf DEF eingegeben werden. Bei manuellem Einfügen in eine Konfigurationsdatei sind diese Maskierungen oder Verdoppelungen natürlich vorzunehmen.

1-Wire dual switch (DS2406) mit OWDevice als input (erster Kanal)

 define myProxy readingsProxy myDS2406:latch.A
 attr myProxy valueFn {($VALUE == 1)?"on":"off"}

1-Wire 8-fach switch (DS2408) mit OWSWITCH als Output (erster Kanal)

  define SchalterA readingsProxy OWX:xxx
  attr SchalterA setFn {($CMD eq "on")?"output A off":"output A on"}
  attr SchalterA setList on off
  attr SchalterA valueFn {($VALUE == 0)?"off":"on"}
  attr SchalterA webCmd on:off

on/off vertauschen

 define proxy readingsProxy meineLampe:state
 attr proxy setFn {($CMD eq "on")?"off":"on"}
 attr proxy valueFn {($VALUE eq "on")?"off":"on"}

Schalter für das GästeWLAN einer Fritzbox

 define Gast_WLAN readingsProxy Fritzbox:box_guestWlan
 attr Gast_WLAN setList guestWlan:on,off

Vereinzelung eines MySensors-Temperatur-Readings

 define Aussentemperatur_Nord readingsProxy MYSENSOR_97:temperature2
 attr Aussentemperatur_Nord stateFormat state °C

EnOcean Serienschalter

Info green.pngAb Modulversion 11866/31.7.2016 von 10_EnOcean.pm besitzen auch virtuelle Schalter die Readings channel[A-D]. Ein readingsProxy sollte ab dieser Modulversion besser von diesen Readings, analog des Beispiels im EnOcean Starter Guide, abgeleitet werden. Auf Devices anderer Module ist das gezeigte Beispiel weiterhin übertragbar

Siehe auch EnOcean Starter Guide

 #Kanal A zur Steuerung mit on und off
 define Schalter_channelA readingsProxy Schalter:state
 attr Schalter_channelA setFn {($CMD eq "on")?"AI":"A0";;}
 attr Schalter_channelA setList on off
 attr Schalter_channelA valueFn {$LASTCMD}
 attr Schalter_channelA webCmd on:off

 #Kanal B zur Steuerung mit on und off
 define Schalter_channelB readingsProxy Schalter:state
 attr Schalter_channelB setFn {($CMD eq "on")?"BI":"B0";;}
 attr Schalter_channelB setList on off
 attr Schalter_channelB valueFn {$LASTCMD}
 attr Schalter_channelB webCmd on:off

setExtensions für Geräte implementieren

Wenn ein (Original-)Device von sich aus die setExtentions nicht unterstützt, kann das durch Verwendung eines Proxy Device behoben/implementiert werden. Sobald ein Proxy Device on und off bereitstellt, stehen über die setExtensions auch on-for-timer, on-till, blink, usw. zur Verfügung.

 define STECKD_TEST readingsProxy STECKD_BAUHS:state
 attr STECKD_TEST setFn {($CMD eq "on")?"angle 3874":"angle 3873";}
 attr STECKD_TEST setList on off
 attr STECKD_TEST valueFn {$LASTCMD}

Beispiel aus diesem Forenthread übernommen. (Anmerkung: Die im Forenthread noch verwendete Lösung über setFN mit "readingsSingleUpdate" sowie valueFn {} ist nach Einführung von $LASTCMD in readingsProxy nicht mehr notwendig. Dementsprechend wurde hier die neuere Variante mit $LASTCMD genutzt)


Shellkommando zum Schalten verwenden

 define <name> readingsProxy <name>
 attr <name> setList on off
 attr <name> setFn { fhem('"<shell command to execute> '. ($CMD eq 'on' ?'<on>':'<off>') .'"') }

Button für eine bestimmte Harmony Activity im Frontend und Homekit

siehe harmony

Links