http://wiki.fhem.de/w/api.php?action=feedcontributions&user=JoeAll&feedformat=atomFHEMWiki - Benutzerbeiträge [de]2024-03-28T11:16:52ZBenutzerbeiträgeMediaWiki 1.39.3http://wiki.fhem.de/w/index.php?title=Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&diff=28109Telefonat als Auslöser für Aktionen2018-10-17T05:57:12Z<p>JoeAll: /* Code */ " bei Nummer korrigiert</p>
<hr />
<div>Im {{Link2Forum|Topic=13066|LinkText=Forum}} wurden in einer ausführlichen Diskussion Möglichkeiten beschrieben, mit einem Telefonanruf bestimmte Aktionen auszulösen. Dabei geht es unter anderem auch um<br />
* Signalisierung eines Anrufs durch Licht<br />
* Aktionen abhängig von der Rufnummer des Anrufers<br />
* FHEM auf Fritz!Box und/oder Raspberry Pi<br />
<br />
== Beschreibung ==<br />
* Eine [[AVM_Fritz!Box|FritzBox]] dient als Zentrale für zwei Familien mit jeweils eigener Rufnummer<br />
* FHEM läuft auf einem Raspberry Pi<br />
* Bei einkommenden Anrufen auf eine der beiden Nummern (im Skript die 1234567) soll:<br />
** der Fernseher das laufende Programm pausieren (beim stumm-schalten verpasste man ja den Film ;) )<br />
** das Licht angehen (damit man im Dunkeln das Telefon leichter findet, vorausgesetzt es ist überhaupt dunkel)<br />
* Nach dem Telefonat soll:<br />
** ein 10-sekündiger Timer laufen (damit man Zeit hat sich wieder gemütlich vor den Fernseher zu setzen)<br />
** der Fernseher weiterlaufen<br />
** das Licht seinen Ursprungszustand wieder einnehmen (=sollte es vor dem Telefonat an gewesen sein, soll es nach dem Telefonat natürlich an bleiben)<br />
<br />
<br />
== Eingesetzte Geräte ==<br />
* [http://fhem.de/commandref.html#FB_CALLMONITOR FritzBox mit dem Callmonitor Helpermodul]<br />
** Fritz_Box (<=Bezeichnung im Skript)<br />
* [[HM-Sen-MDIR-O Funk-IR-Bewegungsmelder außen|HM Bewegungsmelder außen]] (der einen unabhängigen Helligkeitswert liefert)<br />
** CUL_HM_HM_Sen_MDIR_O_1A8306 (<=Bezeichnung im Skript)<br />
* SamsungTV (zur Zeit noch mit dem [http://forum.fhem.de/index.php/topic,12988.0 Codeschnipsel] aus dem Forum)<br />
** STV4 (<=Bezeichnung im Skript)<br />
<br />
<br />
== So funktioniert es ==<br />
Anruf beginnt<br />
* da lokale Variablen nur innerhalb eines Notifies Gültigkeit haben, werden für den Lichtstatus zwei Dummy-Devices eingerichtet<br />
* ein Notify wird vom Callmonitor getriggert<br />
* die Zielrufnummer wird geprüft (siehe oben, 2 Familien, 2 Telefonnummern, 1 FritzBox)<br />
* die Helligkeit wird ausgelesen<br />
* der Status vom Licht wird erfasst<br />
* Prüfung, ob Telefonat für die richtige Familie ist (läutet es auf der anderen Nummer, interessiert es nicht)<br />
* TV Pause Befehl<br />
* prüfen ob die Helligkeit einen Schwellenwert unterschreitet (100 hat sich in meinem Fall als guter Wert herausgestellt)<br />
* das Dummy Device wird mit dem aktuellen Lichtzustand gefüttert<br />
* das Licht wird eingeschaltet<br />
<br />
Anruf beendet<br />
* Notify auf beenden des Anrufs<br />
* der Lichtzustand jetzt wird gesichert<br />
* der alte Lichtzustand wird vom Dummy Device abgefragt<br />
* Prüfung ob das Telefonat mit der richtigen Nummer gehalten wurde (=das gleiche wie oben auch)<br />
* mit 10 Sekunden Verzögerung geht der Fernseher wieder auf Play<br />
* Prüfung, ob der alte Lichtzustand nicht identisch mit dem Neuen ist<br />
* mit 10 Sekunden Verzögerung Licht aus<br />
<br />
<br />
== Code ==<br />
In der fhem.cfg<br />
<nowiki><br />
#### Meine eigenen Dummys<br />
define Licht_Alt dummy<br />
define Licht_Neu dummy<br />
<br />
## Jemand ruft mich an<br />
define TelefonAN notify Fritz_Box:event:.ring { \<br />
my $number=(ReadingsVal("Fritz_Box","internal_number",99));;\<br />
my $Helligkeit=(ReadingsVal("CUL_HM_HM_Sen_MDIR_O_1A8306","brightness",99));;\<br />
my $Licht_An=Value("OG_wz_WS_LICHT");;\<br />
if ($number == "1234567") { \<br />
fhem "set STV4 PAUSE";;\<br />
if ($Helligkeit <= 100) { \<br />
fhem ("set Licht_Alt on") if (($Licht_An) eq "on");;\<br />
fhem ("set OG_wz_WS_LICHT on") if (($Licht_An) ne "on");;\<br />
} \<br />
} \<br />
}<br />
<br />
## Anruf beendet<br />
define TelefonAUS notify Fritz_Box:event:.disconnect { \<br />
my $number=(ReadingsVal("Fritz_Box","internal_number",99));;\<br />
my $Licht_Neu=Value("OG_wz_WS_LICHT");;\<br />
my $Licht_Alt=Value("Licht_Alt");;\<br />
if ($number == "1234567") { \<br />
fhem "define Latenz2 at +00:00:10 set STV4 PLAY";;\<br />
if ($Licht_Alt ne $Licht_Neu) { \<br />
fhem "define Latenz at +00:00:10 set OG_wz_WS_LICHT off";;\<br />
}\<br />
}\<br />
}<br />
</nowiki><br />
<br />
== Optimierungsmöglichkeiten ==<br />
* der Lichtzustand könnte über [http://fhem.de/commandref.html#LightScene LightScene] eleganter gelöst werden<br />
** nämlich den Zustand speichern, am Schluss wieder laden; könnte so auch Dimmer und mehrere Lichter elegant erfassen<br />
* Prüfung, ob der Fernseher überhaupt eingeschaltet ist ([http://fhem.de/commandref.html#PRESENCE PRESENCE] auf die IP vom TV), um Fehlermeldungen im Log zu vermeiden(ist er nämlich aus, gibt es eine Fehlermeldung im Log, dass nicht auf Play/Pause geschaltet werden kann)<br />
* das .disconnect ist suboptimal, wenn man selber einen Anruf getätigt hat (da greift nur das zweite Notify, es lässt also auf den laufenden Fernseher einen Play Befehl los, was eine Timeshift-Einblendung im laufenden Bild erzeugt;<br />
** ist nur ein optisches Problem, aber dennoch ist es halt da<br />
<br />
== Dank ==<br />
Besonderer Dank geht an Puschel, der doch reichlich Geduld bewiesen hat :)<br />
<br />
== Links ==<br />
* FHEM Forum: {{Link2Forum|Topic=13066|LinkText=Meine ersten zwei Notifies}}<br />
<br />
[[Kategorie:Examples]]<br />
[[Kategorie:Code Snippets]]</div>JoeAllhttp://wiki.fhem.de/w/index.php?title=Heizung:_Verbrauchsoptimierung,_Radiator/Fu%C3%9Fboden-Steuerung&diff=18702Heizung: Verbrauchsoptimierung, Radiator/Fußboden-Steuerung2017-01-20T13:13:34Z<p>JoeAll: /* Heizungssteuerung (Fußboden) */ Wort korrigiert</p>
<hr />
<div>Diese Seite beschreibt die Optimierungen und fhem-Installation bezüglich der Heizungssteuerung in unserem Haus von 1904, welches wir im Sommer 2014 gekauft haben und beschreibt die notwendigen Schritte und Ergebnisse zur Kostenreduzierung.<br />
<br />
__TOC__<br />
<br />
== Ausgangssituation ==<br />
[[Datei:Morgennebel-HeizungssteuerungHOWTO-Heizung.jpg|mini|rechts|'''Bild 1''': Viessmann Mono-Vitola b-f mit Weishaupt Gasbrenner]]<br />
<br />
Mit Übergabe des Hauses war als Ausgangssituation vorhanden:<br />
<br />
* 16 Räume im Erdgeschoß und ausgebauten Dachboden, davon<br />
# 7 Räume nur mit Radiatoren<br />
# 5 Räume nur mit Fußbodenheizung<br />
# 2 Räume unbeheizt<br />
# 2 Räume kombiniert beheizt mit Radiatoren und Fußbodenheizung<br />
* Viessmann Mono-Vitola b-f mit 43kW Weishaupt-Gasbrenner und Holzkammer (seit 10 Jahren nicht mehr benutzt), siehe Bild 1<br />
* Viessmann Tetramatik Heizungssteuerung mit digitaler Schaltuhr SU und außentemperaturabhängiger Steuerung WS<br />
* Warmwassererzeugung über 200l Boiler, rein elektrisch<br />
* 1100m Fußbodenverrohrung im Estrich/Beton in Kupferohr<br />
* Grundfoss Umwälzpumpe mit 170W Verbrauchsleistung für die Fußbodenheizung<br />
* 17 Radiatoren mit vier verschiedenen Thermostatköpfen und Heizungsventilen<br />
* Gasverbrauch von 73.000kWh im Jahr und 380 EUR Abschlagzahlung im Monat<br />
* Ein Viessmann 4-fach Mischer, der den max. 40 Grad Vorlauf für die Fußbodenheizung erzeugte<br />
* Eine UPONOR Funksteuerung für die Fußbodenheizung im Obergeschoß mit unbeschrifteten Funkthermostaten<br />
<br />
== Probleme nach dem Einzug ==<br />
[[Datei:Morgennebel-HeizungssteuerungHOWTO-Fussbodenmischer.jpg|mini|rechts|'''Bild 2''': Fussbodenmischer und -pumpen]]<br />
Bereits im Winter 2014/2015 gab es erhebliche Probleme mit der Heizung. Einzelne Räume wurden maximal 18 Grad warm, andere überhitzten schnell. Unterschritt die Außentemperatur die Frostgrenze, fing die Fußbodenheizung an zu "stottern": der Mischer stand morgens in einer Stellung, die das aufgeheizte Kesselwasser direkt und schnell in die Fußbodenheizung einspeiste. Als Folge deaktivierte ein Thermostat (auf 60 Grad eingestellt) die Fußbodenpumpe und das Wasser mußte langsam abkühlen (60-90 Minuten), bis die Pumpe wieder ansprang und wieder sofort abgeschaltet wurde - denn die Tetramatik hat die Mischerstellung nicht verändert.<br />
<br />
Kurzfristig wurde das Problem durch eine neue Einstellung der Heizkurven entschärft. Die Radiatoren benötigten jedoch einen bis zu 75°C warmen Vorlauf, um die Zimmer im Obergeschoß auf 18 Grad aufzuwärmen. Die Fußbodenheizungskurven wurden jeden Morgen leicht korrigiert, um die maximale Wärme (ca. 40 Grad im FB-Vorlauf) zu erreichen.<br />
<br />
Die Diagnose des "Stotterns" wurde zusammen mit einer Heizungsfirma als Theorie entwickelt, konnte jedoch nicht eindeutig belegt werden.<br />
<br />
Zum besseren Verständnis wurde zunächst die Verrohrung und die verwendeten Komponenten dokumentiert. Der Temperaturbegrenzer im Fußbodenkreis erwies sich als defekt und schaltete bei einer Konfiguration von 60°C bereits bei 40°C die Fußbodenpumpe ab.<br />
<br />
[[Datei:Morgennebel-HOWTO-Heizungsoptimierung-Anlagendiagramm.png|600px]]<br />
<br />
Laut Schornsteinfeger und Heizungsfirma war die Heizungsanlage selbst einwandfrei, jedoch war die Tetramatik-Steuerung mechanisch am Ende des Lebens. Die Abdeckungen fielen ab, das Hartplastik war versprödet, die Drehwiderstände für die Heizungskurven-Einstellung verstaubt.<br />
<br />
== Lösungsansatz ==<br />
Zur Verifizierung der Probleme und zum Aufbau eines Smart-Homes wurde fhem in der Kombination mit '''Homematic''' und '''1-Wire''' ausgewählt, da die ZWave-Experimente nicht sehr erfolgreich waren. Die vorhandene Tetramatik-Heizungssteuerung sollte auf ein Minimum beschränkt werden und die notwendige Intelligenz und Steuerung soweit wie möglich nach fhem verlagert werden.<br />
<br />
=== fhem und 1-Wire-Sensorik ===<br />
Zur Erhöhung des Verständnisses der Arbeitsweise der Heizung wurde als erster Schritt die verschiedenen Rück- und Vorläufe überwachst. Hierzu kam ein Rasberry Pi mit einem RPI3-Erweiterung von [http://www.sheepwalkelectronics.co.uk/product_info.php?products_id=67 Sheepwalk Electronics] in England zum Einsatz. Die RPI3-Erweiterung stellt 8 1-Wire-Bussysteme zur Verfügung. Zwei Busse werden direkt mit RJ45-Ports präsentiert, 6 weitere benötigen einen Bussplitter ([http://www.sheepwalkelectronics.co.uk/product_info.php?cPath=22&products_id=34 RPI3a] von Sheepwalk Eletronics) und stellen 1-Wire Busse als RJ45 oder Schraubverbindung zur Verfügung.<br />
<br />
Ebenfalls von Sheepwalk Eletronics kamen die passenden Sensoren ([http://www.sheepwalkelectronics.co.uk/product_info.php?cPath=23&products_id=52 SWE0], Typ DS18B20 mit 2m Anschlußkabel) zum Einsatz. <br />
<br />
Diese wurden liebevoll provisorisch (siehe Bild 2) an die entsprechenden Rohre verbunden und in fhem konfiguriert. In fhem waren dann mit Hilfe des [[Neues_Charting_Frontend]] aussagefähige Diagramme und Bewertungen über das Verhalten der Heizung möglich:<br />
<br />
[[Datei:Morgennebel-HeizungssteuerungHOWTO-NachtAbsenkung+Taktung.jpg|mini|rechts|'''Bild 3''': Heizungstaktung mit Nachtabsenkung]]<br />
<br />
In der Konfiguration wurden alle Sensoren in fhem konfiguriert und auf 20 oder 60 Sekunden Abfrage konfiguriert:<br />
<br />
define EG.Heizung.Fussboden.Vorlauf OWDevice 28.A6E710050000 20<br />
attr EG.Heizung.Fussboden.Vorlauf IODev RPi1Wire<br />
attr EG.Heizung.Fussboden.Vorlauf model DS18B20<br />
attr EG.Heizung.Fussboden.Vorlauf room EG.HWR,OWDevice<br />
<br />
define EG.Heizung.Radiatoren.Vorlauf OWDevice 28.AD8A10050000 60<br />
attr EG.Heizung.Radiatoren.Vorlauf IODev RPi1Wire<br />
attr EG.Heizung.Radiatoren.Vorlauf model DS18B20<br />
attr EG.Heizung.Radiatoren.Vorlauf room EG.HWR,OWDevice<br />
<br />
Sehr deutlich ist in Bild 3 der korrekte Normalbetrieb der Heizung zu sehen: die Heizung taktet etwa alle 5 Minuten (in Abhängigkeit von der Außentemperatur und dem Verbrauch) mit einem An/Aus-Intervall. In der Zeit zwischen 22:00 und 5:00 ist eine Nachtabsenkung konfiguriert und die Kessel- und Vorlauftemperaturen kühlen ab. Nach der Nachtabsenkung sind die Taktlaufzeiten erheblich länger, bis die gewünschte Kessel- und Vorlauftemperatur wieder erreicht wird.<br />
<br />
Vor der Nachtabsenkung arbeitet der Mischer (orange Linie) korrekt, die Fußboden-Vorlauftemperatur schwankt im Rhythmus der Taktung des Brenners um einen Mittelwert von 35°C. Nach der Nachtabschaltung gibt es in der Fußboden-Vorlauftemperatur erhebliche Schwankungen: die Temperatur steigt kurzzeitig bis auf 48°C, was zur Abschaltung der Fußboden-Pumpe führt. Nach Abkühlung des Vorlaufes wird die Pumpe wieder eingeschaltet, erzeugt wieder eine Spitze und wird wieder abgeschaltet - der Mischer wird nicht vorbeugend zurückgefahren und langsam geöffnet.<br />
<br />
[[Datei:Morgennebel-HeizungssteuerungHOWTO-Taktung.png|mini|rechts|'''Bild 4''': Funktionierende Mischung für Fußboden]]<br />
<br />
Bild 4 zeigt im Detail die Temperaturen der Radiatoren und des Fußbodenmischers: die oberste rote Kurve zeigt Temperatur des Fußbodenkreises vor dem Mischer (deutlich die Taktung des Brenners zu erkennen). Die gelbe und lila Kurve zeigen die Fußboden-Verlauftemperaturen nach dem Mischer an zwei verschiedenen Positionen, die blauen unteren Linien sind die Rücklauftemperaturen vom Fußbodenmischer und zurück zum Kessel.<br />
<br />
In diesem Beispiel arbeitet die Heizung korrekt ohne zu stottern.<br />
<br />
[[Datei:Morgennebel-HeizungssteuerungHOWTO-Fussbodenmischer-stottern.png|mini|rechts|'''Bild 5''': Stotternde Fußbodenmischung]]<br />
<br />
In Bild 5 arbeitet die Mischersteuerung fehlerhaft und zu heißes Wasser im Vorlauf führt zum abschalten der Fußbodenpumpe. Es dauert bis zu 90 Minuten, bis die Temperatur abgesunken ist, die Pumpe erneut startet, und wieder abgeschaltet wird. Die Viessmann Tetramatik arbeitet hier nicht korrekt und führt den Mischer nicht zurück.<br />
<br />
Mit diesen Diagrammen war der vermutete Fehler eindeutig bewiesen und wurde temporär durch tägliche Justierungen der Heizkurven umgangen.<br />
<br />
Das Graphing Frontend erwies sich als extrem langsam und ressourcenhungrig. Als erste Schritt wurde das Logging in die sqllite-Datenbank minimiert, als zweiter Schritt ein zusätzliches Frontend auf Basis eines [http://www.hardkernel.com/main/products/prdt_info.php?g_code=g138745696275 ODROID U3] Boards verbaut. Dieses bietet 1.7GHz Quad-Core CPU und 2GB RAM für knapp 50 EUR und benötigt keinen Lüfter. Auch die 16GB eMMC-Speicherlösung verbesserte die Ansprechzeit deutlich. Der Raspberry Pi wurde auf die 8 1Wire-Bussysteme und -Sensoren beschränkt. Beide Boards wurden aus einem 4fach-USB-Ladegerät versorgt. Trotz der guten technischen Werte war das ODROID Board nicht in der Lage, MySQL als Datenbank zu verwenden - sqllite funktionierte jedoch leidlich.<br />
<br />
=== Heizungssteuerung (Radiatoren) ===<br />
Als nächster Schritt wurden häufig benutzte Räume mit Radiatoren mit [[HM-CC-RT-DN_Funk-Heizkörperthermostat|Homematic HM-CC-RT-DN Heizkörperthermostaten]] und [[HM-TC-IT-WM-W-EU_Funk-Wandthermostat_AP|Homematic HM-TC-IT-WM-W-EU Wandthermostaten]] versehen. Dies geschah schrittweise, etwa ein Raum je zwei Wochen. Die langsame Installation erlaubte es<br />
<br />
* Die Familie an den Gebrauch der Wandthermostaten zu gewöhnen<br />
* Die Lernzeit der Thermostaten und das Schwingverhalten auf einen Raum zu begrenzen<br />
* Die Kosten je Monat niedrig zu halten<br />
<br />
Die Fenster wurden mit [[HM-SEC-SC_Tür-Fensterkontakt|Fensterkontakten]] versehen und alle Geräte in fhem angelernt, untereinander gepeert und gepairt.<br />
<br />
Alle Thermostaten erhielten Wochenprofile auf der Basis von [[HomeMatic_HMInfo_TempList/Weekplan|Temperaturlisten]] namens 'tempList.cfg' im fhem-Verzeichnis. Die Wandthermostaten erlauben die Ermittlung der Raumfeuchte und sollen später für eine Lüftungsempfehlung genutzt werden.<br />
<br />
=== Heizungssteuerung (Fußboden) ===<br />
[[Datei:Morgennebel-HeizungssteuerungHOWTO-FB-Alpha5.jpg|mini|rechts|''Bild 6'': Möhlenhoff Alpha-5 Stellantriebe]]<br />
<br />
Im Obergeschoß wurde die vorhandene UPONOR funkbasierende Lösung zur Steuerung der Fußbodenheizung zunächst entfernt. Die Uponor Ventile wurden durch [http://www.amazon.de/Stellantrieb-Buderus-Adapter-Oventrop-Bianchi/dp/B00K4UDS96 Alpha 5 Stellantriebe von Möhlenhoff] mit VA10-Adapter getauscht, die zu dem vorhandenen Fußbodenverteiler paßten. Die Alpha-5 Stellantriebe arbeiten mit 230V AC mit einer Leistungsaufnahme von 1W im Betrieb und sind nur als NC (normally-closed) Variante zu finden.<br />
<br />
[[Datei:Morgennebel-HeizungssteuerungHOWTO-FB-230V-Steuerung.jpg|mini|rechts|''Bild 7'': Homematic 230V-Aktoren für Stellantriebe]]<br />
<br />
Um die Stellantriebe zu kamen zwei [[HM-LC-Sw4-DR_4fach_Schaltaktor_Hutschiene|Homematic 4fach Hutschienen Aktor]] und ein passendes Gehäuse in Aufputzvariante zum Einsatz. In allen Räumen wurden wieder mit [[HM-TC-IT-WM-W-EU_Funk-Wandthermostat_AP|Homematic HM-TC-IT-WM-W-EU Wandthermostaten]] versehen und als einfache Lösung zunachst die Aktoren mit dem '''_SwitchTr'''-Kanal verbunden.<br />
<br />
Das Rauchplastik-Gehäuse erlaubt eine wunderbare visuelle Kontrolle der Heizsituation im Obergeschoß.<br />
<br />
Die einfache Lösung auf Basis des '''_SwitchTr'''-Kanals zeigte im ersten Winter deutliche Nachteile:<br />
<br />
# Die Temperatur im Raum mit Fußbodenheizung stieg deutlich über die desired-temp an<br />
# Alle Fußbodenkreise wurden gemeinsam morgens aktiviert und die Temperatur insgesamt stieg zu langsam an<br />
<br />
Daher wurde für den folgenden Winter die Fußbodenheizung auf das [[Steuerung_einer_Fussbodenheizung_mit_dem_PWM-Modul|PWM-Modul]] umgestellt. Dazu wurde ein '''PWM'''-Modul definiert:<br />
<br />
define PWM.FussbodenHeizung PWM 60 900 180 1 4,4 2,1,0 D_SwitchEGHWRPumpeFussbodenheizung,0,360,on,60<br />
<br />
dies ist die zentrale Instanz für die gesamte Fußbodenheizung (in diesem Fall für Erd- und Obergeschoß). Die Parameter bedeuten:<br />
<br />
* 60: Alle 60 Sekunden wird das PWM-Modul neu berechnet<br />
* 900: Das Schaltintervall beträgt 900 Sekunden (15 Minuten)<br />
* 180: Minimale Ein-/Auszeit. Da die Stellantriebe ca. 2.5-3.0 Minuten für einen Schaltvorgang benötigen, sind 3 Minuten ausreichend<br />
* 1: Entspricht einem möglichen Einschaltzyklus von 100% - d.h. ein Stellantrieb kann für die vollen 15 Minuten aktiv sein<br />
* 4: Maximal 4 Räume können innerhalb eines Schaltintervalls angeschaltet werden<br />
* 4: Maximal 4 Räume können innerhalb eines Schaltintervalls ausgeschaltet werden<br />
* 2: Zwei Räume dürfen eingeschaltet werden<br />
* 1: 1 Raum darf ausgeschaltet bleiben<br />
* 0: Mit dem Wert 0 indiziert, daß alle Räume ausgeschaltet werden können<br />
* D_SwitchEGHWRPumpeFussbodenheizung ist ein Dummy, der in Verbindung mit einem DOIF-Kommando die Fußbodenpumpe an- oder ausschaltet<br />
* 0: Indiziert, daß die Pumpe auf Basis der Räume mit Heizbedarf aktiviert wird<br />
* 360: Die Pumpe läuft 360 Sekunden nach<br />
* on: Das Kommando um die Pumpe anzuschalten<br />
* 60: Es wird 60 Sekunden auf den Stellantrieb gewartet, bis die Pumpe aktiviert wird<br />
<br />
Damit ist das PWM-Modul zunächst definiert und für jeden Fußboden-Kreis wird zusätzlich das PWMR-Modul (das zugehörige '''Raum'''-Modul) definiert. Sollte ein Raum mehrere Fußboden-Heizkreise aufweisen, lassen sich diese mit einer '''structure''' zusammenfassen.<br />
<br />
Hier ein Beispiel mit einem einfachen Raum:<br />
<br />
define PW_RoomKindSZ PWMR PWM.FussbodenHeizung 1,0 OG.Kind.Schlafzimmer.Wandthermostat:measured-temp OG.Flur.Fussboden.Links_Sw_FBKindSchlafzimmer<br />
<br />
dabei bedeutet:<br />
<br />
* PWMR: das Modul Fußbodenheizkreis<br />
* PWM.FussbodenHeizung: das bereits zentrale Modul der PWM-Steuerung<br />
* 1,0: Faktor und Gewichtung (Standardwerte)<br />
* OG.Kind.Schlafzimmer.Wandthermostat:measured-temp: der Homematic-Wandthermostat und das Reading, um die aktuelle IST-Temperatur im Raum abzufragen<br />
* OG.Flur.Fussboden.Links_Sw_FBKindSchlafzimmer: der Schalter, der den zugehörigen Stellantrieb an- oder ausschaltet<br />
<br />
Dazu gehören die Readings:<br />
<br />
attr PW_RoomKindSZ desiredTempFrom OG.Kind.Schlafzimmer.Wandthermostat:desired-temp<br />
<br />
dies übernimmt die Wunschtemperatur aus dem Wochenprofil des Wandthermostaten<br />
<br />
Das Diagramm zeigt nun deutlich, wie sich die IST-Temperatur langsam an die SOLL-Temperatur herantastet und die Pausen zwischen den Pulsen immer länger werden:<br />
<br />
[[Datei:PWMR-Fußbodenkreise.png]]<br />
<br />
=== Einsparungen ===<br />
Im ersten Jahr nach Einbau der Funkthermostaten für Radiatoren in fünf Räumen und dem Wechsel der Steuerung der Fußbodenheizung im Obergeschoß wurde eine Verbrauchsreduzierung von '''20%''' gemessen. In Zahlen bedeutete dies eine Rückzahlung vom Gasanbieter in Höhe von gut 1.100 EUR sowie die Reduzierung der monatlichen Abschläge um 55 EUR. Auf ein Jahr gesehen wurden damit die Betriebskosten um 1.760 EUR reduziert, wobei Investitionen in Höhe von etwa 750 EUR für die Homematic-Komponenten, Raspberry und 1-Wire-Sensoren, HMLAN-Sender und Gehäuse und Kabel aufzubringen waren - d.h. es Gewinn von 1.010 EUR ohne Einrechnung der vielen Arbeitsstunden.<br />
<br />
Im zweiten Jahr wurden alle weiteren Radiatoren auf Homematic umgerüstet sowie die Fußbodenheizung im Erdgeschoß auf Homematic umgestellt. Durch diese Maßnahmen sind weitere Einsparungen abzusehen.<br />
<br />
=== STELLMOTOR Mischersteuerung ===<br />
Um das eindeutige identifizierte Stottern der Fußbodenheizung zu beheben, wurde der Fußbodenmischer auf eine Ansteuerung von fhem umgestellt. Für die Ansteuerung waren Relais notwendig, da der Mischermotor mit 230V, maximal 4A Anschlußwerten spezifiziert war. Zur Ansteuerung wurde daher ein 1-Wire 8fach Relaisboard von eBay [http://www.ebay.de/itm/1-Wire-8-Channel-Relay-Module-Board-with-Dallas-DS2408-chipset-/172063693628 Verkäufer leotron_87] in ein Verteilergehäuse eingebaut und mit dem vorhandenen 1-Wire-Bus verbunden.<br />
<br />
Das Relaisboard benötigt eine 12V-Spannungsversorgung und wurde von fhem problemlos erkannt:<br />
<br />
define EG.Heizung.8Relais OWDevice 29.3D5516000000<br />
attr EG.Heizung.8Relais IODev RPi1Wire<br />
attr EG.Heizung.8Relais model DS2408<br />
attr EG.Heizung.8Relais room EG.HWR,OWDevice<br />
<br />
mittels Kommandos wie <br />
<br />
set EG.Heizung.8Relais PIO.7 on<br />
set EG.Heizung.8Relais PIO.6 0<br />
<br />
konnten die einzelnen Relais angesteuert und geschaltet werden. Jedes Relais stellt NO (normally-open) und NC (normally-closed) Kontakte zur Verfügung und ist für verschiedene Spannungsbereiche (bei der Bestellung auszuwählen) freigegeben. Die gekaufte Variante unterstützte 7A bei 250V AC, so daß die maximale Anschlußleistung des Mischermotors kein Problem darstellte.<br />
<br />
Da der eBay-Verkäufer aus Bulgarien liefert, wurde eine zusätzliche Relaisplatine in die Ersatzteilkiste eingelagert.<br />
<br />
Der Mischermotor wurde nach Anleitung der [[STELLMOTOR|Stellmotor]] Anleitung im Schaltbild '''wechsel''' verbunden. Hierbei half eine Google-Suche nach einer Installationsanleitung des verbauten Viessmann-Mischers, welches die genauen Anschlußpläne beinhaltete. Bei Anschluß des Mischermotors ist ein 4- oder 5-poliges Installationskabel notwendig.<br />
<br />
[[Datei:Morgennebel-HeizungssteuerungHOWTO-8fach-Relaiskarte.jpg|mini|rechts|''Bild 8'': Relaiskarte für Mischersteuerung und Stellantriebe]]<br />
<br />
Nach der abschliessenden Konfiguration des STELLMOTOR-Modules (Laufzeit, Relaisnamen):<br />
<br />
define EG.HWR.Fussbodenmischer STELLMOTOR FhemDev<br />
attr EG.HWR.Fussbodenmischer STMcalibrateDirection L<br />
attr EG.HWR.Fussbodenmischer STMdebugToLog3 0<br />
attr EG.HWR.Fussbodenmischer STMfhemDevRL EG.Heizung.8Relais PIO.6<br />
attr EG.HWR.Fussbodenmischer STMfhemDevSTART EG.Heizung.8Relais PIO.7<br />
attr EG.HWR.Fussbodenmischer STMinvertOut 0<br />
attr EG.HWR.Fussbodenmischer STMlastDiffMax 1<br />
attr EG.HWR.Fussbodenmischer STMmapOffCmd 0<br />
attr EG.HWR.Fussbodenmischer STMmapOnCmd 0<br />
attr EG.HWR.Fussbodenmischer STMmaxDriveSeconds 118<br />
attr EG.HWR.Fussbodenmischer STMmaxTics 100<br />
attr EG.HWR.Fussbodenmischer STMpollInterval 0.1<br />
attr EG.HWR.Fussbodenmischer STMresetOtherDeviceAtCalibrate 0<br />
attr EG.HWR.Fussbodenmischer STMrlType wechsel<br />
attr EG.HWR.Fussbodenmischer STMtimeTolerance 0.01<br />
attr EG.HWR.Fussbodenmischer room EG.HWR<br />
<br />
erfolgte der erste erfolgreiche Test durch<br />
<br />
set EG.HWR.Fussbodenmischer <Wert><br />
set EG.HWR.Fussbodenmischer cablibrate<br />
<br />
Das Ziel war eine Führung der Fußbodenvorlauftemperatur nahe an der maximal möglichen Temperatur (da sonst die oberen Räume zu kalt blieben). Für diese Steuerung waren zwei Schritte notwendig:<br />
<br />
# Ermittlung eines gleitenden Mittelwertes über die Fußbodenvorlauftemperatur (um kurzfristige Spitzen zu glätten)<br />
# Aufbau einer DOIF-Anweisung zur relativen Steuerung des Mischers<br />
<br />
Der gleitende Mittelwert wurde nach [[Gleitende_Mittelwerte_berechnen_und_loggen#Gleitender_Mittelwert_f.C3.BCr_beliebige_Readings|Anleitung]] in der 99_MyUtils.pm integriert und als Reading des bereits vorhandenen 1-Wire-Sensors integriert:<br />
<br />
define EG.Heizung.Mischer.Vorlauf OWDevice 28.3CD910050000 20<br />
attr EG.Heizung.Mischer.Vorlauf IODev RPi1Wire<br />
attr EG.Heizung.Mischer.Vorlauf model DS18B20<br />
attr EG.Heizung.Mischer.Vorlauf room EG.HWR,OWDevice<br />
attr EG.Heizung.Mischer.Vorlauf userReadings temperature.avg {movingAverage("EG.Heizung.Mischer.Vorlauf","temperature",300)}<br />
<br />
dies erzeugt das zusätzliche Reading '''temperature.avg''' für die Fußbodenvorlauftemperatur mit dem Mittel der letzten 5 Minuten.<br />
<br />
Die Regelung der Vorlauftemperatur selbst wurde über ein DOIF-Kommando erzeugt:<br />
<br />
define DI_MischerCommands DOIF ([EG.Heizung.Mischer.Vorlauf:temperature.avg] < 22 and [EG.HWR.Fussbodenmischer:position]<97 and [EG.Heizung.8Relais:PIO.3] eq "on")<br />
(set EG.HWR.Fussbodenmischer {([EG.HWR.Fussbodenmischer:position]+1)}) ## Cmd 1: Schnell oeffnen<br />
DOELSEIF ([EG.Heizung.Mischer.Vorlauf:temperature.avg] < 26 and [EG.HWR.Fussbodenmischer:position]<98 and [EG.Heizung.8Relais:PIO.3] eq "on")<br />
(set EG.HWR.Fussbodenmischer {([EG.HWR.Fussbodenmischer:position]+1)}) ## Cmd 2: Ganz langsam oeffnen<br />
DOELSEIF ([EG.Heizung.Mischer.Vorlauf:temperature.avg] < 30 and [EG.HWR.Fussbodenmischer:position]<98 and [EG.Heizung.8Relais:PIO.3] eq "on")<br />
(set EG.HWR.Fussbodenmischer {([EG.HWR.Fussbodenmischer:position]+1)}) ## Cmd 3: Noch ein bisschen<br />
DOELSEIF ([EG.Heizung.Mischer.Vorlauf:temperature.avg] > 35 and [EG.HWR.Fussbodenmischer:position]>3)<br />
(set EG.HWR.Fussbodenmischer {([EG.HWR.Fussbodenmischer:position]-2)}) ## Cmd 4: Viel zu heiss, schnell zu<br />
DOELSEIF ([EG.Heizung.Mischer.Vorlauf:temperature.avg] > 34 and [EG.HWR.Fussbodenmischer:position]>2)<br />
(set EG.HWR.Fussbodenmischer {([EG.HWR.Fussbodenmischer:position]-1)}) ## Cmd 5: Zu heiss, schnell zu<br />
DOELSEIF ([EG.Heizung.Mischer.Vorlauf:temperature.avg] > 33 and [EG.HWR.Fussbodenmischer:position]>2)<br />
(set EG.HWR.Fussbodenmischer {([EG.HWR.Fussbodenmischer:position]-1)}) ## Cmd 6: Noch ein bisschen<br />
DOELSEIF ([03:50])<br />
(set EG.HWR.Fussbodenmischer calibrate) ## Cmd 7: Calibrieren fuer Tagprogramm<br />
DOELSEIF ([04:00])<br />
(set EG.HWR.Fussbodenmischer 40) ## Cmd 8: Headstart, Ende der Nachtabsenkung<br />
attr DI_MischerCommands cmdpause 60:120:180:60:120:180:0:0<br />
attr DI_MischerCommands wait 180,240,300,180,240,480,0,0<br />
attr DI_MischerCommands do always<br />
<br />
Die in dieser '''individuellen''' Konfiguration ist die gewünschte Zieltemperatur der Fußbodenvorlauftemperatur zwischen 30° und 32°C (im fest verbauten Thermometer bedeutet dies knapp unter 40°C). Die Temperatur des Sensors (und des Mittelwertes) weicht jedoch von den eingebauten physikalischen Thermostaten ab. Vermutlich liegt das an der zusätzlichen Plastikabschirmung der Sensoren und der Dicke der Rohre - die Zieltemperaturen wurden daher durch Try-n-Error ermittelt.<br />
<br />
Die ersten drei IF-Bedingungen öffnen den Mischer (erhöhen die Fußboden-Vorlauftemperatur). Die folgenden drei IF-Bedingungen schließen den Mischer (verringern die Fußboden-Vorlauftemperatur). Die letzten beiden Anweisungen kalibrieren morgens den Mischer und sorgen für einen schnelleren Start.<br />
<br />
Jede der drei öffnenden IF-Bedingungen sind auf leicht unterschiedliche Temperaturen nahe der Zieltemperatur (zwischen 30-32 Grad) eingestellt. Eine Justierung der Öffnungsgeschwindigkeit findet über die Attribute wait und cmdpause statt: ist die Temperatur weit von der Zieltemperatur entfernt, wird kurz gewartet und der Mischer beliebig oft geöffnet. Ist die Temperatur nahe der Zieltemperatur, wird sich langsam und vorsichtig an das Ziel herangetastet - das Attribut wait steuert die Wartezeit und cmdpause verhindert ein überschwingen.<br />
<br />
Jede drei schließenden IF-Bedingungen sind analog aufgebaut, jedoch wird die Temperatur schnell reduziert, um das stottern und den Abkühlprozeß zu vermeiden. <br />
<br />
Die Kalibrierung und ein Frühstart finden morgens statt. In der ersten öffnenden IF-Bedingung wurde zusätzlich die Abfrage '''[EG.Heizung.8Relais:PIO.3] eq "on"''' integriert. Diese prüft, ob die Fußbodenpumpe aktiv ist oder wegen zu hohen Vorlauftemperaturen deaktiviert wurde. Dies verhindert ein Überschwingen im Zusammenspiel mit dem thermischen Maximalbegrenzer - die Abkühlzeit ist so hoch, daß der Mischer bereits wieder den Mischer öffnet um die Temperatur zu erhöhen. Schaltet dann die Pumpe ein, überschreitet die Vorlauftemperatur wieder sofort das Maximum.<br />
<br />
Das DOIF-Kommando führt zu folgenden Meßwerten:<br />
<br />
[[Datei:Morgennebel-HeizungssteuerungHOWTO-Mischer1Tag.png]]<br />
<br />
Die Nachtabsenkung endet um 4:00, gleichzeitig startet die Kalibrierung (setzt den Mischer auf 0). Der Mischer (blaue Linie) öffnet schnell, überschwingt leicht und regelt sich dann auf eine sehr gerade Kennlinie mit beinahe konstanter Temperatur zurück.<br />
<br />
Nach einer Woche Betrieb stellte sich heraus, daß die Viessmann Tetramatik die Fußbodenpumpe dauerhaft abstellte. Offenbar (und vielleicht) erkennt die Tetramatik, daß diese den Mischer nicht mehr kontrollieren kann und stellt zur Sicherheit die Pumpe ab.<br />
<br />
Daher wurde auch die Pumpe an den 8-fach Relaiskarte via 1-Wire geschaltet und mit Hilfe einer DOIF-Anweisung gesteuert:<br />
<br />
define DI_EG.HWR.Fussbodenpumpe DOIF ([04:00-23:00] and [EG.Heizung.Mischer.Vorlauf:temperature] < 33)<br />
(set EG.Heizung.8Relais PIO.3 on) <br />
DOELSE <br />
(set EG.Heizung.8Relais PIO.3 off) <br />
attr DI_EG.HWR.Fussbodenpumpe room EG.HWR <br />
attr DI_EG.HWR.Fussbodenpumpe wait 0,900 <br />
<br />
die Erkennung der Maximaltemperatur mit einer 15 minütigen Abkühlphase erlaubte die Deaktivierung des Thermostaten zur Begrenzung des Fußbodenvorlaufes (siehe Diagramm in der Einleitung).<br />
<br />
=== Kombinierte Fußbodens- und Radiatorenheizung ===<br />
In den Räumen mit kombinierter Fußboden- und Radiatorenheizung wird der Fußbodenkreis über ein DOIF-Kommando gesteuert, welches auf den Öffnungswert (actuator-Stand) der Radiatorheizung triggert:<br />
<br />
define DI_EG.Wintergarten.Fussbodenheizung DOIF ([EG.Wintergarten.Heizung:actuator] > 10)<br />
(set EG.Heizung.8Relais PIO.0 on)<br />
DOELSE<br />
(set EG.Heizung.8Relais PIO.0 off)<br />
attr DI_EG.Wintergarten.Fussbodenheizung wait 180,1800<br />
<br />
In diesem Beispiel wird der Alpha 5 Stellantrieb über die 8fach Relaiskarte an '''PIO.0''' (siehe Abschnitt fhem-Erweiterungen und STELLMOTOR) angesteuert. Das DOIF-Kommando aktiviert die Fußbodenheizung, wenn die Radiatoren länger als drei Minuten mit mehr als 10 (10%) heizen und läßt diese dann mindestens 30 Minuten aktiviert.<br />
<br />
Sollten mehrere Heizungen im Raum vorhanden sein, läßt sich dies durch den Mittelwert der Aktuatorenstellung mit Hilfe einer perl-Anweisung lösen.<br />
<br />
Damit folgt die Fußbodenheizung automatisch den Wochenprofilen des Wandthermostaten im Wintergarten bzw. dessen Heizungsverhalten bei manueller Übersteuerung oder der Erkennung von offenen Fenstern.<br />
<br />
=== Kombinierte Fußbodens- und Radiatorenheizung in Kombination mit PWM/PWMR ===<br />
Mit der Umstellung auf das PWM-/PWMR-Modul konnte diese DOIF-Lösung nicht mehr verwendet werden. Die Lösung bestand in einem zusätzlichen Userreading ('''FB-desired-temp''' im Wandthermostaten des Raumes, der als reading für den SOLL-Zustand des PWMR-Modules verwendet wurde:<br />
<br />
attr EG.Kueche.Wandthermostat userReadings FB-desired-temp { ReadingsVal("EG.Kueche.Wandthermostat","desired-temp",0) + 0.5 ;; }<br />
<br />
dieses Userreading addiert 0.5°C zu der desired-temp des Wochenprofiles hinzu. Das Wochenprofil wurde entsprechend um 0.5°C reduziert. Damit heizen die Radiatoren schnell und deutlich mit, um dann Nahe der Zieltemperatur auszugehen, damit die Fußbodenheizung die letzten 0.5°C übernehmen kann - und damit lange für warme Füsse sorgt.<br />
<br />
=== Bedarfsgesteuerte Kontrolle der Fußbodenumwälzpumpe ===<br />
Zur weiteren Verbrauchsoptimierung sollte nun die Fußbodenumwälzpumpe bedarfsgerecht ein- und wieder ausgeschaltet werden. Wie in der Einführung beschrieben hat diese einen konstanten Verbrauch von 170W/h, so daß die Reduzierung der Laufzeit schnell erhebliche Einsparungen verspricht.<br />
<br />
Im ersten Schritt wird ein Dummy definiert, der den '''Bedarf''' an warmen Heizwasser reflektiert. Diese Dummy-Variable wird minütlich durch ein DOIF-Kommando belegt:<br />
<br />
define D_EG.HWR.FussbodenAnforderung dummy<br />
attr D_EG.HWR.FussbodenAnforderung room EG.HWR<br />
<br />
define DI_EG.HWR.FussbodenpumpeAnforderung DOIF ([+0:01] and <br />
([?OG.Flur.Fussboden.Links_Sw_FBChild1Arbeitszimmer] eq "on" or <br />
[?OG.Flur.Fussboden.Links_Sw_FBChild1Schlafzimmer] eq "on" or<br />
[?OG.Flur.Fussboden.Links_Sw_FBChild2Links] eq "on" or<br />
[?OG.Flur.Fussboden.Links_Sw_FBChild2Rechts] eq "on" or<br />
[?OG.Flur.Fussboden.Rechts_Sw_FBBadLinks] eq "on" or<br />
[?OG.Flur.Fussboden.Rechts_Sw_FBBadRechts] eq "on" or<br />
[?OG.Flur.Fussboden.Rechts_Sw_FBFlur] eq "on"))<br />
(set D_EG.HWR.FussbodenAnforderung on)<br />
DOELSE<br />
(set D_EG.HWR.FussbodenAnforderung off)<br />
attr DI_EG.HWR.FussbodenpumpeAnforderung wait 300,1800<br />
attr DI_EG.HWR.FussbodenpumpeAnforderung room EG.HWR<br />
<br />
Da sich die verwendeten Wandthermostaten alle 2.5 Minuten bei fhem melden, ist der Versatz in Durchschnitt etwa 180 Sekunden. Die im DOIF abgefragten Konditionen sind die verschiedenen 230V-Schaltaktoren, welche die Ventilantriebe ansteuern. Fordert auch nur ein Kreis Wärme an, wird der Dummy auf '''on''' gesetzt - damit folgt der Dummy allen Wochenprofilen der verschiedenen Wandthermostaten oder auch allen manuellen Änderungen.<br />
<br />
Die bereits vorhandene DOIF-Anweisung zur Kontrolle der Fußbodenpumpe wurde um den Zustand des Dummys erweitert:<br />
<br />
define DI_EG.HWR.Fussbodenpumpe DOIF ([04:00-21:00] and [EG.Heizung.Mischer.Vorlauf:temperature] < 34 and [D_EG.HWR.FussbodenAnforderung] eq "on")<br />
(set EG.Heizung.8Relais PIO.3 on)<br />
DOELSE<br />
(set EG.Heizung.8Relais PIO.3 off)<br />
attr DI_EG.HWR.Fussbodenpumpe wait 0,45<br />
attr DI_EG.HWR.Fussbodenpumpe room EG.HWR<br />
<br />
Damit wird die Fußbodenpumpe zwischen 4 Uhr (Ende der Nachtabschaltung) bis 21 Uhr aktiviert, sofern die Mischervorlauftemperatur nicht zu hoch wird und tatsächlich Wärme benötigt wird.<br />
<br />
Zur Kontrolle der Einsparungen wurde noch zusätzlich das Modul [[HourCounter]] konfiguriert:<br />
<br />
define HC_EG.HWR.Fussbodenpumpe HourCounter EG.Heizung.8Relais:PIO.3:.on EG.Heizung.8Relais:PIO.3:.off<br />
attr HC_EG.HWR.Fussbodenpumpe room EG.HWR<br />
<br />
In den Readings des HourCounters '''pauseTimePerDay''' zeigt dann die Summe der Ausschaltzeit pro Tag ein, rechnet jedoch auch die vier Stunden (Mitternacht bis 4 Uhr) bis zum Beginn der Tagesheizperiode ein.<br />
<br />
Als Diagramm ergibt sich diese Darstellung:<br />
<br />
[[Datei:Morgennebel-HOWTO-Heizungsoptimierung-Pumpensteuerung.png]]<br />
<br />
Nach der Nachtabsenkung wird die Fußbodenvorlauftemperatur auf die gewünschten 30-33°C Grad (am Meßpunkt, entspricht 40°C im fest eingebauten Thermometer) gesteuert. Kurz nach 12 Uhr ist der Bedarf an Fußbodenwärme gedeckt und die Umwälzpumpe wird deaktiviert. Dieser Zustand hält knapp 8 Stunden an, bis kurz nach 20:30 Uhr wieder Wärme angefordert wird. Jedoch greift um 21:30 schon die Nachtabschaltung der Heizung selbst.<br />
<br />
Am Tag davor tobte ein Sturm über das Haus und der kalte Wind sorgte für eine Abkühlung in den Räumen:<br />
<br />
[[Datei:Morgennebel-HOWTO-Heizungsoptimierung-PumpensteuerungSturm.png]]<br />
<br />
Der Wärmebedarf war erheblich höher und als Folge blieb die Pumpe dauerhaft an.<br />
<br />
=== Bedarfsgesteuerte Kontrolle der Radiatorenumwälzpumpe ===<br />
Nach demselben Prinzip wurde auch die Radiatorenpumpe von der Tetramatik abgekoppelt und durch fhem gesteuert. Ausschlaggebend für das Aktivieren der Radiatorenpumpe sollte der '''Durchschnitt der Ventilstellungen''' der Heizungen sein.<br />
<br />
Hierzu wurde das '''VALVES'''-Modul genutzt:<br />
<br />
define V_RadiatorenStatus VALVES<br />
<br />
Das Attribut '''valvesDeviceList''' hält die Heizungsaktoren mit einem Reading der Aktoren/Ventilstellungen:<br />
<br />
attr V_RadiatorenStatus EG.Arbeitszimmer.HeizungLinks_Clima, EG.Esszimmer.HeizungLinks_Clima, EG.Esszimmer.HeizungMitte_Clima, \ <br />
EG.Esszimmer.HeizungRechts_Clima, EG.Garderobe.Heizung_Clima, EG.Kueche.HeizungLinks_Clima, EG.Kueche.HeizungRechts_Clima, \<br />
EG.Wintergarten.Heizung_Clima, OG.Schlafzimmer.HeizungLinks_Clima, OG.Schlafzimmer.HeizungMitte_Clima, \<br />
OG.Schlafzimmer.HeizungRechts_Clima, OG.Wohnzimmer.HeizungLinks_Clima, OG.Wohnzimmer.HeizungRechts_Clima<br />
<br />
und das Attribut '''valvesDeviceReading''' die Aktorenstellung, bei Homematic:<br />
<br />
attr V_RadiatorenStatus ValvePosition<br />
<br />
mit einem stateFormat ergibt sich eine schöne Darstellung:<br />
<br />
attr V_RadiatorenStatus stateFormat {sprintf("%.1f",ReadingsVal("V_RadiatorenStatus","state",0))."%"}<br />
<br />
und in Verbindung mit einem DOIF<br />
<br />
define DI_HeatingRadiatorPumpStatus DOIF ([04:00-21:30] and [V_RadiatorenStatus:valve_average] > 10)<br />
(set D_HeatingRadiatorPump on, set EG.Heizung.8Relais PIO.4 on)<br />
DOELSE<br />
(set D_HeatingRadiatorPump off, set EG.Heizung.8Relais PIO.4 off)<br />
<br />
die bedarfsgerechte Aktivierung der Radiatorenpumpe. D_HeatingRadiatorPump ist dabei ein Dummy, der später in einer FLOORPLAN-Darstellung genutzt wird.<br />
<br />
[[Datei:Fussbodensteuerungsdiagramm.png]]<br />
<br />
illustriert nun den gesamten Heizungsstatus:<br />
<br />
# Rot: Vorlauftemperatur nach dem Mischer<br />
# Dunkelgrün: Wandernder Durchschnitt der Vorlauftemperaturs nach dem Mischer<br />
# Blau: Mischerstand<br />
# Pink: Außentemperatur<br />
# Gelb: Der Durchschnitt aller Radiatoren-Ventilstellung<br />
# Grün Transparent: Status der Fußbodenpumpe<br />
# Blau Transparent: Status der Radiatorenpumpe<br />
<br />
Deutlich ist zu sehen, wie die Fußbodenpumpe nur bei Bedarf aktiviert wurde und der Mischer fleißig nachsteuert.<br />
<br />
=== Gaszähler ===<br />
Nachdem die Räume vollständig geregelt und mit Wochenprofilen versehen waren, wurde die Messung des Gasverbrauches aufgebaut. Mit Hilfe der Verbrauchsdaten sowie der '''Zustandszahl''' und des '''Brennwertes''' (beides beim Gasversorger zu erfragen) läßt sich der Verbrauch an kWh errechnen.<br />
<br />
Zur Messung des Gasverbrauches wurde der [[HM-EM-TX-WM_Zählersensor_für_Strom-_und_Gaszähler|Homematic Bausatz zur Strom- und Gasmessung]] verwendet. Der von ELV gelieferte Gaszähler paßte mechanisch nicht in den vorhanden ''iTron G4 RF1-MM'' Gaszähler. Der ELV-Gaszähler besteht aus einer kleinen Schaltung mit wenigen Widerständen und einem Reed-Schalter - da eine exakte Messung wichtig war, wurde von [http://www.world-of-heating.de/ World of Heating] der passende Impulsnehmer GMT Typ 951-858-06 nachbestellt und in die Schaltung von ELV eingelötet. Der Impulsnehmer kommt mit langen Anschlußkabeln und läßt sich sehr einfach einbauen.<br />
<br />
Nach der Konfiguration des [[HM-EM-TX-WM_Zählersensor_für_Strom-_und_Gaszähler|Homematic Bausatzes]] auf die vom Gaszähler gelieferten Impulse je Einheit lieferte dieser zuverlässig die Verbrauchsdaten. Diese lassen sich schnell und einfach visualisieren.<br />
<br />
[[Datei:Morgennebel-HOWTO-Heizungsoptimierung-Gasverbrauch.png]]<br />
<br />
Zusammen mit der Außentemperatur und der Uhrzeit sollen diese dann als Grundlage zur Dimensionierung einer neuen Heizungsanlage verwendet werden. Dazu werden die Logdateien der Außentemperatur und der Verbrauch an Gas auf die Stunde umgerechnet. Die vorhandenen Meßpunkte können dann in eine Verbrauchskurve in Abhängigkeit der Außentemperatur überführt werden - und da alle Räume wie gewünscht warm werden, stellt dies dann die notwendige Dimensionierung der neuen Heizung dar.<br />
<br />
[[Kategorie:Examples]]<br />
[[Kategorie:Heizungssteuerung]]</div>JoeAllhttp://wiki.fhem.de/w/index.php?title=FHEM_Tablet_UI&diff=13615FHEM Tablet UI2016-01-18T14:24:16Z<p>JoeAll: Update-Ergänzung um "update add"</p>
<hr />
<div>{{Infobox Modul<br />
|ModPurpose=Oberfläche für Fhem<br />
|ModType=x<br />
|ModFTopic=34233<br />
|ModForumArea=Frontends<br />
|ModTechName=n.a.<br />
|ModOwner=setstate ({{Link2FU|7023|Forum}})<br />
}}<br />
[[Datei:tablet_ui.png|200px|thumb|right|Fhem Tablet UI]]<br />
FHEM Tablet UI ist ein leichtgewichtiges aber funktionsreiches Framework zum Steuern und Überwachen von in Fhem integrierten Geräten. Zahlreiche Widgets können sehr flexibel und leicht per HTML Code konfiguriert werden.<br />
<br />
In dieser Anleitung wird die Installation und Konfiguration des FHEM Tablet UI beschrieben.<br />
<br />
{{Todo|alle Widgets hier übernehmen, Übersetzung, weitere Beispiele aus dem Forum einfügen (evtl. mit Link!?)}} <br />
<br />
<br />
== Voraussetzungen ==<br />
Dieses User Interface für Tablets benötigt <u>keine</u> zusätzliche Frameworks, wie PHP, MySQL oder SmartVisu.<br />
<br />
Voraussetzungen ist nur ein Standard-Fhem mit HTTPSRV Modul und ein beliebiger Standard-Browser mit Javascript auf einem beliebigen Betriebssystem oder Webviewcontrol.<br />
<br />
== Installation ==<br />
* Im Befehls-Eingabefeld eingeben: <code><nowiki>update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt</nowiki></code><br />
* Im Befehls-Eingabefeld eingeben: <code>define TABLETUI HTTPSRV ftui/ ./www/tablet Tablet-UI</code><br />
* Im Verzeichnis ./fhem/www/tablet die Datei index-example.html in index.html umbenennen oder eine neue index.html erzeugen und diese index.html wie nachfolgend beschrieben editieren.<br />
<br />
Das UI ist über den Link "Tablet-UI" auf der Fhem-Hauptseite oder durch Direktaufruf der URL "<nowiki>http://<Fhem-url>:8083/fhem/tablet/index.html</nowiki>" zu erreichen.<br />
<br />
Hinweise zu einer manuellen Installation und weitere Infos sind auf der Projektseite https://github.com/knowthelist/fhem-tablet-ui zu finden.<br />
<br />
== Update ==<br />
* Prüfen der Änderungen seit dem letzten Download/Update durch Eingabe von: <code><nowiki>update check https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt</nowiki></code><br />
* Update des UI durch Eingabe von: <code><nowiki>update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt</nowiki></code><br />
<br />
Über <br />
<code><nowiki>update add https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master</nowiki></code><br />
kann seit dem 24.12.2015 die URL zum normalen Updatebefehl von FHEM hinzugefügt werden. Mit einen "update check" sieht man dann gleich alle Updates aus beiden "Welten".<br />
<br />
<br />
== Weitere Widgets ==<br />
<br />
=== Widgets for Fhem-tablet-ui ===<br />
Zusätzlich zu den bei der Installation des Tablet UI direkt zur Verfügung stehenden Widgets, gibt es eine weitere Widget-Quelle von nesges unter https://github.com/nesges/Widgets-for-fhem-tablet-ui. Die Widgets aus dieser Quelle müssen für eine Nutzung separat installiert werden.<br />
<br />
Dazu folgenden Befehl in die Fhem-Befehlszeile eingeben: <code><nowiki>update all https://raw.githubusercontent.com/nesges/Widgets-for-fhem-tablet-ui/master/controls_widgets-for-fhem-tablet-ui.txt</nowiki></code>. <br />
<br />
Näheres zur Installation unter [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/Installation Wiki: Installation]. <br />
<br />
Die Dokumentation der einzelnen Widgets befindet sich ebenfalls [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki im Github-Wiki].<br />
<br />
== Konfiguration ==<br />
Die Konfiguration der angezeigten Widgets erfolgt in der Datei '''index.html''' im Hauptordner 'tablet'.<br />
<br />
'''Metadaten-Konfiguration'''<br />
<br />
Refresh sofort, alle 15 Minuten ein voller Refresh (shortpoll) statt alle 30 Sekunden ein voller Refresh<br />
:<code><meta name="longpoll" content="1"></code><br />
<br />
Drag&Drop deaktivieren<br />
:<code><meta name='gridster_disable' content='1'></code><br />
<br />
Toast messages deaktivieren<br />
:<code><meta name='toast' content='1'></code><br />
<br />
Größe des Basis-Rasters (data-sizey=1/data-sizex=1)<br />
:<code><meta name="widget_base_width" content="116"></code><br />
:<code><meta name="widget_base_height" content="131"></code><br />
<br />
Abstände der Gridsterelemente verkleinern:<br />
:<code><meta name="widget_margin" content="3"></code><br />
<br />
<br />
Das Layout und das Aussehen des UI kann durch die Klassen-Attribute beeinflusst werden. Verfügbare Klassen sind:<br />
<br />
container, left, right, cell, narrow, darker, big, bigger, small<br />
<br />
== Farbe ==<br />
Es besteht die Möglichkeit, die Farbwerte in hexadezimaler Form oder als RGB-Wert anzugeben. Zum Beispiel: Hex: #A3CFA3 RBG: rgb(163, 207, 163).<br />
<br />
Knallige Farben wie #ff0000 für Rot oder #00ff00 für Grün sollten vermieden werden. Es ist besser unterhalb von #D0 (208) für die Grundfarben zu bleiben.<br />
<br />
Hilfreich bei der Suche nach den Farbwerten ist der color picker: http://www.w3schools.com/tags/ref_colorpicker.asp<br />
<br />
<br />
== CSS Class description ==<br />
<br />
Not all widgets support all classes<br />
<br />
* readonly : changing of state is not allowed<br />
* wider : 25px extra space for the widget to the top<br />
* narrow : shorter distant to the widget above<br />
* w1x, w2x, w3x : set the widget to a fix width: 1x, 2x, 3x width<br />
* small : font 80% size (label), small diameter for volume widget<br />
* mini : lowest diameter for volume widget<br />
* large : font 150% size<br />
* big : font 200% size<br />
* bigger : font 320% size<br />
* thin : font thin<br />
* darker : forecolor in gray<br />
* hue-tick : draw ticks in color range<br />
* hue-front : draw handle in color range<br />
* hue-back : draw background in color range<br />
* dim-tick : draw ticks in brightness range<br />
* dim-front : draw handle in brightness range<br />
* dim-back : draw background in brightness range<br />
* red : foreground color red<br />
* green : foreground color green<br />
* blue : foreground color blue<br />
* doublebox-v : container to place 2 small widgets (e.g. switch) one above the other<br />
* doublebox-h : container to place 2 small widgets (e.g. switch) side by side<br />
* timestamp : deliver the date time for the reading instead the value<br />
* inline : positioning elements in a row, no line break<br />
* top-space : 15px extra on top (top-space-2x -> 30px; top-space-3x -> 45px)<br />
* left-space : 15px extra on left (left-space-2x -> 30px; left-space-3x -> 45px)<br />
* right-space : 15px extra on right (right-space-2x -> 30px; right-space-3x -> 45px)<br />
* blink : blink animatation for label or symbol widget<br />
<br />
== Positioning ==<br />
<br />
*container : new box or new row<br />
*col-x-y : new column with x/y of width (col-1-3,col-2-3,col-1-2,col-1-4,col-1-8,col-1-5,col-2-5,col-3-5,col-4-5)<br />
*inline : positioning elements in a row, no line break<br />
*top-space : 15px extra on top (top-space-2x -> 30px; top-space-3x -> 45px)<br />
*left-space : 15px extra on left (left-space-2x -> 30px; left-space-3x -> 45px)<br />
*right-space : 15px extra on right (right-space-2x -> 30px; right-space-3x -> 45px)<br />
*top-narrow : -15px closer on top (top-narrow-2x -> -30px; top-narrow-10 -> -10px)<br />
*centered : horizontal centered<br />
*left-align : align text left<br />
*right-align : align text right<br />
*wider : 15px extra space for the widget all around<br />
*narrow : shorter distant to the widget above<br />
*fullsize : 100% in width and height<br />
<br />
== Widgets -- Konfiguration ==<br />
<br />
Zurzeit stehen 33 Widgets zur Verfügung:<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/button button]: Variante der push und switch Widgets, die entweder einen URL ansteuern oder einen Fhem-Befehl absetzen kann.<br />
* [[#chart|chart]]: chart with similar capabilities as the FHEM plots <br />
* [[#circlemenu|circlemenu]]: Mehrere Widgets hinter einem Widget verborgen, trotz des 'circle' im Namen kann das Menue jetzt auch horizontal oder vertikal ausgeklappt werden <br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/clicksound clicksound]: Mit dem Widget "clicksound" können Sounds an Click-Events von Elementen gebunden werden. <br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/clock clock]: Das Widget "clock" stellt eine einfach Uhr zur verfügung.<br />
* [[#dimmer|dimmer]]: toogle button with a setter for on value<br />
* [[#homestatus|homestatus]]: selector for 4 states (1=home, 2=night, 3=away, 4=holiday)<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/iframe iframe]]: Widget zum Einbinden externer Inhalte in einem Iframe. <br />
* [[#image|image]]: insert an image, the URL is given by a reading<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/itunes_artwork itunes_artwork]: itunes_artwork durchsucht die iTunes-Datenbank anhand eines Arrays von beliebigen Suchworten nach einem Cover-Artwork und zeigt dieses an. <br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/javascript javascript]: Ermöglicht die Ausführung beliebigen Javascript-Codes aus einem Reading.<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/joinedlabel joinedlabel]: verbindet mehrere Readings zu einem Feld<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/klimatrend klimatrend]: wandelt Daten aus dem statistics-Modul in einen Pfeil um, der den aktuellen Trend anzeigt. <br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/kodinowplaying kodinowplaying]: zeigt Informationen zu grade in KODI gespielten Medien in Form eines Labels an.<br />
* [[#label|label]]: ein state als Text anzeigen (Farbe einstellbar)<br />
* [[#level|level]]: vertical/horizontal bar to show values between min/max value<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/mpdnowplaying mpdnowplaying]: zeigt Titelinformationen eines per MPD-Modul angebundenen Music Player Daemon an. <br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/multistatebutton multistatebutton]: Variante des push-Widgets das den set-Befehl abhängig vom gelesenen Status ändert.<br />
* [[#pagetab|pagetab]]: Element to smoothly exchange the whole page with another page<br />
* [[#playstream|playstream]]: Abspielen eines Webradio-Streams per Button<br />
* [[#popup|popup]]: a popup dialog which open on click on another widget <br />
* [[#progress|progress]]: round symbolic display for percent values<br />
* [[#push|push]]: send any command to Fhem e.g. up / down<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/reload reload]: auslösen eine Pagereloads<br />
* [[#rotor|rotor]]: Umschalten von zwei oder mehr Widgets an einer Position<br />
* [[#select|select]]: Combobox to provide a list for selection<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/settimer settimer]: zum anzeigen und einstellen einer Uhrzeit.<br />
* [[#simplechart|simplechart]]: simple XY line chart for one value (reads directly from Fhem log file) <br />
* [[#slider|slider]]: vertical slider to select between min/max value<br />
* [[#switch|switch]]: Toggle any command to Fhem (e.g. on / off)<br />
* [[#symbol|symbol]]: State als Symbol darstellen (z.B. Fenster offen)<br />
* [[#thermostat|thermostat]]: dial for heater thermostates to set desired value and show current value<br />
* [[#volume|volume]]: dial to set a single value (e.g. 0-60)<br />
* [[#weather|weather]]: insert an icon or image, represending a weather literal<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/wind_direction wind_direction]: Zeigt die Windrichtung auf einer Windrose an. <br />
<br />
<br />
----------------------------------<br />
<br />
Für alle Widgets gilt:<br />
{| class="wikitable"<br />
|+allgemeine Attribute<br />
|-<br />
!align="right" |data-type<br />
|Widget-Typ<br />
|-<br />
!align="right" |data-device<br />
|Fhem-Name des Gerätes (mit dem Befehl 'list' bekommt man im Fhem die kpl. Liste)<br />
|-<br />
!align="right" |class<br />
|CSS-Klassen für Aussehen und Formatierung des Widgets<br />
|-<br />
|}<br />
<br />
<br />
<div id="chart">'''CHART'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-logdevice<br />
|name of the logdevice (e.g. FileLog_WohnzimmerHeizung) or array of names if more than one graph shall be displayed<br />
|-<br />
|-<br />
!align="right" |data-logfile<br />
|name of the logfile (e.g. WohnzimmerHeizung-2015.log) or or array of names if more than one graph shall be displayed<br />
|'-' or omitting this data means current logfile<br />
|-<br />
!align="right" |data-columnspec<br />
|definition for how to find the values (e.g. "4:meas.*:1:int") or or array of columnspecs if more than one graph shall be displayed<br />
|-<br />
|-<br />
!align="right" |data-style<br />
|name of the graph style to be used (e.g. 'SVGplot l0' or 'ftui l0dash') or or array of styles if more than one graph shall be displayed using different stlyes. The standard fhem plot styles can be used furthermore there are some more predefined styles existing (details see css file). Own styles can be specified e.g. in the fhem-table-ui-user.css file.<br />
|-<br />
|-<br />
!align="right" |data-ptype<br />
|name of the plot type (e.g. 'lines' or 'fa-cog') or or array of plottypes if more than one graph shall be displayed. All fhem plot styles are supported. Additionally it is possible to specify symbols (currently supported are font awesome ('fa-...'), open automation ('oa-...') and fhem symbols ('fs-...'))<br />
|'lines'<br />
|-<br />
!align="right" |data-uaxis<br />
|name of the axis to be used ('primary' or 'secondary') or or array of axis' to be used if more than one graph shall be displayed. The 'primary' axis is labelled on the left side, the 'secondary' axis is labelled on the right side<br />
|'primary'<br />
|-<br />
!align="right" |data-legend<br />
|caption of the graph (used in the legend and at the cursor) or an array of legend texts if more than one graph shall be displayed.<br />
|-<br />
|-<br />
!align="right" |data-minvalue<br />
|min Y value to Show or an array of values for dynamic minY for primary axis. A value of 'auto' means that the value is calculated from the data displayed dynamically<br />
|10<br />
|-<br />
!align="right" |data-minvalue_sec<br />
|min Y value to Show or an array of values for dynamic minY for secondary axis. A value of 'auto' means that the value is calculated from the data displayed dynamically<br />
|'auto'<br />
|-<br />
!align="right" |data-maxvalue<br />
|max Y value to Show or an array of values for dynamic maxY for primary axis. A value of 'auto' means that the value is calculated from the data displayed dynamically<br />
|30<br />
|-<br />
!align="right" |data-maxvalue_sec<br />
|max Y value to Show or an array of values for dynamic maxY for secondary axis. A value of 'auto' means that the value is calculated from the data displayed dynamically<br />
|'auto'<br />
|-<br />
!align="right" |data-yticks<br />
|value distance between Y tick lines (related to primary axis). A value of 'auto' means that the value is calculated from the data displayed dynamically.<br />
|'auto'<br />
|-<br />
!align="right" |data-xticks<br />
|time range between each X tick lines (in minutes). A value of 'auto' means that the value is calculated from the data displayed dynamically<br />
|'auto'<br />
|-<br />
!align="right" |data-daysago_start<br />
|number of days back from now for the start of the plot (0 means the plot starts from today 0:00). Additionally the x-axis start value can be set here unsing standard data formats like ('2013-10-23'), the time portion of the string is only used when <code>data-nofulldays</code> is 'true'.<br />
|0<br />
|-<br />
!align="right" |data-daysago_end<br />
|number of days back from now for the end of the plot (-1 means the plot ends today 24:00). Additionally the x-axis end value can be set here unsing standard data formats like ('2013-10-23'), the time portion of the string is only used when <code>data-nofulldays</code> is 'true'.<br />
|-1<br />
|-<br />
!align="right" |data-nofulldays<br />
|switch to activate/deactivate rounding of the xaxis start and end values to full days ('true' or 'false')<br />
|'false'<br />
|-<br />
!align="right" |data-ytext<br />
|text to be shown besides the primary y axis.<br />
|-<br />
|-<br />
!align="right" |data-ytext_sec<br />
|text to be shown besides the secondary y axis.<br />
|-<br />
|-<br />
!align="right" |data-yunit<br />
|unit of the value to show beside of each Y ticks for primary y axis.<br />
|-<br />
|-<br />
!align="right" |data-crosshair<br />
|switch to activate/deactivate the crosshair cursor ('true' or 'false')<br />
|'false'<br />
|-<br />
!align="right" |data-cursorgroup<br />
|number to define coupling of the crosshair cursor. The cursors of all charts having the same number are coupled and move together.<br />
|-<br />
|-<br />
!align="right" |data-scrollgroup<br />
|number to define coupling of the scrolling (shift and zoom). All charts having the same number are scrolled (shifted and zoomed) together.<br />
|-<br />
|-<br />
!align="right" |data-showlegend<br />
|switch to activate/deactivate the initial display of the legend window ('true' or 'false')<br />
|'false'<br />
|-<br />
!align="right" |data-yunit_sec<br />
|unit of the value to show beside of each Y ticks for secondary y axis.<br />
|-<br />
|-<br />
!align="right" |data-width<br />
|fixed size for width (in&nbsp;% or px)<br />
|-<br />
|-<br />
!align="right" |data-height<br />
|fixed size for height (in&nbsp;% or px)<br />
|-<br />
|-<br />
!align="right" |class<br />
|fullsize, noticks, nobuttons<br />
|<br />
|-<br />
|}<br />
<br />
<code>data-logfile</code> can be omitted in this case the default value "-" will be used. This means that the current logfile is going to be used.<br />
<br />
There are several buttons that control the dynamic behaviour of the chart. The <-, ->, + and - buttons shift and zoom the displayed data. The "legend" and "cursor" buttons are switching on and off the display of the legend window and the crosshair cursor respectively.<br />
<br />
When the legend window is displayed, a click on the legend text shows/hides the respective graph. The legend window can be dragged to other positions on desktop browsers (currently not yet working for iOS and Android).<br />
<br />
The crosshair cursor currently only works dynamically on desktop browsers. On iOS and Android you have to tap on the screen to set the cursor to a new position.<br />
<br />
There is a number of css styles that control the visible appearance of the chart. The following classes are supported:<br />
<br />
{| class="wikitable"<br />
!CSS class name<br />
!Description<br />
|-<br />
!.chart-background<br />
|Color etc. for the chart background<br />
|-<br />
!.text.axes<br />
|Font and color for the chart axes<br />
|-<br />
!.buttons<br />
|Size and color for the buttons (shift etc.)<br />
|-<br />
!.gridlines<br />
|Size and color for gridlines generally<br />
|-<br />
!.xaxis<br />
|Font, size and color for xaxis<br />
|-<br />
!.yaxis<br />
|Font, size and color for yaxis<br />
|-<br />
!.xticks<br />
|Font, size and color for xticks<br />
|-<br />
!.yticks<br />
|Font, size and color for yticks<br />
|-<br />
!.crosshair<br />
|Font, size and color (foreground/background) for the crosshair cursor<br />
|-<br />
!.caption<br />
|Font, size and color for text buttons for legend and cursor switching<br />
|-<br />
!.legend<br />
|Font, size and background color for legend window<br />
|-<br />
|-<br />
|}<br />
<br />
[[#Beispiel_chart|Link zu einem Beispiel]]<br />
<br />
<br />
<div id="circlemenu">'''CIRCLEMENU'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-item-diameter<br />
|diameter of the circle<br />
|52<br />
|-<br />
!align="right" |data-circle-radius<br />
|radius of each item, in pixel<br />
|70<br />
|-<br />
!align="right" |data-direction<br />
|position of the items in relation to the center<br />
|'full'<br />
|-<br />
!align="right" |data-close-after<br />
|closing time of the circle-menu<br />
|(item-count + 1s) or a minimum of 4s<br />
|-<br />
!align="right" |class<br />
|keepopen<br />
|<br />
|-<br />
|}<br />
<br />
Optionen für data-direction: top | right | bottom | left | top-right | top-left | bottom-right | bottom-left | top-half | right-half | bottom-half | left-half | full | vertical | horizontal<br />
<br />
[[#Beispiel_circlemenu|Link zu einem Beispiel]]<br />
<br />
<br />
<div id="dimmer">'''DIMMER'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-get<br />
|name of the reading to get from Fhem<br />
|'STATE'<br />
|-<br />
!align="right" |data-get-on<br />
|value for ON status to get<br />
|'on'<br />
|-<br />
!align="right" |data-get-off<br />
|value for OFF status to get<br />
|'off'<br />
|-<br />
!align="right" |data-set<br />
|(<command> <device> <reading> <value>) <br />
|<br />
|-<br />
!align="right" |data-set-on<br />
|value for ON status to set<br />
|value of data-get-on<br />
|-<br />
!align="right" |data-set-off<br />
|value for OFF status to set<br />
|value of data-get-off<br />
|-<br />
!align="right" |data-cmd<br />
|name of the command (<command> <device> <value>) (e.g. setstate, set, setreading, trigger)<br />
|'set'<br />
|-<br />
!align="right" |data-dim<br />
|name of the reading responsible for dim (<command> <device> <reading> <value>) <br />
|value of data-get-on<br />
|-<br />
!align="right" |data-icon<br />
|name of the font-awesome icon<br />
|fa-lightbulb-o<br />
|-<br />
|}<br />
<br />
[[#Beispiel_dimmer|Link zu einem Beispiel]]<br />
<br />
<div id="homestatus">'''HOMESTATUS'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-get<br />
|name of the reading to get from Fhem<br />
|'STATE'<br />
|-<br />
!align="right" |data-set<br />
|command to send to Fhem (<code>set <device> <command> <value></code>)<br />
|''<br />
|-<br />
!align="right" |data-alias<br />
|array of fix names to show only in the UI as an alias to the real states<br />
|''<br />
|-<br />
!align="right" |data-icons<br />
|array of icons related to the data-get-on array<br />
|''<br />
|-<br />
!align="right" |data-version<br />
|name of the status model e.g. 'residents','roommate','guest' <br />
|(default NULL)<br />
|-<br />
|}<br />
<br />
The default version has 4 states: '1','2','3','4' The default aliases are 'Home','Night','Away','Holiday'; data-version='residents' or 'roommate' or 'guest' has 5 states ('home','asleep','absent','gone','gotosleep') They have these aliases 'Home','Night','Away','Holiday','Retire'<br />
<br />
[[#Beispiel_homestatus|Link zu einem Beispiel]]<br />
<br />
<br />
<div id="image">'''IMAGE'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-get<br />
|name of the reading to get an URL from Fhem<br />
|'STATE'<br />
|-<br />
!align="right" |data-size<br />
|width of the image in px or %, the height scales proportionally<br />
|50%<br />
|-<br />
!align="right" |data-url<br />
|URL of the image to show (use data-url or data-device + data-get, not both)<br />
|<br />
|-<br />
!align="right" |data-refresh<br />
|Interval in seconds for image refresh for usage together with data-url<br />
|900<br />
|-<br />
|}<br />
<br />
[[#Beispiel_image|Link zu einem Beispiel]]<br />
<br />
<div id="label">'''LABEL'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-get<br />
|name of the reading to get from Fhem<br />
|<br />
|-<br />
!align="right" |data-fix<br />
|keeping a specified number of decimals. <br />
|'-1' -> non-numeric<br />
|-<br />
!align="right" |data-part<br />
|split position of the space separated value to show or an RegEx<br />
|<br />
|-<br />
!align="right" |data-colors<br />
|a array of color values to affect the colour of the label according to the limit value<br />
|<br />
|-<br />
!align="right" |data-limits-get<br />
|name of the DEVICE:Reading to colorize the label <br />
|data-device:data-get<br />
|-<br />
!align="right" |data-limits<br />
|an array of numeric values to affect the colour of the Label<br />
|<br />
|-<br />
!align="right" |data-limits-part<br />
|part number of the space separated value to show or a RegEx <br />
|'-1' -> all<br />
|-<br />
!align="right" |data-unit<br />
|add a unit after a numeric value. use encoded strings e.g. "%B0C%0A"<br />
|<br />
|-<br />
!align="right" |data-substitution<br />
|regex-substitution to apply on the value. Standard regex notation (s/regex/subst/modifier) is expected<br />
|<br />
|-<br />
!align="right" |class<br />
|small, large, big, bigger, thin, red, green, blue, darker, timestamp, w1x, w2x, w3x, fixedlabel<br />
|<br />
|}<br />
<br />
mit der Class 'fixedlabel' kann man Label einbauen, die einen festen Text (direkt im HTML) haben, aber trotzdem die Farbe per Reading Value beeinflusst werden könnte.<br />
<br />
[[#Beispiel_label|Link zu einem Beispiel]]<br />
<br />
<div id="level">'''LEVEL'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-get<br />
|name of the reading to get from Fhem<br />
|'STATE'<br />
|-<br />
!align="right" |data-min<br />
|minimal value to set<br />
|'0'<br />
|-<br />
!align="right" |data-max<br />
|maximal value to set<br />
|'100'<br />
|-<br />
!align="right" |data-on<br />
|value where the slider moves to max<br />
|'on'<br />
|-<br />
!align="right" |data-off<br />
|value where the slider moves to min<br />
|'off'<br />
|-<br />
!align="right" |data-colors<br />
|a array of color values to affect the colour of the label according to the limit value<br />
|<br />
|-<br />
!align="right" |data-limits<br />
|a array of numeric or RegEx values to affect the colour of the label<br />
|<br />
|-<br />
!align="right" |class<br />
|mini, horizontal<br />
|<br />
|-<br />
|}<br />
<br />
[[#Beispiel_level|Link zu einem Beispiel]] (fehlt noch)<br />
<br />
<div id="pagetab">'''PAGETAB'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-url<br />
|URL of the new page to show<br />
|<br />
|-<br />
!align="right" |data-icon<br />
|name of the font-awesome icon<br />
|'fa-power-off'<br />
|-<br />
!align="right" |data-background-icon<br />
|name of the font-awesome icon for background <br />
|''<br />
|-<br />
!align="right" |data-on-background-color<br />
|color of ON state<br />
|'#aa6900'<br />
|-<br />
!align="right" |data-off-background-color<br />
|color of OFF state<br />
|'#505050'<br />
|-<br />
!align="right" |data-on-color<br />
|color of ON state<br />
|'#aa6900'<br />
|-<br />
!align="right" |data-off-color<br />
|color of Off state<br />
|'#505050'<br />
|-<br />
!align="right" |data-get-on<br />
|array of status to assign a special icon-list from data-icons<br />
|<br />
|-<br />
!align="right" |data-icons<br />
|array of icons related to the a data-get-on array<br />
|<br />
|-<br />
!align="right" |class<br />
|warn, activate (as additionals for data-icons)<br />
|<br />
|-<br />
|}<br />
<br />
[[#Beispiel_pagetab|Link zu einem Beispiel]]<br />
<br />
<div id="playstream">'''PLAYSTREAM'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-url<br />
|URL des Radio-Streams<br />
|-<br />
!align="right" |data-get<br />
|name of the reading to get the control state from FHEM<br />
|'STATE'<br />
|-<br />
!align="right" |data-get-on<br />
|value for PLAY status to get. <br />
|'on'<br />
|-<br />
!align="right" |data-get-off<br />
|value for STOP status to get. <br />
|'off'<br />
|-<br />
!align="right" |data-volume<br />
|name of the reading to get the volume value (0-100) <br />
|volume<br />
|-<br />
|}<br />
<br />
[[#Beispiel_playstream|Link zu einem Beispiel]]<br />
<br />
<div id="popup">'''POPUP'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-get<br />
|name of the reading where to get the alert value from<br />
|'STATE'<br />
|-<br />
!align="right" |data-get-on<br />
|value which trigger to open the dialog<br />
|'on'<br />
|-<br />
!align="right" |data-off<br />
|value which trigger to close the dialog <br />
|'off'<br />
|-<br />
!align="right" |data-width<br />
|fixe size for width (in % or px)<br />
|<br />
|-<br />
!align="right" |data-height<br />
|fixe size for height (in % or px)<br />
|<br />
|-<br />
|}<br />
<br />
[[#Beispiel_popup|Link zu einem Beispiel]]<br />
<br />
<div id="progress">'''PROGRESS'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-get<br />
|name of the reading to get from Fhem<br />
|'STATE'<br />
|-<br />
!align="right" |data-max<br />
|maximal value to set or name of the reading which helds the max value<br />
|100<br />
|-<br />
!align="right" |class<br />
|novalue, percent<br />
|<br />
|-<br />
|}<br />
<br />
[[#Beispiel_progress|Link zu einem Beispiel]] (fehlt noch)<br />
<br />
<div id="push">'''PUSH'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default-Wert<br />
|-<br />
!align="right" |data-set<br />
|value to send to Fhem (<command> <device> <value>)<br />
|<br />
|-<br />
!align="right" |data-set-on<br />
|value to send when the the button get pressed oder ein Array zwischen dessen Werten umgeschaltet werden kann<br />
|<br />
|-<br />
<br />
!align="right" |data-icon<br />
|name of the font-awesome icon<br />
|<br />
|-<br />
!align="right" |data-background-icon<br />
|name of the font-awesome icon for background <br />
|'fa-circle'<br />
|-<br />
!align="right" |data-cmd<br />
|name of the command (<command> <device> <value>) (e.g. setstate, set, setreading, trigger)<br />
|'set'<br />
|-<br />
!align="right" |data-doubleclick<br />
|timeout to wait for a second click or touch. '0' disables the doubleclick feature. <br />
|0<br />
|-<br />
!align="right" |data-countdown<br />
|secondes for the countdown progress control <br />
|autodetect from 'on-for-timer' command<br />
|-<br />
|}<br />
<br />
[[#Beispiel_push|Link zu einem Beispiel]]<br />
<br />
<br />
<div id="rotor">'''ROTOR'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" | data-delay<br />
|time in millisecondes to wait until next list item get shown<br />
|3500<br />
|-<br />
!align="right" |class<br />
|fade, rotate<br />
|'' <br />
|-<br />
|}<br />
Ohne Angabe von class erfolgt keine Animation.<br />
<br />
[[#Beispiel_rotor|Link zu einem Beispiel]]<br />
<br />
<br />
<div id="select">'''SELECT'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-get<br />
|name of the reading that get the selected item of the list<br />
|<br />
|-<br />
!align="right" |data-set<br />
|name of the reading to set on Fhem (<command> <device> <reading> <value>)<br />
|''<br />
|-<br />
!align="right" |data-list<br />
|name of the reading to get a :-separated list from Fhem<br />
|''<br />
|-<br />
!align="right" |data-items<br />
|an array of fix items to show in the selection box (alternative if data-list is empty)<br />
|<br />
|-<br />
!align="right" |data-alias<br />
|an array of fix names to show only in the selection box as an alias to the real items<br />
|<br />
|-<br />
!align="right" |data-cmd<br />
|name of the command to send to Fhem (<command> <device> <reading> <value>) (e.g. setstate, set, setreading, trigger)<br />
|'set'<br />
|-<br />
!align="right" |data-quote<br />
|characters to enclose the send value<br />
|<br />
|-<br />
!align="right" |class<br />
|wider, w1x, w2x, w3x, large, big<br />
|<br />
|-<br />
|} <br />
<br />
[[#Beispiel_select|Link zu einem Beispiel]]<br />
<br />
<div id="simplechart">'''SIMPLECHART'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-logdevice<br />
|name of the logdevice (e.g. FileLog_WohnzimmerHeizung)<br />
|<br />
|-<br />
!align="right" |data-logfile<br />
|name of the logfile (e.g. WohnzimmerHeizung-2015.log)<br />
|'-' means current logfile<br />
|-<br />
!align="right" |data-columnspec<br />
|definition for how to find the values (e.g. "4:meas.*:1:int")<br />
|''<br />
|-<br />
!align="right" |data-minvalue<br />
|min Y value to Show or an array of values for dynamic minY <br />
|10<br />
|-<br />
!align="right" |data-maxvalue<br />
|max Y value to Show or an array of values for dynamic maxY <br />
|30<br />
|-<br />
!align="right" |data-yticks<br />
|value distance between Y tick lines<br />
|5<br />
|-<br />
!align="right" |data-xticks<br />
|time range between each X tick line (in Minuten)<br />
|360 minutes<br />
|-<br />
!align="right" |data-daysago<br />
|number of days back from now <br />
|0<br />
|-<br />
!align="right" |data-caption<br />
|name of the chart to show as text <br />
|<br />
|-<br />
!align="right" |data-yunit<br />
|unit of the value to show beside of each Y ticks<br />
|<br />
|-<br />
!align="right" |data-width<br />
|fixe size for width (in % or px)<br />
|<br />
|-<br />
!align="right" |data-height<br />
|fixe size for height (in % or px)<br />
|<br />
|-<br />
!align="right" |class<br />
|fullsize, noticks<br />
|<br />
|-<br />
|} <br />
<br />
[[#Beispiel_simplechart|Link zu einem Beispiel]] (fehlt noch)<br />
<br />
<code>data-logfile</code> kann man auch weglassen, dann greift der Defaultwert "-". Damit wird das neuste Logfile gelesen.<br />
<br />
<br />
<div id="slider">'''SLIDER'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-get<br />
|name of the reading to get from Fhem<br />
|'STATE'<br />
|-<br />
!align="right" |data-set<br />
|command to send to Fhem (<code>set <device> <command> <value></code>)<br />
|''<br />
|-<br />
!align="right" |data-cmd<br />
|name of the command (<command> <device> <value>) (e.g. setstate, set, setreading, trigger)<br />
|'set'<br />
|-<br />
!align="right" |data-min<br />
|minimal value to set<br />
|0<br />
|-<br />
!align="right" |data-max<br />
|maximal value to set<br />
|100<br />
|-<br />
!align="right" |data-on<br />
|value where the slider moves to max<br />
|'on'<br />
|-<br />
!align="right" |data-off<br />
|value where the slider moves to min<br />
|'off'<br />
|-<br />
!align="right" |data-value<br />
|wenn true wird beim sliden der Wert angezeigt<br />
|<br />
|-<br />
!align="right" |data-width<br />
|width for horizontal sliders<br />
|'120px', for mini '60px'<br />
|-<br />
!align="right" |data-height<br />
|height for vertical sliders <br />
|'120px', for mini '60px'<br />
|-<br />
!align="right" |class<br />
|Aussehen/Ausrichtung<br />
|<br />
|-<br />
|}<br />
<br />
Für class steht mini, horizontal und negated (0 liegt oben) zur Verfügung.<br />
<br />
[[#Beispiel_slider|Link zu einem Beispiel]]<br />
<br />
<div id="switch">'''SWITCH'''</div><br />
<br />
{| class="wikitable"<br />
!HTML-Attribut<br />
!Beschreibung<br />
!Default-Wert<br />
|-<br />
!align="right" |data-get<br />
|Name des Reading, was gelesen werden soll<br />
|'STATE'<br />
|-<br />
!align="right" |data-get-on<br />
|Wert, bei dem zum Status ON geschaltet werden soll. <br />
|'on'<br />
|-<br />
!align="right" |data-get-off<br />
|Wert, bei dem zum Status OFF geschaltet werden soll. <br />
|'off'<br />
|-<br />
!align="right" |data-set-on<br />
|Wert, der zu Fhem gesendet werden soll, wenn das Widget auf ON geschaltet wurde <br />
|Wert von data-get-on<br />
|-<br />
!align="right" |data-set-off<br />
|Wert, der zu Fhem gesendet werden soll, wenn das Widget auf OFF geschaltet wurde <br />
|Wert von data-get-off<br />
|-<br />
!align="right" |data-cmd<br />
|Kommando Name (<command> <device> <value>) <br />(z.B setstate, set, setreading, trigger) <br />
|'set'<br />
|-<br />
!align="right" |data-icon<br />
|Name des Font-Awesome Icon. <br />
|'fa-lightbulb-o'<br />
|-<br />
!align="right" |data-background-icon<br />
|Name des Font-Awesome Hintergrund Icon. <br />
|'fa-circle'<br />
|-<br />
!align="right" |data-on-color<br />
|Widget Farbe beim Status ON <br />
|'#aa6900'<br />
|-<br />
!align="right" |data-off-color<br />
|Widget Farbe beim Status OFF <br />
|'#505050'<br />
|}<br />
<br />
<code>data-get-on</code> and <code>data-get-off</code> accept also RegEx values. e.g. data-get-on="[0-9]{1,3}|on" means set switch on if STATE is a numeric value or 'on'. data-get-off="!on" means accept all but the data-get-on value (negation)<br />
<br />
[[#Beispiel_switch|Link zu einem Beispiel]]<br />
<br />
<br />
<div id="symbol">'''SYMBOL'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-get<br />
|Name des Reading, was gelesen werden soll<br />
|'STATE'<br />
|-<br />
!align="right" |data-get-on<br />
|value for ON status to get or an array of states. <br />
|'open'<br />
|-<br />
!align="right" |data-get-off<br />
|value for OFF status to get. <br />
|'closed'<br />
|-<br />
!align="right" |data-get-warn<br />
|RegEx to extract reading part for warn icon. <br />
|<br />
|-<br />
!align="right" |data-icon<br />
|Name des font-awesome-Symbols <br />
|'ftui-window'<br />
|-<br />
!align="right" |data-background-icon<br />
|Hintergrundsymbol<br />
|''<br />
|-<br />
!align="right" |data-on-background-color<br />
|Farbe für ON-Zustand.<br />
|'#aa6900'<br />
|-<br />
!align="right" |data-off-background-color<br />
|Farbe für ON-Zustand.<br />
|'#505050'<br />
|-<br />
!align="right" |data-on-color<br />
|Farbe für ON-Zustand.<br />
|'#aa6900'<br />
|-<br />
!align="right" |data-off-color<br />
|Farbe für ON-Zustand.<br />
|'#505050'<br />
|-<br />
!align="right" |data-icons<br />
|Array mit Icons zu data-get-on Array<br />
|<br />
|-<br />
!align="right" |data-on-colors<br />
|array of colors related to the data-get-on array<br />
|''<br />
|-<br />
!align="right" |data-on-background-colors<br />
|array of background-colors related to the data-get-on array<br />
|''<br />
|-<br />
|}<br />
<br />
To use multiple icons, data-get-on, data-icons and data-on-colors have to be an array with the same size. The value for one icon can also contain an additional animatation CSS name, e.g. "fa-exclamation-triangle fa-blink" for a blinking symbol. data-get-on and data-get-off accept also RegEx values. The value for one icon can also contain an additional animatation CSS name, e.g. "fa-exclamation-triangle fa-blink" for a blinking symbol<br />
<br />
[[#Beispiel_symbol|Link zu einem Beispiel]]<br />
<br />
<br />
<div id="thermostat">'''THERMOSTAT'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-get<br />
|name of the reading to get from Fhem<br />
|'desired-temp'<br />
|-<br />
!align="right" |data-temp<br />
|reading for measured temperature of thermostates<br />
|'measured-temp'<br />
|-<br />
!align="right" |data-set<br />
|command to send to Fhem (set <device> <command> <value>)<br />
|'desired-temp'<br />
|-<br />
!align="right" |data-valve<br />
|reading for valve position of thermostates<br />
|<br />
|-<br />
!align="right" |data-min<br />
|minimal value to set<br />
| 10<br />
|-<br />
!align="right" |data-max<br />
|maximal value to set<br />
| 30<br />
|-<br />
!align="right" |data-minColor<br />
|Farbe des Keises für Min<br />
| #4477FF<br />
|-<br />
!align="right" |data-maxColor<br />
|Farbe des Kreises für Max, zwischen Min und Max wird linear interpoliert <br />
| #FF0000<br />
|-<br />
!align="right" |data-step<br />
|step size for value adjustment e.g. 0.5 <br />
|1<br />
|-<br />
!align="right" |data-bgColor<br />
|Die Farbe der Kreises zwischen den ticks<br />
|'transparent'<br />
|-<br />
!align="right" |data-fgColor<br />
|Die Farbe der zahl im Kreismittelpunkt<br />
|#bbbbbb<br />
|-<br />
!align="right" |data-tkColor<br />
|Die Farbe der ticks<br />
|#696969<br />
|-<br />
|-<br />
!align="right" |data-angleOffset<br />
|Start der ticks im Kreis (in Winkelgraden, 0 = oben)<br />
| -120<br />
|-<br />
!align="right" |data-angleArc<br />
|Bereich der ticks im Kreis (in Winkelgraden)<br />
|240<br />
|-<br />
!align="right" |class<br />
|big, readonly<br />
|<br />
|-<br />
|}<br />
<br />
[[#Beispiel_thermostat|Link zu einem Beispiel]]<br />
<br />
<br />
<div id="volume">'''VOLUME'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-get<br />
|name of the reading to get from Fhem <br />
|'STATE'<br />
|-<br />
!align="right" |data-set<br />
|command to send to Fhem (set <device> <command> <value>)<br />
|''<br />
|-<br />
!align="rigth" |data-cmd<br />
|name of the command (<command> <device> <value>) (e.g. setstate, set, setreading, trigger) <br />
|'set'<br />
|-<br />
!align="right" |data-min<br />
|minimal value to set<br />
|0<br />
|-<br />
!align="right" |data-max<br />
|maximal value to set<br />
|70<br />
|-<br />
!align="right" |class<br />
|small, hue-tick, hue-front, hue-back, dim-tick ,dim-front, dim-back<br />
|<br />
|-<br />
|}<br />
<br />
[[#Beispiel_volume|Link zu einem Beispiel]] (fehlt noch)<br />
<br />
<br />
<div id="weather">'''WEATHER'''</div><br />
<br />
{| class="wikitable"<br />
!HTML Attribut<br />
!Beschreibung<br />
!Default Wert<br />
|-<br />
!align="right" |data-get<br />
|name of the reading to get the weather literal from Fhem<br />
|'STATE'<br />
|-<br />
!align="right" |data-imageset<br />
|collection of images to display current weather situation. Possible values: 'meteocons', 'kleinklima'<br />
|'meteocons'<br />
|-<br />
!align="right" |data-image-path<br />
|path to the images of the selected imageset<br />
|/images/weather/<br />
|-<br />
|}<br />
<br />
[[#Beispiel_weather|Link zu einem Beispiel]]<br />
<br />
== Widgets -- Beispiele ==<br />
<br />
<div id="Beispiel_chart">'''Chart'''</div><br />
<br />
Display a chart with similar capabilities as the FHEM plots<br />
<br />
<pre><br />
<div class="normal"><br />
data-type="chart"<br />
data-logdevice='["Log.Garden","Log.Garden","Log.Garden","Log.Predicted"]'<br />
data-columnspec='["4:Garden.T:15:","10:Garden.T:0:delta-h","10:Garden.T:0:delta-d","4:predicted.*:15:"]'<br />
data-style='["ftui l0fill","ftui l1fill","ftui l2","ftui l3dot"]'<br />
data-ptype='["lines","histeps","histeps","cubic"]'<br />
data-uaxis='["primary","secondary","secondary","primary"]'<br />
data-legend='["Temperature","Rain/hour","Rain/day","Predicted Temp."]'<br />
data-yunit="°C"<br />
data-ytext="Temperature"<br />
data-minvalue="auto"<br />
data-maxvalue="auto"<br />
data-yunit_sec="mm"<br />
data-ytext_sec="Rain (mm)"<br />
data-height="250"<br />
data-yticks="auto"<br />
data-minvalue_sec="auto"<br />
data-maxvalue_sec="auto"<br />
data-nofulldays="true"<br />
data-daysago_start="2013-08-13T00:00:00"<br />
data-daysago_end="2013-08-14T00:00:00"<br />
data-cursorgroup="1"<br />
data-scrollgroup="1"<br />
data-xticks="auto"><br />
</div><br />
</pre><br />
<br />
[[Datei:chart_tabletUI.png]]<br />
<br />
<br />
<div id="Beispiel_circlemenu">'''Circlemenu'''</div><br />
<br />
Cover a lot of other button behind one single button<br />
<br />
<pre><br />
<div class="left"><br />
<div data-type="circlemenu" class="cell circlemenu"><br />
<ul class="menu"><br />
<li><div data-type="push" data-icon="fa-wrench"></div></li><br />
<li><div data-type="push" data-device="AvReceiver" <br />
data-set="remoteControl subwoofer-temporary-level -6" <br />
data-icon="">-6</div></li><br />
<li><div data-type="push" data-device="AvReceiver" <br />
data-set="remoteControl subwoofer-temporary-level -2" <br />
data-icon="">-2</div></li><br />
<li><div data-type="push" data-device="AvReceiver" <br />
data-set="remoteControl subwoofer-temporary-level 0" <br />
data-icon="">0</div></li><br />
<li><div data-type="push" data-device="AvReceiver" <br />
data-set="remoteControl subwoofer-temporary-level +3" <br />
data-icon="">2</div></li><br />
<li><div data-type="push" data-device="AvReceiver" <br />
data-set="remoteControl subwoofer-temporary-level +9" <br />
data-icon="">9</div></li><br />
<li><div data-type="push" data-device="AvReceiver" <br />
data-set="remoteControl subwoofer-temporary-level +C" <br />
data-icon="">12</div></li><br />
</ul><br />
</div><br />
<div data-type="label" class="cell">Woofer</div><br />
</div><br />
</pre><br />
<br />
[[Datei:circlemenu_tabletUI.png]]<br />
<br />
<br />
<div id="Beispiel_dimmer">'''Dimmer'''</div><br />
<br />
Dimmer Widget Beispiel für Philips Hue<br />
<br />
Minimalvariante<br />
<pre> <br />
<div data-type="dimmer" data-device="HUEDevice1"<br />
data-get-on="!off" data-get-off="off"<br />
data-set="pct"</div><br />
</pre><br />
<br />
Mit Anzeige der Dimstufe<br />
<pre><br />
<div data-type="dimmer" data-device="HUEDevice1"<br />
data-get="onoff"<br />
data-get-on="1" data-get-off="0"<br />
data-set=""<br />
data-set-on="on" data-set-off="off"<br />
data-dim="pct"><br />
</div><br />
</pre><br />
<br />
Dimmer Widget für MilightDevice<br />
<br />
<pre><br />
<div data-type="dimmer"<br />
data-device="SonstWas"<br />
data-get="brightness"<br />
data-get-off="0"<br />
data-get-on="[1-9][0-9]*"<br />
data-set-on="on"<br />
data-set-off="off"<br />
data-dim="dim"<br />
data-min="0"<br />
data-max="100"<br />
></div><br />
</pre><br />
<br />
<br />
<div id="Beispiel_homestatus">'''Homestatus'''</div><br />
<br />
Beispiel rechts im Bild:<br />
<pre><br />
<div data-type="homestatus" data-device='dummy1'<br />
data-get-on='["1","2","3","4"]'<br />
data-alias='["Home","Night","Away","Holiday"]'<br />
data-icons='["fa-home","fa-bed","fa-car","fa-suitcase"]'><br />
</div><br />
</pre><br />
<br />
Beispiel links im Bild:<br />
<pre><br />
<div data-type="homestatus" data-device='dummy1'<br />
data-get-on='["home","asleep","absent","gone","gotosleep"]'<br />
data-alias='["Home","Night","Away","Holiday","Retire"]'<br />
data-icons='["fa-fire","fa-film","fa-plus","fa-car","fa-tint"]'<br />
data-version='residents'><br />
</div><br />
</pre><br />
<br />
[[Datei:homestatus_tabletUI.png]]<br />
<br />
<br />
<br />
<div id="Beispiel_image">'''Image'''</div><br />
<br />
<br />
Erzeugt ein Widget mit einem Bild aus dem www, das alle 5 Sekunden aktualisiert wird (hier eine Wetterkarte vom DWD).<br />
<br />
<pre><br />
<div data-type="image"<br />
data-size="80%"<br />
data-url="http://www.dwd.de/wundk/wetter/de/Deutschland.jpg"<br />
</div><br />
</pre><br />
<br />
[[Datei:image_tabletUI.jpg]]<br />
<br />
<br />
Example for how to add an image to the dashboard which its URL is delivered by a Fhem module like PROPLANTA:<br />
<br />
<pre><br />
<div data-type="image" data-device="Wetter1" <br />
data-get="fc0_weatherDayIcon" <br />
data-size="40px" <br />
class="cell"><br />
</div><br />
</pre><br />
<br />
<br />
<div id="Beispiel_label">'''Label'''</div><br />
<br />
Example for HM-WDS40-TH-I Funk-Temperatur-/Feuchtesensor innen<br />
<br />
<pre><br />
STATE T: 20.0 H: 61<br />
</pre><br />
<pre><br />
<div data-type="label" data-device="THSensorWZ" <br />
data-part="2" data-unit="%B0C%0A" class="cell big"></div><br />
<div data-type="label" class="cell">Temperatur</div><br />
<div data-type="label" data-device="THSensorWZ" data-part="4" <br />
data-unit="%" class="cell big"></div><br />
<div data-type="label" class="cell">Luftfeuchte</div><br />
</pre><br />
<br />
But the same result can reached by getting single readings:<br />
<pre><br />
humidity 58<br />
temperature 20.1<br />
</pre><br />
<br />
<pre><br />
<div data-type="label" data-device="THSensorWZ" <br />
data-get="temperature" data-unit="%B0C%0A" class="cell big"></div><br />
<div data-type="label" class="cell">Temperatur</div><br />
<div data-type="label" data-device="THSensorWZ" <br />
data-get="humidity" data-unit="%" class="cell big"></div><br />
<div data-type="label" class="cell">Luftfeuchte</div><br />
</pre><br />
<br />
Example for how to influence the color of the label according to value limits<br />
<pre><br />
<div data-type="label" <br />
data-device="OutTemp" <br />
data-limits='[-73,10,23]' <br />
data-colors='["#6699FF","#AA6900","#FF0000"]' <br />
data-unit="%B0C%0A" <br />
class="cell big"><br />
</div><br />
</pre><br />
<br />
Example for how to create a widget for shutter via push: show state and set up/down<br />
<pre><br />
<div data-type="switch" <br />
data-device="wzRollo" <br />
data-get-on="up" <br />
data-get-off="down" <br />
data-icon="fa-bars" <br />
class="cell" ><br />
</div><br />
<div data-type="label" <br />
class="cell">Rollo</div><br />
</pre><br />
<br />
Example for how to create a label for a time value in short format with usage of RegEx.<br />
<br />
<pre><br />
<div data-type="label" <br />
data-device="dummy1" <br />
data-part="(\d\d\.\d\d\.).*" <br />
class="cell"><br />
</div><br />
</pre><br />
<br />
Example for how to show two labels in one line.<br />
<br />
<pre><br />
<div class=""><br />
<div type="label" device="OnSunrise" class="inline"></div>bis<br />
<div type="label" device="OnSunset" class="inline"></div><br />
</div><br />
</pre><br />
<br />
Beispiel für die Anzeige des UV-Indexes und der Abhängigkeit der anzuzeigenden Farbe.<br />
<br />
<pre><br />
<div data-type="label" class="wider cell bigger" data-device="ProVorhersage"<br />
data-get="fc0_uv"<br />
data-limits="[-2, 2, 5, 7, 10]" <br />
data-colors='["#66FF33","#FFFF00","#FF6600","#FF0000","#993399"]'></div><br />
<div data-type="label" class="cell" data-device="ProVorhersage" data-get="fc0_date"></div><br />
<div data-type="label" class="wider cell bigger" data-device="ProVorhersage"<br />
data-get="fc1_uv"<br />
data-limits="[-2, 2, 5, 7, 10]"<br />
data-colors='["#66FF33","#FFFF00","#FF6600","#FF0000","#993399"]'></div><br />
<div data-type="label" class="cell" data-device="ProVorhersage" data-get="fc1_date"></div><br />
</pre><br />
<br />
[[Datei:label_tabletUI.jpg]]<br />
<br />
<br />
<div id="Beispiel_pagetab">'''Pagetab'''</div><br />
<br />
Example for a tab menu to switch smoothly between multiple pages. Multiple pagetabs in a template file: menu.html<br />
<br />
<pre><br />
<html><br />
<body><br />
<header>MENU</header><br />
<div class="cell"><br />
<div data-type="pagetab" data-url="index.html" data-icon="fa-home" class="cell"></div><br />
<div data-type="pagetab" data-url="index_2.html" data-icon="fa-sliders" class="cell"></div><br />
<div data-type="pagetab" data-url="index_3.html" data-icon="fa-music" class="cell"></div><br />
<div data-type="pagetab" data-url="index_4.html" data-icon="fa-hotel" class="cell"></div><br />
<div data-type="pagetab" data-url="index_5.html" data-icon="fa-music" class="cell"></div><br />
<div data-type="pagetab" data-url="index_6.html" data-icon="fa-database" class="cell"></div><br />
<div data-type="pagetab" data-url="index_7.html" data-icon="fa-fax" class="cell"></div><br />
</div><br />
</body><br />
</html><br />
</pre><br />
<br />
<br />
<div id="Beispiel_playstream">'''Playstream'''</div><br />
<br />
Erzeugt einen Knopf zum direkten Abspielen eines Webradio-Streams.<br />
<br />
<pre><br />
<div data-type="playstream" data-url="http://radioeins.de/stream"></div><br />
<div data-type="label" class="darker">Radio eins</div><br />
</pre><br />
<br />
<br />
<div id="Beispiel_push">'''Push'''</div><br />
<br />
Example for how to create a push button widget to trigger all devices on:<br />
<br />
<pre><br />
<div data-type="push" <br />
data-device="LightAll" <br />
data-cmd="trigger" <br />
data-set="on" <br />
class="cell"><br />
</div><br />
</pre><br />
<br />
<br />
Beispiel für zwei horizontale Buttons:<br />
<br />
<pre><br />
<div class="cell"><br />
<div class="doublebox-h"><br />
<div data-type="push" data-device="Rollo" <br />
data-icon="fa-angle-up" data-background-icon="fa-square-o" <br />
data-set="up"><br />
</div><br />
<div data-type="push" data-device="Rollo" <br />
data-icon="fa-angle-down" data-background-icon="fa-square-o" <br />
data-set="down"><br />
</div><br />
</div><br />
</div><br />
</pre><br />
<br />
[[Datei:push1.png]]<br />
<br />
<br />
Beispiel für zwei quadratische vertikale Buttons:<br />
<br />
<pre><br />
<div class="cell"><br />
<div class="doublebox-v"><br />
<div data-type="push" data-device="Rollo" <br />
data-icon="fa-chevron-up" data-background-icon="fa-square-o" <br />
data-set="up"><br />
</div><br />
<div data-type="push" data-device="Rollo" <br />
data-icon="fa-chevron-down" data-background-icon="fa-square-o" <br />
data-set="down"><br />
</div><br />
</div><br />
</div><br />
</pre><br />
<br />
[[Datei:push2.png]]<br />
<br />
<br />
<div id="Beispiel_rotor">'''Rotor'''</div><br />
<br />
Example for a rotor widget, which switches between to days of weather forecast<br />
<br />
<pre><br />
<div data-type="rotor" class="fade"><br />
<ul><br />
<li><br />
<div data-type="label" class="darker">Heute</div><br />
<div data-type="weather" data-device="AgroWeather" data-get="fc0_weatherDay" class="big"></div><br />
<div data-type="label" data-device="AgroWeather" data-get="fc0_weatherDay" class=""></div><br />
<div data-type="label" data-device="AgroWeather" data-get="fc0_tempMax" data-unit="%B0C%0A" class="large"></div><br />
</li><br />
<li><br />
<div data-type="label" class="darker">Morgen</div><br />
<div data-type="weather" data-device="AgroWeather" data-get="fc1_weatherDay" class="big"></div><br />
<div data-type="label" data-device="AgroWeather" data-get="fc1_weatherDay" class=""></div><br />
<div data-type="label" data-device="AgroWeather" data-get="fc1_tempMax" data-unit="%B0C%0A" class="large"></div><br />
</li><br />
</ul><br />
</div><br />
</pre><br />
<br />
<br />
<br />
<div id="Beispiel_select">'''Select'''</div><br />
<br />
Erzeugt zwei Comboboxen zur Auswahl des Eingang eines 2-Zonen-AV-Receivers. Die Liste für Zone2 ist fest, die Liste für Zone1 wird von Fhem übergeben.<br />
<br />
<pre><br />
<div class="cell wider"><br />
<div data-type="label" class="inline wider">Zone2</div><br />
<div data-type="select" data-device="AvReceiverZ2" data-items='["Airplay","Webradio","BD/DVD","PHONO"]' data-get="input" data-set="input" class="cell w2x" ></div><br />
<div></div><br />
<div data-type="label" class="inline">Zone1</div><br />
<div data-type="select" data-device="AvReceiver" data-list="inputs" data-get="input" data-set="input" class="cell w2x" ></div><br />
</div><br />
</pre><br />
<br />
[[Datei:select_tabeltUI.png]]<br />
<br />
<br />
<div id="Beispiel_slider">'''Slider'''</div><br />
<br />
<br />
Slider mit einstellbaren Werten von 10 bis 90:<br />
<br />
<pre><br />
<div data-type="slider" <br />
data-device='Dummy1' <br />
data-min="10" <br />
data-max="90" <br />
class="cell" ><br />
</div><br />
<div data-type="label" class="cell">Light1</div><br />
</pre><br />
<br />
[[Datei:slider_tabletUI.png]]<br />
<br />
<br />
Horizontal angeordneter Slider:<br />
<br />
<pre><br />
<div data-type="slider"<br />
data-device='Dummy1' <br />
data-min="0" <br />
data-max="100" <br />
class="horizontal" <br />
</div><br />
</pre><br />
<br />
[[Datei:slider_tabletUI2.jpg]]<br />
<br />
<br />
<div id="Beispiel_switch">'''Switch'''</div><br />
<br />
Schalter. Usage of RegEx pattern for state request:<br />
<br />
<pre><br />
<div data-type="switch" class="cell" <br />
data-device="MILIGHT_Zone1_Wohnzimmer" <br />
data-get-on="on.*"<br />
data-get-off="off"></div><br />
</pre><br />
<br />
[[Datei:switch.png]]<br />
<br />
Beispiel für eine Gruppe von Schaltern, um zwischen vier verschiedenen Werten eines device umzuschalten:<br />
<br />
<pre><br />
<div class="cell left"><br />
<div data-type="switch" data-device="dummy1" <br />
data-get-off="((?!Wert1).)*" <br />
data-get-on="Wert1" class="cell" ></div><br />
<div data-type="label" class="cell">Wert1</div><br />
<div data-type="switch" data-device="dummy1" <br />
data-get-off="((?!Wert2).)*" <br />
data-get-on="Wert2" class="cell" ></div><br />
<div data-type="label" class="cell">Wert2</div><br />
<div data-type="switch" data-device="dummy1" <br />
data-get-off="((?!Wert3).)*" <br />
data-get-on="Wert3" class="cell" ></div><br />
<div data-type="label" class="cell">Wert3</div><br />
<div data-type="switch" data-device="dummy1" <br />
data-get-off="((?!Wert4).)*" <br />
data-get-on="Wert4" class="cell" ></div><br />
<div data-type="label" class="cell">Wert4</div><br />
</div><br />
</pre><br />
<br />
[[Datei:switch4.png]]<br />
<br />
<br />
<div id="Beispiel_symbol">'''Symbol'''</div><br />
<br />
Example for a tristate icon<br />
<br />
<pre><br />
<div data-type="symbol" data-device="dummy1" <br />
data-get-on='["wert1","wert2","wert3"]' <br />
data-icons='["fa-arrow-up","fa-user","fa-arrow-down"]' <br />
data-on-colors='["SeaGreen","SlateBlue","IndianRed"]' <br />
class="cell big"><br />
</div><br />
</pre><br />
<br />
<br />
Example for a tristate icon with blink and spin animation<br />
<br />
<pre><br />
<div data-type="symbol" data-device="dummy1" <br />
data-icons='["fa-exclamation-triangle fa-blink","fa-exclamation-circle","fa-cog fa-spin"]' <br />
data-on-colors='["Crimson","GoldenRod","SeaGreen"]' <br />
data-get-on='["Wert1","Wert2","Wert3"]' ><br />
</div><br />
</pre><br />
<br />
<br />
Example for a battery level control with RegEx<br />
<br />
<pre><br />
<div data-type="symbol" data-device="BadHeizung" data-get="batteryLevel"<br />
data-icons='["oa-measure_battery_100","oa-measure_battery_75","oa-measure_battery_50","oa-measure_battery_25","oa-measure_battery_0"]'<br />
data-get-on='["3\\.[0-9]","2\\.[789]","2\\.[456]","2\\.[123]","((2\\.0)|([01]\\.[0-9]))"]'<br />
data-on-colors='["#505050","#505050","#505050","#ad3333","#ad3333"]'><br />
</div><br />
</pre><br />
<br />
<br />
<br />
Example for a battery level control with greater-equal compare and 90° rotated symbols<br />
<br />
<pre><br />
<div data-type="symbol" data-device="BadHeizung" data-get="batteryLevel"<br />
data-icons='["oa-measure_battery_0 fa-rotate-90","oa-measure_battery_25 fa-rotate-90","oa-measure_battery_50 fa-rotate-90","oa-measure_battery_75 fa-rotate-90","oa-measure_battery_0 fa-rotate-90"]'<br />
data-get-on='["0","2","2.4","2.7","3.0"]'<br />
data-on-colors='["#ad3333","#ad3333","#505050","#505050","#505050"]'><br />
</div><br />
</pre><br />
<br />
<br />
<div id="Beispiel_thermostat">'''Thermostat'''</div><br />
<br />
Configure as data-device='...' that item which delivers temp and desired-temp as reading.<br />
<br />
Default parameters are:<br />
<pre><br />
data-get="desired-temp" data-temp="measured-temp" data-set="desired-temp"<br />
</pre><br />
<br />
Therefor for HomaMatic HM-CC-RT-DN this is sufficient.<br />
<br />
<pre><br />
<div data-type="thermostat" data-device='KH_Clima' class="cell"></div><br />
</pre><br />
<br />
The long format looks like this:<br />
<br />
<pre><br />
<div data-type="thermostat" <br />
data-device="KH_Clima" <br />
data-get="desired-temp" <br />
data-temp="measured-temp" <br />
class="cell"><br />
</div><br />
</pre><br />
<br />
<br />
Example for MAX!:<br />
<pre><br />
<div data-type="thermostat" data-device="HZ_Tuer" <br />
data-valve="valveposition" <br />
data-get="desiredTemperature" <br />
data-temp="temperature" <br />
data-set="desiredTemperature" <br />
class="cell"><br />
</div><br />
</pre><br />
<br />
The wigets will show the valve value only in case of a valid data-valve attribute. The default for data-valve ist null. That means, a empty data-valve attribute hides the valve label for the widget.<br />
<br />
[[Datei:thermostat.png]]<br />
<br />
<br />
<div id="Beispiel_weather">'''Weather'''</div><br />
<br />
Das Widget fügt ein dem Wetter entsprechendes Bild ein. Die Daten können durch Fhem-Module wie [[PROPLANTA]], [[OPENWEATHER]] und [[Weather]] bereitgestellt werden. <br />
Add 'big' or 'bigger' to CSS class to get a bigger weather icon.<br />
<br />
Beispiel:<br />
<pre><br />
<div data-type="weather" <br />
data-device="Weather" <br />
data-get="fc0_weatherDay" <br />
class="cell big"><br />
</div><br />
</pre><br />
<br />
[[Datei:weather.png]]<br />
<br />
== Icon-Konfiguration ==<br />
<br />
* Eingebaute Icons: Diese haben das ftui-Präfix. Zurzeit sind folgende verfügbar: ftui-window, ftui-door<br />
<br />
* Mehr als 500 Icons von "http://fortawesome.github.io/Font-Awesome/icons" verfügbar. Einfach den Icon-Namen angeben (Suffix "fa-" nicht vergessen, Z.B. <code>data-icon="fa-volume-up"</code><br />
<br />
* Es stehen auch Openautomation Font-Files zur Verfügung. Wer sie nutzen möchte, muss folgende Stylesheets in die index.html hinzufügen.<br />
<pre><br />
<link rel="stylesheet" href="/fhem/tablet/lib/openautomation.css" /><br />
<link rel="stylesheet" href="/fhem/tablet/lib/fhemSVG.css" /><br />
</pre><br />
<br />
Diese font icons haben das Präfix 'fs-' bzw. 'oa-'.<br />
<br />
Beispiel bei einem Schalter:<br />
<pre><div data-type="switch" data-device='dummy1' data-icon="oa-secur_locked"></div></pre><br />
<br />
<br />
Und so als großes Symbol:<br />
<pre><br />
<div data-type="symbol" data-device='dummy1'<br />
data-icon="oa-status_frost"<br />
data-on-color="#bb3232"<br />
data-get-on="on"<br />
data-get-off="!on"<br />
class="bigger"><br />
</div><br />
</pre><br />
<br />
<br />
Die Icons kann man auch etwas dicker darstellen mit den Zusatz bold: <code>data-icon="oa-secur_locked bold"</code><br />
<br />
<br />
Die Namen der verfügbaren Icons findet man auch in den CSS Files (openautomation.css / fhemSVG.css)<br />
<br />
<br />
== Spezial ==<br />
Folgender Befehl setzt einen direkten Befehl an Fhem ab (<code>set dummy1 off</code>):<br />
<pre><br />
<div onclick="setFhemStatus('set dummy1 off')">All off!</div><br />
</pre><br />
<br />
<br />
<br />
== FAQ ==<br />
Häufig gestellte Fragen zum FHEM Tablet UI sind in der [[FHEM_Tablet_UI/FAQ|FHEM Tablet UI FAQ]] zusammengestellt.<br />
<br />
== Links ==<br />
* [http://forum.fhem.de/index.php/topic,34233.0.html Forums-Beitrag]<br />
* [https://github.com/knowthelist/fhem-tablet-ui Projekt auf Github]<br />
* [http://forum.fhem.de/index.php/topic,37378.0.html User-Demos]<br />
* [https://github.com/ovibox/fhem-ftui-user-demos Download der User-Demo-Dateien]<br />
<br />
[[Kategorie:FHEM Frontends]]</div>JoeAllhttp://wiki.fhem.de/w/index.php?title=ReadingsGroup&diff=13557ReadingsGroup2016-01-11T15:16:16Z<p>JoeAll: Link korrigiert</p>
<hr />
<div>{{SEITENTITEL:readingsGroup}}<br />
{{Infobox Modul<br />
|ModPurpose=Einfache zusammenfassende Darstellung von Informationen über mehrere Geräte und deren Steuerung<br />
|ModType=h<br />
|ModCmdRef=readingsGroup<br />
|ModForumArea=Frontends<br />
|ModTechName=33_readingsGroup.pm<br />
|ModOwner=Andre ([http://forum.fhem.de/index.php?topic=14425.0 Forum] / [[Benutzer Diskussion:justme|Wiki]])}}<br />
<br />
Das Fhem-[[:Kategorie:Hilfsmodul|Hilfsmodul]] [[readingsGroup]] bietet eine einfache Möglichkeit, ''Readings'' (kein Präfix vor dem Reading-Namen), ''Internals'' (Präfix "+" vor dem Namen des internen Wertes) und ''Attributes'' (Präfix "?" vor dem Namen des Attributs) von einem oder mehreren ''Devices'' darzustellen und flexibel zu formatieren.<br />
<br />
Die Aktualisierung im Browserfenster geschieht per longpoll und überträgt nur die jeweils geänderten Zellen. Wenn eine readingsGroup in keinem Browserfenster angezeigt wird findet keine longpoll aktualisierung statt.<br />
<br />
== Definition == <br />
Siehe [http://fhem.de/commandref.html#readingsGroup commandref].<br />
<br />
== Attribute ==<br />
{{Randnotiz|RNText=In allen Mappings die einen Hash verwenden muss der Key (das was jeweils links von => Operator steht) in Anführungszeichen stehen. Die einzige Ausnahme hiervon sind Keys die aus einem String bestehen der mit einem Buchstaben beginnt und nur Buchstaben und Zahlen enthält.}}<br />
Weitergehende Erläuterungen zu einzelnen Attributen.<br />
<br />
Die komplette Liste der Attribute ist der commandref zu entnehmen.<br />
<br />
=== noheading ===<br />
[[Datei:ReadingsGroup_noheading.png|mini|rechts|400px|ReadingsGroup: rechts mit "noheading" Attribut, links der anklickbare Titel]]<br />
Das Attribut <code>noheading</code> führt dazu, dass der Alias der ReadingsGroup nicht mehr als Titel angezeigt wird. Das kann wünschenswert sein, wenn die ReadingsGroup auf einer [[Dashboard]]-Seite angezeigt werden soll, hat allerdings den Nachteil, dass die Detail-Ansicht der ReadingsGroup nicht mehr über einen Klick auf den Titel aufgerufen werden kann. Der Einstellungsdialog der ReadingsGroup ist dann nur noch (z.&nbsp;B.) über<br />
* <code>list TYPE=readingsGroup</code><br />
* einen "Probably associated with"-Link eines anderen Objekts oder über<br />
* manuelle Modifikation der URL eines anderen Objekts (<code>http:.../fhem?detail=<objektname></code>)<br />
erreichbar.<br />
<br />
=== nolinks ===<br />
Devicenamen und Titel der readingsGroup verlinken nicht mehr zur zugehörigen Detailansicht und sind nicht mehr anklickbar.<br />
<br />
=== nostate ===<br />
Das state-Reading wird bei regex match nicht berücksichtigt und nicht angezeigt.<br />
<br />
=== notime ===<br />
Es werden keine Timestamps für die Readings angezeigt. Nur für einspaltige readingsGroups sinnvoll.<br />
<br />
== Beispiele ==<br />
Bitte beachten: die folgenden Beispiele enthalten keine Maskierungen oder Verdoppelungen für ; und Zeilenende, sondern sind so angegeben, wie sie im [[PGM2|Web Interface]] im Befehls-Eingabefeld, nach Klick auf DEF und im Attribut-Eingabefeld eingegeben werden. Beim manuellen Einfügen in eine [[Konfiguration|Konfigurationsdatei]] sind diese Maskierungen oder Verdoppelungen natürlich vorzunehmen.<br />
<br />
=== Einfache Auswahl über Reading-Namen ===<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen !! Aussehen <br />
|-<br />
| style="width:40%" |<code>define battStatus readingsGroup .*:[Bb]attery</code><br />
| Alle readings mit Namen '''Battery''' oder '''battery''' von allen Devices. <br />
| rowspan=3 | [[Datei:rgBattery.png|thumb]]<br />
|-<br />
| <code>attr battStatus alias FHT Batteriestatus </code><br />
| Der Alias wird als Zeilentitel verwendet<br />
|-<br />
| <code>attr battStatus mapping %ROOM </code><br />
| ''Mapping %ROOM'' führt dazu, dass der Raumname als Zeilentitel angezeigt wird.<br />
|}<br />
<br />
=== Übersicht HomeMatic Geräte ===<br />
<br />
<nowiki>define HM_Components readingsGroup <Gerät>,<Name>,<Model>,<S/N> TYPE=CUL_HM:+NAME,?model,D-serialNr</nowiki><br />
<br />
=== Auswahl über Reading-Namen, Status als Symbol dargestellt ===<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen !! Aussehen <br />
|-<br />
| style="width:40%" |<code>define rg_battery readingsGroup .*:battery</code><br />
| Alle readings mit Namen '''battery''' von allen Devices. <br />
| rowspan=4 | [[Datei:rgBattery2.png|thumb]]<br />
|-<br />
| <code>attr rg_battery alias Batteriestatus </code><br />
| Der Alias wird als Überschrift verwendet<br />
|-<br />
| <code>attr rg_battery valueIcon {'battery.ok' => 'batterie', 'battery.low' => 'batterie@red'}</code><br />
| Statt der reading Werte "ok" und "low" soll ein Icon angezeigt werden.<br />
|-<br />
|<code>attr rg_battery commands { "battery.low" => "set %DEVICE replaceBatteryForSec 60" }</code><br />
| Für LaCrosse devices kann man beim Klick auf ein rotes "battery low icon" direkt replaceBatteryForSec setzen.<br />
|}<br />
<br />
=== Reading-Werte zuordnen (Icon / Text) ===<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen !! Aussehen <br />
|-<br />
| style="width:40%" |<code>define rg readingsGroup Contact.Dachboden_gross:sensed.*</code><br />
| Alle sensedreadings des Contact.Dachboden_gross device. <br />
| rowspan=4 | [[Datei:rgFenster.png|thumb]]<br />
|-<br />
| <code>attr rg mapping { 'sensed.A' => 'links', 'sensed.B' => 'rechts' }</code><br />
| Die Zuordnung rechts/links<br />
|-<br />
| <code>attr rg valueFormat {($VALUE eq '1')?"fts_window_roof":"fts_window_roof_open_2"}</code><br />
| Die Zuordnung von reading Wert zu Icon Namen.<br />
|-<br />
| <code>attr rg_battery valueIcon %VALUE </code><br />
| Statt des reading Werts soll ein Icon angezeigt werden.<br />
|}<br />
<br />
=== Formatvorgabe für Ausgabewerte ===<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen !! Aussehen <br />
|-<br />
| style="width:40%" |<code>define TempHygro readingsGroup TYPE=CUL_WS:temperature,humidity,dewpoint</code><br />
| Alle readings mit Namen '''temperature''', '''humidity''', '''dewpoint''' von allen Devices des Typs '''CUL_WS'''<br />
| rowspan=4 | [[Datei:rgTemperatur.png|thumb|[[S300TH]]-Werte in einer readingsGroup]]<br />
|-<br />
| <code>attr TempHygro alias Temperatur / rel. Feuchte / Taupunkt</code><br />
| Der Alias der readingsGroup wird als Überschrift verwendet<br />
|-<br />
| <code>attr TempHygro mapping %ALIAS</code><br />
| ''Mapping %ALIAS'' führt dazu, dass der Alias des Geräts als Zeilentitel angezeigt wird.<br />
|- <br />
| <code>attr TempHygro valueFormat { temperature => "%.1f&amp;deg;C", humidity => "%.1f %%", dewpoint => "%.1f&amp;deg;C"}</code><br />
| Formatierung der Ausgabewerte. '''Achtung:''' "%" die in der Ausgabe erscheinen sollen, müssen verdoppelt werden!<br />
|}<br />
<br />
=== Ausgabestil (hier rechtsbündig) ===<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen !! Aussehen <br />
|-<br />
| style="width:40%" |<code>define Wetter readingsGroup WetterXXX:<%temp_temperature>,<Temperatur>,temperature WetterXXX:<%weather_humidity>,<Luftfeuchte>,humidity WetterXXX:<%weather_barometric_pressure>,<Luftdruck>,pressure<br />
</code><br />
| Die readings mit Namen '''temperature''', '''humidity''' und '''pressure''' vom Device WetterXXX jeweils mit einem Icon und einem Label davor.<br />
| rowspan=3 | [[Datei:rgWetter.png|thumb]]<br />
|-<br />
| <code>attr Wetter valueFormat { temperature => '%1.f &amp;deg;C', humidity => '%1.f %%', pressure => '%i mbar' }</code><br />
| Die Formatierung der Readingswerte<br />
|-<br />
| <code>attr Wetter valueStyle style="text-align:right"</code><br />
| Die Readings sollen rechtsbündig dargestellt werden.<br />
|}<br />
<br />
=== Internal Value ausgeben ===<br />
Diese Beispiel könnte entfallen (nächstes Beispiel ist sehr ähnlich; es wird lediglich ein weiterer Wert ausgegeben).<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen !! Aussehen <br />
|-<br />
| style="width:40%" |<code>define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI</code><br />
| Den RSSI Wert aller Devices (am IODev ''cul'') die einen solchen haben anzeigen.<br> '''Achtung''': "internal values" werden nicht per longpoll aktualisiert, sondern nur beim Seitenaufbau.<br />
| rowspan=1 | [[Datei:rgculRSSI.png|thumb]]<br />
|}<br />
<br />
=== Internal Values ausgeben ===<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen !! Aussehen <br />
|-<br />
| style="width:40%" |<code>define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI,+cul_TIME</code><br />
| Den RSSI Wert mit der zugehörigen Zeit aller Devices (am IODev ''cul'') die einen solchen haben anzeigen.<br> '''Achtung''': "internal values" werden nicht per longpoll aktualisiert, sondern nur beim Seitenaufbau.<br>"Internal Values" werden durch das vorangestellte '''+''' (Pluszeichen) identifiziert.<br />
| rowspan=2 | [[Datei:rgculRSSI2.png|thumb]]<br />
|-<br />
|attr culRSSI valueStyle {return undef if($READING =~ m/TIME/); ($VALUE <= -85)?'style="color:red"':($VALUE <= -80)?'style="color:yellow"':undef}<br />
|Schlechte RSSI Werte sollen abhängig von zwei Schwellwerten gelb oder rot eingefärbt werden (auf dem Screenshot nicht zu sehen).<br />
|}<br />
<br />
=== Alle Readings eines Gerätes, mit Ausnahme von... ===<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen !! Aussehen <br />
|-<br />
| style="width:40%" |<code>define Systemstatus readingsGroup sysstat</code><br />
| Alle readings des sysstat Device<br />
| rowspan=4 | [[Datei:rgSysstat.png|thumb]]<br />
|-<br />
| <code>attr Systemstatus nostate 1</code><br />
| Ohne state<br />
|-<br />
| <code>attr Systemstatus notime 1</code><br />
| Ohne readings timestamp<br />
|-<br />
| <code>attr Systemstatus mapping {'load' => 'Systemauslastung', 'temperature' => 'Systemtemperatur in &amp;deg;C'}</code><br />
| Die Zuordnung der reading Namen zu den Zeilentiteln<br />
|}<br />
<br />
=== Anzeige auf einem Floorplan ===<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen !! Aussehen <br />
|-<br />
| style="width:40%" |<code>define Heizung readingsGroup t(1|2|3):temperature</code><br />
| Die Temperatur readings der Devices t1, t2 und t3<br />
| rowspan=6 | [[Datei:rgHeizung.png|thumb|220px]]<br />
|-<br />
| <code>attr Heizung mapping {'t1.temperature' => 'Vorlauf', 't2.temperature' => 'R&amp;&uuml;cklauf', 't3.temperature' => 'Zirkulation'}</code><br />
| Die Zuordnung der reading Namen zu den Zeilentiteln<br />
|-<br />
| <code>attr Heizung nameStyle style="text-align:left"</code><br />
| Zeilentitel linksbündig wegen floorplan<br />
|-<br />
| <code>attr Heizung style style="font-size:20px;color:lightgray"</code><br />
| Großer Font und Farbe passend für den floorplan<br />
|-<br />
| <code>attr Heizung notime 1</code><br />
| Ohne readings timestamp<br />
|-<br />
| <code>attr Heizung valueFormat : %.1f &amp;deg;C</code><br />
| Doppelpunkt zwischen Zeilentitel und Wert, eine Nachkommastelle plus Einheit<br />
|}<br />
<br />
<br />
=== LightScene DropDown-Menü für smallscreen Styles oder Floorplan ===<br />
<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen !! Aussehen <br />
|-<br />
| style="width:40%" |<code>define lcDropDown readingsGroup meineLightScene:!state</code><br />
| Für die LightScene ''meineLightScene'' soll ein DropDown-Menü zur Auswahl der Szene erstellt werden.<br />
| rowspan=6 |<br />
|-<br />
| <code>attr lcDropDown commands { state => 'scene:' }</code><br />
| Die Anzeige des state Readings wird auf das DropDown-Menü für das scene Kommando gemapped.<br />
|-<br />
| <code>attr lcDropDown nonames 1</code><br />
| Keine Readingnamen<br />
|-<br />
| <code>attr lcDropDown notime 1</code><br />
| Kein Timestamp<br />
|}<br />
<br />
=== Schriftgrößen, Farben, Icons ===<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen <br />
|-<br />
| colspan=2 | [[Datei:rgVerbrauchPCA301.png|links|mini|400px|Schriftgröße, Farbe, Icons...]]<br />
|-<br />
| style="width:40%" |<code>define Verbrauch readingsGroup TYPE=PCA301:state,power,consumption</code><br />
| Die readings state, power und consumption aller [[PCA301 Funkschaltsteckdose mit Energieverbrauchsmessung|PCA301]] Devices mit einer Zeile pro Device. <br />
|-<br />
| <code>attr Verbrauch mapping %ROOM %ALIAS</code><br />
| Der Raumname und der Alias werden als Zeilentitel verwendet<br />
|-<br />
| <code>attr Verbrauch nameStyle style="font-weight:bold"</code><br />
| Der Zeilentitel soll fett sein<br />
|-<br />
| <code>attr Verbrauch style style="font-size:20px"</code><br />
| Alles in einem größeren Font<br />
|-<br />
| <code>attr Verbrauch valueFormat {power => "%.1f W", consumption => "%.2f kWh"}</code><br />
| Die Formatierung für die power und consumption readings: eine Nachkommastelle plus Einheit.<br />
|-<br />
|<code>attr Verbrauch valueIcon { state => '%devStateIcon' }</code><br />
| Für die Dosen, die schaltbar sind, soll das anklickbare device icon gezeigt werden.<br />
|-<br />
|<code>attr Verbrauch valueStyle {($READING eq "power" && $VALUE > 40)?'style="color:red"':'style="color:green"'}</code><br />
|Wenn das power reading >40 ist, soll es in rot angezeigt werden, alle anderen Werte und readings in grün<br />
|}<br />
<br />
=== Wertabhängige Farbgebung ===<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen <br />
|-<br />
| colspan=2 | [[Datei:TemperaturenRG.png|600px|mini|links|Wertabhängige Farben]]<br />
[[Datei:TemperaturenRG2.png|600px|mini|links|Andere Werte - andere Farben]]<br />
|-<br />
| style="width:40%" |<code>define wzTemperaturenRG readingsGroup Aussen:,<Temperatur>,temperature,<Luftfeuchte>,humidity Wohnzimmer:,<Temperatur>,temperature,<Luftfeuchte>,humidity Kasten_E_Geraete:,<Temperatur>,temperature,<Luftfeuchte>,humidity</code><br />
| Die readings temperatur und humidity der Devices Aussen, Wohnzimmer und Kasten_E_Geraete in einer Zeile pro Device. <br />
|-<br />
| <code>attr wzTemperaturenRG group 3. Temperaturen</code><br />
| Die readingsGroup kommt in eine Gruppe<br />
|-<br />
| <code>attr wzTemperaturenRG noheading 1</code><br />
| noheading<br />
|-<br />
| <code>attr wzTemperaturenRG nostate 1</code><br />
| nostate<br />
|-<br />
| <code>attr wzTemperaturenRG notime 1</code><br />
| notime<br />
|-<br />
| <code>attr wzTemperaturenRG valueFormat {temperature => "%.1f °C", humidity =>"%.1f %%" }</code><br />
| Die Formatierung für die temperatur und humidity readings: eine Nachkommastelle plus Einheit.<br />
|-<br />
|<code>attr wzTemperaturenRG valueStyle { if($DEVICE eq "Aussen" && $READING eq "temperature" && $VALUE > 30) { 'style="color:red"'}elsif($DEVICE eq "Aussen" && $READING eq "temperature" && $VALUE > 20) { 'style="color:orange"'}elsif($DEVICE eq "Aussen" && $READING eq "temperature" && $VALUE < 5) { 'style="color:blue"'}elsif($DEVICE eq "Wohnzimmer" && $READING eq "temperature" && $VALUE > 23) { 'style="color:red"'}elsif($DEVICE eq "Wohnzimmer" && $READING eq "temperature" && $VALUE > 21) { 'style="color:orange"'}elsif($DEVICE eq "Wohnzimmer" && $READING eq "temperature" && $VALUE < 20) { 'style="color:blue"'}elsif($DEVICE eq "Kasten_E_Geraete" && $READING eq "temperature" && $VALUE > 30) { 'style="color:red"'}elsif($DEVICE eq "Kasten_E_Geraete" && $READING eq "temperature" && $VALUE > 28) { 'style="color:orange"'}elsif($READING eq "humidity" && $VALUE > 65) { 'style="color:red"'}elsif($READING eq "humidity" && $VALUE > 60) { 'style="color:orange"'}else{'style="color:green"'} }</code><br />
| Diverse Farbkombinationen sind möglich<br />
|}<br />
<br />
=== Enigma Receiver ===<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen <br />
|-<br />
| colspan=2 | [[Datei:ReceiverRG.jpg|600px|mini|links|Wertabhängige Farben]]<br />
[[Datei:ReceiverRGmute.jpg|600px|mini|links|Wertabhängige Farben]]<br />
|-<br />
| style="width:40%" |<code>define wzReceiverRG readingsGroup wzReceiver:,<Aktuell>,eventtitle,<Rest>,eventremaining_hr,<Dauer>,eventduration_hr wzReceiver:<Beschreibung>,eventdescription wzReceiver:,<Nächste>,eventtitle_next,<Start>,eventstart_next_hr,<Dauer>,eventduration_next_hr wzReceiver:,<HDD Kapazität>,hdd1_capacity,<Frei>,wzReceiver:hdd1_free wzReceiver:,<Lautstärke>,volume,<HDD>,hdd1_capacity,<Frei>,hdd1_free</code><br />
| Mehrere readings des Device wzReceiver in mehreren Zeilen. Wenn der Receiver auf mute ist, wird anstatt der Lautstärke, mute angezeigt. Farbige Anzeige des freien Speicherplatzes<br />
'''Benötigt:''' ENIGMA2 Receiver, 70_ENIGMA2.pm - Siehe: [[Enigma2 Receiver (Dreambox, VUplus etc.) steuern]]<br />
|-<br />
| <code>attr wzReceiverRG group Fernseher Receiver</code><br />
| Die readingsGroup kommt in eine Gruppe<br />
|-<br />
| <code>attr wzReceiverRG mapping &amp;nbsp;</code><br />
| mapping wird auf &amp;nbsp; (Leerzeichen) gesetzt, damit der Device Name nicht angezeigt wird<br />
|-<br />
| <code>attr wzReceiverRG noheading 1</code><br />
| noheading<br />
|-<br />
| <code>attr wzReceiverRG nostate 1</code><br />
| nostate<br />
|-<br />
| <code>attr wzReceiverRG notime 1</code><br />
| notime<br />
|-<br />
|-<br />
| <code>attr wzReceiverRG valueColumns { eventdescription => 'colspan="4"' }</code><br />
| Die Beschreibung soll über 4 Spalten gehen<br />
|-<br />
| <code>attr wzReceiverRG valueFormat { wzReceiverRGvalueFormat($DEVICE,$READING,$VALUE);; }</code><br />
| Die Formatierung wird in die 99_myUtils.pm ausgelagert. Siehe: [[99 myUtils anlegen]]<br />
|-<br />
|<code>attr wzReceiverRG valueStyle { if($READING eq "hdd1_free" && $VALUE < 200){ 'style="color:red"' }elsif( $READING eq "hdd1_free" && $VALUE < 500 ){ 'style="color:orange"' }elsif( $READING eq "volume" && ReadingsVal($DEVICE, "mute", "") eq "on" ){ 'style="color:red"' }else{ 'style="color:green"' } }</code><br />
| Diverse Farbkombinationen sind möglich. Wenn der Receiver auf mute ist, wird anstatt der Lautstärke <span style="color: red;">mute</span> angezeigt.<br />
|-<br />
|<source lang="perl"><br />
sub<br />
wzReceiverRGvalueFormat($$$)<br />
{<br />
my ($DEVICE,$READING,$VALUE) = @_;<br />
<br />
if($READING eq 'hdd1_capacity') { <br />
return "%.2f MB";<br />
} elsif( $READING eq 'hdd1_free') {<br />
return "%.2f MB";<br />
} elsif( $READING eq 'volume' ) {<br />
if( ReadingsVal($DEVICE, "mute", "") eq "on") {<br />
return "mute";<br />
} else {<br />
return "%i %%";<br />
}<br />
}<br />
}</source><br />
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]<br />
|}<br />
<br />
=== Heizungswerte inklusive Batterie- und Fensterstatus ===<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen <br />
|-<br />
| colspan=2 | [[Datei:rgHeizung3.png|thumb|links|500px|Heizungswerte inklusive Batterie- und Fensterstatus]]<br />
|-<br />
| style="width:40%" |<code>define Heizungswerte readingsGroup <%sani_heating>,< >,<Act>,<Soll>,<Ist> TYPE=FHT:actuator,desired-temp,measured-temp,<%18>,<%20>,<%22>,window,battery</code><br />
| Diverse readings aller Devices des Typs <b>FHT</b>. <br />
|-<br />
| <code>attr Heizungswerte commands { 'Heizungswerte.18' => 'set $DEVICE desired-temp 18', 'Heizungswerte.20' => 'set $DEVICE desired-temp 20', 'Heizungswerte.22' => 'set $DEVICE desired-temp 22' }</code><br />
| Die Links/Kommandos die hinter den 18, 20 und 22 liegen sollen.<br />
|-<br />
| <code>attr Heizungswerte nameStyle style="color:yellow;font-weight:bold"</code><br />
| Die Überschriften sollen gelb sein.<br />
|-<br />
| <code>attr Heizungswerte valueIcon {'battery.ok' => 'batterie@lightgreen', 'battery.low' => 'batterie@red', 'window.closed' => 'fts_window_1w@lightgreen', 'window.open' => 'fts_window_1w_open@red'}</code><br />
| Für den Batteriestand und den Zustand der Fenster sollen jeweils Icons angezeigt werden.<br />
|}<br />
<br />
=== Heizungswerte inklusive Ventilposition ===<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen <br />
|-<br />
| colspan=2 | [[Datei:Rg_Heizung_Valveposition.png|thumb|links|500px|Heizungswerte inklusive Statusinformationen (MAX!)]]<br />
|-<br />
| style="width:40%" |<code>define Heizungswerte readingsGroup <%sani_heating>,<Ventil>,<Soll>,<Ist>,<MaxV>,<GID>,<Mode>,<Batterie> TYPE=CUL_HM:ValvePosition,desired-temp,measured-temp,R-valveMaxPos,groupid,mode,battery</code><br />
| Diverse readings aller Devices des Typs <b>MAX</b>. <br />
|-<br />
| <code>attr Heizungswerte mapping %ROOM</code><br />
| Die Raumnamen werden angezeigt.<br />
|-<br />
| <code>attr Heizungswerte nameStyle style="color:yellow;font-weight:bold"</code><br />
| Die Überschriften sollen gelb (fett) sein.<br />
|-<br />
| <code>attr Heizungswerte room Heizung</code><br />
| Die "readingsgroup" wird dem Raum "Heizung" zugeordnet.<br />
|-<br />
| <code>attr Heizungswerte valueFormat {'temperature' => "%.0f °C", 'desiredTemperature' => "%.0f °C", 'valveposition' =>"%.0f %%", 'maxValveSetting' =>"%.0f %%" }</code><br />
| Es wird noch die Einheit °C hinter den Temperaturwerten angezeigt.<br />
|-<br />
| <code>attr Heizungswerte valueIcon {'battery.ok' => 'batterie@lightgreen', 'battery.low' => 'batterie@red'}</code><br />
| Für den Batteriezustand werden Icons anstatt Klartextwerte genommen!<br />
|-<br />
| <code>attr Heizungswerte valueStyle { if($READING eq "temperature" && $VALUE > 20){ 'style="color:green;;font-weight:bold"' }elsif( $READING eq "temperature" && $VALUE <= 20 ){ 'style="color:blue"' }elsif( $READING eq "temperature" && $VALUE > 23 ){ 'style="color:red"' }else{ 'style="color:gray"' } }</code><br />
| Die Temperaturwerte werden abhängig vom Wert farbig dargestellt.<br />
|-<br />
| <code>attr Heizungswerte valueIcon {'battery.ok' => 'batterie@lightgreen', 'battery.low' => 'batterie@red', 'window.closed' => 'fts_window_1w@lightgreen', 'window.open' => 'fts_window_1w_open@red'}</code><br />
| Für den Batteriestand und den Zustand der Fenster sollen jeweils Icons angezeigt werden.<br />
|}<br />
<br />
=== Heizungswerte, Status und Regelmöglichkeit ===<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen <br />
|-<br />
| colspan=2 | [[Datei:rgHeizung2.png|thumb|500px|links|Anzeige + Regelmöglichkeit]]<br />
|-<br />
| style="width:40%" |<code>define Heizungswerte2 readingsGroup <%sani_heating>,< >,<Act>,<Soll>,<Ist> TYPE=FHT:actuator,desired-temp,measured-temp,<{myUtils_HeizungUpDown($DEVICE,"up")}@desired-temp>,desired-new,<{myUtils_HeizungUpDown($DEVICE,"down")}@desired-temp>,window,battery</code><br />
| Diverse readings aller Devices des Typs <b>FHT</b>. <br />
|-<br />
| <code>attr Heizungswerte2 nameStyle style="color:yellow;font-weight:bold"</code><br />
| Die Überschriften sollen gelb sein.<br />
|-<br />
| <code>attr Heizungswerte2 valueIcon {'battery.ok' => 'batterie@lightgreen', 'battery.low' => 'batterie@red', 'window.closed' => 'fts_window_1w@lightgreen', 'window.open' => 'fts_window_1w_open@red'}</code><br />
| Für den Batteriestand und den Zustand der Fenster sollen jeweils Icons angezeigt werden.<br />
|-<br />
| <code>attr Heizungswerte2 valueStyle {($VALUE eq "00")?'style="visibility:hidden"':''}</code><br />
| Nach dem Einstellen den Wert wieder ausblenden. <br />
|-<br />
| <source lang="perl"><br />
#Heizung regeln in readingsGroup<br />
sub<br />
myUtils_HeizungUpDown($$)<br />
{<br />
my($DEVICE,$CMD) = @_;<br />
<br />
my $icon = $CMD;<br />
my $VALUE = ReadingsVal($DEVICE,"desired-new","20" );<br />
$VALUE = ReadingsVal($DEVICE,"desired-temp","20" )<br />
if( !$VALUE || $VALUE == 0 );<br />
my $link;<br />
<br />
if( $CMD eq "up" ) {<br />
$icon = "control_arrow_upward";<br />
$VALUE += 1;<br />
<br />
if( $VALUE <= 24 ) {<br />
$icon .= "\@red";<br />
$link = "setreading $DEVICE desired-new $VALUE";<br />
}<br />
} elsif( $CMD eq "down" ) {<br />
$icon = "control_arrow_downward";<br />
$VALUE -= 1;<br />
<br />
if( $VALUE >= 18 ) {<br />
$icon .= "\@blue";<br />
$link = "setreading $DEVICE desired-new $VALUE";<br />
}<br />
}<br />
<br />
my $notify = "notifyHeizungUpDown";<br />
if( !defined($defs{$notify}) ) {<br />
CommandDefine(undef,<br />
"$notify notify .*:desired-new.* "<br />
."{ myUtils_HeizungUpDownNotify(\$NAME,\$EVTPART1); }" );<br />
}<br />
<br />
my $ret = "%$icon";<br />
$ret .= "%$link" if( $link );<br />
<br />
return $ret;<br />
}<br />
<br />
sub<br />
myUtils_HeizungUpDownNotify($$)<br />
{<br />
my($DEVICE,$VALUE) = @_;<br />
<br />
return if( $VALUE == 0 );<br />
<br />
my $at = "triggerHeizungUpDown_$DEVICE";<br />
CommandDelete(undef, $at) if( defined($defs{$at}) );<br />
CommandDefine(undef,<br />
"$at at +00:00:03 "<br />
."{my \$v = ReadingsVal(\"$DEVICE\",\"desired-new\",undef);"<br />
."fhem(\"set $DEVICE desired-temp \$v\") if( \$v );"<br />
."fhem(\"setreading $DEVICE desired-new 00\");}" );<br />
<br />
return undef;<br />
}</source><br />
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit werden die Icons zum Ändern der gewünschten Temperatur dargestellt und im Bereich >=18 und <= 24 Grad anklickbar gemacht. Zwischen den Pfeilen wird der gerade eingestellte Wert angezeigt. Wenn dieser drei Sekunden nicht mehr geändert wurde wird die desired-temp auf diesen Wert gesetzt und die Anzeige zwischen den Pfeilen ausgeblendet.<br />
|}<br />
<br />
=== Heizungswerte, Status, Steuerung und Wochenprofil ===<br />
Dieses Beispiel funktioniert nur mit HomeMatic HM-CC-RT-DN, für andere Thermostate müssen an diversen Stellen Änderungen vorgenommen werden.<br />
{{Todo|Überarbeiten}}<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen <br />
|-<br />
| colspan=2 | [[Datei:RgThermostate.png|thumb|750px|links|Status, Steuerung und Wochenprofil]]<br />
|-<br />
| style="width:40%" |<pre>set d_label Heizung Heizung <br />
set d_label Temperatur Temperatur <br />
set d_label Status Status <br />
set d_label Wochenplan Wochenplan <br />
set d_label Werktag Werktag <br />
set d_label Samstag Samstag <br />
set d_label Sonntag Sonntag <br />
set d_label Zeitraum1 Zeitraum 1 <br />
set d_label Zeitraum2 Zeitraum 2 </pre><br />
|Erzeugen der Readings im Device [[dummy#d_label|d_label]].<br />
|-<br />
| <code> <br />
define rg_thermostate readingsGroup <>,Heizung@d_label,<|>,Temperatur@d_label,<|>,Status@d_label,<|>,Wochenplan@d_label,<|>,Werktag@d_label,<|>,Samstag@d_label,<|>,Sonntag@d_label,<|>,<> CUL_HM_HM_CC_RT_DN_......_Clima:<>,?alias,<|>,<Soll>,desired-temp,<Tag>,dayTemp@{rg($DEVICE."§clima")},impossible@{$DEVICE},<|>,controlMode,R-globalBtnLock@{rg($DEVICE."§device")},<|>,Zeitraum1@d_label,<|>,workday_period_1_start@{rg($DEVICE."§clima")},workday_period_1_stop@{rg($DEVICE."§clima")},<|>,saturday_period_1_start@{rg($DEVICE."§clima")},saturday_period_1_stop@{rg($DEVICE."§clima")},<|>,sunday_period_1_start@{rg($DEVICE."§clima")},sunday_period_1_stop@{rg($DEVICE."§clima")},<|>,impossible@{$DEVICE},<%system_fhem_update>,<nowiki><br></nowiki>,state@{rg($DEVICE."§device")},<%getConfig>,<|>,<Ist>,measured-temp,<Nacht>,nightTemp@{rg($DEVICE."§clima")},<|>,<Ventil>,ValvePosition,<|>,Zeitraum2@d_label,<|>,workday_period_2_start@{rg($DEVICE."§clima")},workday_period_2_stop@{rg($DEVICE."§clima")},<|>,saturday_period_2_start@{rg($DEVICE."§clima")},saturday_period_2_stop@{rg($DEVICE."§clima")},<|>,sunday_period_2_start@{rg($DEVICE."§clima")},sunday_period_2_stop@{rg($DEVICE."§clima")},<|>,impossible@{$DEVICE},impossible@{rg($DEVICE."§device")},<%burstXmit> </code><br />
| Diverse readings aller Devices <b>CUL_HM_HM_CC_RT_DN_......_Clima</b>, entsprechender [[Makefine#d_climaControl|d_climaControl]] (müssen vorher angelegt werden) und [[dummy#d_label|d_label]]. <br />
|-<br />
| <code>attr rg_thermostate commands { 'desired-temp' => 'desired-temp:', 'dayTemp' => 'dayTemp:', 'controlMode' => 'trigger ntfy_rg $DEVICE controlMode', 'R-globalBtnLock' => 'trigger ntfy_rg $DEVICE globalBtnLock', 'workday_period_1_start' => 'workday_period_1_start:', 'workday_period_1_stop' => 'workday_period_1_stop:', 'saturday_period_1_start' => 'saturday_period_1_start:', 'saturday_period_1_stop' => 'saturday_period_1_stop:', 'sunday_period_1_start' => 'sunday_period_1_start:', 'sunday_period_1_stop' => 'sunday_period_1_stop:', 'rg_thermostate.system_fhem_update' => 'trigger ntfy_rg $DEVICE setTimeTable', 'rg_thermostate.getConfig' => 'set $DEVICE getConfig', 'nightTemp' => 'nightTemp:', 'workday_period_2_start' => 'workday_period_2_start:', 'workday_period_2_stop' => 'workday_period_2_stop:', 'saturday_period_2_start' => 'saturday_period_2_start:', 'saturday_period_2_stop' => 'saturday_period_2_stop:', 'sunday_period_2_start' => 'sunday_period_2_start:', 'sunday_period_2_stop' => 'sunday_period_2_stop:', 'rg_thermostate.burstXmit' => 'set $DEVICE burstXmit'}</code><br />
| Temperaturen werden als DropDown Auswahl dargestellt, Icons triggern [[readingsGroup#sub_rg|ntfy_rg]]<br />
|-<br />
| <code>attr rg_thermostate mapping { 'desired-temp' => '', 'dayTemp' => '', 'workday_period_1_start' => '', 'workday_period_1_stop' => '', 'saturday_period_1_start' => '', 'saturday_period_1_stop' => '', 'sunday_period_1_start' => '', 'sunday_period_1_stop' => '', 'nightTemp' => '', 'workday_period_2_start' => '', 'workday_period_2_stop' => '', 'saturday_period_2_start' => '', 'saturday_period_2_stop' => '', 'sunday_period_2_start' => '', 'sunday_period_2_stop' => ''}</code><br />
| Ausblenden der Texte vor den DropDowns.<br />
|-<br />
| <code> <br />
attr rg_thermostate nameStyle{($READING eq "Soll" ||$READING eq "Tag" ||$READING eq "%getConfig" ||$READING eq "Ist" ||$READING eq "Nacht" ||$READING eq "Ventil" )?'style="text-align:right"' :($READING eq "%burstXmit" )?'style="text-align:center"' :'style=""'}<br />
</code><br />
| Ausrichten der Überschriften die keine readings sind.<br />
|-<br />
| <code>attr rg_thermostate nonames 1</code><br />
| Ausblenden der Device Namen.<br />
|-<br />
| <code>attr rg_thermostate valueColumns { 'Heizung' => 'colspan="2"', 'Temperatur' => 'colspan="4"', 'Status' => 'colspan="2"', 'Werktag' => 'colspan="2"', 'Samstag' => 'colspan="2"', 'Sonntag' => 'colspan="2"', 'alias' => 'colspan="2"'}</code><br />
| Diverse Readings sollen über mehrere Spalten dargestellt werden.<br />
|-<br />
| <code>attr rg_thermostate valueFormat { 'measured-temp' => "%0.1f &deg;C", 'ValvePosition' => "%0.1f %%"}</code><br />
| Formatierung für measured-temp und ValvePosition.<br />
|-<br />
| <code>attr rg_thermostate valueIcon { 'controlMode.auto' => 'sani_heating_automatic@green', 'controlMode.set_auto' => 'sani_heating_automatic@orange', 'controlMode.manual' => 'sani_heating_manual@red', 'controlMode.set_manual' => 'sani_heating_manual@orange', 'R-globalBtnLock.on' => 'secur_locked@green', 'R-globalBtnLock.on ' => 'secur_locked@green', 'R-globalBtnLock.set_on ' => 'secur_locked@orange', 'R-globalBtnLock.off' => 'secur_open@red', 'R-globalBtnLock.off ' => 'secur_open@red', 'R-globalBtnLock.set_off ' => 'secur_open@orange'}</code><br />
| Zuweisung der Icons.<br />
|-<br />
| <code><br />
attr rg_thermostate valueStyle{($READING eq "Heizung" ||$READING eq "Temperatur" ||$READING eq "Status" ||$READING eq "Wochenplan" ||$READING eq "Werktag" ||$READING eq "Samstag" ||$READING eq "Sonntag" )?'style="font-size:20px;;color:RoyalBlue;;text-align:center"' :($READING eq "alias" )?'style="font-size:11px;;font-weight:bold;;text-align:left"' :($READING eq "ValvePosition" &&$VALUE > 40 )?'style="font-weight:bold;;color:Orange;;text-align:left"' :($READING eq "desired-temp" ||$READING eq "measured-temp" )?'style="text-align:center"' :($READING eq "state" ||$READING eq "ValvePosition" )?'style="text-align:left"' :'style="text-align:right"'}<br />
</code><br />
| Ausrichten und Einfärben der Readings.<br />
|}<br />
<br />
<br />
=== Heizungsteuerung für HM Wand- und Heizkörperthermostate ===<br />
<br />
Dieses Beispiel wurde für HM-TC-IT-WM-W-EU / HM-CC-RT-DN Geräte erstellt. Verwendung anderer Thermostate wird ggf. Anpassungen erforderlich machen. Die Geräte werden nicht automatisch ermittelt, sondern sind einzeln angegeben.<br />
Es werden Soll- und Ist-Temperaturen angezeigt, Luftfeuchte und Ventilpositionen, Modus, Batterie und Global-Tastenlock.<br />
Steuerungsmöglichkeiten: Solltemperatur, Modus (Manual/Automatik), (globale) Tastenlock.<br />
Die Abweichung der Isttemperatur, die Ventilpositionen, Batteriestand etc. werden farblich hervorgehoben. <br />
<br />
Die Gerätenamen (EG_WZ_WT01_Climate / EG_WZ_WT01, EG_WZ_TT01_Clima / EG_WZ_TT01 / EG_WZ_TT02, OG_BZ_WT01_Climate / OG_BZ_WT01, OG_BZ_TT01_Clima / OG_BZ_TT01, OG_SZ_WT01_Climate / OG_SZ_WT01, OG_SZ_TT01_Clima / OG_SZ_TT01, OG_DZ_WT01_Climate / OG_DZ_WT01, OG_DZ_TT01_Clima / OG_DZ_TT01) müssen natürlich entsprechend angepasst werden.<br />
<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen <br />
|-<br />
| colspan=2 | [[Datei:RgHMTh.jpg|thumb|500px|links|Status, Steuerung und Wochenprofil]]<br />
|-<br />
| <code>define heatingInfo readingsGroup <%sani_heating>,<Soll>,<Soll neu>,<Ist>,<Ventil / RH>,<Modus>,<Lock>,<Bat>\<br><br />
EG_WZ_WT01_Climate:desired-temp,<sollsetz>,measured-temp,humidity,controlMode,R-globalBtnLock@EG_WZ_WT01,batteryLevel@EG_WZ_WT01 \<br><br />
EG_WZ_TT01_Clima:desired-temp,<>,measured-temp,ValvePosition,controlMode,R-globalBtnLock@EG_WZ_TT01,batteryLevel@EG_WZ_TT01 \<br><br />
EG_WZ_TT02_Clima:desired-temp,<>,measured-temp,ValvePosition,controlMode,R-globalBtnLock@EG_WZ_TT02,batteryLevel@EG_WZ_TT02 \<br><br />
<>,<>,<>,<>,<>,<>,<>,<> \<br><br />
OG_BZ_WT01_Climate:desired-temp,<sollsetz>,measured-temp,humidity,controlMode,R-globalBtnLock@OG_BZ_WT01,batteryLevel@OG_BZ_WT01 \<br><br />
OG_BZ_TT01_Clima:desired-temp,<>,measured-temp,ValvePosition,controlMode,R-globalBtnLock@OG_BZ_TT01,batteryLevel@OG_BZ_TT01 \<br><br />
<>,<>,<>,<>,<>,<>,<>,<> \<br><br />
OG_SZ_WT01_Climate:desired-temp,<sollsetz>,measured-temp,humidity,controlMode,R-globalBtnLock@OG_SZ_WT01,batteryLevel@OG_SZ_WT01 \<br><br />
OG_SZ_TT01_Clima:desired-temp,<>,measured-temp,ValvePosition,controlMode,R-globalBtnLock@OG_SZ_TT01,batteryLevel@OG_SZ_TT01 \<br><br />
<>,<>,<>,<>,<>,<>,<>,<> \<br><br />
OG_DZ_WT01_Climate:desired-temp,<sollsetz>,measured-temp,humidity,controlMode,R-globalBtnLock@OG_DZ_WT01,batteryLevel@OG_DZ_WT01 \<br><br />
OG_DZ_TT01_Clima:desired-temp,<>,measured-temp,ValvePosition,controlMode,R-globalBtnLock@OG_DZ_TT01,batteryLevel@OG_DZ_TT01</code><br />
| ReadingsGoup anlegen. <br />
|-<br />
| <code>attr heatingInfo cellStyle { "r:1"=>'style="font-weight:bold;;font-size:16px"',<br><br />
"r:2,c:0"=>'style="font-weight:bold"',"r:6,c:0" =>'style="font-weight:bold"',<br><br />
"r:9,c:0"=>'style="font-weight:bold"',"r:12,c:0"=>'style="font-weight:bold"'}</code><br />
| Schrift fett setzen etc.<br />
|-<br />
| <code>attr heatingInfo commands {<br><br />
'heatingInfo.sollsetz'=>'desired-temp:5.0,12.0,18.0,19.0,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0',<br><br />
"controlMode.manual"=>"set %DEVICE controlMode auto","controlMode.auto"=>"set %DEVICE controlMode manual",<br><br />
"R-globalBtnLock.on"=>"set %DEVICE regSet globalBtnLock off",<br><br />
"R-globalBtnLock.off"=>"set %DEVICE regSet globalBtnLock on"}</code><br />
| Heizungssteuerung ermöglichen<br />
|-<br />
| <code><br />
attr heatingInfo mapping {OG_BZ_WT01_Climate=>"Bad",<br><br />
OG_BZ_TT01_Clima=>"&amp;nbsp;;&amp;nbsp;;&amp;nbsp;;Regler",OG_SZ_WT01_Climate=>"Schlafzimmer",<br><br />
OG_SZ_TT01_Clima=>"&amp;nbsp;;&amp;nbsp;;&amp;nbsp;;Regler",OG_DZ_WT01_Climate=>"Duschbad",<br><br />
OG_DZ_TT01_Clima=>"&amp;nbsp;;&amp;nbsp;;&amp;nbsp;;Regler",EG_WZ_WT01_Climate=>"Wohnzimmer",<br><br />
EG_WZ_TT01_Clima=>"&amp;nbsp;;&amp;nbsp;;&amp;nbsp;;Regler1",EG_WZ_TT02_Clima=>"&amp;nbsp;;&amp;nbsp;;&amp;nbsp;;Regler2",'desired-temp' => ''}<br><br />
</code><br />
| Gewünschte Namen definieren.<br />
|-<br />
| <code><br />
attr heatingInfo valueFormat {if($READING eq "ValvePosition" && $VALUE ne "0"){$VALUE = int($VALUE/10)*10}<br><br />
elsif($READING eq "batteryLevel"){if($VALUE>=3){$VALUE=100}<br><br />
elsif($VALUE>=2.7){$VALUE=75}elsif($VALUE>=2.5){$VALUE=50}elsif($VALUE>=2.2){$VALUE=25}<br><br />
else{$VALUE=0}}}<br />
</code><br />
| Werte vorformatieren (für die Icon-Zuordnung).<br />
|-<br />
| <code><br />
attr heatingInfo valueIcon {'controlMode.manual' => 'sani_heating_manual@795CFF',<br><br />
'controlMode.auto' => 'sani_heating_automatic@FFC13A', 'controlMode.boost' => 'sani_heating_boost@FB0C02',<br><br />
'humidity'=>'humidity@6FD9FB', 'R-globalBtnLock.on'=>'secur_locked@F7301D', <br><br />
'R-globalBtnLock.off'=>'secur_open@0CFB0C','ValvePosition.0' => 'sani_heating_level_0@002AE0',<br><br />
'ValvePosition.10' => 'sani_heating_level_10@F8D53D','ValvePosition.20' => 'sani_heating_level_20@FF9341',<br><br />
'ValvePosition.30' => 'sani_heating_level_30@F17F3F','ValvePosition.40' => 'sani_heating_level_40@E46C3C',<br><br />
'ValvePosition.50' => 'sani_heating_level_50@DE3B3A','ValvePosition.60' => 'sani_heating_level_60@A30D2D',<br><br />
'ValvePosition.70' => 'sani_heating_level_70@B40A23','ValvePosition.80' => 'sani_heating_level_80@C40619',<br><br />
'ValvePosition.90' => 'sani_heating_level_90@D4030F','ValvePosition.100' => 'sani_heating_level_100@E50005',<br><br />
'batteryLevel.100'=>'measure_battery_100@0CFB0C','batteryLevel.75'=>'measure_battery_75@42BC0A',<br><br />
'batteryLevel.50'=>'measure_battery_50@F5FF10','batteryLevel.25'=>'measure_battery_25@FB5909',<br><br />
'batteryLevel.0'=>'measure_battery_0@E50005','controlMode.set_boost' => 'hourglass',<br><br />
'controlMode.set_auto' => 'hourglass','controlMode.set_manual' => 'hourglass',<br><br />
'R-globalBtnLock.set_on' => 'hourglass','R-globalBtnLock.set_off' => 'hourglass'}<br />
</code><br />
| Icons zuordnen.<br />
|-<br />
| <code><br />
attr heatingInfo valueStyle {if($READING eq "measured-temp")<br><br />
{my $t=$VALUE;;my $d=ReadingsVal($DEVICE,'desired-temp',0);;<br><br />
if($t-$d>=1){'style="color:rgb(251,63,11);;"'}elsif($t-$d<=-1){'style="color:rgb(79,58,251);;"'}<br><br />
else{'style="color:rgb(12,251,12);;"'}}}<br />
</code><br />
| Farben (zu kalt: blau, zu warm: rot, ok: grün).<br />
|-<br />
| <code><br />
attr heatingInfo valueSuffix {"desired-temp"=>" °C", "measured-temp"=>" °C", <br><br />
"ValvePosition"=>" (".ReadingsVal($DEVICE,$READING,0)." %)", <br><br />
"humidity"=>" ".ReadingsVal($DEVICE,$READING,0)." % RH", <br><br />
"batteryLevel"=>" (".ReadingsVal($DEVICE,$READING,0)." V)"}<br />
</code><br />
| Messeinheiten und Zahlenwerte.<br />
|}<br />
<br />
=== Readings aus zusätzlichen Devices ===<br />
Im folgenden Beispiel wird gezeigt wie sich Readings zusätzlicher Devices zu einer Zeile mit mehreren Readings hinzufügen lassen. Diese zusätzlichen Devices können z.b. die unterschiedlichen Channel eines HomeMatic Gerätes sein. Im folgenden Beispiel wird der Name des zugehörigen Geräts dynamisch bestimmt.<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen <br />
|-<br />
| colspan=2 | [[Datei:rgHeizung4.png|thumb|750px|links|Anzeige + Regelmöglichkeit]]<br />
|-<br />
| style="width:40%" |<code>define myTemp readingsGroup <Raum>,<Tist>,<Tsoll>,<Mode>,<Tnight>,<Tday>,<Hum>,<BatTC>,<Vist>,<Vsoll>,<Verr>,<BatVD> Thermostat.(WZ|OZ|AZ|Bad|Kueche|SZ|GZ|Bad.OG):measured-temp,desired-temp,controlMode,night-temp,day-temp,humidity,battery,ValvePosition@{valveOfDevice($DEVICE)},ValveDesired@{valveOfDevice($DEVICE)},R-valveErrorPos@{valveOfDevice($DEVICE)},battery@{valveOfDevice($DEVICE)} Broetje:ToutIst </code><br />
| Diverse Readings aller Thermostat Devices und des jeweils zugehörigen Ventilantriebs. <br />
|-<br />
| <code>attr myTemp mapping { 'Broetje' => 'Garten','Thermostat.AZ' => 'EG Arbeitszimmer','Thermostat.SZ' => 'OG Schlafzimmer','Thermostat.WZ'=>'EG Wohnzimmer','Thermostat.Kueche' => 'EG Küche','Thermostat.GZ' => 'OG Gästezimmer','Thermostat.Bad' => 'EG Bad','Thermostat.Bad.OG' => 'OG Bad','Thermostat.OZ' => 'EG Kaminzimmer','desired-temp' => <nowiki>''</nowiki> }</code><br />
| Die Benennung der Zeilentitel (Das ist je nach Konfiguration auch über $ALIAS und/oder $ROOM lösbar).<br />
|-<br />
| <code>attr myTemp commands { 'desired-temp' => 'desired-temp:' }</code><br />
| desired-temp soll per dropDown einstellbar sein.<br />
|-<br />
| <code>attr myTemp nameStyle style="color:yellow"</code><br />
| Die Überschriften sollen gelb sein.<br />
|-<br />
| <code>attr myTemp valueIcon {'battery.ok' => 'batterie@lightgreen', 'battery.low' => 'batterie@red'}</code><br />
| Für den Batteriestand sollen jeweils Icons angezeigt werden.<br />
|-<br />
| <code>attr myTemp valueFormat { 'measured-temp' => "%0.1f &amp;deg;C",'ToutIst' => "%.1f &amp;deg;C",'night-temp' => "%.1f &amp;deg;C",'day-temp' => "%.1f &amp;deg;C",'humidity' => "%.0f <br />
%%",'ValvePosition' => "%.0f %%",'ValveDesired' => "%.0f %%",'R-valveErrorPos' => "%.0f %%" }</code><br />
| Die Formatierung der Werte. <br />
|-<br />
|<source lang="perl"><br />
#namen des ventil device aus thermostat device ableiten<br />
sub valveOfDevice ($) {<br />
my ($DEVICE) = @_;<br />
<br />
if ($DEVICE =~ m/AZ/) {<br />
return "Ventil.".substr($DEVICE,11).".Nord";<br />
} else {<br />
return "Ventil.".substr($DEVICE,11); <br />
}<br />
}</source><br />
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hier wird aus dem Namen des Thermostaten der Name des zugehörigen Ventilantriebs abgeleitet.<br />
|}<br />
Da im {...} Teil des <reading>@<device> Arguments keine Leerzeichen oder Kommas vorkommen dürfen ist er in der Regel das Einfachste die Funktionalität wie in diesem Beispiel in eine eigene Routine auszulagern. Mit ein paar 'Tricks' lässt es sich aber manchmal auch ohne Leerzeichen oder Kommas lösen und dann direkt in die Definition schreiben:<code>...,ValvePosition@{$DEVICE=~s/Thermostat/Ventil/;$DEVICE;},...</code><br />
<br />
=== Dynamische Inhalte ===<br />
[[Datei:rgDynamic-1.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 1]]<br />
[[Datei:rgDynamic-2.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 2]]<br />
Es ist möglich, den in einer readingsGroup dargestellten Inhalt dynamisch von zusätzlichen Bedingungen abhängig zu machen. Im folgenden Beispiel lässt sich<br />
einstellen, dass nur die Devices angezeigt werden, die einen bestimmten Zustand (hier: on/off, open/tilted/closed) haben. Hier wird zum Umschalten ein dummy, der direkt über der readingsGroup dargestellt wird, verwendet. Über das links und/oder commands lässt sich auch eine Darstellung erzeugen, bei der das Umschalten direkt innerhalb der readingsGroup möglich ist.<br />
<br />
<pre><br />
define LXrg dummy<br />
attr LXrg group -<br />
attr LXrg setList mode1:on,off mode2:open,closed,tilted<br />
attr LXrg stateFormat 1=mode1 2=mode2<br />
attr LXrg webCmd mode1:mode2<br />
<br />
define rg readingsGroup Window.*:state Light.*:state<br />
attr rg group -<br />
attr rg valueFormat { return $VALUE if ( $VALUE eq ReadingsVal("LXrg","mode1","") || $VALUE eq ReadingsVal("LXrg","mode2","") );; return undef;;}<br />
<br />
define Watch_LX notify LX.*:.* {my $value = ReadingsVal($NAME,'state','');;;;fhem("setreading $NAME $value")}<br />
</pre><br />
<br />
=== Enable/Disable Button am Beispiel eines WeekdayTimer ===<br />
Dieses Beispiel zeigt die Anwendung einer readingsGroup, um im Frontend einen Enable/Disable Button für ein Objekt darzustellen. Für den [[WeekdayTimer]] gibt es hier spezielle Erweiterungen (set Routinen, um das Attribut ''disable'' zu setzen). Es gibt aber auch eine allgemeinere Variante (siehe [http://forum.fhem.de/index.php/topic,23655.msg169141.html#msg169141 diesen Forumsbeitrag]) für alle Objekte, die das Fhem Attribut ''disable'' unterstützen.<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen <br />
|-<br />
| colspan=2 | [[Datei:rg_scheduling.png|thumb|500px|links|Enable/Disable Button]]<br />
|-<br />
| style="width:40%" |<code>define rg_Timer_Wasser readingsGroup timer_Wasser_..:disabled,+DEF,<{rg_timer_Wasser_show_conditional($DEVICE,"nextUpdate")}@disabled>,<{rg_timer_Wasser_show_conditional($DEVICE,"nextValue")}@disabled></code><br />
| Definition der angezeigten Readings. Das Attribut ''disabled'' wird mit weiteren Einstellungen (''commands'') zum Button, +DEF zeigt die Definition, d.h. die Schaltzeiten, des Timers an. Die Readings nextUpdate und nextValue sollen nur angezeigt werden, falls der Timer aktiv ist. Hierfür sorgt eine Routine <code>rg_timer_Wasser_show_conditional</code>, die in der 99_myUtils.pm definiert wird. Das abschließende @disabled sorgt dafür, dass der LongPoll Mechanismus die Anzeige sofort ändert, wenn der Button betätigt wird. <br />
|-<br />
| <code>attr rg_Timer_Wasser valueFormat { if ( $READING =~ m/.*DEF/ ) { my @text = split(" ", $VALUE); shift @text; return join(" ", @text) }}</code><br />
| Der Name des Timers wird aus dem Internal "+DEF" vorne abgeschnitten. Damit werden nur die definierten Schaltpunkte angezeigt. <br />
|-<br />
| <code>attr rg_Timer_Wasser valueIcon { 'disabled.0' => 'Restart', 'disabled.1' => 'Shutdown' }</code><br />
| Die beiden Zustände für den Button werden durch zwei Standard-Icons angezeigt.<br />
|-<br />
| <code>attr rg_Timer_Wasser commands { 'disabled.0' => 'set $DEVICE disable', 'disabled.1' => 'set $DEVICE enable' }</code><br />
| Toggle-Funktion für den Button. Wenn der Timer aktiv ("disabled.0") sorgt ein Klick auf den Button, dass der Timer deaktiviert wird ("set $DEVICE disable").<br />
|-<br />
|<source lang="perl"><br />
sub rg_timer_Wasser_show_conditional($$)<br />
{<br />
my ($DEVICE,$READING) = @_;<br />
return ( ReadingsVal($DEVICE, "disabled", "1") eq "0" )? <br />
ReadingsVal($DEVICE, $READING, "reading_undef") : "disabled";<br />
}</source><br />
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit wird das übergebene Reading des Timers nur angezeigt, wenn der Timer aktiv ist. Andernfalls wird der String "disabled" angezeigt.<br />
|}<br />
<br />
=== Ändern von Attributen: Noch ein WeekdayTimer Beispiel ===<br />
{{Randnotiz|RNTyp=y|RNText=Dieses Beispiel benutzt Funktionen, die erst ab [[version|Modulversion]] 8761/16.6.2015 verfügbar sind.}}<br />
Inzwischen ist es auch möglich das commands Mapping auf Attribute anzuwenden. Die Syntax ist die gleiche wie für die set Kommandos. Um das Beispiel übersichtlich zu halten werden hier die Werte und Icons auch für deaktiviert WeekdayTimer angezeigt. <br />
<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen <br />
|-<br />
| colspan=2 | [[Datei:rg_timer.png|thumb|500px|links|FhemWidget für das 'disable' Attribut]]<br />
|-<br />
| style="width:40%" |<code>define rgTimer readingsGroup <>,<Current>,<Update-Time>,<New>,<disable> TYPE=WeekdayTimer:state,nextUpdate,nextValue,?!disable</code><br />
| Definition der angezeigten Readings. Das Attribut ''disable'' wird mit weiteren Einstellungen (''commands'') zum Button. Durch das ! wird das Attribut auch dann angezeigt wenn es noch nicht gesetzt ist. <br />
|-<br />
| <code>attr rgTimer valueIcon { state => '%devStateIcon', nextValue => '{(split(":",Color::devStateIcon($DEVICE,"dimmer",undef,"nextValue")))[1]}' }</code><br />
| Für den aktuellen Zustand wird das devStateIcon angezeigt und für den nächsten Zustand das passende Lampen-Icon.<br />
|-<br />
| <code>attr rgTimer_Wasser valueFormat '{(split(" ", $VALUE))[1]}'</code><br />
| Vom nächsten Schaltpunkt wird nur die Zeit angezeigt. <br />
|-<br />
| <code>attr rgTimer commands { disable => 'disable:' }</code><br />
| Für das disable attribut wird das normale dropDown mit 0 und 1 angezeigt das auch in der Device Detail Ansicht verwendet wird.<br />
|}<br />
<br />
== Berechnungen ==<br />
{{Randnotiz|RNTyp=y|RNText=Dieses Beispiel benutzt Funktionen, die erst ab [[version|Modulversion]] 8761/16.6.2015 verfügbar sind.}}<br />
Das Rechnen funktioniert über das Flag "$", mit dem eine Funktion angegeben werden kann, die auf beliebige Kombinationen von Zeilen, Spalten und einzelnen Zellen angewendet wird. Ähnlich wie in einer Tabellenkalkulation.<br />
<br />
Ein Beispiel:<br />
:<code>define rg readingsGroup .*:temperature rg:$avg</code><br />
Damit wird eine readingsGroup über alle ''temperature'' Readings definiert. In einer zusätzlichen Zeile am Ende wird mit ''$avg'' der Durchschnittswert aller darüber liegenden Temperaturen angezeigt.<br />
<br />
Das genaue Format: <code>$<operator>[(<zellen>)]</code> mit<br />
*<code><operator></code>: sum, avg, min, max, scalar, count oder der Name einer beliebigen anderen Funktion, die ein Array mit allen Werten übergeben bekommt und ein Ergebnis zurückliefert.<br />
*<code><zellen></code> ist eine durch Semikolon getrennte Liste aus <code><zeilen>:<spalten></code> Paaren. <br />
*<code><zeilen></code> und <code><spalten></code> sind jeweils eine Perl Liste, d.h. hier können <br />
** einzelne Werte,<br />
** durch Komma getrennte Aufzählungen,<br />
** mit .. angegebene Wertebereiche<br />
** sowie <code>$ROW</code> und <code>$COLUMN</code> als Bezeichner für die aktuelle Zelle<br />
:verwendet werden.<br />
<br />
Alle Möglichkeiten sind kombinierbar. Die Zählung der Zeilen und Spalten beginnt bei 1. Eine nicht vorhandene Zeilenangabe wird durch den Bereich von Zeile 1 bis zur aktuellen Zeile ersetzt, eine nicht vorhandene Spalte durch die aktuelle Spalte.<br />
<br />
Es ergeben sich somit unter anderem folgende Möglichkeiten:<br />
*<code>$sum</code> equivalent zu <code>$sum(1..$ROW), $sum(:$COLUMN)</code> und <code>$sum(1..$ROW:$COLUMN)</code> die Summe der Werte in der Spalte über der aktuellen Zelle.<br />
*<code>$max($ROW:1..$COLUMN-1)</code> Maximum aller Werte links von der aktuellen Zelle (in der aktuellen Zeile)<br />
*<code>$avg(1..$ROW:1)</code> Durchschnitt aller Werte in Spalte 1 bis zur aktuellen Zeile<br />
*<code>$scalar(:1)</code> Anzahl der Werte in Spalte 1<br />
*<code>$min(1..5:1,2,4)</code> Minimum der Werte aus den Zeilen 1-5 in den Spalten 1, 2 und 4<br />
<br />
Eigene Funktionen lassen sich über 99_myUtils anlegen und z.B. verwenden um Häufigkeiten zu zählen oder mit nichtnumerischen Readings umzugehen.<br />
<br />
Die Ergebnisse werden im Weiteren wie normale Readings behandelt. Sie lassen sich von links oben nach rechts unten kaskadieren und lassen sich über valuePrefix, valueSuffix, valueFormat und valueStyle in der Darstellung beeinflussen. Also z.B. einfärben, als Balkendiagramm darstellen, ...<br />
<br />
Mit Hilfe der Funktionalität zum auf- und zu-klappen von Teilen einer readingsGroup lassen sich z.B. im zusammengeklappten Zustand Summen, Extremwerte oder andere Ausreißer anzeigen und die Details nur beim Aufklappen zeigen.<br />
<br />
Weitere Möglichkeiten:<br />
* Attribut <code>firstCalcRow</code>: Hiermit kann der Default für die Nummer der ersten Zeile vorgegeben werden (sofern im Ausdruck nichts genaueres angegeben ist). firstCalcRow sollte z.B. auf 2 gesetzt werden, wenn in der readingsGroup Spaltenüberschriften verwendet werden.<br />
* special <code><nowiki><hr></nowiki></code> um eine horizontale Linie über die volle Breite einzufügen<br />
* Über ein angehängtes <code>@<alias></code> kann einem Rechenergebniss ein Alias-Name gegeben werden. Über diesen kann der Wert dann zur Formatierung mit den value-Attributen angesprochen werden.<br />
* das <code>alwaysTrigger</code> Attribut kann jetzt auch den Wert 2 bekommen. Damit werden in der readingsGroup Readings für alle durch die Aggregation gebildeten Werte und entsprechende Events auch dann erzeugt wenn die readingsGroup nicht angezeigt wird. Wenn ein Alias-Name vergeben ist, wird dieser auch für den Reading-Namen verwendet.<br />
* Über den operator <code>$count(<wert>)(<zellen>)</code> um das Vorkommen von <code><wert></code> in den angegebenen Zellen zu zählen. <code><wert></code> kann enweder direkt der zu zählende Wert sein (ohne Anführungzeichen) oder eine in / eingeschlossene regex. Mit <code>!<wert></code> kann das Nicht-Vorkommen von <code><wert></code> gezählt werden.<br />
<br />
=== Ein interaktives Beispiel ===<br />
[[Datei:rgCalc.png|mini|right|400px|Beispiel-readingsGroup mit Berechnungen]]<br />
In drei [[dummy]] Objekten lässt sich jeweils ein Reading über einen Slider einstellen. In der darunter liegenden readingsGroup werden diese Readings und diverse daraus abgeleitete Werte dargestellt. Alle Readings und die daraus abgeleiteten Werte werden live per longpoll aktualisiert, wenn die slider bewegt werden.<br />
<br clear=all><br />
<pre><br />
define t1 dummy<br />
attr t1 room rg<br />
attr t1 setList state:slider,-10,1,30<br />
attr t1 webCmd state<br />
define t2 dummy<br />
attr t2 room rg<br />
attr t2 setList state:slider,-10,1,30<br />
attr t2 webCmd state<br />
define t3 dummy<br />
attr t3 room rg<br />
attr t3 setList state:slider,-10,1,30<br />
attr t3 webCmd state<br />
<br />
define rg readingsGroup <>,<value>,<sum>,<min>,<max>,<avg>\<br />
t\d:+NAME,state,$sum(1..$ROW:2),$min(1..$ROW:2),$max(1..$ROW:2),$avg(1..$ROW:2)\<br />
<hr>\<br />
rg:<>,$scalar,$sum(:2)@SUM,$min(:2)@MIN,$max(:2)@MAX,$avg(:2)@AVG\<br />
<hr>\<br />
t1:<t1,t2,t3>,state,state@t2,state@t3,$sum($ROW:2..4)@SUM,$count(/\d/)(2..$ROW-4:2)\<br />
<br />
attr rg nonames 1<br />
attr rg room rg<br />
attr rg style style='text-align:center'<br />
attr rg valueFormat { 'avg' => '%.2f', 'AVG' => '%.2f' }<br />
attr rg valuePrefix { 'rg.scalar' => '#', 'rg.SUM' =>'&Sigma;; ', 'rg.MIN' =>'Min: ', 'rg.MAX' =>'Max: ', 'rg.AVG' =>'&empty;; ', 'rg.count' => '#(X): ' }<br />
attr rg valueSuffix { state => '&deg;;C' }<br />
</pre><br />
<br />
== Links und Trigger ==<br />
=== readingsGroup mit Link ===<br />
[[Datei:rgPCA-detail.png|mini|400px|readingsGroup mit Link]]<br />
Das PCA301 Beispiel oben lässt sich mit einem ans Ende des define angehängten <br />
:<code><{appendTrigger($DEVICE,"clear","Alle löschen")}></code> <br />
und der folgenden appendTrigger Definition in 99_myUtils.pm um einen Link erweitern, der ein Event auslöst, an das z.B. ein notify gehängt werden kann, um die Verbrauchszähler der PCA301 Dosen zurückzusetzen. <br />
:<code>define clearVerbrauch notify Verbrauch:clear set TYPE=PCA301 clear</code><br />
<br />
<source lang="perl"><br />
use vars qw($FW_ME);<br />
use vars qw($FW_subdir);<br />
sub<br />
appendTrigger($$$)<br />
{<br />
my ($name,$trigger,$label) = @_; <br />
<br />
my $ret .= "</table></td></tr>";<br />
<br />
my $link = "cmd=trigger $name $trigger";<br />
my $txt = "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$link')\">$label</a>";<br />
$ret .= "<td colspan=\"99\"><div style=\"cursor:pointer;color:#888888;text-align:right\">$txt</div></td>";<br />
<br />
return ($ret,0);<br />
}</source><br />
<br />
wenn hierdurch Änderungen an einer readingsGroup erfolgen, die ein Neuladen der Seite erforderlich machen, kann dies so erfolgen:<br />
:<code>{myUtils_refresh("WEB")}</code><br />
mit folgendem code in 99_myUtils.pm:<br />
<source lang="perl"><br />
sub <br />
myUtils_refresh($) <br />
{ <br />
my ($name) = @_; <br />
<br />
FW_directNotify("#FHEMWEB:$name", "location.reload(true);","" );<br />
}</source><br />
<br />
<br />
Ein weiteres Beispiel für 'custom links und trigger' findet sich in {{Link2Forum|Topic=14425|Message=109383|LinkText=diesem Forenbeitrag}}: dort wird damit eine readingsGroup dynamisch umgeschaltet, um nur die eingeschalteten, nur die ausgeschalteten oder alle Lampen anzuzeigen.<br />
<br />
=== sub rg ===<br />
Damit beim klicken auf ein Icon oder einen Text in einer readingsGroup etwas passiert ist es möglich dies über das commands Attribut auf ein <code>'trigger ntfy_rg $DEVICE $READING'</code> oder Ähnliches zu mappen.<br />
Anlegen des ntfy_rg notify<br />
<pre><br />
define ntfy_rg notify ntfy_rg {rg($EVENT)}<br />
</pre><br />
Folgender Code muss noch in de [[99_myUtils_anlegen|99_myUtils.pm]]<br />
<source lang="perl"><br />
sub rg($){<br />
my @input = split(/[§\s]+/,shift);<br />
my $device = $input[0];<br />
my $function = $input[1];<br />
<br />
if($function eq "clima"){<br />
my $room = AttrVal($device, 'room', 'undef');<br />
$room =~ s/\D//g;<br />
<br />
return(("d_climaControl_".$room));<br />
}<br />
elsif($function eq "device"){<br />
return InternalVal($device,"device","device error");<br />
}<br />
elsif($function eq "controlMode"){<br />
my $controlMode = ReadingsVal($device,"controlMode","controlMode error");<br />
<br />
if($controlMode ~~ /manual/)<br />
{fhem("set $device controlMode auto")}<br />
elsif($controlMode ~~ /auto/)<br />
{fhem("set $device controlMode manual")};<br />
}<br />
elsif($function eq "globalBtnLock"){<br />
my $globalBtnLock = ReadingsVal($device,"R-globalBtnLock","globalBtnLock error");<br />
<br />
if($globalBtnLock ~~ /off/){<br />
{fhem("set $device regSet globalBtnLock on")}<br />
{fhem ("set $device getConfig")}<br />
}<br />
elsif($globalBtnLock ~~ /on/){<br />
{fhem("set $device regSet globalBtnLock off")}<br />
{fhem ("set $device getConfig")}<br />
};<br />
}<br />
elsif($function eq "state"){<br />
my $state = Value($device);<br />
<br />
if($state ~~ /off/){<br />
{fhem("set $device on")}<br />
}<br />
elsif($state ~~ /on/){<br />
{fhem("set $device off")}<br />
};<br />
}<br />
elsif($function eq "setTimeTable"){<br />
my $room = AttrVal($device, 'room', 'undef');<br />
$room =~ s/\D//g;<br />
my $climaControl = ("d_climaControl_".$room);<br />
my $dayTemp = ReadingsVal( $climaControl, "dayTemp" , 21.0 );<br />
my $nightTemp = ReadingsVal( $climaControl, "nightTemp" , 17.0 );<br />
my $workday_period_1_start = ReadingsVal( $climaControl, "workday_period_1_start" , "06:30" );<br />
my $workday_period_1_stop = ReadingsVal( $climaControl, "workday_period_1_stop" , "18:00" );<br />
my $workday_period_2_start = ReadingsVal( $climaControl, "workday_period_2_start" , "24:00" );<br />
my $workday_period_2_stop = ReadingsVal( $climaControl, "workday_period_2_stop" , "24:00" );<br />
my $saturday_period_1_start = ReadingsVal( $climaControl, "saturday_period_1_start" , "06:30" );<br />
my $saturday_period_1_stop = ReadingsVal( $climaControl, "saturday_period_1_stop" , "12:00" );<br />
my $saturday_period_2_start = ReadingsVal( $climaControl, "saturday_period_2_start" , "24:00" );<br />
my $saturday_period_2_stop = ReadingsVal( $climaControl, "saturday_period_2_stop" , "24:00" );<br />
my $sunday_period_1_start = ReadingsVal( $climaControl, "sunday_period_1_start" , "24:00" );<br />
my $sunday_period_1_stop = ReadingsVal( $climaControl, "sunday_period_1_stop" , "24:00" );<br />
my $sunday_period_2_start = ReadingsVal( $climaControl, "sunday_period_2_start" , "24:00" );<br />
my $sunday_period_2_stop = ReadingsVal( $climaControl, "sunday_period_2_stop" , "24:00" );<br />
<br />
{fhem("set $device tempListMon prep $workday_period_1_start $nightTemp $workday_period_1_stop $dayTemp $workday_period_2_start $nightTemp $workday_period_2_stop $dayTemp 24:00 $nightTemp")};<br />
{fhem("set $device tempListTue prep $workday_period_1_start $nightTemp $workday_period_1_stop $dayTemp $workday_period_2_start $nightTemp $workday_period_2_stop $dayTemp 24:00 $nightTemp")};<br />
{fhem("set $device tempListWed prep $workday_period_1_start $nightTemp $workday_period_1_stop $dayTemp $workday_period_2_start $nightTemp $workday_period_2_stop $dayTemp 24:00 $nightTemp")};<br />
{fhem("set $device tempListThu prep $workday_period_1_start $nightTemp $workday_period_1_stop $dayTemp $workday_period_2_start $nightTemp $workday_period_2_stop $dayTemp 24:00 $nightTemp")};<br />
{fhem("set $device tempListFri prep $workday_period_1_start $nightTemp $workday_period_1_stop $dayTemp $workday_period_2_start $nightTemp $workday_period_2_stop $dayTemp 24:00 $nightTemp")};<br />
{fhem("set $device tempListSat prep $saturday_period_1_start $nightTemp $saturday_period_1_stop $dayTemp $saturday_period_2_start $nightTemp $saturday_period_2_stop $dayTemp 24:00 $nightTemp")};<br />
{fhem("set $device tempListSun exec $sunday_period_1_start $nightTemp $sunday_period_1_stop $dayTemp $sunday_period_2_start $nightTemp $sunday_period_2_stop $dayTemp 24:00 $nightTemp")};<br />
}<br />
}<br />
</source><br />
Hier sind die benötigten CodeBlöcke für [[ReadingsGroup#Heizungswerte.2C_Status.2C_Steuerung_und_Wochenprofil|Heizungswerte, Status, Steuerung und Wochenprofil]] enthalten, aber auch um state zu triggern.<br />
<br />
== Sonstiges ==<br />
In der Regel werden die Parameter zu einem reading in den mappings unter <$DEVICE> und dann <$DEVICE>.<$READING> und dann unter <$READING>.<$VALUE> gesucht.<br />
<br />
=== Lesbar machen ===<br />
Für die meisten Attribute gilt:<br />
<br />
* Wenn es komplexer wird ist es einfacher, den Code in eine eigene Routine in (beispielsweise) [[99 myUtils anlegen|99_myUtils]] auszulagern und diese aufzurufen:<br />
:<code> attr <name> valueStyle {myValueToFormat($READING,$VALUE)}</code><br />
* code für unterschiedliche readings kann auch im mapping schon aufgeteilt werden:<br />
:<code>attr <name> valueStyle { SuperE5 => '{perl code}', Diesel => '{perl code}' }</code><br />
* Ifs lassen sich verschachteln und sortieren. So kann die Anzahl der Klammern und Else-Zweige reduziert werden:<br />
if( $READING eq ... ) {<br />
return xxx if( $VALUE < 1 );<br />
return yyy if( $VALUE < 1.5 );<br />
return zzz;<br />
} elsif( $READING eq ... ) {<br />
...<br />
}<br />
<br />
Da alles lässt sich natürlich auch kombinieren und so viel lesbarer machen als ein einziger langer Bandwurm.<br />
<br />
=== readingsGroup in einer Gruppe ===<br />
Wenn der doppelte Rahmen um eine readingsGroup bei Darstellung in einer Gruppe stört, lässt er sich mit dem passenden style entfernen: <br />
:<code>attr <rgName> style style="border:0px;background:none;box-shadow:none"</code> <br />
Für die readingsGroup ''rgName'' wird der Darstellungsstil verändert.<br />
<br />
=== Einfache Balkendiagramme ===<br />
[[Datei:rgBars.png|mini|400px|readingsGroup mit Balken]]<br />
Readings lassen sich mit einem valueStyle der folgenden Art mit einem "Füllstandsbalken" hinterlegen:<br />
:<code>attr <rgName> valueStyle style="width:200px; text-align:center; border: 1px solid #ccc; background:-webkit-linear-gradient(left, red $VALUE%, rgba(0,0,0,0) $VALUE%)"</code><br />
Hier ist die gewünschte Breite der Spalte und je nach Wertebereich der Readings auch die Umrechnung des jeweiligen Readingwertes in prozentuale Werte anzupassen.<br />
<br />
Die verwendeten Farben lassen sich natürlich auch anpassen, z.B. auch unter Verwendung der [[Color#Skalenfarbe_mit_Color::pahColor|Color::pahColor]] Routine.<br />
<br />
Die Balken werden bei Änderungen der Readings automatisch per longpoll aktualisiert.<br />
<br />
Je nach verwendetem Browser ist ''-webkit-linear-gradient'' durch ''-moz-linear-gradient'', ''-ms-linear-gradient'' oder ''linear-gradient'' zu ersetzen.<br />
<br />
Die obige valueStyle Definition ist nur beispielhaft zu sehen und sollte mit den [[ReadingsGroup#Lesbar_machen|hier beschriebenen Methoden]] lesbarer gemacht werden.<br />
<br />
Weitere Möglichkeiten zur Erzeugung von Balkendiagrammen sind in Forenbeiträgen {{Link2Forum|Topic=25313|LinkText=hier}} und {{Link2Forum|Topic=28318|LinkText=hier}} beschrieben.<br />
<br />
=== readingsGroup Styling mit CSS ===<br />
Jede readingsGroup lässt sich durch CSS individuell stylen. <br />
<br />
==== Allgemeines ====<br />
Damit der eigene CSS Code nach einem [[Update]] der FHEM-Style Dateien vorhanden bleibt, ist es notwenig eine eigene .css Datei (zB ios7ReadingsGroups.css) zu erstellen und ins Verzeichnis ''fhem/www/pgm2/'' zu kopieren. Anschließend muss in der [[FHEMWEB]] Instanz das Attribut ''CssFiles'' auf zB ''pgm2/ios7ReadingsGroups.css'' gesetzt werden.<br />
<br />
==== Erweiterte Device Übersicht ====<br />
Diese ReadingsGroup ist an der [[FHEMWEB]] Device-Übersicht angelehnt. Zusätzlich werden weitere Readings, hier Leistung, Betriebszeit Heute und Jahr, ein Link zu Detail-Seite der ReadingsGroup und Links zu den jeweiligen Device-Detail-Seite, dargestellt.<br />
<br />
{| class="wikitable"<br />
| [[Datei:RgStylingOhneCss.png|600px|mini|left|Device ReadingsGroup ohne CSS]] [[Datei:RgStylingMitCss.png|600px|mini|left|Device ReadingsGroup mit CSS]]<br />
|}<br />
<br />
===== Definition =====<br />
<pre><br />
define rg_devices readingsGroup <{rgLink($DEVICE,"konfigurieren","Details")}>,<Device>,<Status>,<Leistung>,<Heute>,<Jahr>\<br />
wzDeckenfluter:<%light_floor_lamp>,<{rgLink("wzDeckenfluter","detail","Deckenfluter")}>,state,<>,dauerHeute,dauerJahr\<br />
wzMacMini:<%it_nas>,<{rgLink("wzMacMini","detail","MacMini")}>,state,power,consumption,consumptionYear\<br />
attr rg_devices noheading 1<br />
attr rg_devices nonames 1<br />
attr rg_devices notime 1<br />
attr rg_devices room ReadingsGroup Styling<br />
attr rg_devices style class="block wide rgDevices"<br />
attr rg_devices valueFormat { 'power' => "%.1f W ", consumption => "%.2f kWh", 'consumptionYear' => "%.2f kWh" }<br />
attr rg_devices valueIcon { state => '%devStateIcon' }<br />
</pre><br />
<br />
Damit sich der CSS auf die richtige readingsGroup bezieht, ist es nötigt <br />
das Attribut ''style'' anzupassen.<br />
{| class="wikitable"<br />
! Definition !! Erläuterungen <br />
|-<br />
| style="width:40%" |<code>attr <rgName> style class="block wide rgDevices"</code><br />
| Die Klassen ''block'' und ''wide'' müssen eingetragen werden. Der Name der Nachfolgenden Klasse, hier ''rgDevices'', ist frei wählbar.<br />
|}<br />
===== Funktion rgLink() =====<br />
Die Funktion rgLink($name,$action,$label) liefert einen Link mit dem Namen $label zurück. Der Code gehört in die [[99 myUtils anlegen|99_myUtils.pm]].<br />
* $name - Name des Device das aufgerufen werden soll <br />
* $action - Aktion die Ausgeführt werden soll. <br />
**''konfigurieren'' erzeugt den kleinen ''Details'' Button links oben der einem zur Detail Seite der ReadingsGroup führt - nützlich wenn das ReadingsGroup-Attribut ''noheading'' gesetzt ist<br />
** ''detail'' erzeugt einen Link zu Device-Detail Seite<br />
* $label - Link-Name<br />
<source lang="perl"><br />
sub rgLink($$$){<br />
my ($name,$action,$label) = @_; <br />
my $link = "";<br />
my $fhemLink = "";<br />
my $txt = "";<br />
my $ret = "";<br />
my $divStyle = "";<br />
my $aStyle = "";<br />
<br />
# FHEM Variablen einbinden<br />
use vars qw($FW_ME);<br />
use vars qw($FW_subdir);<br />
use vars qw($FW_ss);<br />
use vars qw($FW_tp);<br />
<br />
if( $action eq "konfigurieren" ){<br />
$fhemLink = "detail=$name";<br />
$divStyle = "cursor:pointer;font-size:11px;padding-bottom:2px;padding-left:3px;";<br />
}<br />
elsif( $action eq "detail" ){<br />
$fhemLink = "detail=$name";<br />
$divStyle = "cursor:pointer;display:inline;";<br />
}<br />
<br />
$link = '<a onclick="location.href=\'' . $FW_ME . $FW_subdir . '?' . $fhemLink . '\'" style="' . $aStyle . '">' . $label . '</a>';<br />
$txt = '<div style="' . $divStyle . '">' . $link . '</div>';<br />
$ret = "$txt";<br />
<br />
return $ret;<br />
}<br />
</source><br />
<br />
{{Randnotiz|RNText=Tipp<br />
Verwende zum Bearbeiten der eigenen .css Dateien entweder den [[Konfiguration#Syntaxhervorhebung|Codemirror Editor]] oder einen eigenen Editor mit [http://de.wikipedia.org/wiki/Syntaxhervorhebung Syntax Highlighting] . Das hilft bei der Fehlersuche enorm. }}<br />
<br />
===== Styling =====<br />
Die eigene .css Datei erscheint in FHEM unter Edit-Files --> styles und kann direkt im FHEM-Editor oder mit eigenen Editor bearbeitet werden.<br />
<br />
ios7ReadingsGroups.css:<br />
<pre><br />
/* Readings Groups Devices */<br />
table.rgDevices tr td{ text-align: center; }<br />
table.rgDevices tr:first-child td:nth-child(2){ /* 1. Zeile 2. Spalte */ text-align: center; }<br />
table.rgDevices tr td:first-child{ /* 1. Spalte */ width: 45px; text-align: center; }<br />
table.rgDevices tr td:nth-child(2){ /* 2. Spalte */ width: 33%; text-align: left; }<br />
table.rgDevices tr td:nth-child(3){ /* 3. Spalte */ width: 15%; }<br />
table.rgDevices tr td:nth-child(4){ /* 4. Spalte */ width: 15%; }<br />
table.rgDevices tr td:nth-child(5){ /* 5. Spalte */ width: 15%; }<br />
</pre><br />
<br />
==== Auf Portrait / Landscape Modus des Smartphone unterscheiden ====<br />
Dieses Beispiel ist an das obige Beispiel [[#Erweiterte_Device_.C3.9Cbersicht|Erweiterte Device Übersicht]] angelehnt. <br />
<br />
{| class="wikitable"<br />
| style="width:40%" |[[Datei:RgStylingSmallscreenPortrait.png|300px|mini|center|Device ReadingsGroup im Portrait Modus]]<br />
|[[Datei:RgStylingSmallscreenLandscape.png|550px|mini|center|Device ReadingsGroup im Landscape Modus]]<br />
|}<br />
<br />
===== Allgemeines =====<br />
Mit CSS ist man in der Lage auf die aktuelle Bildschirmlage zu reagieren. Alle Anweisungen die in diesen beiden Funktionen zwischen den beiden { } stehen, werden je nach Bildschirmlage aufgerufen<br />
<pre><br />
/* Portrait Modus */<br />
@media all and (orientation:portrait) { }<br />
<br />
/* Landscape Modus */<br />
@media all and (orientation:landscape) { }<br />
</pre><br />
<br />
===== Styling =====<br />
{{Randnotiz|RNText=Info<br />
* ''width: xx%'' ändert die Breite der Spalte<br />
* ''display: none'' blendet die Spalte aus}}<br />
In der FHEMWEB_phone Instanz muss wie [[#Allgemeines|hier]] beschrieben eine neue eigene .css Datei eingetragen werden. In diesem Beispiel ios7smallscreenReadingsGroups.css<br />
<br />
ios7smallscreenReadingsGroups.css<br />
<pre><br />
/* landscape und portrait modus */<br />
table.rgDevices tr td { /* Zuerst alles centern */ text-align: center; }<br />
table.rgDevices tr:first-child td:nth-child(1){ /* 1. Zeile 1. Spalte */ text-align: center; }<br />
table.rgDevices tr td:first-child { /* 1. Spalte */ width: 5%; }<br />
table.rgDevices tr:first-child td:nth-child(2) { /* 1. Zeile 2. Spalte */ text-align: center; }<br />
table.block table tr td table.rgDevices tr td { border-bottom: 1px solid #cbcbcb; }<br />
<br />
/* Portrait Modus */<br />
@media all and (orientation:portrait) {<br />
table.rgDevices tr td:nth-child(2){ /* 2. Spalte */ width: 50%; text-align: left; }<br />
table.rgDevices tr td:nth-child(3){ /* 3. Spalte */ width: auto; text-align: right; display: table-cell; }<br />
table.rgDevices tr td:nth-child(4){ /* 4. Spalte */ width: 0; display: none; }<br />
table.rgDevices tr td:nth-child(5){ /* 5. Spalte */ width: 0; display: none; }<br />
table.rgDevices tr td:nth-child(6){ width: 0; display: none; } <br />
table.rgDevices tr td div a svg{ margin-left: 90px; }<br />
}<br />
<br />
/* Landscape Modus */<br />
@media all and (orientation:landscape) { <br />
table.rgDevices tr td:nth-child(2){ /* 2. Spalte */ width: 35%; text-align: left; }<br />
table.rgDevices tr td:nth-child(3){ /* 3. Spalte */ width: 15%; }<br />
table.rgDevices tr td:nth-child(4){ /* 4. Spalte */ width: 15%; }<br />
table.rgDevices tr td:nth-child(5){ /* 5. Spalte */ width: 15%; }<br />
table.rgDevices tr td:nth-child(5){ /* 5. Spalte */ width: 15%; } <br />
}<br />
</pre><br />
<br />
==== Plots im Portrait Modus des Smartphones ausblenden ====<br />
{| class="wikitable"<br />
| style="width:40%" |[[Datei:RgStylingSmallscreenPortraitPlot.png|350px|mini|center|Device ReadingsGroup im Portrait Modus]]<br />
|[[Datei:RgStylingSmallscreenLandscapePlot.PNG|550px|mini|center|Plot nur im Landscape]]<br />
|}<br />
<br />
Um die Plot und alle Steuerelemente im Portrait Modus auszublenden fügt man in seine eigene smallscreen.css wie [[#Allgemeines|hier beschrieben]] folgendes ein:<br />
<pre><br />
@media all and (orientation:portrait) {<br />
.SVGplot, .SVGlabel, .Zoom-in, .Zoom-out, .Prev { width: 0; display: none; }<br />
}<br />
</pre><br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Code Snippets]]</div>JoeAllhttp://wiki.fhem.de/w/index.php?title=Dewpoint&diff=13547Dewpoint2016-01-11T09:37:17Z<p>JoeAll: Code korrigiert</p>
<hr />
<div>{{SEITENTITEL:dewpoint}}<br />
{{Infobox Modul<br />
|ModPurpose=Berechnung des Taupunkts<br />
|ModType=h<br />
<!-- |ModCategory= (noch?) nicht verwendet --><br />
|ModCmdRef=dewpoint<br />
|ModTechName=98_dewpoint.pm<br />
|ModOwner=Willi Herzig}}<br />
<br />
Dewpoint oder Taupunkt<br />
<br />
Um den Taupunkt einfach berechnen zu können, kann neben dem Modul [[dewpoint]] auch folgendes userReading gesetzt werden. Der Code dazu wurde direkt aus dem Modul entnommen.<br />
<br />
Das Userreading hat den Vorteil, nicht mit anderen Modulen in Konflikt zu geraten.<br />
:<code>attr <Device> userReadings dew:temperature { my $dp;; my $temperature = ReadingsVal($name,"temperature",0);; my $humidity = ReadingsVal($name,"humidity",0);; my $A = 17.2694;; my $B = ($temperature > 0) ? 237.3 : 265.5;; my $es = 610.78 * exp( $A * $temperature / ($temperature + $B) );; my $e = $humidity/ 100 * $es;; if ($e == 0) { Log 1, "Error: dewpoint() e==0: temp=$temperature, hum=$humidity";; return 0;; } my $e1 = $e / 610.78;; my $f = log( $e1 ) / $A;; my $f1 = 1 - $f;; if ($f1 == 0) { Log 1, "Error: dewpoint() (1-f)==0: temp=$temperature, hum=$humidity";; return 0;; } $dp = $B * $f / $f1 ;; sprintf "%.2f", $dp;;}</code><br />
<br />
== Links ==<br />
* Forendiskussion um {{Link2Forum|Topic=8576|LinkText=Lüften oder nicht}}<br />
* Forendiskussion um {{Link2Forum|Topic=23080|LinkText=Temperaturdifferenz}}<br />
<br />
[[Kategorie:HOWTOS]]</div>JoeAllhttp://wiki.fhem.de/w/index.php?title=Dewpoint&diff=13542Dewpoint2016-01-11T09:13:05Z<p>JoeAll: Code aktualisiert; Vorgängercode funktionierte nicht mehr</p>
<hr />
<div>{{SEITENTITEL:dewpoint}}<br />
{{Infobox Modul<br />
|ModPurpose=Berechnung des Taupunkts<br />
|ModType=h<br />
<!-- |ModCategory= (noch?) nicht verwendet --><br />
|ModCmdRef=dewpoint<br />
|ModTechName=98_dewpoint.pm<br />
|ModOwner=Willi Herzig}}<br />
<br />
Dewpoint oder Taupunkt<br />
<br />
Um den Taupunkt einfach berechnen zu können, kann neben dem Modul [[dewpoint]] auch folgendes userReading gesetzt werden. Der Code dazu wurde direkt aus dem Modul entnommen.<br />
<br />
Das Userreading hat den Vorteil, nicht mit anderen Modulen in Konflikt zu geraten.<br />
:<code>attr <Device> userReadings dew:temperature { my $dp;; my $temperature = ReadingsVal("aussenThermometerHM","temperature",0);; my $humidity = ReadingsVal("aussenThermometerHM","humidity",0);; my $A = 17.2694;; my $B = ($temperature > 0) ? 237.3 : 265.5;; my $es = 610.78 * exp( $A * $temperature / ($temperature + $B) );; my $e = $humidity/ 100 * $es;; if ($e == 0) { Log 1, "Error: dewpoint() e==0: temp=$temperature, hum=$humidity";; return 0;; } my $e1 = $e / 610.78;; my $f = log( $e1 ) / $A;; my $f1 = 1 - $f;; if ($f1 == 0) { Log 1, "Error: dewpoint() (1-f)==0: temp=$temperature, hum=$humidity";; return 0;; } $dp = $B * $f / $f1 ;; sprintf "%.2f", $dp;;}</code><br />
<br />
== Links ==<br />
* Forendiskussion um {{Link2Forum|Topic=8576|LinkText=Lüften oder nicht}}<br />
* Forendiskussion um {{Link2Forum|Topic=23080|LinkText=Temperaturdifferenz}}<br />
<br />
[[Kategorie:HOWTOS]]</div>JoeAllhttp://wiki.fhem.de/w/index.php?title=TelegramBot&diff=13216TelegramBot2015-12-10T07:57:09Z<p>JoeAll: /* Hinweise zum Betrieb mit Fhem */</p>
<hr />
<div>{{Infobox Modul<br />
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram<br />
|ModType=d<br />
|ModForumArea=Unterstützende Dienste<br />
|ModFTopic=38328<br />
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]<br />
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}<br />
<br />
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). <br />
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.<br />
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.<br />
<br />
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem Fhem-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe.<br />
<br />
== Über Telegram Instant Messaging ==<br />
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. <br />
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und <br />
können auch aus dem WebBrowser verwendet werden. <br />
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. <br />
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.<br />
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.<br />
<br />
Für die Unterstützung von ''WhatsApp'' siehe Modul [[yowsup]].<br />
<br />
== Features ==<br />
Unterstützt werden:<br />
<br />
* Versand von Textnachrichten <br />
* Versand von Bildern <br />
* Empfang von Textnachrichten von beliebigen Kontakten<br />
* Kommandos in Fhem über telegram-Nachrichten von aussen auslösen<br />
<br />
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum und in der (englischen) Dokumentation zum Modul in der Commandref diesem {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über Fhem-Update verteilt.<br />
<br />
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.<br />
<br />
== Hinweise zum Betrieb mit Fhem ==<br />
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.<br />
}}<br />
<br />
Für die Anlage eines TelegramBot Devices in Fhem ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#botfather Botfather] erzeugt. Dort mit dem Telegram-Befehl <code>/newbot</code> einen neuen Bot anlegen und mit einem Namen versehen. Hinweis: Die Namen für Bots müssen auf "Bot" enden.<br />
<br />
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:<br />
<br />
<code>define &lt;name&gt; TelegramBot &lt;token&gt; </code><br />
<br />
Beispiel: <code>define teleBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw</code><br />
<br />
'''Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes''' <br />
<code>pollingTimeout</code> '''auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.''' <br />
<br />
'''Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.'''<br />
<br />
== Tipps ==<br />
<br />
=== Privacyeinstellungen ===<br />
<br />
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den botfather die prviacy-Einstellungen geändert werden.<br />
<br />
=== Kontakte ===<br />
<br />
Der Bot merkt sich die bereits bekannten Kontakte im Reading <code>Contacts</code>. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge bestehend aus userid, Vor- und Nachname des Benutzers (mit _ verbunden) und dem usernamen (mit vorangestelltem @). <br />
<br />
Beispiel: <code>123456:Ralf_Mustermann:@ralf</code><br />
<br />
Verschiedene Einträge werden durch Leerzeichen getrennt.<br />
<br />
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl <code>replaceContacts</code>. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.<br />
<br />
Die Kontaktliste wird ansonsten nur durch den Empfang von Nachrichten erweitert, da es im TelegramBot-API keine Möglichkeit gibt Kontaktdaten von telegram abzufragen (sieje auch pollingTimeout)<br />
<br />
=== Reset ===<br />
<br />
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl <code>reset</code>). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des devices zurückgesetzt. <br />
<br />
<br />
== Beispielszenarien ==<br />
<br />
=== Benachrichtigungen über Ereignisse ===<br />
<br />
Das einfachste Szenario für die Integration von Messaging-Diensten mit Fhem ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von Fhem zu informieren:<br />
<br />
<code>define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !</code><br />
<br />
In diesem Beispiel wird der Nachrichtentext "fhem newly started - just now !" an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald Fhem neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.<br />
<br />
=== Versand von Bildern ===<br />
<br />
Es ist auch möglich Bilder auf dem Fhem-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.<br />
<br />
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Erst mit der Version, die seit 22.10.2015 <br />
([r9576] HttpUtils.pm: Async write for POST Requests {{Link2Forum|Topic=41583|LinkText=Fhem-Forum}}) verteilt wird, erlaubt auch den Transfer grösserer Bilder. Die Grenze liegt ansonsten bei ca. 14kb auf Raspberries (Plattformspezifische Grenze).<br />
<br />
<br />
<code>define notify_fhem_reload notify wetter:report set telebotdevice sendPhoto /opt/fhem/wetter.jpg</code><br />
<br />
Bei Erreichen des entsprechenden Status am wetter-Modul wird ein Image über telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich. <br />
<br />
<br />
=== Kommandos auslösen ===<br />
<br />
Ein wichtiges Szenario ist die Möglichkeit Kommandos in Fhem ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: "cmdKeyword")erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.<br />
<br />
<code>attr telebotdevice cmdKeyword doit</code><br />
<br />
Somit kann man dann durch Nachrichten die mit "doit" beginnen Kommandos an Fhem senden, die ähnlich wie im Kommandoeingabefeld von Fhemweb dann von Fhem ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.<br />
<br />
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.<br />
<br />
Beispiele<br />
<br />
<code>dofhem set schalter on</code><br />
<br />
<code>dofhem list telegrambot</code><br />
<br />
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut "cmdRestrictedPeer" setzen, damit nicht jeder Kommandos auf dem Fhem-Server ausführen kann. Dazu sollten die Benutzerids der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR Benutzerids verwendet werden.<br />
}}<br />
<br />
=== Favoriten für Kommandos anlegen ===<br />
<br />
Grundidee bei den Favoriten ist, dass man lange Befehle, die man haeufig braucht auf "Kurzwahl" legt.<br />
<br />
Beispiel-Kommandos wie z.B. <code>set TYPE=ROLLADEN pos 100</code> und <code>set TYPE=ROLLADEN pos 0</code>, die man immer wieder braucht. Um nicht jedesmal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.<br />
<br />
Dazu gibt man erstmal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:<br />
<br />
<code>attr telegrambotdevice favorites set TYPE=ROLLADEN pos 100;set TYPE=ROLLADEN pos 0</code><br />
<br />
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.<br />
Nehmen wir mal an man möchte die Favoriten mit <code>/short</code> ausführen können. Dazu muss dann das Attribut "cmdFavorites" setzen<br />
<br />
<code>attr telegrambotdevice cmdFavorites /short</code><br />
<br />
Wenn man nun im Telegram Client <br />
<code>/short 1</code> an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.<br />
<br />
Ausserdem kann man im Telegram Client <br />
<code>/short</code> an den Bot schicken, dann antwortet der Bot mit<br />
<br />
<pre><br />
Favorites<br />
<br />
1<br />
set TYPE=ROLLADEN pos 100<br />
2<br />
set TYPE=ROLLADEN pos 0<br />
<br />
</pre><br />
<br />
<br />
== Links ==<br />
* Github Repository für die Telegram-Fhem Entwicklung: https://github.com/viegener/Telegram-fhem<br />
* Infos zum Telegram Botfather: https://core.telegram.org/bots#botfather<br />
<br />
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm<br />
* Source code für das modifizierte HTTPUtils-Modul zur Übertragung grosser Bilder: https://github.com/viegener/Telegram-fhem/blob/master/HttpUtils.pm<br />
<br />
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}<br />
* Telegram messaging system https://telegram.org/<br />
* TelegramBot API https://core.telegram.org/bots/api<br />
<br />
--[[Benutzer:Viegener|Viegener]] ([[Benutzer Diskussion:Viegener|Diskussion]]) 22:49, 11. Okt. 2015 (CEST)</div>JoeAllhttp://wiki.fhem.de/w/index.php?title=HM-CC-RT-DN_Funk-Heizk%C3%B6rperthermostat&diff=13214HM-CC-RT-DN Funk-Heizkörperthermostat2015-12-10T07:31:04Z<p>JoeAll: /* Links */</p>
<hr />
<div>Beim '''HM-CC-RT-DN''' handelt es sich um einen '''Funk-Heizkörperthermostaten mit integriertem Stellantrieb''', der als Nachfolger den [[HM-CC-VD]] ablöst und seit Mitte September 2013 verfügbar ist.<br />
<br />
== Vorbemerkungen ==<br />
<br />
'''Einstellungen und Informationen die alle HomeMatic Thermostat betreffen sind unter [[HomeMatic_Type_Thermostat#Temperaturlisten|HomeMatic Type Thermostat]] zu finden.'''<br />
<br />
Im Gegensatz zum Vorgänger misst der HM-CC-RT-DN selbst die Temperatur und verfügt über eine Boost-Funktion. Er braucht zur Steuerung kein separates Raumregelungsgerät mehr und hat eine eigene Fenster-Offen-Erkennung. Ein passender Wandthermostat ([[HM-TC-IT-WM-W-EU_Funk-Wandthermostat_AP|HM-TC-IT-WM-W-EU]]) ist seit Februar 2014 verfügbar.<br />
<br />
Das Gerät wird seit Anfang Oktober 2013 von Fhem unterstützt (siehe Diskussion im {{Link2Forum|Topic=14738|LinkText=Forum}}).<br />
<br />
Der '''HM-CC-RT-DN''' scheint das erste HomeMatic-Device zu sein, bei dem ein Update der Firmware auch vom Anwender durchgeführt werden kann. Ein Firmware-Update erfordert einen [[HM-CFG-USB_USB_Konfigurations-Adapter|USB Konfigurations-Adapter]] und eine auf der eQ-3 Webseite herunterladbare Firmware Update Software. Weitere Details sind unter [[HM-CC-RT-DN_Funk-Heizkörperthermostat#Firmware_Update|Firmware Update]] beschrieben.<br />
<br />
'''Achtung:''' Die Solltemperaturen eines HM-CC-RT-DN lassen sich <ins>nicht</ins> durch einen [[HM-CC-TC Funk-Wandthermostat|HM-CC-TC]] steuern. Dieser kann höchstens die Ist-Temperatur an den RT weiter geben, damit die Raumtemperatur nicht am RT selbst zur Ventilsteuerung genommen wird.<br />
<br />
Mit einem HM-CC-RT-DN können maximal (neben der Zentrale/Fhem):<br />
* 7 HomeMatic Heizkörperthermostate<br />
* 8 HomeMatic Tür-Fensterkontakte / Fenster-Drehgriffkontakte<br />
* 8 Tastenpaare von HomeMatic Fernbedienungen bzw. Display-Wandtaster<br />
* 1 HomeMatic Innen-Temperatur-Sensor<br />
gep'''ee'''rt werden.<br />
<br />
== Technische Daten ==<br />
* Betriebsspannung: 2 Stck. 1,5V LR6/Mignon/AA<br />
* Stromaufnahme: 180 mA max.<br />
* Abmessungen (B x H x T): 54 x 65 x 93 mm<br />
* Gewicht: 180 g (ohne Batterien)<br />
* Ventilanschluss: M30 x 1,5 mm<br />
<br />
Aktuelle Firmware: 1.4<br />
<br />
== Betrieb mit FHEM ==<br />
Der Funk-Heizkörperthermostat muss zuerst mit Fhem [[HomeMatic_Devices_pairen|gepairt]] werden. Stellen Sie sicher, dass Fhem aktuell ist (update durchführen).<br />
<br />
=== Channels (Kanäle) ===<br />
==== Channel (Kanal) 01 _Weather ====<br />
Dieser Kanal dient zur Einspeisung der gemessenen ("Ist"-) Temperatur, als Sensor kann z.B. ein HomeMatic HM-WDS10-TH-O Funk-Temperatur-/Luftfeuchtesensor OTH dienen.<br />
<br />
Der Befehl zum peeren lautet, wobei <tempSensor> die Fhem-Kanalbezeichnung für den Sensor ist und <rt_Weather> die Kanalbezeichnung für den entsprechenden Kanal des Heizkörperthermostates:<br />
set <tempSensor> peerChan 0 <rt_Weather> single<br />
<br />
==== Channel (Kanal) 02 _Climate ====<br />
Der Climate-channel dient der Kommunikation mit einem Temperatur-Kontroller (aktuell nur [[HM-TC-IT-WM-W-EU_Funk-Wandthermostat_AP|HM-TC-IT-WM-W-EU]]).<br />
Zum peeren von TC und RT siehe [[HM-TC-IT-WM-W-EU_Funk-Wandthermostat_AP#Hinweise zur Inbetriebnahme und Installation|HM-TC-IT-WM-W-EU]].<br />
<br />
==== Channel (Kanal) 03 _WindowRec ====<br />
Mit diesem Kanal lassen sich Fensterkontakte (HM-SEC-SC oder HM-SEC-RHS) peeren, die ihren Fensterstatus (geöffnet/gekippt) an ein oder mehrere Thermostate senden. Die Thermostate stellen anschließend die entsprechende (konfigurierbare) Temperatur ein. Der Temperaturwert kann je Fenster-Sensor unterschiedlich definiert werden. Sind mehrere Fenster gleichzeitig geöffnet, so wird der Thermostat auf die Temperatur des Sensors mit dem geringsten Temperaturwert eingestellt. <br />
Ferner wird empfohlen, bei Einsatz von externen Sensoren, die interne „Fenster auf Erkennung“ zu deaktivieren (Weitere Details sind im [[HM-CC-RT-DN_Funk-Heizkörperthermostat#Channel_.28Kanal.29_04_Clima|Channel (Kanal) 04 _Clima]] näher beschrieben).<br />
<br />
Der Befehl zum peeren lautet, wobei <fensterSensor> die Fhem-Kanalbezeichnung für den Fensterkontakt ist und <rt_WindowRec> die Kanalbezeichnung für den entsprechenden Kanal des Heizkörperthermostates:<br />
set <fensterSensor> peerChan 0 <rt_WindowRec> single<br />
<br />
Zum Löschen (=unpeeren) dieser Kopplung:<br />
set <fensterSensor> peerChan 0 <rt_WindowRec> single unset<br />
<br />
'''Achtung''': Der Peer-(Lösch)Vorgang muss am Fensterkontakt durch Drücken der Anlerntaste bestätigt werden, und zwar auch dann, wenn der Fensterkontakt schon vorher mit Fhem gepairt wurde. Wichtig scheint auch dass der Fensterkontakt geschlossen ist wenn man die Anlerntaste drückt.<br />
<br />
Der Befehl zur Temperatureinstellung des Heizkörperthermostaten für den Zustand "Fenster offen" lautet, wobei <fensterSensor> die Fhem-Kanalbezeichnung für den Fensterkontakt ist und <rt_WindowRec> die Kanalbezeichnung für den entsprechenden Kanal des Heizkörperthermostates, sowie <Temp> die einzustellende Temperatur (ganzzahliger Wert):<br />
set <rt_WindowRec> regSet winOpnTemp <Temp> <fensterSensor><br />
<br />
==== Channel (Kanal) 04 _Clima ====<br />
Dieser Kanal dient zum Einstellen der Betriebsparameter, auch [[#Temperaturlisten]] sind hierauf zu übrtragen.<br />
<br />
'''Achtung:''' In älteren Versionen von Fhem wurde dieser Kanal durch autocreate als "_ClimRT_tr" angelegt. Der Hersteller hat hier offenbar die internen Bezeichnunen geändert, denn beim Vorläufernmodell HM-CC-TC mussten Temperaturlisten auf den Kanal ''Climate'' übertragen werden.<br />
<br />
Die maximale Öffnung des Ventils kann mittels folgendem Befehl eingestellt werden (hier auf 80 %):<br />
set <rt_Clima> regSet valveMaxPos 80<br />
<br />
Die interne "Fenster-auf" Erkennung kann man wie folgt abschalten:<br />
set <rt_Clima> regSet winOpnMode off<br />
<br />
==== Channel (Kanal) 05 _ClimaTeam ====<br />
Dieser Kanal dient zum peeren von mehreren Heizkörperthermostaten untereinander. Ein Mitglied des "Teams" meldet<br />
* Änderungen der Temperatur am Handrad<br />
* Einschalten des Boost-Modus am Taster<br />
an seine "Teamkollegen" weiter. Folgende Änderungen werden '''nicht''' weitergegeben:<br />
* Status der Fensterkontakte<br />
* Temperaturlisten/Wochenplan und daraus folgende Änderungen<br />
* Änderungen durch Fernbedienungen<br />
* Änderungen durch eine HomeMatic-Zentrale<br />
<br />
Befehl zum peeren, wobei <rt1-ClimaTeam> und <rt2-ClimaTeam> die Kanalbezeichnungen der beiden ClimaTeam-Kanäle sind:<br />
set <rt1-ClimaTeam> peerChan 0 <rt2-ClimaTeam> single<br />
<br />
==== Channel (Kanal) 06 _remote ====<br />
Dieser Kanal ann an eine Fernbedienung gekoppelt werden. Per Tastendruck kann man einen bestimmten Mode und/oder eine bestimmte Temperatur wählen. Dabei kann die Reaktion auf einen langen oder kurzen Tastendruck gesondert eingestellt werden.<br />
<br />
Der Befehl zum peeren lautet, wobei <button> die Kanalbezeichnung der Fernbedienung und <rt-remote> die Kanalbezeichnung des Heizkörperthermostates ist:<br />
<pre>set <button> peerChan 0 <rt-remote> single</pre><br />
<br />
=== Betriebsmodus Auto, Manu, Party (Urlaub) ===<br />
Im Automode kann man die Temperatur am Einstellrad des RT ändern. Zum nächsten Schaltpunkt wird dies dann überschrieben. Will man dies nicht (z.B. lange Party, ...), kann man auf manuell schalten. Dann bleibt die mit dem Drehregler (oder der Zentrale) eingestellte Temperatur stehen bis ''ultimo''. Es gibt dann noch den Party- oder Urlaubsmodus. In diesen kann man den Automodus für eine gegebene Zeit überschreiben.<br />
<br />
==== Tastensperre ====<br />
Um zu verhindern, dass der Modus oder die Temperatur per Tasten bzw. Drehrad am HM-CC-RT-DN verändert wird, kann eine Tastensperre gesetzt werden. Dies erfolgt mittels des Befehls:<br />
<br />
set <HM-CC-RT-DN> regSet btnLock on<br />
<br />
Rückgängig machen geht per:<br />
<br />
set <HM-CC-RT-DN> regSet btnLock off<br />
<br />
Diese Tastensperre kann man aber am RT durch eine Tastenkombination wieder zurücksetzen. Um sie nur per Fhem rücksetzen zu können, muss<br />
<br />
set <HM-CC-RT-DN> regSet globalBtnLock on<br />
<br />
eingegeben werden. Rückgängig geht wieder per:<br />
<br />
set <HM-CC-RT-DN> regSet globalBtnLock off<br />
<br />
==== Modus Auto ====<br />
Das Device arbeitet gemäß des gespeicherten Wochenprogramms. Manuelle Änderungen sind möglich, werden beim nächsten Schaltpunkt überschrieben.<br />
<br />
==== Modus Manu ====<br />
Das Wochenprogramm wird nicht abgearbeitet, die Temperatur wird manuell eingestellt.<br />
<br />
==== Modus Party (Urlaub) ====<br />
Will man für eine festgesetzte Zeit (Stunden oder Tage) die Temperatur auf einen festen Wert einstellen (z.B. weil man in Urlaub fährt), kann man dies zwar auch durch Änderungen der Temperaturlisten erreichen, einfacher ist aber die Zuweisung über den Urlaubsmodus, da nach dessen Ablaufdatum und -zeitpunkt automatisch in den Auto-Modus gewechselt wird. <br />
<br />
'''Ein Beispiel:'''<br />
:<code>set HM-CC-RT-DN_Clima controlParty 16 06.12.13 16:30 09.12.13 05:00</code><br />
<br />
Dadurch wird <br />
* vom 06.12.2013, 16:30 Uhr, <br />
* bis zum 09.12.2013, 05:00 Uhr <br />
* die gewünschte Raumtemperatur auf 16 °C<br />
<br />
eingestellt.<br />
<br />
'''Hinweise:'''<br />
* Der Befehl muss auf den Channel 4 ("_Clima") erfolgen.<br />
* Es werden nur Uhrzeiten zu jeder vollen oder halben Stunde angenommen (Minuten also 00 oder 30).<br />
<br />
Mit der Funktion "Urlaub" kann man eine ganze Wohnung (also mehrere RT´s) mit nur einem Befehl in den Party-mode versetzen.<br />
<br />
Der Name "Urlaub" kann natürlich frei gewählt werden. Im Beispiel werden zwei Heizkörper (Treppenhaus und Kammer) angesteuert.<br />
<br />
Zu beachten sind folgende Dinge:<br />
# Aktuelle Dateien (z.B. 10_CUL_HM) verwenden!<br />
# Bei dem partycontrol-Befehl in der Funktion KEIN Komma zwischen den Parametern.<br />
# Bei der Funktion die Parameterübergabe definieren ($$$$$) <br />
<br />
'''Aufruf:'''<br />
:<code>{Urlaub ("16", "06.12.13", "16:30", "09.12.13" ,"05:00")}</code><br />
<br />
'''Funktion:'''<br />
<source lang=perl><br />
my $Urlaub;<br />
sub<br />
Urlaub($$$$$)<br />
{<br />
#lokale Variablendeklaration<br />
my ($temp,$startDate,$startTime,$endDate,$endTime) = @_;<br />
<br />
# HM-CC-RT-DN akzeptiert nur Zeiten, die auf Minute 00 oder 30 enden.<br />
# Daher $startTime und $endTime abrunden<br />
$startTime =~ s/\:[0-2].$/:00/;<br />
$startTime =~ s/\:[3-5].$/:30/;<br />
$endTime =~ s/\:[0-2].$/:00/;<br />
$endTime =~ s/\:[3-5].$/:30/; <br />
<br />
#Sendebefehl für ein HM-CC-RT-DN<br />
{fhem ("set Kammer controlParty $temp $startDate $startTime $endDate $endTime")}<br />
<br />
# alternative Schreibweise der Parameter:<br />
{fhem ("set Treppenhaus controlParty @_[0] @_[1] @_[2] @_[3] @_[4]")};<br />
}<br />
</source><br />
<br />
=== Burst-Modus ===<br />
Das ist ein '''Übertragungs'''modus für Nachrichten zwischen HM-Geräten und der Zentrale. Der RT erwacht alle 2,5 Minuten und dann überträgt die Zentrale die Kommanods. Wenn man einen Fensterkontakt oder eine Fernsteuerung nutzt, muss der RT sofort reagieren - dann muss man den Burst ''enablen''. Der RT kann in diesem Fall sofort aufgeweckt werden und bearbeitet die Anforderung (Request). Das kann man auch von der Zentrale aus nutzen (so man möchte). Das ist der '''Vorteil''' des eingeschalteten Burst-Modus.<br />
<br />
'''Nachteil:''' Der RT muss den Receiver wach halten. Der RT und alle anderen Burst-Devices erwachen bei '''jedem''' Burst (egal für wen) und legen sich dann wieder schlafen.<br />
* jeder Burst-trigger kostet Batterie für '''alle''' Burst-Geräte im System<br />
* wenn Burst enabled ist kostet es dem RT Batteriekapazität<br />
<br />
'''Burst – wie es funktioniert'''<br />
<br />
Schickt ein Sender eine burst Sequenz, wachen alle burst-Empfänger auf und prüfen die Message. <br />
Wenn sie betroffen sind bleiben sie eine Zeit lang wach, ansonsten schlafen sie wieder ein. <br />
Man beachte also, dass Senden eines Burst Energie in ALLEN burst-Empfängern verbraucht, egal ob sie angesprochen sind.<br />
<br />
'''HMLAN und burst'''<br />
<br />
HMLAN hat ein Sendebudget das über eine Stunde berechnet wird. Burst belastet diese Konto deutlich - so können nicht mehr als 100 bursts /h gesendet werden - dann geht HMLAN in overload Wenn zusätzliche messages gesendet werden sind es entsprechend weniger. <br />
Es ist als nicht vorteilhaft, unnötig bursts zu senden.<br />
<br />
'''Burst devices'''<br />
<br />
Es gibt Devices, die immer auf burst reagieren und solche bei denen es abgeschaltet werden kann. So reagiert ein Rauchmelder immer auf Burst damit er seine Team-Kollegen hören kann. <br />
Ein TC oder RT hingegen hat diese Funktion abschaltbar. 'Per default ist dies ausgeschaltet um Batterie zu sparen'. Wenn ein VD gesteuert wird ist der TC ja selbst wach. Wird er aber mit einem Fensterkontakt gekoppelt muss es eingeschaltet werden – sonst verpasst er die message. <br />
<br />
'''ConditionalBurst devices'''<br />
<br />
Devices mit abschaltbarem burst wie z.B. der 'HM-CC-RT-DN', gibt es ein Register burstRx mit dem das burst-erwachen eingestellt werden kann. <br />
Sender, die einen burst-Aktor erwecken sollen muss man sagen, welcher peer burst benötigt. Hier kann ggf. das Register peerNeedsBurst nach dem peeren gesetzt werden. FHEM versucht dies automatisch beim Peeren zu erledigen. Siehe Hminfo Befehl 'models', um festzustellen, welche Devices welchen Modus unterstützen.<br />
<br />
'''Attribut burstAccess''' <br />
<br />
Devices, die abschaltbaren burst haben kann man ein attribut bustAccess 1_auto setzen. Es wird beim Abschicken eines Kommandos versucht, das Device mit burst zu wecken. Sollte es nicht funktionieren wird gewartet, bis das Device aufwacht (meist reagieren solche Devices auch auf wakeup). Das Setzen des Attributs ist angenehm – es werden aber ggf. viele bursts gesendet.<br />
<br />
'''Kommando burstXmit'''<br />
<br />
Mit diesem Kommando, das bei Devices mit contitional-Burst zu Verfügung steht, wird der burst gezielt von User angestossen.<br />
<br />
Der User schickt erst seine Kommandos an das device. Die Kommandos werden im Command-stack gesammelt. <br />
<br />
Dann sendet der User ein set burstXmit.<br />
<br />
Es passiert das gleiche wie bei burstAccess.<br />
<br />
FHEM versucht mittels burst zu wecken und sendet bei Erfolg die Messages aus dem Kommandostack. <br />
<br />
Im Gegensatz zu burstAccess ist burstXmit gezielt einsetzbar und kann sparsamer verwendet werden.<br />
<br />
''' FHEM und burst devices'''<br />
<br />
FHEM sendet eine burst automatisch mit Kommandos zu Devices, die nur burst unterstützen.<br />
<br />
'''So aktiviert man den burst-Betrieb am HM-CC-RT-DN'''<br />
<br />
''Burst Mode einschalten'' (der Kanal 4 des Device WZ1 heisst hier WZ1_4)<br />
:<code>set WZ1_4 regSet burstRx on </code><br />
prüfen mit:<br />
:<code>get WZ1_4 reg burstRx </code><br />
''Nun in FHEM den Burst mode einschalten (sofern nicht burstXmit verwendet wird)''<br />
:<code>attr WZ1 burstAccess 1_auto</code><br />
<br />
Hinweis: Das Attribut im Device und nicht im Kanal setzen, ansonsten gibt es eine Fehlermeldung.<br />
<br />
=== Temperaturlisten ===<br />
Die Temperaturlisten des HM-CC-RT-DN werden identisch mit denen anderer HomeMatic Thermostate verwaltet, siehe <u>[http://www.fhemwiki.de/wiki/HomeMatic_Type_Thermostat#Temperaturlisten|HomeMatic Type Thermostat]</u>. Beim HM-CC-RT-DN ist der Kanal 4 (_Clima) für die Temperaturlisten zuständig.<br />
<br />
==Fhem-Log==<br />
In den folgenden Logs heißt Kanal 4 noch "_ClimRT_tr". Inzwischen würde man dort "_Clima" sehen.<br />
<br />
=== Device-Log ===<br />
2013.10.10 20:03:24 3: CUL_HM Unknown device CUL_HM_HM_CC_RT_DN_2212BC, please define it<br />
2013.10.10 20:03:24 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC CUL_HM 2212BC A1A0184002212BC0000001000954B4551303531303031375900FFFF<br />
2013.10.10 20:03:24 3: Device CUL_HM_HM_CC_RT_DN_2212BC added to ActionDetector with 000:10 time<br />
2013.10.10 20:03:24 3: CUL_HM pair: CUL_HM_HM_CC_RT_DN_2212BC thermostat, model HM-CC-RT-DN serialNr KEQ0510017<br />
2013.10.10 20:03:24 3: LANCUL pairing (hmPairForSec) not enabled<br />
2013.10.10 20:03:24 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC-%Y.log CUL_HM_HM_CC_RT_DN_2212BC<br />
2013.10.10 20:03:24 3: Device Heizung_Wohnzimmer added to ActionDetector with 000:10 time<br />
2013.10.10 20:03:24 3: CUL_HM pair: Heizung_Wohnzimmer thermostat, model HM-CC-TC serialNr JEQ0044286<br />
2013.10.10 20:03:24 3: Device CUL_HM_HM_CC_RT_DN_2212BC added to ActionDetector with 000:10 time<br />
2013.10.10 20:03:24 3: CUL_HM pair: CUL_HM_HM_CC_RT_DN_2212BC thermostat, model HM-CC-RT-DN serialNr KEQ0510017<br />
2013.10.10 20:03:25 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_Weather CUL_HM 2212BC01<br />
2013.10.10 20:03:25 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_Weather FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_Weather-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_Weather<br />
2013.10.10 20:03:25 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_Weather FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_Weather-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_Weather<br />
2013.10.10 20:03:26 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_Climate CUL_HM 2212BC02<br />
2013.10.10 20:03:26 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_Climate FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_Climate-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_Climate<br />
2013.10.10 20:03:26 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_Climate FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_Climate-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_Climate<br />
2013.10.10 20:03:27 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_WindowRec CUL_HM 2212BC03<br />
2013.10.10 20:03:27 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_WindowRec FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_WindowRec-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_WindowRec<br />
2013.10.10 20:03:27 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_WindowRec FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_WindowRec-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_WindowRec<br />
2013.10.10 20:03:28 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr CUL_HM 2212BC04<br />
2013.10.10 20:03:28 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr<br />
2013.10.10 20:03:28 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr<br />
2013.10.10 20:03:29 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam CUL_HM 2212BC05<br />
2013.10.10 20:03:29 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam<br />
2013.10.10 20:03:29 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam<br />
2013.10.10 20:03:30 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_remote CUL_HM 2212BC06<br />
2013.10.10 20:03:30 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_remote FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_remote-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_remote<br />
2013.10.10 20:03:30 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_remote FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_remote-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_remote<br />
2013.10.10 20:03:35 3: Device CUL_HM_HM_CC_RT_DN_2212BC added to ActionDetector with 000:10 time<br />
2013.10.10 20:03:40 2: CUL_HM set CUL_HM_HM_CC_RT_DN_2212BC getSerial<br />
2013.10.10 20:03:40 2: CUL_HM set CUL_HM_HM_CC_RT_DN_2212BC getConfig<br />
2013.10.10 20:03:54 3: Device CUL_HM_HM_CC_RT_DN_2212BC added to ActionDetector with 000:10 time<br />
<br />
=== Event monitor ===<br />
2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr motorErr: ok<br />
2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr measured-temp: 18.4<br />
2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr desired-temp: 18<br />
2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr ValvePosition: 3 %<br />
2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr mode: manu<br />
2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr unknown0: 24<br />
2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr T: 18.4 desired: 18 valve: 3 %<br />
2013-10-12 12:05:35.646 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC battery: ok<br />
2013-10-12 12:05:35.646 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC batteryLevel: 3.1 V<br />
2013-10-12 12:05:35.646 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC measured-temp: 18.4<br />
2013-10-12 12:05:35.646 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC desired-temp: 18<br />
2013-10-12 12:05:35.646 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC actuator: 3 %<br />
<br />
== Firmware Update ==<br />
Seit 24.10.2014 gibt es für den HM-CC-RT-DN die neue Firmware Version 1.4. Diese kann von der eQ-3 Webseite heruntergeladen werden. Genauere Informationen gibt es unter [[HomeMatic_Firmware_Update]]<br />
<br />
=== HM-CC-RT-DN spezifische Update Informationen ===<br />
Durch gleichzeitiges Drücken der "Auto-/Manu"-Taste und der "Comfort-/Eco"-Taste am HM-CC-RT-DN während man die Batterien wieder einlegt wird der updatemodus gestartet. Während des Updates steht "FUP" im Display. Nach erfolgreichem Update erscheint "Ins" im Display und es muss eine erneute Adaptierfahrt durch drücken der Boost-Taste ausgelöst werden. Anschließend sollte der HM-CC-RT-DN wieder normal funktionieren. Die eingestellten Parameter und das Pairing mit FHEM gehen beim Update nicht verloren. Sollte das Update fehlschlagen, erscheint "Err" bzw. "CrC" im Display.<br />
<br />
Normalerweise sollte dann durch erneutes starten der Prozedur am PC und HM-CC-RT-DN das ganze erneut durchführbar sein.<br />
<br />
Es gibt einige Readings, die nicht durch ein einfaches ''getConfig'' aktualisisert werden, z.B. "battery"(nicht batteryLevel). Um diese Readings zu bekommen, ist ein <br />
:<code>set Device_Channel04 controlMode auto </code><br />
notwendig. Daraufhin werden die Readings übertragen/aktualisiert.<br />
<br />
== Simulation von Fensterkontakten und externen Temperatursensoren ==<br />
grober Ablauf:<br />
* erstellen ein virtuelles Device<br />
* erstelle dazu einen virtuellen Kanal<br />
* peeren den Kanal mit dem RT (als fenster-kontakt oder als remote, wen du willst)<br />
* sende ein postEvent<br />
<br />
=== Fensterkontakte ===<br />
''Entnommen aus diesem {{Link2Forum|Topic=31078|Message=236245|LinkText=Forenbeitrag}}''<br />
define virSC CUL_HM 221133<br />
attr virSC autoReadReg 4_reqStatus<br />
attr virSC expert 2_full<br />
attr virSC model virtual_1<br />
attr virSC peerIDs <br />
attr virSC subType virtual<br />
attr virSC webCmd press short:press long<br />
<br />
define virtualKitchenDoor CUL_HM 22113301<br />
attr virtualKitchenDoor dummy 1<br />
attr virtualKitchenDoor expert 1<br />
attr virtualKitchenDoor group Virtual<br />
attr virtualKitchenDoor model virtual_1<br />
attr virtualKitchenDoor webCmd postEvent open:postEvent closed <br />
<br />
Anschließend peeren und Temperatur festlegen mit:<br />
set virtualKitchenDoor peerChan 0 <Thermostat_Window_Rec> single set<br />
set <Thermostat_Window_Rec> regSet winOpnTemp 5 virtualKitchenDoor<br />
<br />
Die virtuelle Tür wird dann dann entsprechend über ein Notify getriggert:<br />
define notify_virtualKitchenDoor notify (Fensterkontakt_1|Fensterkontakt_2) {if(Value("Fensterkontakt") eq "open" && Value("Fensterkontakt_2") eq "open"){fhem("set virtualKitchenDoor postEvent open")}else{fhem("set virtualKitchenDoor postEvent closed")}}<br />
<br />
=== Temperatursensoren ===<br />
''Entnommen aus diesem {{Link2Forum|Topic=19686|Message=233788|LinkText=Forenbeitrag}}''<br />
<br />
1. Virtuelles HomeMatic Device mit _deiner_ HM Id definieren:<br />
define wz_vT CUL_HM <hmId><br />
<br />
2. Dem Device einen virtuellen Kanal (Default ist ein virtueller Button) hinzufügen:<br />
set wz_vT virtual 1<br />
<br />
3. Es ist kein virtueller Button sondern ein virtueller Temperatursensor - darum rename:<br />
rename wz_vT_Btn1 wz_vT_Sensor1<br />
<br />
4. Virtuellen Peer Sensor mit dem Weather Channel des RT-DN peeren:<br />
set wz_vT_Sensor1 peerChan 0 <RT_DN>_Weather single<br />
<br />
5. Peering kontrollieren (Voraussetzung: Device ''hm'' vom Typ [[HomeMatic HMInfo|HMinfo]] existiert):<br />
:<code>set hm peerXref</code><br />
Beispiel-Ausgabe:<br />
peerXref done: <br />
x-ref list <br />
wz_Thermostat_Weather => wz_vT_Sensor1 <br />
wz_vT_Sensor1 => wz_Thermostat_Weather<br />
<br />
6. Gemessene Temperatur vom z.B. 1-Wire DS1820 dem virtuellen HM Sensor übergeben. Z.B. alle zwei Minuten per at:<br />
define at_wz_vT at +*00:02 { my $T=(ReadingsVal("<DS1820B>","temperature",20.0)); fhem "set wz_vT_Sensor1 virtTemp $T" }<br />
<br />
Fertig.<br />
<br />
== Bekannte Probleme ==<br />
=== TempList: Bad format ... ===<br />
Wenn Sie beim Setzen einer Temperaturliste nach dem o.a. Schema ("SetTempList...") die Meldung<br />
<br />
Bad format, use HH:MM TEMP ......<br />
<br />
erhalten, sollten Sie zunächst ein [[update]] von Fhem durchführen.<br />
<br />
== Links ==<br />
* [http://www.elv.de/homematic-heizkoerperthermostat-1.html Produktinfo]<br />
* [http://www.elv-downloads.de/Assets/Produkte/10/1051/105155/Downloads/105155_thermostat_um.pdf Bedienungsanleitung (PDF)]<br />
* [http://www.elv-downloads.de/Assets/Produkte/10/1051/105155/Downloads/105155_thermostat_data.pdf Datenblatt (PDF)]<br />
* [http://www.elv-downloads.de/service/manuals/ventilkompatibilitaet.pdf Ventil-Kompatibilitätsliste (PDF)]<br />
* [http://forum.fhem.de/index.php/topic,14738.0.html Forum zum Thermostat]<br />
<br />
<br />
[[Kategorie:HomeMatic Components]]<br />
[[Kategorie:Heizungsventile]]</div>JoeAllhttp://wiki.fhem.de/w/index.php?title=JeeLink&diff=13155JeeLink2015-12-06T19:23:46Z<p>JoeAll: </p>
<hr />
<div>'''JeeLink''' ist ein RF-Gerät im Formfaktor eines USB-Sticks mit externer Antenne.<br />
{{Infobox Hardware<br />
|Bild=JeeLink.jpg<br />
|Bildbeschreibung=JeeLink mit Drahtantenne<br />
|HWProtocol=PCA301, EC3000, RoomNode oder LaCrosse und EMT7110<br />
|HWType=[[Interface]]<br />
|HWCategory=<br />
|HWComm=433/868/913 MHz<br />
|HWChannels=?<br />
|HWVoltage=5 V<br />
|HWPowerConsumption=ca. 90 mA<br />
|HWPoweredBy=USB<br />
|HWSize=23*67*9mm<br />
|HWDeviceFHEM=[http://fhem.de/commandref.html#JeeLink 36_JeeLink.pm]<br />
|ModOwner={{Link2FU|430|Andre / justme1968}}<br />
|HWManufacturer=JeeLabs<br />
}}<br />
<br />
== Beschreibung ==<br />
Vergleichbar mit dem [[CUL]] von Busware, ist der JeeLink ein USB-Stick, mit dem Funk-Hausautomations-Komponenten angebunden werden können. CUL und JeeLink unterscheiden sich im Funkmodul (CUL -> CC1101; JeeLink -> RF12B), die nicht miteinander kompatibel sind. Daher kann man auch keinen CUL als JeeLink-Ersatz nutzen!<br />
<br />
Den JeeLink gibt es in einer <br />
* 433 MHz Version<br />
* 868 MHz Version (Standard)<br />
* 915 MHz Version (Betrieb in Europa nicht zugelassen)<br />
<br />
== Vorbereitung JeeLink == <br />
Um mit dem JeeLink die jeweils gewünschten Signale empfangen zu können, ist er zunächst mit der passenden Firmware zu versorgen. Dies kann auf zwei Arten geschehen. Entweder durch das selber kompilieren der Software und das Flashen aus der Arduino IDE oder aus Fhem heraus mit einem aktuellen Firmwareimage das per update mit ausgeliefert wird.<br />
<br />
=== Selber Kompilieren ===<br />
[[Datei:JeeLink_flashen_1.jpg|mini|100px|rechts|Vorbereitung: Arduino einrichten]]<br />
Um den JeeLink mit Fhem benutzen zu können, muss (mit der Arduino Software / Entwicklungsumgebung (IDE)) eine spezifische "Firmware" (ein Sketch) auf dem JeeLink installiert werden. Die generelle Vorbereitung für diese Aktion ist unabhängig vom benötigten Sketch und besteht aus den folgenden Schritten:<br />
* Für Windows oder Mac OS X den passenden [http://www.ftdichip.com/Drivers/VCP.htm FTDI Treiber] installieren, unter Linux ist dieser meist schon vorhanden<br />
* Installation der [http://arduino.cc/de/Guide/HomePage Arduino Software] für die benutzte Plattform (verfügbar sind Windows, Mac OS X und Linux)<br />
* Je nach Sketch einbinden der [https://github.com/jcw/jeelib/archive/master.zip Jeelabs Library] in die Arduino IDE<br />
* Herunterladen des benötigten Sketches (aus [http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/contrib/arduino/ FHEM/contrib])<br />
* Anschließen des JeeLink an einen USB-Anschluss des Rechners mit der Arduino IDE<br />
* Start der Arduino Software und JeeLink flashen<br />
<br />
=== JeeLink aus Arduino flashen ===<br />
[[Datei:JeeLink_flashen_2.jpg|mini|100px|rechts|JeeLink Flashen]]<br />
* Anschließen des JeeLink an einen USB-Anschluss des Rechners mit der Arduino IDE<br />
* Start der Arduino Software<br />
* Seriellen Port des JeeLink auswählen<br />
* Einstellungen: in den Tools als Board "Arduino Uno" auswählen<br />
* Sketch mit "Datei öffnen" auswählen<br />
* Upload klicken<br />
<br />
=== JeeLink aus Fhem flashen ===<br />
* Auf dem Fhem System muss <code>avrdude</code> installiert sein. Das kann z.B. über die "normale" Linux Paketverwaltung geschehen.<br />
* mit <code>set <JeeLinkDevice> flash [firmware]</code> wird das Flashen angestossen<br><code>firmware</code> kann LaCrosse, PCA301 oder EC3000 sein. Wenn <code>firmware</code> nicht angegeben wird versucht FHEM den Namen der zu flashenden Firmware aus der zur Zeit installierten Firmware abzuleiten.<br />
* im Fhem Log kann der Ausgang des Flashvorgangs kontrolliert werden<br />
* über das <code>flashCommand</code> Attribut lässt sich das Kommando zum Flashen an besondere Anforderungen anpassen <br />
<br />
'''Vorsicht bei Jeelink Clones!''' <br />
<br />
Jeelink Clones basierend auf dem Arduino Nano haben normalerweise keinen Optibootloader drauf im Gegensatz zum Original JeeLink und JeeNode. <br />
<br />
Konsequenz: <br />
<br />
Beim "Nano Clone" und ähnliches muß man zum flashen in FHEM die Baudrate setzen mit "-b 57600"<br />
<br />
Original JeeLink, original JeeNode, und alle Arduinos, die einen Optibootloader drauf haben flashen in FHEM ohne "-b 57600" <br />
<br />
== Hinweise zum Betrieb mit Fhem == <br />
Um den JeeLink (erstmalig) mit Fhem benutzen zu können, muss dieser erfolgreich geflasht worden sein.<br />
* JeeLink an den Fhem-Rechner anschließen<br />
* Auf Linux Systemen kann es notwendig sein, mit <code>mknod /dev/ttyUSB0 c 188 0</code> das Device anzulegen (bitte erst überprüfen, ob der Stick nicht automatisch erkannt wird)<br />
<br />
=== Definition in fhem.cfg ===<br />
Erforderliche Definitionen in Fhem:<br />
:<code>define myJeeLink JeeLink /dev/ttyUSBx@57600</code><br />
*'''USBx''' ist anzupassen an die aktuell benutzte Schnittstelle, 0 wenn sonst nichts am USB-Port hängt<br />
*x=0,1,2, usw.<br />
<br />
Die [http://fhem.de/commandref.html#autocreate autocreate-Funktion] sollte aktiv sein. Alle erkannten Devices (PCA301, LaCrosse Sensoren incl. IT+ Wetterstation WS1600, EMT7110, EC3000, und RoomNodes) werden dann automatisch angelegt, sobald die jeweiligen Daten empfangen werden.<br />
<br />
Pro Geräte-Art/Protokoll muss ein eigener JeeLink mit dem passenden Sketch zum Empfang dieser Daten vorhanden sein (es kann jeweils nur ein Sketch im JeeLink aktiv sein und es gibt (zumindest derzeit (04/2014)) keinen Sketch, der mehr als eines der Protokolle abdeckt).<br />
<br />
'''Anmerkung:''' Der LaCrosse Sketch deckt sowohl die LaCrosse Temperatursensoren, die IT+ Wetterstation WS1600 als auch den Energieverbrauchssensor EMT7110 ab.<br />
<br />
=== PCA301 Sketch ===<br />
Der Sketch für die Unterstützung der ''PCA301 Funkschaltsteckdose mit Energieverbrauchsmessung'' (PCA301-pcaSerial.zip) kann von [http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/contrib/arduino/ sourceforge] heruntergeladen werden. Details zur Benutzung finden sich im Artikel zur [[PCA301 Funkschaltsteckdose mit Energieverbrauchsmessung|PCA301]].<br />
<br />
Unter Umständen werden die Signale der PCA301 nicht empfangen. Insbesondere mit selbst erstellten "JeeLinks" durch wahrscheinlich hohe Bauteiltoleranzen der RF12B Sendeeinheiten. Mit dem im Sketch voreingestellten rf12_center_freq = 0xA6FE (868,9500 MHz) bekommt man in diesem Fall keine Steckdose angelernt.<br />
<br />
==== Frequenzanpassung über modifizierten Sketch ====<br />
Durch Tests mittels ''set <myJeeLink> raw +'' bzw ''set <myJeeLink> raw -'' kann man dann ermitteln, ob die Funksignale z.B. ab A703 bis A715 empfangen werden. Das entspricht einem Frequenzbereich zwischen 868,9750 MHz und 869,0550 MHz.<br />
Die Mitte ist die Lösung, die man dann im Sketch ändern muss:<br />
:<code>static uint16_t rf12_center_freq = 0xA70C;</code><br />
Anschließend auf den JeeLink neu flashen.<br />
<br />
==== Frequenzanpassung über Attribut initCommands ====<br />
Über das <code>initCommands</code> lässt sich die gefundene Frequenz einstellen, ohne dass die Firmware verändert werden muss. <br />
:<code>attr <JeeLinkDevice> initCommands <hhhh>h</code><br />
<br />
=== LaCrosse Sketch ===<br />
Der Sketch für die Unterstützung der LaCrosse Temperatursensoren, der IT+ Wetterstation WS1600 und des Energieverbrauchssensors EMT7110 kann von [http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/contrib/arduino/ sourceforge] heruntergeladen werden.<br><br />
<br />
'''In der neuesten Version unterstützt er auch den SuperJee''' (siehe auch diesen {{Link2Forum|Topic=14786|Message=316924|LinkText=Forenbeitrag}}) mit folgenden Optionen: <br />
<br />
* Option 1 (Dual RFM): <br />
:Es kann ein zweiter RFM12B oder RFM69CW angeschlossen werden. Somit können zwei data rates (z.B. 17241 für TX29DTH und 8842 für WS 1600) gleichzeitig empfangen werden. Das geht natürlich auch mit dem toggle mode, nur ist es bei der Wetterstation ärgerlich, wenn man 30 Sekunden lang nichts empfängt und dadurch die alles entscheidende Windböe verpasst.<br />
* Option 2 (BMP180): <br />
:Da der Luftdruck in den Basisstationen gemessen wird, steht er für FHEM nicht zur Verfügung.<br />
Deshalb kann nun optional ein BMP180 oder BMP085 angeschlossen werden. Auch hier wird automatisch erkannt, ob er vorhanden ist. <br />
:Der BMP180 wird mit 3,3V versorgt und SDA mit PC4 und SCL mit PC5 verbunden (siehe die in diesem {{Link2Forum|Topic=14786|Message=316924|LinkText=Forenbeitrag}} angehängte SuperJee-CL.png) <br />
<br />
==== Relay-Betrieb ====<br />
Der LaCrosse Sketch ermöglicht auch den Relay-Betrieb zur Reichweitenverbesserung. Er funktioniert damit ähnlich wie z.&nbsp;B. ein WLAN Range Extender. Wenn der Sketch für den Relay-Betrieb konfiguriert ist, wird jedes empfangene IT+ Datenpaket, das eine gültige Prüfsumme hat, direkt nach dem Empfang wieder gesendet.<br />
<br />
Das Prinzip ist generell recht einfach:<br />
# JeeLink im Sketch als Relais konfigurieren und flashen.<br />
# Auf "halber Strecke" (d.h. irgendwo zwischen dem primären Sender und dem entfernten Empfänger) auf ein USB-Steckernetzteil stecken. Der JeeLink arbeitet in diesem Modus "autonom", er benötigt also lediglich einen Spannungsversorgung.<br />
<br />
Der JeeLink empfängt und decodiert alle Protokolle, die er auch für FHEM unterstützt. Wenn er ein Paket empfangen hat (egal von welchem Sensor) und CRC OK war, dann sendet er es wieder aus. Der JeeLink am FHEM merkt keinen Unterschied. Falls ein Paket es doch bis zum FHEM direkt geschafft hat, kommt es dort zweimal an. Diese Situation muss in Fhem behandelt werden.<br />
<br />
Details zu diesem Betriebsmodus sind in diesen Forenbeiträgen ({{Link2Forum|Topic=14786|Message=165153|LinkText=LaCrosse}} bzw. {{Link2Forum|Topic=26494|Message=196648|LinkText=EMT7110}}) zu finden.<br />
<br />
==== Frequenzanpassung ====<br />
Ab Version LaCrosseITPlusReader.10.1e wurde der Sketch so erweitert, dass man von FHEM aus die Frequenz setzen kann. Dazu versteht der Sketch das neue Kommando "f":<br />
:<code>set myJeeLink raw 868295f</code><br />
setzt die Frequenz auf 868295 kHz.<br />
<br />
Die Frequenz kann im Bereich von 860480 kHz bis 879515 kHz in 5kHz -Schritten eingestellt werden.<br />
Details dazu in diesem {{Link2Forum|Topic=14786|Message=222541}} im Forum. Die Frequenzanpassung ist insbesondere beim 30.3155.WD häufig erforderlich, weshalb er als kritisch einzustufen und nicht zu empfehlen ist (siehe {{Link2Forum|Topic=14786|Message=352550|LinkText=Forenbeitrag}}).<br />
<br />
==== Getestete iT+ Sensoren incl. Wetterstation WS 1600 ====<br />
{{Randnotiz|RNTyp=y|RNText=Die Ausführungen in diesem Abschnitt gelten ab der Version 10.1q auch für die Wetterstation WS1080.<br />
<br />
'''Vorsicht''': die WS1080 gibt es (unter gleichem Namen) in einer "OOK"- und in einer "FSK"-Version.<br />
* Der LaCrosse Sketch und das LaCrosseGateway können nur die FSK-Version empfangen, die OOK-Version wird nicht unterstützt.<br />
* Die FSK-Version ist zu erkennen an einem runden grünen Aufkleber im Batteriefach der Station mit dem Aufdruck "PASS 7". Details dazu in {{Link2Forum|Topic=14786|Message=363766|LinkText=diesem Forenbeitrag}}<br />
}}<br />
Die in der folgenden Liste (Quelle: {{Link2Forum|Topic=14786|Message=164801|LinkText=Fhem Forum}}) aufgeführten Sensoren wurden bisher erfolgreich getestet:<br />
<br />
{| class="wikitable"<br />
!Bezeichnung !! Datenrate !! Link<br />
|-<br />
| TX21IT || 17.241 kbps<br />
|-<br />
| TX25-IT || 17.241 kbps<br />
|-<br />
| TX27-IT || 17.241 kbps<br />
|-<br />
| TX29-IT || 17.241 kbps<br />
|-<br />
| TX29DTH-IT || 17.241 kbps<br />
|-<br />
| TX37 || 17.241 kbps<br />
|-<br />
| TX35TH-IT || 9.579 kbps<br />
|-<br />
| TX35DTH-IT || 9.579 kbps<br />
|-<br />
| 30.3143.IT || 17.241 kbps<br />
|-<br />
| 30.3144.IT || 17.241 kbps || ({{Link2Forum|Topic=17662|LinkText=Forenthread}})<br />
|-<br />
| 30.3147.IT || 17.241 kbps<br />
|-<br />
| 30.3155WD || 9.579 kbps || kritisch; nicht zu empfehlen; siehe {{Link2Forum|Topic=14786|Message=352550|LinkText=Forenbeitrag}}<br />
|-<br />
| 30.3156WD || 9.579 kbps || Batterie-kritisch. Funktioniert schlecht mit Akkus!<br />
|-<br />
| 30.3187.IT || 17.241 kbps<br />
|-<br />
|| WS 1600 || 8.842 kbps || ({{Link2Forum|Topic=14786|Message=297293|LinkText=Forenbeitrag}})<br />
|-<br />
|| WS 1080 || 17.241 kbps || ({{Link2Forum|Topic=14786|Message=363766|LinkText=Forenbeitrag}})<br />
|}<br />
<br />
==== EMT7110 ====<br />
Der EMT7110 läuft mit einer Datenrate von 9.579 kbps (Details dazu in diesem {{Link2Forum|Topic=26494|LinkText=Forenthread}}).<br />
<br />
Werden Sensoren mit unterschiedlichen Datenraten gleichzeitig betrieben, ist der Toggle Modus einzustellen, z.B. mit dem Befehl <br />
:<code>initCommands 30t v </code><br />
wobei ''30t'' für "Toggle Modus, alle 30 Sekunden" steht.<br />
<br />
=== Energy Count 3000 Sketch ===<br />
Der Sketch für die Unterstützung der Energy Count 3000 Zwischenstecker kann von [http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/contrib/arduino/ sourceforge] heruntergeladen werden.<br />
<br />
Das Fhem Modul dazu (36_EC3000.pm) ist genau wie die Module für JeeLink (36_JeeLink.pm) und PCA301 (36_PCA301.pm) mittlerweile im aktuellen Fhem enthalten.<br />
<br />
=== JeeLabs RoomNode ===<br />
Eine Beschreibung zum Empfang der JeeLabs RoomNodes ist in {{Link2Forum|Topic=11648|Message=92037|LinkText=diesem Forenbeitrag}} enthalten.<br />
<br />
=== JeeLink LED deaktivieren ===<br />
Ein "dauerhaftes" Deaktivieren der LED des JeeLink ist möglich mit<br />
:<code>define not.global notify global:INITIALIZED set myJeeLink led off</code><br />
damit wird, sobald Fhem komplett gestartet ist, von Fhem der Befehl zum Ausschalten der LED gesendet. Alternativ kann mit <br />
:<code>attr myJeeLink initCommands 0a v</code><br />
dem Sketch die Anweisung gegeben werden, bei der Initialisierung die LED zu deaktivieren.<br />
''Quelle: dieser {{Link2Forum|Topic=27161|LinkText=Forenthread}}''<br />
<br />
=== Weitergehende Informationen ===<br />
Hinweise zum Betrieb eines JeeLink mit Fhem finden sich aktuell in größerer Anzahl in verschiedenen Diskussionen im Forum:<br />
* {{Link2Forum|Topic=11648|LinkText=JeeLink / PCA301}} - Analyse des Funkprotokolls; Anfänge der Entstehung der PCA301 Unterstützung in Fhem.<br />
* {{Link2Forum|Topic=14786|LinkText=JeeLink / LaCrosse}} - JeeLink Modul zur Einbindung von La Crosse<br />
* {{Link2Forum|Topic=11648|Message=92019|LinkText=JeeLink / EC3000}} - Anfänge der Entstehung der EC3000 Unterstützung in Fhem.<br />
* Hinweise zu {{Link2Forum|Topic=11648|Message=92037|LinkText=JeeLabs RoomNode}} und anderen JeeLab Nodes<br />
* {{Link2Forum|Topic=25399|Message=183910|LinkText=JeeLink mit FHEM2FHEM nutzen}}<br />
<br />
== Bekannte Probleme ==<br />
* Beim Betrieb an einer [[AVM Fritz!Box|FritzBox]] wird der JeeLink unter Umständen als ''Für die Nutzung mit dem USB-Fernanschluss reserviert'' angezeigt. In diesem Fall muss die Reservierung deaktiviert/aufgehoben werden (Details dazu in diesem {{Link2Forum|Topic=16579|LinkText=Forenthread}}).<br />
* Die Version ''v3c'' des JeeLink funktioniert (Stand 06/2015) nur mit dem LaCrosse Sketch. PCA301 und EC3000 Sketch sind auf den JeeLink Classic beschränkt (siehe unter anderem Diskussion im Forum, startend {{Link2Forum|Topic=11648|Message=308267|LinkText=hier}}).<br />
<br />
== Weblinks ==<br />
* [http://jeelabs.com/products/jeelink JeeLabs], JeeLink Hersteller<br />
* [http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/contrib/arduino/ PCA301 Sketch] auf sourceforge<br />
* [http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/contrib/arduino/ LaCrosse Sketch] auf sourceforge<br />
* [http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/contrib/arduino/ EC3000 Sketch] auf sourceforge<br />
* [http://blog.moneybag.de/hausautomation-fhem-mit-funksteckdose-energiemessung-elv-pca-301/ Blog] zum Thema JeeLink zur Anbindung von PCA301 und von LaCrosse Temperatursensoren an Fhem<br />
* {{Link2Forum|Topic=23217|LinkText=LevelSender}} Tankfüllstand mit JeeLink empfangen<br />
<br />
[[Kategorie:Interfaces]]<br />
[[Kategorie:Other Components]]</div>JoeAllhttp://wiki.fhem.de/w/index.php?title=JeeLink&diff=13153JeeLink2015-12-06T18:28:14Z<p>JoeAll: </p>
<hr />
<div>'''JeeLink''' ist ein RF-Gerät im Formfaktor eines USB-Sticks mit externer Antenne.<br />
{{Infobox Hardware<br />
|Bild=JeeLink.jpg<br />
|Bildbeschreibung=JeeLink mit Drahtantenne<br />
|HWProtocol=PCA301, EC3000, RoomNode oder LaCrosse und EMT7110<br />
|HWType=[[Interface]]<br />
|HWCategory=<br />
|HWComm=433/868/913 MHz<br />
|HWChannels=?<br />
|HWVoltage=5 V<br />
|HWPowerConsumption=ca. 90 mA<br />
|HWPoweredBy=USB<br />
|HWSize=23*67*9mm<br />
|HWDeviceFHEM=[http://fhem.de/commandref.html#JeeLink 36_JeeLink.pm]<br />
|ModOwner={{Link2FU|430|Andre / justme1968}}<br />
|HWManufacturer=JeeLabs<br />
}}<br />
<br />
== Beschreibung ==<br />
Vergleichbar mit dem [[CUL]] von Busware, ist der JeeLink ein USB-Stick, mit dem Funk-Hausautomations-Komponenten angebunden werden können. CUL und JeeLink unterscheiden sich im Funkmodul (CUL -> CC1101; JeeLink -> RF12B), die nicht miteinander kompatibel sind. Daher kann man auch keinen CUL als JeeLink-Ersatz nutzen!<br />
<br />
Den JeeLink gibt es in einer <br />
* 433 MHz Version<br />
* 868 MHz Version (Standard)<br />
* 915 MHz Version (Betrieb in Europa nicht zugelassen)<br />
<br />
== Vorbereitung JeeLink == <br />
Um mit dem JeeLink die jeweils gewünschten Signale empfangen zu können, ist er zunächst mit der passenden Firmware zu versorgen. Dies kann auf zwei Arten geschehen. Entweder durch das selber kompilieren der Software und das Flashen aus der Arduino IDE oder aus Fhem heraus mit einem aktuellen Firmwareimage das per update mit ausgeliefert wird.<br />
<br />
=== Selber Kompilieren ===<br />
[[Datei:JeeLink_flashen_1.jpg|mini|100px|rechts|Vorbereitung: Arduino einrichten]]<br />
Um den JeeLink mit Fhem benutzen zu können, muss (mit der Arduino Software / Entwicklungsumgebung (IDE)) eine spezifische "Firmware" (ein Sketch) auf dem JeeLink installiert werden. Die generelle Vorbereitung für diese Aktion ist unabhängig vom benötigten Sketch und besteht aus den folgenden Schritten:<br />
* Für Windows oder Mac OS X den passenden [http://www.ftdichip.com/Drivers/VCP.htm FTDI Treiber] installieren, unter Linux ist dieser meist schon vorhanden<br />
* Installation der [http://arduino.cc/de/Guide/HomePage Arduino Software] für die benutzte Plattform (verfügbar sind Windows, Mac OS X und Linux)<br />
* Je nach Sketch einbinden der [https://github.com/jcw/jeelib/archive/master.zip Jeelabs Library] in die Arduino IDE<br />
* Herunterladen des benötigten Sketches (aus [http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/contrib/arduino/ FHEM/contrib])<br />
* Anschließen des JeeLink an einen USB-Anschluss des Rechners mit der Arduino IDE<br />
* Start der Arduino Software und JeeLink flashen<br />
<br />
=== JeeLink aus Arduino flashen ===<br />
[[Datei:JeeLink_flashen_2.jpg|mini|100px|rechts|JeeLink Flashen]]<br />
* Anschließen des JeeLink an einen USB-Anschluss des Rechners mit der Arduino IDE<br />
* Start der Arduino Software<br />
* Seriellen Port des JeeLink auswählen<br />
* Einstellungen: in den Tools als Board "Arduino Uno" auswählen<br />
* Sketch mit "Datei öffnen" auswählen<br />
* Upload klicken<br />
<br />
=== JeeLink aus Fhem flashen ===<br />
* Auf dem Fhem System muss <code>avrdude</code> installiert sein. Das kann z.B. über die "normale" Linux Paketverwaltung geschehen.<br />
* mit <code>set <JeeLinkDevice> flash [firmware]</code> wird das Flashen angestossen<br><code>firmware</code> kann LaCrosse, PCA301 oder EC3000 sein. Wenn <code>firmware</code> nicht angegeben wird versucht FHEM den Namen der zu flashenden Firmware aus der zur Zeit installierten Firmware abzuleiten.<br />
* im Fhem Log kann der Ausgang des Flashvorgangs kontrolliert werden<br />
* über das <code>flashCommand</code> Attribut lässt sich das Kommando zum Flashen an besondere Anforderungen anpassen <br />
<br />
'''Vorsicht bei Jeelink Clones!''' <br />
<br />
Jeelink Clones basierend auf dem Arduino Nano haben normalerweise keinen Optibootloader drauf im Gegensatz zum Original JeeLink und JeeNode. <br />
<br />
Konsequenz: <br />
<br />
Beim "Nano Clone" und ähnliches muß man zum flashen in FHEM die Baudrate setzen mit "-b 57600"<br />
<br />
Original JeeLink, original JeeNode, und alle Arduinos, die einen Optibootloader drauf haben flashen in FHEM ohne "-b 57600" <br />
<br />
== Hinweise zum Betrieb mit Fhem == <br />
Um den JeeLink (erstmalig) mit Fhem benutzen zu können, muss dieser erfolgreich geflasht worden sein.<br />
* JeeLink an den Fhem-Rechner anschließen<br />
* Auf Linux Systemen kann es notwendig sein, mit <code>mknod /dev/ttyUSB0 c 188 0</code> das Device anzulegen (bitte erst überprüfen, ob der Stick nicht automatisch erkannt wird)<br />
<br />
=== Definition in fhem.cfg ===<br />
Erforderliche Definitionen in Fhem:<br />
:<code>define myJeeLink JeeLink /dev/ttyUSBx@57600</code><br />
*'''USBx''' ist anzupassen an die aktuell benutzte Schnittstelle, 0 wenn sonst nichts am USB-Port hängt<br />
*x=0,1,2, usw.<br />
<br />
Die [http://fhem.de/commandref.html#autocreate autocreate-Funktion] sollte aktiv sein. Alle erkannten Devices (PCA301, LaCrosse Sensoren incl. IT+ Wetterstation WS1600, EMT7110, EC3000, und RoomNodes) werden dann automatisch angelegt, sobald die jeweiligen Daten empfangen werden.<br />
<br />
Pro Geräte-Art/Protokoll muss ein eigener JeeLink mit dem passenden Sketch zum Empfang dieser Daten vorhanden sein (es kann jeweils nur ein Sketch im JeeLink aktiv sein und es gibt (zumindest derzeit (04/2014)) keinen Sketch, der mehr als eines der Protokolle abdeckt).<br />
<br />
'''Anmerkung:''' Der LaCrosse Sketch deckt sowohl die LaCrosse Temperatursensoren, die IT+ Wetterstation WS1600 als auch den Energieverbrauchssensor EMT7110 ab.<br />
<br />
=== PCA301 Sketch ===<br />
Der Sketch für die Unterstützung der ''PCA301 Funkschaltsteckdose mit Energieverbrauchsmessung'' (PCA301-pcaSerial.zip) kann von [http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/contrib/arduino/ sourceforge] heruntergeladen werden. Details zur Benutzung finden sich im Artikel zur [[PCA301 Funkschaltsteckdose mit Energieverbrauchsmessung|PCA301]].<br />
<br />
Unter Umständen werden die Signale der PCA301 nicht empfangen. Insbesondere mit selbst erstellten "JeeLinks" durch wahrscheinlich hohe Bauteiltoleranzen der RF12B Sendeeinheiten. Mit dem im Sketch voreingestellten rf12_center_freq = 0xA6FE (868,9500 MHz) bekommt man in diesem Fall keine Steckdose angelernt.<br />
<br />
==== Frequenzanpassung über modifizierten Sketch ====<br />
Durch Tests mittels ''set <myJeeLink> raw +'' bzw ''set <myJeeLink> raw -'' kann man dann ermitteln, ob die Funksignale z.B. ab A703 bis A715 empfangen werden. Das entspricht einem Frequenzbereich zwischen 868,9750 MHz und 869,0550 MHz.<br />
Die Mitte ist die Lösung, die man dann im Sketch ändern muss:<br />
:<code>static uint16_t rf12_center_freq = 0xA70C;</code><br />
Anschließend auf den JeeLink neu flashen.<br />
<br />
==== Frequenzanpassung über Attribut initCommands ====<br />
Über das <code>initCommands</code> lässt sich die gefundene Frequenz einstellen, ohne dass die Firmware verändert werden muss. <br />
:<code>attr <JeeLinkDevice> initCommands <hhhh>h</code><br />
<br />
=== LaCrosse Sketch ===<br />
Der Sketch für die Unterstützung der LaCrosse Temperatursensoren, der IT+ Wetterstation WS1600 und des Energieverbrauchssensors EMT7110 kann von [http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/contrib/arduino/ sourceforge] heruntergeladen werden.<br><br />
<br />
'''In der neuesten Version unterstützt er auch den SuperJee''' (siehe auch diesen {{Link2Forum|Topic=14786|Message=316924|LinkText=Forenbeitrag}}) mit folgenden Optionen: <br />
<br />
* Option 1 (Dual RFM): <br />
:Es kann ein zweiter RFM12B oder RFM69CW angeschlossen werden. Somit können zwei data rates (z.B. 17241 für TX29DTH und 8842 für WS 1600) gleichzeitig empfangen werden. Das geht natürlich auch mit dem toggle mode, nur ist es bei der Wetterstation ärgerlich, wenn man 30 Sekunden lang nichts empfängt und dadurch die alles entscheidende Windböe verpasst.<br />
* Option 2 (BMP180): <br />
:Da der Luftdruck in den Basisstationen gemessen wird, steht er für FHEM nicht zur Verfügung.<br />
Deshalb kann nun optional ein BMP180 oder BMP085 angeschlossen werden. Auch hier wird automatisch erkannt, ob er vorhanden ist. <br />
:Der BMP180 wird mit 3,3V versorgt und SDA mit PC4 und SCL mit PC5 verbunden (siehe die in diesem {{Link2Forum|Topic=14786|Message=316924|LinkText=Forenbeitrag}} angehängte SuperJee-CL.png) <br />
<br />
==== Relay-Betrieb ====<br />
Der LaCrosse Sketch ermöglicht auch den Relay-Betrieb zur Reichweitenverbesserung. Er funktioniert damit ähnlich wie z.&nbsp;B. ein WLAN Range Extender. Wenn der Sketch für den Relay-Betrieb konfiguriert ist, wird jedes empfangene IT+ Datenpaket, das eine gültige Prüfsumme hat, direkt nach dem Empfang wieder gesendet.<br />
<br />
Das Prinzip ist generell recht einfach:<br />
# JeeLink im Sketch als Relais konfigurieren und flashen.<br />
# Auf "halber Strecke" (d.h. irgendwo zwischen dem primären Sender und dem entfernten Empfänger) auf ein USB-Steckernetzteil stecken. Der JeeLink arbeitet in diesem Modus "autonom", er benötigt also lediglich einen Spannungsversorgung.<br />
<br />
Der JeeLink empfängt und decodiert alle Protokolle, die er auch für FHEM unterstützt. Wenn er ein Paket empfangen hat (egal von welchem Sensor) und CRC OK war, dann sendet er es wieder aus. Der JeeLink am FHEM merkt keinen Unterschied. Falls ein Paket es doch bis zum FHEM direkt geschafft hat, kommt es dort zweimal an. Diese Situation muss in Fhem behandelt werden.<br />
<br />
Details zu diesem Betriebsmodus sind in diesen Forenbeiträgen ({{Link2Forum|Topic=14786|Message=165153|LinkText=LaCrosse}} bzw. {{Link2Forum|Topic=26494|Message=196648|LinkText=EMT7110}}) zu finden.<br />
<br />
==== Frequenzanpassung ====<br />
Ab Version LaCrosseITPlusReader.10.1e wurde der Sketch so erweitert, dass man von FHEM aus die Frequenz setzen kann. Dazu versteht der Sketch das neue Kommando "f":<br />
:<code>set myJeeLink raw 868295f</code><br />
setzt die Frequenz auf 868295 kHz.<br />
<br />
Die Frequenz kann im Bereich von 860480 kHz bis 879515 kHz in 5kHz -Schritten eingestellt werden.<br />
Details dazu in diesem {{Link2Forum|Topic=14786|Message=222541}} im Forum. Die Frequenzanpassung ist insbesondere beim 30.3155.WD häufig erforderlich, weshalb er als kritisch einzustufen und nicht zu empfehlen ist (siehe {{Link2Forum|Topic=14786|Message=352550|LinkText=Forenbeitrag}}).<br />
<br />
==== Getestete iT+ Sensoren incl. Wetterstation WS 1600 ====<br />
{{Randnotiz|RNTyp=y|RNText=Die Ausführungen in diesem Abschnitt gelten ab der Version 10.1q auch für die Wetterstation WS1080.<br />
<br />
'''Vorsicht''': die WS1080 gibt es (unter gleichem Namen) in einer "OOK"- und in einer "FSK"-Version.<br />
* Der LaCrosse Sketch und das LaCrosseGateway können nur die FSK-Version empfangen, die OOK-Version wird nicht unterstützt.<br />
* Die FSK-Version ist zu erkennen an einem runden grünen Aufkleber im Batteriefach der Station mit dem Aufdruck "PASS 7". Details dazu in {{Link2Forum|Topic=14786|Message=363766|LinkText=diesem Forenbeitrag}}<br />
}}<br />
Die in der folgenden Liste (Quelle: {{Link2Forum|Topic=14786|Message=164801|LinkText=Fhem Forum}}) aufgeführten Sensoren wurden bisher erfolgreich getestet:<br />
<br />
{| class="wikitable"<br />
!Bezeichnung !! Datenrate !! Link<br />
|-<br />
| TX21IT || 17.241 kbps<br />
|-<br />
| TX25-IT || 17.241 kbps<br />
|-<br />
| TX27-IT || 17.241 kbps<br />
|-<br />
| TX29-IT || 17.241 kbps<br />
|-<br />
| TX29DTH-IT || 17.241 kbps<br />
|-<br />
| TX37 || 17.241 kbps<br />
|-<br />
| TX35TH-IT || 9.579 kbps<br />
|-<br />
| TX35DTH-IT || 9.579 kbps<br />
|-<br />
| 30.3143.IT || 17.241 kbps<br />
|-<br />
| 30.3144.IT || 17.241 kbps || ({{Link2Forum|Topic=17662|LinkText=Forenthread}})<br />
|-<br />
| 30.3147.IT || 17.241 kbps<br />
|-<br />
| 30.3155WD || 9.579 kbps || kritisch; nicht zu empfehlen; siehe {{Link2Forum|Topic=14786|Message=352550|LinkText=Forenbeitrag}}<br />
|-<br />
| 30.3156WD || 9.579 kbps<br />
|-<br />
| 30.3187.IT || 17.241 kbps<br />
|-<br />
|| WS 1600 || 8.842 kbps || ({{Link2Forum|Topic=14786|Message=297293|LinkText=Forenbeitrag}})<br />
|-<br />
|| WS 1080 || 17.241 kbps || ({{Link2Forum|Topic=14786|Message=363766|LinkText=Forenbeitrag}})<br />
|}<br />
<br />
==== EMT7110 ====<br />
Der EMT7110 läuft mit einer Datenrate von 9.579 kbps (Details dazu in diesem {{Link2Forum|Topic=26494|LinkText=Forenthread}}).<br />
<br />
Werden Sensoren mit unterschiedlichen Datenraten gleichzeitig betrieben, ist der Toggle Modus einzustellen, z.B. mit dem Befehl <br />
:<code>initCommands 30t v </code><br />
wobei ''30t'' für "Toggle Modus, alle 30 Sekunden" steht.<br />
<br />
=== Energy Count 3000 Sketch ===<br />
Der Sketch für die Unterstützung der Energy Count 3000 Zwischenstecker kann von [http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/contrib/arduino/ sourceforge] heruntergeladen werden.<br />
<br />
Das Fhem Modul dazu (36_EC3000.pm) ist genau wie die Module für JeeLink (36_JeeLink.pm) und PCA301 (36_PCA301.pm) mittlerweile im aktuellen Fhem enthalten.<br />
<br />
=== JeeLabs RoomNode ===<br />
Eine Beschreibung zum Empfang der JeeLabs RoomNodes ist in {{Link2Forum|Topic=11648|Message=92037|LinkText=diesem Forenbeitrag}} enthalten.<br />
<br />
=== JeeLink LED deaktivieren ===<br />
Ein "dauerhaftes" Deaktivieren der LED des JeeLink ist möglich mit<br />
:<code>define not.global notify global:INITIALIZED set myJeeLink led off</code><br />
damit wird, sobald Fhem komplett gestartet ist, von Fhem der Befehl zum Ausschalten der LED gesendet. Alternativ kann mit <br />
:<code>attr myJeeLink initCommands 0a v</code><br />
dem Sketch die Anweisung gegeben werden, bei der Initialisierung die LED zu deaktivieren.<br />
''Quelle: dieser {{Link2Forum|Topic=27161|LinkText=Forenthread}}''<br />
<br />
=== Weitergehende Informationen ===<br />
Hinweise zum Betrieb eines JeeLink mit Fhem finden sich aktuell in größerer Anzahl in verschiedenen Diskussionen im Forum:<br />
* {{Link2Forum|Topic=11648|LinkText=JeeLink / PCA301}} - Analyse des Funkprotokolls; Anfänge der Entstehung der PCA301 Unterstützung in Fhem.<br />
* {{Link2Forum|Topic=14786|LinkText=JeeLink / LaCrosse}} - JeeLink Modul zur Einbindung von La Crosse<br />
* {{Link2Forum|Topic=11648|Message=92019|LinkText=JeeLink / EC3000}} - Anfänge der Entstehung der EC3000 Unterstützung in Fhem.<br />
* Hinweise zu {{Link2Forum|Topic=11648|Message=92037|LinkText=JeeLabs RoomNode}} und anderen JeeLab Nodes<br />
* {{Link2Forum|Topic=25399|Message=183910|LinkText=JeeLink mit FHEM2FHEM nutzen}}<br />
<br />
== Bekannte Probleme ==<br />
* Beim Betrieb an einer [[AVM Fritz!Box|FritzBox]] wird der JeeLink unter Umständen als ''Für die Nutzung mit dem USB-Fernanschluss reserviert'' angezeigt. In diesem Fall muss die Reservierung deaktiviert/aufgehoben werden (Details dazu in diesem {{Link2Forum|Topic=16579|LinkText=Forenthread}}).<br />
* Die Version ''v3c'' des JeeLink funktioniert (Stand 06/2015) nur mit dem LaCrosse Sketch. PCA301 und EC3000 Sketch sind auf den JeeLink Classic beschränkt (siehe unter anderem Diskussion im Forum, startend {{Link2Forum|Topic=11648|Message=308267|LinkText=hier}}).<br />
<br />
== Weblinks ==<br />
* [http://jeelabs.com/products/jeelink JeeLabs], JeeLink Hersteller<br />
* [http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/contrib/arduino/ PCA301 Sketch] auf sourceforge<br />
* [http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/contrib/arduino/ LaCrosse Sketch] auf sourceforge<br />
* [http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/contrib/arduino/ EC3000 Sketch] auf sourceforge<br />
* [http://blog.moneybag.de/hausautomation-fhem-mit-funksteckdose-energiemessung-elv-pca-301/ Blog] zum Thema JeeLink zur Anbindung von PCA301 und von LaCrosse Temperatursensoren an Fhem<br />
* {{Link2Forum|Topic=23217|LinkText=LevelSender}} Tankfüllstand mit JeeLink empfangen<br />
<br />
[[Kategorie:Interfaces]]<br />
[[Kategorie:Other Components]]</div>JoeAllhttp://wiki.fhem.de/w/index.php?title=HM-LC-Sw1-Pl2_Funk-Zwischenstecker-Schaltaktor_1fach&diff=12906HM-LC-Sw1-Pl2 Funk-Zwischenstecker-Schaltaktor 1fach2015-11-17T07:21:38Z<p>JoeAll: Link PDF aktualisiert</p>
<hr />
<div>'''HomeMatic HM-LC-Sw1-Pl-2 Funk-Zwischenstecker-Schaltaktor 1fach'''<br />
<br />
Homematic Zwischenstecker-Schalter, 1-fach<br />
<br />
= Features =<br />
<br />
Schalten eines angeschlossenen Verbrauchers mittels CUL/CUN/HMLAN Konfigurator.<br />
<br />
'''Technische Daten:'''<br />
* Schaltvermögen: 16A bei 230V/50Hz (ohmsche Last)<br />
* Relais: 1x Schließer<br />
* Standby Verbrauch: 0,5W<br />
* Schutzart: IP20<br />
* Farbe: Reinweiß mit silberner Blende<br />
* Maße(HxBxT): 125x63x40mm<br />
<br />
* Aktuelle Firmware: 1.12 (via get DEVICE param firmware)<br />
<br />
= Hinweise zum Betrieb mit FHEM =<br />
<br />
Das Pairing sollte wie in [[HomeMatic Devices pairen]] beschrieben durchgeführt werden.<br />
<br />
== FHEM Config-Auszug ==<br />
<br />
Ein exemplarischer Auszug aus der fhem.cfg:<br />
<br />
<pre><br />
define internet CUL_HM 1BEXXX<br />
attr internet .devInfo 010100<br />
attr internet .stc 10<br />
attr internet autoReadReg 4_reqStatus<br />
attr internet devStateIcon on:black_Steckdose.on off:black_Steckdose.off<br />
attr internet expert 2_full<br />
attr internet firmware 1.9<br />
attr internet model HM-LC-SW1-PL2<br />
attr internet peerIDs 00000000,<br />
attr internet room CUL_HM<br />
attr internet serialNr JEQ0461XXX<br />
attr internet subType switch<br />
attr internet webCmd toggle:on:off:statusRequest<br />
define FileLog_internet FileLog /var/log/fhem/internet-%Y.log internet<br />
attr FileLog_internet logtype text<br />
attr FileLog_internet room CUL_HM</pre><br />
<br />
== Mögliche Schaltoperationen ==<br />
<br />
Der Aktor versteht folgende Aktionen:<br />
<br />
<pre><br />
set <name> on -> Schaltet den Aktor ein<br />
set <name> off -> Schaltet den Aktor aus<br />
set <name> toggle -> Schaltet den Aktor um<br />
set <name> on-for-timer <time>-> Schaltet den Aktor für <time> an<br />
set <name> on-till <time> -> schaltet den Aktor biz zur Uhrzeit <time> an<br />
</pre><br />
<br />
== Log-Auszug ==<br />
<br />
In FHEM ist nach dem Schalten des HM-LC-Sw1-Pl-2 folgendes Log zu sehen:<br />
<pre><br />
2013-11-10_16:26:28 internet level: 100 %<br />
2013-11-10_16:26:28 internet pct: 100<br />
2013-11-10_16:26:28 internet deviceMsg: on (to HMLAN0)<br />
2013-11-10_16:26:28 internet on<br />
2013-11-10_16:26:28 internet timedOn: off<br />
2013-11-10_16:26:28 internet RSSI: -55<br />
2013-11-10_16:26:28 internet RAWMSG: E1BEE7E,0000,004EC156,FF,FFC9,05A4101BEE7EF112120601C80038<br />
</pre><br />
<br />
== Probleme ==<br />
<br />
Ein Schaltaktor hatte nach einigen Wochen des ungestörten Funktionierens nur noch "MISSING ACK"s im Geräte-Log (zu den Schaltzeiten). Er schaltete auch nicht mehr zuverlässig (2 An- und 2 Ausschaltvorgänge je Tag per "at")<br />
<br />
Log-Auszug dazu:<br />
<pre><br />
2013-01-24_17:00:00 UG.AR.Luefter deviceMsg: on (to HMLAN1)<br />
2013-01-24_17:00:00 UG.AR.Luefter on<br />
2013-01-24_23:30:00 UG.AR.Luefter deviceMsg: off (to HMLAN1)<br />
2013-01-24_23:30:00 UG.AR.Luefter off<br />
2013-01-25_06:00:04 UG.AR.Luefter MISSING ACK<br />
2013-01-25_08:00:04 UG.AR.Luefter MISSING ACK<br />
2013-01-25_17:00:04 UG.AR.Luefter MISSING ACK<br />
2013-01-25_23:30:04 UG.AR.Luefter MISSING ACK<br />
2013-01-26_07:30:04 UG.AR.Luefter MISSING ACK<br />
2013-01-26_18:57:42 UG.AR.Luefter MISSING ACK<br />
2013-01-26_18:58:01 UG.AR.Luefter MISSING ACK<br />
</pre><br />
<br />
Ein Reset des Schaltaktors mit anschließendem pairen brachte Abhilfe.<br />
<pre><br />
2013-01-26_19:31:38 UG.AR.Luefter deviceMsg: on (to HMLAN1)<br />
2013-01-26_19:31:38 UG.AR.Luefter on<br />
</pre><br />
<br />
= Links =<br />
<br />
Anleitung: [http://files.elv.de/service/manuals/Homematic/74799_HM_Zwischenstecker_G_V1_0_WEB_um.pdf]<br />
<br />
[[Kategorie:HomeMatic Components]]<br />
[[Kategorie:Schalter (Empfänger)]]</div>JoeAllhttp://wiki.fhem.de/w/index.php?title=Diskussion:FHEM_und_1-Wire&diff=5288Diskussion:FHEM und 1-Wire2014-03-11T11:40:02Z<p>JoeAll: Die Seite wurde neu angelegt: „OWTHERM ist nicht mehr in contrib“</p>
<hr />
<div>OWTHERM ist nicht mehr in contrib</div>JoeAllhttp://wiki.fhem.de/w/index.php?title=Dewpoint&diff=5227Dewpoint2014-03-05T14:55:02Z<p>JoeAll: Die Seite wurde neu angelegt: „Dewpoint oder Taupunkt Um den Taupunk einfach berechnen zu können kann neben dem Modul dewpoint (http://fhem.de/commandref.html#dewpoint) auch folgendes user…“</p>
<hr />
<div>Dewpoint oder Taupunkt<br />
<br />
Um den Taupunk einfach berechnen zu können kann neben dem Modul dewpoint (http://fhem.de/commandref.html#dewpoint)<br />
auch folgendes userReading gesetzt werden. Der Code dazu wurde direkt aus dem Modul entnommen.<br />
<br />
Das Userreading hat den Vorteil, nicht mit anderen Modulen in Konflikt zu geraten.<br />
:<code>attr <Device> userReadings dew:temperature { my $dp; my $temperature = ReadingsVal($name,"temperature",0); my $humidity = ReadingsVal($name,"humidity",0); my $A = 17.2694; my $B = ($temperature > 0) ? 237.3 : 265.5; my $es = 610.78 * exp( $A * $temperature / ($temperature + $B) ); my $e = $humidity/ 100 * $es; if ($e == 0) { Log 1, "Error: dewpoint() e==0: temp=$temperature, hum=$humidity"; return 0; } my $e1 = $e / 610.78; my $f = log( $e1 ) / $A; my $f1 = 1 - $f; if ($f1 == 0) { Log 1, "Error: dewpoint() (1-f)==0: temp=$temperature, hum=$humidity"; return 0; } $dp = $B * $f / $f1 ;}</code></div>JoeAll