Integration des WOLF_ISM8I in mein Smarthome

Begonnen von AndyM, 03 Oktober 2022, 13:29:09

Vorheriges Thema - Nächstes Thema

AndyM

Ich habe seit einigen Jahren FHEM auf einem Raspberry Pi 3B im Einsatz. Ein zentraler Bereich ist hier meine Heizung von WOLF (CGB-2 20 mit BM-2), mit einem ISM8i Schnittstellenmodul. Dieses habe ich mit dem Device WOLF_ISM8I eingebunden.
Hier möchte ich gerne Beschreiben, wie ich Informationen ermittle bzw. berechne, die vom ISM8i nicht geliefert werden und wie ich diese Informationen darstelle.

Inhaltsverzeichnis

1.Voraussetzungen
2.Besonderheiten meiner Heizung
3.Fehlende Informationen des ISM8I
3.1.Betriebsart der Heizung ermitteln
3.2.Sollvorlauftemperaturen berechnen
3.3.Status des Mischers ermitteln
4.Darstellung der Heizungsinformationen
4.1.Aufbau des FLOORPLANS
A)Oberer Bereich des FLOORPLANS
B)Linker Bereich des FLOORPLANS
C)Rechter Bereich des FLOORPLANS
4.2.Änderungen an der stylesheet-Datei des Floorplans

1. Voraussetzungen

WOLF-Heizung mit ISM8i Schnittstellenmodul und das FHEM Modul 49_ISM8I.pm. Das FHEM Modul gibt es in zwei Varianten. Modul und Server getrennt und alles in einem Modul. Ich habe mittlerweile die zweite Variante im Einsatz. Die Installation und Konfiguration ist auf der Projektseite beschrieben.

2. Besonderheiten meiner Heizung

Ich habe ein Solarmodul (SM1-2) für das Brauchwasser, diese Werte werden vom ISM8i alle bereitgestellt. Die Heizung läuft mit einem Außenfühler. Mein Heizkreis (Fußbodenheizung) ist hinter einem Wärmeplattentauscher und hat eine Mischerkreispumpe und einen Mischer als Einspritzer (MM-2). Am Wärmeplattentauscher ist ein Sammlerfühler. Dadurch gibt es bei mir nur eine Heizkurve für den Mischerkreis und den Heizkurvenabstand für die Vorlauftemperatur des Heizgeräts.

3. Fehlende Informationen des ISM8I

Das ISM8I liefert keine Informationen über die aktuellen Sollvorlauftemperaturen, ob sich die Heizung im Sparbetrieb befindet (zumindest beim Zeitprogramm im Automatikbetrieb) und den Status des Mischers im Mischerkreis.

3.1. Betriebsart der Heizung ermitteln

Das Modul WOLF_ISM8I (MyWolf) liefert das aktive Zeitprogramm, aber nicht die jeweiligen Schaltzeiten. Da diese normalerweise nur selten geändert werden, habe ich sie in einem weekprofile hinterlegt (Topiks für Heizkreis und Warmwasser mit je 3 Zeitprogrammen). Wenn sich das Zeitprogramm im WOLF_ISM8I ändert, werden die Schaltzeiten des Zeitprogramms durch ein notifi an einen WeekdayTimer gesendet. Dieser sendet dann zu den Schaltzeiten den Status des Zeitprogramms an einen dummy. Welcher in einem userReading die tatsächliche Betriebsart der Heizung ermittelt (Normalbetrieb, Sparbetrieb oder Frostschutz).

Es folgen die Definitionen der Devices je für Heizkreis und Warmwasser, das weekprofile teilen sich beide.

define n_Zeitprogramme_HK notify MyWolf:Mischerkreis_1_Warmwasser_1.IO.Mischer_Zeitprogramm:.* { fhem "set Zeitprogramme_WOLF send_to_device Heizkreis:$EVTPART1 Zeitprogramme_HK" }
define n_Zeitprogramme_WW notify MyWolf:Direkter_Heizkreis_direktes_Warmwasser.IO.Warmwasser_Zeitprogramm:.* { fhem "set Zeitprogramme_WOLF send_to_device Warmwasser:$EVTPART1 Zeitprogramme_WW" }
define Zeitprogramme_WOLF weekprofile
attr Zeitprogramme_WOLF comment Warmwasser:1 Zeitprogramme_WW\
Heizkreis:3 Zeitprogramme_HK
attr Zeitprogramme_WOLF room WolfZeitWW,WolfZeitHK
attr Zeitprogramme_WOLF tempMap off:1.0,on:2.0
attr Zeitprogramme_WOLF useTopics 1
attr Zeitprogramme_WOLF widgetTempRange 1:2:1
attr Zeitprogramme_WOLF widgetWeekdays Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag,Sonntag

define Zeitprogramme_HK WeekdayTimer HK_Betriebsart weekprofile:Zeitprogramme_WOLF
attr Zeitprogramme_HK userattr weekprofile
attr Zeitprogramme_HK commandTemplate set $NAME  $EVENT
attr Zeitprogramme_HK devStateIcon {my $onl = ReadingsVal($name,'currValue','NA');;my $weather_night = FW_makeImage('weather_night');;my $weather_sun = FW_makeImage('weather_sun');;if ($onl eq 'off') {$onl = $weather_night} elsif ($onl eq 'on') {$onl = $weather_sun} else {$onl = '<div>Fehler: '.$onl.'</div>'};;my $ZP = ReadingsVal($name,'weekprofiles','0');;$ZP = substr($ZP,length($ZP)-1,1);;my $UD = ReadingsVal($name,'nextUpdate','Fehlt');;qq($onl<div>Zeitprogramm: $ZP</div><div>Update: $UD</div>)}

define Zeitprogramme_WW WeekdayTimer WW_Betriebsart weekprofile:Zeitprogramme_WOLF
attr Zeitprogramme_WW userattr weekprofile
attr Zeitprogramme_WW commandTemplate set $NAME  $EVENT
attr Zeitprogramme_WW devStateIcon {my $onl = ReadingsVal($name,'currValue','NA');;my $weather_night = FW_makeImage('weather_night');;my $weather_sun = FW_makeImage('weather_sun');;if ($onl eq 'off') {$onl = $weather_night} elsif ($onl eq 'on') {$onl = $weather_sun} else {$onl = '<div>Fehler: '.$onl.'</div>'};;my $ZP = ReadingsVal($name,'weekprofiles','0');;$ZP = substr($ZP,length($ZP)-1,1);;my $UD = ReadingsVal($name,'nextUpdate','Fehlt');;qq($onl<div>Zeitprogramm: $ZP</div><div>Update: $UD</div>)}

define HK_Betriebsart dummy
attr HK_Betriebsart devStateIcon Normalbetrieb:weather_sun@red Sparbetrieb:weather_night@blue Frostschutz:weather_frost@blue
attr HK_Betriebsart fp_Heizung 87,62,0,
attr HK_Betriebsart stateFormat Betriebsart
attr HK_Betriebsart userReadings Betriebsart {\
my $Betrieb = ReadingsVal("MyWolf","Direkter_Heizkreis_direktes_Warmwasser.57.IO.Programmwahl_Heizkreis",0);;\
my $State = ReadingsVal($name,"state",0);;\
if ($Betrieb eq 'Automatikbetrieb') {$Betrieb = $State eq 'off'?'Sparbetrieb':'Normalbetrieb'}\
elsif($Betrieb eq 'Heizbetrieb') {$Betrieb = 'Normalbetrieb'}\
elsif($Betrieb eq 'Standby') {$Betrieb = 'Frostschutz'}\
else {$Betrieb = $Betrieb};;\
return $Betrieb;;\
}

define WW_Betriebsart dummy
attr WW_Betriebsart devStateIcon Normalbetrieb:weather_sun Sparbetrieb:weather_night Frostschutz:weather_frost
attr WW_Betriebsart fp_Heizung 275,850,0,
attr WW_Betriebsart stateFormat Betriebsart
attr WW_Betriebsart userReadings Betriebsart {\
my $Betrieb = ReadingsVal("MyWolf","Direkter_Heizkreis_direktes_Warmwasser.58.IO.Programmwahl_Warmwasser",0);;\
my $State = ReadingsVal($name,"state",0);;\
if ($Betrieb eq 'Automatikbetrieb') {$Betrieb = $State eq 'off'?'Sparbetrieb':'Normalbetrieb'}\
elsif($Betrieb eq 'Permanent') {$Betrieb = 'Normalbetrieb'}\
elsif($Betrieb eq 'Standby') {$Betrieb = 'Frostschutz'}\
else {$Betrieb = $Betrieb};;\
return $Betrieb;;\
}


Noch nicht unterstützt werdn der Urlaubs- und der Partymodus.

3.2. Sollvorlauftemperaturen berechnen

Im Modul WOLF_ISM8I (MyWolf) habe ich die Parameter, die die eingestellte Heizkurve festlegen, als userAttribute hinterlegt.

attr MyWolf userattr Mischerkreis_Normaussentemperatur_Heizkurve Mischerkreis_Sockeltemperatur_Heizkurve Mischerkreis_Startpunkt_Heizkurve Mischerkreis_Vorlauftemperatur_Heizkurve Systembedienmodul_Winter_Sommer_Umschaltung Systembedienmodul_A12_Absenkstopp Systembedienmodul_ECO_Abs Systembedienmodul_Heizkurvenabstand
attr MyWolf Mischerkreis_Normaussentemperatur_Heizkurve -12
attr MyWolf Mischerkreis_Sockeltemperatur_Heizkurve 23
attr MyWolf Mischerkreis_Startpunkt_Heizkurve 16
attr MyWolf Mischerkreis_Vorlauftemperatur_Heizkurve 36
attr MyWolf Systembedienmodul_A12_Absenkstopp -16
attr MyWolf Systembedienmodul_ECO_Abs 10
attr MyWolf Systembedienmodul_Heizkurvenabstand 4
attr MyWolf Systembedienmodul_Winter_Sommer_Umschaltung 20


Die Sollvorlauftemperaturen werden in den userReadings Custom.911.Mischerkreis_Soll und Custom.912.Heizgeraet_Soll berechnet. Dazu werden die zuvor angelegten userAttribute und die tatsächliche Betriebsart der Heizung verwendet. Die userReadings *_Zeitprogramm ermitteln das aktive Zeitprogramm und sind für die notifis der Betriebsart der Heizung wichtig.

attr MyWolf userReadings
Custom.911.Mischerkreis_Soll {\
if(ReadingsVal("HK_Betriebsart","Betriebsart",0) eq 'Normalbetrieb') {return Mischerkreis_Soll()}\
  elsif(ReadingsVal("HK_Betriebsart","Betriebsart",0) eq 'Sparbetrieb') {return Mischerkreis_Spar_Soll()}\
  else {return 5};;},\
Custom.912.Heizgeraet_Soll {\
my $wert;;\
if(ReadingsVal("HK_Betriebsart","Betriebsart",0) eq 'Normalbetrieb') {$wert = Mischerkreis_Soll()}\
  elsif(ReadingsVal("HK_Betriebsart","Betriebsart",0) eq 'Sparbetrieb') {$wert = Mischerkreis_Spar_Soll()}\
  else {$wert = 5};;\
if ($wert > 5) {$wert = $wert + AttrVal("MyWolf","Systembedienmodul_Heizkurvenabstand",10)}\
  else { $wert =  $wert};;\
  return $wert;;},\
Direkter_Heizkreis_direktes_Warmwasser.IO.Heizkreis_Zeitprogramm {ReadingsVal("MyWolf","Direkter_Heizkreis_direktes_Warmwasser.59.IO.Heizkreis_Zeitprogramm_1",0) eq "An" ? "1" : ReadingsVal("MyWolf","Direkter_Heizkreis_direktes_Warmwasser.60.IO.Heizkreis_Zeitprogramm_2",0) eq "An" ? "2" : ReadingsVal("MyWolf","Direkter_Heizkreis_direktes_Warmwasser.61.IO.Heizkreis_Zeitprogramm_3",0) eq "An" ? "3" : "Err"},\
Direkter_Heizkreis_direktes_Warmwasser.IO.Warmwasser_Zeitprogramm {ReadingsVal("MyWolf","Direkter_Heizkreis_direktes_Warmwasser.62.IO.Warmwasser_Zeitprogramm_1",0) eq "An" ? "1" : ReadingsVal("MyWolf","Direkter_Heizkreis_direktes_Warmwasser.63.IO.Warmwasser_Zeitprogramm_2",0) eq "An" ? "2" : ReadingsVal("MyWolf","Direkter_Heizkreis_direktes_Warmwasser.64.IO.Warmwasser_Zeitprogramm_3",0) eq "An" ? "3" : "Err"},\
Mischerkreis_1_Warmwasser_1.IO.Mischer_Zeitprogramm {ReadingsVal("MyWolf","Mischerkreis_1_Warmwasser_1.72.IO.Mischer_Zeitprogramm_1",0) eq "An" ? "1" : ReadingsVal("MyWolf","Mischerkreis_1_Warmwasser_1.73.IO.Mischer_Zeitprogramm_2",0) eq "An" ? "2" : ReadingsVal("MyWolf","Mischerkreis_1_Warmwasser_1.74.IO.Mischer_Zeitprogramm_3",0) eq "An" ? "3" : "Err"}


Die Funktionen Mischerkreis_Soll() und Mischerkreis_Spar_Soll() sind in einer eigenen Programmdatei (99_myUtils.pm) gespeichert.

sub
Mischerkreis_Soll () {
my $Normaussentemperatur = AttrVal("MyWolf","Mischerkreis_Normaussentemperatur_Heizkurve",0);
my $Sockeltemperatur = AttrVal("MyWolf","Mischerkreis_Sockeltemperatur_Heizkurve",0);
my $Startpunkt = AttrVal("MyWolf","Mischerkreis_Startpunkt_Heizkurve",0);
my $Vorlauftemperatur = AttrVal("MyWolf","Mischerkreis_Vorlauftemperatur_Heizkurve",0);
my $W_S_Umschaltung = AttrVal("MyWolf","Systembedienmodul_Winter_Sommer_Umschaltung",20);
my $Absenkstopp = AttrVal("MyWolf","Systembedienmodul_A12_Absenkstopp",-16);
my $ECO = AttrVal("MyWolf","Systembedienmodul_ECO_Abs",10);
my $Aussentemperatur = ReadingsVal("MyWolf","Systembedienmodul.54.O.Aussentemperatur.C",0);
my $Sollwertkorrektur = ReadingsVal("MyWolf","Direkter_Heizkreis_direktes_Warmwasser.65.IO.Sollwertkorrektur.K",0);
my $Sparfaktor = ReadingsVal("MyWolf","Direkter_Heizkreis_direktes_Warmwasser.66.IO.Sparfaktor.K",4);
my $Steigung = -($Vorlauftemperatur - $Sockeltemperatur) / ($Normaussentemperatur - $Startpunkt);
my $T_vl = ($Vorlauftemperatur - $Sockeltemperatur) / ($Normaussentemperatur - $Startpunkt) * ($Aussentemperatur - $Startpunkt) + $Sockeltemperatur;
if($Aussentemperatur > $W_S_Umschaltung){$T_vl = 5}
  elsif($Aussentemperatur > $Startpunkt){$T_vl = $Sockeltemperatur};
my $wert = $T_vl + ($Vorlauftemperatur - $Sockeltemperatur) / 10 * $Sollwertkorrektur;
if($Aussentemperatur > $W_S_Umschaltung){$wert = 5}
  elsif($Aussentemperatur > $Startpunkt){$wert = $Sockeltemperatur + ($Vorlauftemperatur - $Sockeltemperatur) / 10 * $Sollwertkorrektur};
return sprintf ("%0.1f",$wert);
}

sub
Mischerkreis_Spar_Soll () {
my $Normaussentemperatur = AttrVal("MyWolf","Mischerkreis_Normaussentemperatur_Heizkurve",0);
my $Sockeltemperatur = AttrVal("MyWolf","Mischerkreis_Sockeltemperatur_Heizkurve",0);
my $Startpunkt = AttrVal("MyWolf","Mischerkreis_Startpunkt_Heizkurve",0);
my $Vorlauftemperatur = AttrVal("MyWolf","Mischerkreis_Vorlauftemperatur_Heizkurve",0);
my $W_S_Umschaltung = AttrVal("MyWolf","Systembedienmodul_Winter_Sommer_Umschaltung",20);
my $Absenkstopp = AttrVal("MyWolf","Systembedienmodul_A12_Absenkstopp",-16);
my $ECO = AttrVal("MyWolf","Systembedienmodul_ECO_Abs",10);
my $Aussentemperatur = ReadingsVal("MyWolf","Systembedienmodul.54.O.Aussentemperatur.C",0);
my $Sollwertkorrektur = ReadingsVal("MyWolf","Direkter_Heizkreis_direktes_Warmwasser.65.IO.Sollwertkorrektur.K",0);
my $Sparfaktor = ReadingsVal("MyWolf","Direkter_Heizkreis_direktes_Warmwasser.66.IO.Sparfaktor.K",4);
my $T_vl = ($Vorlauftemperatur - $Sockeltemperatur) / ($Normaussentemperatur - $Startpunkt) * ($Aussentemperatur - $Startpunkt) + $Sockeltemperatur;
if($Aussentemperatur > $W_S_Umschaltung){$T_vl = 5}
  elsif($Aussentemperatur > $Startpunkt){$T_vl = $Sockeltemperatur};
my $wert = $T_vl + ($Vorlauftemperatur - $Sockeltemperatur) / 10 * $Sollwertkorrektur;
if($Aussentemperatur > $W_S_Umschaltung) {$wert = 5}
  elsif($Aussentemperatur > $Startpunkt){$wert = $Sockeltemperatur + ($Vorlauftemperatur - $Sockeltemperatur) / 10 * $Sollwertkorrektur};
if($Aussentemperatur > $ECO) {$wert = 5}
  elsif($Aussentemperatur < $Absenkstopp) {$wert = $wert}
  else {$wert = $wert - ($Vorlauftemperatur - $Sockeltemperatur) / 10 * $Sparfaktor};
return sprintf ("%0.1f",$wert);
}


3.3. Status des Mischers ermitteln

Den Mischer musste ich etwas umbauen, da die Heizung selbst nur Impulse zum Öffnen und Schließen an ihn sendet. Somit kennt sie auch den Status des Mischers nicht. Ich habe in die Mitte der Anzeigeblende ein kleines Loch gemacht und einen Potentiometer (5kOhm) befestigt. Dessen Stellung lese ich mit einem Wemos D1 mini aus. Der Wemos D1 mini ist mit EasyESP geflasht und hat noch weitere Sensoren. An FHEM angebunden ist er mit einer ESPEasy bridge.

Das Potentiometer ist als Analog input – internal (Task 1) am Analogeneingang des Wemos angeschlossen. Über eine Rule wird aus dem Wert des Potentiometer (Analog input) ein Prozentwert für den Status des Mischers berechnet und in einem Generic - Dummy Device (Task 6) gesetzt. Dieses Device sendet den Wert dann an FHEM. Es gibt neben dem Prozentwert noch ErrLessMin und ErrGreaterMax, falls der Wert des Potentiometer die eingestellten Begrenzungen von 283 (100%) und 716 (0%) über- bzw. unterschreitet. Diese Werte sind natürlich individuell zu ermitteln.

Im Screenshot sind noch weitere Analoggeräte zu sehen. Diese habe ich mit einem 74HC4051 gemeinsam an den einzigen analogen Eingang des Wemos angeschlossen. Die Ansteuerung erfolgt auch mit Rules, ist aber ein anderes Thema und wird für den Mischer nicht benötigt.

Rule in EasyESP
On System#Boot do
  timerSet,1,5
endon

On Rules#Timer=1 do
  Let,1,255                      //100% Auf 283
  Let,2,688                      //0% Zu 716
  Let,3,([VAR#2]-[VAR#1])/100    //1%
  Let,4,100-([Analog#Analog]-[VAR#1])/[VAR#3] //Prozentwert berechnet
  if [VAR#4]<0 //Prozent unter 0
    Let,4,0                      //0 zuweisen
    if [Mischermotor#ErrLessMin]>[Analog#Analog]
      TaskValueSet,6,2,[Analog#Analog]       //ErrLessMin
    endif
  endif
  if [VAR#4]>100                //Prozent ueber 100
    Let,4,100                   //0 zuweisen
    if [Mischermotor#ErrGreaterMax]<[Analog#Analog]
      TaskValueSet,6,3,[Analog#Analog]       //ErrGreaterMax
    endif
  endif
  TaskValueSet,6,1,[VAR#4]     //Uebergabe an Device Dummy
  timerSet,1,1
endon




4. Darstellung der Heizungsinformationen

Die Informationen meiner Heizung stelle ich auf einem FLOORPLAN dar, den ich über einen weblink in das FHEM-Menü eingebunden habe. An der Datei darkfloorplanstyle.css musste ich noch Änderungen vornehmen, damit diese Konstellation funktioniert. Diese sind an Ende beschrieben.

define Heizung FLOORPLAN
attr Heizung fp_arrange 0
attr Heizung fp_noMenu 1
attr Heizung stylesheet darkfloorplanstyle.css


define Heizung_Schema weblink iframe https://<IP-ADRESSE>/fhem/floorplan/Heizung" width="1320" height="1890" frameborder="0"
attr Heizung_Schema nodetaillink 1
attr Heizung_Schema room <ROOM>


4.1. Aufbau des FLOORPLANS

A) Im oberen Bereich Bereich des FLOORPLANS ist eine schematische Darstellung meiner Heizung mit allen aktuellen Temperaturen, Mischerstellungen und anderen Statusinformationen. Diese Informationen werden mittels readingsProxys angezeigt. Die dargestellten Symbole wechseln zwischen An (Grün) und Aus (Schwarz), der Mischer hat unterschiedliche Symbole in 10%-Schritten (0-4%, 5-14%, ...). Die Namen der zugehörigen Symbole sind MM_0, MM_10, ... .
Siehe die Beispiele der readingsProxy unter der Tabelle

B) Darunter sind auf der linken Seite SVG-Plots, die die meisten Informationen der Heizung im zeitlichen verlauf darstellen.

C) Auf der rechten Seite sind aktuelle Infos in einer readingsGroup, die nicht in die schematische Darstellung passten.

Eine Liste mit Devices, die auf dem FLOORPLAN dargestellt sind.

DeviceXYStyleDeviceTyp
ESPEasy_Heizung_HK_Druck400800 (Icon only)readingsProxy
ESPEasy_Heizung_Mischermotor268-240 (Icon only)readingsProxy
ESPEasy_Heizung_Temp421460 (Icon only)readingsProxy
HK_Betriebsart87620 (Icon only)dummy
MyWolf_3WegeUmschaltventil3333590 (Icon only)readingsProxy
MyWolf_Abgastemperatur904600 (Icon only)readingsProxy
MyWolf_Anlagendruck2683860 (Icon only)readingsProxy
MyWolf_Aussentemperatur51612550 (Icon only)readingsProxy
MyWolf_Brenner_Flamme1844070 (Icon only)readingsProxy
MyWolf_Heizkreispumpe2664860 (Icon only)readingsProxy
MyWolf_Kesseltemperatur1673690 (Icon only)readingsProxy
MyWolf_Mischerkreis41-10 (Icon only)readingsProxy
MyWolf_Mischerkreispumpe146-40 (Icon only)readingsProxy
MyWolf_Modulationsgrad_Brennerleistung2144350 (Icon only)readingsProxy
MyWolf_Ruecklauftemperatur1684840 (Icon only)readingsProxy
MyWolf_Ruecklauftemperatur_Solar4359620 (Icon only)readingsProxy
MyWolf_Sammlertemperatur4611300 (Icon only)readingsProxy
MyWolf_Solarkreispumpe2529750 (Icon only)readingsProxy
MyWolf_Temperatur_Kollektor339640 (Icon only)readingsProxy
MyWolf_Warmwassertemperatur2377340 (Icon only)readingsProxy
MyWolf_Warmwassertemperatur_Solar5078090 (Icon only)readingsProxy
SVG_1_Heizung_Abgastemperatur64520 (Icon only)SVG
SVG_2_Heizung_Brenner83020 (Icon only)SVG
SVG_3_Heizung_Aussentempertatur99720 (Icon only)SVG
SVG_4_Heizung_Solarmodul115920 (Icon only)SVG
SVG_5_Heizung_CGB_2_Temperaturen132120 (Icon only)SVG
SVG_6_Heizung_Pumpenstartus152320 (Icon only)SVG
SVG_7_Heizung_Raumtemperatur168520 (Icon only)SVG
WW_Betriebsart2758500 (Icon only)dummy
Wolf6457810 (Icon only)readingsGroup

Zu A) Hier sind drei unterschiedliche readingsProxys aus dem oberen Bereich des FLOORPLANS als Beispiele.

readingsProxy - ESPEasy_Heizung_Mischermotor
define ESPEasy_Heizung_Mischermotor ESPEasy 192.168.178.44 80 ESPEasy_1 Heizung_Mischermotor
attr ESPEasy_Heizung_Mischermotor IODev ESPEasy_1
attr ESPEasy_Heizung_Mischermotor Interval 300
attr ESPEasy_Heizung_Mischermotor devStateIcon ^[0-4][%]$:MM_0 ^[5-9][%]$|^[1][0-4][%]$:MM_10 ^[1][5-9][%]$|^[2][0-4][%]$:MM_20 ^[2][5-9][%]$|^[3][0-4][%]$:MM_30 ^[3][5-9][%]$|^[4][0-4][%]$:MM_40 ^[4][5-9][%]$|^[5][0-4][%]$:MM_50 ^[5][5-9][%]$|^[6][0-4][%]$:MM_60 ^[6][5-9][%]$|^[7][0-4][%]$:MM_70 ^[7][5-9][%]$|^[8][0-4][%]$:MM_80 ^[8][5-9][%]$|^[9][0-4][%]$:MM_90 ^[9][5-9][%]$|^[1][0][0][%]$:MM_100
attr ESPEasy_Heizung_Mischermotor event-on-change-reading Prozent
attr ESPEasy_Heizung_Mischermotor fp_Heizung 268,-24,0,ESPEasy_Heizung_Mischermotor,
attr ESPEasy_Heizung_Mischermotor group ESPEasy Device
attr ESPEasy_Heizung_Mischermotor presenceCheck 1
attr ESPEasy_Heizung_Mischermotor readingSwitchText 1
attr ESPEasy_Heizung_Mischermotor setState 3
attr ESPEasy_Heizung_Mischermotor stateFormat Prozent%


readingsProxy - MyWolf_Aussentemperatur
define MyWolf_Aussentemperatur readingsProxy MyWolf:Heizgeraet_1_TOB_CGB2_MGK2.8.O.Aussentemperatur.C
attr MyWolf_Aussentemperatur fp_Heizung 516,1255,0,MyWolf_Aussentemperatur,
attr MyWolf_Aussentemperatur stateFormat state°C<br>\
(gemittelt)°C)
attr MyWolf_Aussentemperatur userReadings gemittelt {ReadingsVal("MyWolf","Systembedienmodul.54.O.Aussentemperatur.C",0)}


readingsProxy - MyWolf_Mischerkreispumpe
define MyWolf_Mischerkreispumpe readingsProxy MyWolf:Mischermodul_1.117.O.Status_Mischerkreispumpe
attr MyWolf_Mischerkreispumpe devStateIcon Aus.*:MK-Pumpe_Aus An.*:MK-Pumpe_An
attr MyWolf_Mischerkreispumpe fp_Heizung 146,-4,0,MyWolf_Mischerkreispumpe,


Zu C) Die readingsGroup auf der rechten Seite des FLOORPLANS hat folgenden Aufbau.

define Wolf readingsGroup <>,<<b><u><a href="../../fhem?detail=MyWolf" target="_parent"><img src="../../../fhem/images/heizung/MyWolf.png" alt="MyWolf" height="50"></a></u></b>>,<>\
MyWolf:state,_WOLF_LAST_READING\
Wolf:!Update,!Restart\
<hr>\
<<b><u>Heizgerät</u></b>>,<>,<<u><a href="../../../fhem/Anleitungen/BM-2_montageanleitung_experte.pdf" target="_blank">Bedienmodul BM-2.pdf</a></br><a href="../../../fhem/Anleitungen/CGB-2_K_Montageanleitung_Fachhandwerker.pdf" target="_blank">CGB-2 20.pdf</a></u>>\
MyWolf_Betriebsart:state,<>\
MyWolf_Sollwertkorrektur:state,!SollwertkorrekturSetzen@MyWolf\
MyWolf_Sparfaktor:state,!SparfaktorSetzen@MyWolf\
<hr>\
<<b><u>Warmwasser</u></b>>,<>,<>\
MyWolf_Warmwassersolltemperatur:state,!WarmwassersolltemperaturSetzen@MyWolf\
MyWolf_Programmwahl_Warmwasser:state,!Programmwahl_WarmwasserSetzen@MyWolf\
MyWolf_1x_Warmwasserladung_gobal:state,!Warmwasserladung_gobalSetzen@MyWolf\
MyWolf_Warmwasser_Zeitprogramm:state,<>\
<hr>\
<<b><u>Mischerkreis</u></b>>,<>,<<u><a href="../../../fhem/Anleitungen/MM-2_mischermodul.pdf" target="_blank">MM-2.pdf</a></u>>\
MyWolf_Programmwahl_Heizkreis:state,!Programmwahl_HeizkreisSetzen@MyWolf\
MyWolf_Mischer_Zeitprogramm:state,<>\
<hr>\
<<b><u>Solarkreis</u></b>>,<>,<<u><a href="../../../fhem/Anleitungen/SM1_Solarmodul_WRS_Montage-und_Bedienungsanleitung.pdf" target="_blank">SM 1-2.pdf</a></u>>\
MyWolf_SolarDurchfluss:state,<>\
MyWolf_Solaraktuelle_Leistung:state,<>\
MyWolf_SolarTagesertrag:state,<>\
MyWolf_SolarGesamtertrag:state,<>\
<hr>\
<<b><u>Stoerung</u></b>>,<>,<>\
MyWolf_Systembedienmodul_Stoerung:state,<>\
MyWolf_Heizgeraet_TOB_CGB2_MGK2_Stoerung:state,<>\
MyWolf_Mischermodul_Stoerung:state,<>\
MyWolf_Solarmodul_Stoerung:state,<>\
MyWolf_Mischerkreis_Warmwasser_Stoerung:state,<>
attr Wolf cellStyle {"r:1,c:2" => 'style="text-align:center;; font-size:20px;; color:red"',\
"r:5,c:2" => 'style="text-align:right;; font-size:12px"',\
"r:5,c:3" => 'style="text-align:right;; font-size:12px"',\
"r:16,c:3" => 'style="text-align:right;; font-size:12px;;"',\
"r:20,c:3" => 'style="text-align:right;; font-size:12px;;"'\
}
attr Wolf commands {\
'Wolf.Update' => "set MyWolf GetAllDate",\
'Wolf.Restart' => "set MyWolf Reconnect",\
'SollwertkorrekturSetzen' => 'Direkter_Heizkreis_direktes_Warmwasser.65.Sollwertkorrektur.K:',\
'SparfaktorSetzen' => 'Direkter_Heizkreis_direktes_Warmwasser.66.Sparfaktor.K:',\
'WarmwassersolltemperaturSetzen' => 'Direkter_Heizkreis_direktes_Warmwasser.56.Warmwassersolltemperatur.C:',\
'Programmwahl_WarmwasserSetzen' => 'Direkter_Heizkreis_direktes_Warmwasser.58.Programmwahl_Warmwasser:Automatikbetrieb,Permanent,Standby',\
'Warmwasserladung_gobalSetzen' => 'Systembedienmodul.194.1x_Warmwasserladung_gobal:Aus,An',\
'Programmwahl_HeizkreisSetzen' => 'Direkter_Heizkreis_direktes_Warmwasser.57.Programmwahl_Heizkreis:Automatikbetrieb,Permanent,Standby,Sparbetrieb'\
}
attr Wolf fp_Heizung 645,781,0,Wolf,
attr Wolf mapping {'Wolf' => '',\
'MyWolf' => ''}
attr Wolf nameStyle style="text-align:left"
attr Wolf noheading 1
attr Wolf nolinks 1
attr Wolf notime 1
attr Wolf room hidden
attr Wolf style style="font-size:16px;;color:lightgray"
attr Wolf valueIcon {state => '%devStateIcon',\
'Wolf.Restart' => 'refresh@orange',\
'Wolf.Update' => 'audio_repeat'\
}
attr Wolf valuePrefix {'MyWolf_Warmwasser_Zeitprogramm.state' => '<a href="../../fhem?room=WolfZeitWW" target="_parent">',\
'MyWolf_Mischer_Zeitprogramm.state' => '<a href="../../fhem?room=WolfZeitHK" target="_parent">'}
attr Wolf valueSuffix {'MyWolf_Warmwasser_Zeitprogramm.state' => '</a>',\
'MyWolf_Mischer_Zeitprogramm.state' => ' </a>'}



4.2. Änderungen an der stylesheet-Datei des Floorplans

Ich habe an der Datei darkfloorplanstyle.css noch folgende Änderungen vorgenommen und sie im Attribut stylesheet des Floorplans eingetragen. Bei anderen Styls könnten die Änderungen vielleicht etwas abweichen.

Die Änderungen in Zeile 1 und 4 sind für die Verwendung des Floorplans im FHEM-Menü mittels weblink.

In Zeile 1 habe ich background-image:url(../images/default/fhemicon_dark.png); entfernt.
body     { background-color: #444444; font-family:Arial, Helvetica, sans-serif; font-size:13px; background-repeat:no-repeat; }

In Zeile 4 habe ich die Werte für top und left auf 0 gesetzt.
#backimg {position:absolute; top:0px; left:0px;}

Damit die SVG-Plots funktionieren, müssen die folgenden Zeilen am Ende der Datei darkfloorplanstyle.css angefügt werden. Die ersten drei Zeilen sind für das Kontextmenü der SVG-Plots. Die restlichen Zeilen blenden die Menüleisten (Plus, Minus, Zurück, Vor) der einzelnen SVG-Plots aus, so dass nur noch die vom Obersten SVG-Plot dargestellt wird. Da alle SVG-Plots gemeinsam auf die Menübefehle reagieren, reicht eine Menüleiste aus.

Zeilen am Ende angefügt.
ul#fwmenu { position: absolute; z-index: 1005; text-align: left; max-width: 600px; font-weight: normal; font-size: 100%; background: black; border: 1px solid white;}
div#svgmarker {position: absolute; z-index: 1005; padding: 6px 10px; text-align: left; max-width: 600px; color: white; background: black; border: 2px solid white; border-radius: 4px;}
#fwmenu li a {color: white;}
#SVG_2_Heizung_Brenner svg.Zoom-in { height:0px; width:0px; }
#SVG_2_Heizung_Brenner svg.Zoom-out { height:0px; width:0px; }
#SVG_2_Heizung_Brenner svg.Prev { height:0px; width:0px; }
#SVG_2_Heizung_Brenner svg.Next { height:0px; width:0px; }
#SVG_3_Heizung_Aussentempertatur svg.Zoom-in { height:0px; width:0px; }
#SVG_3_Heizung_Aussentempertatur svg.Zoom-out { height:0px; width:0px; }
#SVG_3_Heizung_Aussentempertatur svg.Prev { height:0px; width:0px; }
#SVG_3_Heizung_Aussentempertatur svg.Next { height:0px; width:0px; }
#SVG_4_Heizung_Solarmodul svg.Zoom-in { height:0px; width:0px; }
#SVG_4_Heizung_Solarmodul svg.Zoom-out { height:0px; width:0px; }
#SVG_4_Heizung_Solarmodul svg.Prev { height:0px; width:0px; }
#SVG_4_Heizung_Solarmodul svg.Next { height:0px; width:0px; }
#SVG_5_Heizung_CGB_2_Temperaturen svg.Zoom-in { height:0px; width:0px; }
#SVG_5_Heizung_CGB_2_Temperaturen svg.Zoom-out { height:0px; width:0px; }
#SVG_5_Heizung_CGB_2_Temperaturen svg.Prev { height:0px; width:0px; }
#SVG_5_Heizung_CGB_2_Temperaturen svg.Next { height:0px; width:0px; }
#SVG_6_Heizung_Pumpenstartus svg.Zoom-in { height:0px; width:0px; }
#SVG_6_Heizung_Pumpenstartus svg.Zoom-out { height:0px; width:0px; }
#SVG_6_Heizung_Pumpenstartus svg.Prev { height:0px; width:0px; }
#SVG_6_Heizung_Pumpenstartus svg.Next { height:0px; width:0px; }
#SVG_7_Heizung_Raumtemperatur svg.Zoom-in { height:0px; width:0px; }
#SVG_7_Heizung_Raumtemperatur svg.Zoom-out { height:0px; width:0px; }
#SVG_7_Heizung_Raumtemperatur svg.Prev { height:0px; width:0px; }
#SVG_7_Heizung_Raumtemperatur svg.Next { height:0px; width:0px; }