S7 Beispielkonfiguration
Dieser Artikel beschreibt eine Beispielkonfiguration für die SPS-Hardware Siemens S5. Eine Anpassung an die S7 bzw. Logo ist mit meist sehr geringem Aufwand möglich, weil das selbe Modul verwendet werden kann. Ausgangspunkt ist eine seit 1997 gewachsene S5-95U-Haussteuerung. Inzwischen wurde diese um eine FHEM-Anbindung in einer Docker-Umgebung ergänzt. Ich demonstriere die vorhandenen Möglichkeiten, indem ich meinen Arbeitsfortschritt ab 2012 chronologisch dokumentiere.
Status von S5-Ausgängen in FHEM anzeigen [2012]
Nachdem der FHEM-Host z.B. ein Raspberry Pi über die normale Programmierleitung wie hier beschrieben verbunden ist, können auf der FHEM-Kommandozeile im WEB-Interface folgende Befehle eingegeben werden.
Bei mir wird die biologische Nachklärung des Abwassers mit einem Launhardt-Reaktor erledigt. Drei Pumpen werden durch die S5-Ausgänge A13.0 .. A13.2 zeitgesteuert geschaltet. In FHEM soll der Status der Ausgänge angezeigt werden. Dazu müssen nur die betreffenden Ausgänge in FHEM bekannt gemacht werden. Änderungen am S5-Programm sind nicht notwendig.
define s5test S7 S5 /dev/ttyAMA0
define Abpumpen S7_DRead outputs 0 13.0 attr Abpumpen IODev s5test attr Abpumpen icon icoBaum attr Abpumpen room Abwasser attr Abpumpen sortby 03
define Umpumpen S7_DRead outputs 0 13.1 attr Umpumpen IODev s5test attr Umpumpen icon audio_repeat attr Umpumpen room Abwasser attr Umpumpen sortby 02
define Zupumpen S7_DRead outputs 0 13.2 attr Zupumpen IODev s5test attr Zupumpen icon scene_toilet_alternat attr Zupumpen room Abwasser attr Zupumpen sortby 01
vorhandene S5-Lampensteuerung um FHEM ergänzen
Das S5-Programm für das Schalten der Beleuchtung mittels Taster soll auch bei ausgefallenem FHEM funktionieren wie bisher. Dazu schaltet FHEM spezielle Merker, die dann per ODER mit den anderen Eingängen verknüpft werden, hier Merker M 65.0 (vier ergänzte Zeilen):
NETZWERK 12 Arbeitszimmer 00AC :U( 00AD :U( 00AE :O E 64.7 Taster im Arbeitszimmer 00AF :O M 65.0 Merker für FHEM 00B0 :) 00B1 :UN M 61.4 Flankenmerker 00B2 :S A 65.7 Lampe Arbeiten Giebel 00B3 :U( 00B4 :O E 64.7 Taster im Arbeitszimmer 00B5 :O M 65.0 Merker für FHEM 00B6 :) 00B7 :U M 61.4 Flankenmerker 00B8 :R A 65.7 Lampe Arbeiten Giebel 00B9 :U A 65.7 Lampe Arbeiten Giebel 00BA :) 00BB :UN E 64.7 Taster im Arbeitszimmer 00BC :UN M 65.0 Merker für FHEM 00BD :S M 61.4 Flankenmerker 00BE :UN E 64.7 Taster im Arbeitszimmer 00BF :UN M 65.0 Merker für FHEM 00C0 :UN A 65.7 Lampe Arbeiten Giebel 00C1 :R M 61.4 Flankenmerker 00C2 :NOP 0 :***
zugehörige FHEM-Konfiguration:
define s5test S7 S5 /dev/ttyAMA0 #FHEM Hardwarezugriff konfigurieren
define M65.0 S7_DWrite flags 0 65.0 #S5-Merker M65.0 für FHEM-Schreibzugriff attr M65.0 IODev s5test #M65.0 an /dev/ttyAMA0 ist gemeint attr M65.0 eventMap /on-for-timer 1 /trigger:tasten #1-s-Impuls außerdem Web: trigger -> tasten attr M65.0 icon light_pendant_light #Standard-Icon ersetzen attr M65.0 room Arbeitszimmer #Raumzuordnung zur optischen Gruppierung attr M65.0 webCmd tasten #Button auf Weboberfläche gelabelt als "tasten"
Das Merkerbyte 65 muss für den FHEM-Schreibzugriff reserviert sein. Die Lampe kann nun zusätzlich über das Webinterface oder die Smartphone-App geschaltet werden.
Namenskonvention für S5-FHEM-Projekt
Um ein gewachsenes Projekt mit erträglichem Aufwand in die neue Zeit zu retten, dabei die Übersicht nicht zu verlieren, hat sich in Anlehnung an FISCHER-NET.DE ein strukturiertes Namensschema bewährt. Die langen FHEM-Namen passen nur als Symbolik-Kommentar in die S5. Ergänzung 2022: Die Punkte als Trennzeichen habe ich inzwischen durch Unterstriche ersetzt, um die leichter Regex in FHEM verwenden zu können.
Der Aufbau der Namen: A.B.C.D ab 2022 als A_B_C_D
A Ort im Gebäude oder auf dem Grundstück B Raum oder nähere Örtlichkeit C Gerät D Zweck
Heizungsvorlauf Temperatursensor im Obergeschoss: OG.hr.DS1820.Hz_VL
Rollladen im Schlafzimmer öffnen: OG.sz.M1763.RlHo
A ID Beschreibung KG Kellergeschoß EG Erdgeschoß OG Obergeschoß SB Spitzboden AB Außenbereich B ID Beschreibung wa Wanne du Dusche wz Wohnen, Weg fl Flur cp Carport hr Heizung hv Holzvergaser k Keller ku Küche sz Straße sz Schlafen C <Gerätename> D <Zweck>
FHEM-S5-Lampensteuerung tastbar um ein/aus ergänzen
Bei einem Wandtaster kann entschieden werden, welchen Zustand die Lampe hat, weil man sie sieht. Anders beim Webinterface, hier wäre ein gezieltes ein- bzw. ausschalten besser, weil man eventuell entfernt handelt. Damit läßt sich auch eine zentrales Licht-AUS bzw. eine Alarmbeleuchtung mit ALLES-AN realisieren. Je ein 16-Bit-Word wird für das Tasten, das Einschalten bzw. das Ausschalten vorgesehen. Das reicht für maximal 16 Lampen. Hier also das MW164 für Tasten, MW166 für Ein und MW168 für AUS. M164.7 für das Tasten, M166.7 für EIN und M168.7 für AUS der Giebellampe. Die notwendigen Konfigurationen für weitere Lampen können so innerhalb der fhem.cfg kopiert und brauchen nur minimal angepasst werden. Ich empfehle vor Manipulationen der fhem.cfg unter Umgehung des dafür vorgesehenen Webinterfaces unbedingt ein Backup dieser Datei anzufertigen.
S5-Programm nochmals ergänzt
NETZWERK 12 Arbeitszimmer 00AC :O( 00AD :U( 00AE :U( 00AF :O -AzLiGt E64.7 Lichttaster 00B0 :O -M 164.7 M164.7 OG.Az.M1647.LaGiTast FHEM 00B1 :) 00B2 :UN -AzLaGf M61.4 Flankenmerker 00B3 :) 00B4 :O -M 166.7 M166.7 OG.Az.M1667.LaGiEin FHEM 00B5 :S -AzLaG A65.7 Lampe Arbeiten Giebel 00B6 :O( 00B7 :U( 00B8 :O -AzLiGt E64.7 Lichttaster 00B9 :O -M 164.7 M164.7 OG.Az.M1647.LaGiTast FHEM 00BA :) 00BB :U -AzLaGf M61.4 Flankenmerker 00BC :) 00BD :O -M 168.7 M168.7 OG.Az.M1667.LaGiAus FHEM 00BE :R -AzLaG A65.7 Lampe Arbeiten Giebel 00BF :U -AzLaG A65.7 Lampe Arbeiten Giebel 00C0 :) 00C1 :UN -AzLiGt E64.7 Lichttaster 00C2 :UN -M 164.7 M164.7 OG.Az.M1647.LaGiTast FHEM 00C3 :S -AzLaGf M61.4 Flankenmerker 00C4 :UN -AzLiGt E64.7 Lichttaster 00C5 :UN -M 164.7 M164.7 OG.Az.M1647.LaGiTast FHEM 00C6 :UN -AzLaG A65.7 Lampe Arbeiten Giebel 00C7 :R -AzLaGf M61.4 Flankenmerker 00C8 :NOP 0
zugehöriger Abschnitt aus der fhem.cfg
define s5test S7 S5 /dev/ttyAMA0
define OG.az.M1647.LichtGtast S7_DWrite flags 0 164.7 attr OG.az.M1647.LichtGtast IODev s5test attr OG.az.M1647.LichtGtast alias Giebellampe attr OG.az.M1647.LichtGtast eventMap /on-for-timer 1 /trigger:tasten attr OG.az.M1647.LichtGtast icon light_pendant_light attr OG.az.M1647.LichtGtast room Arbeitszimmer attr OG.az.M1647.LichtGtast webCmd tasten
define OG.az.M1667.LichtGaus S7_DWrite flags 0 166.7 attr OG.az.M1667.LichtGaus IODev s5test attr OG.az.M1667.LichtGaus alias Giebellampe.aus attr OG.az.M1667.LichtGaus eventMap /on-for-timer 1 /trigger:tasten attr OG.az.M1667.LichtGaus icon light_light attr OG.az.M1667.LichtGaus room Arbeitszimmer attr OG.az.M1667.LichtGaus webCmd tasten
define OG.az.M1687.LichtGein S7_DWrite flags 0 168.7 attr OG.az.M1687.LichtGein IODev s5test attr OG.az.M1687.LichtGein alias Giebellampe.an attr OG.az.M1687.LichtGein eventMap /on-for-timer 1 /trigger:tasten attr OG.az.M1687.LichtGein icon light_light_dim_100 attr OG.az.M1687.LichtGein room Arbeitszimmer attr OG.az.M1687.LichtGein webCmd tasten
Das FHEM-Gerät trägt nun einen strukturierten Namen, um es leicht zuordnen zu können. Auf der grafischen Oberfläche ist dies durch die Raumzuordung überflüssig. Hier wird der Alias Giebellampe verwendet. Außerdem kann man es gezielt aus- bzw. eintasten.
FHEM-S5-Rolladensteuerung ergänzen
In meiner S5 existiert bisher ein Programm welches nur einen Taster mit hoch - stop - runter - stop verwendet. Bei der Rolladensteuerung über das Webinterface ist es sinnvoller je einen Button für das Hochfahren, einen für das Runterfahren und einen für STOP zu konfigurieren. Wie bei der Lampenschaltung soll sich auch hier ein zentrales HOCH bzw. RUNTER für alle vorhandenen Rolläden realisieren lassen. Dazu werden in der S5 das Merkerbyte MB176 bzw. M176.3 für HOCH und MB178 bzw. M178.3 für RUNTER und MB177 bzw. M177.3 für STOP für den FHEM-Zugriff konfiguriert. Damit sind maximal acht Rollläden .0 bis .7 möglich.
S5-Programm
NETZWERK 2 RL Schlafen hoch 0012 :O( 0013 :O -XRUPS M19.2 Tasterauswertung RL Schlafen hoc 0014 :O -M 176.3 M176.3 OG.Sz.M1763.RlHo FHEM 0015 :) 0016 :UN -RDNS A10.5 Ausgang RLaden runter Schlafen 0017 :L KT 030.2 0019 :SA T 5 Timer Schlafen hoch 001A :O -RDNS A10.5 Ausgang RLaden runter Schlafen 001B :O -XRDNS M19.3 Tasterauswertung RL Schlafen run 001C :O -RStopS M19.4 RL Stop 001D :O -M 177.3 M177.3 OG.Sz.M1763.RlStop FHEM 001E :O -M 178.3 M178.3 OG.Sz.M1763.RlRu FHEM 001F :R T 5 Timer Schlafen hoch 0020 :NOP 0 0021 :NOP 0 0022 :U T 5 Timer Schlafen hoch 0023 := -RUPS A10.4 Ausgang RLaden hoch Schlafem 0024 :*** NETZWERK 3 RL Schlafen runter 0025 :O( 0026 :O -XRDNS M19.3 Tasterauswertung RL Schlafen run 0027 :O -M 178.3 M178.3 OG.Sz.M1763.RlRu FHEM 0028 :) 0029 :UN -RUPS A10.4 Ausgang RLaden hoch Schlafen 002A :L KT 030.2 002C :SA T 6 Timer Schlafen runter 002D :O -RUPS A10.4 Ausgang RLaden hoch Schlafen 002E :O -XRUPS M19.2 Tasterauswertung RL Schlafen hoc 002F :O -RStopS M19.4 RL Stop 0030 :O -M 177.3 M177.3 OG.Sz.M1763.RlStop FHEM 0031 :O -M 176.3 M176.3 OG.Sz.M1763.RlHo FHEM 0032 :R T 6 Timer Schlafen runter 0033 :NOP 0 0034 :NOP 0 0035 :U T 6 Timer Schlafen runter 0036 := -RDNS A10.5 Ausgang RLaden runter Schlafen 0037 :***
Der Motorschutz-Timer sorgt dafür, dass die Stromversorgung nach der maximalen Laufzeit abgeschaltet wird.
zugehöriger Abschnitt aus der fhem.cfg
Die Zeilen mit event-min-interval und .*:600 event-on-change-reading state dienen wie im S7-Wiki beschrieben der Geschwindigkeitsverbesserung.
define OG.sz.M1763.RlHo S7_DWrite flags 0 176.3 attr OG.sz.M1763.RlHo IODev s5test attr OG.sz.M1763.RlHo alias Rollladen.hoch attr OG.sz.M1763.RlHo event-min-interval .*:600 attr OG.sz.M1763.RlHo event-on-change-reading state attr OG.sz.M1763.RlHo eventMap /on-for-timer 1 /trigger:tasten attr OG.sz.M1763.RlHo icon rc_UP attr OG.sz.M1763.RlHo room Schlafen attr OG.sz.M1763.RlHo sortby 01 attr OG.sz.M1763.RlHo webCmd tasten define OG.sz.M1773.RlStop S7_DWrite flags 0 177.3 attr OG.sz.M1773.RlStop IODev s5test attr OG.sz.M1773.RlStop alias Rollladen.stop attr OG.sz.M1773.RlStop event-min-interval .*:600 attr OG.sz.M1773.RlStop event-on-change-reading state attr OG.sz.M1773.RlStop eventMap /on-for-timer 1 /trigger:tasten attr OG.sz.M1773.RlStop icon rc_REC attr OG.sz.M1773.RlStop room Schlafen attr OG.sz.M1773.RlStop sortby 02 attr OG.sz.M1773.RlStop webCmd tasten define OG.sz.M1783.RlRu S7_DWrite flags 0 178.3 attr OG.sz.M1783.RlRu IODev s5test attr OG.sz.M1783.RlRu alias Rollladen.runter attr OG.sz.M1783.RlRu event-min-interval .*:600 attr OG.sz.M1783.RlRu event-on-change-reading state attr OG.sz.M1783.RlRu eventMap /on-for-timer 1 /trigger:tasten attr OG.sz.M1783.RlRu icon rc_DOWN attr OG.sz.M1783.RlRu room Schlafen attr OG.sz.M1783.RlRu sortby 03 attr OG.sz.M1783.RlRu webCmd tasten
Ergebnis
Der Rolladen kann nun über das Webinterface auf beliebigen Geräten gezielt geschlossen bzw. geöffnet werden.
FHEM-S5-Bewässerungssteuerung ergänzen
Bisher können vier Gartenschläuche mit Perlschläuchen über Magnetventile per Taster bzw. Zeitschaltung betrieben werden. Zusätzlich soll warmes Wasser zugemischt werden können, um eine Überhitzung der Dachkollektoren zu verhindern. Die Zeitschaltung ist nur äußerst unkomfortabel über einen Datenbaustein zu konfigurieren und wurde daher kaum benutzt. Im Ergebnis lief das Wasser im Garten oft unkontrolliert über viele Stunden. Ziel mit FHEM ist eine deutliche Verbesserung. Zunächst wird die Einschaltzeit per FHEM auf 90 min begrenzt.
wird fortgesetzt wenn es wieder wärmer ist ..
FHEM-S5-Heizungssteuerung neu anlegen [2016]
Nachdem die S5-Unterstützung fester Bestandteil von FHEM ist und vorher auch keine Probleme mit dem verwendeten S7-Modul auftraten, geht es jetzt ans Eingemachte - die Steuerung der Heizung. Die Steuerung soll nun (fast) ausschließlich von FHEM erledigt werden, weil es damit leichter möglich ist umfangreiche Abhängigkeiten abzubilden und entsprechenden Module fertig zur Verfügung stehen. Die S5 dient hier nur noch als "dumme" Ausgangsklemme für die von FHEM gesteuerten Aktoren. Damit soll der Aufwand und die Komplexität der Steuerung reduziert werden. Eine Anpassung des S5-Programms soll so kaum noch notwendig sein, um auch das lästige Umstecken der PG-Schnittstelle zu erledigen.
Sensorik mit OWX
Im ersten Schritt habe ich die bisherige analoge Temperaturmessung mit gemultiplexten B511 am Analogeingang der SPS durch Sensoren am 1-Wire-Bus ersetzt, um mehr Messtellen ohne aufwändige Kalibrierung und Verkabelung zu bedienen und auch die Luftfeuchte und die solare Einstrahlung zu messen. FHEM stellt die zwei weitgehend getrennten Module owserver und OWX zur Unterstützung des 1-Wire-Busses zur Verfügung. Nach erfolgreichen Tests ist es OWX geworden, weil hier ohne Umwege über zum Teil haklige Fremdsoftware-Installationen direkt mit Perl auf den Bus zugegriffen wird. Bisher läuft das Verfahren stabil.
Zunächst benötigt man eine von OWX unterstützte Hardware, um auf den 1-Wire-Bus zuzugreifen. Ich habe mich für die zuverlässigere Variante Raspi -> USB -> 1-wire über einen DS9097U kompatiblen Adapter und gegen die wackligeren Varianten entschieden. Nützlich dazu war die Anleitung von waschto.eu.
Empfehlenswerte kombinierte Sensoren für Temperatur und Luftfeuchtigkeit bzw. Einstrahlung habe ich hier gekauft. Für die restlichen Temperaturmesstellen sind es fertig konfektionierte DS1820 mit Hülse geworden, wie man sie sehr preiswert bei z.B. ebay bekommt.
Viel Zeit kann man vertrödeln, wenn man die korrekte Busverkabelung als Nebensache ansieht. Korrekt sieht sie entsprechend der Diskussion im Forum so aus:
Diese LSA+ Boxen habe ich für den direkten Anschluss bzw. für über max. 3 m lange Stubs von konfektionierten Sensoren verwendet und sonst Abzweige in Feuchtraumabzweigdosen mit Data-Return-Ader über Leuchtenklemmen hergestellt. Noch besser ist womöglich die im Forum empfohlenen Variante. Mögliche Problemlösungen sind hier dokumentiert. Als Leitungsmaterial für die gewählte Verbindungstechnik hat sich bei mir für ca. 100 m, Telefonleitung für feste Verlegung YStY 2x2x0,6 bewährt.
Bei der Sensor-Installation bin ich mit Hilfe der OWX-Automatik schrittweise vorgegangen, um die Übersicht zu behalten:
- Status von OneWire unter Unsorted im WEB-Interface muss Active sein,
- ersten Sensor einzeln an den Bus geklemmt,
- in der Detailansicht get Onewire devices ausgewählt,
- die erscheinende Liste mit dem ersten Sensor in die Textdatei owx1 kopiert,
- owx1 als owx-uebersicht gespeichert und den Zweck des Sensors ergänzt,
- config nicht gespeichert!, um Sensoren immer wieder komplett neu abzufragen,
- shutdown restart ausgeführt, damit OWX den ersten Sensor vergisst,
- nächsten Sensor zusätzlich an den Bus geklemmt,
- In der Detailansicht wieder get Onewire devices ausgewählt,
- die erscheinende Liste in die Textdatei owx2 kopiert,
- Dateien owx1 und owx2 mit Meld (diff-Programm) verglichen, um den zweiten Sensor zu separieren,
- Differenz in owx-uebersicht einfügt und Zweck ergänzt,
- Differenz nach owx1 übernommen, für den neuen IST-Zustand,
- usw. usf.
- erst wenn der letzte Sensor erkannt wurde, fhem.cfg gespeichert,
- Sensoren entsprechend dem Benennungsschema und Zweck umbenannt:
rename OWX_20_FF0939521603 OG.hr.DS1820.Hz
fhem.cfg Ausschnitt komplett mit Zuordnung und Lastoptimierung für den FHEM-Host:
define OG.hr.DS1820.Hz_VL OWTHERM DS18B20 FF0939521603 attr OG.hr.DS1820.Hz_VL IODev OneWire attr OG.hr.DS1820.Hz_VL alias Hz-VL attr OG.hr.DS1820.Hz_VL event-min-interval 60 attr OG.hr.DS1820.Hz_VL event-on-change-reading temperature:0.3 attr OG.hr.DS1820.Hz_VL group FBH-Mischer,Fußboden attr OG.hr.DS1820.Hz_VL model DS18B20 attr OG.hr.DS1820.Hz_VL room Heizung attr OG.hr.DS1820.Hz_VL sortby 01
Heizkreis-Regelung mit PWM
Die Ansteuerung der 230-V-Heizkreis-Thermoantriebe habe ich ohne Änderung aus der alten SPS-Steuerung übernommen. Sie werden direkt mit einer kontaktlosen S5-230-V-Ausgabebaugruppe geschaltet.
Das Modul FHEM-PWM ist für die Einzelraumregelung von geschalteten Fußbodenheizungen vorgesehen. Es liest einen Temperatursollwert aus den Voreinstellungen, bildet daraus und aus der gemessenen IST-Raumtemperatur eine Regelabweichung und schaltet entsprechend die Heizkreise so, dass der SOLL-Wert schnell und ohne nennenswertes Überschwingen erreicht wird. Die Definition von PWM und PWMR am Beispiel eines Raumes in FHEM:
define fh PWM
define OG.wo.PWMR PWMR fh 0.7,0 OG.wo.DS1820.TF OG.hr.M706.TAwo attr OG.wo.PWMR alias Wohnen-Soll attr OG.wo.PWMR autoCalcTemp 1 attr OG.wo.PWMR group Raum attr OG.wo.PWMR room Heizung,Wohnen attr OG.wo.PWMR tempDay 19 attr OG.wo.PWMR tempNight 16 attr OG.wo.PWMR tempRule1 Mo-Fr 11:00,D 20:00,N attr OG.wo.PWMR tempRule2 Sa-So 6:00,D 20:00,N
Also, das Gerät fh definiert und je Raum ein Define von PWMR mit dem Raumfühler und dem Schalter für das Ventil als Parameter - fertig und funktioniert. Leider haben sich mir weitere Funktionen des Moduls bisher nicht erschlossen. Bitte am Wiki mitarbeiten.
Um die Funktion von PWM zu visualisieren, kann man eine grafische Darstellung in Form eines Diagramms definieren:
define OG.wo.graph.dummy dummy attr OG.wo.graph.dummy event-on-change-reading state
define OG.wo.temp at +*00:05:00 { my $d= ReadingsVal("OG.wo.DS1820.TF", "temperature",0);;$d= 'OG.wo.temp '.$d;; fhem("set OG.wo.graph.dummy $d")}
define FLog_OG.wo.graph.dummy FileLog ./log/OG.wo.graph.dummy-%Y-%m-%d.log OG.wo.graph.dummy attr FLog_OG.wo.graph.dummy logtype text
define OG.wo.humidity at +*00:05:00 { my $d= ReadingsVal("OG.wo.DS2438.RF","relHumidity",0);;$d= 'OG.wo.humidity '.$d;; fhem("set OG.wo.graph.dummy $d")}
define OG.wo.TA at +*00:05:00 { my $d= ReadingsVal("OG.hr.A190.TAwo","state",0);;$d= 'OG.wo.TA '.$d;; fhem("set OG.wo.graph.dummy $d")}
define SVG_FLog_OG.wo.graph.dummy_1 SVG FLog_OG.wo.graph.dummy:SVG_FLog_OG.wo.graph.dummy_1:CURRENT
Regelung der FBH-Vorlauftemperatur mit dem Modul PID20
Die Temperatur des Heizungswassers welches die Fußbodenheizungskreise durchströmt, sollte für Brennwertgeräte so niedrig wie möglich sein, um deren Wirkungsgrad zu verbessern. Hier geht es in erster Linie darum, dass das Wasser aus den Pufferspeichern des Holzvergasers mindestens auf die maximal zulässige Temperatur heruntergekühlt wird, um eine hohe Lebensdauer der Heizung zu gewährleisten. Als Mischventil verwende ich ein günstiges gebrauchtes fast lautlos arbeitendes Gerät Siemens MXG461, welches von der S5 mit 0..10 V analog angesteuert werden kann:
Bei der S5-95U kann man dazu den internen Analogausgang verwenden:
Die Programmierung innerhalb der S5 kann so wie im Handbuchsiehe 3.3.5 und 12.2.2 beschrieben realisiert werden. Mit Hilfe des intern bereits vorhandenen Bausteins FB251 gelingt das leicht. Aufruf und Parametrierung des FB251 für das Mischventil mit: obere Grenze = 100, voll offen und: untere Grenze = 0 geschlossen.
: SPA FB 251 NAME : RLG:AA XE : MW130 BG : KF=8 KNKT : KY=0,0 OGR : KF=100 UGR : KF=0 FEH : M 131.0 BU : M 131.1
Die Stellgröße im Bereich von 0..100 muss nun von FHEM-PID20 in das Merkerwort MW130 der S5 geschrieben, eventuelle Fehlermeldungen von der S5 als FEH und BU zurückgeliefert werden.
16 Bit Merkerwort zum Schreiben
define OG.hr.MW130.Mischventil S7_AWrite flags 0 130 u16 attr OG.hr.MW130.Mischventil IODev s5test attr OG.hr.MW130.Mischventil alias Ventilstellung attr OG.hr.MW130.Mischventil event-min-interval .*:600 attr OG.hr.MW130.Mischventil event-on-change-reading state attr OG.hr.MW130.Mischventil group FBH-Mischer attr OG.hr.MW130.Mischventil room Heizung attr OG.hr.MW130.Mischventil sortby 01
Definition des PID-Reglers
define PID.Test PID20 OG.hr.DS1820.Hz_VL:temperature OG.hr.MW130.Mischventil: attr PID.Test group FBH-Mischer attr PID.Test pidActorErrorPos 0 attr PID.Test pidActorInterval 1 attr PID.Test pidCalcInterval 20 attr PID.Test pidReverseAction 1 attr PID.Test room Heizung
SPS-Konfigurationsfehler melden
define OG.hr.M1301.FEH S7_DRead flags 0 131.0 attr OG.hr.M1301.FEH IODev s5test attr OG.hr.M1301.FEH alias SPS-Konfiguration attr OG.hr.M1301.FEH devStateIcon on:10px-kreis-rot off:10px-kreis-gruen attr OG.hr.M1301.FEH event-min-interval .*:600 attr OG.hr.M1301.FEH event-on-change-reading state attr OG.hr.M1301.FEH group FBH-Mischer attr OG.hr.M1301.FEH room Heizung attr OG.hr.M1301.FEH sortby 03
FHEM-Stellgrößen-Bereichsüberschreitung melden
define OG.hr.M1301.BU S7_DRead flags 0 131.1 attr OG.hr.M1301.BU IODev s5test attr OG.hr.M1301.BU alias FHEM-Sollwert attr OG.hr.M1301.BU devStateIcon on:10px-kreis-rot off:10px-kreis-gruen attr OG.hr.M1301.BU event-min-interval .*:600 attr OG.hr.M1301.BU event-on-change-reading state attr OG.hr.M1301.BU group FBH-Mischer attr OG.hr.M1301.BU room Heizung
Warmwasserspeicherladung mit DOIF
Wenn die Temperatur im Pufferspeicher des Holzvergasers OG.ks.DS1820.P500o deutlich höher ist als im Warmwasserspeicher OG.hr.DS1820.wwo, soll dieser geladen werden, indem das Ventil mit Hilfe eines 230 V Thermoantriebes OG.hr.M710.TAWW für den integrierten Wärmetauscher geöffnet wird. Ich benutze dazu die FHEM-Funktion DOIF.
define OG.hr.WW.oben_heizen DOIF (([OG.ks.DS1820.P500o:temperature:d] > ([OG.hr.DS1820.wwo:temperature:d] + 8)) or\ (([OG.hr.DS1820.wwo:temperature:d] < 41) and ([OG.ks.DS1820.P500o:temperature:d] > ([OG.hr.DS1820.wwo:temperature:d] + 4))))\ (set OG.hr.M710.TAWW on;; set OG.hr.M700.HzPu on) DOELSE (set OG.hr.M710.TAWW off;; set OG.hr.M700.HzPu off) attr OG.hr.WW.oben_heizen alias TA_WW attr OG.hr.WW.oben_heizen devStateIcon cmd_1:10px-kreis-rot cmd_2:10px-kreis-gruen attr OG.hr.WW.oben_heizen do resetwait attr OG.hr.WW.oben_heizen group Warmwasser attr OG.hr.WW.oben_heizen room Heizung attr OG.hr.WW.oben_heizen sortby 04 attr OG.hr.WW.oben_heizen wait 120
Visualisierung des Heizungsschemas mit FLOORPLAN [2017]
Um einen schnellen Überblick über den Gesamtzustand der Heizungsanlage zu ermöglichen, ist die grafische Variante Floorplan besser als die FHEM-Ansicht mit Variable = Wert geeignet. Die Alternative YAF macht ebenfalls einen guten Eindruck. Sie speichert die Konfiguration aber nicht vollständig in der fhem.cfg und notwendige Anpassungen werden nur halbherzig betrieben. Die Anpassung an zukünftige Entwicklungen war für mich daher zu fraglich.
Zunächst habe ich das Heizungsschema mit [Qelectrotech 0.5] gezeichnet. Das Programm ist dazu gut geeignet, auch wenn der Name anderes suggeriert. Die fertige Zeichnung wird als PNG-Datei (oder SVG) gespeichert und als Hintergrundbild entsprechend der ausführlichen Beschreibung im Wiki eingefügt. Die Beeinflussung der Darstellungsdetails direkt über die zuständige CSS-Datei eröffnet alle Möglichkeiten ist aber sehr gewöhnungsbedürftig.
Danach können interessante Schaltzustände und Messwerte integriert und auch später noch im WEB-Interface bearbeitet werden. Details werden in der fhem.cfg gespeichert, eine Bearbeitung an dieser Stelle erscheint mir eher weniger geeignet. Für jedes interessierende Anlagendetail kann eine neue Seite des Floorplans verwendet werden.
Docker mit Integration von Nodered, MQTT, IOBroker [2022]
Nodered ist m.E. eine ideale Ergänzung zu FHEM und ein attraktives visuelles Frontend. Für die Integration habe ich mich an den Videos von Matthias Kleine und seiner Seite Hausautomatisierung orientiert.
Für FHEM und angrenzende Dienste gibt es für den Raspi ein offizielles Docker-Image, welches offenbar auch auf Vorarbeiten von Matthias zurück geht. Ich zeige, wie meine bestehende Installation in den Container umzog.
Vorbereitung
Ich habe mich entschlossen, auch aus Sicherheitsgründen, auf einer neuen SD-Karte, hier in einem neuen Raspi4, ein komplett neues System aufzusetzen. Ein Raspi3 würde aber genügen.
Der Imager lässt sich auf einem Ubuntu-PC so installieren:
sudo apt update
sudo apt install snapd
sudo snap install rpi-imager
Nach dem Start des neuen Systems, mit sudo raspi-config
folgende Einstellungen ändern:
- System Options -> Password
- Interface Options -> SSH
- Localisation Options -> L1 bis L4
Docker kann nach dem SSH-Login ssh pi@<raspi-IP>
nach Anleitung auf dem Raspi installiert werden:
sudo apt-get update
sudo apt-get upgrade
sudo reboot
sudo apt-get install wget git apt-transport-https vim telnet
curl -sSL https://get.docker.com | sh
sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -aG docker pi
cd /home/pi
git clone -b raspbian https://github.com/klein0r/fhem-docker.git fhem-docker
cd fhem-docker
sudo apt-get install python-pip
sudo pip install docker-compose
exit
Dann erneut per ssh anmelden.
cd fhem-docker
docker-compose up
Sollte der Fehler:
ERROR evaluating { DockerImageInfo_HealthCheck(); }: Undefined subroutine &main::DockerImageInfo_HealthCheck called at (eval 47) line 1.
auftreten, hilft es in /home/pi/fhem-docker/fhem/core/fhem.cfg, nach einem vorherigen Backup dieser Datei, folgende Zeilen aufzunehmen:
define myDIInfo DockerImageInfo
attr myDIInfo DbLogExclude .*
attr myDIInfo alias Docker Image Info
attr myDIInfo devStateIcon ok:security@green Initialized:system_fhem_reboot@orange .*:message_attention@red
attr myDIInfo group Update
attr myDIInfo icon docker
attr myDIInfo room System
Erfolgskontrolle: Im Browser unter <raspi-ip>:8083/fhem sollte nach ein paar Minuten ein optisch und technisch entstaubtes FHEM (und auf anderen Ports die anderen Dienste) zu sehen sein. Falls keine Fehlermeldungen in der SSH-Session zu sehen sind, docker-compose mit <Strg>+<c> abbrechen und die Container im Hintergurnd neu starten mit:
docker-compose up -d
Serielle Schnittstellen anpassen
Die Module S7 und OWX brauchen im Container die seriellen Schnittstellen. Diese sind standardmäßig nicht dabei. Nach Anleitung wird die /dev/ttyAMA0 für die S5 zunächst auf dem Raspi aktiviert:
$ sudo nano /boot/config.txt
am Ende hinzufügen:
enable_uart=1
auskommentieren mit an erster Position eingefügtem # und speichern:
console=serial0,115200
sudo systemctl stop serial-getty@ttyS0.service && sudo systemctl disable serial-getty@ttyS0.service
Jetzt weiter für /dev/ttyAMA0 und die drei über USB angeschlossenen Onewire-Bus-Schnittstellen:
Datei mit unten stehendem Inhalt anlegen: /etc/udev/rules.d/99-ttyAMA0.rules:
KERNEL==“ttyUSB0”, SYMLINK+=“serial0” GROUP=“tty” MODE=“0660”
KERNEL==“ttyUSB1”, SYMLINK+=“serial1” GROUP=“tty” MODE=“0660”
KERNEL==“ttyUSB2”, SYMLINK+=“serial2” GROUP=“tty” MODE=“0660”
KERNEL==“ttyAMA0”, SYMLINK+=“serial3” GROUP=“tty” MODE=“0660”
Aktivierung der Rules mit:
sudo udevadm control --reload-rules && sudo udevadm trigger
Gruppenzugehörigkeit ändern:
sudo chgrp -h tty /dev/serial0
sudo chgrp -h tty /dev/serial1
sudo chgrp -h tty /dev/serial2
sudo chgrp -h tty /dev/serial3
Pi-User zuordnen:
sudo adduser $USER tty
sudo adduser $USER dialout
Eigentümer setzen:
sudo chmod g+r /dev/ttyUSB0
sudo chmod g+r /dev/ttyUSB1
sudo chmod g+r /dev/ttyUSB2
sudo chmod g+r /dev/ttyAMA0
sudo reboot
Erfolgskontrolle auf dem Raspi: ls -l /dev
sollte nun unter anderem eine Schnittstelle ttyAMA0 zeigen.
Anpassung von /home/pi/fhem-docker/docker-compose.yml
Für OWX ist die feste Zuordnung mehrerer Onewire-Adapter wichtig. Dieser Befehl zeigt eindeutige Namen, die auch nach dem Umstecken der USB-Stecker gültig bleiben:
ls -l /dev/serial/by-id
Das Ergebnis sieht bei mir so aus:
lrwxrwxrwx 1 root root 13 1. Jan 16:23 usb-FTDI_FT232R_USB_UART_AL01XC9Y-if00-port0 -> ../../ttyUSB0
lrwxrwxrwx 1 root root 13 1. Jan 16:23 usb-FTDI_FT232R_USB_UART_DAE003E5-if00-port0 -> ../../ttyUSB2
lrwxrwxrwx 1 root root 13 1. Jan 16:23 usb-FTDI_FT232R_USB_UART_DAE003E6-if00-port0 -> ../../ttyUSB3
Entsprechend kann dann die mitgelieferte docker-compose.yml (tippfehlerfrei) angepasst werden:
networks:
- fhem-network
devices:
# - "/dev/ttyUSB0:/dev/ttyUSB0"
- "/dev/ttyAMA0:/dev/ttyAMA0"
- "/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_AL01XC9Y-if00-port0:/dev/onewire3"
- "/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_DAE003E5-if00-port0:/dev/onewire2"
- "/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_DAE003E6-if00-port0:/dev/onewire1"
Nach dem Speichern der docker-compose.yml, die Container mit docker-compose down
bzw. docker-compose up -d
neustarten.
Erfolgskontrolle auf der Pi-Konsole mit docker exec -it fhem-docker_fhem_1 /bin/bash
:
# ls -l /dev
..
crw-rw---- 1 root tty 188, 0 Jan 1 17:53 onewire1
crw-rw---- 1 root tty 188, 1 Jan 1 15:12 onewire2
crw-rw---- 1 root tty 188, 2 Jan 1 16:26 onewire3
..
exit
Test der Schnittstellen in FHEM durch Einfügen der Befehle in die Browser-Kommandozeile:
define myS5t S7 S5 /dev/ttyAMA0
sollte im Webinterface zum state connected führen.
define onewire3 OWX /dev/onewire3
sollte im Webinterface zum state opened führen.
Nach einiger Zeit sollte per get onewire1 devices
eine Liste der angeschlossenen OW-Geräte sichtbar sein:
Damit ist alles bereit und die Test-Geräte S7 und OWX müssen im Webinterface gelöscht und die eventuell automatisch erkannten Sensoren manuell aus der fhem.cfg entfernt werden. Danach FHEM shutdown restart
.
Alte Konfiguration in den neuen Container übernehmen
Ich habe die Grundkonfiguration in der neuen fhem.cfg des Containers unverändert übernommen und dann alle Zeilen unterhalb der Basiskonfigruation der alten fhem.cfg kopiert und in die neue unterhalb eingefügt. Nach einem shutdown restart
funktionierte dann (fast) alles wie gewünscht.
Fazit
Die Simatic S5 hat es ins Docker-Zeitalter geschafft ;-) kann Daten per MQTT publishen und subscriben, Daten mit Node-Red visualisieren und potenziell nun auch IOBroker-kompatibel werden.