Benutzer:Amenophis86/Artikelentwurf: Unterschied zwischen den Versionen

Aus FHEMWiki
Keine Bearbeitungszusammenfassung
(Änderung zu FHEM Überwachung)
Zeile 1: Zeile 1:
{{SEITENTITEL:RFHEM}}
[[FHEM Überwachen]] ist ein Art, wie man z.B. auf einem Raspberry Pi seine FHEM installation überwachen kann. Die Überwachung spiegelt sich in diesem Sinne wieder, dass der FHEM Prozess automatisch neu gestartet wird, sobald er sich aufgehängt hat oder nicht mehr meldet. Für diese Überwachung gibt es verschiedene Methoden. Hier wird eine mittels eines [[FileLog]] und des Programms [https://wiki.ubuntuusers.de/Monit Monit] dargestellt.  
{{Infobox Modul
|ModPurpose=Ausführung von Befehlen auf anderer Instanz
|ModType=x
|ModForumArea=Automatisierung
|ModFTopic=23638
|ModTechName=93_RFHEM.pm
|ModOwner=chris1284 ({{Link2FU|5217|Forum}})
|Modulname=93_RFHEM.pm
}}
[[RFHEM]] ist ein Modul um zwischen verschiedenen FHEM Instanzen Befehle abzusetzen. Das Modul wird nicht supported und ist somit auch nicht offiziell per Update installiert.


== Zielsetzung ==
== Zielsetzung ==
Ziel des Moduls ist es Befehle auf einer anderen Instanz abzusetzen. Verwirklich wird das ganze per Telnet. Das Modul ist angelehnt an [[FHEM2FHEM]]. Der Unterschied ist, dass hier quasi alle Devices, auch die von FHEM2FHEM nicht unterstützten, gesteuert werden können.
Ziel ist es, dass FHEM automatisch neu gestartet wird, sobald es sich aufgehängt hat.  


== Herunterladen des Moduls ==
Das Modul selbst bekommen wir in {{Link2Forum|Topic=23638|Message=169011|LinkText=diesem}} Forums Beitrag. Nochmal, das Modul wird aktuell nicht supported und ist dem entsprechend alt.


Wir laden das Modul in den Ordern ./FHEMInstallation/FHEM/. Bei einem PI wäre das dann /opt/fhem/FHEM. Danach starten wir FHEM neu.  
== Monit ==
Zuerst muss das Programm Monit installiert und konfiguriert werden. Wie ihr das macht, steht [https://wiki.ubuntuusers.de/Monit Hier].


== Definieren des Device ==
Nun müssen wir uns ein Device anlegen. Dies machen wir klassisch in der Kommandozeile mittels
<pre>define Name RFHEM hostip [:port] [pw]</pre>


Sollte eure zweite Instanz auf der gleichen Hardware laufen, den Port 7073 (Standard ist 7072 bei fhem und auch beim Modul, wenn keiner angegeben wird) und kein Passwort besitzen, wäre die Definition:
== Konfiguration in FHEM ==
<pre>define FHEM2 RFHEM 127.0.0.1:7073</pre>
=== Dummy anlegen ===
Wir legen uns einen Dummy mit dem Namen "Monit_timer" an. Dieser Timer wird später durch ein at immer wieder getriggert und der Dummy triggert daraufhin ein Filelog. Den Dummy legen wir uns wie folgt an:
<pre>define Monit_timer dummy</pre>
Wichtig, der Dummy darf NICHT das Attribut event-on-change-reading oder event-on-update-reading haben!


== Befehle senden ==
=== Filelog anlegen ===
Mittels
Nun legen wir uns ein FileLog an, in welches später von FHEM immer wieder durch den Dummy eine Lebenzeichen eingetragen wird. Dies machen wir wie folgt:
<pre>set <name> cmd <befehl></pre>
<pre>define FileLog_WD_Monit FileLog ./log/Monit_timer.log Monit_timer*</pre>
setzt ihr eure Befehle ab, welche in der zweiten Instanz ausgeführt werden. Wollen wir zum Beispiel die Lampe1 anschalten, müssen wir folgendes in die Kommandozeile eingeben:
<pre>set FHEM2 cmd set Lampe1 on</pre>


Im Log der sendenden Instanz erscheint der Hinweis "command executed" und die zweite Instanz sollte die Lampe1 eingeschaltet haben.
=== At anlegen ===
Jetzt legen wir uns ein at an, welches alle 3 Minuten dem Dummy den Status 1 gibt:
<pre>Monit_exec at +*00:03:00 set Monit_timer 1</pre>


== Einschränkungen ==
=== Notfiy bei Neustart ===
=== Einfache Befehle ===
Nun noch ein Notify anlegen, welches uns den Dummy auf den Wert 2 setzt beim Start von FHEM. Dies würde wie folgt aussehen:
Einfache Befehle können auf der zweiten Instanz ausgeführt werden. Beispiele:
<pre>define FHEM_start notify global:INITIALIZED set Monit_timer 2</pre>
Hintergrund ist, dass so das FileLog direkt nach dem Start etwas schreibt und nicht erst nach 3 Minuten.


Dummy schalten:
=== Leeren der des LogFile ===
<pre>set FHEM2 cmd setreading Dummy1 Reading1 'Test 1 2 3'</pre>
Zuletzt definieren wir uns noch ein at, welches uns das Logfile jede Nacht, bis auf die letzten beiden Einträge leert. Das Logfile würde sonst unglaublich groß werden und das muss ja nicht sein.
<pre>define Monit_Log_leeren at *00:01:00 {system ("sudo tail -n 2 /opt/fhem/log/Monit_timer.log > /opt/fhem/log/Monit_timer_Dummy.log");; system ("sudo cp /opt/fhem/log/Monit_timer_Dummy.log /opt/fhem/log/Monit_timer.log");; system ("sudo rm /opt/fhem/log/Monit_timer_Dummy.log")}</pre>


Dummy definieren:
Wichtig, FHEM muss den Befehl "sudo" ausführen können. Mehr dazu findet ihr im Forum
<pre>set FHEM2 cmd define Dummy1 dummy</pre>


Notifys erstellen:
== Konfiguration von Monit ==
<pre>set RemotePI cmd define b3lampV1 notify btn3 set lamp on
In der Datei Monitrc, welche normal unter /etc/monit/monitrc zufinden ist, tragen wir folgendes ein:
set RemotePI cmd define b3lampV1 notify btn3 {}</pre>


=== Perlcode ===
Was nicht funktioniert ist einen Perlcode auf der zweiten Instanz auszuführen. FHEM bezieht den Perlcode auf die erste Instanz. Somit würde zum Beispiel folgender Befehl nicht funktionieren:
<pre>set RemotePI cmd define a1 at 17:00:00 {fhem("set xyz on");}</pre>
Die Instanz, auf welcher der Befehl abgesetzt wurde, würde selbst den Code "{fhem ("set xyz on");}" ausführen wollen.
=== SSL Auth ===
SSL Auth ist leider auch nicht möglich.
=== Nicht funktionierende Befehle ===
Bisher sind keine Befehle bekannt. Solltet jemand einen oder mehrere finden, so möge er diese bitte {{Link2Forum|Topic=23638|Message=169011|LinkText=diesem}} Thread posten. Vielleicht findet sich ja noch jemand, der den Befehl korrigieren kann.
== Nützliche Hilfen ==
Typischer Fall, wie dieses Modul genutzt werden kann ist folgender. Man hat auf der gleichen, oder einer anderen, Hardware eine zweite FHEM Instanz. Der Grund mag sein, dass man blockierende Module auslagert (gleiche Hardware) oder Empfangslücken überbrücken möchte (andere Hardware).
Wir nennen unsere Hauptinstanz MASTER und unsere zweite Instanz SLAVE. Auf SLAVE haben wir ein blockierendes Modul installiert, dessen Daten wir aber regelmäßig in MASTER haben möchten. Das Modul heißt TEST-Modul und hat die Readings TEST-Modul-R1 und TEST-Modul-R2.
Wir installieren auf SLAVE das hier beschriebene Modul RFHEM und nennen es "Daten.Senden". Auf SLAVE muss also regelmäßig, am besten bei einem Update der Readings, die Daten an MASTER gesendet werden. Dies lässt sich am einfachsten mittels eines [[notify]]. MASTER muss jedoch auch die Daten empfangen können. Hierfür bietet sich ein Dummy an. Den Dummy definieren wir auf Master wie folgt:
<pre>define Dummy.Empfang dummy</pre>
Das sendende Notify, wird auf SLAVE wie folgt definiert:
<pre>
define Daten.Senden.Notify notify Test-Modul.* set Daten.Senden cmd setreading Dummy.Empfang $EVENT
</pre>
Nun schreibt der SLAVE bei jedem Update eines Readings in den Dummy des MASTERS die Werte. Auf dem Master können wir diese Veränderung nun auch abgreifen, wie bei jedem normalen Modul. Grafisch würde das ganze so aussehen:
<pre>SLAVE: Readings Update an Test-Modul --> Meldung an Notify --> Meldung an MASTER --> Empfang der Daten im Dummy</pre>
== Doppelpunkte im Reading beim Dummy ==
Es kann vorkommen, dass die Readings im Dummy einen Doppelpunkt haben. In unserem Fall würde dann im Dummy "Dummy.Empfang" das Reading eins wie folgt stehen "Test-Modul-R1:". Doppelpunkte sollte es zum Einen in Readings nicht geben, deswegen gibt es auch einen Hinweis im Log, wenn ihr FHEM startet und dies der Fall ist. Zum Zweiten kann es zu Problemen auf der MASTER Instanz kommen, wenn man zB ein [[DOIF]] auf die Readings des Dummy lauschen lässt.
Aktuell muss man sich bei der Lösung des Problems noch selbst helfen, da es keinen Maintainer des Moduls gibt. Die Lösung hierzu könnte wie folgt aussehen. Wir erstellen uns eine Sub in der MyUtils ([[99_myUtils_anlegen]]) an, welche für uns die Doppelpunkte löscht. Diese Sub könnte wie folgt aussehen:
<pre>
<pre>
sub anzahl_evtparts($$)
check file fhem with path /opt/fhem/log/Monit_timer.log
{
                start program "/etc/init.d/fhem start"
my ($EVENT, $Device) = @_;
                stop program "/etc/init.d/fhem stop"
my @eingabe = split(/ /,$EVENT);
                if timestamp > 5 minute then restart
my $anzahl = scalar @eingabe;
my $value = "";
my $reading = substr($eingabe[0],0,length($eingabe[0])-1);
foreach (my $i=1; $i<$anzahl;$i++)
{
  $value = $value.$eingabe[$i]." ";
}
$value = substr($value,0,length($value)-1);
fhem ("set FHEM1 cmd setreading $Device $reading $value");
}
</pre>
</pre>
Das dazu gehörige Notify, welches auf den die Statusänderung lauscht und die Nötigen Daten weitergibt, würde wie folgt aussehen:
<pre><NameDevice>.* {anzahl_evtparts($EVENT,$NAME)}</pre>
== Command executed ausschalten ==
Sollte man viele Befehle mittels RFHEM senden, empfiehlt es sich das Attribut "Verbose" auf 0 zu setzen. Dies führt zwar dazu, dass keine Fehler mehr angezeigt werden, aber es führt auch dazu, dass nicht bei jeder Befehlsausführung das Log voll geschrieben wird.
== Hinweis ==
Es sei nochmals ausdrücklich darauf hingewiesen, dass das Modul kein offizielles Modul ist. Es hat sich bisher niemand gefunden, der dieses Modul supporten möchte. Der Artikel wurde von jemanden erstellt, der das Modul nutzt, aber selbst nicht erstellt hat.

Version vom 17. März 2016, 23:52 Uhr

FHEM Überwachen ist ein Art, wie man z.B. auf einem Raspberry Pi seine FHEM installation überwachen kann. Die Überwachung spiegelt sich in diesem Sinne wieder, dass der FHEM Prozess automatisch neu gestartet wird, sobald er sich aufgehängt hat oder nicht mehr meldet. Für diese Überwachung gibt es verschiedene Methoden. Hier wird eine mittels eines FileLog und des Programms Monit dargestellt.

Zielsetzung

Ziel ist es, dass FHEM automatisch neu gestartet wird, sobald es sich aufgehängt hat.


Monit

Zuerst muss das Programm Monit installiert und konfiguriert werden. Wie ihr das macht, steht Hier.


Konfiguration in FHEM

Dummy anlegen

Wir legen uns einen Dummy mit dem Namen "Monit_timer" an. Dieser Timer wird später durch ein at immer wieder getriggert und der Dummy triggert daraufhin ein Filelog. Den Dummy legen wir uns wie folgt an:

define Monit_timer dummy

Wichtig, der Dummy darf NICHT das Attribut event-on-change-reading oder event-on-update-reading haben!

Filelog anlegen

Nun legen wir uns ein FileLog an, in welches später von FHEM immer wieder durch den Dummy eine Lebenzeichen eingetragen wird. Dies machen wir wie folgt:

define FileLog_WD_Monit FileLog ./log/Monit_timer.log Monit_timer*

At anlegen

Jetzt legen wir uns ein at an, welches alle 3 Minuten dem Dummy den Status 1 gibt:

Monit_exec at +*00:03:00 set Monit_timer 1

Notfiy bei Neustart

Nun noch ein Notify anlegen, welches uns den Dummy auf den Wert 2 setzt beim Start von FHEM. Dies würde wie folgt aussehen:

define FHEM_start notify global:INITIALIZED set Monit_timer 2

Hintergrund ist, dass so das FileLog direkt nach dem Start etwas schreibt und nicht erst nach 3 Minuten.

Leeren der des LogFile

Zuletzt definieren wir uns noch ein at, welches uns das Logfile jede Nacht, bis auf die letzten beiden Einträge leert. Das Logfile würde sonst unglaublich groß werden und das muss ja nicht sein.

define Monit_Log_leeren at *00:01:00 {system ("sudo tail -n 2 /opt/fhem/log/Monit_timer.log > /opt/fhem/log/Monit_timer_Dummy.log");; system ("sudo cp /opt/fhem/log/Monit_timer_Dummy.log /opt/fhem/log/Monit_timer.log");; system ("sudo rm /opt/fhem/log/Monit_timer_Dummy.log")}

Wichtig, FHEM muss den Befehl "sudo" ausführen können. Mehr dazu findet ihr im Forum

Konfiguration von Monit

In der Datei Monitrc, welche normal unter /etc/monit/monitrc zufinden ist, tragen wir folgendes ein:

check file fhem with path /opt/fhem/log/Monit_timer.log
                start program "/etc/init.d/fhem start"
                stop program "/etc/init.d/fhem stop"
                if timestamp > 5 minute then restart