Samstag, 8. Januar 2022

Diagramm für die Luftfeuchteregelung mit FHEM

Um ein Diagramm mit Messwerten anzeigen zu können, muss man zuerst ein SVG-Device erstellen. Die Daten für die Grafik holt sich das SVG-Device aus der Log-Datei für das Gerät, das die Daten liefert. Am einfachsten ruft man dazu die Detailansicht für die Log-Datei auf und klickt auf Create SVG instance. Der Vorgang ist in der FHEM-Referenz beschrieben. Man landet dann sofort im Plot-Editor, in dem man die Grafik dann an seine Wünsche anpassen kann.

In meinem Diagramm für die Regelung der Luftfeuchtigkeit werden zwei Graphen angezeigt, der Verlauf der Luftfeuchtigkeit und des Schaltzustands des Luftentfeuchters.

Plot-Editor-Anzeige für meine Luftfeuchtigkeitsregelung

Unter Plot title gibt man die Überschrift des Diagramms ein, hier "Luftfeuchtigkeit Küche". Man kann die anzuzeigenden Werte einer linken oder rechten Y-Achse zuordnen. Die auf Plot title folgenden Eingabezeilen sind daher in left und right aufgeteilt. Zunächst gehe ich auf die Darstellung der Luftfeuchtigkeit ein, die der linken Y-Achse zugeordnet ist.

In das Feld Y-Axis label wird die Beschriftung der Y-Achse eingegeben - hier "%", weil die Luftfreuchtigkeit in Prozent gemessen wird. Mit Range as [min:max] kann man den Minimal- und Maximalwert angegen, der angezeigt werden soll. Wenn man das Feld leer lässt, passt SVG den Bereich automatisch an den minimalen und maximalen Wert aus der Log-Datei für den dargestellten Zeitraum an. Mit log kann die Skala auf logarithmische Darstellung umgeschaltet werden. Mit Tics as ("Txt" val, ...) kann man Zahlenwerte als Text darstellen. Dazu komme ich noch später.

In den auf Tics as ("Txt" val, ...) folgenden Zeilen werden die Graphen definiert. Diagram label benennt den Graphen (die Kurve), hier "Luftfeuchtigkeit". In Source wird festgelegt, aus welcher Log-Datei die Informationen gewonnen werden, hier "FileLog_Ku_Thermometer". Wenn man das Drop-Down-Menü anklickt, bekommt man eine Liste der verfügbaren Log-Dateien.

Aus dem Drop-Down-Feld Column wählt man aus, aus welcher Spalte der Log-Datei der Wert genommen werden soll. Dazu hilft ein Blick in die Log-Datei oder man sieht sich die unter Example lines for input aufgelisteten Beispielzeilen aus der Log-Datei an. Der Zahlenwert für die Luftfeuchtigkeit steht in der 4. Spalte der Log-Datei, also ist hier der Wert "4" einzustellen. Aus dem Drop-Down-Menü Regexp wählt man aus, welches Reading verwendet werden soll. Der Sensor stellt ja nicht nur die Luftfeuchtigkeitswerte zur Verfügung, sondern auch noch andere Werte, wie die Temperatur oder den Taupunkt. Für meinen Anwendungsfall habe ich hier "Ku_Thermometer.humidity:" eingestellt. Der Punkt ersetzt ein Leerzeichen, weil es sich um einen regulären Ausdruck handelt. Der Punkt steht für ein beliebiges Zeichen in einem regulären Ausdruck, also auch für ein Leerzeichen.  

Y-Axis legt fest, ob der Graph der linken oder rechten Y-Achse zugeordnet werden soll. Plot-Type, Style und Width sind zum großen Teil selbsterklärend. Ein bisschen experimentieren mit den Werten kann nicht schaden. Ich verwende Stufenlinien, weil ich nur die tatsächlich gemessenen Werte darstellen will und keine Interpolationen. Alle Eingaben und Änderungen werden erst wirksam, wenn man Write g.plot file gedrückt hat.

Für den Schaltzustand des Luftentfeuchters muss man ein wenig mehr Aufwand treiben. Es soll kein Messwert angezeigt werden, der Graph soll nur "ein" oder "aus" anzeigen. Den Graph für den Schaltzustand habe ich der rechten Y-Achse zugeordnet. Der Graph kann nur Zahlenwerte interpretieren. Deshalb ordne ich "aus" den Wert 0 zu und "ein" den Wert 2. Das geschieht in der Zeile Tics as ("Txt" val, ...) im der rechten Achse zugeordneten Eingabefeld mit dem Eintrag "("ein" 2, "aus" 0)". Damit der Einzustand nicht am oberen Rand des Diagramms klebt, habe ich den Wertebereich für den Schaltzustand auf 0 bis 3 begrenzt. Das erledigt in der Zeile Range as [min:max] der Eintrag "[0:3]".

Der Graph erhält die Bezeichnung "Entfeuchter" im Eingabefeld Diagram label. Als Source wird jetzt die Log-Datei für den Steckdosenschalter eingetragen: FileLog_Ku_Luftentfeuchter. Den Eintrag in Column muss ich nicht anpassen, weil ich keinen Zahlenwert auswerten will, sondern den Status des Schalters und der ist entweder "on" oder "off" (siehe folgendes Bild).

Beispiele für die Readings aus der Log-Datei des Steckdosenschalters (Example lines for input)

Als Regexp verwende ich Ku_Luftentfeuchter.*. Der Punkt steht für ein beliebiges Zeichen, der Stern "*" bewirkt, dass das vorherstehende Zeichen beliebig oft wiederholt wird. Mit diesem regulären Ausdruck werden also alle Readings ausgewählt, die mit "Ku_Luftentfeuchter" beginnen, somit also alle Readings des Device's Ku_Luftentfeuchter. Warum nicht das Reading Ku_Luftentfeuchter.on? Es reicht nicht, den On-Zustand festzustellen, sondern es muss auch der Off-Zustand für die Auswertung erfasst werden. Es lässt sich aber nur ein regulärer Ausdruck aus Regexp auswählen.

Damit der Status im Diagramm angezeigt werden kann, muss er in einen Zahlenwert umgewandelt werden. Das geschieht im Eingabefeld Function. Der Ausdruck, der dort steht, wird evaluiert und ersetzt den Wert, der in der mit Column festgelegten Spalte steht. Der Ausdruck ist in der Programmiersprache Perl zu schreiben. Hier ist beispielsweise eine Einführung in Perl zu finden.

Der komplette Ausdruck in Function lautet:

$fld[2]=~"on"?2:$fld[2]=~"off"?0:""

SVG speichert das Reading für den jeweils aktuell auszuwertenden Punkt des Diagramms im Array @fld. Jede Spalte des Readings (durch Leerzeichen getrennte Einträge) ist in einem Element des Array's abgelegt. Die Werte "on" und "off" stehen in der 3. Spalte. Weil die Zählung der Array-Elemente bei 0 beginnt, findet sich "on" und "off" in $fld[2]. Der Operator "=~" bewirkt, dass der Speicherinhalt von $fld[2] mit der Zeichenkette "on" verglichen wird. Wenn "on" in $fld[2] enthalten ist, ergibt "$fld[2]=~"on"" den Wert true, andernfalls false.

Das Fragezeichen (?) ist ein ternärer Operator. Er ersetzt eine einfache if-Abfrage. Wenn der Ausdruck vor dem Fragezeichen true ist, dann wird der Befehl nach dem Fragezeichen ausgeführt, wenn er false ist, wird der Befehl nach dem Doppelpunkt ausgeführt. Wenn in den Readings an der 3. Position nur "on" oder "off" stände, dann könnte der Function-Ausdruck lauten:

$fld[2]=~"on"?2:0

Der Ausdruck bedeutet: Wenn "on" in $fld[2] enthalten ist, ist der Wert in Function 2, sonst 0. Leider kommen an 3. Position des Readings aber nicht nur "on" und "off" vor, sondern beispielsweise auch "power", "voltage" oder "energy" (siehe Bild oben). Damit beispielsweise nicht "power" als "off" interpretiert wird, ist für den Fall, dass der Vergleich auf "on" negativ ausfällt, eine weitere ternäre Operation nachgeschaltet, die prüft, ob "off" in $fld[2] enthalten ist. Wenn ja, wird der Wert von Function 0, sonst wird er eine leere Zeichenkette (""). Die beiden hintereinander geschalteten ternären Operatoren bewirken also, dass für den Grafen der Wert 2 verwendet wird, wenn das Reading an 3. Position "on" enthält, wenn "off" im Reading steht, wird 0 eingesetzt und sonst eine leere Zeichenkette.




Dienstag, 4. Januar 2022

Regelung der Luftfeuchtigkeit mit FHEM

In meiner Küche betreibe ich einen Luftentfeuchter der Firma Midea. Das Gerät hat zwar WLAN integriert, es lässt sich aber leider nur über eine proprietäre App steuern. Zudem läuft der Lüfter dauernd. Das ist anscheinend bei neueren Geräten jetzt generell so, weil der Feuchtigkeitssensor auf diese Weise dauernd von der Raumluft umströmt wird. Leider verbraucht der Lüfterbetrieb auf der niedrigsten Stufe bereits 25 W. Ich habe daher eine eigene Regelung auf meinem FHEM-Server angelegt.

An zusätzlichen Geräten verwende ich eine Devolo-Schaltsteckdose und einen kombinierten Temperatur- und Feuchtesensor der Firma Eurotronic. Beide Zusatzgeräte werden über Z-Wave an den FHEM-Server angebunden. Der Luftentfeuchter hat den Vorteil, dass er sich seinen Betriebszustand bei einem Stromausfall merkt. Daher kann man ihn über die Schaltsteckdose ohne Weiteres schalten. Es ist nur wichtig, dass der Entfeuchter auf Dauerbetrieb eingestellt wird.

Das Bild unten zeigt einen Ausschnitt aus dem FHEM-Raum Küche der Gruppe Feuchtigkeit und das Übersichtsdiagramm mit den gemessenen Feuchtigkeitswerten (rot) und dem Schaltzustand der Steckdose (grün) und damit des Luftentfeuchters an.

Regelung der Luftfeuchtigkeit

Ku_Luftfeuchtigkeit ist ein Dummy Device. Es hat nur die Aufgabe, die Luftfeuchtigkeit anzuzeigen. Zusätzlich zu group und room habe ich nur noch das Attribut stateFormat definiert.

Attribute von Ku_Luftfeuchtigkeit

"state %" zeigt den Status - hier die Luftfeuchtigkeit - mit einem angehängten Prozentzeichen an.

Befüllt wird der Dummy mit einem notify, das auf Ereignisse des Feuchtigkeitssensors reagiert.

 

notify zur Aktualisierung der Luftfeuchteanzeige

Die Definition für das notify leitet sich aus den Events ab, die der Sensor liefert.

Screenshot des Event Monitor's für den Sensor Ku_Thermometer

Wenn die Luftfeuchtigkeit gemessen wird, soll der Zahlenwert an den Dummy Ku_Luftfeuchtigkeit übergeben werden. Der Definitionsteil DEF des notify's lautet daher:

Ku_Thermometer:humidity.* set Ku_Luftfeuchtigkeit $EVTPART1

Wenn ein Ereignis des Device's Ku_Thermometer auftritt, das mit dem Ausdruck "humidity" beginnt, dann wird der Status des Dummy's Ku_Luftfeuchtigkeit auf den Wert der Variablen  $EVTPART1 gesetzt. Das Reading des letzten Ereignisses ist in der Variablen $EVENT gespeichert, die einzelnen Teile des Ereignisses in den Variablen $EVTPART0, $EVTPART1, ... In $EVENT steht also "humidity: 62 %", in $EVTPART0 "humidity:", in $EVTPART1 "62" und in $EVTPART2 "%".

Ku_Luftentfeuchter_ein_aus ist ein weiterer Dummy, mit dem die Regelung der Luftfeuchtigkeit ein- und ausgeschaltet werden kann. Hier sind die Attribute des Dummy's:

Attribute von Ku_Luftentfeuchter_ein_aus

devStateIcon definiert das Symbol in der DeviceOverview. "on:taster@red off:taster@blue" bedeutet, dass das Symbol taster rot angezeigt wird, wenn der Zustand des Dummy's "on" ist; das Symbol wird blau, wenn der Zustand "off" ist. Mit dem Attribut setList werden die möglichen Zustände des Dummy's - "on" und "off" - definiert. webCmd erhält den Wert ":". Damit wird verhindert, dass außer dem Tastersymbol in der DeviceOverview auch noch "on" und "off" angezeigt werden.

Das physikalische Device, das den Luftentfeuchter schaltet (der Steckdosenschalter), ist mit Ku_Luftentfeuchter bezeichnet. Das Attribut stateFormat habe ich auf "power" gesetzt, weil mich die Leistungsaufnahme des Entfeuchters interessiert. Weil im Reading power die Leistung bereits als Zahlenwert mit dem Buchstaben "W" für "Watt" gespeichert wird, erübrigt sich eine weitere Formatierung. webCmd wurde wieder auf ":" gesetzt, um zu verhindern, dass in der DeviceOverview "on" und "off" angezeigt werden. Schließlich soll die Regelung ja nur über Ku_Luftentfeuchter_ein_aus aktiviert bzw. deaktiviert werden.

Für den Regelalgorithmus verwende ich das DOIF-Device Ku_Feuchteregelung. Die allgemeine Syntax für DOIF lautet:

define <name> DOIF (<condition>) (<commands>) DOELSEIF (<condition>) (<commands>) DOELSEIF ... DOELSE (<commands>)

Definition des DOIF's 

Wenn das Reading humidity von Ku_Thermometer größer als 60 ist und der Status von Ku_Luftentfeuchter_ein_aus gleich "on" ist, dann wird Ku_Luftentfeuchter eingeschaltet. Das "d1", das hinter humidity steht, gibt an, dass nur der Zahlenwert des Readings auf eine Nachkommastelle genau für den Vergleich verwendet werden soll. Mit der Und-Verknüpfung wird also erreicht, dass der Luftentfeuchter nur eingeschaltet wird, wenn die Regelung eingeschaltet worden ist.

Wenn der erste Teil des DOIF's nicht erfüllt ist, wird die DOELSEIF-Bedingung geprüft: Wenn die Luftfeuchtigkeit unter 55 % fällt oder die Regelung ausgeschaltet worden ist, dann wird Ku_Luftentfeuchter ausgeschaltet.

Mit den beiden Schwellwerten 60 % und 55 % wird eine Hysterese von größer 5 % festgelegt. Damit wird verhindert, dass das System bei kleinen Schwankungen der Luftfeuchtigkeit dauernd ein- und ausschaltet.

Bleibt mir nur noch übrig zu erklären, wie das Tropfensymbol in die Anzeige kommt. Dazu setze ich wieder das Attribut devStateIcon. 

Attribute für Ku_Feuchteregler    

Die Status eines DOIF's werden automatisch mit cmd_1, cmd_2, cmd_... durchnummeriert. Die Definition "cmd_1:humidity@red cmd_2:humidity@green" bedeutet also: Wenn die Bedingung cmd_1 (Luftfeuchtigkeit über 60 % und Regelung eingeschaltet) erfüllt ist, dann zeige das Symbol humidity in Rot an, wenn die Bedingung cmd_2 (Luftfeuchtigkeit unter 55 % oder Regelung ausgeschaltet) gilt, dann zeige das Symbol in Grün an. Die verfügbaren Symbole findet man übrigens in der Detailübersicht zu den Devices über den Link Select icon in der untersten Zeile.

Wie ich zu der Grafik komme, beschreibe ich in einem anderen Beitrag.

 



 

Mittwoch, 3. März 2021

LAN sehr langsam

Eigentlich beträgt meine Kabelmodemverbindung 100 Mbit/s. Der PC ist über LAN an die Fritzbox 6430 Cable angebunden. In letzter Zeit ist meine Internetgeschwindigkeit auf ca. 20 bis 40 Mbit/s abgesunken. Abhilfe hat ein Neustart der Fritzbox gebracht.

Zum Neustart der Fritzbox gelangt man unter System -> Sicherung -> Neustart.

Dienstag, 16. Juni 2020

Corona Warn-App: Keine Internetverbindung

Ich habe auf meinem Samsung Galaxy S5 die Corona Warn-App installiert. Wenn WLAN und mobile Daten gleichzeitig aktiviert sind, hat die App keine Internetverbindung. Abhilfe: Nur WLAN oder mobile Daten einschalten. Es kann auch sein, dass man WLAN aus- und wieder einschalten muss, um eine Datenverbindung herzustellen. Und natürlich muss Bluetooth aktiviert sein.

Mittwoch, 1. August 2018

Tipp für heiße Tage - Klimaanlage für Arme

Wer bei dieser Affenhitze zwar keine Klimaanlage aber einen Ventilator hat, kann sich mit etwas kühlerer Luft anblasen lassen. Dazu muss man vor dem Ventilator etwas Kaltes in den Luftstrom bringen. Ich verwende dazu Kühlakkus aus der Gefriertruhe. Die Kühlakkus sind allerdings nach ca. 30 Minuten wieder warm und müssen durch kalte ersetzt werden. An den Akkus kondensiert die Luftfeuchtigkeit, also die Akkus auf etwas Wasserfestes stellen.


Montag, 19. Februar 2018

Telefonie für Fritz!Box 6430 Cable

Ich habe jetzt eine eigene Fritz!Box Cable 6430. Die Interneteinrichtung mit den Zugangsdaten von Vodafone war einfach. Nur bei der Telefonie gab es Probleme. Ich habe im Menü "Eigene Rufnummern" als Betreiber "Vodafone Kabel" ausgewählt und alle Rufnummern, SIP und Kennwörter richtig eingetragen. Nur telefonieren konnte ich nicht. Ich konnte zwar angeklingelt werden, jedoch war das Gespräch weg, wenn ich abnahm.

Die Lösung fand ich auf dieser AVM-Seite. Man muss zusätzlich im Menü Internet - Zugangsdaten - IPv6 die Option "Immer eine native IPv4-Anbindung nutzen (empfohlen)" aktivieren. Leider kommt man zu diesem Menü nur, wenn man die erweiterte Ansicht eingestellt hat.

Mittwoch, 14. Februar 2018

Ofenglasreiniger selbst gemacht II

Ich mache meinen Ofenglasreiniger für meinen Kaminofen jetzt immer mit Ätznatron. Ätznatron (Natriumhydroxid, NaOH) bekommt man im Baumarkt oder im Internet. Ich stelle dazu eine 5-prozentige Lösung mit destilliertem Wasser her. Destilliertes Wasser deshalb, weil bei uns das Wasser sehr kalkhaltig ist und das NaOH mit dem Kalzium im Wasser reagiert und damit ein Teil der Reinigungswirkung verloren geht.

Eine 5-prozentige Lösung bekommt man, wenn man auf 1 l Wasser 50 g NaOH gibt. Genau genommen ist es dann nur eine 4,76-prozentige Lösung ( 50 g / (1000 g + 50 g)). Wenn man weniger Lösung braucht, verwendet man entsprechend weniger NaOH, beispielsweise bei 0,5 l Wasser 25 g NaOH.

Ätznatron ist, wie der Name schon sagt, stark ätzend. Daher nichts davon auf die Haut oder in die Augen bringen oder Einatmen. Immer das Ätznatron in kaltes Wasser einrühren, nie das Wasser über das Ätznatron kippen, es kann sonst heftig spritzen. Das Wasser erwärmt sich, wenn man das Ätznatron einrührt.

Ich fülle die fertige Lösung in eine Spritzflasche und gebe noch ein paar Tropfen Spülmittel dazu. NaOH kann Metall angreifen (besonders Aluminium), daher muss die Lösung in Plastikflaschen aufbewahrt werden. Natürlich ist auch das fertige Reinigungsmittel ätzend, daher gelten auch für das Versprühen die oben genannten Vorsichtsmaßregeln.

Wer jetzt denkt, meine Mixtur sei ein Teufelszeug, der möge mal die Warnhinweise auf den fertig zu kaufenden Produkten lesen.