<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Maxix2</id>
	<title>FHEMWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Maxix2"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Maxix2"/>
	<updated>2026-04-11T02:17:52Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Floorplan_im_LCARS_Design&amp;diff=15830</id>
		<title>Floorplan im LCARS Design</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Floorplan_im_LCARS_Design&amp;diff=15830"/>
		<updated>2016-07-16T21:11:32Z</updated>

		<summary type="html">&lt;p&gt;Maxix2: #backimg verschwinden und aktuelle Seite.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In diesem Wiki geht es um die Erstellung eines [[FLOORPLAN|Floorplans]] im &#039;&#039;&#039;LCARS Design&#039;&#039;&#039;, siehe [https://www.google.de/search?q=LCARS&amp;amp;client=opera&amp;amp;hs=3Zm&amp;amp;tbm=isch&amp;amp;tbo=u&amp;amp;source=univ&amp;amp;sa=X&amp;amp;ei=W2czVcmtKIOksAGp0oCICA&amp;amp;ved=0CCEQsAQ&amp;amp;biw=1920&amp;amp;bih=971/ LCARS Beispiele].&lt;br /&gt;
&lt;br /&gt;
Es gibt auf Fhem.de einen [http://fhem.de/forum_22336.jpg Screenshot] eines Floorplans im LCARS Design.&lt;br /&gt;
&lt;br /&gt;
In {{Link2Forum|Topic=22336|Message=180850|LinkText=diesem Forenbeitrag}} tauchte obiges Design erstmals auf, entwickelt wurde es von Forenbenutzer {{Link2FU|4194|Tion}}.&lt;br /&gt;
&lt;br /&gt;
== Screenshot 1 ==&lt;br /&gt;
[[File:lcars_all.jpg|600px|Übersicht]]&lt;br /&gt;
&lt;br /&gt;
( Die 3D-Darstellung des Erdgeschosses ist nicht beschrieben, da dies nicht lcars-spezifisch ist)&lt;br /&gt;
&lt;br /&gt;
== Anlegen der Floorpläne ==&lt;br /&gt;
In der [[Konfiguration]] wurden die Floorpläne für Status, Erdgeschoss, Obergeschoss und Garten angelegt, welche alle auf die gleiche CSS-Datei fhem/www/pgm2/floorplanstyle_lcars.css verweisen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Floorpläne&lt;br /&gt;
define LCARS_STATUS FLOORPLAN&lt;br /&gt;
attr LCARS_STATUS fp_noMenu 1&lt;br /&gt;
attr LCARS_STATUS stylesheet floorplanstyle_lcars.css&lt;br /&gt;
&lt;br /&gt;
define LCARS_EG FLOORPLAN&lt;br /&gt;
attr LCARS_EG fp_noMenu 1&lt;br /&gt;
attr LCARS_EG stylesheet floorplanstyle_lcars.css&lt;br /&gt;
&lt;br /&gt;
define LCARS_OG FLOORPLAN&lt;br /&gt;
attr LCARS_OG fp_noMenu 1&lt;br /&gt;
attr LCARS_OG stylesheet floorplanstyle_lcars.css&lt;br /&gt;
&lt;br /&gt;
define LCARS_GARTEN FLOORPLAN&lt;br /&gt;
attr LCARS_GARTEN fp_noMenu 1&lt;br /&gt;
attr LCARS_GARTEN stylesheet floorplanstyle_lcars.css&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einbinden des Hintergrundbildes ==&lt;br /&gt;
[[Datei:Background.svg|mini|right|300px|Das Hintergrundbild als SVG-Datei]]&lt;br /&gt;
Als Hintergrund wurde die Vektorgrafik fhem/www/images/default/lcars/background.svg angelegt und diese über die CSS-Datei eingebunden.&lt;br /&gt;
&lt;br /&gt;
Eintrag in der CSS-Datei:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
body { background-color:#ffffff;&lt;br /&gt;
	  background-image: url(/fhem/icons/lcars/background.svg);&lt;br /&gt;
	  background-size: 1920px 1080px;&lt;br /&gt;
	  overflow:hidden;&lt;br /&gt;
	  background-position: 0px 0px}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun noch die Anweisung &amp;lt;code&amp;gt;set WEB rereadicons&amp;lt;/code&amp;gt; durchführen und der Floorplan zeigt den Hintergrund im LCARS-Design an.&lt;br /&gt;
&lt;br /&gt;
== LCARS - Schrift ==&lt;br /&gt;
Die in &#039;&#039;Star Trek - The Next Generation&#039;&#039; verwendete Schrift für die LCARS-Konsolen war die Helvetica Ultra Compressed, wobei ausschließlich Großbuchstaben verwendet wurden. ([http://www.gtjlcars.de/LCARSindex/LCARSFONTS.htm Quelle: www.gtjlcars.de]) Die Schrift kann man als TrueType-Font online kaufen, allerdings gibt es als Alternative die LCARS GTJ3 zum freien [http://www.gtjlcars.de/LCARSGTJ3.zip Download].&lt;br /&gt;
&lt;br /&gt;
Um die richtige Schriftart clientunabhängig anzeigen zu können, wird die Schrift mit Hilfe des [http://www.fontsquirrel.com/tools/webfont-generator Webfont Generators] von Font Squirrel die TTF-Datei in Webfont umgewandelt.  &lt;br /&gt;
&lt;br /&gt;
Es werden folgende Dateien generiert:&lt;br /&gt;
* fhem/www/images/default/lcars/lcarsgtj3-webfont.eot&lt;br /&gt;
* fhem/www/images/default/lcars/lcarsgtj3-webfont.svg&lt;br /&gt;
* fhem/www/images/default/lcars/lcarsgtj3-webfont.ttf&lt;br /&gt;
* fhem/www/images/default/lcars/lcarsgtj3-webfont.woff&lt;br /&gt;
* fhem/www/images/default/lcars/lcarsgtj3-webfont.woff2&lt;br /&gt;
&lt;br /&gt;
Diese Webfont-Dateien müssen ins Verzeichnis fhem/www/images/... kopiert werden, damit sie genutzt werden können.&lt;br /&gt;
&lt;br /&gt;
== Das Navigationsmenü ==&lt;br /&gt;
Für das Navigationsmenü gibt es jeweils eine SVG-Datei, welche dann in der fhem.cfg eingebunden wird.&lt;br /&gt;
* /www/images/default/lcars/menue_EG.svg&lt;br /&gt;
* /www/images/default/lcars/menue_Garten.svg&lt;br /&gt;
* /www/images/default/lcars/menue_OG.svg&lt;br /&gt;
* /www/images/default/lcars/menue_status.svg&lt;br /&gt;
&lt;br /&gt;
Als Beispiel die SVG-Datei für den Menüpunkt &amp;quot;Status&amp;quot;. Bei den anderen Dateien ändert sich nur der Text im Text-Tag. In diesen sind jeweils die Webfont-Dateien eingebunden. Dies ist erforderlich, weil die SVG-Dateien über die fhem.cfg via HTML-Code über das Object-Tag eingebunden werden. In diesem Fall wirken die Einstellungen aus der CSS-Datei nicht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!-- Created with Inkscape (http://www.inkscape.org/) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;svg&lt;br /&gt;
   xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;&lt;br /&gt;
   xmlns:cc=&amp;quot;http://creativecommons.org/ns#&amp;quot;&lt;br /&gt;
   xmlns:rdf=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;&lt;br /&gt;
   xmlns:svg=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns:sodipodi=&amp;quot;http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd&amp;quot;&lt;br /&gt;
   xmlns:inkscape=&amp;quot;http://www.inkscape.org/namespaces/inkscape&amp;quot;&lt;br /&gt;
   xmlns:xlink=&amp;quot;http://www.w3.org/1999/xlink&amp;quot;&lt;br /&gt;
   width=&amp;quot;130&amp;quot;&lt;br /&gt;
   height=&amp;quot;55&amp;quot;&lt;br /&gt;
   viewBox=&amp;quot;0 0 130 55.000001&amp;quot;&lt;br /&gt;
   id=&amp;quot;svg2&amp;quot;&lt;br /&gt;
   version=&amp;quot;1.1&amp;quot;&lt;br /&gt;
   inkscape:version=&amp;quot;0.91 r13725&amp;quot;&lt;br /&gt;
   sodipodi:docname=&amp;quot;switch_off.svg&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;style&lt;br /&gt;
     type=&amp;quot;text/css&amp;quot;&lt;br /&gt;
     id=&amp;quot;style3&amp;quot;&amp;gt;&lt;br /&gt;
	@font-face {&lt;br /&gt;
    font-family: &#039;lcars&#039;;&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot&#039;);&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot?#iefix&#039;) format(&#039;embedded-opentype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.woff&#039;) format(&#039;woff&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.ttf&#039;) format(&#039;truetype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.svg#lcarsgtj3lcarsgtj3&#039;) format(&#039;svg&#039;);&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;}&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;defs&lt;br /&gt;
     id=&amp;quot;defs4&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;sodipodi:namedview&lt;br /&gt;
     id=&amp;quot;base&amp;quot;&lt;br /&gt;
     pagecolor=&amp;quot;#ffffff&amp;quot;&lt;br /&gt;
     bordercolor=&amp;quot;#666666&amp;quot;&lt;br /&gt;
     borderopacity=&amp;quot;1.0&amp;quot;&lt;br /&gt;
     inkscape:pageopacity=&amp;quot;0.0&amp;quot;&lt;br /&gt;
     inkscape:pageshadow=&amp;quot;2&amp;quot;&lt;br /&gt;
     inkscape:zoom=&amp;quot;3.9185501&amp;quot;&lt;br /&gt;
     inkscape:cx=&amp;quot;8.571662&amp;quot;&lt;br /&gt;
     inkscape:cy=&amp;quot;52.612298&amp;quot;&lt;br /&gt;
     inkscape:document-units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:current-layer=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     showgrid=&amp;quot;false&amp;quot;&lt;br /&gt;
     units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:window-width=&amp;quot;1827&amp;quot;&lt;br /&gt;
     inkscape:window-height=&amp;quot;1051&amp;quot;&lt;br /&gt;
     inkscape:window-x=&amp;quot;84&amp;quot;&lt;br /&gt;
     inkscape:window-y=&amp;quot;-9&amp;quot;&lt;br /&gt;
     inkscape:window-maximized=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;metadata&lt;br /&gt;
     id=&amp;quot;metadata7&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rdf:RDF&amp;gt;&lt;br /&gt;
      &amp;lt;cc:Work&lt;br /&gt;
         rdf:about=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:format&amp;gt;image/svg+xml&amp;lt;/dc:format&amp;gt;&lt;br /&gt;
        &amp;lt;dc:type&lt;br /&gt;
           rdf:resource=&amp;quot;http://purl.org/dc/dcmitype/StillImage&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;dc:title /&amp;gt;&lt;br /&gt;
      &amp;lt;/cc:Work&amp;gt;&lt;br /&gt;
    &amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;
  &amp;lt;/metadata&amp;gt;&lt;br /&gt;
  &amp;lt;g&lt;br /&gt;
     inkscape:label=&amp;quot;Ebene 1&amp;quot;&lt;br /&gt;
     inkscape:groupmode=&amp;quot;layer&amp;quot;&lt;br /&gt;
     id=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     transform=&amp;quot;translate(0,0)&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;rect&lt;br /&gt;
       style=&amp;quot;fill:#ff9900;fill-opacity:1&amp;quot;&lt;br /&gt;
       id=&amp;quot;rect3364&amp;quot;&lt;br /&gt;
       width=&amp;quot;130&amp;quot;&lt;br /&gt;
       height=&amp;quot;55&amp;quot;&lt;br /&gt;
       x=&amp;quot;0&amp;quot;&lt;br /&gt;
       y=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;text&lt;br /&gt;
       x=&amp;quot;125&amp;quot;&lt;br /&gt;
       y=&amp;quot;50&amp;quot;&lt;br /&gt;
       text-anchor=&amp;quot;end&amp;quot;&lt;br /&gt;
       font-size=&amp;quot;35&amp;quot;&lt;br /&gt;
       font-family=&amp;quot;lcars&amp;quot;&lt;br /&gt;
       fill=&amp;quot;#000000&amp;quot;&lt;br /&gt;
       id=&amp;quot;text11&amp;quot;&amp;gt;Status&amp;lt;/text&amp;gt;&lt;br /&gt;
  &amp;lt;/g&amp;gt;&lt;br /&gt;
&amp;lt;/svg&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Einbindung in der fhem.cfg:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Menü definieren&lt;br /&gt;
#Class für den Link auf SVG setzen, um auf gesamtes SVG-Bild klicken zu können&lt;br /&gt;
#SVG-Class dafür in der CSS-Datei definieren&lt;br /&gt;
define Menue_Status weblink htmlCode {&#039;&amp;lt;a class=&amp;quot;svg&amp;quot; href=&amp;quot;/fhem/floorplan/LCARS_STATUS&amp;quot;&amp;gt;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/menue_status.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&amp;lt;/a&amp;gt;&#039;}&lt;br /&gt;
attr Menue_Status fp_LCARS_EG 160,10,0,&lt;br /&gt;
attr Menue_Status fp_LCARS_GARTEN 160,10,0,&lt;br /&gt;
attr Menue_Status fp_LCARS_OG 160,10,0,&lt;br /&gt;
attr Menue_Status fp_LCARS_STATUS 160,10,0,&lt;br /&gt;
&lt;br /&gt;
define Menue_EG weblink htmlCode {&#039;&amp;lt;a class=&amp;quot;svg&amp;quot; href=&amp;quot;/fhem/floorplan/LCARS_EG&amp;quot;&amp;gt;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/menue_EG.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&amp;lt;/a&amp;gt;&#039; }&lt;br /&gt;
attr Menue_EG fp_LCARS_EG 225,10,0,&lt;br /&gt;
attr Menue_EG fp_LCARS_GARTEN 225,10,0,&lt;br /&gt;
attr Menue_EG fp_LCARS_OG 225,10,0,&lt;br /&gt;
attr Menue_EG fp_LCARS_STATUS 225,10,0,&lt;br /&gt;
&lt;br /&gt;
define Menue_OG weblink htmlCode {&#039;&amp;lt;a class=&amp;quot;svg&amp;quot; href=&amp;quot;/fhem/floorplan/LCARS_OG&amp;quot;&amp;gt;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/menue_OG.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&amp;lt;/a&amp;gt;&#039; }&lt;br /&gt;
attr Menue_OG fp_LCARS_EG 290,10,0,&lt;br /&gt;
attr Menue_OG fp_LCARS_GARTEN 290,10,0,&lt;br /&gt;
attr Menue_OG fp_LCARS_OG 290,10,0,&lt;br /&gt;
attr Menue_OG fp_LCARS_STATUS 290,10,0,&lt;br /&gt;
&lt;br /&gt;
define Menue_Garten weblink htmlCode {&#039;&amp;lt;a class=&amp;quot;svg&amp;quot; href=&amp;quot;/fhem/floorplan/LCARS_GARTEN&amp;quot;&amp;gt;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/menue_Garten.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&amp;lt;/a&amp;gt;&#039; }&lt;br /&gt;
attr Menue_Garten fp_LCARS_EG 355,10,0,&lt;br /&gt;
attr Menue_Garten fp_LCARS_GARTEN 355,10,0,&lt;br /&gt;
attr Menue_Garten fp_LCARS_OG 355,10,0,&lt;br /&gt;
attr Menue_Garten fp_LCARS_STATUS 355,10,0,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erforderliche Eintrag in der CSS-Datei&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/*LCARS: SVG definieren, um auf das gesamte Bild klicken zu können*/&lt;br /&gt;
a.svg {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  display: inline-block; &lt;br /&gt;
}&lt;br /&gt;
a.svg:after {&lt;br /&gt;
  content: &amp;quot;&amp;quot;; &lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  right: 0;&lt;br /&gt;
  bottom: 0;&lt;br /&gt;
  left:0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nach einem &amp;lt;code&amp;gt;set WEB rereadicons&amp;lt;/code&amp;gt; ist die Navigation zwischen den einzelnen Floorplänen möglich.&lt;br /&gt;
&lt;br /&gt;
== Schalter für die Beleuchtung ==&lt;br /&gt;
Für die Integration der Buttons der Schalter sind folgende Anpassungen erforderlich:&lt;br /&gt;
&lt;br /&gt;
In der CSS-Datei werden die Webfonts nochmals eingebunden. Die ist erforderlich, weil durch das Device-Attribute &amp;quot;devStateIcon&amp;quot; die Inhalte der SVG-Dateien direkt in die Seite geschrieben und somit auch ein Zugriff auf die CSS-Datei möglich ist.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/*LCARS-Schriftart clientunabhängig verfügbar machen&lt;br /&gt;
Wird in SVG-Texten nochmal separat definiert, sobald die SVG im Tag&lt;br /&gt;
z.b. IMG oder OBJECT verwendet wird.&lt;br /&gt;
*/&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &#039;lcars&#039;;&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot&#039;);&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot?#iefix&#039;) format(&#039;embedded-opentype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.woff&#039;) format(&#039;woff&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.ttf&#039;) format(&#039;truetype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.svg#lcarsgtj3lcarsgtj3&#039;) format(&#039;svg&#039;);&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;&lt;br /&gt;
}&lt;br /&gt;
/*LCARS: Höhe und Breite der Schalter definieren&lt;br /&gt;
der Name svg.xxx ergibt sich, durch die Definition &amp;quot;devStateIcon off:switch_off on:switch_on:off&amp;quot;&lt;br /&gt;
in der fhem.cfg zum jeweiligen Device&lt;br /&gt;
*/&lt;br /&gt;
svg.switch_off { height:55px; width:130px; fill:#ffffff; vertical-align:middle; margin:0 0; }	&lt;br /&gt;
svg.switch_on { height:55px; width:130px; fill:#ffffff; vertical-align:middle; margin:0 0; }  &lt;br /&gt;
svg.switch_open { height:55px; width:130px; fill:#ffffff; vertical-align:middle; margin:0 0; }&lt;br /&gt;
svg.switch_close { height:55px; width:130px; fill:#ffffff; vertical-align:middle; margin:0 0; }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei fhem/www/images/default/lcars/switch_off.svg:&lt;br /&gt;
&lt;br /&gt;
[[Datei:switch_off.svg|switch_off]]&lt;br /&gt;
&lt;br /&gt;
Die Datei fhem/www/images/default/lcars/switch_on.svg:&lt;br /&gt;
&lt;br /&gt;
[[Datei:switch_on.svg|switch_on]]&lt;br /&gt;
&lt;br /&gt;
Zuweisen der SVG-Dateien in der fhem.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Icon-Pfad setzen&lt;br /&gt;
define WEB FHEMWEB 8083 global&lt;br /&gt;
[...]&lt;br /&gt;
attr WEB iconPath default:default/lcars&lt;br /&gt;
&lt;br /&gt;
Schalter Lamp1&lt;br /&gt;
define HMW_LC_Sw2_DR_LEQ0116953_03 HM485 0000B84F_03&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 alias kue_lampe_1&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 devStateIcon off:switch_off on:switch_on:off&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 firmwareVersion 3.06&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 fp_LCARS_EG 230,1500,0,&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 model HMW_LC_Sw2_DR&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 room hidden&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 serialNr LEQ0116953&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 subType switch&lt;br /&gt;
#Schlater Lamp2&lt;br /&gt;
define HMW_LC_Sw2_DR_LEQ0116953_04 HM485 0000B84F_04&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 alias kue_lampe_2&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 devStateIcon off:switch_off:on on:switch_on:off&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 firmwareVersion 3.06&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 fp_LCARS_EG 295,1500,0,&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 model HMW_LC_Sw2_DR&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 room hidden&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 serialNr LEQ0116953&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 subType switch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem SET WEB rereadicons lassen sich die Schalter bedienen.&lt;br /&gt;
&lt;br /&gt;
== Label und Rahmen ==&lt;br /&gt;
Damit man nun weiß, was man schaltet und auch der Style stimmt, können noch folgenden Anpassungen vorgenommen werden&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/corner1_BL.svg&lt;br /&gt;
&lt;br /&gt;
[[File:corner1_BL.svg|corner1_BL]]&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/corner1_BR.svg&lt;br /&gt;
&lt;br /&gt;
[[File:corner1_BR.svg|corner1_BR]]&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/corner1_TL.svg&lt;br /&gt;
&lt;br /&gt;
[[File:corner1_TL.svg|corner1_TL]]&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/corner1_TR.svg&lt;br /&gt;
&lt;br /&gt;
[[File:corner1_TR.svg|corner1_TR]]&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/lbl_switch_kueche1.svg&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!-- Created with Inkscape (http://www.inkscape.org/) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;svg&lt;br /&gt;
   xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;&lt;br /&gt;
   xmlns:cc=&amp;quot;http://creativecommons.org/ns#&amp;quot;&lt;br /&gt;
   xmlns:rdf=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;&lt;br /&gt;
   xmlns:svg=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns:sodipodi=&amp;quot;http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd&amp;quot;&lt;br /&gt;
   xmlns:inkscape=&amp;quot;http://www.inkscape.org/namespaces/inkscape&amp;quot;&lt;br /&gt;
   width=&amp;quot;260&amp;quot;&lt;br /&gt;
   height=&amp;quot;55&amp;quot;&lt;br /&gt;
   viewBox=&amp;quot;0 0 260 55.000001&amp;quot;&lt;br /&gt;
   id=&amp;quot;svg2&amp;quot;&lt;br /&gt;
   version=&amp;quot;1.1&amp;quot;&lt;br /&gt;
   inkscape:version=&amp;quot;0.91 r13725&amp;quot;&lt;br /&gt;
   sodipodi:docname=&amp;quot;lbl_switch_kueche1.svg&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;style&lt;br /&gt;
     type=&amp;quot;text/css&amp;quot;&lt;br /&gt;
     id=&amp;quot;style3&amp;quot;&amp;gt;&lt;br /&gt;
	@font-face {&lt;br /&gt;
    font-family: &#039;lcars&#039;;&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot&#039;);&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot?#iefix&#039;) format(&#039;embedded-opentype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.woff&#039;) format(&#039;woff&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.ttf&#039;) format(&#039;truetype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.svg#lcarsgtj3lcarsgtj3&#039;) format(&#039;svg&#039;);&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;}&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;defs&lt;br /&gt;
     id=&amp;quot;defs4&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;sodipodi:namedview&lt;br /&gt;
     id=&amp;quot;base&amp;quot;&lt;br /&gt;
     pagecolor=&amp;quot;#ffffff&amp;quot;&lt;br /&gt;
     bordercolor=&amp;quot;#666666&amp;quot;&lt;br /&gt;
     borderopacity=&amp;quot;1.0&amp;quot;&lt;br /&gt;
     inkscape:pageopacity=&amp;quot;0.0&amp;quot;&lt;br /&gt;
     inkscape:pageshadow=&amp;quot;2&amp;quot;&lt;br /&gt;
     inkscape:zoom=&amp;quot;3.9185501&amp;quot;&lt;br /&gt;
     inkscape:cx=&amp;quot;133.4632&amp;quot;&lt;br /&gt;
     inkscape:cy=&amp;quot;52.4847&amp;quot;&lt;br /&gt;
     inkscape:document-units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:current-layer=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     showgrid=&amp;quot;false&amp;quot;&lt;br /&gt;
     units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:window-width=&amp;quot;1827&amp;quot;&lt;br /&gt;
     inkscape:window-height=&amp;quot;1051&amp;quot;&lt;br /&gt;
     inkscape:window-x=&amp;quot;84&amp;quot;&lt;br /&gt;
     inkscape:window-y=&amp;quot;-9&amp;quot;&lt;br /&gt;
     inkscape:window-maximized=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;metadata&lt;br /&gt;
     id=&amp;quot;metadata7&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rdf:RDF&amp;gt;&lt;br /&gt;
      &amp;lt;cc:Work&lt;br /&gt;
         rdf:about=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:format&amp;gt;image/svg+xml&amp;lt;/dc:format&amp;gt;&lt;br /&gt;
        &amp;lt;dc:type&lt;br /&gt;
           rdf:resource=&amp;quot;http://purl.org/dc/dcmitype/StillImage&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;dc:title&amp;gt;&amp;lt;/dc:title&amp;gt;&lt;br /&gt;
      &amp;lt;/cc:Work&amp;gt;&lt;br /&gt;
    &amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;
  &amp;lt;/metadata&amp;gt;&lt;br /&gt;
  &amp;lt;g&lt;br /&gt;
     inkscape:label=&amp;quot;Ebene 1&amp;quot;&lt;br /&gt;
     inkscape:groupmode=&amp;quot;layer&amp;quot;&lt;br /&gt;
     id=&amp;quot;layer1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rect&lt;br /&gt;
       style=&amp;quot;fill:#ffcc9a;fill-opacity:1&amp;quot;&lt;br /&gt;
       id=&amp;quot;rect3364&amp;quot;&lt;br /&gt;
       width=&amp;quot;260&amp;quot;&lt;br /&gt;
       height=&amp;quot;55&amp;quot;&lt;br /&gt;
       x=&amp;quot;0&amp;quot;&lt;br /&gt;
       y=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;text&lt;br /&gt;
       x=&amp;quot;255.354&amp;quot;&lt;br /&gt;
       y=&amp;quot;49.50441&amp;quot;&lt;br /&gt;
       font-size=&amp;quot;35&amp;quot;&lt;br /&gt;
       id=&amp;quot;text11&amp;quot;&lt;br /&gt;
       style=&amp;quot;font-size:35px;font-family:lcars;text-anchor:end;fill:#000000&amp;quot;&amp;gt;Küche - Glasbodenleuchte&amp;lt;/text&amp;gt;&lt;br /&gt;
  &amp;lt;/g&amp;gt;&lt;br /&gt;
&amp;lt;/svg&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/lbl_switch_kueche2.svg&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!-- Created with Inkscape (http://www.inkscape.org/) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;svg&lt;br /&gt;
   xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;&lt;br /&gt;
   xmlns:cc=&amp;quot;http://creativecommons.org/ns#&amp;quot;&lt;br /&gt;
   xmlns:rdf=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;&lt;br /&gt;
   xmlns:svg=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns:sodipodi=&amp;quot;http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd&amp;quot;&lt;br /&gt;
   xmlns:inkscape=&amp;quot;http://www.inkscape.org/namespaces/inkscape&amp;quot;&lt;br /&gt;
   width=&amp;quot;260&amp;quot;&lt;br /&gt;
   height=&amp;quot;55&amp;quot;&lt;br /&gt;
   viewBox=&amp;quot;0 0 260 55.000001&amp;quot;&lt;br /&gt;
   id=&amp;quot;svg2&amp;quot;&lt;br /&gt;
   version=&amp;quot;1.1&amp;quot;&lt;br /&gt;
   inkscape:version=&amp;quot;0.91 r13725&amp;quot;&lt;br /&gt;
   sodipodi:docname=&amp;quot;lbl_switch_kueche1.svg&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;style&lt;br /&gt;
     type=&amp;quot;text/css&amp;quot;&lt;br /&gt;
     id=&amp;quot;style3&amp;quot;&amp;gt;&lt;br /&gt;
	@font-face {&lt;br /&gt;
    font-family: &#039;lcars&#039;;&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot&#039;);&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot?#iefix&#039;) format(&#039;embedded-opentype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.woff&#039;) format(&#039;woff&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.ttf&#039;) format(&#039;truetype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.svg#lcarsgtj3lcarsgtj3&#039;) format(&#039;svg&#039;);&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;}&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;defs&lt;br /&gt;
     id=&amp;quot;defs4&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;sodipodi:namedview&lt;br /&gt;
     id=&amp;quot;base&amp;quot;&lt;br /&gt;
     pagecolor=&amp;quot;#ffffff&amp;quot;&lt;br /&gt;
     bordercolor=&amp;quot;#666666&amp;quot;&lt;br /&gt;
     borderopacity=&amp;quot;1.0&amp;quot;&lt;br /&gt;
     inkscape:pageopacity=&amp;quot;0.0&amp;quot;&lt;br /&gt;
     inkscape:pageshadow=&amp;quot;2&amp;quot;&lt;br /&gt;
     inkscape:zoom=&amp;quot;3.9185501&amp;quot;&lt;br /&gt;
     inkscape:cx=&amp;quot;133.4632&amp;quot;&lt;br /&gt;
     inkscape:cy=&amp;quot;52.4847&amp;quot;&lt;br /&gt;
     inkscape:document-units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:current-layer=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     showgrid=&amp;quot;false&amp;quot;&lt;br /&gt;
     units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:window-width=&amp;quot;1827&amp;quot;&lt;br /&gt;
     inkscape:window-height=&amp;quot;1051&amp;quot;&lt;br /&gt;
     inkscape:window-x=&amp;quot;84&amp;quot;&lt;br /&gt;
     inkscape:window-y=&amp;quot;-9&amp;quot;&lt;br /&gt;
     inkscape:window-maximized=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;metadata&lt;br /&gt;
     id=&amp;quot;metadata7&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rdf:RDF&amp;gt;&lt;br /&gt;
      &amp;lt;cc:Work&lt;br /&gt;
         rdf:about=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:format&amp;gt;image/svg+xml&amp;lt;/dc:format&amp;gt;&lt;br /&gt;
        &amp;lt;dc:type&lt;br /&gt;
           rdf:resource=&amp;quot;http://purl.org/dc/dcmitype/StillImage&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;dc:title&amp;gt;&amp;lt;/dc:title&amp;gt;&lt;br /&gt;
      &amp;lt;/cc:Work&amp;gt;&lt;br /&gt;
    &amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;
  &amp;lt;/metadata&amp;gt;&lt;br /&gt;
  &amp;lt;g&lt;br /&gt;
     inkscape:label=&amp;quot;Ebene 1&amp;quot;&lt;br /&gt;
     inkscape:groupmode=&amp;quot;layer&amp;quot;&lt;br /&gt;
     id=&amp;quot;layer1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rect&lt;br /&gt;
       style=&amp;quot;fill:#ffcc9a;fill-opacity:1&amp;quot;&lt;br /&gt;
       id=&amp;quot;rect3364&amp;quot;&lt;br /&gt;
       width=&amp;quot;260&amp;quot;&lt;br /&gt;
       height=&amp;quot;55&amp;quot;&lt;br /&gt;
       x=&amp;quot;0&amp;quot;&lt;br /&gt;
       y=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;text&lt;br /&gt;
       x=&amp;quot;255.354&amp;quot;&lt;br /&gt;
       y=&amp;quot;49.50441&amp;quot;&lt;br /&gt;
       font-size=&amp;quot;35&amp;quot;&lt;br /&gt;
       id=&amp;quot;text11&amp;quot;&lt;br /&gt;
       style=&amp;quot;font-size:35px;font-family:lcars;text-anchor:end;fill:#000000&amp;quot;&amp;gt;Küche - Deckenleuchte&amp;lt;/text&amp;gt;&lt;br /&gt;
  &amp;lt;/g&amp;gt;&lt;br /&gt;
&amp;lt;/svg&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/headline_switches.svg&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!-- Created with Inkscape (http://www.inkscape.org/) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;svg&lt;br /&gt;
   xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;&lt;br /&gt;
   xmlns:cc=&amp;quot;http://creativecommons.org/ns#&amp;quot;&lt;br /&gt;
   xmlns:rdf=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;&lt;br /&gt;
   xmlns:svg=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns:sodipodi=&amp;quot;http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd&amp;quot;&lt;br /&gt;
   xmlns:inkscape=&amp;quot;http://www.inkscape.org/namespaces/inkscape&amp;quot;&lt;br /&gt;
   width=&amp;quot;205&amp;quot;&lt;br /&gt;
   height=&amp;quot;35&amp;quot;&lt;br /&gt;
   viewBox=&amp;quot;0 0 205 35&amp;quot;&lt;br /&gt;
   id=&amp;quot;svg2&amp;quot;&lt;br /&gt;
   version=&amp;quot;1.1&amp;quot;&lt;br /&gt;
   inkscape:version=&amp;quot;0.91 r13725&amp;quot;&lt;br /&gt;
   sodipodi:docname=&amp;quot;headline_switches.svg&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;style&lt;br /&gt;
     type=&amp;quot;text/css&amp;quot;&lt;br /&gt;
     id=&amp;quot;style3&amp;quot;&amp;gt;&lt;br /&gt;
	@font-face {&lt;br /&gt;
    font-family: &#039;lcars&#039;;&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot&#039;);&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot?#iefix&#039;) format(&#039;embedded-opentype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.woff&#039;) format(&#039;woff&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.ttf&#039;) format(&#039;truetype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.svg#lcarsgtj3lcarsgtj3&#039;) format(&#039;svg&#039;);&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;}&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;defs&lt;br /&gt;
     id=&amp;quot;defs4&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;sodipodi:namedview&lt;br /&gt;
     id=&amp;quot;base&amp;quot;&lt;br /&gt;
     pagecolor=&amp;quot;#ffffff&amp;quot;&lt;br /&gt;
     bordercolor=&amp;quot;#666666&amp;quot;&lt;br /&gt;
     borderopacity=&amp;quot;1.0&amp;quot;&lt;br /&gt;
     inkscape:pageopacity=&amp;quot;0.0&amp;quot;&lt;br /&gt;
     inkscape:pageshadow=&amp;quot;2&amp;quot;&lt;br /&gt;
     inkscape:zoom=&amp;quot;3.9185501&amp;quot;&lt;br /&gt;
     inkscape:cx=&amp;quot;62.84951&amp;quot;&lt;br /&gt;
     inkscape:cy=&amp;quot;52.357102&amp;quot;&lt;br /&gt;
     inkscape:document-units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:current-layer=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     showgrid=&amp;quot;false&amp;quot;&lt;br /&gt;
     units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:window-width=&amp;quot;1827&amp;quot;&lt;br /&gt;
     inkscape:window-height=&amp;quot;1051&amp;quot;&lt;br /&gt;
     inkscape:window-x=&amp;quot;84&amp;quot;&lt;br /&gt;
     inkscape:window-y=&amp;quot;-9&amp;quot;&lt;br /&gt;
     inkscape:window-maximized=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;metadata&lt;br /&gt;
     id=&amp;quot;metadata7&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rdf:RDF&amp;gt;&lt;br /&gt;
      &amp;lt;cc:Work&lt;br /&gt;
         rdf:about=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:format&amp;gt;image/svg+xml&amp;lt;/dc:format&amp;gt;&lt;br /&gt;
        &amp;lt;dc:type&lt;br /&gt;
           rdf:resource=&amp;quot;http://purl.org/dc/dcmitype/StillImage&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;dc:title&amp;gt;&amp;lt;/dc:title&amp;gt;&lt;br /&gt;
      &amp;lt;/cc:Work&amp;gt;&lt;br /&gt;
    &amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;
  &amp;lt;/metadata&amp;gt;&lt;br /&gt;
  &amp;lt;g&lt;br /&gt;
     inkscape:label=&amp;quot;Ebene 1&amp;quot;&lt;br /&gt;
     inkscape:groupmode=&amp;quot;layer&amp;quot;&lt;br /&gt;
     id=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     transform=&amp;quot;translate(0,0)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;text&lt;br /&gt;
       x=&amp;quot;205&amp;quot;&lt;br /&gt;
       y=&amp;quot;35&amp;quot;&lt;br /&gt;
       font-size=&amp;quot;35&amp;quot;&lt;br /&gt;
       id=&amp;quot;text11&amp;quot;&lt;br /&gt;
       style=&amp;quot;font-size:35px;font-family:lcars;text-anchor:end;fill:#ff9900&amp;quot;&amp;gt;Beleuchtung&amp;lt;/text&amp;gt;&lt;br /&gt;
  &amp;lt;/g&amp;gt;&lt;br /&gt;
&amp;lt;/svg&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/line1.svg&lt;br /&gt;
&lt;br /&gt;
[[File:line1.svg|line1]]&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/line2.svg&lt;br /&gt;
&lt;br /&gt;
[[File:line2.svg|line2]]&lt;br /&gt;
&lt;br /&gt;
Die Einträge in der fhem.cfg&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#---Rahmen Elemente&lt;br /&gt;
define corner1_tl weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/corner1_TL.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr corner1_tl fp_LCARS_EG 200,1200,0,&lt;br /&gt;
define corner1_bl weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/corner1_BL.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr corner1_bl fp_LCARS_EG 590,1200,0,&lt;br /&gt;
define corner1_tr weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/corner1_TR.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr corner1_tr fp_LCARS_EG 200,1700,0,&lt;br /&gt;
define corner1_br weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/corner1_BR.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr corner1_br fp_LCARS_EG 590,1700,0,&lt;br /&gt;
define line1_l weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/line1.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr line1_l fp_LCARS_EG 235,1200,0,&lt;br /&gt;
define line2_b weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/line2.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr line2_b fp_LCARS_EG 601,1230,0,&lt;br /&gt;
define headline_switches weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/headline_switches.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr headline_switches fp_LCARS_EG 183,1481,0,&lt;br /&gt;
&lt;br /&gt;
#Label&lt;br /&gt;
define lbl_switch_kueche1 weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/lbl_switch_kueche1.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr lbl_switch_kueche1 fp_LCARS_EG 230,1250,0,&lt;br /&gt;
define lbl_switch_kueche2 weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/lbl_switch_kueche2.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr lbl_switch_kueche2 fp_LCARS_EG 295,1250,0,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem SET WEB rereadicons sind nun Labels und Rahmen sichtbar. &lt;br /&gt;
&lt;br /&gt;
Die Grundlagen sind da, die Floorpläne können nun an eigenen Bedürfnisse angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Erweiterung Slider ==&lt;br /&gt;
Für die Slider gibt es die beiden Dateien slider.svg und slider_handle.svg, welche fhem/www/images/default/lcars/ kopiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
[[File:Slider.svg|Silder]]&lt;br /&gt;
&lt;br /&gt;
[[File:Slider_handle.svg|Silder]]&lt;br /&gt;
&lt;br /&gt;
In der verwendeten CSS-Datei muss nun der Style des Slider und Handle wie folgt angepasst werden. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* detail-selector &amp;amp; slider */&lt;br /&gt;
select {  margin-left:5px; margin-right:5px; }&lt;br /&gt;
.set,.attr { margin-bottom:5px; float:left; }&lt;br /&gt;
.slider { float:left; width:190px; height:55px; border:0px solid; color:grey; background-image:url(/fhem/icons/lcars/slider.svg)}&lt;br /&gt;
.set .slider { background:#F0F0D8; border-radius:8px; }&lt;br /&gt;
/* timepicker */&lt;br /&gt;
.set .set { margin-bottom:2px; margin-top:3px; }&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
*handle = Darstellung des Sliders&lt;br /&gt;
*/&lt;br /&gt;
.handle { margin-top:0px; position:relative; cursor:pointer; width:40px;&lt;br /&gt;
          height:17px; line-height:20px; user-select:none; font-size: 20px;&lt;br /&gt;
          border:0px solid; color:#ff9900; background-image:url(/fhem/icons/lcars/slider_handle.svg); text-align:center; padding-top:38px;} &lt;br /&gt;
.downText { margin-top:2px; }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Erklärung:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.slider { ... width:190px; height:55px; border:0px solid; ... background-image:url(/fhem/icons/lcars/slider.svg)}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Breite und Höhe entspricht der Größe der slider.svg. Es gibt keinen Rahmen und die URL zum slider.svg wird gesetzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.handle { ... font-size: 20px; ...  background-image:url(/fhem/icons/lcars/slider_handle.svg); text-align:center; padding-top:38px;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Schriftgröße auf 20px setzen. Die URL des slider_handle.svg setzen und den Text um 38px nach unten verschieben. Dadurch steht dieser unterhalb des Dreiecks.&lt;br /&gt;
&lt;br /&gt;
Nun kann der Slider in der fhem.cfg verwendet werden (Beispiel eines Homeatic-Dimmers)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define HMW_LC_Dim1L_DR_MEQ0311914_03 HM485 0001308E_03&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 alias wo_dimmer_01&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 firmwareVersion 3.03&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 fp_LCARS_EG 357,1515,7,&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 model HMW_LC_Dim1L_DR&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 serialNr MEQ0311914&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 subType dimmer&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 webCmd level&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Erweiterung Backimg/Aktuelle Seite ==&lt;br /&gt;
&lt;br /&gt;
Nach dem aktuellen Stand gibt es in der oben linken Ecke immer einen Text fp_LCARS_Status/Garten/EG/OG. Diesen kann man im CSS mithilfe von&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#backimg {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
entfernen.&lt;br /&gt;
Zusätzlich kann man in der oben rechten Ecke den aktuellen Seiten-Nahmen mithilfe von einem neuen Objekt hinzufügen. Hierzu einfach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define current_fp_page weblink htmlCode {&#039;&amp;lt;a class=&amp;quot;svg&amp;quot;&amp;gt;&amp;lt;svg xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot; xmlns:cc=&amp;quot;http://creativecommons.org/ns#&amp;quot; xmlns:rdf=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot; xmlns:svg=&amp;quot;http://www.w3.org/2000/svg&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; xmlns:sodipodi=&amp;quot;http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd&amp;quot; xmlns:inkscape=&amp;quot;http://www.inkscape.org/namespaces/inkscape&amp;quot; xmlns:xlink=&amp;quot;http://www.w3.org/1999/xlink&amp;quot; id=&amp;quot;svg2&amp;quot; version=&amp;quot;1.1&amp;quot; inkscape:version=&amp;quot;0.91 r13725&amp;quot; sodipodi:docname=&amp;quot;switch_off.svg&amp;quot; viewBox=&amp;quot;0 0 170 45.000001&amp;quot; width=&amp;quot;170&amp;quot; height=&amp;quot;45&amp;quot;&amp;gt; &amp;lt;style type=&amp;quot;text/css&amp;quot; id=&amp;quot;style3&amp;quot;&amp;gt; 	@font-face { font-family: &amp;quot;lcars&amp;quot;; src: url(&amp;quot;/fhem/images/default/lcars/lcarsgtj3-webfont.eot&amp;quot;); src: url(&amp;quot;/fhem/images/default/lcars/lcarsgtj3-webfont.eot?#iefix&amp;quot;) format(&amp;quot;embedded-opentype&amp;quot;), url(&amp;quot;/fhem/images/default/lcars/lcarsgtj3-webfont.woff&amp;quot;) format(&amp;quot;woff&amp;quot;), url(&amp;quot;/fhem/images/default/lcars/lcarsgtj3-webfont.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;), url(&amp;quot;/fhem/images/default/lcars/lcarsgtj3-webfont.svg#lcarsgtj3lcarsgtj3&amp;quot;) format(&amp;quot;svg&amp;quot;); font-weight: normal; font-style: normal;} 	&amp;lt;/style&amp;gt; &amp;lt;defs id=&amp;quot;defs4&amp;quot;/&amp;gt; &amp;lt;sodipodi:namedview id=&amp;quot;base&amp;quot; pagecolor=&amp;quot;#ffffff&amp;quot; bordercolor=&amp;quot;#666666&amp;quot; borderopacity=&amp;quot;1.0&amp;quot; inkscape:pageopacity=&amp;quot;0.0&amp;quot; inkscape:pageshadow=&amp;quot;2&amp;quot; inkscape:zoom=&amp;quot;3.9185501&amp;quot; inkscape:cx=&amp;quot;8.571662&amp;quot; inkscape:cy=&amp;quot;52.612298&amp;quot; inkscape:document-units=&amp;quot;px&amp;quot; inkscape:current-layer=&amp;quot;layer1&amp;quot; showgrid=&amp;quot;false&amp;quot; units=&amp;quot;px&amp;quot; inkscape:window-width=&amp;quot;1827&amp;quot; inkscape:window-height=&amp;quot;1051&amp;quot; inkscape:window-x=&amp;quot;84&amp;quot; inkscape:window-y=&amp;quot;-9&amp;quot; inkscape:window-maximized=&amp;quot;1&amp;quot;/&amp;gt; &amp;lt;metadata id=&amp;quot;metadata7&amp;quot;&amp;gt; &amp;lt;rdf:RDF&amp;gt; &amp;lt;cc:Work rdf:about=&amp;quot;&amp;quot;&amp;gt; &amp;lt;dc:format&amp;gt;image/svg+xml&amp;lt;/dc:format&amp;gt; &amp;lt;dc:type rdf:resource=&amp;quot;http://purl.org/dc/dcmitype/StillImage&amp;quot;/&amp;gt; &amp;lt;dc:title/&amp;gt; &amp;lt;/cc:Work&amp;gt; &amp;lt;/rdf:RDF&amp;gt; &amp;lt;/metadata&amp;gt; &amp;lt;g inkscape:label=&amp;quot;Ebene 1&amp;quot; inkscape:groupmode=&amp;quot;layer&amp;quot; id=&amp;quot;layer1&amp;quot; transform=&amp;quot;translate(0,0)&amp;quot;&amp;gt; 	 &amp;lt;text font-size=&amp;quot;35&amp;quot; font-family=&amp;quot;lcars&amp;quot; id=&amp;quot;text_current&amp;quot; fill=&amp;quot;#0000DD&amp;quot; text-anchor=&amp;quot;middle&amp;quot; y=&amp;quot;25&amp;quot; x=&amp;quot;85&amp;quot;&amp;gt;NIFP&amp;lt;/text&amp;gt; &amp;lt;/g&amp;gt; &amp;lt;/svg&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;script&amp;gt;$(&amp;quot;#text_current&amp;quot;).html($(&amp;quot;#backimg&amp;quot;).html().replace(&amp;quot;fp_LCARS_&amp;quot;, &amp;quot;&amp;quot;));&amp;lt;/script&amp;gt;&#039; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Dieses ist ein direkt-eingebundenes SVG ohne den &amp;lt;object&amp;gt; Teil, der mit jQuery auf den Namen der aktuellen Seite über #backimg abgerufen gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* {{Link2Forum|Topic=26673|LinkText=Foren-Thema zum LCARS-Floorplan}}&lt;br /&gt;
* [http://www.gtjlcars.de Hintergrundinformationen zu LCARS]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Maxix2</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Floorplan_im_LCARS_Design&amp;diff=15829</id>
		<title>Floorplan im LCARS Design</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Floorplan_im_LCARS_Design&amp;diff=15829"/>
		<updated>2016-07-16T11:59:41Z</updated>

		<summary type="html">&lt;p&gt;Maxix2: Doppelten Eintrag entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In diesem Wiki geht es um die Erstellung eines [[FLOORPLAN|Floorplans]] im &#039;&#039;&#039;LCARS Design&#039;&#039;&#039;, siehe [https://www.google.de/search?q=LCARS&amp;amp;client=opera&amp;amp;hs=3Zm&amp;amp;tbm=isch&amp;amp;tbo=u&amp;amp;source=univ&amp;amp;sa=X&amp;amp;ei=W2czVcmtKIOksAGp0oCICA&amp;amp;ved=0CCEQsAQ&amp;amp;biw=1920&amp;amp;bih=971/ LCARS Beispiele].&lt;br /&gt;
&lt;br /&gt;
Es gibt auf Fhem.de einen [http://fhem.de/forum_22336.jpg Screenshot] eines Floorplans im LCARS Design.&lt;br /&gt;
&lt;br /&gt;
In {{Link2Forum|Topic=22336|Message=180850|LinkText=diesem Forenbeitrag}} tauchte obiges Design erstmals auf, entwickelt wurde es von Forenbenutzer {{Link2FU|4194|Tion}}.&lt;br /&gt;
&lt;br /&gt;
== Screenshot 1 ==&lt;br /&gt;
[[File:lcars_all.jpg|600px|Übersicht]]&lt;br /&gt;
&lt;br /&gt;
( Die 3D-Darstellung des Erdgeschosses ist nicht beschrieben, da dies nicht lcars-spezifisch ist)&lt;br /&gt;
&lt;br /&gt;
== Anlegen der Floorpläne ==&lt;br /&gt;
In der [[Konfiguration]] wurden die Floorpläne für Status, Erdgeschoss, Obergeschoss und Garten angelegt, welche alle auf die gleiche CSS-Datei fhem/www/pgm2/floorplanstyle_lcars.css verweisen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Floorpläne&lt;br /&gt;
define LCARS_STATUS FLOORPLAN&lt;br /&gt;
attr LCARS_STATUS fp_noMenu 1&lt;br /&gt;
attr LCARS_STATUS stylesheet floorplanstyle_lcars.css&lt;br /&gt;
&lt;br /&gt;
define LCARS_EG FLOORPLAN&lt;br /&gt;
attr LCARS_EG fp_noMenu 1&lt;br /&gt;
attr LCARS_EG stylesheet floorplanstyle_lcars.css&lt;br /&gt;
&lt;br /&gt;
define LCARS_OG FLOORPLAN&lt;br /&gt;
attr LCARS_OG fp_noMenu 1&lt;br /&gt;
attr LCARS_OG stylesheet floorplanstyle_lcars.css&lt;br /&gt;
&lt;br /&gt;
define LCARS_GARTEN FLOORPLAN&lt;br /&gt;
attr LCARS_GARTEN fp_noMenu 1&lt;br /&gt;
attr LCARS_GARTEN stylesheet floorplanstyle_lcars.css&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einbinden des Hintergrundbildes ==&lt;br /&gt;
[[Datei:Background.svg|mini|right|300px|Das Hintergrundbild als SVG-Datei]]&lt;br /&gt;
Als Hintergrund wurde die Vektorgrafik fhem/www/images/default/lcars/background.svg angelegt und diese über die CSS-Datei eingebunden.&lt;br /&gt;
&lt;br /&gt;
Eintrag in der CSS-Datei:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
body { background-color:#ffffff;&lt;br /&gt;
	  background-image: url(/fhem/icons/lcars/background.svg);&lt;br /&gt;
	  background-size: 1920px 1080px;&lt;br /&gt;
	  overflow:hidden;&lt;br /&gt;
	  background-position: 0px 0px}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun noch die Anweisung &amp;lt;code&amp;gt;set WEB rereadicons&amp;lt;/code&amp;gt; durchführen und der Floorplan zeigt den Hintergrund im LCARS-Design an.&lt;br /&gt;
&lt;br /&gt;
== LCARS - Schrift ==&lt;br /&gt;
Die in &#039;&#039;Star Trek - The Next Generation&#039;&#039; verwendete Schrift für die LCARS-Konsolen war die Helvetica Ultra Compressed, wobei ausschließlich Großbuchstaben verwendet wurden. ([http://www.gtjlcars.de/LCARSindex/LCARSFONTS.htm Quelle: www.gtjlcars.de]) Die Schrift kann man als TrueType-Font online kaufen, allerdings gibt es als Alternative die LCARS GTJ3 zum freien [http://www.gtjlcars.de/LCARSGTJ3.zip Download].&lt;br /&gt;
&lt;br /&gt;
Um die richtige Schriftart clientunabhängig anzeigen zu können, wird die Schrift mit Hilfe des [http://www.fontsquirrel.com/tools/webfont-generator Webfont Generators] von Font Squirrel die TTF-Datei in Webfont umgewandelt.  &lt;br /&gt;
&lt;br /&gt;
Es werden folgende Dateien generiert:&lt;br /&gt;
* fhem/www/images/default/lcars/lcarsgtj3-webfont.eot&lt;br /&gt;
* fhem/www/images/default/lcars/lcarsgtj3-webfont.svg&lt;br /&gt;
* fhem/www/images/default/lcars/lcarsgtj3-webfont.ttf&lt;br /&gt;
* fhem/www/images/default/lcars/lcarsgtj3-webfont.woff&lt;br /&gt;
* fhem/www/images/default/lcars/lcarsgtj3-webfont.woff2&lt;br /&gt;
&lt;br /&gt;
Diese Webfont-Dateien müssen ins Verzeichnis fhem/www/images/... kopiert werden, damit sie genutzt werden können.&lt;br /&gt;
&lt;br /&gt;
== Das Navigationsmenü ==&lt;br /&gt;
Für das Navigationsmenü gibt es jeweils eine SVG-Datei, welche dann in der fhem.cfg eingebunden wird.&lt;br /&gt;
* /www/images/default/lcars/menue_EG.svg&lt;br /&gt;
* /www/images/default/lcars/menue_Garten.svg&lt;br /&gt;
* /www/images/default/lcars/menue_OG.svg&lt;br /&gt;
* /www/images/default/lcars/menue_status.svg&lt;br /&gt;
&lt;br /&gt;
Als Beispiel die SVG-Datei für den Menüpunkt &amp;quot;Status&amp;quot;. Bei den anderen Dateien ändert sich nur der Text im Text-Tag. In diesen sind jeweils die Webfont-Dateien eingebunden. Dies ist erforderlich, weil die SVG-Dateien über die fhem.cfg via HTML-Code über das Object-Tag eingebunden werden. In diesem Fall wirken die Einstellungen aus der CSS-Datei nicht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!-- Created with Inkscape (http://www.inkscape.org/) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;svg&lt;br /&gt;
   xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;&lt;br /&gt;
   xmlns:cc=&amp;quot;http://creativecommons.org/ns#&amp;quot;&lt;br /&gt;
   xmlns:rdf=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;&lt;br /&gt;
   xmlns:svg=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns:sodipodi=&amp;quot;http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd&amp;quot;&lt;br /&gt;
   xmlns:inkscape=&amp;quot;http://www.inkscape.org/namespaces/inkscape&amp;quot;&lt;br /&gt;
   xmlns:xlink=&amp;quot;http://www.w3.org/1999/xlink&amp;quot;&lt;br /&gt;
   width=&amp;quot;130&amp;quot;&lt;br /&gt;
   height=&amp;quot;55&amp;quot;&lt;br /&gt;
   viewBox=&amp;quot;0 0 130 55.000001&amp;quot;&lt;br /&gt;
   id=&amp;quot;svg2&amp;quot;&lt;br /&gt;
   version=&amp;quot;1.1&amp;quot;&lt;br /&gt;
   inkscape:version=&amp;quot;0.91 r13725&amp;quot;&lt;br /&gt;
   sodipodi:docname=&amp;quot;switch_off.svg&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;style&lt;br /&gt;
     type=&amp;quot;text/css&amp;quot;&lt;br /&gt;
     id=&amp;quot;style3&amp;quot;&amp;gt;&lt;br /&gt;
	@font-face {&lt;br /&gt;
    font-family: &#039;lcars&#039;;&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot&#039;);&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot?#iefix&#039;) format(&#039;embedded-opentype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.woff&#039;) format(&#039;woff&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.ttf&#039;) format(&#039;truetype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.svg#lcarsgtj3lcarsgtj3&#039;) format(&#039;svg&#039;);&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;}&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;defs&lt;br /&gt;
     id=&amp;quot;defs4&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;sodipodi:namedview&lt;br /&gt;
     id=&amp;quot;base&amp;quot;&lt;br /&gt;
     pagecolor=&amp;quot;#ffffff&amp;quot;&lt;br /&gt;
     bordercolor=&amp;quot;#666666&amp;quot;&lt;br /&gt;
     borderopacity=&amp;quot;1.0&amp;quot;&lt;br /&gt;
     inkscape:pageopacity=&amp;quot;0.0&amp;quot;&lt;br /&gt;
     inkscape:pageshadow=&amp;quot;2&amp;quot;&lt;br /&gt;
     inkscape:zoom=&amp;quot;3.9185501&amp;quot;&lt;br /&gt;
     inkscape:cx=&amp;quot;8.571662&amp;quot;&lt;br /&gt;
     inkscape:cy=&amp;quot;52.612298&amp;quot;&lt;br /&gt;
     inkscape:document-units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:current-layer=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     showgrid=&amp;quot;false&amp;quot;&lt;br /&gt;
     units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:window-width=&amp;quot;1827&amp;quot;&lt;br /&gt;
     inkscape:window-height=&amp;quot;1051&amp;quot;&lt;br /&gt;
     inkscape:window-x=&amp;quot;84&amp;quot;&lt;br /&gt;
     inkscape:window-y=&amp;quot;-9&amp;quot;&lt;br /&gt;
     inkscape:window-maximized=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;metadata&lt;br /&gt;
     id=&amp;quot;metadata7&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rdf:RDF&amp;gt;&lt;br /&gt;
      &amp;lt;cc:Work&lt;br /&gt;
         rdf:about=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:format&amp;gt;image/svg+xml&amp;lt;/dc:format&amp;gt;&lt;br /&gt;
        &amp;lt;dc:type&lt;br /&gt;
           rdf:resource=&amp;quot;http://purl.org/dc/dcmitype/StillImage&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;dc:title /&amp;gt;&lt;br /&gt;
      &amp;lt;/cc:Work&amp;gt;&lt;br /&gt;
    &amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;
  &amp;lt;/metadata&amp;gt;&lt;br /&gt;
  &amp;lt;g&lt;br /&gt;
     inkscape:label=&amp;quot;Ebene 1&amp;quot;&lt;br /&gt;
     inkscape:groupmode=&amp;quot;layer&amp;quot;&lt;br /&gt;
     id=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     transform=&amp;quot;translate(0,0)&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;rect&lt;br /&gt;
       style=&amp;quot;fill:#ff9900;fill-opacity:1&amp;quot;&lt;br /&gt;
       id=&amp;quot;rect3364&amp;quot;&lt;br /&gt;
       width=&amp;quot;130&amp;quot;&lt;br /&gt;
       height=&amp;quot;55&amp;quot;&lt;br /&gt;
       x=&amp;quot;0&amp;quot;&lt;br /&gt;
       y=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;text&lt;br /&gt;
       x=&amp;quot;125&amp;quot;&lt;br /&gt;
       y=&amp;quot;50&amp;quot;&lt;br /&gt;
       text-anchor=&amp;quot;end&amp;quot;&lt;br /&gt;
       font-size=&amp;quot;35&amp;quot;&lt;br /&gt;
       font-family=&amp;quot;lcars&amp;quot;&lt;br /&gt;
       fill=&amp;quot;#000000&amp;quot;&lt;br /&gt;
       id=&amp;quot;text11&amp;quot;&amp;gt;Status&amp;lt;/text&amp;gt;&lt;br /&gt;
  &amp;lt;/g&amp;gt;&lt;br /&gt;
&amp;lt;/svg&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Einbindung in der fhem.cfg:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Menü definieren&lt;br /&gt;
#Class für den Link auf SVG setzen, um auf gesamtes SVG-Bild klicken zu können&lt;br /&gt;
#SVG-Class dafür in der CSS-Datei definieren&lt;br /&gt;
define Menue_Status weblink htmlCode {&#039;&amp;lt;a class=&amp;quot;svg&amp;quot; href=&amp;quot;/fhem/floorplan/LCARS_STATUS&amp;quot;&amp;gt;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/menue_status.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&amp;lt;/a&amp;gt;&#039;}&lt;br /&gt;
attr Menue_Status fp_LCARS_EG 160,10,0,&lt;br /&gt;
attr Menue_Status fp_LCARS_GARTEN 160,10,0,&lt;br /&gt;
attr Menue_Status fp_LCARS_OG 160,10,0,&lt;br /&gt;
attr Menue_Status fp_LCARS_STATUS 160,10,0,&lt;br /&gt;
&lt;br /&gt;
define Menue_EG weblink htmlCode {&#039;&amp;lt;a class=&amp;quot;svg&amp;quot; href=&amp;quot;/fhem/floorplan/LCARS_EG&amp;quot;&amp;gt;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/menue_EG.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&amp;lt;/a&amp;gt;&#039; }&lt;br /&gt;
attr Menue_EG fp_LCARS_EG 225,10,0,&lt;br /&gt;
attr Menue_EG fp_LCARS_GARTEN 225,10,0,&lt;br /&gt;
attr Menue_EG fp_LCARS_OG 225,10,0,&lt;br /&gt;
attr Menue_EG fp_LCARS_STATUS 225,10,0,&lt;br /&gt;
&lt;br /&gt;
define Menue_OG weblink htmlCode {&#039;&amp;lt;a class=&amp;quot;svg&amp;quot; href=&amp;quot;/fhem/floorplan/LCARS_OG&amp;quot;&amp;gt;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/menue_OG.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&amp;lt;/a&amp;gt;&#039; }&lt;br /&gt;
attr Menue_OG fp_LCARS_EG 290,10,0,&lt;br /&gt;
attr Menue_OG fp_LCARS_GARTEN 290,10,0,&lt;br /&gt;
attr Menue_OG fp_LCARS_OG 290,10,0,&lt;br /&gt;
attr Menue_OG fp_LCARS_STATUS 290,10,0,&lt;br /&gt;
&lt;br /&gt;
define Menue_Garten weblink htmlCode {&#039;&amp;lt;a class=&amp;quot;svg&amp;quot; href=&amp;quot;/fhem/floorplan/LCARS_GARTEN&amp;quot;&amp;gt;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/menue_Garten.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&amp;lt;/a&amp;gt;&#039; }&lt;br /&gt;
attr Menue_Garten fp_LCARS_EG 355,10,0,&lt;br /&gt;
attr Menue_Garten fp_LCARS_GARTEN 355,10,0,&lt;br /&gt;
attr Menue_Garten fp_LCARS_OG 355,10,0,&lt;br /&gt;
attr Menue_Garten fp_LCARS_STATUS 355,10,0,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erforderliche Eintrag in der CSS-Datei&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/*LCARS: SVG definieren, um auf das gesamte Bild klicken zu können*/&lt;br /&gt;
a.svg {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  display: inline-block; &lt;br /&gt;
}&lt;br /&gt;
a.svg:after {&lt;br /&gt;
  content: &amp;quot;&amp;quot;; &lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  right: 0;&lt;br /&gt;
  bottom: 0;&lt;br /&gt;
  left:0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nach einem &amp;lt;code&amp;gt;set WEB rereadicons&amp;lt;/code&amp;gt; ist die Navigation zwischen den einzelnen Floorplänen möglich.&lt;br /&gt;
&lt;br /&gt;
== Schalter für die Beleuchtung ==&lt;br /&gt;
Für die Integration der Buttons der Schalter sind folgende Anpassungen erforderlich:&lt;br /&gt;
&lt;br /&gt;
In der CSS-Datei werden die Webfonts nochmals eingebunden. Die ist erforderlich, weil durch das Device-Attribute &amp;quot;devStateIcon&amp;quot; die Inhalte der SVG-Dateien direkt in die Seite geschrieben und somit auch ein Zugriff auf die CSS-Datei möglich ist.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/*LCARS-Schriftart clientunabhängig verfügbar machen&lt;br /&gt;
Wird in SVG-Texten nochmal separat definiert, sobald die SVG im Tag&lt;br /&gt;
z.b. IMG oder OBJECT verwendet wird.&lt;br /&gt;
*/&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &#039;lcars&#039;;&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot&#039;);&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot?#iefix&#039;) format(&#039;embedded-opentype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.woff&#039;) format(&#039;woff&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.ttf&#039;) format(&#039;truetype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.svg#lcarsgtj3lcarsgtj3&#039;) format(&#039;svg&#039;);&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;&lt;br /&gt;
}&lt;br /&gt;
/*LCARS: Höhe und Breite der Schalter definieren&lt;br /&gt;
der Name svg.xxx ergibt sich, durch die Definition &amp;quot;devStateIcon off:switch_off on:switch_on:off&amp;quot;&lt;br /&gt;
in der fhem.cfg zum jeweiligen Device&lt;br /&gt;
*/&lt;br /&gt;
svg.switch_off { height:55px; width:130px; fill:#ffffff; vertical-align:middle; margin:0 0; }	&lt;br /&gt;
svg.switch_on { height:55px; width:130px; fill:#ffffff; vertical-align:middle; margin:0 0; }  &lt;br /&gt;
svg.switch_open { height:55px; width:130px; fill:#ffffff; vertical-align:middle; margin:0 0; }&lt;br /&gt;
svg.switch_close { height:55px; width:130px; fill:#ffffff; vertical-align:middle; margin:0 0; }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei fhem/www/images/default/lcars/switch_off.svg:&lt;br /&gt;
&lt;br /&gt;
[[Datei:switch_off.svg|switch_off]]&lt;br /&gt;
&lt;br /&gt;
Die Datei fhem/www/images/default/lcars/switch_on.svg:&lt;br /&gt;
&lt;br /&gt;
[[Datei:switch_on.svg|switch_on]]&lt;br /&gt;
&lt;br /&gt;
Zuweisen der SVG-Dateien in der fhem.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Icon-Pfad setzen&lt;br /&gt;
define WEB FHEMWEB 8083 global&lt;br /&gt;
[...]&lt;br /&gt;
attr WEB iconPath default:default/lcars&lt;br /&gt;
&lt;br /&gt;
Schalter Lamp1&lt;br /&gt;
define HMW_LC_Sw2_DR_LEQ0116953_03 HM485 0000B84F_03&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 alias kue_lampe_1&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 devStateIcon off:switch_off on:switch_on:off&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 firmwareVersion 3.06&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 fp_LCARS_EG 230,1500,0,&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 model HMW_LC_Sw2_DR&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 room hidden&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 serialNr LEQ0116953&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 subType switch&lt;br /&gt;
#Schlater Lamp2&lt;br /&gt;
define HMW_LC_Sw2_DR_LEQ0116953_04 HM485 0000B84F_04&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 alias kue_lampe_2&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 devStateIcon off:switch_off:on on:switch_on:off&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 firmwareVersion 3.06&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 fp_LCARS_EG 295,1500,0,&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 model HMW_LC_Sw2_DR&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 room hidden&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 serialNr LEQ0116953&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 subType switch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem SET WEB rereadicons lassen sich die Schalter bedienen.&lt;br /&gt;
&lt;br /&gt;
== Label und Rahmen ==&lt;br /&gt;
Damit man nun weiß, was man schaltet und auch der Style stimmt, können noch folgenden Anpassungen vorgenommen werden&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/corner1_BL.svg&lt;br /&gt;
&lt;br /&gt;
[[File:corner1_BL.svg|corner1_BL]]&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/corner1_BR.svg&lt;br /&gt;
&lt;br /&gt;
[[File:corner1_BR.svg|corner1_BR]]&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/corner1_TL.svg&lt;br /&gt;
&lt;br /&gt;
[[File:corner1_TL.svg|corner1_TL]]&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/corner1_TR.svg&lt;br /&gt;
&lt;br /&gt;
[[File:corner1_TR.svg|corner1_TR]]&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/lbl_switch_kueche1.svg&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!-- Created with Inkscape (http://www.inkscape.org/) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;svg&lt;br /&gt;
   xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;&lt;br /&gt;
   xmlns:cc=&amp;quot;http://creativecommons.org/ns#&amp;quot;&lt;br /&gt;
   xmlns:rdf=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;&lt;br /&gt;
   xmlns:svg=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns:sodipodi=&amp;quot;http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd&amp;quot;&lt;br /&gt;
   xmlns:inkscape=&amp;quot;http://www.inkscape.org/namespaces/inkscape&amp;quot;&lt;br /&gt;
   width=&amp;quot;260&amp;quot;&lt;br /&gt;
   height=&amp;quot;55&amp;quot;&lt;br /&gt;
   viewBox=&amp;quot;0 0 260 55.000001&amp;quot;&lt;br /&gt;
   id=&amp;quot;svg2&amp;quot;&lt;br /&gt;
   version=&amp;quot;1.1&amp;quot;&lt;br /&gt;
   inkscape:version=&amp;quot;0.91 r13725&amp;quot;&lt;br /&gt;
   sodipodi:docname=&amp;quot;lbl_switch_kueche1.svg&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;style&lt;br /&gt;
     type=&amp;quot;text/css&amp;quot;&lt;br /&gt;
     id=&amp;quot;style3&amp;quot;&amp;gt;&lt;br /&gt;
	@font-face {&lt;br /&gt;
    font-family: &#039;lcars&#039;;&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot&#039;);&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot?#iefix&#039;) format(&#039;embedded-opentype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.woff&#039;) format(&#039;woff&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.ttf&#039;) format(&#039;truetype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.svg#lcarsgtj3lcarsgtj3&#039;) format(&#039;svg&#039;);&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;}&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;defs&lt;br /&gt;
     id=&amp;quot;defs4&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;sodipodi:namedview&lt;br /&gt;
     id=&amp;quot;base&amp;quot;&lt;br /&gt;
     pagecolor=&amp;quot;#ffffff&amp;quot;&lt;br /&gt;
     bordercolor=&amp;quot;#666666&amp;quot;&lt;br /&gt;
     borderopacity=&amp;quot;1.0&amp;quot;&lt;br /&gt;
     inkscape:pageopacity=&amp;quot;0.0&amp;quot;&lt;br /&gt;
     inkscape:pageshadow=&amp;quot;2&amp;quot;&lt;br /&gt;
     inkscape:zoom=&amp;quot;3.9185501&amp;quot;&lt;br /&gt;
     inkscape:cx=&amp;quot;133.4632&amp;quot;&lt;br /&gt;
     inkscape:cy=&amp;quot;52.4847&amp;quot;&lt;br /&gt;
     inkscape:document-units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:current-layer=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     showgrid=&amp;quot;false&amp;quot;&lt;br /&gt;
     units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:window-width=&amp;quot;1827&amp;quot;&lt;br /&gt;
     inkscape:window-height=&amp;quot;1051&amp;quot;&lt;br /&gt;
     inkscape:window-x=&amp;quot;84&amp;quot;&lt;br /&gt;
     inkscape:window-y=&amp;quot;-9&amp;quot;&lt;br /&gt;
     inkscape:window-maximized=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;metadata&lt;br /&gt;
     id=&amp;quot;metadata7&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rdf:RDF&amp;gt;&lt;br /&gt;
      &amp;lt;cc:Work&lt;br /&gt;
         rdf:about=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:format&amp;gt;image/svg+xml&amp;lt;/dc:format&amp;gt;&lt;br /&gt;
        &amp;lt;dc:type&lt;br /&gt;
           rdf:resource=&amp;quot;http://purl.org/dc/dcmitype/StillImage&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;dc:title&amp;gt;&amp;lt;/dc:title&amp;gt;&lt;br /&gt;
      &amp;lt;/cc:Work&amp;gt;&lt;br /&gt;
    &amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;
  &amp;lt;/metadata&amp;gt;&lt;br /&gt;
  &amp;lt;g&lt;br /&gt;
     inkscape:label=&amp;quot;Ebene 1&amp;quot;&lt;br /&gt;
     inkscape:groupmode=&amp;quot;layer&amp;quot;&lt;br /&gt;
     id=&amp;quot;layer1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rect&lt;br /&gt;
       style=&amp;quot;fill:#ffcc9a;fill-opacity:1&amp;quot;&lt;br /&gt;
       id=&amp;quot;rect3364&amp;quot;&lt;br /&gt;
       width=&amp;quot;260&amp;quot;&lt;br /&gt;
       height=&amp;quot;55&amp;quot;&lt;br /&gt;
       x=&amp;quot;0&amp;quot;&lt;br /&gt;
       y=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;text&lt;br /&gt;
       x=&amp;quot;255.354&amp;quot;&lt;br /&gt;
       y=&amp;quot;49.50441&amp;quot;&lt;br /&gt;
       font-size=&amp;quot;35&amp;quot;&lt;br /&gt;
       id=&amp;quot;text11&amp;quot;&lt;br /&gt;
       style=&amp;quot;font-size:35px;font-family:lcars;text-anchor:end;fill:#000000&amp;quot;&amp;gt;Küche - Glasbodenleuchte&amp;lt;/text&amp;gt;&lt;br /&gt;
  &amp;lt;/g&amp;gt;&lt;br /&gt;
&amp;lt;/svg&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/lbl_switch_kueche2.svg&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!-- Created with Inkscape (http://www.inkscape.org/) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;svg&lt;br /&gt;
   xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;&lt;br /&gt;
   xmlns:cc=&amp;quot;http://creativecommons.org/ns#&amp;quot;&lt;br /&gt;
   xmlns:rdf=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;&lt;br /&gt;
   xmlns:svg=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns:sodipodi=&amp;quot;http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd&amp;quot;&lt;br /&gt;
   xmlns:inkscape=&amp;quot;http://www.inkscape.org/namespaces/inkscape&amp;quot;&lt;br /&gt;
   width=&amp;quot;260&amp;quot;&lt;br /&gt;
   height=&amp;quot;55&amp;quot;&lt;br /&gt;
   viewBox=&amp;quot;0 0 260 55.000001&amp;quot;&lt;br /&gt;
   id=&amp;quot;svg2&amp;quot;&lt;br /&gt;
   version=&amp;quot;1.1&amp;quot;&lt;br /&gt;
   inkscape:version=&amp;quot;0.91 r13725&amp;quot;&lt;br /&gt;
   sodipodi:docname=&amp;quot;lbl_switch_kueche1.svg&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;style&lt;br /&gt;
     type=&amp;quot;text/css&amp;quot;&lt;br /&gt;
     id=&amp;quot;style3&amp;quot;&amp;gt;&lt;br /&gt;
	@font-face {&lt;br /&gt;
    font-family: &#039;lcars&#039;;&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot&#039;);&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot?#iefix&#039;) format(&#039;embedded-opentype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.woff&#039;) format(&#039;woff&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.ttf&#039;) format(&#039;truetype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.svg#lcarsgtj3lcarsgtj3&#039;) format(&#039;svg&#039;);&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;}&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;defs&lt;br /&gt;
     id=&amp;quot;defs4&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;sodipodi:namedview&lt;br /&gt;
     id=&amp;quot;base&amp;quot;&lt;br /&gt;
     pagecolor=&amp;quot;#ffffff&amp;quot;&lt;br /&gt;
     bordercolor=&amp;quot;#666666&amp;quot;&lt;br /&gt;
     borderopacity=&amp;quot;1.0&amp;quot;&lt;br /&gt;
     inkscape:pageopacity=&amp;quot;0.0&amp;quot;&lt;br /&gt;
     inkscape:pageshadow=&amp;quot;2&amp;quot;&lt;br /&gt;
     inkscape:zoom=&amp;quot;3.9185501&amp;quot;&lt;br /&gt;
     inkscape:cx=&amp;quot;133.4632&amp;quot;&lt;br /&gt;
     inkscape:cy=&amp;quot;52.4847&amp;quot;&lt;br /&gt;
     inkscape:document-units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:current-layer=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     showgrid=&amp;quot;false&amp;quot;&lt;br /&gt;
     units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:window-width=&amp;quot;1827&amp;quot;&lt;br /&gt;
     inkscape:window-height=&amp;quot;1051&amp;quot;&lt;br /&gt;
     inkscape:window-x=&amp;quot;84&amp;quot;&lt;br /&gt;
     inkscape:window-y=&amp;quot;-9&amp;quot;&lt;br /&gt;
     inkscape:window-maximized=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;metadata&lt;br /&gt;
     id=&amp;quot;metadata7&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rdf:RDF&amp;gt;&lt;br /&gt;
      &amp;lt;cc:Work&lt;br /&gt;
         rdf:about=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:format&amp;gt;image/svg+xml&amp;lt;/dc:format&amp;gt;&lt;br /&gt;
        &amp;lt;dc:type&lt;br /&gt;
           rdf:resource=&amp;quot;http://purl.org/dc/dcmitype/StillImage&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;dc:title&amp;gt;&amp;lt;/dc:title&amp;gt;&lt;br /&gt;
      &amp;lt;/cc:Work&amp;gt;&lt;br /&gt;
    &amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;
  &amp;lt;/metadata&amp;gt;&lt;br /&gt;
  &amp;lt;g&lt;br /&gt;
     inkscape:label=&amp;quot;Ebene 1&amp;quot;&lt;br /&gt;
     inkscape:groupmode=&amp;quot;layer&amp;quot;&lt;br /&gt;
     id=&amp;quot;layer1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rect&lt;br /&gt;
       style=&amp;quot;fill:#ffcc9a;fill-opacity:1&amp;quot;&lt;br /&gt;
       id=&amp;quot;rect3364&amp;quot;&lt;br /&gt;
       width=&amp;quot;260&amp;quot;&lt;br /&gt;
       height=&amp;quot;55&amp;quot;&lt;br /&gt;
       x=&amp;quot;0&amp;quot;&lt;br /&gt;
       y=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;text&lt;br /&gt;
       x=&amp;quot;255.354&amp;quot;&lt;br /&gt;
       y=&amp;quot;49.50441&amp;quot;&lt;br /&gt;
       font-size=&amp;quot;35&amp;quot;&lt;br /&gt;
       id=&amp;quot;text11&amp;quot;&lt;br /&gt;
       style=&amp;quot;font-size:35px;font-family:lcars;text-anchor:end;fill:#000000&amp;quot;&amp;gt;Küche - Deckenleuchte&amp;lt;/text&amp;gt;&lt;br /&gt;
  &amp;lt;/g&amp;gt;&lt;br /&gt;
&amp;lt;/svg&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/headline_switches.svg&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!-- Created with Inkscape (http://www.inkscape.org/) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;svg&lt;br /&gt;
   xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;&lt;br /&gt;
   xmlns:cc=&amp;quot;http://creativecommons.org/ns#&amp;quot;&lt;br /&gt;
   xmlns:rdf=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;&lt;br /&gt;
   xmlns:svg=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns:sodipodi=&amp;quot;http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd&amp;quot;&lt;br /&gt;
   xmlns:inkscape=&amp;quot;http://www.inkscape.org/namespaces/inkscape&amp;quot;&lt;br /&gt;
   width=&amp;quot;205&amp;quot;&lt;br /&gt;
   height=&amp;quot;35&amp;quot;&lt;br /&gt;
   viewBox=&amp;quot;0 0 205 35&amp;quot;&lt;br /&gt;
   id=&amp;quot;svg2&amp;quot;&lt;br /&gt;
   version=&amp;quot;1.1&amp;quot;&lt;br /&gt;
   inkscape:version=&amp;quot;0.91 r13725&amp;quot;&lt;br /&gt;
   sodipodi:docname=&amp;quot;headline_switches.svg&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;style&lt;br /&gt;
     type=&amp;quot;text/css&amp;quot;&lt;br /&gt;
     id=&amp;quot;style3&amp;quot;&amp;gt;&lt;br /&gt;
	@font-face {&lt;br /&gt;
    font-family: &#039;lcars&#039;;&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot&#039;);&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot?#iefix&#039;) format(&#039;embedded-opentype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.woff&#039;) format(&#039;woff&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.ttf&#039;) format(&#039;truetype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.svg#lcarsgtj3lcarsgtj3&#039;) format(&#039;svg&#039;);&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;}&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;defs&lt;br /&gt;
     id=&amp;quot;defs4&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;sodipodi:namedview&lt;br /&gt;
     id=&amp;quot;base&amp;quot;&lt;br /&gt;
     pagecolor=&amp;quot;#ffffff&amp;quot;&lt;br /&gt;
     bordercolor=&amp;quot;#666666&amp;quot;&lt;br /&gt;
     borderopacity=&amp;quot;1.0&amp;quot;&lt;br /&gt;
     inkscape:pageopacity=&amp;quot;0.0&amp;quot;&lt;br /&gt;
     inkscape:pageshadow=&amp;quot;2&amp;quot;&lt;br /&gt;
     inkscape:zoom=&amp;quot;3.9185501&amp;quot;&lt;br /&gt;
     inkscape:cx=&amp;quot;62.84951&amp;quot;&lt;br /&gt;
     inkscape:cy=&amp;quot;52.357102&amp;quot;&lt;br /&gt;
     inkscape:document-units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:current-layer=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     showgrid=&amp;quot;false&amp;quot;&lt;br /&gt;
     units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:window-width=&amp;quot;1827&amp;quot;&lt;br /&gt;
     inkscape:window-height=&amp;quot;1051&amp;quot;&lt;br /&gt;
     inkscape:window-x=&amp;quot;84&amp;quot;&lt;br /&gt;
     inkscape:window-y=&amp;quot;-9&amp;quot;&lt;br /&gt;
     inkscape:window-maximized=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;metadata&lt;br /&gt;
     id=&amp;quot;metadata7&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rdf:RDF&amp;gt;&lt;br /&gt;
      &amp;lt;cc:Work&lt;br /&gt;
         rdf:about=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:format&amp;gt;image/svg+xml&amp;lt;/dc:format&amp;gt;&lt;br /&gt;
        &amp;lt;dc:type&lt;br /&gt;
           rdf:resource=&amp;quot;http://purl.org/dc/dcmitype/StillImage&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;dc:title&amp;gt;&amp;lt;/dc:title&amp;gt;&lt;br /&gt;
      &amp;lt;/cc:Work&amp;gt;&lt;br /&gt;
    &amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;
  &amp;lt;/metadata&amp;gt;&lt;br /&gt;
  &amp;lt;g&lt;br /&gt;
     inkscape:label=&amp;quot;Ebene 1&amp;quot;&lt;br /&gt;
     inkscape:groupmode=&amp;quot;layer&amp;quot;&lt;br /&gt;
     id=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     transform=&amp;quot;translate(0,0)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;text&lt;br /&gt;
       x=&amp;quot;205&amp;quot;&lt;br /&gt;
       y=&amp;quot;35&amp;quot;&lt;br /&gt;
       font-size=&amp;quot;35&amp;quot;&lt;br /&gt;
       id=&amp;quot;text11&amp;quot;&lt;br /&gt;
       style=&amp;quot;font-size:35px;font-family:lcars;text-anchor:end;fill:#ff9900&amp;quot;&amp;gt;Beleuchtung&amp;lt;/text&amp;gt;&lt;br /&gt;
  &amp;lt;/g&amp;gt;&lt;br /&gt;
&amp;lt;/svg&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/line1.svg&lt;br /&gt;
&lt;br /&gt;
[[File:line1.svg|line1]]&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/line2.svg&lt;br /&gt;
&lt;br /&gt;
[[File:line2.svg|line2]]&lt;br /&gt;
&lt;br /&gt;
Die Einträge in der fhem.cfg&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#---Rahmen Elemente&lt;br /&gt;
define corner1_tl weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/corner1_TL.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr corner1_tl fp_LCARS_EG 200,1200,0,&lt;br /&gt;
define corner1_bl weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/corner1_BL.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr corner1_bl fp_LCARS_EG 590,1200,0,&lt;br /&gt;
define corner1_tr weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/corner1_TR.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr corner1_tr fp_LCARS_EG 200,1700,0,&lt;br /&gt;
define corner1_br weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/corner1_BR.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr corner1_br fp_LCARS_EG 590,1700,0,&lt;br /&gt;
define line1_l weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/line1.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr line1_l fp_LCARS_EG 235,1200,0,&lt;br /&gt;
define line2_b weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/line2.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr line2_b fp_LCARS_EG 601,1230,0,&lt;br /&gt;
define headline_switches weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/headline_switches.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr headline_switches fp_LCARS_EG 183,1481,0,&lt;br /&gt;
&lt;br /&gt;
#Label&lt;br /&gt;
define lbl_switch_kueche1 weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/lbl_switch_kueche1.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr lbl_switch_kueche1 fp_LCARS_EG 230,1250,0,&lt;br /&gt;
define lbl_switch_kueche2 weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/lbl_switch_kueche2.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr lbl_switch_kueche2 fp_LCARS_EG 295,1250,0,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem SET WEB rereadicons sind nun Labels und Rahmen sichtbar. &lt;br /&gt;
&lt;br /&gt;
Die Grundlagen sind da, die Floorpläne können nun an eigenen Bedürfnisse angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Erweiterung Slider ==&lt;br /&gt;
Für die Slider gibt es die beiden Dateien slider.svg und slider_handle.svg, welche fhem/www/images/default/lcars/ kopiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
[[File:Slider.svg|Silder]]&lt;br /&gt;
&lt;br /&gt;
[[File:Slider_handle.svg|Silder]]&lt;br /&gt;
&lt;br /&gt;
In der verwendeten CSS-Datei muss nun der Style des Slider und Handle wie folgt angepasst werden. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* detail-selector &amp;amp; slider */&lt;br /&gt;
select {  margin-left:5px; margin-right:5px; }&lt;br /&gt;
.set,.attr { margin-bottom:5px; float:left; }&lt;br /&gt;
.slider { float:left; width:190px; height:55px; border:0px solid; color:grey; background-image:url(/fhem/icons/lcars/slider.svg)}&lt;br /&gt;
.set .slider { background:#F0F0D8; border-radius:8px; }&lt;br /&gt;
/* timepicker */&lt;br /&gt;
.set .set { margin-bottom:2px; margin-top:3px; }&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
*handle = Darstellung des Sliders&lt;br /&gt;
*/&lt;br /&gt;
.handle { margin-top:0px; position:relative; cursor:pointer; width:40px;&lt;br /&gt;
          height:17px; line-height:20px; user-select:none; font-size: 20px;&lt;br /&gt;
          border:0px solid; color:#ff9900; background-image:url(/fhem/icons/lcars/slider_handle.svg); text-align:center; padding-top:38px;} &lt;br /&gt;
.downText { margin-top:2px; }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Erklärung:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.slider { ... width:190px; height:55px; border:0px solid; ... background-image:url(/fhem/icons/lcars/slider.svg)}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Breite und Höhe entspricht der Größe der slider.svg. Es gibt keinen Rahmen und die URL zum slider.svg wird gesetzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.handle { ... font-size: 20px; ...  background-image:url(/fhem/icons/lcars/slider_handle.svg); text-align:center; padding-top:38px;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Schriftgröße auf 20px setzen. Die URL des slider_handle.svg setzen und den Text um 38px nach unten verschieben. Dadurch steht dieser unterhalb des Dreiecks.&lt;br /&gt;
&lt;br /&gt;
Nun kann der Slider in der fhem.cfg verwendet werden (Beispiel eines Homeatic-Dimmers)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define HMW_LC_Dim1L_DR_MEQ0311914_03 HM485 0001308E_03&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 alias wo_dimmer_01&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 firmwareVersion 3.03&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 fp_LCARS_EG 357,1515,7,&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 model HMW_LC_Dim1L_DR&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 serialNr MEQ0311914&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 subType dimmer&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 webCmd level&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* {{Link2Forum|Topic=26673|LinkText=Foren-Thema zum LCARS-Floorplan}}&lt;br /&gt;
* [http://www.gtjlcars.de Hintergrundinformationen zu LCARS]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Maxix2</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Floorplan_im_LCARS_Design&amp;diff=15826</id>
		<title>Floorplan im LCARS Design</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Floorplan_im_LCARS_Design&amp;diff=15826"/>
		<updated>2016-07-16T08:52:44Z</updated>

		<summary type="html">&lt;p&gt;Maxix2: Nach der Datei-Zusammenstellung sind alle Fonts unter /lcars und nicht direkt unter default.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In diesem Wiki geht es um die Erstellung eines [[FLOORPLAN|Floorplans]] im &#039;&#039;&#039;LCARS Design&#039;&#039;&#039;, siehe [https://www.google.de/search?q=LCARS&amp;amp;client=opera&amp;amp;hs=3Zm&amp;amp;tbm=isch&amp;amp;tbo=u&amp;amp;source=univ&amp;amp;sa=X&amp;amp;ei=W2czVcmtKIOksAGp0oCICA&amp;amp;ved=0CCEQsAQ&amp;amp;biw=1920&amp;amp;bih=971/ LCARS Beispiele].&lt;br /&gt;
&lt;br /&gt;
Es gibt auf Fhem.de einen [http://fhem.de/forum_22336.jpg Screenshot] eines Floorplans im LCARS Design.&lt;br /&gt;
&lt;br /&gt;
In {{Link2Forum|Topic=22336|Message=180850|LinkText=diesem Forenbeitrag}} tauchte obiges Design erstmals auf, entwickelt wurde es von Forenbenutzer {{Link2FU|4194|Tion}}.&lt;br /&gt;
&lt;br /&gt;
== Screenshot 1 ==&lt;br /&gt;
[[File:lcars_all.jpg|600px|Übersicht]]&lt;br /&gt;
&lt;br /&gt;
( Die 3D-Darstellung des Erdgeschosses ist nicht beschrieben, da dies nicht lcars-spezifisch ist)&lt;br /&gt;
&lt;br /&gt;
== Anlegen der Floorpläne ==&lt;br /&gt;
In der [[Konfiguration]] wurden die Floorpläne für Status, Erdgeschoss, Obergeschoss und Garten angelegt, welche alle auf die gleiche CSS-Datei fhem/www/pgm2/floorplanstyle_lcars.css verweisen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Floorpläne&lt;br /&gt;
define LCARS_STATUS FLOORPLAN&lt;br /&gt;
attr LCARS_STATUS fp_noMenu 1&lt;br /&gt;
attr LCARS_STATUS stylesheet floorplanstyle_lcars.css&lt;br /&gt;
&lt;br /&gt;
define LCARS_EG FLOORPLAN&lt;br /&gt;
attr LCARS_EG fp_noMenu 1&lt;br /&gt;
attr LCARS_EG stylesheet floorplanstyle_lcars.css&lt;br /&gt;
&lt;br /&gt;
define LCARS_OG FLOORPLAN&lt;br /&gt;
attr LCARS_OG fp_noMenu 1&lt;br /&gt;
attr LCARS_OG stylesheet floorplanstyle_lcars.css&lt;br /&gt;
&lt;br /&gt;
define LCARS_GARTEN FLOORPLAN&lt;br /&gt;
attr LCARS_GARTEN fp_noMenu 1&lt;br /&gt;
attr LCARS_GARTEN stylesheet floorplanstyle_lcars.css&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einbinden des Hintergrundbildes ==&lt;br /&gt;
[[Datei:Background.svg|mini|right|300px|Das Hintergrundbild als SVG-Datei]]&lt;br /&gt;
Als Hintergrund wurde die Vektorgrafik fhem/www/images/default/lcars/background.svg angelegt und diese über die CSS-Datei eingebunden.&lt;br /&gt;
&lt;br /&gt;
Eintrag in der CSS-Datei:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
body { background-color:#ffffff;&lt;br /&gt;
	  background-image: url(/fhem/icons/lcars/background.svg);&lt;br /&gt;
	  background-size: 1920px 1080px;&lt;br /&gt;
	  overflow:hidden;&lt;br /&gt;
	  background-position: 0px 0px}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun noch die Anweisung &amp;lt;code&amp;gt;set WEB rereadicons&amp;lt;/code&amp;gt; durchführen und der Floorplan zeigt den Hintergrund im LCARS-Design an.&lt;br /&gt;
&lt;br /&gt;
== LCARS - Schrift ==&lt;br /&gt;
Die in &#039;&#039;Star Trek - The Next Generation&#039;&#039; verwendete Schrift für die LCARS-Konsolen war die Helvetica Ultra Compressed, wobei ausschließlich Großbuchstaben verwendet wurden. ([http://www.gtjlcars.de/LCARSindex/LCARSFONTS.htm Quelle: www.gtjlcars.de]) Die Schrift kann man als TrueType-Font online kaufen, allerdings gibt es als Alternative die LCARS GTJ3 zum freien [http://www.gtjlcars.de/LCARSGTJ3.zip Download].&lt;br /&gt;
&lt;br /&gt;
Um die richtige Schriftart clientunabhängig anzeigen zu können, wird die Schrift mit Hilfe des [http://www.fontsquirrel.com/tools/webfont-generator Webfont Generators] von Font Squirrel die TTF-Datei in Webfont umgewandelt.  &lt;br /&gt;
&lt;br /&gt;
Es werden folgende Dateien generiert:&lt;br /&gt;
* fhem/www/images/default/lcars/lcarsgtj3-webfont.eot&lt;br /&gt;
* fhem/www/images/default/lcars/lcarsgtj3-webfont.svg&lt;br /&gt;
* fhem/www/images/default/lcars/lcarsgtj3-webfont.eot&lt;br /&gt;
* fhem/www/images/default/lcars/lcarsgtj3-webfont.ttf&lt;br /&gt;
* fhem/www/images/default/lcars/lcarsgtj3-webfont.woff&lt;br /&gt;
* fhem/www/images/default/lcars/lcarsgtj3-webfont.woff2&lt;br /&gt;
&lt;br /&gt;
Diese Webfont-Dateien müssen ins Verzeichnis fhem/www/images/... kopiert werden, damit sie genutzt werden können.&lt;br /&gt;
&lt;br /&gt;
== Das Navigationsmenü ==&lt;br /&gt;
Für das Navigationsmenü gibt es jeweils eine SVG-Datei, welche dann in der fhem.cfg eingebunden wird.&lt;br /&gt;
* /www/images/default/lcars/menue_EG.svg&lt;br /&gt;
* /www/images/default/lcars/menue_Garten.svg&lt;br /&gt;
* /www/images/default/lcars/menue_OG.svg&lt;br /&gt;
* /www/images/default/lcars/menue_status.svg&lt;br /&gt;
&lt;br /&gt;
Als Beispiel die SVG-Datei für den Menüpunkt &amp;quot;Status&amp;quot;. Bei den anderen Dateien ändert sich nur der Text im Text-Tag. In diesen sind jeweils die Webfont-Dateien eingebunden. Dies ist erforderlich, weil die SVG-Dateien über die fhem.cfg via HTML-Code über das Object-Tag eingebunden werden. In diesem Fall wirken die Einstellungen aus der CSS-Datei nicht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!-- Created with Inkscape (http://www.inkscape.org/) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;svg&lt;br /&gt;
   xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;&lt;br /&gt;
   xmlns:cc=&amp;quot;http://creativecommons.org/ns#&amp;quot;&lt;br /&gt;
   xmlns:rdf=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;&lt;br /&gt;
   xmlns:svg=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns:sodipodi=&amp;quot;http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd&amp;quot;&lt;br /&gt;
   xmlns:inkscape=&amp;quot;http://www.inkscape.org/namespaces/inkscape&amp;quot;&lt;br /&gt;
   xmlns:xlink=&amp;quot;http://www.w3.org/1999/xlink&amp;quot;&lt;br /&gt;
   width=&amp;quot;130&amp;quot;&lt;br /&gt;
   height=&amp;quot;55&amp;quot;&lt;br /&gt;
   viewBox=&amp;quot;0 0 130 55.000001&amp;quot;&lt;br /&gt;
   id=&amp;quot;svg2&amp;quot;&lt;br /&gt;
   version=&amp;quot;1.1&amp;quot;&lt;br /&gt;
   inkscape:version=&amp;quot;0.91 r13725&amp;quot;&lt;br /&gt;
   sodipodi:docname=&amp;quot;switch_off.svg&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;style&lt;br /&gt;
     type=&amp;quot;text/css&amp;quot;&lt;br /&gt;
     id=&amp;quot;style3&amp;quot;&amp;gt;&lt;br /&gt;
	@font-face {&lt;br /&gt;
    font-family: &#039;lcars&#039;;&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot&#039;);&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot?#iefix&#039;) format(&#039;embedded-opentype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.woff&#039;) format(&#039;woff&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.ttf&#039;) format(&#039;truetype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.svg#lcarsgtj3lcarsgtj3&#039;) format(&#039;svg&#039;);&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;}&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;defs&lt;br /&gt;
     id=&amp;quot;defs4&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;sodipodi:namedview&lt;br /&gt;
     id=&amp;quot;base&amp;quot;&lt;br /&gt;
     pagecolor=&amp;quot;#ffffff&amp;quot;&lt;br /&gt;
     bordercolor=&amp;quot;#666666&amp;quot;&lt;br /&gt;
     borderopacity=&amp;quot;1.0&amp;quot;&lt;br /&gt;
     inkscape:pageopacity=&amp;quot;0.0&amp;quot;&lt;br /&gt;
     inkscape:pageshadow=&amp;quot;2&amp;quot;&lt;br /&gt;
     inkscape:zoom=&amp;quot;3.9185501&amp;quot;&lt;br /&gt;
     inkscape:cx=&amp;quot;8.571662&amp;quot;&lt;br /&gt;
     inkscape:cy=&amp;quot;52.612298&amp;quot;&lt;br /&gt;
     inkscape:document-units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:current-layer=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     showgrid=&amp;quot;false&amp;quot;&lt;br /&gt;
     units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:window-width=&amp;quot;1827&amp;quot;&lt;br /&gt;
     inkscape:window-height=&amp;quot;1051&amp;quot;&lt;br /&gt;
     inkscape:window-x=&amp;quot;84&amp;quot;&lt;br /&gt;
     inkscape:window-y=&amp;quot;-9&amp;quot;&lt;br /&gt;
     inkscape:window-maximized=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;metadata&lt;br /&gt;
     id=&amp;quot;metadata7&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rdf:RDF&amp;gt;&lt;br /&gt;
      &amp;lt;cc:Work&lt;br /&gt;
         rdf:about=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:format&amp;gt;image/svg+xml&amp;lt;/dc:format&amp;gt;&lt;br /&gt;
        &amp;lt;dc:type&lt;br /&gt;
           rdf:resource=&amp;quot;http://purl.org/dc/dcmitype/StillImage&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;dc:title /&amp;gt;&lt;br /&gt;
      &amp;lt;/cc:Work&amp;gt;&lt;br /&gt;
    &amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;
  &amp;lt;/metadata&amp;gt;&lt;br /&gt;
  &amp;lt;g&lt;br /&gt;
     inkscape:label=&amp;quot;Ebene 1&amp;quot;&lt;br /&gt;
     inkscape:groupmode=&amp;quot;layer&amp;quot;&lt;br /&gt;
     id=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     transform=&amp;quot;translate(0,0)&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;rect&lt;br /&gt;
       style=&amp;quot;fill:#ff9900;fill-opacity:1&amp;quot;&lt;br /&gt;
       id=&amp;quot;rect3364&amp;quot;&lt;br /&gt;
       width=&amp;quot;130&amp;quot;&lt;br /&gt;
       height=&amp;quot;55&amp;quot;&lt;br /&gt;
       x=&amp;quot;0&amp;quot;&lt;br /&gt;
       y=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;text&lt;br /&gt;
       x=&amp;quot;125&amp;quot;&lt;br /&gt;
       y=&amp;quot;50&amp;quot;&lt;br /&gt;
       text-anchor=&amp;quot;end&amp;quot;&lt;br /&gt;
       font-size=&amp;quot;35&amp;quot;&lt;br /&gt;
       font-family=&amp;quot;lcars&amp;quot;&lt;br /&gt;
       fill=&amp;quot;#000000&amp;quot;&lt;br /&gt;
       id=&amp;quot;text11&amp;quot;&amp;gt;Status&amp;lt;/text&amp;gt;&lt;br /&gt;
  &amp;lt;/g&amp;gt;&lt;br /&gt;
&amp;lt;/svg&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Einbindung in der fhem.cfg:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Menü definieren&lt;br /&gt;
#Class für den Link auf SVG setzen, um auf gesamtes SVG-Bild klicken zu können&lt;br /&gt;
#SVG-Class dafür in der CSS-Datei definieren&lt;br /&gt;
define Menue_Status weblink htmlCode {&#039;&amp;lt;a class=&amp;quot;svg&amp;quot; href=&amp;quot;/fhem/floorplan/LCARS_STATUS&amp;quot;&amp;gt;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/menue_status.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&amp;lt;/a&amp;gt;&#039;}&lt;br /&gt;
attr Menue_Status fp_LCARS_EG 160,10,0,&lt;br /&gt;
attr Menue_Status fp_LCARS_GARTEN 160,10,0,&lt;br /&gt;
attr Menue_Status fp_LCARS_OG 160,10,0,&lt;br /&gt;
attr Menue_Status fp_LCARS_STATUS 160,10,0,&lt;br /&gt;
&lt;br /&gt;
define Menue_EG weblink htmlCode {&#039;&amp;lt;a class=&amp;quot;svg&amp;quot; href=&amp;quot;/fhem/floorplan/LCARS_EG&amp;quot;&amp;gt;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/menue_EG.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&amp;lt;/a&amp;gt;&#039; }&lt;br /&gt;
attr Menue_EG fp_LCARS_EG 225,10,0,&lt;br /&gt;
attr Menue_EG fp_LCARS_GARTEN 225,10,0,&lt;br /&gt;
attr Menue_EG fp_LCARS_OG 225,10,0,&lt;br /&gt;
attr Menue_EG fp_LCARS_STATUS 225,10,0,&lt;br /&gt;
&lt;br /&gt;
define Menue_OG weblink htmlCode {&#039;&amp;lt;a class=&amp;quot;svg&amp;quot; href=&amp;quot;/fhem/floorplan/LCARS_OG&amp;quot;&amp;gt;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/menue_OG.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&amp;lt;/a&amp;gt;&#039; }&lt;br /&gt;
attr Menue_OG fp_LCARS_EG 290,10,0,&lt;br /&gt;
attr Menue_OG fp_LCARS_GARTEN 290,10,0,&lt;br /&gt;
attr Menue_OG fp_LCARS_OG 290,10,0,&lt;br /&gt;
attr Menue_OG fp_LCARS_STATUS 290,10,0,&lt;br /&gt;
&lt;br /&gt;
define Menue_Garten weblink htmlCode {&#039;&amp;lt;a class=&amp;quot;svg&amp;quot; href=&amp;quot;/fhem/floorplan/LCARS_GARTEN&amp;quot;&amp;gt;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/menue_Garten.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&amp;lt;/a&amp;gt;&#039; }&lt;br /&gt;
attr Menue_Garten fp_LCARS_EG 355,10,0,&lt;br /&gt;
attr Menue_Garten fp_LCARS_GARTEN 355,10,0,&lt;br /&gt;
attr Menue_Garten fp_LCARS_OG 355,10,0,&lt;br /&gt;
attr Menue_Garten fp_LCARS_STATUS 355,10,0,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erforderliche Eintrag in der CSS-Datei&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/*LCARS: SVG definieren, um auf das gesamte Bild klicken zu können*/&lt;br /&gt;
a.svg {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  display: inline-block; &lt;br /&gt;
}&lt;br /&gt;
a.svg:after {&lt;br /&gt;
  content: &amp;quot;&amp;quot;; &lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  right: 0;&lt;br /&gt;
  bottom: 0;&lt;br /&gt;
  left:0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nach einem &amp;lt;code&amp;gt;set WEB rereadicons&amp;lt;/code&amp;gt; ist die Navigation zwischen den einzelnen Floorplänen möglich.&lt;br /&gt;
&lt;br /&gt;
== Schalter für die Beleuchtung ==&lt;br /&gt;
Für die Integration der Buttons der Schalter sind folgende Anpassungen erforderlich:&lt;br /&gt;
&lt;br /&gt;
In der CSS-Datei werden die Webfonts nochmals eingebunden. Die ist erforderlich, weil durch das Device-Attribute &amp;quot;devStateIcon&amp;quot; die Inhalte der SVG-Dateien direkt in die Seite geschrieben und somit auch ein Zugriff auf die CSS-Datei möglich ist.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/*LCARS-Schriftart clientunabhängig verfügbar machen&lt;br /&gt;
Wird in SVG-Texten nochmal separat definiert, sobald die SVG im Tag&lt;br /&gt;
z.b. IMG oder OBJECT verwendet wird.&lt;br /&gt;
*/&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &#039;lcars&#039;;&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot&#039;);&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot?#iefix&#039;) format(&#039;embedded-opentype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.woff&#039;) format(&#039;woff&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.ttf&#039;) format(&#039;truetype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.svg#lcarsgtj3lcarsgtj3&#039;) format(&#039;svg&#039;);&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;&lt;br /&gt;
}&lt;br /&gt;
/*LCARS: Höhe und Breite der Schalter definieren&lt;br /&gt;
der Name svg.xxx ergibt sich, durch die Definition &amp;quot;devStateIcon off:switch_off on:switch_on:off&amp;quot;&lt;br /&gt;
in der fhem.cfg zum jeweiligen Device&lt;br /&gt;
*/&lt;br /&gt;
svg.switch_off { height:55px; width:130px; fill:#ffffff; vertical-align:middle; margin:0 0; }	&lt;br /&gt;
svg.switch_on { height:55px; width:130px; fill:#ffffff; vertical-align:middle; margin:0 0; }  &lt;br /&gt;
svg.switch_open { height:55px; width:130px; fill:#ffffff; vertical-align:middle; margin:0 0; }&lt;br /&gt;
svg.switch_close { height:55px; width:130px; fill:#ffffff; vertical-align:middle; margin:0 0; }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei fhem/www/images/default/lcars/switch_off.svg:&lt;br /&gt;
&lt;br /&gt;
[[Datei:switch_off.svg|switch_off]]&lt;br /&gt;
&lt;br /&gt;
Die Datei fhem/www/images/default/lcars/switch_on.svg:&lt;br /&gt;
&lt;br /&gt;
[[Datei:switch_on.svg|switch_on]]&lt;br /&gt;
&lt;br /&gt;
Zuweisen der SVG-Dateien in der fhem.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Icon-Pfad setzen&lt;br /&gt;
define WEB FHEMWEB 8083 global&lt;br /&gt;
[...]&lt;br /&gt;
attr WEB iconPath default:default/lcars&lt;br /&gt;
&lt;br /&gt;
Schalter Lamp1&lt;br /&gt;
define HMW_LC_Sw2_DR_LEQ0116953_03 HM485 0000B84F_03&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 alias kue_lampe_1&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 devStateIcon off:switch_off on:switch_on:off&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 firmwareVersion 3.06&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 fp_LCARS_EG 230,1500,0,&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 model HMW_LC_Sw2_DR&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 room hidden&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 serialNr LEQ0116953&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_03 subType switch&lt;br /&gt;
#Schlater Lamp2&lt;br /&gt;
define HMW_LC_Sw2_DR_LEQ0116953_04 HM485 0000B84F_04&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 alias kue_lampe_2&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 devStateIcon off:switch_off:on on:switch_on:off&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 firmwareVersion 3.06&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 fp_LCARS_EG 295,1500,0,&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 model HMW_LC_Sw2_DR&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 room hidden&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 serialNr LEQ0116953&lt;br /&gt;
attr HMW_LC_Sw2_DR_LEQ0116953_04 subType switch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem SET WEB rereadicons lassen sich die Schalter bedienen.&lt;br /&gt;
&lt;br /&gt;
== Label und Rahmen ==&lt;br /&gt;
Damit man nun weiß, was man schaltet und auch der Style stimmt, können noch folgenden Anpassungen vorgenommen werden&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/corner1_BL.svg&lt;br /&gt;
&lt;br /&gt;
[[File:corner1_BL.svg|corner1_BL]]&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/corner1_BR.svg&lt;br /&gt;
&lt;br /&gt;
[[File:corner1_BR.svg|corner1_BR]]&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/corner1_TL.svg&lt;br /&gt;
&lt;br /&gt;
[[File:corner1_TL.svg|corner1_TL]]&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/corner1_TR.svg&lt;br /&gt;
&lt;br /&gt;
[[File:corner1_TR.svg|corner1_TR]]&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/lbl_switch_kueche1.svg&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!-- Created with Inkscape (http://www.inkscape.org/) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;svg&lt;br /&gt;
   xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;&lt;br /&gt;
   xmlns:cc=&amp;quot;http://creativecommons.org/ns#&amp;quot;&lt;br /&gt;
   xmlns:rdf=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;&lt;br /&gt;
   xmlns:svg=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns:sodipodi=&amp;quot;http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd&amp;quot;&lt;br /&gt;
   xmlns:inkscape=&amp;quot;http://www.inkscape.org/namespaces/inkscape&amp;quot;&lt;br /&gt;
   width=&amp;quot;260&amp;quot;&lt;br /&gt;
   height=&amp;quot;55&amp;quot;&lt;br /&gt;
   viewBox=&amp;quot;0 0 260 55.000001&amp;quot;&lt;br /&gt;
   id=&amp;quot;svg2&amp;quot;&lt;br /&gt;
   version=&amp;quot;1.1&amp;quot;&lt;br /&gt;
   inkscape:version=&amp;quot;0.91 r13725&amp;quot;&lt;br /&gt;
   sodipodi:docname=&amp;quot;lbl_switch_kueche1.svg&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;style&lt;br /&gt;
     type=&amp;quot;text/css&amp;quot;&lt;br /&gt;
     id=&amp;quot;style3&amp;quot;&amp;gt;&lt;br /&gt;
	@font-face {&lt;br /&gt;
    font-family: &#039;lcars&#039;;&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot&#039;);&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot?#iefix&#039;) format(&#039;embedded-opentype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.woff&#039;) format(&#039;woff&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.ttf&#039;) format(&#039;truetype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.svg#lcarsgtj3lcarsgtj3&#039;) format(&#039;svg&#039;);&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;}&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;defs&lt;br /&gt;
     id=&amp;quot;defs4&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;sodipodi:namedview&lt;br /&gt;
     id=&amp;quot;base&amp;quot;&lt;br /&gt;
     pagecolor=&amp;quot;#ffffff&amp;quot;&lt;br /&gt;
     bordercolor=&amp;quot;#666666&amp;quot;&lt;br /&gt;
     borderopacity=&amp;quot;1.0&amp;quot;&lt;br /&gt;
     inkscape:pageopacity=&amp;quot;0.0&amp;quot;&lt;br /&gt;
     inkscape:pageshadow=&amp;quot;2&amp;quot;&lt;br /&gt;
     inkscape:zoom=&amp;quot;3.9185501&amp;quot;&lt;br /&gt;
     inkscape:cx=&amp;quot;133.4632&amp;quot;&lt;br /&gt;
     inkscape:cy=&amp;quot;52.4847&amp;quot;&lt;br /&gt;
     inkscape:document-units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:current-layer=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     showgrid=&amp;quot;false&amp;quot;&lt;br /&gt;
     units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:window-width=&amp;quot;1827&amp;quot;&lt;br /&gt;
     inkscape:window-height=&amp;quot;1051&amp;quot;&lt;br /&gt;
     inkscape:window-x=&amp;quot;84&amp;quot;&lt;br /&gt;
     inkscape:window-y=&amp;quot;-9&amp;quot;&lt;br /&gt;
     inkscape:window-maximized=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;metadata&lt;br /&gt;
     id=&amp;quot;metadata7&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rdf:RDF&amp;gt;&lt;br /&gt;
      &amp;lt;cc:Work&lt;br /&gt;
         rdf:about=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:format&amp;gt;image/svg+xml&amp;lt;/dc:format&amp;gt;&lt;br /&gt;
        &amp;lt;dc:type&lt;br /&gt;
           rdf:resource=&amp;quot;http://purl.org/dc/dcmitype/StillImage&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;dc:title&amp;gt;&amp;lt;/dc:title&amp;gt;&lt;br /&gt;
      &amp;lt;/cc:Work&amp;gt;&lt;br /&gt;
    &amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;
  &amp;lt;/metadata&amp;gt;&lt;br /&gt;
  &amp;lt;g&lt;br /&gt;
     inkscape:label=&amp;quot;Ebene 1&amp;quot;&lt;br /&gt;
     inkscape:groupmode=&amp;quot;layer&amp;quot;&lt;br /&gt;
     id=&amp;quot;layer1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rect&lt;br /&gt;
       style=&amp;quot;fill:#ffcc9a;fill-opacity:1&amp;quot;&lt;br /&gt;
       id=&amp;quot;rect3364&amp;quot;&lt;br /&gt;
       width=&amp;quot;260&amp;quot;&lt;br /&gt;
       height=&amp;quot;55&amp;quot;&lt;br /&gt;
       x=&amp;quot;0&amp;quot;&lt;br /&gt;
       y=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;text&lt;br /&gt;
       x=&amp;quot;255.354&amp;quot;&lt;br /&gt;
       y=&amp;quot;49.50441&amp;quot;&lt;br /&gt;
       font-size=&amp;quot;35&amp;quot;&lt;br /&gt;
       id=&amp;quot;text11&amp;quot;&lt;br /&gt;
       style=&amp;quot;font-size:35px;font-family:lcars;text-anchor:end;fill:#000000&amp;quot;&amp;gt;Küche - Glasbodenleuchte&amp;lt;/text&amp;gt;&lt;br /&gt;
  &amp;lt;/g&amp;gt;&lt;br /&gt;
&amp;lt;/svg&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/lbl_switch_kueche2.svg&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!-- Created with Inkscape (http://www.inkscape.org/) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;svg&lt;br /&gt;
   xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;&lt;br /&gt;
   xmlns:cc=&amp;quot;http://creativecommons.org/ns#&amp;quot;&lt;br /&gt;
   xmlns:rdf=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;&lt;br /&gt;
   xmlns:svg=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns:sodipodi=&amp;quot;http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd&amp;quot;&lt;br /&gt;
   xmlns:inkscape=&amp;quot;http://www.inkscape.org/namespaces/inkscape&amp;quot;&lt;br /&gt;
   width=&amp;quot;260&amp;quot;&lt;br /&gt;
   height=&amp;quot;55&amp;quot;&lt;br /&gt;
   viewBox=&amp;quot;0 0 260 55.000001&amp;quot;&lt;br /&gt;
   id=&amp;quot;svg2&amp;quot;&lt;br /&gt;
   version=&amp;quot;1.1&amp;quot;&lt;br /&gt;
   inkscape:version=&amp;quot;0.91 r13725&amp;quot;&lt;br /&gt;
   sodipodi:docname=&amp;quot;lbl_switch_kueche1.svg&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;style&lt;br /&gt;
     type=&amp;quot;text/css&amp;quot;&lt;br /&gt;
     id=&amp;quot;style3&amp;quot;&amp;gt;&lt;br /&gt;
	@font-face {&lt;br /&gt;
    font-family: &#039;lcars&#039;;&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot&#039;);&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot?#iefix&#039;) format(&#039;embedded-opentype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.woff&#039;) format(&#039;woff&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.ttf&#039;) format(&#039;truetype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.svg#lcarsgtj3lcarsgtj3&#039;) format(&#039;svg&#039;);&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;}&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;defs&lt;br /&gt;
     id=&amp;quot;defs4&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;sodipodi:namedview&lt;br /&gt;
     id=&amp;quot;base&amp;quot;&lt;br /&gt;
     pagecolor=&amp;quot;#ffffff&amp;quot;&lt;br /&gt;
     bordercolor=&amp;quot;#666666&amp;quot;&lt;br /&gt;
     borderopacity=&amp;quot;1.0&amp;quot;&lt;br /&gt;
     inkscape:pageopacity=&amp;quot;0.0&amp;quot;&lt;br /&gt;
     inkscape:pageshadow=&amp;quot;2&amp;quot;&lt;br /&gt;
     inkscape:zoom=&amp;quot;3.9185501&amp;quot;&lt;br /&gt;
     inkscape:cx=&amp;quot;133.4632&amp;quot;&lt;br /&gt;
     inkscape:cy=&amp;quot;52.4847&amp;quot;&lt;br /&gt;
     inkscape:document-units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:current-layer=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     showgrid=&amp;quot;false&amp;quot;&lt;br /&gt;
     units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:window-width=&amp;quot;1827&amp;quot;&lt;br /&gt;
     inkscape:window-height=&amp;quot;1051&amp;quot;&lt;br /&gt;
     inkscape:window-x=&amp;quot;84&amp;quot;&lt;br /&gt;
     inkscape:window-y=&amp;quot;-9&amp;quot;&lt;br /&gt;
     inkscape:window-maximized=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;metadata&lt;br /&gt;
     id=&amp;quot;metadata7&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rdf:RDF&amp;gt;&lt;br /&gt;
      &amp;lt;cc:Work&lt;br /&gt;
         rdf:about=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:format&amp;gt;image/svg+xml&amp;lt;/dc:format&amp;gt;&lt;br /&gt;
        &amp;lt;dc:type&lt;br /&gt;
           rdf:resource=&amp;quot;http://purl.org/dc/dcmitype/StillImage&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;dc:title&amp;gt;&amp;lt;/dc:title&amp;gt;&lt;br /&gt;
      &amp;lt;/cc:Work&amp;gt;&lt;br /&gt;
    &amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;
  &amp;lt;/metadata&amp;gt;&lt;br /&gt;
  &amp;lt;g&lt;br /&gt;
     inkscape:label=&amp;quot;Ebene 1&amp;quot;&lt;br /&gt;
     inkscape:groupmode=&amp;quot;layer&amp;quot;&lt;br /&gt;
     id=&amp;quot;layer1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rect&lt;br /&gt;
       style=&amp;quot;fill:#ffcc9a;fill-opacity:1&amp;quot;&lt;br /&gt;
       id=&amp;quot;rect3364&amp;quot;&lt;br /&gt;
       width=&amp;quot;260&amp;quot;&lt;br /&gt;
       height=&amp;quot;55&amp;quot;&lt;br /&gt;
       x=&amp;quot;0&amp;quot;&lt;br /&gt;
       y=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;text&lt;br /&gt;
       x=&amp;quot;255.354&amp;quot;&lt;br /&gt;
       y=&amp;quot;49.50441&amp;quot;&lt;br /&gt;
       font-size=&amp;quot;35&amp;quot;&lt;br /&gt;
       id=&amp;quot;text11&amp;quot;&lt;br /&gt;
       style=&amp;quot;font-size:35px;font-family:lcars;text-anchor:end;fill:#000000&amp;quot;&amp;gt;Küche - Deckenleuchte&amp;lt;/text&amp;gt;&lt;br /&gt;
  &amp;lt;/g&amp;gt;&lt;br /&gt;
&amp;lt;/svg&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/headline_switches.svg&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!-- Created with Inkscape (http://www.inkscape.org/) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;svg&lt;br /&gt;
   xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;&lt;br /&gt;
   xmlns:cc=&amp;quot;http://creativecommons.org/ns#&amp;quot;&lt;br /&gt;
   xmlns:rdf=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;&lt;br /&gt;
   xmlns:svg=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;br /&gt;
   xmlns:sodipodi=&amp;quot;http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd&amp;quot;&lt;br /&gt;
   xmlns:inkscape=&amp;quot;http://www.inkscape.org/namespaces/inkscape&amp;quot;&lt;br /&gt;
   width=&amp;quot;205&amp;quot;&lt;br /&gt;
   height=&amp;quot;35&amp;quot;&lt;br /&gt;
   viewBox=&amp;quot;0 0 205 35&amp;quot;&lt;br /&gt;
   id=&amp;quot;svg2&amp;quot;&lt;br /&gt;
   version=&amp;quot;1.1&amp;quot;&lt;br /&gt;
   inkscape:version=&amp;quot;0.91 r13725&amp;quot;&lt;br /&gt;
   sodipodi:docname=&amp;quot;headline_switches.svg&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;style&lt;br /&gt;
     type=&amp;quot;text/css&amp;quot;&lt;br /&gt;
     id=&amp;quot;style3&amp;quot;&amp;gt;&lt;br /&gt;
	@font-face {&lt;br /&gt;
    font-family: &#039;lcars&#039;;&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot&#039;);&lt;br /&gt;
    src: url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.eot?#iefix&#039;) format(&#039;embedded-opentype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.woff&#039;) format(&#039;woff&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.ttf&#039;) format(&#039;truetype&#039;),&lt;br /&gt;
         url(&#039;/fhem/images/default/lcars/lcarsgtj3-webfont.svg#lcarsgtj3lcarsgtj3&#039;) format(&#039;svg&#039;);&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;}&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;defs&lt;br /&gt;
     id=&amp;quot;defs4&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;sodipodi:namedview&lt;br /&gt;
     id=&amp;quot;base&amp;quot;&lt;br /&gt;
     pagecolor=&amp;quot;#ffffff&amp;quot;&lt;br /&gt;
     bordercolor=&amp;quot;#666666&amp;quot;&lt;br /&gt;
     borderopacity=&amp;quot;1.0&amp;quot;&lt;br /&gt;
     inkscape:pageopacity=&amp;quot;0.0&amp;quot;&lt;br /&gt;
     inkscape:pageshadow=&amp;quot;2&amp;quot;&lt;br /&gt;
     inkscape:zoom=&amp;quot;3.9185501&amp;quot;&lt;br /&gt;
     inkscape:cx=&amp;quot;62.84951&amp;quot;&lt;br /&gt;
     inkscape:cy=&amp;quot;52.357102&amp;quot;&lt;br /&gt;
     inkscape:document-units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:current-layer=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     showgrid=&amp;quot;false&amp;quot;&lt;br /&gt;
     units=&amp;quot;px&amp;quot;&lt;br /&gt;
     inkscape:window-width=&amp;quot;1827&amp;quot;&lt;br /&gt;
     inkscape:window-height=&amp;quot;1051&amp;quot;&lt;br /&gt;
     inkscape:window-x=&amp;quot;84&amp;quot;&lt;br /&gt;
     inkscape:window-y=&amp;quot;-9&amp;quot;&lt;br /&gt;
     inkscape:window-maximized=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;metadata&lt;br /&gt;
     id=&amp;quot;metadata7&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rdf:RDF&amp;gt;&lt;br /&gt;
      &amp;lt;cc:Work&lt;br /&gt;
         rdf:about=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:format&amp;gt;image/svg+xml&amp;lt;/dc:format&amp;gt;&lt;br /&gt;
        &amp;lt;dc:type&lt;br /&gt;
           rdf:resource=&amp;quot;http://purl.org/dc/dcmitype/StillImage&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;dc:title&amp;gt;&amp;lt;/dc:title&amp;gt;&lt;br /&gt;
      &amp;lt;/cc:Work&amp;gt;&lt;br /&gt;
    &amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;
  &amp;lt;/metadata&amp;gt;&lt;br /&gt;
  &amp;lt;g&lt;br /&gt;
     inkscape:label=&amp;quot;Ebene 1&amp;quot;&lt;br /&gt;
     inkscape:groupmode=&amp;quot;layer&amp;quot;&lt;br /&gt;
     id=&amp;quot;layer1&amp;quot;&lt;br /&gt;
     transform=&amp;quot;translate(0,0)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;text&lt;br /&gt;
       x=&amp;quot;205&amp;quot;&lt;br /&gt;
       y=&amp;quot;35&amp;quot;&lt;br /&gt;
       font-size=&amp;quot;35&amp;quot;&lt;br /&gt;
       id=&amp;quot;text11&amp;quot;&lt;br /&gt;
       style=&amp;quot;font-size:35px;font-family:lcars;text-anchor:end;fill:#ff9900&amp;quot;&amp;gt;Beleuchtung&amp;lt;/text&amp;gt;&lt;br /&gt;
  &amp;lt;/g&amp;gt;&lt;br /&gt;
&amp;lt;/svg&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/line1.svg&lt;br /&gt;
&lt;br /&gt;
[[File:line1.svg|line1]]&lt;br /&gt;
&lt;br /&gt;
Datei: fhem/www/images/default/lcars/line2.svg&lt;br /&gt;
&lt;br /&gt;
[[File:line2.svg|line2]]&lt;br /&gt;
&lt;br /&gt;
Die Einträge in der fhem.cfg&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#---Rahmen Elemente&lt;br /&gt;
define corner1_tl weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/corner1_TL.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr corner1_tl fp_LCARS_EG 200,1200,0,&lt;br /&gt;
define corner1_bl weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/corner1_BL.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr corner1_bl fp_LCARS_EG 590,1200,0,&lt;br /&gt;
define corner1_tr weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/corner1_TR.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr corner1_tr fp_LCARS_EG 200,1700,0,&lt;br /&gt;
define corner1_br weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/corner1_BR.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr corner1_br fp_LCARS_EG 590,1700,0,&lt;br /&gt;
define line1_l weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/line1.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr line1_l fp_LCARS_EG 235,1200,0,&lt;br /&gt;
define line2_b weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/line2.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr line2_b fp_LCARS_EG 601,1230,0,&lt;br /&gt;
define headline_switches weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/headline_switches.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr headline_switches fp_LCARS_EG 183,1481,0,&lt;br /&gt;
&lt;br /&gt;
#Label&lt;br /&gt;
define lbl_switch_kueche1 weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/lbl_switch_kueche1.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr lbl_switch_kueche1 fp_LCARS_EG 230,1250,0,&lt;br /&gt;
define lbl_switch_kueche2 weblink htmlCode {&#039;&amp;lt;object data=&amp;quot;/fhem/icons/lcars/lbl_switch_kueche2.svg&amp;quot; type=&amp;quot;image/svg+xml&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&#039; }&lt;br /&gt;
attr lbl_switch_kueche2 fp_LCARS_EG 295,1250,0,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem SET WEB rereadicons sind nun Labels und Rahmen sichtbar. &lt;br /&gt;
&lt;br /&gt;
Die Grundlagen sind da, die Floorpläne können nun an eigenen Bedürfnisse angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Erweiterung Slider ==&lt;br /&gt;
Für die Slider gibt es die beiden Dateien slider.svg und slider_handle.svg, welche fhem/www/images/default/lcars/ kopiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
[[File:Slider.svg|Silder]]&lt;br /&gt;
&lt;br /&gt;
[[File:Slider_handle.svg|Silder]]&lt;br /&gt;
&lt;br /&gt;
In der verwendeten CSS-Datei muss nun der Style des Slider und Handle wie folgt angepasst werden. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* detail-selector &amp;amp; slider */&lt;br /&gt;
select {  margin-left:5px; margin-right:5px; }&lt;br /&gt;
.set,.attr { margin-bottom:5px; float:left; }&lt;br /&gt;
.slider { float:left; width:190px; height:55px; border:0px solid; color:grey; background-image:url(/fhem/icons/lcars/slider.svg)}&lt;br /&gt;
.set .slider { background:#F0F0D8; border-radius:8px; }&lt;br /&gt;
/* timepicker */&lt;br /&gt;
.set .set { margin-bottom:2px; margin-top:3px; }&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
*handle = Darstellung des Sliders&lt;br /&gt;
*/&lt;br /&gt;
.handle { margin-top:0px; position:relative; cursor:pointer; width:40px;&lt;br /&gt;
          height:17px; line-height:20px; user-select:none; font-size: 20px;&lt;br /&gt;
          border:0px solid; color:#ff9900; background-image:url(/fhem/icons/lcars/slider_handle.svg); text-align:center; padding-top:38px;} &lt;br /&gt;
.downText { margin-top:2px; }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Erklärung:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.slider { ... width:190px; height:55px; border:0px solid; ... background-image:url(/fhem/icons/lcars/slider.svg)}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Breite und Höhe entspricht der Größe der slider.svg. Es gibt keinen Rahmen und die URL zum slider.svg wird gesetzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.handle { ... font-size: 20px; ...  background-image:url(/fhem/icons/lcars/slider_handle.svg); text-align:center; padding-top:38px;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Schriftgröße auf 20px setzen. Die URL des slider_handle.svg setzen und den Text um 38px nach unten verschieben. Dadurch steht dieser unterhalb des Dreiecks.&lt;br /&gt;
&lt;br /&gt;
Nun kann der Slider in der fhem.cfg verwendet werden (Beispiel eines Homeatic-Dimmers)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define HMW_LC_Dim1L_DR_MEQ0311914_03 HM485 0001308E_03&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 alias wo_dimmer_01&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 firmwareVersion 3.03&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 fp_LCARS_EG 357,1515,7,&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 model HMW_LC_Dim1L_DR&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 serialNr MEQ0311914&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 subType dimmer&lt;br /&gt;
attr HMW_LC_Dim1L_DR_MEQ0311914_03 webCmd level&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* {{Link2Forum|Topic=26673|LinkText=Foren-Thema zum LCARS-Floorplan}}&lt;br /&gt;
* [http://www.gtjlcars.de Hintergrundinformationen zu LCARS]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Maxix2</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=15774</id>
		<title>DevelopmentModuleIntro</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=15774"/>
		<updated>2016-07-04T16:31:37Z</updated>

		<summary type="html">&lt;p&gt;Maxix2: X_Shutdown beschrieben und X_Notify erweitert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Dieser Text ist in Arbeit und muss noch an einigen Stellen ergänzt werden. &lt;br /&gt;
Insbesondere beschreibt der Text derzeit nur einstufige Module. Die Abgrenzung zu zweistufigen Modulen und deren Eigenschaften sollte noch ergänzt werden.&lt;br /&gt;
&lt;br /&gt;
Um neue Geräte in FHEM verfügbar zu machen, kann man ein eigenes Modul in Perl schreiben, das automatisch von FHEM geladen wird, wenn ein passendes Gerät in FHEM definiert wird. Das Modul definiert dann wie mit dem Gerät kommuniziert wird, stellt Werte (&amp;quot;Readings&amp;quot;) innerhalb von FHEM zur Verfügung oder erlaubt es das Gerät mit &amp;quot;Set&amp;quot;-Befehlen zu beeinflussen. Dieser Text soll den Einstieg in die Entwicklung eigener Module erleichtern.&lt;br /&gt;
&lt;br /&gt;
Mit dem FHEM-Befehl &amp;quot;define&amp;quot;, der typischerweise in die zentrale Konfigurationsdatei fhem.cfg  eingetragen wird, werden Geräte in FHEM definiert. Der Befehl sorgt dafür dass ein neues Modul bei Bedarf geladen wird und die Initialisierungsfunktion des Moduls aufgerufen wird. &lt;br /&gt;
&lt;br /&gt;
Damit das funktioniert müssen der Name des Geräts, der Name des Moduls und der Name der Initialisierungsfunktion zueinander passen. Das folgende Beispiel soll dies verdeutlichen:&lt;br /&gt;
&lt;br /&gt;
Ein Jeelink USB-Stick in einer Fritz-Box könnte beispielsweise mit dem Befehl &amp;lt;code&amp;gt;define JeeLink1 JeeLink /dev/ttyUSB0@57600&amp;lt;/code&amp;gt; definiert werden.&lt;br /&gt;
&lt;br /&gt;
In der fhem.pl wird der define-Befehl verarbeitet, geprüft, ob ein Modul mit Namen JeeLink schon geladen ist und falls nicht ein Modul mit Namen XY_JeeLink.pm im Modulverzeichnis (bei einer FritzBox z.B. /var/media/ftp/fhem/FHEM) gesucht und dann geladen. &lt;br /&gt;
Danach wird die Funktion JeeLink_Initialize aufgerufen.&lt;br /&gt;
Die Moduldatei muss also nach dem Namen des Geräts benannt werden und eine Funktion mit dem Namen des Geräts und einer _initialize Funktion enthalten.&lt;br /&gt;
In der Initialisierungsfunktion des Moduls werden dann die Namen der aller weiteren Funktionen des Moduls, die von fhem.pl aus aufgerufen werden, bekannt gemacht. Dazu wird der Hash - das ist die zentrale Datenstruktur für jede Instanz eines Gerätes - mit entsprechenden Werten gefüllt.&lt;br /&gt;
&lt;br /&gt;
== Der Hash einer Geräteinstanz ==&lt;br /&gt;
Eine Besonderheit in Perl sind [http://de.wikipedia.org/wiki/Assoziatives_Array#Perl assoziative Arrays], (nicht ganz richtig als &amp;quot;Hash&amp;quot; bezeichnet) in denen die Adressierung nicht über eine Zählvariable erfolgt, sondern über einen beliebigen String. Die internen Abläufe bei der Adressierung führen dazu, dass die Speicherung in und der Abruf aus Hashes relativ langsam ist.&lt;br /&gt;
&lt;br /&gt;
Der zentrale Speicherort für Informationen einer Geräteinstanz bei FHEM ist ein solcher Hash, der seinerseits in fhem.pl von einem globalen Hash referenziert wird. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$defs{&#039;&#039;Devicename&#039;&#039;}&amp;lt;/code&amp;gt; in fhem.pl verweist auf den Hash der Geräteinstanz. Diesen Verweis (also nur die Adresse) bekommen die Funktionen eines Moduls übergeben, das direkt von fhem.pl aufgerufen wird. In dem Hash stehen beispielsweise die internen Werte des Geräts, die im GUI als &amp;quot;Internals&amp;quot; angezeigt werden oder die Readings des Geräts. Beispiele:&lt;br /&gt;
*&amp;lt;code&amp;gt;$hash{NAME}&amp;lt;/code&amp;gt; enthält den Namen der Geräteinstanz, &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash{TYPE}&amp;lt;/code&amp;gt;  enthält die Typbezeichnung des Geräts &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash-&amp;gt;{INTERVAL}&amp;lt;/code&amp;gt; enthält ein Abfrageintervall&lt;br /&gt;
&lt;br /&gt;
==Ausführung von Modulen==&lt;br /&gt;
FHEM führt Module normalerweise nicht parallel aus. Daher wäre es ungünstig wenn Module Werte von einem Gerät abfragen und dann auf die Antwort des Geräts warten. In dieser Zeit wäre der Rest von FHEM blockiert. Die Ein- und Ausgabe sollte ohne Blockieren erfolgen und die Verarbeitung mehrerer Ein- und Ausgabekanäle quasi parallel ermöglichen. &lt;br /&gt;
&lt;br /&gt;
Dafür werden in FHEM zwei zentrale Listen gepflegt, in der die Filedeskriptoren der geöffneten Kommunikatonsverbindungen gespeichert sein können. Auf Linux- bzw. Unix-basierten Plattformen wird der select-Befehl des Betriebssystems verwendet und entsprechend gibt es in FHEM eine selectlist, in der die Filedeskriptoren der Geräedateien (z.B. /dev/ttyUSBx etc.) gespeichert sind. &lt;br /&gt;
&lt;br /&gt;
In der zentralen Schleife von fhem.pl wird mit select überwacht, ob über eine der geöffneten Schnittstellen Daten zum Lesen anstehen. Wenn dies der Fall ist, dann wird die Lesefunktion (X_Read) des zuständigen Moduls aufgerufen, damit es die Daten entgegennimmt und die Schleife wird weiter ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Auf Windows-Systemen funktioniert dies anders. Hier können USB/Seriell-Geräte nicht per select überwacht werden. In FHEM unter Windows werden daher diese Schnittstellen kontinuierlich abgefragt ob Daten bereitstehen. Dafür müssen Module zusätzlich zur Lesefunktion eine Abfragefunktion (X_Ready) implementieren, die prüft ob Daten zum Lesen anstehen. Auch auf Linux/Unix-Plattformen hat diese Funktion eine Aufgabe. Falls nämlich eine Schnittstelle ausfällt beziehungsweise ein CUL oder USB-zu-Seriell Adapter ausgesteckt wird, dann wird über diese Funktion regelmäßig geprüft ob die Schnittstelle wieder verfügbar wird.&lt;br /&gt;
&lt;br /&gt;
Innerhalb der eigentlichen Lesefunktion (X_Read) werden dann die Daten vom zugehörigen Gerät gelesen, das nötige Protokoll implementiert und Werte in Readings geschrieben.&lt;br /&gt;
&lt;br /&gt;
Auch wenn von einem Anwender über ein &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; Daten aktiv von einem Gerät angefordert werden sollte nicht blockierend gewartet werden. Eine asynchrone Ausgabe ist über asyncOutput möglich. Siehe {{Link2Forum|Topic=43771|Message=357870|LinkText=Beschreibung}} und {{Link2Forum|Topic=43771|Message=360935|LinkText=Beispiel}}. Weitere Anwendungsbeispiele finden sich im  {{Link2Forum|Topic=43052|Message=353477|LinkText=PLEX Modul}} und im überarbeiteten und nicht-blockierenden {{Link2Forum|Topic=42771|Message=348498|LinkText= SYSSTAT Modul}}.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
Werte, die von einem Gerät gelesen werden und in FHEM zur Verfügung stehen werden Readings genannt. Sie werden als Unterstruktur des Hashes der jeweiligen Geräteinstanz gespeichert, beispielsweise &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash{READINGS}{Temp}{VAL}&amp;lt;/code&amp;gt; für die Temperatur eines Fühlers&lt;br /&gt;
*&amp;lt;code&amp;gt;$hash{READINGS}{Temp}{TIME}&amp;lt;/code&amp;gt; für den Zeitstempel der Messung&lt;br /&gt;
&lt;br /&gt;
Für den lesenden Zugriff auf Readings steht die Funktion ReadingsVal($$$) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Readings werden im statefile von FHEM automatisch zwischengespeichert, damit sie nach einem Neustart sofort wieder zur Verfügung stehen, auch bevor sie vom Modul neu gesetzt oder aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Readings, die mit einem Punkt im Namen beginnen, haben eine funktionale Besonderheit. Sie werden im FhemWeb nicht angezeigt und können somit als &amp;quot;Permanentspeicher&amp;quot; innerhalb des Moduls genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Zum Setzen von Readings sollen &lt;br /&gt;
*bei Gruppen von Readings der Funktionsblock &amp;lt;code&amp;gt;readingsBeginUpdate&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;readingsBulkUpdate&amp;lt;/code&amp;gt; (mehrfach wiederholt), &amp;lt;code&amp;gt;readingsEndUpdate&amp;lt;/code&amp;gt;&lt;br /&gt;
*bei einzelnen Updates die Funktion &amp;lt;code&amp;gt;readingsSingleUpdate&amp;lt;/code&amp;gt; &lt;br /&gt;
aufgerufen werden. Dabei kann man auch angeben, ob dabei ein Event ausgelöst werden soll oder nicht.  Events erzeugen spürbare Last auf dem System (siehe NotifyFn), das Ändern von Readings ohne dass dabei Events erzeugt werden jedoch nicht.&lt;br /&gt;
&lt;br /&gt;
Eine Sequenz zum Setzen von Readings könnte folgendermaßen aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
readingsBeginUpdate($hash);&lt;br /&gt;
readingsBulkUpdate($hash, $readingName1, $wert1 );&lt;br /&gt;
readingsBulkUpdate($hash, $readingName2, $wert2 );&lt;br /&gt;
readingsEndUpdate($hash, 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
Werte, die das Modul intern als Teil des Hashes speichert, die aber keine Readings sind, nennt man Internals. Sie werden ebenfalls als Unterstruktur des Hashes der jeweiligen Geräteinstanz gespeichert, beispielswiese &amp;lt;code&amp;gt;$hash-&amp;gt;{INTERVAL}&amp;lt;/code&amp;gt; für ein Abfrageintervall, das beim Define-Befehl übergeben wurde und als Internal gespeichert wird. Internals werden jedoch im Gegensatz zu Readings nicht im statefile zwischengespeichert. &lt;br /&gt;
&lt;br /&gt;
Falls Werte wie das gerade erwähnte Intervall nicht über den Define-Befehl gesetzt werden sollen und im Betrieb einfach änderbar sein sollen, ist eine alternative Möglichkeit die Speicherung in so genannten Attributen. Dann würde man den Define-Befehl so implementieren, dass er kein Intervall übergeben bekommt und statt dessen nach dem Define-Befehl zusätzlich den Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; erwarten.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Parameter einer Geräteinstanz können mit dem Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; als so genannte Attribute gesetzt und damit dem Modul zur Verfügung gestellt werden. Attribute werden zusammen mit der Definition der Geräte beim Speichern der aktuellen Konfiguration von FHEM in die Konfigurationsdatei geschrieben, die auch bei jedem Neustart von FHEM wieder gelesen wird. Zur Laufzeit werden Attribute in der globalen Datenstruktur &amp;lt;code&amp;gt;$attr{$name}&amp;lt;/code&amp;gt; gespeichert. Ein Attribut mit dem Namen &amp;lt;code&amp;gt;header&amp;lt;/code&amp;gt; würde beispielsweise mit &amp;lt;code&amp;gt;$attr{$name}{header}&amp;lt;/code&amp;gt; adressiert (&amp;lt;code&amp;gt;$attr{$name}-&amp;gt;{&#039;header&#039;}&amp;lt;/code&amp;gt; wäre eine alternative aber unübliche Schreibweise für die selbe Variable). &lt;br /&gt;
&lt;br /&gt;
Zum Auslesen solcher Attribute sollte die Funktion &amp;lt;code&amp;gt;AttrVal($$$)&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Welche Attribute ein Modul unterstützt sollte in der Funktion &amp;lt;code&amp;gt;[[#X_Initialize|X_Initialize]]&amp;lt;/code&amp;gt; durch Setzen der Variable &amp;lt;code&amp;gt;$hash-&amp;gt;{AttrList}&amp;lt;/code&amp;gt; bekannt gemacht werden (siehe unten). Wenn beim Setzen von Attributen die Werte geprüft werden sollen oder zusätzliche Funktionalität implementiert werden muss, dann kann dies in der Funktion &amp;lt;code&amp;gt;[[#X_Attr|X_Attr]]&amp;lt;/code&amp;gt; ([[#X_Attr|siehe unten]]) implementiert werden.&lt;br /&gt;
&lt;br /&gt;
== Die wichtigsten Funktionen in einem Modul ==&lt;br /&gt;
Eine typische Grundfunktion eines einfachen Moduls ist das Auslesen von Werten von einem physischen Gerät und Bereitstellen dieser Werte innerhalb von FHEM als Readings. Das Geräte könnte beispielsweise an einem USB-Port angeschlossen sein. Folgende Funktionen könnte man beispielsweise in einem Modul mit Namen X implementieren:&lt;br /&gt;
* [[#X_Initialize|X_Initialize]] (initialisiert das Modul und gibt de Namen der zusätzlichen Funktionen bekannt)&lt;br /&gt;
* [[#X_Define|X_Define]] (wird beim &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt; aufgerufen)&lt;br /&gt;
* [[#X_Undef|X_Undef]] (wird beim &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;, sowie &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt; aufgerufen. Dient zum Abbau von offenen Verbindungen, Timern, etc.)&lt;br /&gt;
* [[#X_Delete|X_Delete]] (wird beim &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; aufgerufen um das Gerät endgültig zu löschen)&lt;br /&gt;
* [[#X_Set|X_Set]] (wird beim Befehl &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; aufgerufen um Daten an das Gerät zu senden)&lt;br /&gt;
* [[#X_Get|X_Get]] (wird beim Befehl &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; aufgerufen um Daten vom Gerät abzufragen)&lt;br /&gt;
* [[#X_Attr|X_Attr]] (wird beim Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; aufgerufen um beispielsweise Werte zu prüfen)&lt;br /&gt;
* [[#X_Read|X_Read]] (wird vom globalen select aufgerufen, falls Daten zur Verfuegung stehen)&lt;br /&gt;
* [[#X_Parse|X_Parse]] (wird bei zweistufigen Modulen vom Dispatch aufgerufen und muss hier noch beschrieben werden)&lt;br /&gt;
* [[#X_Ready|X_Ready]] (wird unter windows als ReadFn-Erstatz benoetigt bzw. um zu pruefen, ob ein Geraet wieder eingesteckt ist)&lt;br /&gt;
* [[#X_Notify|X_Notify]] (falls man benachrichtigt werden will)&lt;br /&gt;
* [[#X_Rename|X_Rename]] (falls ein Gerät umbenannt wird)&lt;br /&gt;
* [[#X_Shutdown|X_Shutdown]] (wird beim Herunterfahren aufgeführt)&lt;br /&gt;
&lt;br /&gt;
Die Funktionen werden im folgenden beschrieben (soweit diese Seite inzwischen vollständig ist):&lt;br /&gt;
&lt;br /&gt;
=== X_Initialize ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; im Namen muss dabei auf den Namen des Moduls bzw. des definierten Gerätetyps geändert werden. Im Modul mit der Datei &amp;lt;code&amp;gt;36_JeeLink.pm&amp;lt;/code&amp;gt; beispielsweise ist der Name der Funktion &amp;lt;code&amp;gt;JeeLink_Initialize&amp;lt;/code&amp;gt;. Die Funktion wird von Fhem.pl nach dem Laden des Moduls aufgerufen und bekommt einen Hash für das Modul als zentrale Datenstruktur übergeben. &lt;br /&gt;
&lt;br /&gt;
Dieser Hash wird im globalen Hash %modules gespeichert. &amp;lt;code&amp;gt;$modules{$ModulName}&amp;lt;/code&amp;gt; wäre dabei der Hash für das Modul mit dem Namen &amp;lt;code&amp;gt;$ModulName&amp;lt;/code&amp;gt;. Es handelt sich also nicht um den oben beschriebenen Hash der Geräteinstanzen sondern einen Hash, der je Modul Werte enthält, beispielsweise auch die Namen der Funktionen, die das Modul implementiert und die fhem.pl aufrufen soll. Die Initialize-Funktion setzt diese Funktionsnamen, in den Hash des Moduls:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{DefFn}      = &amp;quot;X_Define&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{UndefFn}    = &amp;quot;X_Undef&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{DeleteFn}   = &amp;quot;X_Delete&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{SetFn}      = &amp;quot;X_Set&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{GetFn}      = &amp;quot;X_Get&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{AttrFn}     = &amp;quot;X_Attr&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{NotifyFn}   = &amp;quot;X_Notify&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{ReadFn}     = &amp;quot;X_Read&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{ReadyFn}    = &amp;quot;X_Ready&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{ShutdownFn} = &amp;quot;X_Shutdown&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; ist wieder durch den Modulnamen ohne die vorangestellte Zahl zu ersetzen. &lt;br /&gt;
Entsprechend können auch die Funktionen &amp;lt;code&amp;gt;X_Read&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X_Parse&amp;lt;/code&amp;gt; etc. durch Zuweisung an &amp;lt;code&amp;gt;$hash-&amp;gt;{ReadFn}&amp;lt;/code&amp;gt; etc. bekannt gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sollten die vom Modul unterstützen Attribute definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{AttrList} =&lt;br /&gt;
  &amp;quot;do_not_notify:1,0 &amp;quot; . &lt;br /&gt;
  &amp;quot;header &amp;quot; .&lt;br /&gt;
  $readingFnAttributes;  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Fhem.pl werden dann die entsprechenden Werte beim Aufruf eines &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehls in die globale Datenstruktur &amp;lt;code&amp;gt;$attr{$name}&amp;lt;/code&amp;gt;, z.B. &amp;lt;code&amp;gt;$attr{$name}{header}&amp;lt;/code&amp;gt; für das Attribut &amp;lt;code&amp;gt;header&amp;lt;/code&amp;gt; gespeichert. Falls im Modul weitere Aktionen oder Prüfungen beim Setzen eines Attributs nötig sind, dann kann wie im Beispiel oben die Funktion &amp;lt;code&amp;gt;X_Attr&amp;lt;/code&amp;gt; implementiert und in der Initialize-Funktion bekannt gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Die Variable &amp;lt;code&amp;gt;$readingFnAttributes&amp;lt;/code&amp;gt;, die im obigen Beispiel an die Liste der unterstützten Attribute angefügt wird, definiert Attributnamen, die dann verfügbar werden wenn das Modul zum Setzen von Readings die Funktionen readingsBeginUpdate, readingsBulkUpdate, readingsEndUpdate oder readingsSingleUpdate verwendet. In diesen Funktionen werden Attribute wie &amp;lt;code&amp;gt;event-min-interval&amp;lt;/code&amp;gt; oder auch &amp;lt;code&amp;gt;event-on-change-reading&amp;lt;/code&amp;gt; ausgewertet. Für Details hierzu siehe commandref.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des weiteren ist es möglich, das Verhalten von Autocreate zu beeinflussen.&lt;br /&gt;
&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; ist durch den Namen der Geräte zu ersetzen. Legt ihr Geräte mit dem Namen LaCrosse an, dann sollte x durch LaCrosse ersetzt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  $hash-&amp;gt;{AutoCreate} =&lt;br /&gt;
        { &amp;quot;x.*&amp;quot; =&amp;gt; { ATTR =&amp;gt; &amp;quot;event-min-interval:.*:300 event-on-change-reading:.*&amp;quot;, &lt;br /&gt;
                     FILTER =&amp;gt; &amp;quot;%NAME&amp;quot;, &lt;br /&gt;
                     GPLOT =&amp;gt; &amp;quot;temp4hum4:Temp/Hum,&amp;quot;} };&lt;br /&gt;
                     autocreateThreshold =&amp;gt; &amp;quot;&amp;lt;count&amp;gt;:&amp;lt;timeout&amp;gt;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mit &amp;lt;code&amp;gt;ATTR =&amp;gt;&amp;lt;/code&amp;gt; können Vordefinierte Attribute beim Anlegen definiert werden.&lt;br /&gt;
Der Wert von &amp;lt;code&amp;gt;FILTER&amp;lt;/code&amp;gt; wird als Regex verwendet, wenn ein Filelog angelegt wird. Damit könnt ihr steuern, welche Events ins Filelog komme. Definiert ihr das Feld &amp;lt;code&amp;gt;FILTER&amp;lt;/code&amp;gt; nicht, gebt jedoch andere Felder an, dann kann kein filelog mehr automatisch durch autocreate angelegt werden!&lt;br /&gt;
Mit Hilfe von &amp;lt;code&amp;gt;GPLOT&amp;lt;/code&amp;gt; kann ein Plot angelegt werden. Mit der Angabe definiert ihr, welcher GPLOT angelegt wird.&lt;br /&gt;
Mittels &amp;lt;code&amp;gt;autocreateThreshold&amp;lt;/code&amp;gt; wird beeinflusst, wie oft &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;(default 2) und in welchem Zeitabstand &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; (default 60 Sekunden) die gleiche Nachricht empfangen werden muss, damit ein Gerät per autocreate angelegt wird. &lt;br /&gt;
Das Verhalten, kann vom Anwender mittels Attribut &amp;lt;code&amp;gt;autocreateThreshold&amp;lt;/code&amp;gt; im device &amp;quot;autocreate&amp;quot; überschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Parsen der Parameter der define, get und set Kommandos sowie deren Übergabe an die DefFn, GetFn und SetFn lässt sich mit&lt;br /&gt;
&amp;lt;pre&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/pre&amp;gt; beeinflussen. Sobald es gesetzt ist wird automatisch [[DevelopmentModuleAPI#parseParams|parseParams]] aufgerufen und die an X_Define, X_Get und X_Set übergebenen Parameter ändern sich wie weiter unten beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== X_Define ===&lt;br /&gt;
Die Define-Funktion eines Moduls wird von Fhem aufgerufen wenn der Define-Befehl für ein Geräte ausgeführt wird und das Modul bereits geladen und mit der Initialize-Funktion initialisiert ist. Sie ist typischerweise dazu da, die übergebenen Parameter zu prüfen und an geeigneter Stelle zu speichern sowie einen Kommunikationsweg zum Gerät zu öffnen (z.B. TCP-Verbindung, USB-Schnittstelle o.ä.)&lt;br /&gt;
Sie beginnt typischerweise mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	my @a = split( &amp;quot;[ \t][ \t]*&amp;quot;, $def );&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Übergabeparameter bekommt die Define-Funktion den Hash der Geräteinstanz sowie den Rest der Parameter, die im Befehl angegeben wurden. Welche und wie viele Parameter &lt;br /&gt;
akzeptiert werden ist Sache dieser Funktion. Im obigen Beispiel wird alles nach dem übergebenen Hash in ein Array aufgeteilt und so können die vom Modul bzw. der Define-Funktion erwarteten Werte über das Array der Reihe nach verarbeitet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my $name 	= $a[0];&lt;br /&gt;
my $url 	= $a[2];&lt;br /&gt;
my $inter	= 300;&lt;br /&gt;
if(int(@a) == 4) { &lt;br /&gt;
	$inter = $a[3]; &lt;br /&gt;
	if ($inter &amp;lt; 5) {&lt;br /&gt;
		return &amp;quot;interval too small, please use something &amp;gt; 5, default is 300&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neu: Zum Aufteilen und Parsen von &amp;lt;code&amp;gt;$def&amp;lt;/code&amp;gt; lässt sich [[DevelopmentModuleAPI#parseParams|parseParams]] verwenden. Wenn in X_Initialize &amp;lt;pre&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/pre&amp;gt; gesetzt wurde dann wird parseParams automatisch aufgerufen und X_Define ändert sich wie folgt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Define($$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $a, $h ) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit die übergebenen Werte auch anderen Funktionen zur Verfügung stehen und an die jeweilige Geräteinstanz gebunden sind, werden die Werte typischerweise als Internals im Hash der Geräteinstanz gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{url} 		= $url;&lt;br /&gt;
$hash-&amp;gt;{Interval}	= $inter;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine physische Schnittstelle geöffnet werden soll und dann bei verfügbaren Eingabedaten eine Lese-Funktion von Fhem aufgerufen werden soll, dann kann man in der Define-Funktion die Funktion DevIo_OpenDev aufrufen, die sich um alles weitere kümmert. Sie öffnet die Schnittstelle und fügt den Filedeskriptor an die globale Liste offener Verbindungen (selectlist / readyfnlist) an. Damit kann Fhem in seiner Hauptschleife erkennen, von welchem Gerät Daten bereit stehen und die zuständigen Funktionen aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my $ret = DevIo_OpenDev( $hash, 0, &amp;quot;X_DevInit&amp;quot; );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die optionale Funktion &amp;lt;code&amp;gt;X_DevInit&amp;lt;/code&amp;gt; wird zur weiteren Initialisierung der Verbindung von &amp;lt;code&amp;gt;DevIo_OpenDev&amp;lt;/code&amp;gt; aufgerufen. Der zweite Übergabeparameter an &amp;lt;code&amp;gt;DevIo_OpenDev&amp;lt;/code&amp;gt; (hier &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) steht für reopen und wird benötigt, da die Funktion auch aufgerufen wird, wenn ein USB-Geräte beispielsweise im Betrieb aus- und wieder eingesteckt wird. In diesem Fall wird die Funktion mit &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; aufgerufen.&lt;br /&gt;
&lt;br /&gt;
=== X_Undef ===&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;Undef&amp;lt;/code&amp;gt;-Funktion wird aufgerufen wenn ein Gerät mit &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gelöscht wird oder bei der Abarbeitung des Befehls rereadcfg, der ebenfalls alle Geräte löscht und danach das Konfigurationsfile neu abarbeitet. Entsprechend müssen in der Funktion typische Aufräumarbeiten durchgeführt werden wie das saubere Schließen von Verbindungen oder das Entfernen von internen Timern sofern diese im Modul zum Pollen verwendet wurden (siehe später). &lt;br /&gt;
&lt;br /&gt;
Zugewiesene Variablen im Hash der Geräteinstanz, Internals oder Readings müssen hier nicht gelöscht werden. In fhem.pl werden die entsprechenden Strukturen beim Löschen der Geräteinstanz ohnehin vollständig gelöscht.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Undef($$)    &lt;br /&gt;
{                     &lt;br /&gt;
	my ( $hash, $name) = @_;       &lt;br /&gt;
	DevIo_CloseDev($hash);         &lt;br /&gt;
	RemoveInternalTimer($hash);    &lt;br /&gt;
	return undef;                  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== X_Delete ===&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;Delete&amp;lt;/code&amp;gt;-Funktion ist das Gegenstück zur &amp;lt;code&amp;gt;Define&amp;lt;/code&amp;gt;-Funktion und wird aufgerufen wenn ein Gerät mit &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gelöscht wird. &lt;br /&gt;
&lt;br /&gt;
Wenn ein Gerät mittels &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gelöscht wird, wird zuerst die  &amp;lt;code&amp;gt;[[#X_Undef|Undef]]&amp;lt;/code&amp;gt;-Funktion aufgerufen um offene Verbindungen abzubauen, anschließend wird die &amp;lt;code&amp;gt;Delete&amp;lt;/code&amp;gt;-Funktion aufgerufen. Diese dient eher zum aufräumen von Dateien, welche durch das Modul evtl. für dieses Gerät spezifisch erstellt worden sind. Es geht hier also eher darum, alle Spuren sowohl im laufenden FHEM-Prozess, als auch Dateien oder Verbindungen zu löschen die mit diesem Gerät zu tun haben.&lt;br /&gt;
&lt;br /&gt;
Dies kann z.B. folgendes sein:&lt;br /&gt;
&lt;br /&gt;
* Löschen von Dateien im Dateisystem die während der Nutzung dieses Geräts angelegt worden sind.&lt;br /&gt;
* Lösen von evtl. Pairings mit dem physikalischen Gerät &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Delete($$)    &lt;br /&gt;
{                     &lt;br /&gt;
	my ( $hash, $name ) = @_;       &lt;br /&gt;
&lt;br /&gt;
	# Löschen von Geräte-assoziiertem Temp-File&lt;br /&gt;
	unlink($attr{global}{modpath}.&amp;quot;/FHEM/FhemUtils/$name.tmp&amp;quot;;)&lt;br /&gt;
}    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== X_Get ===&lt;br /&gt;
Die Get-Funktion wird aufgerufen wenn der Fhem-Befehl &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; mit einem Gerät dieses Moduls ausgeführt wird. Mit &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; werden typischerweise Werte von einem Gerät abgefragt. Einige Module verwenden für diese Funktion einen Hash im Modul, der die möglichen &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;-Optionen mit zusätzlichen Werten definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my %X_gets = (&lt;br /&gt;
	&amp;quot;TempSoll&amp;quot;	=&amp;gt; &amp;quot;XY&amp;quot;,&lt;br /&gt;
	&amp;quot;Steilheit&amp;quot;	=&amp;gt; &amp;quot;Z&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In der Get-Funktion selbst werden dann die übergebenen Parameter gegen diesen Hash geprüft.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Get($@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, @a ) = @_;&lt;br /&gt;
	return &amp;quot;\&amp;quot;get X\&amp;quot; needs at least one argument&amp;quot; if ( @a &amp;lt; 2 );&lt;br /&gt;
	my $name = shift @a;&lt;br /&gt;
	my $opt = shift @a;&lt;br /&gt;
	if(!$X_gets{$opt}) {&lt;br /&gt;
		my @cList = keys %X_gets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Ausgabe der Meldung mit &amp;lt;code&amp;gt;unknown ... choose one of ...&amp;lt;/code&amp;gt; ist dabei wichtig, da sie im GUI-Modul verwendet wird um die möglichen &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;-Optionen zu ermitteln und als Auswahl anzubieten. Im weiteren Verlauf der Ger-Funktion könnte man dann mit dem physischen Gerät kommunizieren und den gefragten Wert abfragen und diesen als Return-Wert der Get-Funktion zurückgeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neu: Wenn in X_Initialize &amp;lt;pre&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/pre&amp;gt; gesetzt wurde dann wird [[DevelopmentModuleAPI#parseParams|parseParams]] automatisch aufgerufen und X_Get ändert sich wie folgt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Get($$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $a, $h ) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== X_Set ===&lt;br /&gt;
Die Set-Funktion ist das Gegenteil zur Get-Funktion. Sie ist dafür gedacht, Werte zum physischen Gerät zu schicken. Falls nur interne Werte im Modul gesetzt werden sollen, so sollte statt Set die Attr-Funktion verwendet werden. Attribute werden bei Save-Config auch in der Fhem.cfg gesichert. Set-Befehle nicht.&lt;br /&gt;
 &lt;br /&gt;
Eine Set-Funktion ist ähnlich aufgebaut wie die Get-Funktion, sie bekommt jedoch nach dem Namen der Option auch den zu setzenden Wert übergeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Set($@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, @a ) = @_;&lt;br /&gt;
	return &amp;quot;\&amp;quot;set X\&amp;quot; needs at least an argument&amp;quot; if ( @a &amp;lt; 2 );&lt;br /&gt;
	my $name = shift @a;&lt;br /&gt;
	my $opt = shift @a;&lt;br /&gt;
	my $value = join(&amp;quot;&amp;quot;, @a);&lt;br /&gt;
	&lt;br /&gt;
	if(!defined($X_sets{$opt})) {&lt;br /&gt;
		my @cList = keys %X_sets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neu: Wenn in X_Initialize &amp;lt;pre&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/pre&amp;gt; gesetzt wurde dann wird [[DevelopmentModuleAPI#parseParams|parseParams]] automatisch aufgerufen und X_Set ändert sich wie folgt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Set($$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $a, $h ) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das GUI FHEM-Web kann für die einzelnen Set-Optionen, die das Modul versteht auch automatisch Eingabehilfen wie Drop-Down Boxen oder Slider erzeugen. In der Detailansicht des GUI kann der Anwender dann die jeweiligen Werte komfortabel auswählen. Dafür muss die Set-Funktion, wenn sie mit der Option &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; aufgerufen wird, nicht nur einen Text mit  &amp;lt;code&amp;gt;&amp;quot;Unknwon ... choose one of ...&amp;quot;&amp;lt;/code&amp;gt; zurückgeben sondern den einzelnen Set-Optionen in diesem Rückgabetext nach einem Doppelpunkt Zusatzinformationen anhängen.&lt;br /&gt;
Meist prüft man in den Modulen gar nicht auf die Option &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; sondern gibt generell bei unbekannten Optionen diesen Text zurück.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if(!defined($X_sets{$opt})) {&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of mode:verbose,ultra,relaxed turbo:NoArg&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Kommata getrennte Werte ergeben eine Drop-Down Liste, mit der der User die Werte auswählen kann&lt;br /&gt;
&amp;lt;pre&amp;gt;timer:30,120,300&lt;br /&gt;
mode:verbose,ultra,relaxed&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird kein Doppelpunkt zum Kommando angegeben, so wird eine Eingabezeile angezeigt, die die freie Eingabe eines Wertes erlaubt.&lt;br /&gt;
&lt;br /&gt;
Man kann jedoch die Eingabe-/Auswahlmöglichkeiten durch Widgets vereinfachen. Dazu gibt man hinter dem Doppelpunkt einen Widgetnamen und widgetspezifische Parameter an. Es existieren mehrere solcher Widgets in FHEMWEB. Die gebräuchlichsten sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Zusatz !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;noArg&#039;&#039;&#039; || &amp;lt;code&amp;gt;reset:noArg&amp;lt;/code&amp;gt;|| Es werden keine weiteren Argumente mehr benötigt. In so einem Fall wird bei der Auswahl keine Textbox oder ähnliches angezeigt, da keine weiteren Argumente für diesen Befehl notwendig sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;slider&#039;&#039;&#039;:&amp;lt;min&amp;gt;,&amp;lt;step&amp;gt;,&amp;lt;max&amp;gt; || &amp;lt;code&amp;gt;dim:slider,0,1,100&amp;lt;/code&amp;gt;|| Es wird ein Schieberegler angezeigt um den Parameter auszuwählen. Dabei werden als Zusatzparameter Minimum, Schrittweite und Maximum angegeben.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;colorpicker&#039;&#039;&#039; || &amp;lt;code&amp;gt;rgb:colorpicker,RGB&amp;lt;/code&amp;gt;|| es wird ein Colorpicker angezeigt, der dem Anwender die Auswahl einer Farbe ermöglicht. Bitte dazu auch den Wiki Artikel zum Colorpicker lesen: [[Color#Colorpicker]]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;multiple&#039;&#039;&#039; || &amp;lt;code&amp;gt;group:multiple,Telefon,Multimedia,Licht,Heizung&amp;lt;/code&amp;gt; || Es erscheint ein Auswahldialog, wo man verschiedene Werte durch klicken auswählen kann. Optional kann man in einem Freitext eigene Werte ergänzen. dieser Dialog wird bspw. bei der Raum-Auswahl (Attribut &amp;quot;room&amp;quot;) oder der Gruppen-Auswahl (Attribut &amp;quot;group&amp;quot;) in FHEMWEB genutzt. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;sortable&#039;&#039;&#039; || &amp;lt;code&amp;gt;command:sortable,monday,tuesday,...&amp;lt;/code&amp;gt; || Es erscheint ein Auswahldialog, wo man verschiedene Werte auswählen und sortieren kann. Man kann dabei Werte durch Klicken auswählen und durch Drag&#039;n&#039;Drop sortieren.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es gibt noch weitere solcher Widgets. Eine genaue Auflistung dazu findet sich in der [http://fhem.de/commandref.html#widgetOverride commandref] unter widgetOverride zu FHEMWEB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweise&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- Damit in einer Eingabe bereits der aktuelle Wert vorbelegt bzw. in einer Auswahlliste der aktuelle Wert vorselektiert ist, muss es im Modul bzw. Gerät ein Reading mit dem gleichen Namen wie die Set-Option geben. Der Wert des gleichnamigen Readings wird dann als Vorbelegung / Vorselektion verwendet. &lt;br /&gt;
&lt;br /&gt;
- bei den üblichen Kommandos wie on off sollte man auf noArg verzichten, da diese durch FHEMWeb automatisch in der Raumübersicht angezeigt werden. Wenn man hier noArg spezifiziert, so werden diese nicht neben dem Modul in der Raumübersicht angezeigt und der User muss sich diese vie webCmd dann erst selbst definieren, was natürlich unschön ist&lt;br /&gt;
&lt;br /&gt;
- der User kann sich in der Raumübersicht nach wie vor via webCmd eine entsprechende Steuerung anlegen.&lt;br /&gt;
&lt;br /&gt;
=== X_Attr ===&lt;br /&gt;
Die Attr-Funktion implementiert Prüfungen der bei einem &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; übergebenen Werte und eventuell zusätzliche Aktionen wenn ein Attribut gesetzt wird. Die Liste der möglichen Attribute wird in der &amp;lt;code&amp;gt;[[#X_Initialize|X_Initialize]]-Funktion&amp;lt;/code&amp;gt; definiert ([[#X_Initialize|siehe oben]]). Fhem ruft bei einem Attr-Befehl die zuständige &amp;lt;code&amp;gt;X-Attr-Funktion&amp;lt;/code&amp;gt; auf und wenn diese keine Fehlermeldung sondern &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgibt, dann schreibt fhem.pl die bei &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; angegebenen Werte in die jeweilige Datenstruktur &amp;lt;code&amp;gt;$attr{$name}-&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
X_Attr(@)&lt;br /&gt;
{&lt;br /&gt;
	my ($cmd,$name,$aName,$aVal) = @_;&lt;br /&gt;
  	# $cmd can be &amp;quot;del&amp;quot; or &amp;quot;set&amp;quot;&lt;br /&gt;
	# $name is device name&lt;br /&gt;
	# aName and aVal are Attribute name and value&lt;br /&gt;
	if ($cmd eq &amp;quot;set&amp;quot;) {&lt;br /&gt;
		if ($aName eq &amp;quot;Regex&amp;quot;) {&lt;br /&gt;
			eval { qr/$aVal/ };&lt;br /&gt;
			if ($@) {&lt;br /&gt;
				Log3 $name, 3, &amp;quot;X: Invalid regex in attr $name $aName $aVal: $@&amp;quot;;&lt;br /&gt;
				return &amp;quot;Invalid Regex $aVal&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich ist es möglich auch übergebene Attributwerte zu normalisieren und korrigieren, indem man im Parameterhash den ursprünglichen Wert anpasst. Dies erfolgt im Beispiel über die Modifikation des Wertes mit Index 3 im Parameterarray, also &amp;lt;code&amp;gt;$_[3]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Attr-Funktion bekommt nicht den Hash der Geräteinstanz übergeben, da sie ja auch keine Werte dort speichern muss, sondern den Befehl &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;del&amp;lt;/code&amp;gt; je nachdem ob ein Attribut gesetzt oder gelöscht wird, den Namen der Geräteinstanz sowie den Namen des Attributs und seinen Wert.&lt;br /&gt;
Im obigen Beispiel wird für ein Attribut mit Namen Regex geprüft ob die Regex fehlerhaft ist. Falls sie ok ist, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben und fhem.pl speichert den Wert des Attributs.&lt;br /&gt;
&lt;br /&gt;
Falls man Attribute mit Platzhaltern definiert (Wildcard-Attribute), z.B. mit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    $hash-&amp;gt;{AttrList} =&lt;br /&gt;
      &amp;quot;reading[0-9]*Name &amp;quot; .&lt;br /&gt;
    # usw.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dann können Anwender Attribute wie reading01Name, reading02Name etc. setzen. Leider funktioniert das bisher nicht durch Klicken, da Fhemweb nicht alle denkbaren Ausprägungen in einem Dropdown anbieten kann. Der Benutzer muß solche Attribute über den &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; Befehl eintippen.&lt;br /&gt;
&lt;br /&gt;
Man kann jedoch in der Attr-Funktion neu gesetzte Ausprägungen von Wildcard-Attributen an die gerätespezifische userattr-Variable anfügen. Dann können bereits gesetzte Attribute in Fhemweb durch Klicken ausgewählt und geändert werden.&lt;br /&gt;
Dazu reicht ein Aufruf von &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    addToDevAttrList($name, $aName);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der Attr-Funktion wenn ein Attribut gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
=== X_Read ===&lt;br /&gt;
&lt;br /&gt;
Die X_Read-Funktion wird aus der Hauptschleife von FHEM aus aufgerufen wenn das Gerät, für das das Modul zuständig ist, Daten bereit gestellt hat, die gelesen werden können. Im folgenden Beispiel wird über eine serielle Schnittstelle (beziehungsweise über einen USB-To-Seriell-Konverter) von einem angeschlossenen Gerät gelesen. Dazu werden die bisher verfügbaren Daten mit der Funktion &amp;lt;code&amp;gt;DevIo_SimpleRead&amp;lt;/code&amp;gt; gelesen. Da die Übertragung möglicherweise noch nicht vollständig ist, kann es sein, dass kurz darauf die X_Read-Funktion wieder aufgerufen wird und ein weiterer Teil oder der Rest der Daten gelesen werden kann.&lt;br /&gt;
Die Funktion muss daher prüfen ob schon alle erwarteten Daten angekommen sind und gegebenenfalls die bisher gelesenen Daten zwischenspeichern. Es bietet sich an, dies im Hash der Geräteinstanz zu tun. Im Beispiel ist dies &amp;lt;code&amp;gt;$hash-&amp;gt;{buffer}&amp;lt;/code&amp;gt; an den die jeweils gelesenen Daten angehängt werden bis die folgende Prüfung ein für das jeweilige Protokoll passendes Frame identifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Read($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
	&lt;br /&gt;
	# read from serial device&lt;br /&gt;
	my $buf = DevIo_SimpleRead($hash);		&lt;br /&gt;
	return &amp;quot;&amp;quot; if ( !defined($buf) );&lt;br /&gt;
&lt;br /&gt;
	# convert to hex string to make parsing with regex easier&lt;br /&gt;
	$hash-&amp;gt;{buffer} .= unpack (&#039;H*&#039;, $buf);	&lt;br /&gt;
	Log3 $name, 5, &amp;quot;Current buffer content: &amp;quot; . $hash-&amp;gt;{buffer};&lt;br /&gt;
&lt;br /&gt;
	# did we already get a full frame?&lt;br /&gt;
	if ($hash-&amp;gt;{buffer} =~ &amp;quot;ff1002(.{4})(.*)1003(.{4})ff(.*)&amp;quot;) &lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zu lesenden Nutzdaten können dann je nach Protokoll des Geräts beispielsweise an einer festgelegten Stelle im Frame (dann in &amp;lt;code&amp;gt;$hash-&amp;gt;{buffer}&amp;lt;/code&amp;gt;) stehen oder aus dem Kontext mit einem Regex-Match extrahiert werden und in Readings gespeichert werden (siehe unten).&lt;br /&gt;
&lt;br /&gt;
=== X_Ready ===&lt;br /&gt;
&lt;br /&gt;
Wird im Main-Loop aufgerufen falls das Modul in &amp;lt;code&amp;gt;@readyfnlist&amp;lt;/code&amp;gt; existiert. Prüft, ob das Gerät Daten zum empfangen hat. Beim Initialisieren des Moduls sollte es sich in die Liste eintragen.&lt;br /&gt;
&lt;br /&gt;
Weiterführende Informationen: [[#KommunikationvomGerätZuLogischenModulen]]&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Ready($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	return DevIo_OpenDev($hash, 1, undef )&lt;br /&gt;
	  if ( $hash-&amp;gt;{STATE} eq &amp;quot;disconnected&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	# This is relevant for windows/USB only&lt;br /&gt;
	my $po = $hash-&amp;gt;{USBDev};&lt;br /&gt;
	my ( $BlockingFlags, $InBytes, $OutBytes, $ErrorFlags ) = $po-&amp;gt;status;&lt;br /&gt;
	return ( $InBytes &amp;gt; 0 );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== X_Notify ===&lt;br /&gt;
&lt;br /&gt;
Die X_Notify-Funktion wird aus der Funktion DoTrigger in fhem.pl heraus aufgerufen wenn ein Modul Events erzeugt hat. Damit kann ein Modul auf Events anderer Module reagieren. Typische Beispiele sind das Filelog-Modul oder das Average-Modul. Average reagiert auf Events anderer Module und erweitert diese mit der Berechnung von Tages- und Monats-Durchschnittswerten.&lt;br /&gt;
&lt;br /&gt;
Die Notify-Funktion bekommt dafür zwei Hash-Referenzen übergeben: den Hash des eigenen Geräts und den Hash des Geräts, das die Events erzeugt hat. &lt;br /&gt;
Über den Hash des eigenen Geräts kann die Notify-Funktion beispielsweise auf die Internals oder Attribute des eigenen Geräts zugreifen.&lt;br /&gt;
Über den Hash des Gerätes und die &amp;lt;code&amp;gt;deviceEvents&amp;lt;/code&amp;gt; Funktion kann auf die aktuellen Events zugegriffen werden. Über den zweiten Parameter dieser Routine lässt sich bestimmen ob für ads Reading &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; ein &#039;normales&#039; Event (d.h. in der form &amp;lt;code&amp;gt;&amp;lt;reading&amp;gt;: &amp;lt;wert&amp;gt;&amp;lt;/code&amp;gt;) erzeugen soll (Wert: 1) oder ob z.b. aus Gründen der rückwärts Kompatibilität ein Event ohne &amp;lt;code&amp;gt;&amp;lt;reading&amp;gt;: &amp;lt;/code&amp;gt; erzeugt werden soll. Falls dem Anwender die Wahl des für state verwendeten Formats überlassen werden soll ist hierzu das &amp;lt;code&amp;gt;addStateEvent&amp;lt;/code&amp;gt; Attribut vorzusehen.&lt;br /&gt;
&lt;br /&gt;
Der direkte Zugriff auf &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt; ist nicht mehr zu empfehlen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Notify($$)&lt;br /&gt;
{&lt;br /&gt;
  my ($own_hash, $dev_hash) = @_;&lt;br /&gt;
  my $ownName = $own_hash-&amp;gt;{NAME}; # own name / hash&lt;br /&gt;
&lt;br /&gt;
  return &amp;quot;&amp;quot; if(IsDisabled($ownName)); # Return without any further action if the module is disabled&lt;br /&gt;
&lt;br /&gt;
  my $devName = $dev_hash-&amp;gt;{NAME}; # Device that created the events&lt;br /&gt;
&lt;br /&gt;
  my $events = deviceEvents($dev,1);&lt;br /&gt;
  return if( !$events );&lt;br /&gt;
&lt;br /&gt;
  foreach my $event (@{$events}) {&lt;br /&gt;
    $event = &amp;quot;&amp;quot; if(!defined($event));&lt;br /&gt;
&lt;br /&gt;
    # Examples:&lt;br /&gt;
    # $event = &amp;quot;readingname: value&amp;quot; &lt;br /&gt;
    # or&lt;br /&gt;
    # $event = &amp;quot;INITIALIZED&amp;quot; (for device &amp;quot;global&amp;quot;)&lt;br /&gt;
    #&lt;br /&gt;
    # processing $event with further code&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da die Notify-Funktion für jedes Gerät mit allen seinen Events aufgerufen wird, muss sie in einer Schleife alle Events prüfen und entscheiden, ob es mit dem jeweiligen Event etwas tun möchte. Ein Gerät, das die Notify-Funktion implementiert sieht dafür typischerweise einen regulären Ausdruck vor, der für die Filterung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
Wenn man nur gezielt von bestimmten Definitionen Events erhalten will, kann man diese auch in Form einer kommaseparierten Liste von Definitions-Namen in &amp;lt;code&amp;gt;$hash-&amp;gt;{NOTIFYDEV}&amp;lt;/code&amp;gt; angeben. Bspw. kann man in der Define-Funktion dort diesen Wert setzen. Dadurch wird die Notify-Funktion nur aufgerufen wenn eines der dort gelisteten Definitionen ein Event erzeugt hat. Ein typischer Fall ist die Begrenzung von Events auf &amp;quot;global&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
in der Define-Funktion:&lt;br /&gt;
&lt;br /&gt;
$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global,Definition_A,Definition_B&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies schont insbesondere bei grossen Installationen Ressourcen, da die Notify-Funktion nicht sämtliche Events, sondern nur noch Events der hier gelisteten Definitionen erhält. Dadurch erfolgen deutlich weniger Aufrufe der Notify-Funktion, was Systemressourcen schont.&lt;br /&gt;
&lt;br /&gt;
Als anschauliches Beispiel und für weitere Details eignet sich das Modul 98_Average.pm. Es ist aber (noch) nicht auf deviceEvents umgestellt da es durch das Erzeugen zusätzlicher Events im Quelldevice eine Sonderstellung hat.&lt;br /&gt;
&lt;br /&gt;
ToDo: NotifyOrderPrefix ?&lt;br /&gt;
&lt;br /&gt;
=== X_DbLog_splitFn ===&lt;br /&gt;
Mit der DbLog_SplitFn kann der Modulautor selbst festlegen, wie die Events des Moduls in die Bestandteile Reading/Value/Unit zerlegt werden um ein korrektes Logging per DbLog zu gewährleisten.&amp;lt;br&amp;gt;&lt;br /&gt;
Eingangsparameter: Das generierte Event&amp;lt;br&amp;gt;&lt;br /&gt;
Rückgabewerte: Array: Reading/Value/Unit&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_DbLog_splitFn($)&lt;br /&gt;
{&lt;br /&gt;
	my ($event) = @_;&lt;br /&gt;
	my ($reading, $value, $unit);&lt;br /&gt;
&lt;br /&gt;
	if($event =~ m/temperature/) {&lt;br /&gt;
	   $reading = &#039;temperature&#039;;&lt;br /&gt;
	   $value = substr($event,12,4);&lt;br /&gt;
	   $unit = &#039;°C&#039;;&lt;br /&gt;
	}   &lt;br /&gt;
        &lt;br /&gt;
        return ($reading, $value, $unit);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== X_Shutdown ===&lt;br /&gt;
Mit der X_Shutdown Funktion kann ein Modul bei einem Shutdown von FHEM die geöffneten Ressourcen schließen.&amp;lt;br&amp;gt;&lt;br /&gt;
Eingangsparameter: Der $hash einer Modul-Instanz&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Shutdown($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
	DevIo_CloseDev($hash);&lt;br /&gt;
        return undef;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pollen von Geräten ==&lt;br /&gt;
Wenn Geräte von sich aus keine Informationen senden sondern abgefragt werden müssen, kann man im Modul die Funktion &amp;lt;code&amp;gt;InternalTimer&amp;lt;/code&amp;gt; verwenden. Man übergibt ihr den Zeitpunkt für den nächsten Aufruf, den Namen der Funktion, die aufgerufen werden soll, den zu übergebenden Parameter und ein Flag ob der erste Aufruf verzögert werden soll falls die Initialiserung des Geräts noch nicht abgeschlossen ist. Als zu übergebender Parameter wird üblicherweise der Hash der betroffenen Geräteinstanz verwendet. Damit hat die aufgerufene Funktion Zugriff auf alle wichtigen Daten der Geräteinstanz. Eventuell zusätzlich benötigte Werte können einfach als weitere Internals über den Hash zugänglich gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Beispielsweise könnte man für das Abfragen eines Geräts in der Define-Funktion den Timer folgendermassen setzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# initial request after 2 secs, there timer is set to interval for further update&lt;br /&gt;
InternalTimer(gettimeofday()+2, &amp;quot;X_GetUpdate&amp;quot;, $hash, 0);	&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der Funktion &amp;lt;code&amp;gt;X_GetUpdate&amp;lt;/code&amp;gt; selbst wird dann der Timer neu gesetzt, so dass nach einem Intervall die Funktion erneut aufgerufen wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_GetUpdate($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
	InternalTimer(gettimeofday()+$hash-&amp;gt;{Interval}, &amp;quot;X_GetUpdate&amp;quot;, $hash, 1);&lt;br /&gt;
	Log3 $name, 4, &amp;quot;X: GetUpdate called ...&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im weiteren Verlauf der Funktion könnte man dann das Gerät abfragen und die abgefragten Werte in Readings speichern. Falls das Abfragen der Werte jedoch zu einer Verzögerung und damit zu einer Blockade von FHEM führen kann, ist es möglich, in der GetUpdate-Funktion nur die Aufforderung zum Senden bestimmter Daten an das angeschlossene Gerät zu senden und dann das Lesen über die oben beschriebene Read-Funktion zu implementieren, die beim Anstehen von Daten aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
== Logging / Debugging ==&lt;br /&gt;
Um Innerhalb eines Moduls eine Protokollmeldung in die Fhem-Logdatei zu schreiben, wird die Funktion Log3 aufgerufen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Log3 $name, 3, &amp;quot;X: Problem erkannt ...&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Parameter der Funktion Log3 sind der Name oder der Hash der Geräteinstanz, das Verbose-Level, in dem die Meldung sichtbar sein soll und die Meldung selbst.&lt;br /&gt;
Den Namen der Geräteinstanz kann man in den Funktionen, die den Hash übergeben bekommen einfach aus diesem Hash nehmen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um für ein neues Modul das Verbose-Level zu erhöhen, ohne gleich für das Gesamte FHEM alle Meldungen zu erzeugen kann man den Befehl &lt;br /&gt;
&amp;lt;code&amp;gt;attr gerätename verbose&amp;lt;/code&amp;gt; verwenden. Beispielsweise &amp;lt;code&amp;gt;attr PM verbose 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit bietet es sich an im Modul Meldungen, die im normalen Betrieb nicht benötigt werden, beim Aufruf von Log3 mit dem Level 4 oder 5 anzugeben. Wenn man dann bei der Fehlersuche mehr Meldungen sehen möchte, erhöht man mit attr X verbose das Level für das betroffene Gerät.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zweistufiges Modell für Module ==&lt;br /&gt;
&lt;br /&gt;
siehe auch&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,18920.msg128100.html#msg128100|The FHEM two-level model]&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,13438.msg83643.html#msg83643|Zum Initialize bei physikalischen und logischen Geräten]&lt;br /&gt;
&lt;br /&gt;
Das zweistufige Modell besteht aus &lt;br /&gt;
* physisches Modul - z.B. für CUL (00_CUL.pm), der mehrer Protokolle empfängt, u.a. FS20&lt;br /&gt;
* logische Modul(e) - z.B. das Protokoll FS20 (10_FS20.pm)&lt;br /&gt;
&lt;br /&gt;
Das physische Modul öffnet die Datenverbindung zum Gerät. &lt;br /&gt;
&lt;br /&gt;
=== Kommunikation vom Gerät zu den logischen Modulen ===&lt;br /&gt;
{{Anker|KommunikationvomGerätZuLogischenModulen}}&lt;br /&gt;
Die [[#X_Read|X_Read]]-Funktion wird aus der Hauptschleife von Fhem aufgerufen sobald das Gerät, für das das Modul zuständig ist, Daten bereit gestellt hat, die gelesen werden können.&lt;br /&gt;
&lt;br /&gt;
Unter Windows funktioniert &amp;quot;select&amp;quot; nur für Geräte, die via TCP verbunden sind. Für alle anderen Geräte ist eine [[#X_Ready|X_Ready]]-Funktion von Nöten, die 10x pro Sekunde das Gerät abfrägt und &amp;quot;true&amp;quot; zurück gibt, sollten Daten bereit stehen.&lt;br /&gt;
&lt;br /&gt;
Die X_Read-Funktion stellt sicher, dass die Daten&lt;br /&gt;
* komplett und&lt;br /&gt;
* korrekt&lt;br /&gt;
sind und sie ruft die globale Funktion Dispatch() mit einer Nachricht auf.&lt;br /&gt;
&lt;br /&gt;
Dispatch() sucht nach einem passenden lokalen Modul via &lt;br /&gt;
* $hash-&amp;gt;{Clients} oder $hash-&amp;gt;{MatchList} im physischen Modul&lt;br /&gt;
* $hash-&amp;gt;{Match} in allen passenden logischen Modulen&lt;br /&gt;
und ruft X_Parse in den gefundenen Modulen auf.&lt;br /&gt;
&lt;br /&gt;
X_Parse &lt;br /&gt;
* untersucht die übergebenen Daten (von Dispatch() übergeben)&lt;br /&gt;
* setzt alle [[#Readings|readings]] via readings*update Funktionen&lt;br /&gt;
* gibt den Namen des logischen Device zurück&lt;br /&gt;
&lt;br /&gt;
Es findet kein Event-Triggering statt, wenn die readings*update Funktionen &lt;br /&gt;
* von X_Parse aufgerufen werden und&lt;br /&gt;
* X_Parse wiederum von Dispatch() aufgerufen wurde.&lt;br /&gt;
(Im Gegensatz zum direkten Aufrufen der readings*update Funktionen ohne vorhergehendes Dispatch() )&lt;br /&gt;
&lt;br /&gt;
Dispatch() triggert das Event-Handling für das  von X_Parse zurückgegebene logische Device.&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation von den logischen Modulen zum Gerät ===&lt;br /&gt;
&lt;br /&gt;
Um von einem logischen Modul an ein physisches Gerät zu senden, wird im logischen Modul das Attribut IODev mit dem namen des physischen Devices gesetzt.&lt;br /&gt;
Der Befehl&lt;br /&gt;
&amp;lt;code&amp;gt;AssignIoPort($hash);&amp;lt;/code&amp;gt;&lt;br /&gt;
in der X_Define-Funktion des logischen Devices erledigt das.&lt;br /&gt;
&lt;br /&gt;
Als Befehl zum Schreiben vom logischen ins physische Gerät soll &amp;lt;code&amp;gt;IOWrite()&amp;lt;/code&amp;gt; verwendet werden. IOWrite() ruft im physischen Gerät die X_Write-Funktion auf.&lt;br /&gt;
&lt;br /&gt;
Wenn es keine direkte Kommunikation zwischen dem logischen und dem physischen Gerät gibt(keine direkten Aufrufe von Funktionen, kein direktes überprüfen von $hash Werten,...) so können die Module hintereinander geschaltet werden (z.B. für Routerfunktionen wie in RFR) oder mittels  FHEM2FHEM:RAW zwei Fhem Installationen verbunden werden und die logischen Devices werden dennoch funktionieren.&lt;br /&gt;
&lt;br /&gt;
== Ergänzende Hinweise ==&lt;br /&gt;
Die Wahl der vorangestellten Nummer für den Dateinamen eines neuen Moduls hat keine Bedeutung mehr, es sei denn die Nummer ist 99. Module, die mit 99_ beginnen, werden von FHEM automatisch geladen. Module mit einer anderen Nummer nur wenn ein &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl dafür sorgt, dass das Modul geladen wird.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Modul Initialisierungsdaten benötigt, sollten diese im Modul selbst enthalten sein. Eine zusätzliche Datei oder sogar ein Unterverzeichnis mit mehreren Dateien ist bei FHEM nicht üblich und sollte bei Modulen, die mit FHEM ausgeliefert werden nur in Rücksprache mit Rudolf König angelegt werden, da sie sonst bei einem Update nicht verteilt werden.&lt;br /&gt;
&lt;br /&gt;
== Weitere Informationen ==&lt;br /&gt;
Wenn man weitere Details wissen möchte, ist ein erster sinnvoller Schritt ein Blick in die Datei fhem.pl. Dort sieht man im Perl-Code wie die Module aufgerufen werden, was vorher passiert und was danach. Am Anfang der Datei (ca. ab Zeile 130) findet man beispielsweise eine Liste der globalen Variablen, die den Modulen zur Verfügung stehen sowie Details zu den wichtigen Hashes %modules und %defs. Wer mit Perl noch nicht so gut klar kommt, dem hilft eventuell ein Blick auf die Perldoc Website[http://perldoc.perl.org/] oder in das Perl-Buch seiner Wahl. Auch die FHEM Commandref [http://fhem.de/commandref.html] sollte nicht unterschätzt werden. Es stehen oft mehr interessante Details auch für Modulentwickler darin als man zunächst vermuten könnte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Hello World&amp;quot; Beispiel ==&lt;br /&gt;
&lt;br /&gt;
98_Hello.pm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package main;&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
my %Hello_gets = (&lt;br /&gt;
	&amp;quot;whatyouwant&amp;quot;	=&amp;gt; &amp;quot;can&#039;t&amp;quot;,&lt;br /&gt;
	&amp;quot;whatyouneed&amp;quot;	=&amp;gt; &amp;quot;try sometimes&amp;quot;,&lt;br /&gt;
	&amp;quot;satisfaction&amp;quot;  =&amp;gt; &amp;quot;no&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
sub Hello_Initialize($) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
    $hash-&amp;gt;{DefFn}      = &#039;Hello_Define&#039;;&lt;br /&gt;
    $hash-&amp;gt;{UndefFn}    = &#039;Hello_Undef&#039;;&lt;br /&gt;
    $hash-&amp;gt;{SetFn}      = &#039;Hello_Set&#039;;&lt;br /&gt;
    $hash-&amp;gt;{GetFn}      = &#039;Hello_Get&#039;;&lt;br /&gt;
    $hash-&amp;gt;{AttrFn}     = &#039;Hello_Attr&#039;;&lt;br /&gt;
    $hash-&amp;gt;{ReadFn}     = &#039;Hello_Read&#039;;&lt;br /&gt;
&lt;br /&gt;
    $hash-&amp;gt;{AttrList} =&lt;br /&gt;
          &amp;quot;formal:yes,no &amp;quot;&lt;br /&gt;
        . $readingFnAttributes;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Define($$) {&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    my @param = split(&#039;[ \t]+&#039;, $def);&lt;br /&gt;
    &lt;br /&gt;
    if(int(@param) &amp;lt; 3) {&lt;br /&gt;
        return &amp;quot;too few parameters: define &amp;lt;name&amp;gt; Hello &amp;lt;greet&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    my $hash-&amp;gt;{name}  = $param[0];&lt;br /&gt;
    my $hash-&amp;gt;{greet} = $param[2];&lt;br /&gt;
    &lt;br /&gt;
    return undef;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Undef($$) {&lt;br /&gt;
    my ($hash, $arg) = @_; &lt;br /&gt;
    # nothing to do&lt;br /&gt;
    return undef;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Get($@) {&lt;br /&gt;
	my ($hash, @param) = @_;&lt;br /&gt;
	&lt;br /&gt;
	return &#039;&amp;quot;get Hello&amp;quot; needs at least one argument&#039; if (int(@param) &amp;lt; 2);&lt;br /&gt;
	&lt;br /&gt;
	my $name = shift @param;&lt;br /&gt;
	my $opt = shift @param;&lt;br /&gt;
	if(!$Hello_gets{$opt}) {&lt;br /&gt;
		my @cList = keys %Hello_gets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if($attr{$name}{formal} eq &#039;yes&#039;) {&lt;br /&gt;
	    return $Hello_gets{$opt}.&#039;, sir&#039;;&lt;br /&gt;
    }&lt;br /&gt;
	return $Hello_gets{$opt};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Set($@) {&lt;br /&gt;
	my ($hash, @param) = @_;&lt;br /&gt;
	&lt;br /&gt;
	return &#039;&amp;quot;set Hello&amp;quot; needs at least one argument&#039; if (int(@param) &amp;lt; 2);&lt;br /&gt;
	&lt;br /&gt;
	my $name = shift @param;&lt;br /&gt;
	my $opt = shift @param;&lt;br /&gt;
	my $value = join(&amp;quot;&amp;quot;, @param);&lt;br /&gt;
	&lt;br /&gt;
	if(!defined($Hello_gets{$opt})) {&lt;br /&gt;
		my @cList = keys %Hello_gets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
    $hash-&amp;gt;{STATE} = $Hello_gets{$opt} = $value;&lt;br /&gt;
    &lt;br /&gt;
	return &amp;quot;$opt set to $value. Try to get it.&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub Hello_Attr(@) {&lt;br /&gt;
	my ($cmd,$name,$attr_name,$attr_value) = @_;&lt;br /&gt;
	if($cmd eq &amp;quot;set&amp;quot;) {&lt;br /&gt;
        if($attr_name eq &amp;quot;formal&amp;quot;) {&lt;br /&gt;
			if($attr_value !~ /^yes|no$/) {&lt;br /&gt;
			    my $err = &amp;quot;Invalid argument $attr_value to $attr_name. Must be yes or no.&amp;quot;;&lt;br /&gt;
			    Log 3, &amp;quot;Hello: &amp;quot;.$err;&lt;br /&gt;
			    return $err;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
		    return &amp;quot;Unknown attr $attr_name&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
&lt;br /&gt;
=pod&lt;br /&gt;
=begin html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a name=&amp;quot;Hello&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Hello&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;i&amp;gt;Hello&amp;lt;/i&amp;gt; implements the classical &amp;quot;Hello World&amp;quot; as a starting point for module development. &lt;br /&gt;
    You may want to copy 98_Hello.pm to start implementing a module of your very own. See &lt;br /&gt;
    &amp;lt;a href=&amp;quot;http://www.fhemwiki.de/wiki/DevelopmentModuleIntro&amp;quot;&amp;gt;DevelopmentModuleIntro&amp;lt;/a&amp;gt; for an &lt;br /&gt;
    in-depth instruction to your first module.&lt;br /&gt;
    &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;a name=&amp;quot;Hellodefine&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Define&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; Hello &amp;amp;lt;greet&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Example: &amp;lt;code&amp;gt;define HELLO Hello TurnUrRadioOn&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        The &amp;quot;greet&amp;quot; parameter has no further meaning, it just demonstrates&lt;br /&gt;
        how to set a so called &amp;quot;Internal&amp;quot; value. See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#define&amp;quot;&amp;gt;commandref#define&amp;lt;/a&amp;gt; &lt;br /&gt;
        for more info about the define command.&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;a name=&amp;quot;Helloset&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Set&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;set &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;option&amp;amp;gt; &amp;amp;lt;value&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        You can &amp;lt;i&amp;gt;set&amp;lt;/i&amp;gt; any value to any of the following options. They&#039;re just there to &lt;br /&gt;
        &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; them. See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#set&amp;quot;&amp;gt;commandref#set&amp;lt;/a&amp;gt; &lt;br /&gt;
        for more info about the set command.&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Options:&lt;br /&gt;
        &amp;lt;ul&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;satisfaction&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;no&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;whatyouwant&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;can&#039;t&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;whatyouneed&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;try sometimes&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;a name=&amp;quot;Helloget&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Get&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;get &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;option&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        You can &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; the value of any of the options described in &lt;br /&gt;
        &amp;lt;a href=&amp;quot;#Helloset&amp;quot;&amp;gt;paragraph &amp;quot;Set&amp;quot; above&amp;lt;/a&amp;gt;. See &lt;br /&gt;
        &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#get&amp;quot;&amp;gt;commandref#get&amp;lt;/a&amp;gt; for more info about &lt;br /&gt;
        the get command.&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;a name=&amp;quot;Helloattr&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Attributes&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;attr &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;attribute&amp;amp;gt; &amp;amp;lt;value&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#attr&amp;quot;&amp;gt;commandref#attr&amp;lt;/a&amp;gt; for more info about &lt;br /&gt;
        the attr command.&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Attributes:&lt;br /&gt;
        &amp;lt;ul&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;formal&amp;lt;/i&amp;gt; no|yes&amp;lt;br&amp;gt;&lt;br /&gt;
                When you set formal to &amp;quot;yes&amp;quot;, all output of &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; will be in a&lt;br /&gt;
                more formal language. Default is &amp;quot;no&amp;quot;.&lt;br /&gt;
            &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=end html&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der HTML-Code zwischen den Tags &amp;lt;code&amp;gt;=pod&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;=cut&amp;lt;/code&amp;gt; dient zur Generierung der commandref.html. Der HTML-Inhalt wird automatisch beim Verteilen des Moduls im Rahmen des Update-Mechanismus aus jedem Modul extrahiert und daraus die Commandref in verschiedenen Sprachen erstellt. Eine detaillierte Beschreibung wie ein Commandref-Abschnitt in einem Modul definiert wird, siehe: [[Guidelines zur Dokumentation]]&lt;br /&gt;
&lt;br /&gt;
== Noch zu beschreiben ==&lt;br /&gt;
* Zweistufiges Modell für Module&lt;br /&gt;
* Funktion X_State_Fn: {{Link2Forum|Topic=32680}}, siehe auch [[DevelopmentState]]&lt;br /&gt;
* FW_summaryFn (wird von FHEMWEB aufgerufen fuer Raum-Uebersicht)&lt;br /&gt;
* FW_detailFn (wird von FHEMWEB aufgerufen fuer Detail-Ansicht)&lt;br /&gt;
* DevIO&lt;br /&gt;
* AsyncOutputFn / asyncOutput&lt;br /&gt;
* SetExtensions / SetExtensionsCancel&lt;br /&gt;
* ExceptFn (gleiche wie ReadFn aber EXCEPT_FD anstelle von FD)&lt;br /&gt;
* FingerprintFn&lt;br /&gt;
* ParseFn&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Maxix2</name></author>
	</entry>
</feed>